@@ -219,17 +219,13 @@ Bitcoin.BIP38 = (function () {
219
219
* Creates new private key using an intermediate EC point.
220
220
*/
221
221
BIP38 . newAddressFromIntermediate = function ( intermediate , compressed ) {
222
- // decode IPS
223
- var intermediateBytes = Bitcoin . Base58 . decode ( intermediate ) ;
224
- var expectedChecksum = intermediateBytes . slice ( 49 , 53 )
225
- var checksum = Bitcoin . Util . dsha256 ( intermediateBytes . slice ( 0 , 49 ) ) . slice ( 0 , 4 )
226
- if ( expectedChecksum [ 0 ] != checksum [ 0 ] ||
227
- expectedChecksum [ 1 ] != checksum [ 1 ] ||
228
- expectedChecksum [ 2 ] != checksum [ 2 ] ||
229
- expectedChecksum [ 3 ] != checksum [ 3 ] ) {
230
- throw new Error ( "Invalid intermediate passphrase string" ) ;
222
+ // validate intermediate code
223
+ if ( ! BIP38 . verifyIntermediate ( intermediate ) ) {
224
+ throw new Error ( "Invalid intermediate passphrase string" ) ;
231
225
}
232
226
227
+ // decode IPS
228
+ var intermediateBytes = Bitcoin . Base58 . decode ( intermediate ) ;
233
229
var noNumbers = ( intermediateBytes [ 7 ] === 0x53 ) ;
234
230
var ownerEntropy = intermediateBytes . slice ( 8 , 8 + 8 ) ;
235
231
var passpoint = intermediateBytes . slice ( 16 , 16 + 33 ) ;
@@ -397,6 +393,31 @@ Bitcoin.BIP38 = (function () {
397
393
398
394
return { valid : valid , address : generatedAddress } ;
399
395
}
396
+
397
+ /**
398
+ * Checks the validity of an intermediate code.
399
+ */
400
+ BIP38 . verifyIntermediate = function ( intermediate ) {
401
+ // Simple regex check
402
+ var regexValid = ( / ^ p a s s p h r a s e [ 1 2 3 4 5 6 7 8 9 A B C D E F G H J K L M N P Q R S T U V W X Y Z a b c d e f g h i j k m n o p q r s t u v w x y z ] + $ / . test ( intermediate ) ) ;
403
+ if ( ! regexValid ) return false ;
404
+
405
+ // Correct bytelen
406
+ var intermediateBytes = Bitcoin . Base58 . decode ( intermediate ) ;
407
+ if ( intermediateBytes . length != 53 ) return false ;
408
+
409
+ // Checksum check
410
+ var expectedChecksum = intermediateBytes . slice ( 49 , 53 ) ;
411
+ var checksum = Bitcoin . Util . dsha256 ( intermediateBytes . slice ( 0 , 49 ) ) . slice ( 0 , 4 ) ;
412
+ if ( expectedChecksum [ 0 ] != checksum [ 0 ] ||
413
+ expectedChecksum [ 1 ] != checksum [ 1 ] ||
414
+ expectedChecksum [ 2 ] != checksum [ 2 ] ||
415
+ expectedChecksum [ 3 ] != checksum [ 3 ] ) {
416
+ return false ;
417
+ }
418
+
419
+ return true ;
420
+ }
400
421
401
422
/**
402
423
* Detects keys encrypted according to BIP-38 (58 base58 characters starting with 6P)
0 commit comments