Created
October 5, 2016 09:17
-
-
Save rubensayshi/b7772a383f6b71df7ce756b7dd8f1869 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var bip39 = require('bip39'); | |
if (!String.prototype.repeat) { | |
String.prototype.repeat = function(count) { | |
'use strict'; | |
if (this == null) { | |
throw new TypeError('can\'t convert ' + this + ' to object'); | |
} | |
var str = '' + this; | |
count = +count; | |
if (count != count) { | |
count = 0; | |
} | |
if (count < 0) { | |
throw new RangeError('repeat count must be non-negative'); | |
} | |
if (count == Infinity) { | |
throw new RangeError('repeat count must be less than infinity'); | |
} | |
count = Math.floor(count); | |
if (str.length == 0 || count == 0) { | |
return ''; | |
} | |
// Ensuring count is a 31-bit integer allows us to heavily optimize the | |
// main part. But anyway, most current (August 2014) browsers can't handle | |
// strings 1 << 28 chars or longer, so: | |
if (str.length * count >= 1 << 28) { | |
throw new RangeError('repeat count must not overflow maximum string size'); | |
} | |
var rpt = ''; | |
for (;;) { | |
if ((count & 1) == 1) { | |
rpt += str; | |
} | |
count >>>= 1; | |
if (count == 0) { | |
break; | |
} | |
str += str; | |
} | |
// Could we try: | |
// return Array(count + 1).join(this); | |
return rpt; | |
} | |
} | |
// create original mock entropy buffer | |
var entropyBuffer = new Buffer('11'.repeat(65), 'hex'); | |
// this fails | |
try { | |
console.log('entropyToMnemonic: ' + bip39.entropyToMnemonic(entropyBuffer)); | |
console.log("length: " + bip39.entropyToMnemonic(entropyBuffer).split(" ").length); | |
console.log('mnemonicToEntropy: ' + bip39.mnemonicToEntropy(bip39.entropyToMnemonic(entropyBuffer))); | |
} catch (e) { | |
console.error("" + e); | |
} | |
// length of entropy in bytes | |
var entropyByteLength = entropyBuffer.length; | |
console.log('entropyByteLength: ' + entropyByteLength); | |
// payload for mnemonic including checksum | |
var bip39ByteLength = (entropyByteLength + entropyByteLength / 32.0); | |
var bip39BitsLength = bip39ByteLength * 8; | |
console.log('bip39ByteLength: ' + bip39ByteLength); | |
// words is ceil of chunks of 11 bits | |
var words = Math.ceil(bip39BitsLength / 11); | |
console.log('words: ' + words); | |
// words need to be %3==0 so we fix the word count | |
words = words + (3 - words % 3); | |
console.log('words: ' + words); | |
// reverse of the entropyByteLength -> words formula | |
var requiredBitsLength = ((words * 32) / 33) * 11; | |
var requiredByteLength = Math.floor(requiredBitsLength / 8); | |
console.log('requiredByteLength: ' + requiredByteLength); | |
// padd the entropy | |
entropyBuffer = Buffer.concat([new Buffer('00'.repeat(requiredByteLength - entropyByteLength), 'hex'), entropyBuffer]); | |
console.log('entropyToMnemonic: ' + bip39.entropyToMnemonic(entropyBuffer)); | |
console.log("length: " + bip39.entropyToMnemonic(entropyBuffer).split(" ").length); | |
console.log('mnemonicToEntropy: ' + bip39.mnemonicToEntropy(bip39.entropyToMnemonic(entropyBuffer))); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment