@@ -52,7 +52,12 @@ function mergeToV3ParamsWithDefaults(params?: Partial<V3Params>): V3Params {
52
52
}
53
53
}
54
54
55
- // KDF params
55
+ // KDF
56
+
57
+ const enum KDFFunctions {
58
+ PBKDF = 'pbkdf2' ,
59
+ Scrypt = 'scrypt' ,
60
+ }
56
61
57
62
interface ScryptKDFParams {
58
63
dklen : number
@@ -69,48 +74,24 @@ interface PBKDFParams {
69
74
salt : string
70
75
}
71
76
72
- // union of both the PBKDF2 and Scrypt KDF parameters representing all possible
73
- // parameters the user could supply
74
- type AllKDFParams = ScryptKDFParams & PBKDFParams
75
-
76
77
type KDFParams = ScryptKDFParams | PBKDFParams
77
78
78
- function kdfParamsForPBKDF ( params : AllKDFParams ) : PBKDFParams {
79
- delete params . n
80
- delete params . p
81
- delete params . r
82
- return params
83
- }
84
-
85
- function kdfParamsForScrypt ( params : AllKDFParams ) : ScryptKDFParams {
86
- delete params . c
87
- delete params . prf
88
- return params
89
- }
90
-
91
- /**
92
- * Based on the parameter list passed to the Wallet.prototype.toV3() method this
93
- * returns a list of parameters for running the key derivation function.
94
- * @param params params passed into the .toV3() method
95
- */
96
- function mergeKDFParamsWithDefaults ( params : V3Params ) : AllKDFParams {
97
- const kdfDefaults = {
98
- c : 262144 ,
79
+ function kdfParamsForPBKDF ( opts : V3Params ) : PBKDFParams {
80
+ return {
81
+ dklen : opts . dklen ,
82
+ salt : opts . salt . toString ( 'hex' ) ,
83
+ c : opts . c ,
99
84
prf : 'hmac-sha256' ,
100
- n : 262144 ,
101
- r : 8 ,
102
- p : 1 ,
103
- salt : params . salt . toString ( 'hex' ) ,
104
85
}
86
+ }
105
87
88
+ function kdfParamsForScrypt ( opts : V3Params ) : ScryptKDFParams {
106
89
return {
107
- dklen : params . dklen ,
108
- salt : kdfDefaults . salt ,
109
- c : params . c || kdfDefaults . c ,
110
- prf : kdfDefaults . prf ,
111
- n : params . n || kdfDefaults . n ,
112
- r : params . r || kdfDefaults . r ,
113
- p : params . p || kdfDefaults . p ,
90
+ dklen : opts . dklen ,
91
+ salt : opts . salt . toString ( 'hex' ) ,
92
+ n : opts . n ,
93
+ r : opts . r ,
94
+ p : opts . p ,
114
95
}
115
96
}
116
97
@@ -413,40 +394,41 @@ export default class Wallet {
413
394
throw new Error ( 'This is a public key only wallet' )
414
395
}
415
396
416
- const params = mergeToV3ParamsWithDefaults ( opts )
417
- const kdfParams = mergeKDFParamsWithDefaults ( params )
397
+ const v3Params : V3Params = mergeToV3ParamsWithDefaults ( opts )
418
398
399
+ let kdfParams : PBKDFParams | ScryptKDFParams
419
400
let derivedKey : Buffer
420
- let finalKDFParams : KDFParams
421
-
422
- if ( params . kdf === 'pbkdf2' ) {
423
- derivedKey = crypto . pbkdf2Sync (
424
- Buffer . from ( password ) ,
425
- params . salt ,
426
- kdfParams . c ,
427
- kdfParams . dklen ,
428
- 'sha256' ,
429
- )
430
- finalKDFParams = kdfParamsForPBKDF ( kdfParams )
431
- } else if ( params . kdf === 'scrypt' ) {
432
- // FIXME: support progress reporting callback
433
- derivedKey = scryptsy (
434
- Buffer . from ( password ) ,
435
- params . salt ,
436
- kdfParams . n ,
437
- kdfParams . r ,
438
- kdfParams . p ,
439
- kdfParams . dklen ,
440
- )
441
- finalKDFParams = kdfParamsForScrypt ( kdfParams )
442
- } else {
443
- throw new Error ( 'Unsupported kdf' )
401
+ switch ( v3Params . kdf ) {
402
+ case KDFFunctions . PBKDF :
403
+ kdfParams = kdfParamsForPBKDF ( v3Params )
404
+ derivedKey = crypto . pbkdf2Sync (
405
+ Buffer . from ( password ) ,
406
+ v3Params . salt ,
407
+ kdfParams . c ,
408
+ kdfParams . dklen ,
409
+ 'sha256' ,
410
+ )
411
+ break
412
+ case KDFFunctions . Scrypt :
413
+ kdfParams = kdfParamsForScrypt ( v3Params )
414
+ // FIXME: support progress reporting callback
415
+ derivedKey = scryptsy (
416
+ Buffer . from ( password ) ,
417
+ v3Params . salt ,
418
+ kdfParams . n ,
419
+ kdfParams . r ,
420
+ kdfParams . p ,
421
+ kdfParams . dklen ,
422
+ )
423
+ break
424
+ default :
425
+ throw new Error ( 'Unsupported kdf' )
444
426
}
445
427
446
428
const cipher : crypto . Cipher = crypto . createCipheriv (
447
- params . cipher ,
429
+ v3Params . cipher ,
448
430
derivedKey . slice ( 0 , 16 ) ,
449
- params . iv ,
431
+ v3Params . iv ,
450
432
)
451
433
if ( ! cipher ) {
452
434
throw new Error ( 'Unsupported cipher' )
@@ -459,15 +441,15 @@ export default class Wallet {
459
441
460
442
return {
461
443
version : 3 ,
462
- id : uuidv4 ( { random : params . uuid } ) ,
463
- // @ts -ignore FIXME: official V3 keystore spec omits the address key
444
+ id : uuidv4 ( { random : v3Params . uuid } ) ,
445
+ // @ts -ignore - the official V3 keystore spec omits the address key
464
446
address : this . getAddress ( ) . toString ( 'hex' ) ,
465
447
crypto : {
466
448
ciphertext : ciphertext . toString ( 'hex' ) ,
467
- cipherparams : { iv : params . iv . toString ( 'hex' ) } ,
468
- cipher : params . cipher ,
469
- kdf : params . kdf ,
470
- kdfparams : finalKDFParams ,
449
+ cipherparams : { iv : v3Params . iv . toString ( 'hex' ) } ,
450
+ cipher : v3Params . cipher ,
451
+ kdf : v3Params . kdf ,
452
+ kdfparams : kdfParams ,
471
453
mac : mac . toString ( 'hex' ) ,
472
454
} ,
473
455
}
0 commit comments