github.com/avahowell/sia@v0.5.1-beta.0.20160524050156-83dcc3d37c94/crypto/signatures_mock.go (about) 1 package crypto 2 3 import ( 4 "crypto/rand" 5 "io" 6 7 "github.com/NebulousLabs/ed25519" 8 ) 9 10 type ( 11 // keyDeriver contains all of the dependencies for a signature key 12 // generator. The dependencies are separated to enable mocking. 13 keyDeriver interface { 14 deriveKeyPair([EntropySize]byte) (ed25519.SecretKey, ed25519.PublicKey) 15 } 16 ) 17 18 var ( 19 // stdKeyGen is a signature generator that can be used to generate random 20 // and deterministic keys for signing objects. 21 stdKeyGen sigKeyGen = sigKeyGen{entropySource: rand.Reader, keyDeriver: &stdKeyDeriver{}} 22 ) 23 24 // sigKeyGen contains a set of dependencies that are used to build out the core 25 // logic for generating keys in Sia. 26 type sigKeyGen struct { 27 entropySource io.Reader 28 keyDeriver keyDeriver 29 } 30 31 // generate builds a signature keypair using a sigKeyGen to manage 32 // dependencies. 33 func (skg sigKeyGen) generate() (sk SecretKey, pk PublicKey, err error) { 34 var entropy [EntropySize]byte 35 _, err = io.ReadFull(skg.entropySource, entropy[:]) 36 if err != nil { 37 return 38 } 39 40 skPointer, pkPointer := skg.keyDeriver.deriveKeyPair(entropy) 41 return *skPointer, *pkPointer, nil 42 } 43 44 // generateDeterministic builds a signature keypair deterministically using a 45 // sigKeyGen to manage dependencies. 46 func (skg sigKeyGen) generateDeterministic(entropy [EntropySize]byte) (SecretKey, PublicKey) { 47 skPointer, pkPointer := skg.keyDeriver.deriveKeyPair(entropy) 48 return *skPointer, *pkPointer 49 } 50 51 // stdKeyDeriver implements the keyDeriver dependency for the sigKeyGen. 52 type stdKeyDeriver struct{} 53 54 func (skd *stdKeyDeriver) deriveKeyPair(entropy [EntropySize]byte) (ed25519.SecretKey, ed25519.PublicKey) { 55 return ed25519.GenerateKey(entropy) 56 }