225b24f7f4
Sometimes having a whole buffer in memory isn't desired. New interface allows us to provide hashes instead.
118 lines
4.6 KiB
Go
118 lines
4.6 KiB
Go
package crypto
|
|
|
|
import (
|
|
"crypto/sha256"
|
|
"encoding/hex"
|
|
"testing"
|
|
|
|
"github.com/nspcc-dev/neofs-crypto/test"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
var (
|
|
rfc6979Data = "1f2155c0e513a7dab93d8b468809cd30a03c62326ec051deed031a6c6fbbdf" +
|
|
"02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4a0000000053724e000000000000001e61"
|
|
|
|
rfc6979Signatures = "03012d47e76210aec73be39ab3d186e0a40fe8d86bfa3d4fabfda57ba13b88f96a" +
|
|
"e6e87810285bdcba714b5c7a38ca32a3759f3b6d10b3ae69a3e33a444dd7a0f5025a730e07a81170e89124a8115d10bf29446b4a09280e567fca4f27a6d0fcd8" +
|
|
"e6e87810285bdcba714b5c7a38ca32a3759f3b6d10b3ae69a3e33a444dd7a0f5025a730e07a81170e89124a8115d10bf29446b4a09280e567fca4f27a6d0fcd8" +
|
|
"02f7528ce97c9a93558efe7d4f62577aabdf771c931f54a71be6ad21e7d9cc1777" +
|
|
"63efa21e48c3f56f9c8b1c7b24fa8141a4dd33cc12ae5d0bc2c885c628b2eb5b96aa1d7514e343c2221a49a8664415f1944452560bab13ff14ff3c6549da0665" +
|
|
"63efa21e48c3f56f9c8b1c7b24fa8141a4dd33cc12ae5d0bc2c885c628b2eb5b6955e289eb1cbc3edde5b65799bbea0e28a2a8579b6c8a85deba8e5db2891eec" +
|
|
"023e00f03a16e8707ce045eb42ee80d392451541ee510dc18e1c8befbac54d7426" +
|
|
"314e2f2adaaf67908aba6cb1183376574f27c1cafad5d8d852169f5adb26a6ac52641096d9051cdcd91e02420a0643827af535f25d8a9dafe4c5a00554a412ed" +
|
|
"314e2f2adaaf67908aba6cb1183376574f27c1cafad5d8d852169f5adb26a6ac52641096d9051cdcd91e02420a0643827af535f25d8a9dafe4c5a00554a412ed" +
|
|
"0340750b92789821683283bcb98e32b7e032b94f267b6964613fc31a7ce5813fdd" +
|
|
"9e155d31ba033d0637b03d9820c9312709376ab5d7f0a3b08392e47a5807bb76182f7add86b60723e120b25677626f3ab78fe04ed00ae0bb86503d8312c6d0bd" +
|
|
"9e155d31ba033d0637b03d9820c9312709376ab5d7f0a3b08392e47a5807bb76182f7add86b60723e120b25677626f3ab78fe04ed00ae0bb86503d8312c6d0bd" +
|
|
"03fef27f744e829131d0ec980829fafa51db1714c2761d9f78762c008c323e9d66" +
|
|
"f2de56e0777506fa52c19166706856794152a65e75a29dc6fc8a011d2abe1233c8e5e807a3d6b932e92ff91338755136446c57c9ec27df7eec04165e8ae38536" +
|
|
"f2de56e0777506fa52c19166706856794152a65e75a29dc6fc8a011d2abe1233371a17f75c2946ce16d006ecc78aaec9787aa2e3baefbf0607b5b464717fa01b" +
|
|
"0368a6f5829fb2a34fa03d0308ae6b05f433f2904d9a852fed1f5d2eb598ca7947" +
|
|
"9595d09ad84355e2c19ca5f08c19b9492816add735c7e01e549902f04b2c9d1ad7ea131a5e19ae325fffe5a4027383ff2132815c633abf318c2dc170890afc52" +
|
|
"9595d09ad84355e2c19ca5f08c19b9492816add735c7e01e549902f04b2c9d1a2815ece4a1e651cea0001a5bfd8c7c009bb4795143dcdf53678c0952735828ff"
|
|
|
|
keys = []string{
|
|
"L3o221BojgcCPYgdbXsm6jn7ayTZ72xwREvBHXKknR8VJ3G4WmjB",
|
|
"KxLBJgapF8FucHptTm49BaW7wMmQGq97mdeYSnyDmVd39SCFxjBc",
|
|
"Kyf6PExBaDHbYwmV7HAwaiqJM2x7wBqLHZrZqdKvF2RQsmDRfXgG",
|
|
"KwMWwRYN72vFFV2pjTv9XrWz3tKCvANZQ5BHSKkGCBS5UdKeGTEG",
|
|
"L4b9sjSbxfwJPUX9ESPV3LAU9PwLwrAuthVEpGc43Pm9ELtpky3b",
|
|
"KyCQQ1LHNYsUQ2ZkD6yQry3hnMUWMvrbk9dHKBwq9ogGXippznKs",
|
|
}
|
|
)
|
|
|
|
func TestRFC6979(t *testing.T) {
|
|
body, err := hex.DecodeString(rfc6979Data)
|
|
require.NoError(t, err)
|
|
|
|
data, err := hex.DecodeString(rfc6979Signatures)
|
|
require.NoError(t, err)
|
|
|
|
var offset int
|
|
|
|
for i := 0; i < 6; i++ {
|
|
key, err := WIFDecode(keys[i])
|
|
require.NoError(t, err)
|
|
|
|
pub := UnmarshalPublicKey(data[offset : offset+PublicKeyCompressedSize])
|
|
offset += PublicKeyCompressedSize
|
|
|
|
require.NotNilf(t, pub, "step: %d", i)
|
|
require.Equal(t, &key.PublicKey, pub)
|
|
|
|
{ // Generated by Go
|
|
sig := data[offset : offset+RFC6979SignatureSize]
|
|
|
|
{ // SignRFC6979
|
|
res, err := SignRFC6979(key, body)
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, sig, res, "step: %d, %02x", i, res)
|
|
|
|
require.NoErrorf(t, VerifyRFC6979(pub, body, sig), "step: %d", i)
|
|
}
|
|
{ // SignRFC6979Hash
|
|
sum := sha256.Sum256(body)
|
|
res, err := SignRFC6979Hash(key, sum[:])
|
|
require.NoError(t, err)
|
|
|
|
require.Equal(t, sig, res, "step: %d, %02x", i, res)
|
|
|
|
require.NoErrorf(t, VerifyRFC6979Hash(pub, sum[:], sig), "step: %d", i)
|
|
}
|
|
offset += RFC6979SignatureSize
|
|
}
|
|
|
|
{ // Generated by Python
|
|
sig := data[offset : offset+RFC6979SignatureSize]
|
|
|
|
// It's not equals in Python and Go:
|
|
// require.Equal(t, sig, res, "step: %d, %02x", i, res)
|
|
|
|
require.NoErrorf(t, VerifyRFC6979(pub, body, sig), "step: %d", i)
|
|
|
|
offset += RFC6979SignatureSize
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestRFC6979_ShortDecodePoints(t *testing.T) {
|
|
key := test.DecodeKey(1)
|
|
|
|
msgs := []string{
|
|
"6341922933e156ea5a53b8ea3fa4a80c", // this msg has 31 byte `s` point
|
|
"61b863d81f72e0e0d0353b1cb90d62ce", // this msg has 31 byte 'r' point
|
|
}
|
|
|
|
for i := range msgs {
|
|
msg, err := hex.DecodeString(msgs[i])
|
|
require.NoError(t, err)
|
|
|
|
signature, err := SignRFC6979(key, msg)
|
|
require.NoError(t, err, msgs[i])
|
|
|
|
err = VerifyRFC6979(&key.PublicKey, msg, signature)
|
|
require.NoError(t, err, msgs[i])
|
|
}
|
|
}
|