eckey_test.go raw
1 package p256k1
2
3 import (
4 "testing"
5 )
6
7 func TestECSeckeyVerify(t *testing.T) {
8 // Test valid key
9 validKey := []byte{
10 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
11 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
12 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
13 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
14 }
15 if !ECSeckeyVerify(validKey) {
16 t.Error("valid key should verify")
17 }
18
19 // Test invalid key (all zeros)
20 invalidKey := make([]byte, 32)
21 if ECSeckeyVerify(invalidKey) {
22 t.Error("zero key should not verify")
23 }
24
25 // Test wrong length
26 if ECSeckeyVerify(validKey[:31]) {
27 t.Error("wrong length should not verify")
28 }
29 }
30
31 func TestECSeckeyGenerate(t *testing.T) {
32 key, err := ECSeckeyGenerate()
33 if err != nil {
34 t.Fatalf("failed to generate key: %v", err)
35 }
36 if len(key) != 32 {
37 t.Errorf("key length should be 32, got %d", len(key))
38 }
39 if !ECSeckeyVerify(key) {
40 t.Error("generated key should be valid")
41 }
42 }
43
44 func TestECKeyPairGenerate(t *testing.T) {
45 seckey, pubkey, err := ECKeyPairGenerate()
46 if err != nil {
47 t.Fatalf("failed to generate key pair: %v", err)
48 }
49 if len(seckey) != 32 {
50 t.Errorf("secret key length should be 32, got %d", len(seckey))
51 }
52 if pubkey == nil {
53 t.Fatal("public key should not be nil")
54 }
55
56 // Verify the public key matches the secret key
57 var expectedPubkey PublicKey
58 if err := ECPubkeyCreate(&expectedPubkey, seckey); err != nil {
59 t.Fatalf("failed to create expected public key: %v", err)
60 }
61
62 if ECPubkeyCmp(pubkey, &expectedPubkey) != 0 {
63 t.Error("generated public key does not match secret key")
64 }
65 }
66
67 func TestECSeckeyNegate(t *testing.T) {
68 key := []byte{
69 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
70 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
71 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
72 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
73 }
74
75 keyCopy := make([]byte, 32)
76 copy(keyCopy, key)
77
78 if !ECSeckeyNegate(keyCopy) {
79 t.Error("negation should succeed")
80 }
81
82 // Negating twice should give original
83 if !ECSeckeyNegate(keyCopy) {
84 t.Error("second negation should succeed")
85 }
86
87 // Keys should be equal
88 for i := 0; i < 32; i++ {
89 if key[i] != keyCopy[i] {
90 t.Error("double negation should restore original")
91 break
92 }
93 }
94 }
95
96 func TestECSeckeyTweakAdd(t *testing.T) {
97 seckey := []byte{
98 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
99 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
100 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
101 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
102 }
103
104 tweak := []byte{
105 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
106 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
107 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
108 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
109 }
110
111 originalSeckey := make([]byte, 32)
112 copy(originalSeckey, seckey)
113
114 if err := ECSeckeyTweakAdd(seckey, tweak); err != nil {
115 t.Fatalf("tweak add failed: %v", err)
116 }
117
118 // Verify key is still valid
119 if !ECSeckeyVerify(seckey) {
120 t.Error("tweaked key should be valid")
121 }
122
123 // Keys should be different
124 allSame := true
125 for i := 0; i < 32; i++ {
126 if seckey[i] != originalSeckey[i] {
127 allSame = false
128 break
129 }
130 }
131 if allSame {
132 t.Error("tweaked key should be different from original")
133 }
134 }
135
136 func TestECPubkeyTweakAdd(t *testing.T) {
137 // Generate key pair
138 seckey, pubkey, err := ECKeyPairGenerate()
139 if err != nil {
140 t.Fatalf("failed to generate key pair: %v", err)
141 }
142
143 tweak := []byte{
144 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
145 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
146 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
147 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
148 }
149
150 originalPubkey := *pubkey
151
152 // Tweak secret key
153 seckeyCopy := make([]byte, 32)
154 copy(seckeyCopy, seckey)
155 if err := ECSeckeyTweakAdd(seckeyCopy, tweak); err != nil {
156 t.Fatalf("failed to tweak secret key: %v", err)
157 }
158
159 // Compute expected public key from tweaked secret key
160 var expectedPubkey PublicKey
161 if err := ECPubkeyCreate(&expectedPubkey, seckeyCopy); err != nil {
162 t.Fatalf("failed to create expected public key: %v", err)
163 }
164
165 // Tweak public key
166 if err := ECPubkeyTweakAdd(pubkey, tweak); err != nil {
167 t.Fatalf("failed to tweak public key: %v", err)
168 }
169
170 // Public keys should match
171 if ECPubkeyCmp(pubkey, &expectedPubkey) != 0 {
172 t.Error("tweaked public key does not match tweaked secret key")
173 }
174
175 // Should be different from original
176 if ECPubkeyCmp(pubkey, &originalPubkey) == 0 {
177 t.Error("tweaked public key should be different from original")
178 }
179 }
180
181 func TestECPubkeyTweakMul(t *testing.T) {
182 // Generate key pair
183 seckey, pubkey, err := ECKeyPairGenerate()
184 if err != nil {
185 t.Fatalf("failed to generate key pair: %v", err)
186 }
187
188 tweak := []byte{
189 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
190 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
191 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
192 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
193 }
194
195 originalPubkey := *pubkey
196
197 // Tweak secret key
198 seckeyCopy := make([]byte, 32)
199 copy(seckeyCopy, seckey)
200 if err := ECSeckeyTweakMul(seckeyCopy, tweak); err != nil {
201 t.Fatalf("failed to tweak secret key: %v", err)
202 }
203
204 // Compute expected public key from tweaked secret key
205 var expectedPubkey PublicKey
206 if err := ECPubkeyCreate(&expectedPubkey, seckeyCopy); err != nil {
207 t.Fatalf("failed to create expected public key: %v", err)
208 }
209
210 // Tweak public key
211 if err := ECPubkeyTweakMul(pubkey, tweak); err != nil {
212 t.Fatalf("failed to tweak public key: %v", err)
213 }
214
215 // Public keys should match
216 if ECPubkeyCmp(pubkey, &expectedPubkey) != 0 {
217 t.Error("tweaked public key does not match tweaked secret key")
218 }
219
220 // Should be different from original
221 if ECPubkeyCmp(pubkey, &originalPubkey) == 0 {
222 t.Error("tweaked public key should be different from original")
223 }
224 }
225
226