package crypto

import (
	
	
	
	

	
)

// KeyPairFromStdKey wraps standard library (and secp256k1) private keys in libp2p/go-libp2p/core/crypto keys
func ( crypto.PrivateKey) (PrivKey, PubKey, error) {
	if  == nil {
		return nil, nil, ErrNilPrivateKey
	}

	switch p := .(type) {
	case *rsa.PrivateKey:
		return &RsaPrivateKey{*}, &RsaPublicKey{k: .PublicKey}, nil

	case *ecdsa.PrivateKey:
		return &ECDSAPrivateKey{}, &ECDSAPublicKey{&.PublicKey}, nil

	case *ed25519.PrivateKey:
		 := .Public()
		,  := .(ed25519.PublicKey)
		return &Ed25519PrivateKey{*}, &Ed25519PublicKey{}, nil

	case *secp256k1.PrivateKey:
		 := Secp256k1PrivateKey(*)
		 := Secp256k1PublicKey(*.PubKey())
		return &, &, nil

	default:
		return nil, nil, ErrBadKeyType
	}
}

// PrivKeyToStdKey converts libp2p/go-libp2p/core/crypto private keys to standard library (and secp256k1) private keys
func ( PrivKey) (crypto.PrivateKey, error) {
	if  == nil {
		return nil, ErrNilPrivateKey
	}

	switch p := .(type) {
	case *RsaPrivateKey:
		return &.sk, nil
	case *ECDSAPrivateKey:
		return .priv, nil
	case *Ed25519PrivateKey:
		return &.k, nil
	case *Secp256k1PrivateKey:
		return , nil
	default:
		return nil, ErrBadKeyType
	}
}

// PubKeyToStdKey converts libp2p/go-libp2p/core/crypto private keys to standard library (and secp256k1) public keys
func ( PubKey) (crypto.PublicKey, error) {
	if  == nil {
		return nil, ErrNilPublicKey
	}

	switch p := .(type) {
	case *RsaPublicKey:
		return &.k, nil
	case *ECDSAPublicKey:
		return .pub, nil
	case *Ed25519PublicKey:
		return .k, nil
	case *Secp256k1PublicKey:
		return , nil
	default:
		return nil, ErrBadKeyType
	}
}