From 144b8eb5465ac09311fd6fba0ecc2d55a222f3ca Mon Sep 17 00:00:00 2001 From: annakaz Date: Wed, 11 Apr 2018 15:30:55 -0700 Subject: [PATCH 1/6] Switched to use native pbkdf2 from react-native-aes-crypto --- index.js | 16 +++++++--------- package.json | 2 +- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/index.js b/index.js index f11edc4..96895a0 100644 --- a/index.js +++ b/index.js @@ -1,20 +1,18 @@ var unorm = require('unorm') var assert = require('assert') -var pbkdf2 = require('react-native-crypto').pbkdf2Sync -var createHash = require('react-native-crypto').createHash +var Aes = require('react-native-aes-crypto') +var createHash = require('create-hash') var randomBytes = require('react-native-randombytes').randomBytes var DEFAULT_WORDLIST = require('./wordlists/en.json') -function mnemonicToSeed(mnemonic, password) { - var mnemonicBuffer = new Buffer(mnemonic, 'utf8') - var saltBuffer = new Buffer(salt(password), 'utf8') - - return pbkdf2(mnemonicBuffer, saltBuffer, 2048, 64, 'sha512') +async function mnemonicToSeed(mnemonic, password) { + return Aes.pbkdf2(mnemonic, salt(password)) } -function mnemonicToSeedHex(mnemonic, password) { - return mnemonicToSeed(mnemonic, password).toString('hex') +async function mnemonicToSeedHex(mnemonic, password) { + var seed = await mnemonicToSeed(mnemonic, password) + return seed.toString('hex') } function mnemonicToEntropy(mnemonic, wordlist) { diff --git a/package.json b/package.json index 030e169..49ce964 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "license": "MIT", "dependencies": { "create-hash": "^1.1.0", - "react-native-crypto": "^2.0.1", + "react-native-aes-crypto": "^1.2.1", "react-native-randombytes": "^2.2.0", "unorm": "^1.3.3" }, From f2fdf0509d3158dd1ee82a95c0017edbea7d30dc Mon Sep 17 00:00:00 2001 From: annakaz Date: Wed, 11 Apr 2018 15:48:04 -0700 Subject: [PATCH 2/6] Added forgotten .default --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 96895a0..c2e05a7 100644 --- a/index.js +++ b/index.js @@ -1,6 +1,6 @@ var unorm = require('unorm') var assert = require('assert') -var Aes = require('react-native-aes-crypto') +var Aes = require('react-native-aes-crypto').default var createHash = require('create-hash') var randomBytes = require('react-native-randombytes').randomBytes From aa348f9b56840e11359bf82d145d8944a88518d2 Mon Sep 17 00:00:00 2001 From: annakaz Date: Thu, 12 Apr 2018 14:16:36 -0700 Subject: [PATCH 3/6] Replace react-native-aes-crypto dependency with CryptoJS --- index.js | 39 +++++++++++++++++++++++++-------------- package.json | 4 ++-- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/index.js b/index.js index c2e05a7..99141b2 100644 --- a/index.js +++ b/index.js @@ -6,12 +6,17 @@ var randomBytes = require('react-native-randombytes').randomBytes var DEFAULT_WORDLIST = require('./wordlists/en.json') -async function mnemonicToSeed(mnemonic, password) { - return Aes.pbkdf2(mnemonic, salt(password)) +function mnemonicToSeed(mnemonic) { + var salt = CryptoJS.lib.WordArray.random(128 / 8) + var key256Bits = CryptoJS.PBKDF2(mnemonic, salt, { + keySize: 256 / 32, + iterations: 1000 + }) + return key256Bits } -async function mnemonicToSeedHex(mnemonic, password) { - var seed = await mnemonicToSeed(mnemonic, password) +function mnemonicToSeedHex(mnemonic, password) { + var seed = mnemonicToSeed(mnemonic, password) return seed.toString('hex') } @@ -28,10 +33,12 @@ function mnemonicToEntropy(mnemonic, wordlist) { assert(belongToList, 'Invalid mnemonic') // convert word indices to 11 bit binary strings - var bits = words.map(function(word) { - var index = wordlist.indexOf(word) - return lpad(index.toString(2), '0', 11) - }).join('') + var bits = words + .map(function(word) { + var index = wordlist.indexOf(word) + return lpad(index.toString(2), '0', 11) + }) + .join('') // split the binary string into ENT/CS var dividerIndex = Math.floor(bits.length / 33) * 32 @@ -95,7 +102,9 @@ function validateMnemonic(mnemonic, wordlist) { } function checksumBits(entropyBuffer) { - var hash = createHash('sha256').update(entropyBuffer).digest() + var hash = createHash('sha256') + .update(entropyBuffer) + .digest() // Calculated constants from BIP39 var ENT = entropyBuffer.length * 8 @@ -111,14 +120,16 @@ function salt(password) { //=========== helper methods from bitcoinjs-lib ======== function bytesToBinary(bytes) { - return bytes.map(function(x) { - return lpad(x.toString(2), '0', 8) - }).join(''); + return bytes + .map(function(x) { + return lpad(x.toString(2), '0', 8) + }) + .join('') } function lpad(str, padString, length) { - while (str.length < length) str = padString + str; - return str; + while (str.length < length) str = padString + str + return str } module.exports = { diff --git a/package.json b/package.json index 49ce964..9a3b899 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,7 @@ "standard": "standard" }, "author": "Alberto Dallaporta", - "contributors": [ - ], + "contributors": [], "repository": { "type": "git", "url": "https://github.com/39otrebla/react-native-bip39" @@ -18,6 +17,7 @@ "create-hash": "^1.1.0", "react-native-aes-crypto": "^1.2.1", "react-native-randombytes": "^2.2.0", + "tslint": "^5.9.1", "unorm": "^1.3.3" }, "devDependencies": { From b6e6bbd017f8a7d4f9cf8498c5fd1c7da793bf7c Mon Sep 17 00:00:00 2001 From: Anna K Date: Thu, 12 Apr 2018 14:22:01 -0700 Subject: [PATCH 4/6] Remove aes dependency --- index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/index.js b/index.js index 99141b2..630808e 100644 --- a/index.js +++ b/index.js @@ -1,6 +1,5 @@ var unorm = require('unorm') var assert = require('assert') -var Aes = require('react-native-aes-crypto').default var createHash = require('create-hash') var randomBytes = require('react-native-randombytes').randomBytes From 9c02d177f04198b20ad392bb652d5ef95f4cc162 Mon Sep 17 00:00:00 2001 From: Anna K Date: Thu, 12 Apr 2018 14:33:32 -0700 Subject: [PATCH 5/6] Import crypto-js --- index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/index.js b/index.js index 630808e..5ec10d7 100644 --- a/index.js +++ b/index.js @@ -2,6 +2,7 @@ var unorm = require('unorm') var assert = require('assert') var createHash = require('create-hash') var randomBytes = require('react-native-randombytes').randomBytes +var CryptoJS = require('crypto-js') var DEFAULT_WORDLIST = require('./wordlists/en.json') From f935c7a70913457633bee99b63ce7c21f8f81b16 Mon Sep 17 00:00:00 2001 From: Anna K Date: Thu, 12 Apr 2018 14:48:41 -0700 Subject: [PATCH 6/6] Add iterations parameter in mnemonicToSeed --- index.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/index.js b/index.js index 5ec10d7..952b755 100644 --- a/index.js +++ b/index.js @@ -6,17 +6,17 @@ var CryptoJS = require('crypto-js') var DEFAULT_WORDLIST = require('./wordlists/en.json') -function mnemonicToSeed(mnemonic) { +function mnemonicToSeed(mnemonic, numIterations) { var salt = CryptoJS.lib.WordArray.random(128 / 8) var key256Bits = CryptoJS.PBKDF2(mnemonic, salt, { keySize: 256 / 32, - iterations: 1000 + iterations: numIterations }) return key256Bits } -function mnemonicToSeedHex(mnemonic, password) { - var seed = mnemonicToSeed(mnemonic, password) +function mnemonicToSeedHex(mnemonic, numIterations) { + var seed = mnemonicToSeed(mnemonic, numIterations) return seed.toString('hex') }