ethereumjs-wallet
Advanced tools
Comparing version 0.3.0 to 0.4.0
45
index.js
@@ -101,3 +101,3 @@ var ethUtil = require('ethereumjs-util') | ||
address: this.getAddress().toString('hex'), | ||
Crypto: { | ||
crypto: { | ||
ciphertext: ciphertext.toString('hex'), | ||
@@ -115,2 +115,24 @@ cipherparams: { | ||
Wallet.prototype.getV3Filename = function (timestamp) { | ||
/* | ||
* We want a timestamp like 2016-03-15T17-11-33.007598288Z. Date formatting | ||
* is a pain in Javascript, everbody knows that. We could use moment.js, | ||
* but decide to do it manually in order to save space. | ||
* | ||
* toJSON() returns a pretty close version, so let's use it. It is not UTC though, | ||
* but does it really matter? | ||
* | ||
* Alternative manual way with padding and Date fields: http://stackoverflow.com/a/7244288/4964819 | ||
* | ||
*/ | ||
var ts = timestamp ? new Date(timestamp) : new Date() | ||
return [ | ||
'UTC--', | ||
ts.toJSON().replace(/:/g, '-'), | ||
'--', | ||
this.getAddress().toString('hex') | ||
].join('') | ||
} | ||
Wallet.prototype.toV3String = function (password, opts) { | ||
@@ -126,2 +148,3 @@ return JSON.stringify(this.toV3(password, opts)) | ||
Wallet.fromV1 = function (input, password) { | ||
assert(typeof password === 'string') | ||
var json = (typeof input === 'object') ? input : JSON.parse(input) | ||
@@ -143,3 +166,2 @@ | ||
var mac = ethUtil.sha3(Buffer.concat([ derivedKey.slice(16, 32), ciphertext ])) | ||
console.log(mac, json.Crypto.MAC) | ||
@@ -158,4 +180,5 @@ if (mac.toString('hex') !== json.Crypto.MAC) { | ||
Wallet.fromV3 = function (input, password) { | ||
var json = (typeof input === 'object') ? input : JSON.parse(input) | ||
Wallet.fromV3 = function (input, password, nonStrict) { | ||
assert(typeof password === 'string') | ||
var json = (typeof input === 'object') ? input : JSON.parse(nonStrict ? input.toLowerCase() : input) | ||
@@ -168,9 +191,9 @@ if (json.version !== 3) { | ||
var kdfparams | ||
if (json.Crypto.kdf === 'scrypt') { | ||
kdfparams = json.Crypto.kdfparams | ||
if (json.crypto.kdf === 'scrypt') { | ||
kdfparams = json.crypto.kdfparams | ||
// FIXME: support progress reporting callback | ||
derivedKey = scryptsy(new Buffer(password), new Buffer(kdfparams.salt, 'hex'), kdfparams.n, kdfparams.r, kdfparams.p, kdfparams.dklen) | ||
} else if (json.Crypto.kdf === 'pbkdf2') { | ||
kdfparams = json.Crypto.kdfparams | ||
} else if (json.crypto.kdf === 'pbkdf2') { | ||
kdfparams = json.crypto.kdfparams | ||
@@ -186,10 +209,10 @@ if (kdfparams.prf !== 'hmac-sha256') { | ||
var ciphertext = new Buffer(json.Crypto.ciphertext, 'hex') | ||
var ciphertext = new Buffer(json.crypto.ciphertext, 'hex') | ||
var mac = ethUtil.sha3(Buffer.concat([ derivedKey.slice(16, 32), ciphertext ])) | ||
if (mac.toString('hex') !== json.Crypto.mac) { | ||
if (mac.toString('hex') !== json.crypto.mac) { | ||
throw new Error('Key derivation failed - possibly wrong passphrase') | ||
} | ||
var decipher = crypto.createDecipheriv(json.Crypto.cipher, derivedKey.slice(0, 16), new Buffer(json.Crypto.cipherparams.iv, 'hex')) | ||
var decipher = crypto.createDecipheriv(json.crypto.cipher, derivedKey.slice(0, 16), new Buffer(json.crypto.cipherparams.iv, 'hex')) | ||
var seed = decipherBuffer(decipher, ciphertext, 'hex') | ||
@@ -196,0 +219,0 @@ |
{ | ||
"name": "ethereumjs-wallet", | ||
"version": "0.3.0", | ||
"version": "0.4.0", | ||
"description": "Utilities for handling Ethereum keys", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
@@ -27,3 +27,3 @@ # ethereumjs-wallet | ||
* `fromV1(input, password)` - import a wallet (Version 1 of the Ethereum wallet format) | ||
* `fromV3(input, password)` - import a wallet (Version 3 of the Ethereum wallet format) | ||
* `fromV3(input, password, [nonStrict])` - import a wallet (Version 3 of the Ethereum wallet format). Set `nonStrict` true to accept files with mixed-caps. | ||
* `fromEthSale(input, password)` - import an Ethereum Pre Sale wallet | ||
@@ -50,2 +50,3 @@ | ||
* `getChecksumAddressString()` - return the [address with checksum](https://github.com/ethereum/EIPs/issues/55) | ||
* `getV3Filename([timestamp])` - return the suggested filename for V3 keystores | ||
* `toV3(password, [options])` - return the wallet as a JSON string (Version 3 of the Ethereum wallet format) | ||
@@ -52,0 +53,0 @@ |
@@ -61,2 +61,8 @@ var assert = require('assert') | ||
describe('.getV3Filename()', function () { | ||
it('should work', function () { | ||
assert.equal(fixturewallet.getV3Filename(1457917509265), 'UTC--2016-03-14T01-05-09.265Z--b14ab53e38da1c172f877dbc6d65e4a1b0474c3c') | ||
}) | ||
}) | ||
describe('.toV3()', function () { | ||
@@ -70,3 +76,3 @@ var salt = new Buffer('dc9e4a98886738bd8aae134a1f89aaa5a502c3fbd10e336136d4d5fe47448ad6', 'hex') | ||
var wallet = Wallet.fromPrivateKey(key) | ||
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"}}' | ||
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"}}' | ||
// FIXME: just test for ciphertext and mac? | ||
@@ -78,3 +84,3 @@ assert.equal(wallet.toV3String('testtest', { kdf: 'pbkdf2', uuid: uuid, salt: salt, iv: iv }), w) | ||
var wallet = Wallet.fromPrivateKey(key) | ||
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"}}' | ||
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"}}' | ||
this.timeout(180000) // 3minutes | ||
@@ -98,3 +104,3 @@ // FIXME: just test for ciphertext and mac? | ||
it('should work with PBKDF2', function () { | ||
var w = '{"Crypto":{"cipher":"aes-128-ctr","cipherparams":{"iv":"6087dab2f9fdbbfaddc31a909735c1e6"},"ciphertext":"5318b4d5bcd28de64ee5559e671353e16f075ecae9f99c7a79a38af5f869aa46","kdf":"pbkdf2","kdfparams":{"c":262144,"dklen":32,"prf":"hmac-sha256","salt":"ae3cd4e7013836a3df6bd7241b12db061dbe2c6785853cce422d148a624ce0bd"},"mac":"517ead924a9d0dc3124507e3393d175ce3ff7c1e96529c6c555ce9e51205e9b2"},"id":"3198bc9c-6672-5ab3-d995-4942343ae5b6","version":3}' | ||
var w = '{"crypto":{"cipher":"aes-128-ctr","cipherparams":{"iv":"6087dab2f9fdbbfaddc31a909735c1e6"},"ciphertext":"5318b4d5bcd28de64ee5559e671353e16f075ecae9f99c7a79a38af5f869aa46","kdf":"pbkdf2","kdfparams":{"c":262144,"dklen":32,"prf":"hmac-sha256","salt":"ae3cd4e7013836a3df6bd7241b12db061dbe2c6785853cce422d148a624ce0bd"},"mac":"517ead924a9d0dc3124507e3393d175ce3ff7c1e96529c6c555ce9e51205e9b2"},"id":"3198bc9c-6672-5ab3-d995-4942343ae5b6","version":3}' | ||
var wallet = Wallet.fromV3(w, 'testpassword') | ||
@@ -104,3 +110,3 @@ assert.equal(wallet.getAddressString(), '0x008aeeda4d805471df9b2a5b0f38a0c3bcba786b') | ||
it('should work with Scrypt', function () { | ||
var sample = '{"address":"2f91eb73a6cd5620d7abb50889f24eea7a6a4feb","Crypto":{"cipher":"aes-128-ctr","cipherparams":{"iv":"a2bc4f71e8445d64ceebd1247079fbd8"},"ciphertext":"6b9ab7954c9066fa1e54e04e2c527c7d78a77611d5f84fede1bd61ab13c51e3e","kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"r":1,"p":8,"salt":"caf551e2b7ec12d93007e528093697a4c68e8a50e663b2a929754a8085d9ede4"},"mac":"506cace9c5c32544d39558025cb3bf23ed94ba2626e5338c82e50726917e1a15"},"id":"1b3cad9b-fa7b-4817-9022-d5e598eb5fe3","version":3}' | ||
var sample = '{"address":"2f91eb73a6cd5620d7abb50889f24eea7a6a4feb","crypto":{"cipher":"aes-128-ctr","cipherparams":{"iv":"a2bc4f71e8445d64ceebd1247079fbd8"},"ciphertext":"6b9ab7954c9066fa1e54e04e2c527c7d78a77611d5f84fede1bd61ab13c51e3e","kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"r":1,"p":8,"salt":"caf551e2b7ec12d93007e528093697a4c68e8a50e663b2a929754a8085d9ede4"},"mac":"506cace9c5c32544d39558025cb3bf23ed94ba2626e5338c82e50726917e1a15"},"id":"1b3cad9b-fa7b-4817-9022-d5e598eb5fe3","version":3}' | ||
var wallet = Wallet.fromV3(sample, 'testtest') | ||
@@ -111,3 +117,3 @@ this.timeout(180000) // 3minutes | ||
it('should work with \'unencrypted\' wallets', function () { | ||
var w = '{"address":"a9886ac7489ecbcbd79268a79ef00d940e5fe1f2","Crypto":{"cipher":"aes-128-ctr","cipherparams":{"iv":"c542cf883299b5b0a29155091054028d"},"ciphertext":"0a83c77235840cffcfcc5afe5908f2d7f89d7d54c4a796dfe2f193e90413ee9d","kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"r":1,"p":8,"salt":"699f7bf5f6985068dfaaff9db3b06aea8fe3dd3140b3addb4e60620ee97a0316"},"mac":"613fed2605240a2ff08b8d93ccc48c5b3d5023b7088189515d70df41d65f44de"},"id":"0edf817a-ee0e-4e25-8314-1f9e88a60811","version":3}' | ||
var w = '{"address":"a9886ac7489ecbcbd79268a79ef00d940e5fe1f2","crypto":{"cipher":"aes-128-ctr","cipherparams":{"iv":"c542cf883299b5b0a29155091054028d"},"ciphertext":"0a83c77235840cffcfcc5afe5908f2d7f89d7d54c4a796dfe2f193e90413ee9d","kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"r":1,"p":8,"salt":"699f7bf5f6985068dfaaff9db3b06aea8fe3dd3140b3addb4e60620ee97a0316"},"mac":"613fed2605240a2ff08b8d93ccc48c5b3d5023b7088189515d70df41d65f44de"},"id":"0edf817a-ee0e-4e25-8314-1f9e88a60811","version":3}' | ||
var wallet = Wallet.fromV3(w, '') | ||
@@ -117,2 +123,13 @@ this.timeout(180000) // 3minutes | ||
}) | ||
it('should work with (broken) mixed-case input files', function () { | ||
var w = '{"Crypto":{"cipher":"aes-128-ctr","cipherparams":{"iv":"6087dab2f9fdbbfaddc31a909735c1e6"},"ciphertext":"5318b4d5bcd28de64ee5559e671353e16f075ecae9f99c7a79a38af5f869aa46","kdf":"pbkdf2","kdfparams":{"c":262144,"dklen":32,"prf":"hmac-sha256","salt":"ae3cd4e7013836a3df6bd7241b12db061dbe2c6785853cce422d148a624ce0bd"},"mac":"517ead924a9d0dc3124507e3393d175ce3ff7c1e96529c6c555ce9e51205e9b2"},"id":"3198bc9c-6672-5ab3-d995-4942343ae5b6","version":3}' | ||
var wallet = Wallet.fromV3(w, 'testpassword', true) | ||
assert.equal(wallet.getAddressString(), '0x008aeeda4d805471df9b2a5b0f38a0c3bcba786b') | ||
}) | ||
it('shouldn\'t work with (broken) mixed-case input files in strict mode', function () { | ||
var w = '{"Crypto":{"cipher":"aes-128-ctr","cipherparams":{"iv":"6087dab2f9fdbbfaddc31a909735c1e6"},"ciphertext":"5318b4d5bcd28de64ee5559e671353e16f075ecae9f99c7a79a38af5f869aa46","kdf":"pbkdf2","kdfparams":{"c":262144,"dklen":32,"prf":"hmac-sha256","salt":"ae3cd4e7013836a3df6bd7241b12db061dbe2c6785853cce422d148a624ce0bd"},"mac":"517ead924a9d0dc3124507e3393d175ce3ff7c1e96529c6c555ce9e51205e9b2"},"id":"3198bc9c-6672-5ab3-d995-4942343ae5b6","version":3}' | ||
assert.throws(function () { | ||
Wallet.fromV3(w, 'testpassword') | ||
}) | ||
}) | ||
}) | ||
@@ -119,0 +136,0 @@ |
@@ -112,2 +112,6 @@ var Wallet = require('./index.js') | ||
if (!cipher.salt) { | ||
throw new Error('Unsupported EtherWallet key format') | ||
} | ||
// derive key/iv using OpenSSL EVP as implemented in CryptoJS | ||
@@ -114,0 +118,0 @@ var evp = evp_kdf(new Buffer(password), cipher.salt, { keysize: 32, ivsize: 16 }) |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
32241
550
82