func Test_Secp256_06b(t *testing.T) { pubkey1, seckey := GenerateKeyPair() msg := randentropy.GetEntropyMixed(32) sig, _ := Sign(msg, seckey) fail_count := 0 for i := 0; i < TESTS; i++ { msg = randentropy.GetEntropyMixed(32) pubkey2, _ := RecoverPubkey(msg, sig) if bytes.Equal(pubkey1, pubkey2) == true { t.Fail() } if pubkey2 != nil && VerifySignature(msg, sig, pubkey2) != nil { t.Fail() } if VerifySignature(msg, sig, pubkey1) == nil { t.Fail() } } if fail_count != 0 { fmt.Printf("ERROR: Accepted signature for %v of %v random messages\n", fail_count, TESTS) } }
//test pubkey recovery func Test_Secp256_02a(t *testing.T) { pubkey1, seckey1 := GenerateKeyPair() msg := randentropy.GetEntropyMixed(32) sig, _ := Sign(msg, seckey1) if sig == nil { t.Fatal("Signature nil") } err := VerifySignature(msg, sig, pubkey1) if err != nil { t.Fatal("Signature invalid") } pubkey2, _ := RecoverPubkey(msg, sig) if len(pubkey1) != len(pubkey2) { t.Fatal() } for i, _ := range pubkey1 { if pubkey1[i] != pubkey2[i] { t.Fatal() } } if bytes.Equal(pubkey1, pubkey2) == false { t.Fatal() } }
func Test_Secp256_06a_alt0(t *testing.T) { pubkey1, seckey := GenerateKeyPair() msg := randentropy.GetEntropyMixed(32) sig, _ := Sign(msg, seckey) if sig == nil { t.Fail() } if len(sig) != 65 { t.Fail() } for i := 0; i < TESTS; i++ { sig = randSig() pubkey2, _ := RecoverPubkey(msg, sig) if bytes.Equal(pubkey1, pubkey2) == true { t.Fail() } if pubkey2 != nil && VerifySignature(msg, sig, pubkey2) != nil { t.Fail() } if VerifySignature(msg, sig, pubkey1) == nil { t.Fail() } } }
func (ks keyStorePassphrase) StoreKey(key *Key, auth string) (err error) { authArray := []byte(auth) salt := randentropy.GetEntropyMixed(32) derivedKey, err := scrypt.Key(authArray, salt, scryptN, scryptr, scryptp, scryptdkLen) if err != nil { return err } keyBytes := key.PrivateKey toEncrypt := util.PKCS7Pad(keyBytes) AES256Block, err := aes.NewCipher(derivedKey) if err != nil { return err } gcm, err := cipher.NewGCM(AES256Block) if err != nil { return err } // XXX: a GCM nonce may only be used once per key ever! nonce := randentropy.GetEntropyMixed(gcm.NonceSize()) // (dst, nonce, plaintext, extradata) cipherText := gcm.Seal(nil, nonce, toEncrypt, nil) cipherStruct := cipherJSON{ salt, nonce, cipherText, } keyStruct := encryptedKeyJSON{ key.Id, key.Type.String(), strings.ToUpper(hex.EncodeToString(key.Address)), cipherStruct, } keyJSON, err := json.Marshal(keyStruct) if err != nil { return err } return WriteKeyFile(key.Address, ks.keysDirPath, keyJSON) }
func Test_Secp256_00(t *testing.T) { var nonce []byte = randentropy.GetEntropyMixed(32) //going to get bitcoins stolen! if len(nonce) != 32 { t.Fatal() } }
//test random messages for the same pub/private key func Test_Secp256_03(t *testing.T) { _, seckey := GenerateKeyPair() for i := 0; i < TESTS; i++ { msg := randentropy.GetEntropyMixed(32) sig, _ := Sign(msg, seckey) CompactSigTest(sig) sig[len(sig)-1] %= 4 pubkey2, _ := RecoverPubkey(msg, sig) if pubkey2 == nil { t.Fail() } } }
//test random messages for different pub/private keys func Test_Secp256_04(t *testing.T) { for i := 0; i < TESTS; i++ { pubkey1, seckey := GenerateKeyPair() msg := randentropy.GetEntropyMixed(32) sig, _ := Sign(msg, seckey) CompactSigTest(sig) if sig[len(sig)-1] >= 4 { t.Fail() } pubkey2, _ := RecoverPubkey(msg, sig) if pubkey2 == nil { t.Fail() } if bytes.Equal(pubkey1, pubkey2) == false { t.Fail() } } }
//test signing message func Test_Secp256_02(t *testing.T) { pubkey1, seckey := GenerateKeyPair() msg := randentropy.GetEntropyMixed(32) sig, _ := Sign(msg, seckey) if sig == nil { t.Fatal("Signature nil") } pubkey2, _ := RecoverPubkey(msg, sig) if pubkey2 == nil { t.Fatal("Recovered pubkey invalid") } if bytes.Equal(pubkey1, pubkey2) == false { t.Fatal("Recovered pubkey does not match") } err := VerifySignature(msg, sig, pubkey1) if err != nil { t.Fatal("Signature invalid") } }
//test size of messages func Test_Secp256_02s(t *testing.T) { pubkey, seckey := GenerateKeyPair() msg := randentropy.GetEntropyMixed(32) sig, _ := Sign(msg, seckey) CompactSigTest(sig) if sig == nil { t.Fatal("Signature nil") } if len(pubkey) != 65 { t.Fail() } if len(seckey) != 32 { t.Fail() } if len(sig) != 64+1 { t.Fail() } if int(sig[64]) > 4 { t.Fail() } //should be 0 to 4 }
func newKeyEd25519(addrType AddrType) *Key { randBytes := randentropy.GetEntropyMixed(32) key, _ := keyFromPrivEd25519(addrType, randBytes) return key }
func randSig() []byte { sig := randentropy.GetEntropyMixed(65) sig[32] &= 0x70 sig[64] %= 4 return sig }