Skip to content

Commit 2744ec1

Browse files
committed
Added test cases for getBin and Verify
1 parent 7770631 commit 2744ec1

File tree

2 files changed

+108
-3
lines changed

2 files changed

+108
-3
lines changed

verify.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,12 @@ func addressToString(byteCopy []byte) (s string, err error) {
131131
// License is:
132132
// https://github.com/piotrnar/gocoin/blob/master/lib/secp256k1/COPYING
133133
func getBin(num *secp256k1.Number, le int) ([]byte, error) {
134+
if num == nil {
135+
return nil, errors.New("secp256k1.Number is nil")
136+
}
134137
bts := num.Bytes()
135138
if len(bts) > le {
136-
return nil, fmt.Errorf("buffer too small")
139+
return nil, errors.New("buffer too small")
137140
}
138141
if len(bts) == le {
139142
return bts, nil
@@ -146,6 +149,9 @@ func getBin(num *secp256k1.Number, le int) ([]byte, error) {
146149
// License is:
147150
// https://github.com/piotrnar/gocoin/blob/master/lib/secp256k1/COPYING
148151
func recoverSig(sig *secp256k1.Signature, pubkey *secp256k1.XY, m *secp256k1.Number, recID int) (bool, error) {
152+
if sig == nil {
153+
return false, errors.New("sig is nil")
154+
}
149155
var theCurveP secp256k1.Number
150156
theCurveP.SetBytes([]byte{
151157
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
@@ -159,7 +165,7 @@ func recoverSig(sig *secp256k1.Signature, pubkey *secp256k1.XY, m *secp256k1.Num
159165
if (recID & 2) != 0 {
160166
rx.Add(&rx.Int, &secp256k1.TheCurve.Order.Int)
161167
if rx.Cmp(&theCurveP.Int) >= 0 {
162-
return false, nil // todo: is this actually an error?
168+
return false, errors.New("error in recoverSig")
163169
}
164170
}
165171

@@ -172,7 +178,7 @@ func recoverSig(sig *secp256k1.Signature, pubkey *secp256k1.XY, m *secp256k1.Num
172178

173179
X.SetXO(&fx, (recID&1) != 0)
174180
if !X.IsValid() {
175-
return false, nil // todo: is this actually an error?
181+
return false, errors.New("x.IsValid failed")
176182
}
177183

178184
xj.SetXY(&X)

verify_test.go

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package bitcoin
33
import (
44
"encoding/hex"
55
"fmt"
6+
"math/big"
67
"strconv"
78
"testing"
89

@@ -173,3 +174,101 @@ func TestVerifyMessageSigRecover(t *testing.T) {
173174
}
174175
}
175176
}
177+
178+
// TestVerifyMessageSigRecoverFailed will test the method recoverSig()
179+
func TestVerifyMessageSigRecoverFailed(t *testing.T) {
180+
181+
// Bad signature cases
182+
var vs = [][6]string{
183+
{
184+
"0",
185+
"0",
186+
"0",
187+
"0",
188+
"0",
189+
"0",
190+
},
191+
{
192+
"000",
193+
"560978aed76de9d5d781f87ed2068832ed545f2b21bf040654a2daff694c8b09",
194+
"9ce428d58e8e4caf619dc6fc7b2c2c28f0561654d1f80f322c038ad5e67ff8a6",
195+
"1",
196+
"000",
197+
"bf29a25e2d1f32c5afb18b41ae60112723278a8af31275965a6ec1d95334e840",
198+
},
199+
{
200+
"000",
201+
"1234567",
202+
"1234567",
203+
"1",
204+
"000",
205+
"1234567",
206+
},
207+
{
208+
"bf29a25e2d1f32c5afb18b41ae60112723278a8af31275965a6ec1d95334e840",
209+
"bf29a25e2d1f32c5afb18b41ae60112723278a8af31275965a6ec1d95334e840",
210+
"bf29a25e2d1f32c5afb18b41ae60112723278a8af31275965a6ec1d95334e840",
211+
"1",
212+
"bf29a25e2d1f32c5afb18b41ae60112723278a8af31275965a6ec1d95334e840",
213+
"bf29a25e2d1f32c5afb18b41ae60112723278a8af31275965a6ec1d95334e840",
214+
},
215+
}
216+
217+
var sig secp256k1.Signature
218+
var pubkey, exp secp256k1.XY
219+
var msg secp256k1.Number
220+
221+
for i := range vs {
222+
sig.R.SetHex(vs[i][0])
223+
sig.S.SetHex(vs[i][1])
224+
msg.SetHex(vs[i][2])
225+
rid, err := strconv.ParseInt(vs[i][3], 10, 32)
226+
if err != nil {
227+
t.Fatalf("failed in ParseInt: %s", err.Error())
228+
}
229+
exp.X.SetHex(vs[i][4])
230+
exp.Y.SetHex(vs[i][5])
231+
232+
var success bool
233+
success, err = recoverSig(&sig, &pubkey, &msg, int(rid))
234+
235+
if success {
236+
t.Fatalf("sigRecover should have failed")
237+
} else if err == nil {
238+
t.Error("sigRecover should have thrown an error")
239+
}
240+
}
241+
242+
// Test nil case
243+
if _, err := recoverSig(nil, &pubkey, &msg, 1); err == nil {
244+
t.Fatalf("error was expected with nil sig")
245+
}
246+
}
247+
248+
// TestVerifyMessageGetBin will test the method getBin()
249+
func TestVerifyMessageGetBin(t *testing.T) {
250+
t.Parallel()
251+
252+
var (
253+
// Testing private methods
254+
tests = []struct {
255+
inputNumber *secp256k1.Number
256+
inputLength int
257+
expectedError bool
258+
}{
259+
{nil, 1, true},
260+
{&secp256k1.Number{Int: *big.NewInt(400)}, 1, true},
261+
{&secp256k1.Number{Int: *big.NewInt(1)}, 1, false},
262+
}
263+
)
264+
265+
// Run tests
266+
for _, test := range tests {
267+
if _, err := getBin(test.inputNumber, test.inputLength); err != nil && !test.expectedError {
268+
t.Errorf("%s Failed: [%v] [%d] inputted and error not expected but got: %s", t.Name(), test.inputNumber, test.inputLength, err.Error())
269+
} else if err == nil && test.expectedError {
270+
t.Log(len(test.inputNumber.Bytes()), test.inputLength)
271+
t.Errorf("%s Failed: [%v] [%d] inputted and error was expected", t.Name(), test.inputNumber, test.inputLength)
272+
}
273+
}
274+
}

0 commit comments

Comments
 (0)