-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathsecp256k1_test.go
More file actions
87 lines (73 loc) · 2.66 KB
/
secp256k1_test.go
File metadata and controls
87 lines (73 loc) · 2.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
// Copyright (c) 2020 IoTeX
// This is an alpha (internal) release and is not suitable for production. This source code is provided 'as is' and no
// warranties are given as to title or non-infringement, merchantability or fitness for purpose and, to the extent
// permitted by law, all liability for your use of the code is disclaimed. This source code is governed by Apache
// License 2.0 that can be found in the LICENSE file.
package crypto
import (
"crypto/ecdsa"
"encoding/hex"
"testing"
"github.com/stretchr/testify/require"
"github.com/iotexproject/go-pkgs/hash"
)
func TestSecp256k1(t *testing.T) {
require := require.New(t)
sk, err := newSecp256k1PrvKey()
require.NoError(err)
defer sk.Zero()
require.Equal(secp256prvKeyLength, len(sk.Bytes()))
pk := sk.PublicKey()
require.Equal(secp256pubKeyLength, len(pk.Bytes()))
nsk, err := newSecp256k1PrvKeyFromBytes(sk.Bytes())
require.NoError(err)
require.Equal(sk, nsk)
npk, err := newSecp256k1PubKeyFromBytes(pk.Bytes())
require.NoError(err)
require.Equal(pk, npk)
_, ok := sk.EcdsaPrivateKey().(*ecdsa.PrivateKey)
require.True(ok)
_, ok = pk.EcdsaPublicKey().(*ecdsa.PublicKey)
require.True(ok)
h := hash.Hash256b([]byte("test secp256k1 signature så∫jaç∂fla´´3jl©˙kl3∆˚83jl≈¥fjs2"))
sig, err := sk.Sign(h[:])
require.NoError(err)
require.True(sig[Secp256k1SigSize] == 0 || sig[Secp256k1SigSize] == 1)
require.True(pk.Verify(h[:], sig))
for i := 0; i < len(sig)-1; i++ {
sig[i]--
require.False(pk.Verify(h[:], sig))
sig[i]++
}
require.True(pk.Verify(h[:], sig))
// test recover pubkey
npk, err = RecoverPubkey(h[:], sig)
require.NoError(err)
require.Equal(pk, npk)
sig[Secp256k1SigSize] += 27
require.True(pk.Verify(h[:], sig))
sig[Secp256k1SigSize] = 2
require.False(pk.Verify(h[:], sig))
// test Ethereum signature with recovery id >= 27
ha, _ := hex.DecodeString("f93a97fae37fdadab6d49b74e3f3e4bee707ea2f007e08007bcc356cb283665b")
sig, _ = hex.DecodeString("5595906a47dfc107a78cc48b500f89ab2dec545ba86578295aed4a260ce9a98b335924e86f683832e313f1a5dda7826d9b59caf40dd22ce92716420a367dfaec1c")
require.EqualValues(28, sig[Secp256k1SigSize])
pk, err = RecoverPubkey(ha, sig)
require.NoError(err)
require.EqualValues(28, sig[Secp256k1SigSize])
require.Equal("53fbc28faf9a52dfe5f591948a23189e900381b5", hex.EncodeToString(pk.Hash()))
}
func BenchmarkSecp256k1(b *testing.B) {
require := require.New(b)
sk, err := newSecp256k1PrvKey()
require.NoError(err)
defer sk.Zero()
pk := sk.PublicKey()
require.Equal(secp256pubKeyLength, len(pk.Bytes()))
b.ResetTimer()
pkData := pk.Bytes()
for n := 0; n < b.N; n++ {
_, err := newSecp256k1PubKeyFromBytes(pkData)
require.NoError(err)
}
}