diff --git a/crypto/hashing/blake2b.go b/crypto/blake2b/blake2b.go similarity index 71% rename from crypto/hashing/blake2b.go rename to crypto/blake2b/blake2b.go index 17a10a2d..7554fca0 100644 --- a/crypto/hashing/blake2b.go +++ b/crypto/blake2b/blake2b.go @@ -1,13 +1,15 @@ -package hashing +package blake2b import ( + "github.com/perlin-network/noise/crypto" + blake2blib "golang.org/x/crypto/blake2b" ) type Blake2b struct{} var ( - _ HashPolicy = (*Blake2b)(nil) + _ crypto.HashPolicy = (*Blake2b)(nil) ) func NewBlake2b() *Blake2b { diff --git a/crypto/hashing/blake2b_test.go b/crypto/blake2b/blake2b_test.go similarity index 87% rename from crypto/hashing/blake2b_test.go rename to crypto/blake2b/blake2b_test.go index 6c533fc9..8a8679aa 100644 --- a/crypto/hashing/blake2b_test.go +++ b/crypto/blake2b/blake2b_test.go @@ -1,16 +1,18 @@ -package hashing +package blake2b import ( "bytes" "math/big" "testing" + + "github.com/perlin-network/noise/crypto" ) func TestHash(t *testing.T) { t.Parallel() hp := NewBlake2b() - r := Hash(hp, big.NewInt(123)) + r := crypto.Hash(hp, big.NewInt(123)) n := new(big.Int) n, ok := n.SetString("89391711502145780362310349925943903708999319576398061903082165979787487688967", 10) diff --git a/crypto/signing/ed25519.go b/crypto/ed25519/ed25519.go similarity index 76% rename from crypto/signing/ed25519.go rename to crypto/ed25519/ed25519.go index 31da5a40..b513c991 100644 --- a/crypto/signing/ed25519.go +++ b/crypto/ed25519/ed25519.go @@ -1,8 +1,10 @@ -package signing +package ed25519 import ( "crypto/rand" + "github.com/perlin-network/noise/crypto" + ed25519lib "golang.org/x/crypto/ed25519" ) @@ -10,12 +12,11 @@ type Ed25519 struct { } var ( - _ SignaturePolicy = (*Ed25519)(nil) + _ crypto.SignaturePolicy = (*Ed25519)(nil) ) func NewEd25519() *Ed25519 { - p := &Ed25519{} - return p + return &Ed25519{} } func (p *Ed25519) GenerateKeys() ([]byte, []byte, error) { @@ -51,3 +52,15 @@ func (p *Ed25519) Verify(publicKey []byte, message []byte, signature []byte) boo } return ed25519lib.Verify(publicKey, message, signature) } + +func RandomKeyPair() *crypto.KeyPair { + p := NewEd25519() + publicKey, privateKey, err := p.GenerateKeys() + if err != nil { + panic(err) + } + return &crypto.KeyPair{ + PublicKey: publicKey, + PrivateKey: privateKey, + } +} diff --git a/crypto/signing/ed25519_test.go b/crypto/ed25519/ed25519_test.go similarity index 98% rename from crypto/signing/ed25519_test.go rename to crypto/ed25519/ed25519_test.go index 1ea37fbe..fd88ccea 100644 --- a/crypto/signing/ed25519_test.go +++ b/crypto/ed25519/ed25519_test.go @@ -1,4 +1,4 @@ -package signing +package ed25519 import ( "reflect" diff --git a/crypto/hashing/policy.go b/crypto/hashing/policy.go deleted file mode 100644 index 238169d2..00000000 --- a/crypto/hashing/policy.go +++ /dev/null @@ -1,15 +0,0 @@ -//go:generate mockgen -destination=../mocks/mock_hash_policy.go -package=mocks github.com/perlin-network/noise/crypto/hashing HashPolicy - -package hashing - -import ( - "math/big" -) - -type HashPolicy interface { - HashBytes(b []byte) []byte -} - -func Hash(hp HashPolicy, s *big.Int) *big.Int { - return s.SetBytes(hp.HashBytes(s.Bytes())) -} diff --git a/crypto/keypair.go b/crypto/keypair.go index 907538f4..7218a9d7 100644 --- a/crypto/keypair.go +++ b/crypto/keypair.go @@ -4,45 +4,25 @@ import ( "encoding/hex" "errors" "fmt" - - "github.com/perlin-network/noise/crypto/hashing" - "github.com/perlin-network/noise/crypto/signing" ) type KeyPair struct { - hp hashing.HashPolicy - sp signing.SignaturePolicy PrivateKey []byte PublicKey []byte } -func NewKeyPair(sp signing.SignaturePolicy, hp hashing.HashPolicy) *KeyPair { - privateKey, publicKey, err := sp.GenerateKeys() - if err != nil { - panic(err) - } - // generate keys if no private key present in signature policy - p := &KeyPair{ - hp: hp, - sp: sp, - PrivateKey: privateKey, - PublicKey: publicKey, - } - return p -} - -func newErrPrivKeySize(length int, sp signing.SignaturePolicy) error { +func newErrPrivKeySize(length int, sp SignaturePolicy) error { return errors.New(fmt.Sprintf("private key length %d does not equal expected key length %d", length, sp.PrivateKeySize())) } -func (k *KeyPair) Sign(message []byte) ([]byte, error) { - if len(k.PublicKey) != k.sp.PrivateKeySize() { - return nil, newErrPrivKeySize(len(k.PrivateKey), k.sp) +func (k *KeyPair) Sign(sp SignaturePolicy, hp HashPolicy, message []byte) ([]byte, error) { + if len(k.PublicKey) != sp.PrivateKeySize() { + return nil, newErrPrivKeySize(len(k.PrivateKey), sp) } - message = k.hp.HashBytes(message) + message = hp.HashBytes(message) - signature := k.sp.Sign(k.PrivateKey, message) + signature := sp.Sign(k.PrivateKey, message) return signature, nil } @@ -58,11 +38,7 @@ func (k *KeyPair) String() (string, string) { return k.PrivateKeyHex(), k.PublicKeyHex() } -func (k *KeyPair) Verify(message []byte, signature []byte) bool { - return Verify(k.sp, k.hp, k.PublicKey, message, signature) -} - -func FromPrivateKey(sp signing.SignaturePolicy, hp hashing.HashPolicy, privateKey string) (*KeyPair, error) { +func FromPrivateKey(sp SignaturePolicy, hp HashPolicy, privateKey string) (*KeyPair, error) { rawPrivateKey, err := hex.DecodeString(privateKey) if err != nil { return nil, err @@ -71,7 +47,7 @@ func FromPrivateKey(sp signing.SignaturePolicy, hp hashing.HashPolicy, privateKe return FromPrivateKeyBytes(sp, hp, rawPrivateKey) } -func FromPrivateKeyBytes(sp signing.SignaturePolicy, hp hashing.HashPolicy, rawPrivateKey []byte) (*KeyPair, error) { +func FromPrivateKeyBytes(sp SignaturePolicy, hp HashPolicy, rawPrivateKey []byte) (*KeyPair, error) { if len(rawPrivateKey) != sp.PrivateKeySize() { return nil, newErrPrivKeySize(len(rawPrivateKey), sp) } @@ -82,8 +58,6 @@ func FromPrivateKeyBytes(sp signing.SignaturePolicy, hp hashing.HashPolicy, rawP } keyPair := &KeyPair{ - sp: sp, - hp: hp, PrivateKey: rawPrivateKey, PublicKey: rawPublicKey, } @@ -91,7 +65,7 @@ func FromPrivateKeyBytes(sp signing.SignaturePolicy, hp hashing.HashPolicy, rawP return keyPair, nil } -func Verify(sp signing.SignaturePolicy, hp hashing.HashPolicy, publicKey []byte, message []byte, signature []byte) bool { +func Verify(sp SignaturePolicy, hp HashPolicy, publicKey []byte, message []byte, signature []byte) bool { // Public key must be a set size. if len(publicKey) != sp.PublicKeySize() { return false diff --git a/crypto/keypair_test.go b/crypto/keypair_test.go index c64bca4e..6218d061 100644 --- a/crypto/keypair_test.go +++ b/crypto/keypair_test.go @@ -30,7 +30,6 @@ func TestKeyPair(t *testing.T) { signature := []byte("signed test message") // setup expected mock return values - sp.EXPECT().GenerateKeys().Return(privateKey, publicKey, nil).Times(1) sp.EXPECT().PrivateKeySize().Return(len(privateKey)).AnyTimes() sp.EXPECT().PublicKeySize().Return(len(publicKey)).AnyTimes() sp.EXPECT().Sign(privateKey, hashed).Return(signature).Times(1) @@ -38,9 +37,12 @@ func TestKeyPair(t *testing.T) { hp.EXPECT().HashBytes(message).Return(hashed).AnyTimes() - kp := NewKeyPair(sp, hp) + kp := KeyPair{ + PrivateKey: privateKey, + PublicKey: publicKey, + } - sig, err := kp.Sign(message) + sig, err := kp.Sign(sp, hp, message) if err != nil { t.Errorf("Sign() = %v, expected ", err) } @@ -48,7 +50,7 @@ func TestKeyPair(t *testing.T) { t.Errorf("Sign() = '%s', expected '%s'", sig, []byte("signed test message")) } - if !kp.Verify(message, signature) { + if !Verify(sp, hp, publicKey, message, signature) { t.Errorf("Verify('%s', '%s') = false, expected true", message, signature) } @@ -81,11 +83,13 @@ func TestFromPrivateKey(t *testing.T) { publicKey := []byte("0987654321") // setup expected mock return values - sp.EXPECT().GenerateKeys().Return(privateKeyHexBytes, publicKey, nil).Times(1) sp.EXPECT().PrivateKeySize().Return(len(privateKeyHexBytes)).Times(1) sp.EXPECT().PrivateToPublic(privateKeyHexBytes).Return(publicKey, nil).Times(1) - kp1 := NewKeyPair(sp, hp) + kp1 := &KeyPair{ + PrivateKey: privateKeyHexBytes, + PublicKey: publicKey, + } kp2, err := FromPrivateKey(sp, hp, privateKey) if err != nil { diff --git a/crypto/mocks/mock_hash_policy.go b/crypto/mocks/mock_hash_policy.go index 35eef4f2..30b37a1f 100644 --- a/crypto/mocks/mock_hash_policy.go +++ b/crypto/mocks/mock_hash_policy.go @@ -1,5 +1,5 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: github.com/perlin-network/noise/crypto/hashing (interfaces: HashPolicy) +// Source: github.com/perlin-network/noise/crypto (interfaces: HashPolicy) // Package mocks is a generated GoMock package. package mocks diff --git a/crypto/mocks/mock_signature_policy.go b/crypto/mocks/mock_signature_policy.go index 21687a48..64452641 100644 --- a/crypto/mocks/mock_signature_policy.go +++ b/crypto/mocks/mock_signature_policy.go @@ -1,5 +1,5 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: github.com/perlin-network/noise/crypto/signing (interfaces: SignaturePolicy) +// Source: github.com/perlin-network/noise/crypto (interfaces: SignaturePolicy) // Package mocks is a generated GoMock package. package mocks diff --git a/crypto/policy.go b/crypto/policy.go new file mode 100644 index 00000000..3c041895 --- /dev/null +++ b/crypto/policy.go @@ -0,0 +1,25 @@ +//go:generate mockgen -destination=mocks/mock_signature_policy.go -package=mocks github.com/perlin-network/noise/crypto SignaturePolicy +//go:generate mockgen -destination=mocks/mock_hash_policy.go -package=mocks github.com/perlin-network/noise/crypto HashPolicy + +package crypto + +import ( + "math/big" +) + +type SignaturePolicy interface { + GenerateKeys() ([]byte, []byte, error) + PrivateKeySize() int + PrivateToPublic(privateKey []byte) ([]byte, error) + PublicKeySize() int + Sign(privateKey []byte, message []byte) []byte + Verify(publicKey []byte, message []byte, signature []byte) bool +} + +type HashPolicy interface { + HashBytes(b []byte) []byte +} + +func Hash(hp HashPolicy, s *big.Int) *big.Int { + return s.SetBytes(hp.HashBytes(s.Bytes())) +} diff --git a/crypto/signing/policy.go b/crypto/signing/policy.go deleted file mode 100644 index 0f5e6b1c..00000000 --- a/crypto/signing/policy.go +++ /dev/null @@ -1,12 +0,0 @@ -//go:generate mockgen -destination=../mocks/mock_signature_policy.go -package=mocks github.com/perlin-network/noise/crypto/signing SignaturePolicy - -package signing - -type SignaturePolicy interface { - GenerateKeys() ([]byte, []byte, error) - PrivateKeySize() int - PrivateToPublic(privateKey []byte) ([]byte, error) - PublicKeySize() int - Sign(privateKey []byte, message []byte) []byte - Verify(publicKey []byte, message []byte, signature []byte) bool -} diff --git a/examples/basic/example_test.go b/examples/basic/example_test.go index 81c12b35..330dcc01 100644 --- a/examples/basic/example_test.go +++ b/examples/basic/example_test.go @@ -5,7 +5,7 @@ import ( "fmt" "time" - "github.com/perlin-network/noise/crypto/signing/ed25519" + "github.com/perlin-network/noise/crypto/ed25519" "github.com/perlin-network/noise/examples/basic/messages" "github.com/perlin-network/noise/network" "github.com/perlin-network/noise/network/discovery" diff --git a/examples/chat/main.go b/examples/chat/main.go index 9c6a40a9..e06659bc 100644 --- a/examples/chat/main.go +++ b/examples/chat/main.go @@ -7,7 +7,7 @@ import ( "strings" "github.com/golang/glog" - "github.com/perlin-network/noise/crypto/signing" + "github.com/perlin-network/noise/crypto/ed25519" "github.com/perlin-network/noise/examples/chat/messages" "github.com/perlin-network/noise/network" "github.com/perlin-network/noise/network/discovery" @@ -40,7 +40,7 @@ func main() { protocol := *protocolFlag peers := strings.Split(*peersFlag, ",") - keys := signing.RandomEd25519KeyPair() + keys := ed25519.RandomKeyPair() glog.Infof("Private Key: %s", keys.PrivateKeyHex()) glog.Infof("Public Key: %s", keys.PublicKeyHex()) diff --git a/examples/cluster_benchmark/main.go b/examples/cluster_benchmark/main.go index 103edf67..934234e3 100644 --- a/examples/cluster_benchmark/main.go +++ b/examples/cluster_benchmark/main.go @@ -10,7 +10,7 @@ import ( "time" "github.com/golang/glog" - "github.com/perlin-network/noise/crypto/signing" + "github.com/perlin-network/noise/crypto/ed25519" "github.com/perlin-network/noise/examples/cluster_benchmark/messages" "github.com/perlin-network/noise/network" "github.com/perlin-network/noise/network/backoff" @@ -90,7 +90,7 @@ func main() { protocol := *protocolFlag peers := strings.Split(*peersFlag, ",") - keys := signing.NewEd25519() + keys := ed25519.NewEd25519() go setupPPROF(*portFlag) diff --git a/examples/getting_started/main.go b/examples/getting_started/main.go index a1e13281..c8ca70ac 100644 --- a/examples/getting_started/main.go +++ b/examples/getting_started/main.go @@ -5,7 +5,7 @@ import ( "strings" "github.com/golang/glog" - "github.com/perlin-network/noise/crypto/signing/ed25519" + "github.com/perlin-network/noise/crypto/ed25519" "github.com/perlin-network/noise/network" "github.com/perlin-network/noise/network/backoff" "github.com/perlin-network/noise/network/discovery" diff --git a/examples/local_benchmark/receiver/main.go b/examples/local_benchmark/receiver/main.go index 7b9fa157..c537ca08 100644 --- a/examples/local_benchmark/receiver/main.go +++ b/examples/local_benchmark/receiver/main.go @@ -5,7 +5,8 @@ import _ "net/http/pprof" import ( "flag" "fmt" - "github.com/perlin-network/noise/crypto/signing/ed25519" + "github.com/perlin-network/noise/crypto" + "github.com/perlin-network/noise/crypto/ed25519" "github.com/perlin-network/noise/examples/local_benchmark/messages" "github.com/perlin-network/noise/network" "log" diff --git a/examples/local_benchmark/sender/main.go b/examples/local_benchmark/sender/main.go index d1fb287f..e1e9f665 100644 --- a/examples/local_benchmark/sender/main.go +++ b/examples/local_benchmark/sender/main.go @@ -5,7 +5,7 @@ import _ "net/http/pprof" import ( "flag" "fmt" - "github.com/perlin-network/noise/crypto/signing/ed25519" + "github.com/perlin-network/noise/crypto/ed25519" "github.com/perlin-network/noise/examples/local_benchmark/messages" "github.com/perlin-network/noise/network" "log" diff --git a/examples/proxy/proxy_test.go b/examples/proxy/proxy_test.go index f12a8a5e..3a19ba32 100644 --- a/examples/proxy/proxy_test.go +++ b/examples/proxy/proxy_test.go @@ -4,7 +4,7 @@ import ( "fmt" "time" - "github.com/perlin-network/noise/crypto/signing/ed25519" + "github.com/perlin-network/noise/crypto/ed25519" "github.com/perlin-network/noise/examples/proxy/messages" "github.com/perlin-network/noise/network" "github.com/perlin-network/noise/network/discovery" diff --git a/examples/stream/main.go b/examples/stream/main.go index 8dfbc06c..3cd2e2dd 100644 --- a/examples/stream/main.go +++ b/examples/stream/main.go @@ -8,7 +8,7 @@ import ( "time" "github.com/golang/glog" - "github.com/perlin-network/noise/crypto/signing/ed25519" + "github.com/perlin-network/noise/crypto/ed25519" "github.com/perlin-network/noise/network" "github.com/perlin-network/noise/network/discovery" "github.com/xtaci/smux" diff --git a/examples/topologies/topologies.go b/examples/topologies/topologies.go index 08f80ab6..65edfdee 100644 --- a/examples/topologies/topologies.go +++ b/examples/topologies/topologies.go @@ -5,7 +5,7 @@ import ( "testing" "time" - "github.com/perlin-network/noise/crypto/signing/ed25519" + "github.com/perlin-network/noise/crypto/ed25519" "github.com/perlin-network/noise/examples/topologies/messages" "github.com/perlin-network/noise/network" ) diff --git a/examples/topologies/topologies_test.go b/examples/topologies/topologies_test.go index 1a2f160d..8ddb1691 100644 --- a/examples/topologies/topologies_test.go +++ b/examples/topologies/topologies_test.go @@ -1,8 +1,9 @@ package topologies import ( - "github.com/perlin-network/noise/network" "testing" + + "github.com/perlin-network/noise/network" ) const basePort = 19700 diff --git a/network/backoff/plugin_test.go b/network/backoff/plugin_test.go index 1769cb8c..ccedacaa 100644 --- a/network/backoff/plugin_test.go +++ b/network/backoff/plugin_test.go @@ -6,7 +6,7 @@ import ( "time" "github.com/perlin-network/noise/crypto" - "github.com/perlin-network/noise/crypto/signing/ed25519" + "github.com/perlin-network/noise/crypto/ed25519" "github.com/perlin-network/noise/examples/basic/messages" "github.com/perlin-network/noise/network" "github.com/perlin-network/noise/network/discovery" diff --git a/network/builder.go b/network/builder.go index b6dcb03e..755cdb11 100644 --- a/network/builder.go +++ b/network/builder.go @@ -6,8 +6,8 @@ import ( "sync" "github.com/perlin-network/noise/crypto" - "github.com/perlin-network/noise/crypto/hashing" - "github.com/perlin-network/noise/crypto/signing" + "github.com/perlin-network/noise/crypto/blake2b" + "github.com/perlin-network/noise/crypto/ed25519" "github.com/perlin-network/noise/peer" "github.com/perlin-network/noise/protobuf" "github.com/pkg/errors" @@ -21,15 +21,15 @@ type Builder struct { plugins *PluginList pluginCount int - signaturePolicy signing.SignaturePolicy - hashPolicy hashing.HashPolicy + signaturePolicy crypto.SignaturePolicy + hashPolicy crypto.HashPolicy } // NewBuilder lets you configure a network to build. func NewBuilder() *Builder { return &Builder{ - signaturePolicy: signing.NewEd25519(), - hashPolicy: hashing.NewBlake2b(), + signaturePolicy: ed25519.NewEd25519(), + hashPolicy: blake2b.NewBlake2b(), } } @@ -44,12 +44,12 @@ func (builder *Builder) SetAddress(address string) { } // SetSignaturePolicy sets the signature policy for the network. -func (builder *Builder) SetSignaturePolicy(policy signing.SignaturePolicy) { +func (builder *Builder) SetSignaturePolicy(policy crypto.SignaturePolicy) { builder.signaturePolicy = policy } // SetHashPolicy sets the hash policy for the network. -func (builder *Builder) SetHashPolicy(policy hashing.HashPolicy) { +func (builder *Builder) SetHashPolicy(policy crypto.HashPolicy) { builder.hashPolicy = policy } diff --git a/network/builder_test.go b/network/builder_test.go index 1830a57a..ec09fa7a 100644 --- a/network/builder_test.go +++ b/network/builder_test.go @@ -5,12 +5,11 @@ import ( "fmt" "testing" - "github.com/perlin-network/noise/crypto" - "github.com/perlin-network/noise/crypto/signing" + "github.com/perlin-network/noise/crypto/ed25519" ) var ( - keys = crypto.NewKeyPair(signing.NewEd25519(), nil) + keys = ed25519.RandomKeyPair() host = "localhost" protocol = "tcp" port = uint16(12345) diff --git a/network/network.go b/network/network.go index d9324c7d..b08516a7 100644 --- a/network/network.go +++ b/network/network.go @@ -10,8 +10,6 @@ import ( "time" "github.com/perlin-network/noise/crypto" - "github.com/perlin-network/noise/crypto/hashing" - "github.com/perlin-network/noise/crypto/signing" "github.com/perlin-network/noise/peer" "github.com/perlin-network/noise/protobuf" @@ -69,8 +67,8 @@ type Network struct { // <-Listening will block a goroutine until this node is listening for peers. Listening chan struct{} - SignaturePolicy signing.SignaturePolicy - HashPolicy hashing.HashPolicy + SignaturePolicy crypto.SignaturePolicy + HashPolicy crypto.HashPolicy // <-Kill will begin the server shutdown process Kill chan struct{} @@ -475,6 +473,8 @@ func (n *Network) PrepareMessage(message proto.Message) (*protobuf.Message, erro id := protobuf.ID(n.ID) signature, err := n.Keys.Sign( + n.SignaturePolicy, + n.HashPolicy, SerializeMessage(&id, raw.Value), ) if err != nil { diff --git a/network/plugin_test.go b/network/plugin_test.go index 93cad63f..a5afccb1 100644 --- a/network/plugin_test.go +++ b/network/plugin_test.go @@ -4,8 +4,7 @@ import ( "fmt" "testing" - "github.com/perlin-network/noise/crypto" - "github.com/perlin-network/noise/crypto/signing" + "github.com/perlin-network/noise/crypto/ed25519" ) var ( @@ -49,7 +48,7 @@ func TestPluginHooks(t *testing.T) { for i := 0; i < nodeCount; i++ { builder := NewBuilder() - builder.SetKeys(crypto.NewKeyPair(signing.NewEd25519(), nil)) + builder.SetKeys(ed25519.RandomKeyPair()) builder.SetAddress(FormatAddress("tcp", host, uint16(port+i))) builder.AddPlugin(new(MockPlugin))