@@ -69,7 +69,13 @@ export function sign(keyPair: KeyPair, msgHash: string): Signature {
6969 assertInRange ( r , ONE , toBN ( addHexPrefix ( MAX_ECDSA_VAL ) ) , 'r' ) ;
7070 assertInRange ( s , ONE , toBN ( addHexPrefix ( EC_ORDER ) ) , 's' ) ;
7171 assertInRange ( w , ONE , toBN ( addHexPrefix ( MAX_ECDSA_VAL ) ) , 'w' ) ;
72- return msgSignature ;
72+ return [ r , s ] ;
73+ }
74+
75+ function chunkArray ( arr : any [ ] , n : number ) : any [ ] [ ] {
76+ return Array ( Math . ceil ( arr . length / n ) )
77+ . fill ( '' )
78+ . map ( ( _ , i ) => arr . slice ( i * n , i * n + n ) ) ;
7379}
7480
7581/*
@@ -78,15 +84,20 @@ export function sign(keyPair: KeyPair, msgHash: string): Signature {
7884 msgSignature should be an Signature.
7985 Returns a boolean true if the verification succeeds.
8086 */
81- export function verify ( keyPair : KeyPair , msgHash : string , sig : Signature ) : boolean {
87+ export function verify ( keyPair : KeyPair | KeyPair [ ] , msgHash : string , sig : Signature ) : boolean {
88+ const keyPairArray = Array . isArray ( keyPair ) ? keyPair : [ keyPair ] ;
8289 const msgHashBN = toBN ( addHexPrefix ( msgHash ) ) ;
90+ assert ( sig . length % 2 === 0 , 'Signature must be an array of length dividable by 2' ) ;
8391 assertInRange ( msgHashBN , ZERO , toBN ( addHexPrefix ( MAX_ECDSA_VAL ) ) , 'msgHash' ) ;
84- const { r, s } = sig ;
85- const w = s . invm ( ec . n ! ) ;
86- // Verify signature has valid length.
87- assertInRange ( r , ONE , toBN ( addHexPrefix ( MAX_ECDSA_VAL ) ) , 'r' ) ;
88- assertInRange ( s , ONE , toBN ( addHexPrefix ( EC_ORDER ) ) , 's' ) ;
89- assertInRange ( w , ONE , toBN ( addHexPrefix ( MAX_ECDSA_VAL ) ) , 'w' ) ;
92+ assert ( keyPairArray . length === sig . length / 2 , 'Signature and keyPair length must be equal' ) ;
9093
91- return keyPair . verify ( fixMessage ( msgHash ) , sig ) ;
94+ return chunkArray ( sig , 2 ) . every ( ( [ r , s ] , i ) => {
95+ const rBN = toBN ( r ) ;
96+ const sBN = toBN ( s ) ;
97+ const w = sBN . invm ( ( ec as any ) . n ) ;
98+ assertInRange ( rBN , ONE , toBN ( addHexPrefix ( MAX_ECDSA_VAL ) ) , 'r' ) ;
99+ assertInRange ( sBN , ONE , toBN ( addHexPrefix ( EC_ORDER ) ) , 's' ) ;
100+ assertInRange ( w , ONE , toBN ( addHexPrefix ( MAX_ECDSA_VAL ) ) , 'w' ) ;
101+ return ec . verify ( fixMessage ( msgHash ) , { r : rBN , s : sBN } , keyPairArray [ i ] ) ?? false ;
102+ } ) ;
92103}
0 commit comments