mirror of
https://github.com/libp2p/go-libp2p-core.git
synced 2025-03-22 12:20:07 +08:00
incorporates code review from @Stebalien
This commit is contained in:
parent
0468ff83df
commit
316b0af70d
@ -1,15 +1,12 @@
|
|||||||
// Package crypto implements various cryptographic utilities used by libp2p.
|
// Cackage crypto implements various cryptographic utilities used by libp2p.
|
||||||
// This includes a Public and Private key interface and key implementations
|
// This includes a Public and Private key interface and key implementations
|
||||||
// for supported key algorithms.
|
// for supported key algorithms.
|
||||||
package crypto
|
package crypto
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto"
|
|
||||||
"crypto/ecdsa"
|
|
||||||
"crypto/elliptic"
|
"crypto/elliptic"
|
||||||
"crypto/hmac"
|
"crypto/hmac"
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"crypto/rsa"
|
|
||||||
"crypto/sha1"
|
"crypto/sha1"
|
||||||
"crypto/sha512"
|
"crypto/sha512"
|
||||||
"crypto/subtle"
|
"crypto/subtle"
|
||||||
@ -18,14 +15,11 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"hash"
|
"hash"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
|
||||||
|
|
||||||
pb "github.com/libp2p/go-libp2p-core/crypto/pb"
|
pb "github.com/libp2p/go-libp2p-core/crypto/pb"
|
||||||
|
|
||||||
btcec "github.com/btcsuite/btcd/btcec"
|
|
||||||
"github.com/gogo/protobuf/proto"
|
"github.com/gogo/protobuf/proto"
|
||||||
sha256 "github.com/minio/sha256-simd"
|
sha256 "github.com/minio/sha256-simd"
|
||||||
"golang.org/x/crypto/ed25519"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -180,42 +174,6 @@ func GenerateEKeyPair(curveName string) ([]byte, GenSharedKey, error) {
|
|||||||
return pubKey, done, nil
|
return pubKey, done, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// KeyPairFromKey generates a new private and public key from an input private key
|
|
||||||
func KeyPairFromKey(priv crypto.PrivateKey) (PrivKey, PubKey, error) {
|
|
||||||
if priv == nil {
|
|
||||||
return nil, nil, ErrNilPrivateKey
|
|
||||||
}
|
|
||||||
|
|
||||||
switch priv.(type) {
|
|
||||||
case *rsa.PrivateKey:
|
|
||||||
log.Println("1")
|
|
||||||
rPriv, _ := priv.(*rsa.PrivateKey)
|
|
||||||
return &RsaPrivateKey{*rPriv}, &RsaPublicKey{rPriv.PublicKey}, nil
|
|
||||||
|
|
||||||
case *ecdsa.PrivateKey:
|
|
||||||
log.Println("2")
|
|
||||||
ePriv, _ := priv.(*ecdsa.PrivateKey)
|
|
||||||
return &ECDSAPrivateKey{ePriv}, &ECDSAPublicKey{&ePriv.PublicKey}, nil
|
|
||||||
|
|
||||||
case *ed25519.PrivateKey:
|
|
||||||
log.Println("3")
|
|
||||||
ePriv, _ := priv.(*ed25519.PrivateKey)
|
|
||||||
pubIfc := ePriv.Public()
|
|
||||||
pub, _ := pubIfc.(ed25519.PublicKey)
|
|
||||||
return &Ed25519PrivateKey{*ePriv}, &Ed25519PublicKey{pub}, nil
|
|
||||||
|
|
||||||
case *btcec.PrivateKey:
|
|
||||||
log.Println("4")
|
|
||||||
bPriv, _ := priv.(*btcec.PrivateKey)
|
|
||||||
sPriv := Secp256k1PrivateKey(*bPriv)
|
|
||||||
sPub := Secp256k1PublicKey(*bPriv.PubKey())
|
|
||||||
return &sPriv, &sPub, nil
|
|
||||||
|
|
||||||
default:
|
|
||||||
return nil, nil, ErrBadKeyType
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// StretchedKeys ...
|
// StretchedKeys ...
|
||||||
type StretchedKeys struct {
|
type StretchedKeys struct {
|
||||||
IV []byte
|
IV []byte
|
||||||
|
40
crypto/key_not_openssl.go
Normal file
40
crypto/key_not_openssl.go
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
// +build !openssl
|
||||||
|
|
||||||
|
package crypto
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto"
|
||||||
|
"crypto/ecdsa"
|
||||||
|
"crypto/rsa"
|
||||||
|
|
||||||
|
btcec "github.com/btcsuite/btcd/btcec"
|
||||||
|
"golang.org/x/crypto/ed25519"
|
||||||
|
)
|
||||||
|
|
||||||
|
// KeyPairFromKey generates a new private and public key from an input private key
|
||||||
|
func KeyPairFromKey(priv crypto.PrivateKey) (PrivKey, PubKey, error) {
|
||||||
|
if priv == nil {
|
||||||
|
return nil, nil, ErrNilPrivateKey
|
||||||
|
}
|
||||||
|
|
||||||
|
switch p := priv.(type) {
|
||||||
|
case *rsa.PrivateKey:
|
||||||
|
return &RsaPrivateKey{*p}, &RsaPublicKey{p.PublicKey}, nil
|
||||||
|
|
||||||
|
case *ecdsa.PrivateKey:
|
||||||
|
return &ECDSAPrivateKey{p}, &ECDSAPublicKey{&p.PublicKey}, nil
|
||||||
|
|
||||||
|
case *ed25519.PrivateKey:
|
||||||
|
pubIfc := p.Public()
|
||||||
|
pub, _ := pubIfc.(ed25519.PublicKey)
|
||||||
|
return &Ed25519PrivateKey{*p}, &Ed25519PublicKey{pub}, nil
|
||||||
|
|
||||||
|
case *btcec.PrivateKey:
|
||||||
|
sPriv := Secp256k1PrivateKey(*p)
|
||||||
|
sPub := Secp256k1PublicKey(*p.PubKey())
|
||||||
|
return &sPriv, &sPub, nil
|
||||||
|
|
||||||
|
default:
|
||||||
|
return nil, nil, ErrBadKeyType
|
||||||
|
}
|
||||||
|
}
|
47
crypto/key_openssl.go
Normal file
47
crypto/key_openssl.go
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
// +build openssl
|
||||||
|
|
||||||
|
package crypto
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto"
|
||||||
|
"crypto/ecdsa"
|
||||||
|
"crypto/rsa"
|
||||||
|
"crypto/x509"
|
||||||
|
|
||||||
|
btcec "github.com/btcsuite/btcd/btcec"
|
||||||
|
openssl "github.com/libp2p/go-openssl"
|
||||||
|
"golang.org/x/crypto/ed25519"
|
||||||
|
)
|
||||||
|
|
||||||
|
// KeyPairFromKey generates a new private and public key from an input private key
|
||||||
|
func KeyPairFromKey(priv crypto.PrivateKey) (PrivKey, PubKey, error) {
|
||||||
|
if priv == nil {
|
||||||
|
return nil, nil, ErrNilPrivateKey
|
||||||
|
}
|
||||||
|
|
||||||
|
switch p := priv.(type) {
|
||||||
|
case *rsa.PrivateKey:
|
||||||
|
pk, err := openssl.LoadPrivateKeyFromDER(x509.MarshalPKCS1PrivateKey(p))
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &opensslPrivateKey{pk}, &opensslPublicKey{pk}, nil
|
||||||
|
|
||||||
|
case *ecdsa.PrivateKey:
|
||||||
|
return &ECDSAPrivateKey{p}, &ECDSAPublicKey{&p.PublicKey}, nil
|
||||||
|
|
||||||
|
case *ed25519.PrivateKey:
|
||||||
|
pubIfc := p.Public()
|
||||||
|
pub, _ := pubIfc.(ed25519.PublicKey)
|
||||||
|
return &Ed25519PrivateKey{*p}, &Ed25519PublicKey{pub}, nil
|
||||||
|
|
||||||
|
case *btcec.PrivateKey:
|
||||||
|
sPriv := Secp256k1PrivateKey(*p)
|
||||||
|
sPub := Secp256k1PublicKey(*p.PubKey())
|
||||||
|
return &sPriv, &sPub, nil
|
||||||
|
|
||||||
|
default:
|
||||||
|
return nil, nil, ErrBadKeyType
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user