Skip to content

Instantly share code, notes, and snippets.

@rubensayshi
Created October 5, 2016 09:17
Show Gist options
  • Save rubensayshi/b7772a383f6b71df7ce756b7dd8f1869 to your computer and use it in GitHub Desktop.
Save rubensayshi/b7772a383f6b71df7ce756b7dd8f1869 to your computer and use it in GitHub Desktop.
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