@@ -56,33 +56,61 @@ describe('ecsign', function() {
56
56
'129ff05af364204442bdb53ab6f18a99ab48acc9326fa689f228040429e3ca66' ,
57
57
'hex'
58
58
)
59
+ const expectedSigV = Buffer . from ( '014f' , 'hex' )
59
60
60
61
const sig = ecsign ( echash , ecprivkey , 150 )
61
62
assert . deepEqual ( sig . r , expectedSigR )
62
63
assert . deepEqual ( sig . s , expectedSigS )
63
64
assert . equal ( sig . v , 150 * 2 + 35 )
64
65
65
- const sigBN = ecsign ( echash , ecprivkey , new BN ( 150 ) )
66
- assert . deepEqual ( sigBN . r , expectedSigR )
67
- assert . deepEqual ( sigBN . s , expectedSigS )
68
- assert . deepEqual ( sigBN . v , new BN ( 150 ) . muln ( 2 ) . addn ( 35 ) )
69
-
70
- const sigBuffer = ecsign ( echash , ecprivkey , Buffer . from ( [ 150 ] ) )
66
+ let sigBuffer = ecsign ( echash , ecprivkey , new BN ( 150 ) )
71
67
assert . deepEqual ( sigBuffer . r , expectedSigR )
72
68
assert . deepEqual ( sigBuffer . s , expectedSigS )
73
- assert . deepEqual ( sigBuffer . v , Buffer . from ( '014f' , 'hex' ) )
69
+ assert . deepEqual ( sigBuffer . v , expectedSigV )
70
+
71
+ sigBuffer = ecsign ( echash , ecprivkey , Buffer . from ( [ 150 ] ) )
72
+ assert . deepEqual ( sigBuffer . v , expectedSigV )
74
73
75
- const sigHexString = ecsign ( echash , ecprivkey , '0x96' )
76
- assert . deepEqual ( sigHexString . r , expectedSigR )
77
- assert . deepEqual ( sigHexString . s , expectedSigS )
78
- assert . equal ( sigHexString . v , '0x14f' )
74
+ sigBuffer = ecsign ( echash , ecprivkey , '0x96' )
75
+ assert . deepEqual ( sigBuffer . v , expectedSigV )
79
76
80
77
assert . throws ( function ( ) {
81
78
ecsign ( echash , ecprivkey , '96' )
82
79
} )
83
80
} )
84
81
} )
85
82
83
+ it ( 'should produce a signature for a high number chainId greater than MAX_SAFE_INTEGER' , function ( ) {
84
+ const chainIDBuffer = Buffer . from ( '796f6c6f763378' , 'hex' )
85
+ const expectedSigR = Buffer . from (
86
+ '99e71a99cb2270b8cac5254f9e99b6210c6c10224a1579cf389ef88b20a1abe9' ,
87
+ 'hex'
88
+ )
89
+ const expectedSigS = Buffer . from (
90
+ '129ff05af364204442bdb53ab6f18a99ab48acc9326fa689f228040429e3ca66' ,
91
+ 'hex'
92
+ )
93
+ const expectedSigV = Buffer . from ( 'f2ded8deec6713' , 'hex' )
94
+
95
+ let sigBuffer = ecsign ( echash , ecprivkey , new BN ( chainIDBuffer ) )
96
+ assert . deepEqual ( sigBuffer . r , expectedSigR )
97
+ assert . deepEqual ( sigBuffer . s , expectedSigS )
98
+ assert . deepEqual ( sigBuffer . v , expectedSigV )
99
+
100
+ sigBuffer = ecsign ( echash , ecprivkey , chainIDBuffer )
101
+ assert . deepEqual ( sigBuffer . v , expectedSigV )
102
+
103
+ sigBuffer = ecsign ( echash , ecprivkey , '0x' + chainIDBuffer . toString ( 'hex' ) )
104
+ assert . deepEqual ( sigBuffer . v , expectedSigV )
105
+
106
+ const chainIDNumber = parseInt ( chainIDBuffer . toString ( 'hex' ) , 16 )
107
+ assert . throws ( ( ) => {
108
+ // If we would use a number for the `chainId` parameter then it should throw.
109
+ // (The numbers are too high to perform arithmetic on)
110
+ ecsign ( echash , ecprivkey , chainIDNumber )
111
+ } )
112
+ } )
113
+
86
114
describe ( 'ecrecover' , function ( ) {
87
115
it ( 'should recover a public key' , function ( ) {
88
116
const r = Buffer . from ( '99e71a99cb2270b8cac5254f9e99b6210c6c10224a1579cf389ef88b20a1abe9' , 'hex' )
@@ -169,6 +197,13 @@ describe('ecrecover', function() {
169
197
sender = ecrecover ( msgHash , vHexString , r , s , chainIDHexString )
170
198
assert . ok ( sender . equals ( senderPubKey ) , 'sender pubkey correct (HexString)' )
171
199
200
+ assert . throws ( function ( ) {
201
+ ecrecover ( msgHash , 'f2ded8deec6714' , r , s , chainIDHexString )
202
+ } )
203
+ assert . throws ( function ( ) {
204
+ ecrecover ( msgHash , vHexString , r , s , '796f6c6f763378' )
205
+ } )
206
+
172
207
const chainIDNumber = parseInt ( chainIDBuffer . toString ( 'hex' ) , 16 )
173
208
const vNumber = parseInt ( vBuffer . toString ( 'hex' ) , 16 )
174
209
assert . throws ( ( ) => {
0 commit comments