X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=src%2Fjs%2Fjsbip39.js;h=1e52d9d93296681f47b78b127904d0d2f1e7fbd3;hb=700294714c39cb6e8226b960671a33dc93362edc;hp=0b88fef949bd65c89088cc20d7faeae4ff1d5c8b;hpb=4dd6050628487797ea531770a33ee766c86625c8;p=perso%2FImmae%2FProjets%2FCryptomonnaies%2FBIP39.git diff --git a/src/js/jsbip39.js b/src/js/jsbip39.js index 0b88fef..1e52d9d 100644 --- a/src/js/jsbip39.js +++ b/src/js/jsbip39.js @@ -22,8 +22,8 @@ /* * Javascript port from python by Ian Coleman * - * Includes code from asmCrypto - * https://github.com/tresorit/asmcrypto.js + * Requires code from sjcl + * https://github.com/bitwiseshiftleft/sjcl */ var Mnemonic = function(language) { @@ -34,6 +34,13 @@ var Mnemonic = function(language) { var self = this; var wordlist = []; + var hmacSHA512 = function(key) { + var hasher = new sjcl.misc.hmac(key, sjcl.hash.sha512); + this.encrypt = function() { + return hasher.encrypt.apply(hasher, arguments); + }; + }; + function init() { wordlist = WORDLISTS[language]; if (wordlist.length != RADIX) { @@ -57,14 +64,15 @@ var Mnemonic = function(language) { return self.toMnemonic(data); } - self.toMnemonic = function(data) { - if (data.length % 4 > 0) { - throw 'Data length in bits should be divisible by 32, but it is not (' + data.length + ' bytes = ' + data.length*8 + ' bits).' + self.toMnemonic = function(byteArray) { + if (byteArray.length % 4 > 0) { + throw 'Data length in bits should be divisible by 32, but it is not (' + byteArray.length + ' bytes = ' + byteArray.length*8 + ' bits).' } //h = hashlib.sha256(data).hexdigest() - var uintArray = new Uint8Array(data); - var h = asmCrypto.SHA256.bytes(uintArray); + var data = byteArrayToWordArray(byteArray); + var hash = sjcl.hash.sha256.hash(data); + var h = sjcl.codec.hex.fromBits(hash); // b is a binary string, eg '00111010101100...' //b = bin(int(binascii.hexlify(data), 16))[2:].zfill(len(data) * 8) + \ @@ -73,9 +81,9 @@ var Mnemonic = function(language) { // a = bin(int(binascii.hexlify(data), 16))[2:].zfill(len(data) * 8) // c = bin(int(h, 16))[2:].zfill(256) // d = c[:len(data) * 8 / 32] - var a = byteArrayToBinaryString(data); - var c = byteArrayToBinaryString(h); - var d = c.substring(0, data.length * 8 / 32); + var a = byteArrayToBinaryString(byteArray); + var c = zfill(hexStringToBinaryString(h), 256); + var d = c.substring(0, byteArray.length * 8 / 32); // b = line1 + line2 var b = a + d; @@ -85,58 +93,91 @@ var Mnemonic = function(language) { var idx = parseInt(b.substring(i * 11, (i + 1) * 11), 2); result.push(wordlist[idx]); } - return result.join(' '); + return self.joinWords(result); } self.check = function(mnemonic) { - var mnemonic = mnemonic.split(' ') - if (mnemonic.length % 3 > 0) { - return false - } - // idx = map(lambda x: bin(self.wordlist.index(x))[2:].zfill(11), mnemonic) - var idx = []; - for (var i=0; i 0) { + return null; + } + // idx = map(lambda x: bin(self.wordlist.index(x))[2:].zfill(11), mnemonic) + var idx = []; + for (var i=0; i