@@ -51,32 +51,41 @@ describe('secp256k1', () => {
51
51
Assert . ok ( / ^ [ 0 - 9 a - f ] { 64 } $ / . test ( sig . s ) , 'sig.s is not a hex string' )
52
52
Assert . ok ( sig . v === 0 || sig . v === 1 , 'sig.v is not a 0 or 1' )
53
53
if ( Secp256k1Node ) {
54
- const success = Secp256k1Node . verify ( B ( z ) , Buffer . concat ( [ B ( sig . r ) , B ( sig . s ) ] ) , Buffer . concat ( [ Buffer ( '\04' ) , B ( pubX ) , B ( pubY ) ] ) )
54
+ const success = Secp256k1Node . verify ( B ( z ) , Buffer . concat ( [ B ( sig . r ) , B ( sig . s ) ] ) , Buffer . concat ( [ Buffer . from ( '\04' ) , B ( pubX ) , B ( pubY ) ] ) )
55
55
Assert . ok ( success , JSON . stringify ( sig ) )
56
56
}
57
57
} )
58
58
59
59
it ( 'has recovery bit' , ( ) => {
60
60
const sig = Secp256k1 . ecsign ( d , z )
61
61
if ( Secp256k1Node ) {
62
- const success = Secp256k1Node . verify ( B ( z ) , Buffer . concat ( [ B ( sig . r ) , B ( sig . s ) ] ) , Buffer . concat ( [ Buffer ( '\04' ) , B ( pubX ) , B ( pubY ) ] ) )
62
+ const success = Secp256k1Node . verify ( B ( z ) , Buffer . concat ( [ B ( sig . r ) , B ( sig . s ) ] ) , Buffer . concat ( [ Buffer . from ( '\04' ) , B ( pubX ) , B ( pubY ) ] ) )
63
63
Assert . ok ( success , JSON . stringify ( sig ) )
64
64
const Q = Secp256k1Node . recover ( B ( z ) , Buffer . concat ( [ B ( sig . r ) , B ( sig . s ) ] ) , sig . v , false )
65
65
Assert . deepStrictEqual ( { x : Q . toString ( 'hex' ) . substr ( 2 , 64 ) , y : Q . toString ( 'hex' ) . slice ( - 64 ) } , { x : pubX . toString ( 16 ) , y : pubY . toString ( 16 ) } )
66
66
}
67
67
} )
68
68
69
- it ( 'can verify self ' , ( ) => {
69
+ it ( 'can verify ours ' , ( ) => {
70
70
const sig = Secp256k1 . ecsign ( d , z )
71
71
Assert . ok ( Secp256k1 . ecverify ( pubX , pubY , Secp256k1 . uint256 ( sig . r , 16 ) , Secp256k1 . uint256 ( sig . s , 16 ) , z ) )
72
72
} )
73
73
74
+ it ( 'can verify known sig' , ( ) => {
75
+ Assert . ok ( Secp256k1 . ecverify ( pubX , pubY , Secp256k1 . uint256 ( r , 16 ) , Secp256k1 . uint256 ( s , 16 ) , z ) )
76
+ } )
77
+
74
78
it ( 'can verify fff...' , ( ) => {
75
79
const z = Secp256k1 . uint256 ( "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" , 16 )
76
80
const sig = Secp256k1 . ecsign ( d , z )
77
81
Assert . ok ( Secp256k1 . ecverify ( pubX , pubY , Secp256k1 . uint256 ( sig . r , 16 ) , Secp256k1 . uint256 ( sig . s , 16 ) , z ) )
78
82
} )
79
83
84
+ it ( 'cannot sign 000...' , ( ) => {
85
+ const z = Secp256k1 . uint256 ( "0000000000000000000000000000000000000000000000000000000000000000" , 16 )
86
+ Assert . throws ( ( ) => Secp256k1 . ecsign ( d , z ) , "assertion failed: z must not be 0" )
87
+ } )
88
+
80
89
it ( 'can verify other sig' , ( ) => {
81
90
if ( Secp256k1Node ) {
82
91
const sig = Secp256k1Node . sign ( B ( z ) , B ( d ) )
@@ -86,6 +95,14 @@ describe('secp256k1', () => {
86
95
Assert . ok ( Secp256k1 . ecverify ( pubX , pubY , Secp256k1 . uint256 ( r , 16 ) , Secp256k1 . uint256 ( s , 16 ) , z ) )
87
96
} )
88
97
98
+ it ( 'verify fails if r=0' , ( ) => {
99
+ Assert . isFalse ( Secp256k1 . ecverify ( pubX , pubY , Secp256k1 . uint256 ( 0 ) , Secp256k1 . uint256 ( s , 16 ) , z ) )
100
+ } )
101
+
102
+ it ( 'verify fails if s=0' , ( ) => {
103
+ Assert . isFalse ( Secp256k1 . ecverify ( pubX , pubY , Secp256k1 . uint256 ( r , 16 ) , Secp256k1 . uint256 ( 0 ) , z ) )
104
+ } )
105
+
89
106
it ( 'can recover other sig' , ( ) => {
90
107
if ( Secp256k1Node ) {
91
108
const sig = Secp256k1Node . sign ( B ( z ) , B ( d ) )
@@ -97,9 +114,30 @@ describe('secp256k1', () => {
97
114
Assert . deepStrictEqual ( Q , { x : pubX . toString ( 16 ) , y : pubY . toString ( 16 ) } )
98
115
} )
99
116
100
- it ( 'can recover self ' , ( ) => {
117
+ it ( 'can recover ours ' , ( ) => {
101
118
const sig = Secp256k1 . ecsign ( d , z )
102
119
const Q = Secp256k1 . ecrecover ( sig . v , Secp256k1 . uint256 ( sig . r , 16 ) , Secp256k1 . uint256 ( sig . s , 16 ) , z )
103
120
Assert . deepStrictEqual ( Q , { x : pubX . toString ( 16 ) , y : pubY . toString ( 16 ) } )
104
121
} )
122
+
123
+ it ( 'can recover known sig' , ( ) => {
124
+ const Q = Secp256k1 . ecrecover ( v , Secp256k1 . uint256 ( r , 16 ) , Secp256k1 . uint256 ( s , 16 ) , z )
125
+ Assert . deepStrictEqual ( Q , { x : pubX . toString ( 16 ) , y : pubY . toString ( 16 ) } )
126
+ } )
127
+
128
+ it ( 'recover fails if r=0' , ( ) => {
129
+ Assert . throws ( ( ) => Secp256k1 . ecrecover ( v , Secp256k1 . uint256 ( 0 ) , Secp256k1 . uint256 ( s , 16 ) , z ) , "assertion failed: sigr must not be 0" )
130
+ } )
131
+
132
+ it ( 'recover fails if s=0' , ( ) => {
133
+ Assert . throws ( ( ) => Secp256k1 . ecrecover ( v , Secp256k1 . uint256 ( r , 16 ) , Secp256k1 . uint256 ( 0 ) , z ) , "assertion failed: sigs must not be 0" )
134
+ } )
135
+
136
+ it ( 'recover fails if recId<0' , ( ) => {
137
+ Assert . throws ( ( ) => Secp256k1 . ecrecover ( - 1 , Secp256k1 . uint256 ( r , 16 ) , Secp256k1 . uint256 ( s , 16 ) , z ) , "assertion failed: recId must be 0..3" )
138
+ } )
139
+
140
+ it ( 'recover fails if recId>3' , ( ) => {
141
+ Assert . throws ( ( ) => Secp256k1 . ecrecover ( 4 , Secp256k1 . uint256 ( r , 16 ) , Secp256k1 . uint256 ( s , 16 ) , z ) , "assertion failed: recId must be 0..3" )
142
+ } )
105
143
} )
0 commit comments