UNPKG

groestl-hash-js

Version:

groestl javascript hashing algorithm in pure javascript

253 lines (225 loc) 6.31 kB
'use strict'; // String functions var op = require('./op.js'); module.exports.int8ArrayToHexString = function toString(array) { var string = ''; for (var i = 0; i < array.length; i++) { if (array[i] < 16) { string += '0' + array[i].toString(16); } else { string += array[i].toString(16); } } return string; } module.exports.int32ArrayToHexString = function toString(array) { var string = ''; var len = array.length; for (var i = 0; i < len; i++) { var s = array[i]; if (s < 0) { s = 0xFFFFFFFF + array[i] + 1; } var l = s.toString(16); var padding = 8; while (l.length < padding) { l = "0" + l; } string += l; } return string; } module.exports.hex2string = function toString(s) { for (var c = [], len = s.length, i = 0; i < len; i += 2) c.push(String.fromCharCode(parseInt(s.substring(i, i + 2), 16))); return c.join(''); } module.exports.hex2bytes = function toString(s) { for (var c = [], len = s.length, i = 0; i < len; i += 2) c.push(parseInt(s.substring(i, i + 2), 16)); return c; } /* module.exports.string2hex = function toString(s) { for (var p = [], len = s.length, i = 0; i < len; i++) { p.push((256 + s.charCodeAt(i)).toString(16).substring(1)); } return p.join(''); } */ module.exports.string2bytes = function(s) { var len = s.length; var b = new Array(len); var i = 0; while (i < len) { b[i] = s.charCodeAt(i); i++; } return b; } /* module.exports.bytes2Int16Buffer = function(b) { var len = b.length; var bufferLength = len ? (((len - 1) >>> 1) + 1) : 0; var buffer = new Array(bufferLength); var i = 0; var j = 0; while (i < len) { buffer[j] = (buffer[j] << 8) | b[i]; i++; if (!(i % 2)) j++; } return buffer; } */ module.exports.bytes2Int32Buffer = function(b) { if (!b) return []; var len = b.length ? (((b.length - 1) >>> 2) + 1) : 0; var buffer = new Array(len); var j = 0; while (j < len) { buffer[j] = (b[j * 4] << 24) | (b[j * 4 + 1] << 16) | (b[j * 4 + 2] << 8) | b[j * 4 + 3]; j++; } return buffer; } /* module.exports.bytes2Int32BufferLeAligned = function(b) { var len = b.length; if (!len) return []; var len2 = len ? (((len - 1) >>> 2) + 1) : 0; var buffer = new Array(len); var j = 0; while (j < len2) { buffer[j] = (b[j * 4 + 3] << 24) | (b[j * 4 + 2] << 16) | (b[j * 4 + 1] << 8) | b[j * 4]; j++; }; return buffer; } */ module.exports.bytes2Int64Buffer = function(b) { if (!b) return []; var len = b.length ? (((b.length - 1) >>> 3) + 1) : 0; var buffer = new Array(len); var j = 0; while (j < len) { buffer[j] = new op.u64((b[j * 8] << 24) | (b[j * 8 + 1] << 16) | (b[j * 8 + 2] << 8) | b[j * 8 + 3], (b[j * 8 + 4] << 24) | (b[j * 8 + 5] << 16) | (b[j * 8 + 6] << 8) | b[j * 8 + 7]); j++; } return buffer; } module.exports.bytes2Int64BufferLeAligned = function(b) { if (!b) return []; var len = b.length ? ((( b.length - 1) >>> 3) + 1) : 0; var buffer = new Array(len); var j = 0; while (j < len) { buffer[j] = new op.u64((b[j * 8 + 7] << 24) | (b[j * 8 + 6] << 16) | (b[j * 8 + 5] << 8) | b[j * 8 + 4], (b[j * 8 + 3] << 24) | (b[j * 8 + 2] << 16) | (b[j * 8 + 1] << 8) | b[j * 8]); j++; } return buffer; } module.exports.bufferEncode64leAligned = function(buffer, offset, uint64) { buffer[offset + 7] = uint64.hi >>> 24; buffer[offset + 6] = uint64.hi >>> 16 & 0xFF; buffer[offset + 5] = uint64.hi >>> 8 & 0xFF; buffer[offset + 4] = uint64.hi & 0xFF; buffer[offset + 3] = uint64.lo >>> 24; buffer[offset + 2] = uint64.lo >>> 16 & 0xFF; buffer[offset + 1] = uint64.lo >>> 8 & 0xFF; buffer[offset + 0] = uint64.lo & 0xFF; } module.exports.bufferEncode64 = function(buffer, offset, uint64) { buffer[offset] = uint64.hi >>> 24; buffer[offset + 1] = uint64.hi >>> 16 & 0xFF; buffer[offset + 2] = uint64.hi >>> 8 & 0xFF; buffer[offset + 3] = uint64.hi & 0xFF; buffer[offset + 4] = uint64.lo >>> 24; buffer[offset + 5] = uint64.lo >>> 16 & 0xFF; buffer[offset + 6] = uint64.lo >>> 8 & 0xFF; buffer[offset + 7] = uint64.lo & 0xFF; } module.exports.int32Buffer2Bytes = function(b) { var buffer = new Array(b.length); var len = b.length; var i = 0; while (i < len) { buffer[i * 4] = (b[i] & 0xFF000000) >>> 24; buffer[i * 4 + 1] = (b[i] & 0x00FF0000) >>> 16; buffer[i * 4 + 2] = (b[i] & 0x0000FF00) >>> 8; buffer[i * 4 + 3] = (b[i] & 0x000000FF); i++; } return buffer; } /* module.exports.int64Buffer2Bytes = function(b) { var buffer = new Array(b.length); var i = 0; while (i < b.length) { buffer[i * 8] = (b[i].hi & 0xFF000000) >>> 24; buffer[i * 8 + 1] = (b[i].hi & 0x00FF0000) >>> 16; buffer[i * 8 + 2] = (b[i].hi & 0x0000FF00) >>> 8; buffer[i * 8 + 3] = (b[i].hi & 0x000000FF); buffer[i * 8 + 4] = (b[i].lo & 0xFF000000) >>> 24; buffer[i * 8 + 5] = (b[i].lo & 0x00FF0000) >>> 16; buffer[i * 8 + 6] = (b[i].lo & 0x0000FF00) >>> 8; buffer[i * 8 + 7] = (b[i].lo & 0x000000FF); i++; } return buffer; } */ module.exports.string2Int32Buffer = function(s) { return this.bytes2Int32Buffer(this.string2bytes(s)); } var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; module.exports.b64Encode = function(input) { var output = ""; var chr1, chr2, chr3, enc1, enc2, enc3, enc4; var i = 0; while (i < input.length) { chr1 = input[i++]; chr2 = input[i++]; chr3 = input[i++]; enc1 = chr1 >> 2; enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); enc4 = chr3 & 63; if (isNaN(chr2)) { enc3 = enc4 = 64; } else if (isNaN(chr3)) { enc4 = 64; } output += keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4); } return output; }; module.exports.b64Decode = function(input) { var output = []; var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0; input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); while (i < input.length) { enc1 = keyStr.indexOf(input.charAt(i++)); enc2 = keyStr.indexOf(input.charAt(i++)); enc3 = keyStr.indexOf(input.charAt(i++)); enc4 = keyStr.indexOf(input.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; output.push(chr1); if (enc3 != 64) { output.push(chr2); } if (enc4 != 64) { output.push(chr3); } } return output; };