UNPKG

akachain-bip39

Version:

Akachain bip39 library for web browser

200 lines (180 loc) 4.85 kB
'use strict'; var buffer = require('buffer'); function equals(a, b) { if (a.length !== b.length) { return false; } var length = a.length; for (var i = 0; i < length; i++) { if (a[i] !== b[i]) { return false; } } return true; } var isHexa = function isHexa(value) { return /^[0-9a-fA-F]+$/.test(value); }; function assert (val, msg) { if (!val) throw new Error(msg || 'Assertion failed'); } var checkArgumentType = function(argument, type, argumentName) { argumentName = argumentName || '(unknown name)'; if (typeof type === 'string') { if (type === 'Buffer') { var buffer = require('buffer'); // './buffer' fails on cordova & RN if (!buffer.Buffer.isBuffer(argument)) { throw 'Invalid argument type' } } else if (typeof argument !== type) { throw 'Invalid argument type' } } else { if (!(argument instanceof type)) { throw 'Invalid argument type' } } } module.exports = { /** * Fill a buffer with a value. * * @param {Buffer} buffer * @param {number} value * @return {Buffer} */ fill: function fill(buffer, value) { checkArgumentType(buffer, 'Buffer', 'buffer'); checkArgumentType(value, 'number', 'value'); var length = buffer.length; for (var i = 0; i < length; i++) { buffer[i] = value; } return buffer; }, /** * Return a copy of a buffer * * @param {Buffer} original * @return {Buffer} */ copy: function(original) { var buffer = new Buffer(original.length); original.copy(buffer); return buffer; }, /** * Returns true if the given argument is an instance of a buffer. Tests for * both node's Buffer and Uint8Array * * @param {*} arg * @return {boolean} */ isBuffer: function isBuffer(arg) { return buffer.Buffer.isBuffer(arg) || arg instanceof Uint8Array; }, /** * Returns a zero-filled byte array * * @param {number} bytes * @return {Buffer} */ emptyBuffer: function emptyBuffer(bytes) { checkArgumentType(bytes, 'number', 'bytes'); var result = new buffer.Buffer(bytes); for (var i = 0; i < bytes; i++) { result.write('\0', i); } return result; }, /** * Concatenates a buffer * * Shortcut for <tt>buffer.Buffer.concat</tt> */ concat: buffer.Buffer.concat, equals: equals, equal: equals, /** * Transforms a number from 0 to 255 into a Buffer of size 1 with that value * * @param {number} integer * @return {Buffer} */ integerAsSingleByteBuffer: function integerAsSingleByteBuffer(integer) { checkArgumentType(integer, 'number', 'integer'); return new buffer.Buffer([integer & 0xff]); }, /** * Transform a 4-byte integer into a Buffer of length 4. * * @param {number} integer * @return {Buffer} */ integerAsBuffer: function integerAsBuffer(integer) { checkArgumentType(integer, 'number', 'integer'); var bytes = []; bytes.push((integer >> 24) & 0xff); bytes.push((integer >> 16) & 0xff); bytes.push((integer >> 8) & 0xff); bytes.push(integer & 0xff); return new Buffer(bytes); }, /** * Transform the first 4 values of a Buffer into a number, in little endian encoding * * @param {Buffer} buffer * @return {number} */ integerFromBuffer: function integerFromBuffer(buffer) { checkArgumentType(buffer, 'Buffer', 'buffer'); return buffer[0] << 24 | buffer[1] << 16 | buffer[2] << 8 | buffer[3]; }, /** * Transforms the first byte of an array into a number ranging from -128 to 127 * @param {Buffer} buffer * @return {number} */ integerFromSingleByteBuffer: function integerFromBuffer(buffer) { checkArgumentType(buffer, 'Buffer', 'buffer'); return buffer[0]; }, /** * Transforms a buffer into a string with a number in hexa representation * * Shorthand for <tt>buffer.toString('hex')</tt> * * @param {Buffer} buffer * @return {string} */ bufferToHex: function bufferToHex(buffer) { checkArgumentType(buffer, 'Buffer', 'buffer'); return buffer.toString('hex'); }, /** * Reverse a buffer * @param {Buffer} param * @return {Buffer} */ reverse: function reverse(param) { var ret = new buffer.Buffer(param.length); for (var i = 0; i < param.length; i++) { ret[i] = param[param.length - i - 1]; } return ret; }, /** * Transforms an hexa encoded string into a Buffer with binary values * * Shorthand for <tt>Buffer(string, 'hex')</tt> * * @param {string} string * @return {Buffer} */ hexToBuffer: function hexToBuffer(string) { assert(isHexa(string)); return new buffer.Buffer(string, 'hex'); } }; module.exports.NULL_HASH = module.exports.fill(new buffer.Buffer(32), 0); module.exports.EMPTY_BUFFER = new buffer.Buffer(0);