'use strict'; var buffer = require('buffer'); var assert = require('assert'); var js = require('./js'); var $ = require('./preconditions'); 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; } 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; }, /** * 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 buffer.Buffer.concat */ 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 buffer.toString('hex') * * @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) { $.checkArgumentType(param, 'Buffer', '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 Buffer(string, 'hex') * * @param {string} string * @return {Buffer} */ hexToBuffer: function hexToBuffer(string) { assert(js.isHexa(string)); return new buffer.Buffer(string, 'hex'); } }; module.exports.NULL_HASH = module.exports.fill(new Buffer(32), 0); module.exports.EMPTY_BUFFER = new Buffer(0);