Skip to content
This repository was archived by the owner on Oct 30, 2024. It is now read-only.

Commit 5ac5e9b

Browse files
holgerd77axic
authored andcommitted
Add safe-buffer dependency, replace deprecated Buffer usages with Buffer.from() (also fixes linting)
1 parent 679b625 commit 5ac5e9b

File tree

6 files changed

+46
-41
lines changed

6 files changed

+46
-41
lines changed

index.js

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
var Buffer = require('safe-buffer').Buffer
12
var ethUtil = require('ethereumjs-util')
23
var crypto = require('crypto')
34
var scryptsy = require('scrypt.js')
@@ -122,13 +123,13 @@ Wallet.prototype.toV3 = function (password, opts) {
122123
if (kdf === 'pbkdf2') {
123124
kdfparams.c = opts.c || 262144
124125
kdfparams.prf = 'hmac-sha256'
125-
derivedKey = crypto.pbkdf2Sync(new Buffer(password), salt, kdfparams.c, kdfparams.dklen, 'sha256')
126+
derivedKey = crypto.pbkdf2Sync(Buffer.from(password), salt, kdfparams.c, kdfparams.dklen, 'sha256')
126127
} else if (kdf === 'scrypt') {
127128
// FIXME: support progress reporting callback
128129
kdfparams.n = opts.n || 262144
129130
kdfparams.r = opts.r || 8
130131
kdfparams.p = opts.p || 1
131-
derivedKey = scryptsy(new Buffer(password), salt, kdfparams.n, kdfparams.r, kdfparams.p, kdfparams.dklen)
132+
derivedKey = scryptsy(Buffer.from(password), salt, kdfparams.n, kdfparams.r, kdfparams.p, kdfparams.dklen)
132133
} else {
133134
throw new Error('Unsupported kdf')
134135
}
@@ -140,7 +141,7 @@ Wallet.prototype.toV3 = function (password, opts) {
140141

141142
var ciphertext = Buffer.concat([ cipher.update(this.privKey), cipher.final() ])
142143

143-
var mac = ethUtil.sha3(Buffer.concat([ derivedKey.slice(16, 32), new Buffer(ciphertext, 'hex') ]))
144+
var mac = ethUtil.sha3(Buffer.concat([ derivedKey.slice(16, 32), Buffer.from(ciphertext, 'hex') ]))
144145

145146
return {
146147
version: 3,
@@ -224,17 +225,17 @@ Wallet.fromV1 = function (input, password) {
224225
}
225226

226227
var kdfparams = json.Crypto.KeyHeader.KdfParams
227-
var derivedKey = scryptsy(new Buffer(password), new Buffer(json.Crypto.Salt, 'hex'), kdfparams.N, kdfparams.R, kdfparams.P, kdfparams.DkLen)
228+
var derivedKey = scryptsy(Buffer.from(password), Buffer.from(json.Crypto.Salt, 'hex'), kdfparams.N, kdfparams.R, kdfparams.P, kdfparams.DkLen)
228229

229-
var ciphertext = new Buffer(json.Crypto.CipherText, 'hex')
230+
var ciphertext = Buffer.from(json.Crypto.CipherText, 'hex')
230231

231232
var mac = ethUtil.sha3(Buffer.concat([ derivedKey.slice(16, 32), ciphertext ]))
232233

233234
if (mac.toString('hex') !== json.Crypto.MAC) {
234235
throw new Error('Key derivation failed - possibly wrong passphrase')
235236
}
236237

237-
var decipher = crypto.createDecipheriv('aes-128-cbc', ethUtil.sha3(derivedKey.slice(0, 16)).slice(0, 16), new Buffer(json.Crypto.IV, 'hex'))
238+
var decipher = crypto.createDecipheriv('aes-128-cbc', ethUtil.sha3(derivedKey.slice(0, 16)).slice(0, 16), Buffer.from(json.Crypto.IV, 'hex'))
238239
var seed = decipherBuffer(decipher, ciphertext)
239240

240241
return new Wallet(seed)
@@ -254,27 +255,27 @@ Wallet.fromV3 = function (input, password, nonStrict) {
254255
kdfparams = json.crypto.kdfparams
255256

256257
// FIXME: support progress reporting callback
257-
derivedKey = scryptsy(new Buffer(password), new Buffer(kdfparams.salt, 'hex'), kdfparams.n, kdfparams.r, kdfparams.p, kdfparams.dklen)
258+
derivedKey = scryptsy(Buffer.from(password), Buffer.from(kdfparams.salt, 'hex'), kdfparams.n, kdfparams.r, kdfparams.p, kdfparams.dklen)
258259
} else if (json.crypto.kdf === 'pbkdf2') {
259260
kdfparams = json.crypto.kdfparams
260261

261262
if (kdfparams.prf !== 'hmac-sha256') {
262263
throw new Error('Unsupported parameters to PBKDF2')
263264
}
264265

265-
derivedKey = crypto.pbkdf2Sync(new Buffer(password), new Buffer(kdfparams.salt, 'hex'), kdfparams.c, kdfparams.dklen, 'sha256')
266+
derivedKey = crypto.pbkdf2Sync(Buffer.from(password), Buffer.from(kdfparams.salt, 'hex'), kdfparams.c, kdfparams.dklen, 'sha256')
266267
} else {
267268
throw new Error('Unsupported key derivation scheme')
268269
}
269270

270-
var ciphertext = new Buffer(json.crypto.ciphertext, 'hex')
271+
var ciphertext = Buffer.from(json.crypto.ciphertext, 'hex')
271272

272273
var mac = ethUtil.sha3(Buffer.concat([ derivedKey.slice(16, 32), ciphertext ]))
273274
if (mac.toString('hex') !== json.crypto.mac) {
274275
throw new Error('Key derivation failed - possibly wrong passphrase')
275276
}
276277

277-
var decipher = crypto.createDecipheriv(json.crypto.cipher, derivedKey.slice(0, 16), new Buffer(json.crypto.cipherparams.iv, 'hex'))
278+
var decipher = crypto.createDecipheriv(json.crypto.cipher, derivedKey.slice(0, 16), Buffer.from(json.crypto.cipherparams.iv, 'hex'))
278279
var seed = decipherBuffer(decipher, ciphertext, 'hex')
279280

280281
return new Wallet(seed)
@@ -288,7 +289,7 @@ Wallet.fromEthSale = function (input, password) {
288289
assert(typeof password === 'string')
289290
var json = (typeof input === 'object') ? input : JSON.parse(input)
290291

291-
var encseed = new Buffer(json.encseed, 'hex')
292+
var encseed = Buffer.from(json.encseed, 'hex')
292293

293294
// key derivation
294295
var derivedKey = crypto.pbkdf2Sync(password, password, 2000, 32, 'sha256').slice(0, 16)

package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,16 @@
3030
"bs58check": "^1.0.8",
3131
"ethereumjs-util": "^4.4.0",
3232
"hdkey": "^0.7.0",
33+
"safe-buffer": "^5.1.1",
3334
"scrypt.js": "^0.2.0",
34-
"uuid": "^2.0.1",
35-
"utf8": "^2.1.1"
35+
"utf8": "^2.1.1",
36+
"uuid": "^2.0.1"
3637
},
3738
"devDependencies": {
3839
"coveralls": "^2.11.4",
3940
"istanbul": "^0.4.1",
4041
"mocha": "^2.3.4",
41-
"standard": "^5.4.1"
42+
"standard": "^10.0.0"
4243
},
4344
"standard": {
4445
"globals": [

provider-engine.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ function WalletSubprovider (wallet, opts) {
1414

1515
opts.getPrivateKey = function (address, cb) {
1616
if (address !== wallet.getAddressString()) {
17-
return cb('Account not found')
17+
cb(new Error('Account not found'))
18+
} else {
19+
cb(null, wallet.getPrivateKey())
1820
}
19-
20-
cb(null, wallet.getPrivateKey())
2121
}
2222

2323
WalletSubprovider.super_.call(this, opts)

test/hdkey.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
var assert = require('assert')
22
var HDKey = require('../hdkey.js')
3+
var Buffer = require('safe-buffer').Buffer
34

45
// from BIP39 mnemonic: awake book subject inch gentle blur grant damage process float month clown
5-
var fixtureseed = new Buffer('747f302d9c916698912d5f70be53a6cf53bc495803a5523d3a7c3afa2afba94ec3803f838b3e1929ab5481f9da35441372283690fdcf27372c38f40ba134fe03', 'hex')
6+
var fixtureseed = Buffer.from('747f302d9c916698912d5f70be53a6cf53bc495803a5523d3a7c3afa2afba94ec3803f838b3e1929ab5481f9da35441372283690fdcf27372c38f40ba134fe03', 'hex')
67
var fixturehd = HDKey.fromMasterSeed(fixtureseed)
78

89
describe('.fromMasterSeed()', function () {

test/index.js

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
var assert = require('assert')
2+
var Buffer = require('safe-buffer').Buffer
23
var Wallet = require('../')
34
var Thirdparty = require('../thirdparty.js')
45
var ethUtil = require('ethereumjs-util')
56

6-
var fixturekey = new Buffer('efca4cdd31923b50f4214af5d2ae10e7ac45a5019e9431cc195482d707485378', 'hex')
7+
var fixturekey = Buffer.from('efca4cdd31923b50f4214af5d2ae10e7ac45a5019e9431cc195482d707485378', 'hex')
78
var fixturewallet = Wallet.fromPrivateKey(fixturekey)
89

910
describe('.getPrivateKey()', function () {
@@ -12,7 +13,7 @@ describe('.getPrivateKey()', function () {
1213
})
1314
it('should fail', function () {
1415
assert.throws(function () {
15-
Wallet.fromPrivateKey(new Buffer('001122', 'hex'))
16+
Wallet.fromPrivateKey(Buffer.from('001122', 'hex'))
1617
}, /^Error: Private key does not satisfy the curve requirements \(ie. it is invalid\)$/)
1718
})
1819
})
@@ -54,18 +55,18 @@ describe('.getChecksumAddressString()', function () {
5455
})
5556

5657
describe('public key only wallet', function () {
57-
var pubKey = new Buffer('5d4392f450262b276652c1fc037606abac500f3160830ce9df53aa70d95ce7cfb8b06010b2f3691c78c65c21eb4cf3dfdbfc0745d89b664ee10435bb3a0f906c', 'hex')
58+
var pubKey = Buffer.from('5d4392f450262b276652c1fc037606abac500f3160830ce9df53aa70d95ce7cfb8b06010b2f3691c78c65c21eb4cf3dfdbfc0745d89b664ee10435bb3a0f906c', 'hex')
5859
it('.fromPublicKey() should work', function () {
5960
assert.equal(Wallet.fromPublicKey(pubKey).getPublicKey().toString('hex'),
6061
'5d4392f450262b276652c1fc037606abac500f3160830ce9df53aa70d95ce7cfb8b06010b2f3691c78c65c21eb4cf3dfdbfc0745d89b664ee10435bb3a0f906c')
6162
})
6263
it('.fromPublicKey() should not accept compressed keys in strict mode', function () {
6364
assert.throws(function () {
64-
Wallet.fromPublicKey(new Buffer('030639797f6cc72aea0f3d309730844a9e67d9f1866e55845c5f7e0ab48402973d', 'hex'))
65+
Wallet.fromPublicKey(Buffer.from('030639797f6cc72aea0f3d309730844a9e67d9f1866e55845c5f7e0ab48402973d', 'hex'))
6566
}, /^Error: Invalid public key$/)
6667
})
6768
it('.fromPublicKey() should accept compressed keys in non-strict mode', function () {
68-
var tmp = new Buffer('030639797f6cc72aea0f3d309730844a9e67d9f1866e55845c5f7e0ab48402973d', 'hex')
69+
var tmp = Buffer.from('030639797f6cc72aea0f3d309730844a9e67d9f1866e55845c5f7e0ab48402973d', 'hex')
6970
assert.equal(Wallet.fromPublicKey(tmp, true).getPublicKey().toString('hex'),
7071
'0639797f6cc72aea0f3d309730844a9e67d9f1866e55845c5f7e0ab48402973defa5cb69df462bcc6d73c31e1c663c225650e80ef14a507b203f2a12aea55bc1')
7172
})
@@ -126,19 +127,19 @@ describe('.getV3Filename()', function () {
126127
})
127128

128129
describe('.toV3()', function () {
129-
var salt = new Buffer('dc9e4a98886738bd8aae134a1f89aaa5a502c3fbd10e336136d4d5fe47448ad6', 'hex')
130-
var iv = new Buffer('cecacd85e9cb89788b5aab2f93361233', 'hex')
131-
var uuid = new Buffer('7e59dc028d42d09db29aa8a0f862cc81', 'hex')
130+
var salt = Buffer.from('dc9e4a98886738bd8aae134a1f89aaa5a502c3fbd10e336136d4d5fe47448ad6', 'hex')
131+
var iv = Buffer.from('cecacd85e9cb89788b5aab2f93361233', 'hex')
132+
var uuid = Buffer.from('7e59dc028d42d09db29aa8a0f862cc81', 'hex')
132133

133134
it('should work with PBKDF2', function () {
134-
var key = new Buffer('efca4cdd31923b50f4214af5d2ae10e7ac45a5019e9431cc195482d707485378', 'hex')
135+
var key = Buffer.from('efca4cdd31923b50f4214af5d2ae10e7ac45a5019e9431cc195482d707485378', 'hex')
135136
var wallet = Wallet.fromPrivateKey(key)
136137
var w = '{"version":3,"id":"7e59dc02-8d42-409d-b29a-a8a0f862cc81","address":"b14ab53e38da1c172f877dbc6d65e4a1b0474c3c","crypto":{"ciphertext":"01ee7f1a3c8d187ea244c92eea9e332ab0bb2b4c902d89bdd71f80dc384da1be","cipherparams":{"iv":"cecacd85e9cb89788b5aab2f93361233"},"cipher":"aes-128-ctr","kdf":"pbkdf2","kdfparams":{"dklen":32,"salt":"dc9e4a98886738bd8aae134a1f89aaa5a502c3fbd10e336136d4d5fe47448ad6","c":262144,"prf":"hmac-sha256"},"mac":"0c02cd0badfebd5e783e0cf41448f84086a96365fc3456716c33641a86ebc7cc"}}'
137138
// FIXME: just test for ciphertext and mac?
138139
assert.equal(wallet.toV3String('testtest', { kdf: 'pbkdf2', uuid: uuid, salt: salt, iv: iv }), w)
139140
})
140141
it('should work with Scrypt', function () {
141-
var key = new Buffer('efca4cdd31923b50f4214af5d2ae10e7ac45a5019e9431cc195482d707485378', 'hex')
142+
var key = Buffer.from('efca4cdd31923b50f4214af5d2ae10e7ac45a5019e9431cc195482d707485378', 'hex')
142143
var wallet = Wallet.fromPrivateKey(key)
143144
var w = '{"version":3,"id":"7e59dc02-8d42-409d-b29a-a8a0f862cc81","address":"b14ab53e38da1c172f877dbc6d65e4a1b0474c3c","crypto":{"ciphertext":"c52682025b1e5d5c06b816791921dbf439afe7a053abb9fac19f38a57499652c","cipherparams":{"iv":"cecacd85e9cb89788b5aab2f93361233"},"cipher":"aes-128-ctr","kdf":"scrypt","kdfparams":{"dklen":32,"salt":"dc9e4a98886738bd8aae134a1f89aaa5a502c3fbd10e336136d4d5fe47448ad6","n":262144,"r":8,"p":1},"mac":"27b98c8676dc6619d077453b38db645a4c7c17a3e686ee5adaf53c11ac1b890e"}}'
144145
this.timeout(180000) // 3minutes

thirdparty.js

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ var crypto = require('crypto')
44
var scryptsy = require('scrypt.js')
55
var utf8 = require('utf8')
66
var aesjs = require('aes-js')
7+
var Buffer = require('safe-buffer').Buffer
78

89
function assert (val, msg) {
910
if (!val) {
@@ -28,7 +29,7 @@ var Thirdparty = {}
2829
*
2930
* FIXME: not optimised at all
3031
*/
31-
function evp_kdf (data, salt, opts) {
32+
function evp_kdf (data, salt, opts) { // eslint-disable-line
3233
// A single EVP iteration, returns `D_i`, where block equlas to `D_(i-1)`
3334
function iter (block) {
3435
var hash = crypto.createHash(opts.digest || 'md5')
@@ -53,7 +54,7 @@ function evp_kdf (data, salt, opts) {
5354

5455
var i = 0
5556
while (Buffer.concat(ret).length < (keysize + ivsize)) {
56-
ret[i] = iter((i === 0) ? new Buffer(0) : ret[i - 1])
57+
ret[i] = iter((i === 0) ? Buffer.alloc(0) : ret[i - 1])
5758
i++
5859
}
5960

@@ -67,7 +68,7 @@ function evp_kdf (data, salt, opts) {
6768

6869
// http://stackoverflow.com/questions/25288311/cryptojs-aes-pattern-always-ends-with
6970
function decodeCryptojsSalt (input) {
70-
var ciphertext = new Buffer(input, 'base64')
71+
var ciphertext = Buffer.from(input, 'base64')
7172
if (ciphertext.slice(0, 8).toString() === 'Salted__') {
7273
return {
7374
salt: ciphertext.slice(8, 16),
@@ -93,7 +94,7 @@ Thirdparty.fromEtherWallet = function (input, password) {
9394
throw new Error('Invalid private key length')
9495
}
9596

96-
privKey = new Buffer(json.private, 'hex')
97+
privKey = Buffer.from(json.private, 'hex')
9798
} else {
9899
if (typeof password !== 'string') {
99100
throw new Error('Password required')
@@ -114,13 +115,13 @@ Thirdparty.fromEtherWallet = function (input, password) {
114115
}
115116

116117
// derive key/iv using OpenSSL EVP as implemented in CryptoJS
117-
var evp = evp_kdf(new Buffer(password), cipher.salt, { keysize: 32, ivsize: 16 })
118+
var evp = evp_kdf(Buffer.from(password), cipher.salt, { keysize: 32, ivsize: 16 })
118119

119120
var decipher = crypto.createDecipheriv('aes-256-cbc', evp.key, evp.iv)
120-
privKey = decipherBuffer(decipher, new Buffer(cipher.ciphertext))
121+
privKey = decipherBuffer(decipher, Buffer.from(cipher.ciphertext))
121122

122123
// NOTE: yes, they've run it through UTF8
123-
privKey = new Buffer(utf8.decode(privKey.toString()), 'hex')
124+
privKey = Buffer.from(utf8.decode(privKey.toString()), 'hex')
124125
}
125126

126127
var wallet = new Wallet(privKey)
@@ -133,12 +134,12 @@ Thirdparty.fromEtherWallet = function (input, password) {
133134
}
134135

135136
Thirdparty.fromEtherCamp = function (passphrase) {
136-
return new Wallet(ethUtil.sha3(new Buffer(passphrase)))
137+
return new Wallet(ethUtil.sha3(Buffer.from(passphrase)))
137138
}
138139

139140
Thirdparty.fromKryptoKit = function (entropy, password) {
140141
function kryptoKitBrokenScryptSeed (buf) {
141-
// js-scrypt calls `new Buffer(String(salt), 'utf8')` on the seed even though it is a buffer
142+
// js-scrypt calls `Buffer.from(String(salt), 'utf8')` on the seed even though it is a buffer
142143
//
143144
// The `buffer`` implementation used does the below transformation (doesn't matches the current version):
144145
// https://github.com/feross/buffer/blob/67c61181b938b17d10dbfc0a545f713b8bd59de8/index.js
@@ -163,7 +164,7 @@ Thirdparty.fromKryptoKit = function (entropy, password) {
163164
}
164165
}
165166

166-
return new Buffer(res + decodeUtf8Char(tmp))
167+
return Buffer.from(res + decodeUtf8Char(tmp))
167168
}
168169

169170
if (entropy[0] === '#') {
@@ -181,16 +182,16 @@ Thirdparty.fromKryptoKit = function (entropy, password) {
181182
throw new Error('Password required')
182183
}
183184

184-
var encryptedSeed = ethUtil.sha256(new Buffer(entropy.slice(0, 30)))
185+
var encryptedSeed = ethUtil.sha256(Buffer.from(entropy.slice(0, 30)))
185186
var checksum = entropy.slice(30, 46)
186187

187188
var salt = kryptoKitBrokenScryptSeed(encryptedSeed)
188-
var aesKey = scryptsy(new Buffer(password, 'utf8'), salt, 16384, 8, 1, 32)
189+
var aesKey = scryptsy(Buffer.from(password, 'utf8'), salt, 16384, 8, 1, 32)
189190

190191
/* FIXME: try to use `crypto` instead of `aesjs`
191192
192193
// NOTE: ECB doesn't use the IV, so it can be anything
193-
var decipher = crypto.createDecipheriv("aes-256-ecb", aesKey, new Buffer(0))
194+
var decipher = crypto.createDecipheriv("aes-256-ecb", aesKey, Buffer.from(0))
194195
195196
// FIXME: this is a clear abuse, but seems to match how ECB in aesjs works
196197
privKey = Buffer.concat([

0 commit comments

Comments
 (0)