x11-hash-js
Advanced tools
Comparing version 1.0.0 to 1.0.1
@@ -1,13 +0,27 @@ | ||
module.exports = function(grunt) { | ||
grunt.loadNpmTasks('grunt-contrib-watch'); | ||
'use strict'; | ||
module.exports = function (grunt) { | ||
grunt.loadNpmTasks('grunt-browserify'); | ||
grunt.loadNpmTasks('grunt-contrib-uglify'); | ||
grunt.registerTask('default', ['browserify', 'uglify']); | ||
grunt.loadNpmTasks('grunt-contrib-clean'); | ||
grunt.loadNpmTasks('grunt-karma'); | ||
grunt.loadNpmTasks('grunt-multi'); | ||
grunt.registerTask('default', ['clean', 'browserify', 'multi:karmaDebug', 'uglify', 'multi:karmaMin']); | ||
grunt.initConfig({ | ||
// property for browserified or minified bundle path for Karma | ||
targetBundle: '', | ||
clean: ['dist/*'], | ||
pkg: grunt.file.readJSON('package.json'), | ||
// browserify the AMD code | ||
browserify: { | ||
main: { | ||
src: [], | ||
dest: 'dist/x11-hash.js', | ||
files: { | ||
'dist/x11-hash.js': ['lib'] | ||
}, | ||
options: { | ||
@@ -20,2 +34,52 @@ require: [ | ||
}, | ||
// inline Karma config | ||
karma: { | ||
unit: { | ||
options: { | ||
basePath: '', | ||
frameworks: ['mocha', 'chai'], | ||
files: [ | ||
'<%= targetBundle %>', | ||
'test/test.js' | ||
], | ||
exclude: [], | ||
browserNoActivityTimeout: 30000, | ||
reporters: ['mocha'], | ||
port: 9876, | ||
colors: true, | ||
logLevel: 'INFO', | ||
autoWatch: false, | ||
browsers: ['PhantomJS'], | ||
singleRun: true, | ||
plugins: [ | ||
'karma-phantomjs-launcher', | ||
'karma-firefox-launcher', | ||
'karma-mocha-reporter', | ||
'karma-mocha', | ||
'karma-chai' | ||
] | ||
} | ||
} | ||
}, | ||
// karma task is ran first on the browserified bundle then again | ||
// on the minified version to ensure all bundles are tested | ||
multi: { | ||
karmaDebug: { | ||
options: { | ||
config: { | ||
targetBundle: 'dist/x11-hash.js' | ||
}, | ||
tasks: ['karma'] | ||
} | ||
}, | ||
karmaMin: { | ||
options: { | ||
config: { | ||
targetBundle: 'dist/x11-hash.min.js' | ||
}, | ||
tasks: ['karma'] | ||
} | ||
} | ||
}, | ||
// minify | ||
uglify: { | ||
@@ -29,2 +93,2 @@ my_target: { | ||
}); | ||
} | ||
}; |
188
index.js
@@ -16,81 +16,135 @@ 'use strict'; | ||
var x11hash = module.exports; | ||
/** | ||
* Error codes | ||
*/ | ||
var errors = module.exports.errors = { | ||
input_not_specified: 'input not specified', | ||
input_single_invalid_type: 'input must be string when inputFormat is not specified', | ||
input_format_mismatch_string: 'input format mismatch: input should be an string', | ||
input_format_mismatch_array: 'input format mismatch: input should be an array', | ||
input_format_invalid: 'invalid input format', | ||
output_format_invalid: 'invalid output format' | ||
}; | ||
module.exports.blake = function(str,format, output) { | ||
return blake(str,format,output); | ||
} | ||
/** | ||
* Obtain an x11 hash | ||
* @param input {string|array} input data to hash | ||
* @param inputFormat {number} optional - format of the input: 0: string, 1: 8 bit array, 2: 32 bit array | ||
* @param outputFormat {number} optional - format of the output: 0: string, 1: 8 bit array, 2: 32 bit array | ||
* @returns {string|array} x11 hash of input as a string, 8-bit array or 32-bit array | ||
*/ | ||
module.exports.digest = function (input, inputFormat, outputFormat) { | ||
module.exports.bmw = function(str,format, output) { | ||
return bmw(str,format,output); | ||
} | ||
// argument exceptions | ||
if (input === undefined) { | ||
throw (errors.input_not_specified); | ||
} else if (inputFormat === undefined) { | ||
module.exports.cubehash = function(str,format, output) { | ||
return cubehash(str,format,output); | ||
} | ||
// single input arg must be string | ||
if (!(typeof input === 'string' || input instanceof String)) { | ||
throw (errors.input_single_invalid_type); | ||
} | ||
} else { | ||
module.exports.echo = function(str,format, output) { | ||
return echo(str,format,output); | ||
} | ||
// validate input arguments | ||
if (inputFormat === 0) { | ||
if (!(typeof input === 'string' || input instanceof String)) { | ||
throw (errors.input_format_mismatch_string); | ||
} | ||
} else if (inputFormat === 1 || inputFormat === 2) { | ||
if (!Array.isArray(input)) { | ||
throw (errors.input_format_mismatch_array); | ||
} | ||
} else { | ||
throw (errors.input_format_invalid); | ||
} | ||
module.exports.groestl = function(str,format, output) { | ||
return groestl(str,format,output); | ||
} | ||
// validate output format | ||
if (outputFormat !== undefined | ||
&& outputFormat !== 0 | ||
&& outputFormat !== 1 | ||
&& outputFormat !== 2) { | ||
throw (errors.output_format_invalid); | ||
} | ||
} | ||
module.exports.jh = function(str,format, output) { | ||
return jh(str,format,output); | ||
} | ||
// obtain the x11 hash of the input | ||
var a = blake(input, inputFormat, 2); | ||
a = bmw(a, 2, 2); | ||
a = groestl(a, 2, 2); | ||
a = skein(a, 2, 2); | ||
a = jh(a, 2, 2); | ||
a = this.keccak(a, 2, 1); | ||
a = luffa(a, 1, 2); | ||
a = cubehash(a, 2, 2); | ||
a = shavite(a, 2, 2); | ||
a = simd(a, 2, 2); | ||
a = echo(a, 2, 2); | ||
a = a.slice(0, 8); | ||
module.exports.keccak = function(str,format, output) { | ||
var msg = str; | ||
if (format === 2) { | ||
msg = h.int32Buffer2Bytes(str); | ||
} | ||
if (output === 1) { | ||
return keccak['array'](msg); | ||
} else if (output === 2) { | ||
return h.bytes2Int32Buffer(keccak['array'](msg)); | ||
} else { | ||
return keccak['hex'](msg); | ||
} | ||
} | ||
// output 32-bit array | ||
if (outputFormat === 2) { | ||
return a; | ||
} | ||
// output 8-bit array | ||
else if (outputFormat === 1) { | ||
return h.int32Buffer2Bytes(a); | ||
} | ||
// output string | ||
return h.int32ArrayToHexString(a); | ||
}; | ||
module.exports.luffa = function(str,format, output) { | ||
return luffa(str,format,output); | ||
} | ||
// individual x11 hash functions... | ||
module.exports.blake = function (str, format, output) { | ||
return blake(str, format, output); | ||
}; | ||
module.exports.shavite = function(str,format, output) { | ||
return shavite(str,format,output); | ||
} | ||
module.exports.bmw = function (str, format, output) { | ||
return bmw(str, format, output); | ||
}; | ||
module.exports.simd = function(str,format, output) { | ||
return simd(str,format,output); | ||
} | ||
module.exports.cubehash = function (str, format, output) { | ||
return cubehash(str, format, output); | ||
}; | ||
module.exports.skein = function(str,format, output) { | ||
return skein(str,format,output); | ||
} | ||
module.exports.echo = function (str, format, output) { | ||
return echo(str, format, output); | ||
}; | ||
module.exports.groestl = function (str, format, output) { | ||
return groestl(str, format, output); | ||
}; | ||
module.exports.digest = function(str,format, output) { | ||
var a = blake(str,format,2); | ||
a = bmw(a,2,2); | ||
a = groestl(a,2,2); | ||
a = skein(a,2,2); | ||
a = jh(a,2,2); | ||
a = this.keccak(a,2,1); | ||
a = luffa(a,1,2); | ||
a = cubehash(a,2,2); | ||
a = shavite(a,2,2); | ||
a = simd(a,2,2); | ||
a = echo(a,2,2); | ||
a = a.slice(0,8); | ||
if (output === 1) { | ||
return a; | ||
} | ||
else if (output === 2) { | ||
return h.int32Buffer2Bytes(a); | ||
} | ||
else { | ||
return h.int32ArrayToHexString(a); | ||
} | ||
} | ||
module.exports.jh = function (str, format, output) { | ||
return jh(str, format, output); | ||
}; | ||
module.exports.keccak = function (str, format, output) { | ||
var msg = str; | ||
if (format === 2) { | ||
msg = h.int32Buffer2Bytes(str); | ||
} | ||
if (output === 1) { | ||
return keccak.array(msg); | ||
} else if (output === 2) { | ||
return h.bytes2Int32Buffer(keccak.array(msg)); | ||
} | ||
return keccak.hex(msg); | ||
}; | ||
module.exports.luffa = function (str, format, output) { | ||
return luffa(str, format, output); | ||
}; | ||
module.exports.shavite = function (str, format, output) { | ||
return shavite(str, format, output); | ||
}; | ||
module.exports.simd = function (str, format, output) { | ||
return simd(str, format, output); | ||
}; | ||
module.exports.skein = function (str, format, output) { | ||
return skein(str, format, output); | ||
}; |
538
lib/aes.js
@@ -0,270 +1,276 @@ | ||
'use strict'; | ||
var op = require('./op'); | ||
var h = require('./helper'); | ||
var AES0 = [ | ||
0xA56363C6, 0x847C7CF8, 0x997777EE, 0x8D7B7BF6, | ||
0x0DF2F2FF, 0xBD6B6BD6, 0xB16F6FDE, 0x54C5C591, | ||
0x50303060, 0x03010102, 0xA96767CE, 0x7D2B2B56, | ||
0x19FEFEE7, 0x62D7D7B5, 0xE6ABAB4D, 0x9A7676EC, | ||
0x45CACA8F, 0x9D82821F, 0x40C9C989, 0x877D7DFA, | ||
0x15FAFAEF, 0xEB5959B2, 0xC947478E, 0x0BF0F0FB, | ||
0xECADAD41, 0x67D4D4B3, 0xFDA2A25F, 0xEAAFAF45, | ||
0xBF9C9C23, 0xF7A4A453, 0x967272E4, 0x5BC0C09B, | ||
0xC2B7B775, 0x1CFDFDE1, 0xAE93933D, 0x6A26264C, | ||
0x5A36366C, 0x413F3F7E, 0x02F7F7F5, 0x4FCCCC83, | ||
0x5C343468, 0xF4A5A551, 0x34E5E5D1, 0x08F1F1F9, | ||
0x937171E2, 0x73D8D8AB, 0x53313162, 0x3F15152A, | ||
0x0C040408, 0x52C7C795, 0x65232346, 0x5EC3C39D, | ||
0x28181830, 0xA1969637, 0x0F05050A, 0xB59A9A2F, | ||
0x0907070E, 0x36121224, 0x9B80801B, 0x3DE2E2DF, | ||
0x26EBEBCD, 0x6927274E, 0xCDB2B27F, 0x9F7575EA, | ||
0x1B090912, 0x9E83831D, 0x742C2C58, 0x2E1A1A34, | ||
0x2D1B1B36, 0xB26E6EDC, 0xEE5A5AB4, 0xFBA0A05B, | ||
0xF65252A4, 0x4D3B3B76, 0x61D6D6B7, 0xCEB3B37D, | ||
0x7B292952, 0x3EE3E3DD, 0x712F2F5E, 0x97848413, | ||
0xF55353A6, 0x68D1D1B9, 0x00000000, 0x2CEDEDC1, | ||
0x60202040, 0x1FFCFCE3, 0xC8B1B179, 0xED5B5BB6, | ||
0xBE6A6AD4, 0x46CBCB8D, 0xD9BEBE67, 0x4B393972, | ||
0xDE4A4A94, 0xD44C4C98, 0xE85858B0, 0x4ACFCF85, | ||
0x6BD0D0BB, 0x2AEFEFC5, 0xE5AAAA4F, 0x16FBFBED, | ||
0xC5434386, 0xD74D4D9A, 0x55333366, 0x94858511, | ||
0xCF45458A, 0x10F9F9E9, 0x06020204, 0x817F7FFE, | ||
0xF05050A0, 0x443C3C78, 0xBA9F9F25, 0xE3A8A84B, | ||
0xF35151A2, 0xFEA3A35D, 0xC0404080, 0x8A8F8F05, | ||
0xAD92923F, 0xBC9D9D21, 0x48383870, 0x04F5F5F1, | ||
0xDFBCBC63, 0xC1B6B677, 0x75DADAAF, 0x63212142, | ||
0x30101020, 0x1AFFFFE5, 0x0EF3F3FD, 0x6DD2D2BF, | ||
0x4CCDCD81, 0x140C0C18, 0x35131326, 0x2FECECC3, | ||
0xE15F5FBE, 0xA2979735, 0xCC444488, 0x3917172E, | ||
0x57C4C493, 0xF2A7A755, 0x827E7EFC, 0x473D3D7A, | ||
0xAC6464C8, 0xE75D5DBA, 0x2B191932, 0x957373E6, | ||
0xA06060C0, 0x98818119, 0xD14F4F9E, 0x7FDCDCA3, | ||
0x66222244, 0x7E2A2A54, 0xAB90903B, 0x8388880B, | ||
0xCA46468C, 0x29EEEEC7, 0xD3B8B86B, 0x3C141428, | ||
0x79DEDEA7, 0xE25E5EBC, 0x1D0B0B16, 0x76DBDBAD, | ||
0x3BE0E0DB, 0x56323264, 0x4E3A3A74, 0x1E0A0A14, | ||
0xDB494992, 0x0A06060C, 0x6C242448, 0xE45C5CB8, | ||
0x5DC2C29F, 0x6ED3D3BD, 0xEFACAC43, 0xA66262C4, | ||
0xA8919139, 0xA4959531, 0x37E4E4D3, 0x8B7979F2, | ||
0x32E7E7D5, 0x43C8C88B, 0x5937376E, 0xB76D6DDA, | ||
0x8C8D8D01, 0x64D5D5B1, 0xD24E4E9C, 0xE0A9A949, | ||
0xB46C6CD8, 0xFA5656AC, 0x07F4F4F3, 0x25EAEACF, | ||
0xAF6565CA, 0x8E7A7AF4, 0xE9AEAE47, 0x18080810, | ||
0xD5BABA6F, 0x887878F0, 0x6F25254A, 0x722E2E5C, | ||
0x241C1C38, 0xF1A6A657, 0xC7B4B473, 0x51C6C697, | ||
0x23E8E8CB, 0x7CDDDDA1, 0x9C7474E8, 0x211F1F3E, | ||
0xDD4B4B96, 0xDCBDBD61, 0x868B8B0D, 0x858A8A0F, | ||
0x907070E0, 0x423E3E7C, 0xC4B5B571, 0xAA6666CC, | ||
0xD8484890, 0x05030306, 0x01F6F6F7, 0x120E0E1C, | ||
0xA36161C2, 0x5F35356A, 0xF95757AE, 0xD0B9B969, | ||
0x91868617, 0x58C1C199, 0x271D1D3A, 0xB99E9E27, | ||
0x38E1E1D9, 0x13F8F8EB, 0xB398982B, 0x33111122, | ||
0xBB6969D2, 0x70D9D9A9, 0x898E8E07, 0xA7949433, | ||
0xB69B9B2D, 0x221E1E3C, 0x92878715, 0x20E9E9C9, | ||
0x49CECE87, 0xFF5555AA, 0x78282850, 0x7ADFDFA5, | ||
0x8F8C8C03, 0xF8A1A159, 0x80898909, 0x170D0D1A, | ||
0xDABFBF65, 0x31E6E6D7, 0xC6424284, 0xB86868D0, | ||
0xC3414182, 0xB0999929, 0x772D2D5A, 0x110F0F1E, | ||
0xCBB0B07B, 0xFC5454A8, 0xD6BBBB6D, 0x3A16162C | ||
]; | ||
var AES0 = h.bytes2Int32Buffer(h.b64Decode('pWNjxoR8fPiZd3fujXt79g3y8v+9a2vWsW9v3lTFxZFQMDBgAwEBAqlnZ859KytWGf7+52LX17Xmq6tNmnZ27EXKyo+dgoIfQMnJiYd9ffoV+vrv61lZsslHR44L8PD77K2tQWfU1LP9oqJf6q+vRb+cnCP3pKRTlnJy5FvAwJvCt7d1HP394a6Tkz1qJiZMWjY2bEE/P34C9/f1T8zMg1w0NGj0paVRNOXl0Qjx8fmTcXHic9jYq1MxMWI/FRUqDAQECFLHx5VlIyNGXsPDnSgYGDChlpY3DwUFCrWami8JBwcONhISJJuAgBs94uLfJuvrzWknJ07NsrJ/n3V16hsJCRKeg4MddCwsWC4aGjQtGxs2sm5u3O5aWrT7oKBb9lJSpE07O3Zh1ta3zrOzfXspKVI+4+PdcS8vXpeEhBP1U1OmaNHRuQAAAAAs7e3BYCAgQB/8/OPIsbF57Vtbtr5qatRGy8uN2b6+Z0s5OXLeSkqU1ExMmOhYWLBKz8+Fa9DQuyrv78XlqqpPFvv77cVDQ4bXTU2aVTMzZpSFhRHPRUWKEPn56QYCAgSBf3/+8FBQoEQ8PHi6n58l46ioS/NRUaL+o6NdwEBAgIqPjwWtkpI/vJ2dIUg4OHAE9fXx37y8Y8G2tnd12tqvYyEhQjAQECAa///lDvPz/W3S0r9Mzc2BFAwMGDUTEyYv7OzD4V9fvqKXlzXMRESIORcXLlfExJPyp6dVgn5+/Ec9PXqsZGTI511duisZGTKVc3PmoGBgwJiBgRnRT0+ef9zco2YiIkR+KipUq5CQO4OIiAvKRkaMKe7ux9O4uGs8FBQoed7ep+JeXrwdCwsWdtvbrTvg4NtWMjJkTjo6dB4KChTbSUmSCgYGDGwkJEjkXFy4XcLCn27T073vrKxDpmJixKiRkTmklZUxN+Tk04t5efIy5+fVQ8jIi1k3N263bW3ajI2NAWTV1bHSTk6c4KmpSbRsbNj6VlasB/T08yXq6s+vZWXKjnp69OmurkcYCAgQ1bq6b4h4ePBvJSVKci4uXCQcHDjxpqZXx7S0c1HGxpcj6OjLfN3doZx0dOghHx8+3UtLlty9vWGGi4sNhYqKD5BwcOBCPj58xLW1capmZszYSEiQBQMDBgH29vcSDg4co2Fhwl81NWr5V1eu0Lm5aZGGhhdYwcGZJx0dOrmenic44eHZE/j467OYmCszEREiu2lp0nDZ2amJjo4Hp5SUM7abmy0iHh48koeHFSDp6clJzs6H/1VVqngoKFB639+lj4yMA/ihoVmAiYkJFw0NGtq/v2Ux5ubXxkJChLhoaNDDQUGCsJmZKXctLVoRDw8ey7Cwe/xUVKjWu7ttOhYWLA==')); | ||
var AES1 = h.bytes2Int32Buffer(h.b64Decode('Y2PGpXx8+IR3d+6Ze3v2jfLy/w1ra9a9b2/escXFkVQwMGBQAQECA2dnzqkrK1Z9/v7nGdfXtWKrq03mdnbsmsrKj0WCgh+dycmJQH19+of6+u8VWVmy60dHjsnw8PsLra1B7NTUs2eiol/9r69F6pycI7+kpFP3cnLklsDAm1u3t3XC/f3hHJOTPa4mJkxqNjZsWj8/fkH39/UCzMyDTzQ0aFylpVH05eXRNPHx+QhxceKT2NirczExYlMVFSo/BAQIDMfHlVIjI0Zlw8OdXhgYMCiWljehBQUKD5qaL7UHBw4JEhIkNoCAG5vi4t896+vNJicnTmmysn/NdXXqnwkJEhuDgx2eLCxYdBoaNC4bGzYtbm7cslpatO6goFv7UlKk9js7dk3W1rdhs7N9zikpUnvj490+Ly9ecYSEE5dTU6b10dG5aAAAAADt7cEsICBAYPz84x+xsXnIW1u27Wpq1L7Ly41Gvr5n2Tk5cktKSpTeTEyY1FhYsOjPz4VK0NC7a+/vxSqqqk/l+/vtFkNDhsVNTZrXMzNmVYWFEZRFRYrP+fnpEAICBAZ/f/6BUFCg8Dw8eESfnyW6qKhL41FRovOjo13+QECAwI+PBYqSkj+tnZ0hvDg4cEj19fEEvLxj37a2d8Ha2q91ISFCYxAQIDD//+Ua8/P9DtLSv23NzYFMDAwYFBMTJjXs7MMvX1++4ZeXNaJERIjMFxcuOcTEk1enp1Xyfn78gj09ekdkZMisXV265xkZMitzc+aVYGDAoIGBGZhPT57R3NyjfyIiRGYqKlR+kJA7q4iIC4NGRozK7u7HKbi4a9MUFCg83t6neV5evOILCxYd29utduDg2zsyMmRWOjp0TgoKFB5JSZLbBgYMCiQkSGxcXLjkwsKfXdPTvW6srEPvYmLEppGROaiVlTGk5OTTN3l58ovn59UyyMiLQzc3blltbdq3jY0BjNXVsWROTpzSqalJ4Gxs2LRWVqz69PTzB+rqzyVlZcqvenr0jq6uR+kICBAYurpv1Xh48IglJUpvLi5cchwcOCSmplfxtLRzx8bGl1Ho6Msj3d2hfHR06JwfHz4hS0uW3b29YdyLiw2GiooPhXBw4JA+PnxCtbVxxGZmzKpISJDYAwMGBfb29wEODhwSYWHCozU1al9XV675ublp0IaGF5HBwZlYHR06J56eJ7nh4dk4+PjrE5iYK7MRESIzaWnSu9nZqXCOjgeJlJQzp5ubLbYeHjwih4cVkunpySDOzodJVVWq/ygoUHjf36V6jIwDj6GhWfiJiQmADQ0aF7+/Zdrm5tcxQkKExmho0LhBQYLDmZkpsC0tWncPDx4RsLB7y1RUqPy7u23WFhYsOg==')); | ||
var AES2 = h.bytes2Int32Buffer(h.b64Decode('Y8alY3z4hHx37pl3e/aNe/L/DfJr1r1rb96xb8WRVMUwYFAwAQIDAWfOqWcrVn0r/ucZ/te1YterTearduyadsqPRcqCH52CyYlAyX36h3367xX6WbLrWUeOyUfw+wvwrUHsrdSzZ9SiX/2ir0Xqr5wjv5ykU/ekcuSWcsCbW8C3dcK3/eEc/ZM9rpMmTGomNmxaNj9+QT/39QL3zINPzDRoXDSlUfSl5dE05fH5CPFx4pNx2Ktz2DFiUzEVKj8VBAgMBMeVUscjRmUjw51ewxgwKBiWN6GWBQoPBZovtZoHDgkHEiQ2EoAbm4Di3z3i680m6ydOaSeyf82ydeqfdQkSGwmDHZ6DLFh0LBo0LhobNi0bbtyyblq07lqgW/ugUqT2Ujt2TTvWt2HWs33OsylSeynj3T7jL15xL4QTl4RTpvVT0blo0QAAAADtwSztIEBgIPzjH/yxecixW7btW2rUvmrLjUbLvmfZvjlySzlKlN5KTJjUTFiw6FjPhUrP0Ltr0O/FKu+qT+Wq++0W+0OGxUNNmtdNM2ZVM4URlIVFis9F+ekQ+QIEBgJ//oF/UKDwUDx4RDyfJbqfqEvjqFGi81GjXf6jQIDAQI8Fio+SP62SnSG8nThwSDj18QT1vGPfvLZ3wbbar3XaIUJjIRAgMBD/5Rr/8/0O89K/bdLNgUzNDBgUDBMmNRPswy/sX77hX5c1opdEiMxEFy45F8STV8SnVfKnfvyCfj16Rz1kyKxkXbrnXRkyKxlz5pVzYMCgYIEZmIFPntFP3KN/3CJEZiIqVH4qkDurkIgLg4hGjMpG7scp7rhr07gUKDwU3qd53l684l4LFh0L26122+DbO+AyZFYyOnROOgoUHgpJkttJBgwKBiRIbCRcuORcwp9dwtO9btOsQ++sYsSmYpE5qJGVMaSV5NM35Hnyi3nn1TLnyItDyDduWTdt2rdtjQGMjdWxZNVOnNJOqUngqWzYtGxWrPpW9PMH9OrPJeplyq9levSOeq5H6a4IEBgIum/VunjwiHglSm8lLlxyLhw4JBymV/GmtHPHtMaXUcboyyPo3aF83XTonHQfPiEfS5bdS71h3L2LDYaLig+FinDgkHA+fEI+tXHEtWbMqmZIkNhIAwYFA/b3AfYOHBIOYcKjYTVqXzVXrvlXuWnQuYYXkYbBmVjBHTonHZ4nuZ7h2Tjh+OsT+Jgrs5gRIjMRadK7admpcNmOB4mOlDOnlJsttpsePCIehxWSh+nJIOnOh0nOVar/VShQeCjfpXrfjAOPjKFZ+KGJCYCJDRoXDb9l2r/m1zHmQoTGQmjQuGhBgsNBmSmwmS1ady0PHhEPsHvLsFSo/FS7bda7Fiw6Fg==')); | ||
var AES3 = h.bytes2Int32Buffer(h.b64Decode('xqVjY/iEfHzumXd39o17e/8N8vLWvWtr3rFvb5FUxcVgUDAwAgMBAc6pZ2dWfSsr5xn+/rVi19dN5qur7Jp2do9FysofnYKCiUDJyfqHfX3vFfr6sutZWY7JR0f7C/DwQeytrbNn1NRf/aKiReqvryO/nJxT96Sk5JZycptbwMB1wre34Rz9/T2uk5NMaiYmbFo2Nn5BPz/1Avf3g0/MzGhcNDRR9KWl0TTl5fkI8fHik3Fxq3PY2GJTMTEqPxUVCAwEBJVSx8dGZSMjnV7DwzAoGBg3oZaWCg8FBS+1mpoOCQcHJDYSEhubgIDfPeLizSbr605pJyd/zbKy6p91dRIbCQkdnoODWHQsLDQuGho2LRsb3LJubrTuWlpb+6CgpPZSUnZNOzu3YdbWfc6zs1J7KSndPuPjXnEvLxOXhISm9VNTuWjR0QAAAADBLO3tQGAgIOMf/Px5yLGxtu1bW9S+amqNRsvLZ9m+vnJLOTmU3kpKmNRMTLDoWFiFSs/Pu2vQ0MUq7+9P5aqq7Rb7+4bFQ0Oa101NZlUzMxGUhYWKz0VF6RD5+QQGAgL+gX9/oPBQUHhEPDwlup+fS+OoqKLzUVFd/qOjgMBAQAWKj48/rZKSIbydnXBIODjxBPX1Y9+8vHfBtravddraQmMhISAwEBDlGv///Q7z879t0tKBTM3NGBQMDCY1ExPDL+zsvuFfXzWil5eIzERELjkXF5NXxMRV8qen/IJ+fnpHPT3IrGRkuuddXTIrGRnmlXNzwKBgYBmYgYGe0U9Po3/c3ERmIiJUfioqO6uQkAuDiIiMykZGxynu7mvTuLgoPBQUp3ne3rziXl4WHQsLrXbb29s74OBkVjIydE46OhQeCgqS20lJDAoGBkhsJCS45Fxcn13Cwr1u09ND76ysxKZiYjmokZExpJWV0zfk5PKLeXnVMufni0PIyG5ZNzfat21tAYyNjbFk1dWc0k5OSeCpqdi0bGys+lZW8wf09M8l6urKr2Vl9I56ekfprq4QGAgIb9W6uvCIeHhKbyUlXHIuLjgkHBxX8aamc8e0tJdRxsbLI+jooXzd3eicdHQ+IR8flt1LS2Hcvb0NhouLD4WKiuCQcHB8Qj4+ccS1tcyqZmaQ2EhIBgUDA/cB9vYcEg4OwqNhYWpfNTWu+VdXadC5uReRhoaZWMHBOicdHSe5np7ZOOHh6xP4+CuzmJgiMxER0rtpaalw2dkHiY6OM6eUlC22m5s8Ih4eFZKHh8kg6emHSc7Oqv9VVVB4KCilet/fA4+MjFn4oaEJgImJGhcNDWXav7/XMebmhMZCQtC4aGiCw0FBKbCZmVp3LS0eEQ8Pe8uwsKj8VFRt1ru7LDoWFg==')); | ||
// var AES0 = [ | ||
// 0xA56363C6, 0x847C7CF8, 0x997777EE, 0x8D7B7BF6, | ||
// 0x0DF2F2FF, 0xBD6B6BD6, 0xB16F6FDE, 0x54C5C591, | ||
// 0x50303060, 0x03010102, 0xA96767CE, 0x7D2B2B56, | ||
// 0x19FEFEE7, 0x62D7D7B5, 0xE6ABAB4D, 0x9A7676EC, | ||
// 0x45CACA8F, 0x9D82821F, 0x40C9C989, 0x877D7DFA, | ||
// 0x15FAFAEF, 0xEB5959B2, 0xC947478E, 0x0BF0F0FB, | ||
// 0xECADAD41, 0x67D4D4B3, 0xFDA2A25F, 0xEAAFAF45, | ||
// 0xBF9C9C23, 0xF7A4A453, 0x967272E4, 0x5BC0C09B, | ||
// 0xC2B7B775, 0x1CFDFDE1, 0xAE93933D, 0x6A26264C, | ||
// 0x5A36366C, 0x413F3F7E, 0x02F7F7F5, 0x4FCCCC83, | ||
// 0x5C343468, 0xF4A5A551, 0x34E5E5D1, 0x08F1F1F9, | ||
// 0x937171E2, 0x73D8D8AB, 0x53313162, 0x3F15152A, | ||
// 0x0C040408, 0x52C7C795, 0x65232346, 0x5EC3C39D, | ||
// 0x28181830, 0xA1969637, 0x0F05050A, 0xB59A9A2F, | ||
// 0x0907070E, 0x36121224, 0x9B80801B, 0x3DE2E2DF, | ||
// 0x26EBEBCD, 0x6927274E, 0xCDB2B27F, 0x9F7575EA, | ||
// 0x1B090912, 0x9E83831D, 0x742C2C58, 0x2E1A1A34, | ||
// 0x2D1B1B36, 0xB26E6EDC, 0xEE5A5AB4, 0xFBA0A05B, | ||
// 0xF65252A4, 0x4D3B3B76, 0x61D6D6B7, 0xCEB3B37D, | ||
// 0x7B292952, 0x3EE3E3DD, 0x712F2F5E, 0x97848413, | ||
// 0xF55353A6, 0x68D1D1B9, 0x00000000, 0x2CEDEDC1, | ||
// 0x60202040, 0x1FFCFCE3, 0xC8B1B179, 0xED5B5BB6, | ||
// 0xBE6A6AD4, 0x46CBCB8D, 0xD9BEBE67, 0x4B393972, | ||
// 0xDE4A4A94, 0xD44C4C98, 0xE85858B0, 0x4ACFCF85, | ||
// 0x6BD0D0BB, 0x2AEFEFC5, 0xE5AAAA4F, 0x16FBFBED, | ||
// 0xC5434386, 0xD74D4D9A, 0x55333366, 0x94858511, | ||
// 0xCF45458A, 0x10F9F9E9, 0x06020204, 0x817F7FFE, | ||
// 0xF05050A0, 0x443C3C78, 0xBA9F9F25, 0xE3A8A84B, | ||
// 0xF35151A2, 0xFEA3A35D, 0xC0404080, 0x8A8F8F05, | ||
// 0xAD92923F, 0xBC9D9D21, 0x48383870, 0x04F5F5F1, | ||
// 0xDFBCBC63, 0xC1B6B677, 0x75DADAAF, 0x63212142, | ||
// 0x30101020, 0x1AFFFFE5, 0x0EF3F3FD, 0x6DD2D2BF, | ||
// 0x4CCDCD81, 0x140C0C18, 0x35131326, 0x2FECECC3, | ||
// 0xE15F5FBE, 0xA2979735, 0xCC444488, 0x3917172E, | ||
// 0x57C4C493, 0xF2A7A755, 0x827E7EFC, 0x473D3D7A, | ||
// 0xAC6464C8, 0xE75D5DBA, 0x2B191932, 0x957373E6, | ||
// 0xA06060C0, 0x98818119, 0xD14F4F9E, 0x7FDCDCA3, | ||
// 0x66222244, 0x7E2A2A54, 0xAB90903B, 0x8388880B, | ||
// 0xCA46468C, 0x29EEEEC7, 0xD3B8B86B, 0x3C141428, | ||
// 0x79DEDEA7, 0xE25E5EBC, 0x1D0B0B16, 0x76DBDBAD, | ||
// 0x3BE0E0DB, 0x56323264, 0x4E3A3A74, 0x1E0A0A14, | ||
// 0xDB494992, 0x0A06060C, 0x6C242448, 0xE45C5CB8, | ||
// 0x5DC2C29F, 0x6ED3D3BD, 0xEFACAC43, 0xA66262C4, | ||
// 0xA8919139, 0xA4959531, 0x37E4E4D3, 0x8B7979F2, | ||
// 0x32E7E7D5, 0x43C8C88B, 0x5937376E, 0xB76D6DDA, | ||
// 0x8C8D8D01, 0x64D5D5B1, 0xD24E4E9C, 0xE0A9A949, | ||
// 0xB46C6CD8, 0xFA5656AC, 0x07F4F4F3, 0x25EAEACF, | ||
// 0xAF6565CA, 0x8E7A7AF4, 0xE9AEAE47, 0x18080810, | ||
// 0xD5BABA6F, 0x887878F0, 0x6F25254A, 0x722E2E5C, | ||
// 0x241C1C38, 0xF1A6A657, 0xC7B4B473, 0x51C6C697, | ||
// 0x23E8E8CB, 0x7CDDDDA1, 0x9C7474E8, 0x211F1F3E, | ||
// 0xDD4B4B96, 0xDCBDBD61, 0x868B8B0D, 0x858A8A0F, | ||
// 0x907070E0, 0x423E3E7C, 0xC4B5B571, 0xAA6666CC, | ||
// 0xD8484890, 0x05030306, 0x01F6F6F7, 0x120E0E1C, | ||
// 0xA36161C2, 0x5F35356A, 0xF95757AE, 0xD0B9B969, | ||
// 0x91868617, 0x58C1C199, 0x271D1D3A, 0xB99E9E27, | ||
// 0x38E1E1D9, 0x13F8F8EB, 0xB398982B, 0x33111122, | ||
// 0xBB6969D2, 0x70D9D9A9, 0x898E8E07, 0xA7949433, | ||
// 0xB69B9B2D, 0x221E1E3C, 0x92878715, 0x20E9E9C9, | ||
// 0x49CECE87, 0xFF5555AA, 0x78282850, 0x7ADFDFA5, | ||
// 0x8F8C8C03, 0xF8A1A159, 0x80898909, 0x170D0D1A, | ||
// 0xDABFBF65, 0x31E6E6D7, 0xC6424284, 0xB86868D0, | ||
// 0xC3414182, 0xB0999929, 0x772D2D5A, 0x110F0F1E, | ||
// 0xCBB0B07B, 0xFC5454A8, 0xD6BBBB6D, 0x3A16162C | ||
// ]; | ||
var AES1 = [ | ||
0x6363C6A5, 0x7C7CF884, 0x7777EE99, 0x7B7BF68D, | ||
0xF2F2FF0D, 0x6B6BD6BD, 0x6F6FDEB1, 0xC5C59154, | ||
0x30306050, 0x01010203, 0x6767CEA9, 0x2B2B567D, | ||
0xFEFEE719, 0xD7D7B562, 0xABAB4DE6, 0x7676EC9A, | ||
0xCACA8F45, 0x82821F9D, 0xC9C98940, 0x7D7DFA87, | ||
0xFAFAEF15, 0x5959B2EB, 0x47478EC9, 0xF0F0FB0B, | ||
0xADAD41EC, 0xD4D4B367, 0xA2A25FFD, 0xAFAF45EA, | ||
0x9C9C23BF, 0xA4A453F7, 0x7272E496, 0xC0C09B5B, | ||
0xB7B775C2, 0xFDFDE11C, 0x93933DAE, 0x26264C6A, | ||
0x36366C5A, 0x3F3F7E41, 0xF7F7F502, 0xCCCC834F, | ||
0x3434685C, 0xA5A551F4, 0xE5E5D134, 0xF1F1F908, | ||
0x7171E293, 0xD8D8AB73, 0x31316253, 0x15152A3F, | ||
0x0404080C, 0xC7C79552, 0x23234665, 0xC3C39D5E, | ||
0x18183028, 0x969637A1, 0x05050A0F, 0x9A9A2FB5, | ||
0x07070E09, 0x12122436, 0x80801B9B, 0xE2E2DF3D, | ||
0xEBEBCD26, 0x27274E69, 0xB2B27FCD, 0x7575EA9F, | ||
0x0909121B, 0x83831D9E, 0x2C2C5874, 0x1A1A342E, | ||
0x1B1B362D, 0x6E6EDCB2, 0x5A5AB4EE, 0xA0A05BFB, | ||
0x5252A4F6, 0x3B3B764D, 0xD6D6B761, 0xB3B37DCE, | ||
0x2929527B, 0xE3E3DD3E, 0x2F2F5E71, 0x84841397, | ||
0x5353A6F5, 0xD1D1B968, 0x00000000, 0xEDEDC12C, | ||
0x20204060, 0xFCFCE31F, 0xB1B179C8, 0x5B5BB6ED, | ||
0x6A6AD4BE, 0xCBCB8D46, 0xBEBE67D9, 0x3939724B, | ||
0x4A4A94DE, 0x4C4C98D4, 0x5858B0E8, 0xCFCF854A, | ||
0xD0D0BB6B, 0xEFEFC52A, 0xAAAA4FE5, 0xFBFBED16, | ||
0x434386C5, 0x4D4D9AD7, 0x33336655, 0x85851194, | ||
0x45458ACF, 0xF9F9E910, 0x02020406, 0x7F7FFE81, | ||
0x5050A0F0, 0x3C3C7844, 0x9F9F25BA, 0xA8A84BE3, | ||
0x5151A2F3, 0xA3A35DFE, 0x404080C0, 0x8F8F058A, | ||
0x92923FAD, 0x9D9D21BC, 0x38387048, 0xF5F5F104, | ||
0xBCBC63DF, 0xB6B677C1, 0xDADAAF75, 0x21214263, | ||
0x10102030, 0xFFFFE51A, 0xF3F3FD0E, 0xD2D2BF6D, | ||
0xCDCD814C, 0x0C0C1814, 0x13132635, 0xECECC32F, | ||
0x5F5FBEE1, 0x979735A2, 0x444488CC, 0x17172E39, | ||
0xC4C49357, 0xA7A755F2, 0x7E7EFC82, 0x3D3D7A47, | ||
0x6464C8AC, 0x5D5DBAE7, 0x1919322B, 0x7373E695, | ||
0x6060C0A0, 0x81811998, 0x4F4F9ED1, 0xDCDCA37F, | ||
0x22224466, 0x2A2A547E, 0x90903BAB, 0x88880B83, | ||
0x46468CCA, 0xEEEEC729, 0xB8B86BD3, 0x1414283C, | ||
0xDEDEA779, 0x5E5EBCE2, 0x0B0B161D, 0xDBDBAD76, | ||
0xE0E0DB3B, 0x32326456, 0x3A3A744E, 0x0A0A141E, | ||
0x494992DB, 0x06060C0A, 0x2424486C, 0x5C5CB8E4, | ||
0xC2C29F5D, 0xD3D3BD6E, 0xACAC43EF, 0x6262C4A6, | ||
0x919139A8, 0x959531A4, 0xE4E4D337, 0x7979F28B, | ||
0xE7E7D532, 0xC8C88B43, 0x37376E59, 0x6D6DDAB7, | ||
0x8D8D018C, 0xD5D5B164, 0x4E4E9CD2, 0xA9A949E0, | ||
0x6C6CD8B4, 0x5656ACFA, 0xF4F4F307, 0xEAEACF25, | ||
0x6565CAAF, 0x7A7AF48E, 0xAEAE47E9, 0x08081018, | ||
0xBABA6FD5, 0x7878F088, 0x25254A6F, 0x2E2E5C72, | ||
0x1C1C3824, 0xA6A657F1, 0xB4B473C7, 0xC6C69751, | ||
0xE8E8CB23, 0xDDDDA17C, 0x7474E89C, 0x1F1F3E21, | ||
0x4B4B96DD, 0xBDBD61DC, 0x8B8B0D86, 0x8A8A0F85, | ||
0x7070E090, 0x3E3E7C42, 0xB5B571C4, 0x6666CCAA, | ||
0x484890D8, 0x03030605, 0xF6F6F701, 0x0E0E1C12, | ||
0x6161C2A3, 0x35356A5F, 0x5757AEF9, 0xB9B969D0, | ||
0x86861791, 0xC1C19958, 0x1D1D3A27, 0x9E9E27B9, | ||
0xE1E1D938, 0xF8F8EB13, 0x98982BB3, 0x11112233, | ||
0x6969D2BB, 0xD9D9A970, 0x8E8E0789, 0x949433A7, | ||
0x9B9B2DB6, 0x1E1E3C22, 0x87871592, 0xE9E9C920, | ||
0xCECE8749, 0x5555AAFF, 0x28285078, 0xDFDFA57A, | ||
0x8C8C038F, 0xA1A159F8, 0x89890980, 0x0D0D1A17, | ||
0xBFBF65DA, 0xE6E6D731, 0x424284C6, 0x6868D0B8, | ||
0x414182C3, 0x999929B0, 0x2D2D5A77, 0x0F0F1E11, | ||
0xB0B07BCB, 0x5454A8FC, 0xBBBB6DD6, 0x16162C3A | ||
]; | ||
// var AES1 = [ | ||
// 0x6363C6A5, 0x7C7CF884, 0x7777EE99, 0x7B7BF68D, | ||
// 0xF2F2FF0D, 0x6B6BD6BD, 0x6F6FDEB1, 0xC5C59154, | ||
// 0x30306050, 0x01010203, 0x6767CEA9, 0x2B2B567D, | ||
// 0xFEFEE719, 0xD7D7B562, 0xABAB4DE6, 0x7676EC9A, | ||
// 0xCACA8F45, 0x82821F9D, 0xC9C98940, 0x7D7DFA87, | ||
// 0xFAFAEF15, 0x5959B2EB, 0x47478EC9, 0xF0F0FB0B, | ||
// 0xADAD41EC, 0xD4D4B367, 0xA2A25FFD, 0xAFAF45EA, | ||
// 0x9C9C23BF, 0xA4A453F7, 0x7272E496, 0xC0C09B5B, | ||
// 0xB7B775C2, 0xFDFDE11C, 0x93933DAE, 0x26264C6A, | ||
// 0x36366C5A, 0x3F3F7E41, 0xF7F7F502, 0xCCCC834F, | ||
// 0x3434685C, 0xA5A551F4, 0xE5E5D134, 0xF1F1F908, | ||
// 0x7171E293, 0xD8D8AB73, 0x31316253, 0x15152A3F, | ||
// 0x0404080C, 0xC7C79552, 0x23234665, 0xC3C39D5E, | ||
// 0x18183028, 0x969637A1, 0x05050A0F, 0x9A9A2FB5, | ||
// 0x07070E09, 0x12122436, 0x80801B9B, 0xE2E2DF3D, | ||
// 0xEBEBCD26, 0x27274E69, 0xB2B27FCD, 0x7575EA9F, | ||
// 0x0909121B, 0x83831D9E, 0x2C2C5874, 0x1A1A342E, | ||
// 0x1B1B362D, 0x6E6EDCB2, 0x5A5AB4EE, 0xA0A05BFB, | ||
// 0x5252A4F6, 0x3B3B764D, 0xD6D6B761, 0xB3B37DCE, | ||
// 0x2929527B, 0xE3E3DD3E, 0x2F2F5E71, 0x84841397, | ||
// 0x5353A6F5, 0xD1D1B968, 0x00000000, 0xEDEDC12C, | ||
// 0x20204060, 0xFCFCE31F, 0xB1B179C8, 0x5B5BB6ED, | ||
// 0x6A6AD4BE, 0xCBCB8D46, 0xBEBE67D9, 0x3939724B, | ||
// 0x4A4A94DE, 0x4C4C98D4, 0x5858B0E8, 0xCFCF854A, | ||
// 0xD0D0BB6B, 0xEFEFC52A, 0xAAAA4FE5, 0xFBFBED16, | ||
// 0x434386C5, 0x4D4D9AD7, 0x33336655, 0x85851194, | ||
// 0x45458ACF, 0xF9F9E910, 0x02020406, 0x7F7FFE81, | ||
// 0x5050A0F0, 0x3C3C7844, 0x9F9F25BA, 0xA8A84BE3, | ||
// 0x5151A2F3, 0xA3A35DFE, 0x404080C0, 0x8F8F058A, | ||
// 0x92923FAD, 0x9D9D21BC, 0x38387048, 0xF5F5F104, | ||
// 0xBCBC63DF, 0xB6B677C1, 0xDADAAF75, 0x21214263, | ||
// 0x10102030, 0xFFFFE51A, 0xF3F3FD0E, 0xD2D2BF6D, | ||
// 0xCDCD814C, 0x0C0C1814, 0x13132635, 0xECECC32F, | ||
// 0x5F5FBEE1, 0x979735A2, 0x444488CC, 0x17172E39, | ||
// 0xC4C49357, 0xA7A755F2, 0x7E7EFC82, 0x3D3D7A47, | ||
// 0x6464C8AC, 0x5D5DBAE7, 0x1919322B, 0x7373E695, | ||
// 0x6060C0A0, 0x81811998, 0x4F4F9ED1, 0xDCDCA37F, | ||
// 0x22224466, 0x2A2A547E, 0x90903BAB, 0x88880B83, | ||
// 0x46468CCA, 0xEEEEC729, 0xB8B86BD3, 0x1414283C, | ||
// 0xDEDEA779, 0x5E5EBCE2, 0x0B0B161D, 0xDBDBAD76, | ||
// 0xE0E0DB3B, 0x32326456, 0x3A3A744E, 0x0A0A141E, | ||
// 0x494992DB, 0x06060C0A, 0x2424486C, 0x5C5CB8E4, | ||
// 0xC2C29F5D, 0xD3D3BD6E, 0xACAC43EF, 0x6262C4A6, | ||
// 0x919139A8, 0x959531A4, 0xE4E4D337, 0x7979F28B, | ||
// 0xE7E7D532, 0xC8C88B43, 0x37376E59, 0x6D6DDAB7, | ||
// 0x8D8D018C, 0xD5D5B164, 0x4E4E9CD2, 0xA9A949E0, | ||
// 0x6C6CD8B4, 0x5656ACFA, 0xF4F4F307, 0xEAEACF25, | ||
// 0x6565CAAF, 0x7A7AF48E, 0xAEAE47E9, 0x08081018, | ||
// 0xBABA6FD5, 0x7878F088, 0x25254A6F, 0x2E2E5C72, | ||
// 0x1C1C3824, 0xA6A657F1, 0xB4B473C7, 0xC6C69751, | ||
// 0xE8E8CB23, 0xDDDDA17C, 0x7474E89C, 0x1F1F3E21, | ||
// 0x4B4B96DD, 0xBDBD61DC, 0x8B8B0D86, 0x8A8A0F85, | ||
// 0x7070E090, 0x3E3E7C42, 0xB5B571C4, 0x6666CCAA, | ||
// 0x484890D8, 0x03030605, 0xF6F6F701, 0x0E0E1C12, | ||
// 0x6161C2A3, 0x35356A5F, 0x5757AEF9, 0xB9B969D0, | ||
// 0x86861791, 0xC1C19958, 0x1D1D3A27, 0x9E9E27B9, | ||
// 0xE1E1D938, 0xF8F8EB13, 0x98982BB3, 0x11112233, | ||
// 0x6969D2BB, 0xD9D9A970, 0x8E8E0789, 0x949433A7, | ||
// 0x9B9B2DB6, 0x1E1E3C22, 0x87871592, 0xE9E9C920, | ||
// 0xCECE8749, 0x5555AAFF, 0x28285078, 0xDFDFA57A, | ||
// 0x8C8C038F, 0xA1A159F8, 0x89890980, 0x0D0D1A17, | ||
// 0xBFBF65DA, 0xE6E6D731, 0x424284C6, 0x6868D0B8, | ||
// 0x414182C3, 0x999929B0, 0x2D2D5A77, 0x0F0F1E11, | ||
// 0xB0B07BCB, 0x5454A8FC, 0xBBBB6DD6, 0x16162C3A | ||
// ]; | ||
var AES2 = [ | ||
0x63C6A563, 0x7CF8847C, 0x77EE9977, 0x7BF68D7B, | ||
0xF2FF0DF2, 0x6BD6BD6B, 0x6FDEB16F, 0xC59154C5, | ||
0x30605030, 0x01020301, 0x67CEA967, 0x2B567D2B, | ||
0xFEE719FE, 0xD7B562D7, 0xAB4DE6AB, 0x76EC9A76, | ||
0xCA8F45CA, 0x821F9D82, 0xC98940C9, 0x7DFA877D, | ||
0xFAEF15FA, 0x59B2EB59, 0x478EC947, 0xF0FB0BF0, | ||
0xAD41ECAD, 0xD4B367D4, 0xA25FFDA2, 0xAF45EAAF, | ||
0x9C23BF9C, 0xA453F7A4, 0x72E49672, 0xC09B5BC0, | ||
0xB775C2B7, 0xFDE11CFD, 0x933DAE93, 0x264C6A26, | ||
0x366C5A36, 0x3F7E413F, 0xF7F502F7, 0xCC834FCC, | ||
0x34685C34, 0xA551F4A5, 0xE5D134E5, 0xF1F908F1, | ||
0x71E29371, 0xD8AB73D8, 0x31625331, 0x152A3F15, | ||
0x04080C04, 0xC79552C7, 0x23466523, 0xC39D5EC3, | ||
0x18302818, 0x9637A196, 0x050A0F05, 0x9A2FB59A, | ||
0x070E0907, 0x12243612, 0x801B9B80, 0xE2DF3DE2, | ||
0xEBCD26EB, 0x274E6927, 0xB27FCDB2, 0x75EA9F75, | ||
0x09121B09, 0x831D9E83, 0x2C58742C, 0x1A342E1A, | ||
0x1B362D1B, 0x6EDCB26E, 0x5AB4EE5A, 0xA05BFBA0, | ||
0x52A4F652, 0x3B764D3B, 0xD6B761D6, 0xB37DCEB3, | ||
0x29527B29, 0xE3DD3EE3, 0x2F5E712F, 0x84139784, | ||
0x53A6F553, 0xD1B968D1, 0x00000000, 0xEDC12CED, | ||
0x20406020, 0xFCE31FFC, 0xB179C8B1, 0x5BB6ED5B, | ||
0x6AD4BE6A, 0xCB8D46CB, 0xBE67D9BE, 0x39724B39, | ||
0x4A94DE4A, 0x4C98D44C, 0x58B0E858, 0xCF854ACF, | ||
0xD0BB6BD0, 0xEFC52AEF, 0xAA4FE5AA, 0xFBED16FB, | ||
0x4386C543, 0x4D9AD74D, 0x33665533, 0x85119485, | ||
0x458ACF45, 0xF9E910F9, 0x02040602, 0x7FFE817F, | ||
0x50A0F050, 0x3C78443C, 0x9F25BA9F, 0xA84BE3A8, | ||
0x51A2F351, 0xA35DFEA3, 0x4080C040, 0x8F058A8F, | ||
0x923FAD92, 0x9D21BC9D, 0x38704838, 0xF5F104F5, | ||
0xBC63DFBC, 0xB677C1B6, 0xDAAF75DA, 0x21426321, | ||
0x10203010, 0xFFE51AFF, 0xF3FD0EF3, 0xD2BF6DD2, | ||
0xCD814CCD, 0x0C18140C, 0x13263513, 0xECC32FEC, | ||
0x5FBEE15F, 0x9735A297, 0x4488CC44, 0x172E3917, | ||
0xC49357C4, 0xA755F2A7, 0x7EFC827E, 0x3D7A473D, | ||
0x64C8AC64, 0x5DBAE75D, 0x19322B19, 0x73E69573, | ||
0x60C0A060, 0x81199881, 0x4F9ED14F, 0xDCA37FDC, | ||
0x22446622, 0x2A547E2A, 0x903BAB90, 0x880B8388, | ||
0x468CCA46, 0xEEC729EE, 0xB86BD3B8, 0x14283C14, | ||
0xDEA779DE, 0x5EBCE25E, 0x0B161D0B, 0xDBAD76DB, | ||
0xE0DB3BE0, 0x32645632, 0x3A744E3A, 0x0A141E0A, | ||
0x4992DB49, 0x060C0A06, 0x24486C24, 0x5CB8E45C, | ||
0xC29F5DC2, 0xD3BD6ED3, 0xAC43EFAC, 0x62C4A662, | ||
0x9139A891, 0x9531A495, 0xE4D337E4, 0x79F28B79, | ||
0xE7D532E7, 0xC88B43C8, 0x376E5937, 0x6DDAB76D, | ||
0x8D018C8D, 0xD5B164D5, 0x4E9CD24E, 0xA949E0A9, | ||
0x6CD8B46C, 0x56ACFA56, 0xF4F307F4, 0xEACF25EA, | ||
0x65CAAF65, 0x7AF48E7A, 0xAE47E9AE, 0x08101808, | ||
0xBA6FD5BA, 0x78F08878, 0x254A6F25, 0x2E5C722E, | ||
0x1C38241C, 0xA657F1A6, 0xB473C7B4, 0xC69751C6, | ||
0xE8CB23E8, 0xDDA17CDD, 0x74E89C74, 0x1F3E211F, | ||
0x4B96DD4B, 0xBD61DCBD, 0x8B0D868B, 0x8A0F858A, | ||
0x70E09070, 0x3E7C423E, 0xB571C4B5, 0x66CCAA66, | ||
0x4890D848, 0x03060503, 0xF6F701F6, 0x0E1C120E, | ||
0x61C2A361, 0x356A5F35, 0x57AEF957, 0xB969D0B9, | ||
0x86179186, 0xC19958C1, 0x1D3A271D, 0x9E27B99E, | ||
0xE1D938E1, 0xF8EB13F8, 0x982BB398, 0x11223311, | ||
0x69D2BB69, 0xD9A970D9, 0x8E07898E, 0x9433A794, | ||
0x9B2DB69B, 0x1E3C221E, 0x87159287, 0xE9C920E9, | ||
0xCE8749CE, 0x55AAFF55, 0x28507828, 0xDFA57ADF, | ||
0x8C038F8C, 0xA159F8A1, 0x89098089, 0x0D1A170D, | ||
0xBF65DABF, 0xE6D731E6, 0x4284C642, 0x68D0B868, | ||
0x4182C341, 0x9929B099, 0x2D5A772D, 0x0F1E110F, | ||
0xB07BCBB0, 0x54A8FC54, 0xBB6DD6BB, 0x162C3A16 | ||
]; | ||
// var AES2 = [ | ||
// 0x63C6A563, 0x7CF8847C, 0x77EE9977, 0x7BF68D7B, | ||
// 0xF2FF0DF2, 0x6BD6BD6B, 0x6FDEB16F, 0xC59154C5, | ||
// 0x30605030, 0x01020301, 0x67CEA967, 0x2B567D2B, | ||
// 0xFEE719FE, 0xD7B562D7, 0xAB4DE6AB, 0x76EC9A76, | ||
// 0xCA8F45CA, 0x821F9D82, 0xC98940C9, 0x7DFA877D, | ||
// 0xFAEF15FA, 0x59B2EB59, 0x478EC947, 0xF0FB0BF0, | ||
// 0xAD41ECAD, 0xD4B367D4, 0xA25FFDA2, 0xAF45EAAF, | ||
// 0x9C23BF9C, 0xA453F7A4, 0x72E49672, 0xC09B5BC0, | ||
// 0xB775C2B7, 0xFDE11CFD, 0x933DAE93, 0x264C6A26, | ||
// 0x366C5A36, 0x3F7E413F, 0xF7F502F7, 0xCC834FCC, | ||
// 0x34685C34, 0xA551F4A5, 0xE5D134E5, 0xF1F908F1, | ||
// 0x71E29371, 0xD8AB73D8, 0x31625331, 0x152A3F15, | ||
// 0x04080C04, 0xC79552C7, 0x23466523, 0xC39D5EC3, | ||
// 0x18302818, 0x9637A196, 0x050A0F05, 0x9A2FB59A, | ||
// 0x070E0907, 0x12243612, 0x801B9B80, 0xE2DF3DE2, | ||
// 0xEBCD26EB, 0x274E6927, 0xB27FCDB2, 0x75EA9F75, | ||
// 0x09121B09, 0x831D9E83, 0x2C58742C, 0x1A342E1A, | ||
// 0x1B362D1B, 0x6EDCB26E, 0x5AB4EE5A, 0xA05BFBA0, | ||
// 0x52A4F652, 0x3B764D3B, 0xD6B761D6, 0xB37DCEB3, | ||
// 0x29527B29, 0xE3DD3EE3, 0x2F5E712F, 0x84139784, | ||
// 0x53A6F553, 0xD1B968D1, 0x00000000, 0xEDC12CED, | ||
// 0x20406020, 0xFCE31FFC, 0xB179C8B1, 0x5BB6ED5B, | ||
// 0x6AD4BE6A, 0xCB8D46CB, 0xBE67D9BE, 0x39724B39, | ||
// 0x4A94DE4A, 0x4C98D44C, 0x58B0E858, 0xCF854ACF, | ||
// 0xD0BB6BD0, 0xEFC52AEF, 0xAA4FE5AA, 0xFBED16FB, | ||
// 0x4386C543, 0x4D9AD74D, 0x33665533, 0x85119485, | ||
// 0x458ACF45, 0xF9E910F9, 0x02040602, 0x7FFE817F, | ||
// 0x50A0F050, 0x3C78443C, 0x9F25BA9F, 0xA84BE3A8, | ||
// 0x51A2F351, 0xA35DFEA3, 0x4080C040, 0x8F058A8F, | ||
// 0x923FAD92, 0x9D21BC9D, 0x38704838, 0xF5F104F5, | ||
// 0xBC63DFBC, 0xB677C1B6, 0xDAAF75DA, 0x21426321, | ||
// 0x10203010, 0xFFE51AFF, 0xF3FD0EF3, 0xD2BF6DD2, | ||
// 0xCD814CCD, 0x0C18140C, 0x13263513, 0xECC32FEC, | ||
// 0x5FBEE15F, 0x9735A297, 0x4488CC44, 0x172E3917, | ||
// 0xC49357C4, 0xA755F2A7, 0x7EFC827E, 0x3D7A473D, | ||
// 0x64C8AC64, 0x5DBAE75D, 0x19322B19, 0x73E69573, | ||
// 0x60C0A060, 0x81199881, 0x4F9ED14F, 0xDCA37FDC, | ||
// 0x22446622, 0x2A547E2A, 0x903BAB90, 0x880B8388, | ||
// 0x468CCA46, 0xEEC729EE, 0xB86BD3B8, 0x14283C14, | ||
// 0xDEA779DE, 0x5EBCE25E, 0x0B161D0B, 0xDBAD76DB, | ||
// 0xE0DB3BE0, 0x32645632, 0x3A744E3A, 0x0A141E0A, | ||
// 0x4992DB49, 0x060C0A06, 0x24486C24, 0x5CB8E45C, | ||
// 0xC29F5DC2, 0xD3BD6ED3, 0xAC43EFAC, 0x62C4A662, | ||
// 0x9139A891, 0x9531A495, 0xE4D337E4, 0x79F28B79, | ||
// 0xE7D532E7, 0xC88B43C8, 0x376E5937, 0x6DDAB76D, | ||
// 0x8D018C8D, 0xD5B164D5, 0x4E9CD24E, 0xA949E0A9, | ||
// 0x6CD8B46C, 0x56ACFA56, 0xF4F307F4, 0xEACF25EA, | ||
// 0x65CAAF65, 0x7AF48E7A, 0xAE47E9AE, 0x08101808, | ||
// 0xBA6FD5BA, 0x78F08878, 0x254A6F25, 0x2E5C722E, | ||
// 0x1C38241C, 0xA657F1A6, 0xB473C7B4, 0xC69751C6, | ||
// 0xE8CB23E8, 0xDDA17CDD, 0x74E89C74, 0x1F3E211F, | ||
// 0x4B96DD4B, 0xBD61DCBD, 0x8B0D868B, 0x8A0F858A, | ||
// 0x70E09070, 0x3E7C423E, 0xB571C4B5, 0x66CCAA66, | ||
// 0x4890D848, 0x03060503, 0xF6F701F6, 0x0E1C120E, | ||
// 0x61C2A361, 0x356A5F35, 0x57AEF957, 0xB969D0B9, | ||
// 0x86179186, 0xC19958C1, 0x1D3A271D, 0x9E27B99E, | ||
// 0xE1D938E1, 0xF8EB13F8, 0x982BB398, 0x11223311, | ||
// 0x69D2BB69, 0xD9A970D9, 0x8E07898E, 0x9433A794, | ||
// 0x9B2DB69B, 0x1E3C221E, 0x87159287, 0xE9C920E9, | ||
// 0xCE8749CE, 0x55AAFF55, 0x28507828, 0xDFA57ADF, | ||
// 0x8C038F8C, 0xA159F8A1, 0x89098089, 0x0D1A170D, | ||
// 0xBF65DABF, 0xE6D731E6, 0x4284C642, 0x68D0B868, | ||
// 0x4182C341, 0x9929B099, 0x2D5A772D, 0x0F1E110F, | ||
// 0xB07BCBB0, 0x54A8FC54, 0xBB6DD6BB, 0x162C3A16 | ||
// ]; | ||
var AES3 = [ | ||
0xC6A56363, 0xF8847C7C, 0xEE997777, 0xF68D7B7B, | ||
0xFF0DF2F2, 0xD6BD6B6B, 0xDEB16F6F, 0x9154C5C5, | ||
0x60503030, 0x02030101, 0xCEA96767, 0x567D2B2B, | ||
0xE719FEFE, 0xB562D7D7, 0x4DE6ABAB, 0xEC9A7676, | ||
0x8F45CACA, 0x1F9D8282, 0x8940C9C9, 0xFA877D7D, | ||
0xEF15FAFA, 0xB2EB5959, 0x8EC94747, 0xFB0BF0F0, | ||
0x41ECADAD, 0xB367D4D4, 0x5FFDA2A2, 0x45EAAFAF, | ||
0x23BF9C9C, 0x53F7A4A4, 0xE4967272, 0x9B5BC0C0, | ||
0x75C2B7B7, 0xE11CFDFD, 0x3DAE9393, 0x4C6A2626, | ||
0x6C5A3636, 0x7E413F3F, 0xF502F7F7, 0x834FCCCC, | ||
0x685C3434, 0x51F4A5A5, 0xD134E5E5, 0xF908F1F1, | ||
0xE2937171, 0xAB73D8D8, 0x62533131, 0x2A3F1515, | ||
0x080C0404, 0x9552C7C7, 0x46652323, 0x9D5EC3C3, | ||
0x30281818, 0x37A19696, 0x0A0F0505, 0x2FB59A9A, | ||
0x0E090707, 0x24361212, 0x1B9B8080, 0xDF3DE2E2, | ||
0xCD26EBEB, 0x4E692727, 0x7FCDB2B2, 0xEA9F7575, | ||
0x121B0909, 0x1D9E8383, 0x58742C2C, 0x342E1A1A, | ||
0x362D1B1B, 0xDCB26E6E, 0xB4EE5A5A, 0x5BFBA0A0, | ||
0xA4F65252, 0x764D3B3B, 0xB761D6D6, 0x7DCEB3B3, | ||
0x527B2929, 0xDD3EE3E3, 0x5E712F2F, 0x13978484, | ||
0xA6F55353, 0xB968D1D1, 0x00000000, 0xC12CEDED, | ||
0x40602020, 0xE31FFCFC, 0x79C8B1B1, 0xB6ED5B5B, | ||
0xD4BE6A6A, 0x8D46CBCB, 0x67D9BEBE, 0x724B3939, | ||
0x94DE4A4A, 0x98D44C4C, 0xB0E85858, 0x854ACFCF, | ||
0xBB6BD0D0, 0xC52AEFEF, 0x4FE5AAAA, 0xED16FBFB, | ||
0x86C54343, 0x9AD74D4D, 0x66553333, 0x11948585, | ||
0x8ACF4545, 0xE910F9F9, 0x04060202, 0xFE817F7F, | ||
0xA0F05050, 0x78443C3C, 0x25BA9F9F, 0x4BE3A8A8, | ||
0xA2F35151, 0x5DFEA3A3, 0x80C04040, 0x058A8F8F, | ||
0x3FAD9292, 0x21BC9D9D, 0x70483838, 0xF104F5F5, | ||
0x63DFBCBC, 0x77C1B6B6, 0xAF75DADA, 0x42632121, | ||
0x20301010, 0xE51AFFFF, 0xFD0EF3F3, 0xBF6DD2D2, | ||
0x814CCDCD, 0x18140C0C, 0x26351313, 0xC32FECEC, | ||
0xBEE15F5F, 0x35A29797, 0x88CC4444, 0x2E391717, | ||
0x9357C4C4, 0x55F2A7A7, 0xFC827E7E, 0x7A473D3D, | ||
0xC8AC6464, 0xBAE75D5D, 0x322B1919, 0xE6957373, | ||
0xC0A06060, 0x19988181, 0x9ED14F4F, 0xA37FDCDC, | ||
0x44662222, 0x547E2A2A, 0x3BAB9090, 0x0B838888, | ||
0x8CCA4646, 0xC729EEEE, 0x6BD3B8B8, 0x283C1414, | ||
0xA779DEDE, 0xBCE25E5E, 0x161D0B0B, 0xAD76DBDB, | ||
0xDB3BE0E0, 0x64563232, 0x744E3A3A, 0x141E0A0A, | ||
0x92DB4949, 0x0C0A0606, 0x486C2424, 0xB8E45C5C, | ||
0x9F5DC2C2, 0xBD6ED3D3, 0x43EFACAC, 0xC4A66262, | ||
0x39A89191, 0x31A49595, 0xD337E4E4, 0xF28B7979, | ||
0xD532E7E7, 0x8B43C8C8, 0x6E593737, 0xDAB76D6D, | ||
0x018C8D8D, 0xB164D5D5, 0x9CD24E4E, 0x49E0A9A9, | ||
0xD8B46C6C, 0xACFA5656, 0xF307F4F4, 0xCF25EAEA, | ||
0xCAAF6565, 0xF48E7A7A, 0x47E9AEAE, 0x10180808, | ||
0x6FD5BABA, 0xF0887878, 0x4A6F2525, 0x5C722E2E, | ||
0x38241C1C, 0x57F1A6A6, 0x73C7B4B4, 0x9751C6C6, | ||
0xCB23E8E8, 0xA17CDDDD, 0xE89C7474, 0x3E211F1F, | ||
0x96DD4B4B, 0x61DCBDBD, 0x0D868B8B, 0x0F858A8A, | ||
0xE0907070, 0x7C423E3E, 0x71C4B5B5, 0xCCAA6666, | ||
0x90D84848, 0x06050303, 0xF701F6F6, 0x1C120E0E, | ||
0xC2A36161, 0x6A5F3535, 0xAEF95757, 0x69D0B9B9, | ||
0x17918686, 0x9958C1C1, 0x3A271D1D, 0x27B99E9E, | ||
0xD938E1E1, 0xEB13F8F8, 0x2BB39898, 0x22331111, | ||
0xD2BB6969, 0xA970D9D9, 0x07898E8E, 0x33A79494, | ||
0x2DB69B9B, 0x3C221E1E, 0x15928787, 0xC920E9E9, | ||
0x8749CECE, 0xAAFF5555, 0x50782828, 0xA57ADFDF, | ||
0x038F8C8C, 0x59F8A1A1, 0x09808989, 0x1A170D0D, | ||
0x65DABFBF, 0xD731E6E6, 0x84C64242, 0xD0B86868, | ||
0x82C34141, 0x29B09999, 0x5A772D2D, 0x1E110F0F, | ||
0x7BCBB0B0, 0xA8FC5454, 0x6DD6BBBB, 0x2C3A1616 | ||
]; | ||
// var AES3 = [ | ||
// 0xC6A56363, 0xF8847C7C, 0xEE997777, 0xF68D7B7B, | ||
// 0xFF0DF2F2, 0xD6BD6B6B, 0xDEB16F6F, 0x9154C5C5, | ||
// 0x60503030, 0x02030101, 0xCEA96767, 0x567D2B2B, | ||
// 0xE719FEFE, 0xB562D7D7, 0x4DE6ABAB, 0xEC9A7676, | ||
// 0x8F45CACA, 0x1F9D8282, 0x8940C9C9, 0xFA877D7D, | ||
// 0xEF15FAFA, 0xB2EB5959, 0x8EC94747, 0xFB0BF0F0, | ||
// 0x41ECADAD, 0xB367D4D4, 0x5FFDA2A2, 0x45EAAFAF, | ||
// 0x23BF9C9C, 0x53F7A4A4, 0xE4967272, 0x9B5BC0C0, | ||
// 0x75C2B7B7, 0xE11CFDFD, 0x3DAE9393, 0x4C6A2626, | ||
// 0x6C5A3636, 0x7E413F3F, 0xF502F7F7, 0x834FCCCC, | ||
// 0x685C3434, 0x51F4A5A5, 0xD134E5E5, 0xF908F1F1, | ||
// 0xE2937171, 0xAB73D8D8, 0x62533131, 0x2A3F1515, | ||
// 0x080C0404, 0x9552C7C7, 0x46652323, 0x9D5EC3C3, | ||
// 0x30281818, 0x37A19696, 0x0A0F0505, 0x2FB59A9A, | ||
// 0x0E090707, 0x24361212, 0x1B9B8080, 0xDF3DE2E2, | ||
// 0xCD26EBEB, 0x4E692727, 0x7FCDB2B2, 0xEA9F7575, | ||
// 0x121B0909, 0x1D9E8383, 0x58742C2C, 0x342E1A1A, | ||
// 0x362D1B1B, 0xDCB26E6E, 0xB4EE5A5A, 0x5BFBA0A0, | ||
// 0xA4F65252, 0x764D3B3B, 0xB761D6D6, 0x7DCEB3B3, | ||
// 0x527B2929, 0xDD3EE3E3, 0x5E712F2F, 0x13978484, | ||
// 0xA6F55353, 0xB968D1D1, 0x00000000, 0xC12CEDED, | ||
// 0x40602020, 0xE31FFCFC, 0x79C8B1B1, 0xB6ED5B5B, | ||
// 0xD4BE6A6A, 0x8D46CBCB, 0x67D9BEBE, 0x724B3939, | ||
// 0x94DE4A4A, 0x98D44C4C, 0xB0E85858, 0x854ACFCF, | ||
// 0xBB6BD0D0, 0xC52AEFEF, 0x4FE5AAAA, 0xED16FBFB, | ||
// 0x86C54343, 0x9AD74D4D, 0x66553333, 0x11948585, | ||
// 0x8ACF4545, 0xE910F9F9, 0x04060202, 0xFE817F7F, | ||
// 0xA0F05050, 0x78443C3C, 0x25BA9F9F, 0x4BE3A8A8, | ||
// 0xA2F35151, 0x5DFEA3A3, 0x80C04040, 0x058A8F8F, | ||
// 0x3FAD9292, 0x21BC9D9D, 0x70483838, 0xF104F5F5, | ||
// 0x63DFBCBC, 0x77C1B6B6, 0xAF75DADA, 0x42632121, | ||
// 0x20301010, 0xE51AFFFF, 0xFD0EF3F3, 0xBF6DD2D2, | ||
// 0x814CCDCD, 0x18140C0C, 0x26351313, 0xC32FECEC, | ||
// 0xBEE15F5F, 0x35A29797, 0x88CC4444, 0x2E391717, | ||
// 0x9357C4C4, 0x55F2A7A7, 0xFC827E7E, 0x7A473D3D, | ||
// 0xC8AC6464, 0xBAE75D5D, 0x322B1919, 0xE6957373, | ||
// 0xC0A06060, 0x19988181, 0x9ED14F4F, 0xA37FDCDC, | ||
// 0x44662222, 0x547E2A2A, 0x3BAB9090, 0x0B838888, | ||
// 0x8CCA4646, 0xC729EEEE, 0x6BD3B8B8, 0x283C1414, | ||
// 0xA779DEDE, 0xBCE25E5E, 0x161D0B0B, 0xAD76DBDB, | ||
// 0xDB3BE0E0, 0x64563232, 0x744E3A3A, 0x141E0A0A, | ||
// 0x92DB4949, 0x0C0A0606, 0x486C2424, 0xB8E45C5C, | ||
// 0x9F5DC2C2, 0xBD6ED3D3, 0x43EFACAC, 0xC4A66262, | ||
// 0x39A89191, 0x31A49595, 0xD337E4E4, 0xF28B7979, | ||
// 0xD532E7E7, 0x8B43C8C8, 0x6E593737, 0xDAB76D6D, | ||
// 0x018C8D8D, 0xB164D5D5, 0x9CD24E4E, 0x49E0A9A9, | ||
// 0xD8B46C6C, 0xACFA5656, 0xF307F4F4, 0xCF25EAEA, | ||
// 0xCAAF6565, 0xF48E7A7A, 0x47E9AEAE, 0x10180808, | ||
// 0x6FD5BABA, 0xF0887878, 0x4A6F2525, 0x5C722E2E, | ||
// 0x38241C1C, 0x57F1A6A6, 0x73C7B4B4, 0x9751C6C6, | ||
// 0xCB23E8E8, 0xA17CDDDD, 0xE89C7474, 0x3E211F1F, | ||
// 0x96DD4B4B, 0x61DCBDBD, 0x0D868B8B, 0x0F858A8A, | ||
// 0xE0907070, 0x7C423E3E, 0x71C4B5B5, 0xCCAA6666, | ||
// 0x90D84848, 0x06050303, 0xF701F6F6, 0x1C120E0E, | ||
// 0xC2A36161, 0x6A5F3535, 0xAEF95757, 0x69D0B9B9, | ||
// 0x17918686, 0x9958C1C1, 0x3A271D1D, 0x27B99E9E, | ||
// 0xD938E1E1, 0xEB13F8F8, 0x2BB39898, 0x22331111, | ||
// 0xD2BB6969, 0xA970D9D9, 0x07898E8E, 0x33A79494, | ||
// 0x2DB69B9B, 0x3C221E1E, 0x15928787, 0xC920E9E9, | ||
// 0x8749CECE, 0xAAFF5555, 0x50782828, 0xA57ADFDF, | ||
// 0x038F8C8C, 0x59F8A1A1, 0x09808989, 0x1A170D0D, | ||
// 0x65DABFBF, 0xD731E6E6, 0x84C64242, 0xD0B86868, | ||
// 0x82C34141, 0x29B09999, 0x5A772D2D, 0x1E110F0F, | ||
// 0x7BCBB0B0, 0xA8FC5454, 0x6DD6BBBB, 0x2C3A1616 | ||
// ]; | ||
@@ -289,3 +295,3 @@ | ||
AES3[((X[2]) >>> 24) & 0xFF] ^ (K[3]); | ||
} | ||
}; | ||
@@ -296,2 +302,2 @@ module.exports.AES_ROUND_NOKEY_LE = function(X, Y) { | ||
this.AES_ROUND_LE(X, K, Y); | ||
} | ||
}; |
381
lib/blake.js
@@ -0,1 +1,2 @@ | ||
'use strict'; | ||
///////////////////////////////////// | ||
@@ -9,218 +10,208 @@ /////////////// Blake ////////////// | ||
var op = require('./op'); | ||
var o = require('./op'); | ||
var h = require('./helper'); | ||
var CB = [ | ||
new op.u64(0x243f6a88, 0x85a308d3), | ||
new op.u64(0x13198a2e, 0x03707344), | ||
new op.u64(0xa4093822, 0x299f31d0), | ||
new op.u64(0x082efa98, 0xec4e6c89), | ||
new op.u64(0x452821e6, 0x38d01377), | ||
new op.u64(0xbe5466cf, 0x34e90c6c), | ||
new op.u64(0xc0ac29b7, 0xc97c50dd), | ||
new op.u64(0x3f84d5b5, 0xb5470917), | ||
new op.u64(0x9216d5d9, 0x8979fb1b), | ||
new op.u64(0xd1310ba6, 0x98dfb5ac), | ||
new op.u64(0x2ffd72db, 0xd01adfb7), | ||
new op.u64(0xb8e1afed, 0x6a267e96), | ||
new op.u64(0xba7c9045, 0xf12c7f99), | ||
new op.u64(0x24a19947, 0xb3916cf7), | ||
new op.u64(0x0801f2e2, 0x858efc16), | ||
new op.u64(0x636920d8, 0x71574e69) | ||
]; | ||
var CB = h.bytes2Int64Buffer(h.b64Decode('JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxObIlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjftawv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXTmk=')); | ||
// var CB = [ | ||
// o.u(0x243f6a88, 0x85a308d3), | ||
// o.u(0x13198a2e, 0x03707344), | ||
// o.u(0xa4093822, 0x299f31d0), | ||
// o.u(0x082efa98, 0xec4e6c89), | ||
// o.u(0x452821e6, 0x38d01377), | ||
// o.u(0xbe5466cf, 0x34e90c6c), | ||
// o.u(0xc0ac29b7, 0xc97c50dd), | ||
// o.u(0x3f84d5b5, 0xb5470917), | ||
// o.u(0x9216d5d9, 0x8979fb1b), | ||
// o.u(0xd1310ba6, 0x98dfb5ac), | ||
// o.u(0x2ffd72db, 0xd01adfb7), | ||
// o.u(0xb8e1afed, 0x6a267e96), | ||
// o.u(0xba7c9045, 0xf12c7f99), | ||
// o.u(0x24a19947, 0xb3916cf7), | ||
// o.u(0x0801f2e2, 0x858efc16), | ||
// o.u(0x636920d8, 0x71574e69) | ||
// ]; | ||
var Z = [ | ||
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], | ||
[14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3], | ||
[11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4], | ||
[7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8], | ||
[9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13], | ||
[2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9], | ||
[12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11], | ||
[13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10], | ||
[6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5], | ||
[10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0] | ||
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], | ||
[14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3], | ||
[11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4], | ||
[7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8], | ||
[9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13], | ||
[2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9], | ||
[12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11], | ||
[13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10], | ||
[6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5], | ||
[10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0] | ||
]; | ||
var Mx = function(M, r, i) { | ||
return M[Z[r][i]]; | ||
} | ||
var CBx = function(r, i) { | ||
return CB[Z[r][i]]; | ||
} | ||
var initialValues = [ | ||
new op.u64(0x6a09e667, 0xf3bcc908), | ||
new op.u64(0xbb67ae85, 0x84caa73b), | ||
new op.u64(0x3c6ef372, 0xfe94f82b), | ||
new op.u64(0xa54ff53a, 0x5f1d36f1), | ||
new op.u64(0x510e527f, 0xade682d1), | ||
new op.u64(0x9b05688c, 0x2b3e6c1f), | ||
new op.u64(0x1f83d9ab, 0xfb41bd6b), | ||
new op.u64(0x5be0cd19, 0x137e2179) | ||
o.u(0x6a09e667, 0xf3bcc908), | ||
o.u(0xbb67ae85, 0x84caa73b), | ||
o.u(0x3c6ef372, 0xfe94f82b), | ||
o.u(0xa54ff53a, 0x5f1d36f1), | ||
o.u(0x510e527f, 0xade682d1), | ||
o.u(0x9b05688c, 0x2b3e6c1f), | ||
o.u(0x1f83d9ab, 0xfb41bd6b), | ||
o.u(0x5be0cd19, 0x137e2179) | ||
]; | ||
var GB = function(m0, m1, c0, c1, a, b, c, d) { | ||
a.add(b.plus(m0.xor(c1))); | ||
var l = d.xor(a); | ||
d.set(d.xor(a).rotateRight(32)); | ||
c.add(d); | ||
b.set(b.xor(c).rotateRight(25)); | ||
a.add(b.plus(m1.xor(c0))); | ||
d.set(d.xor(a).rotateRight(16)); | ||
c.add(d); | ||
b.set(b.xor(c).rotateRight(11)); | ||
} | ||
a.add(m0.xor(c1).add(b)); | ||
d.setxorOne(a).setFlip(); | ||
c.add(d); | ||
b.setxorOne(c).setRotateRight(25); | ||
a.add(m1.xor(c0).add(b)); | ||
d.setxorOne(a).setRotateRight(16); | ||
c.add(d); | ||
b.setxorOne(c).setRotateRight(11); | ||
}; | ||
var round = function(r, V, M) { | ||
GB(Mx(M, r, 0), Mx(M, r, 1), CBx(r, 0), CBx(r, 1), V[0], V[4], V[8], V[0xC]); | ||
GB(Mx(M, r, 2), Mx(M, r, 3), CBx(r, 2), CBx(r, 3), V[1], V[5], V[9], V[0xD]); | ||
GB(Mx(M, r, 4), Mx(M, r, 5), CBx(r, 4), CBx(r, 5), V[2], V[6], V[0xA], V[0xE]); | ||
GB(Mx(M, r, 6), Mx(M, r, 7), CBx(r, 6), CBx(r, 7), V[3], V[7], V[0xB], V[0xF]); | ||
GB(Mx(M, r, 8), Mx(M, r, 9), CBx(r, 8), CBx(r, 9), V[0], V[5], V[0xA], V[0xF]); | ||
GB(Mx(M, r, 0xA), Mx(M, r, 0xB), CBx(r, 0xA), CBx(r, 0xB), V[1], V[6], V[0xB], V[0xC]); | ||
GB(Mx(M, r, 0xC), Mx(M, r, 0xD), CBx(r, 0xC), CBx(r, 0xD), V[2], V[7], V[8], V[0xD]); | ||
GB(Mx(M, r, 0xE), Mx(M, r, 0xF), CBx(r, 0xE), CBx(r, 0xF), V[3], V[4], V[9], V[0xE]); | ||
} | ||
GB(M[Z[r][0]], M[Z[r][1]], CB[Z[r][0]], CB[Z[r][1]], V[0], V[4], V[8], V[0xC]); | ||
GB(M[Z[r][2]], M[Z[r][3]], CB[Z[r][2]], CB[Z[r][3]], V[1], V[5], V[9], V[0xD]); | ||
GB(M[Z[r][4]], M[Z[r][5]], CB[Z[r][4]], CB[Z[r][5]], V[2], V[6], V[0xA], V[0xE]); | ||
GB(M[Z[r][6]], M[Z[r][7]], CB[Z[r][6]], CB[Z[r][7]], V[3], V[7], V[0xB], V[0xF]); | ||
GB(M[Z[r][8]], M[Z[r][9]], CB[Z[r][8]], CB[Z[r][9]], V[0], V[5], V[0xA], V[0xF]); | ||
GB(M[Z[r][10]], M[Z[r][11]], CB[Z[r][10]], CB[Z[r][11]], V[1], V[6], V[0xB], V[0xC]); | ||
GB(M[Z[r][12]], M[Z[r][13]], CB[Z[r][12]], CB[Z[r][13]], V[2], V[7], V[8], V[0xD]); | ||
GB(M[Z[r][14]], M[Z[r][15]], CB[Z[r][14]], CB[Z[r][15]], V[3], V[4], V[9], V[0xE]); | ||
}; | ||
var compress = function(M, H, S, T0, T1) { | ||
var V = new Array(16); | ||
op.bufferInsert64(V, 0, H, 8); | ||
V[8] = S[0].xor(CB[0]); | ||
V[9] = S[1].xor(CB[1]); | ||
V[10] = S[2].xor(CB[2]); | ||
V[11] = S[3].xor(CB[3]); | ||
V[12] = T0.xor(CB[4]); | ||
V[13] = T0.xor(CB[5]); | ||
V[14] = T1.xor(CB[6]); | ||
V[15] = T1.xor(CB[7]); | ||
for (var i = 0; i < 16; i++) { | ||
round(i % 10, V, M); | ||
} | ||
for (var i = 0; i < 8; i++) { | ||
H[i] = op.xor64(H[i], S[i % 4], V[i], V[8 + i]); | ||
} | ||
} | ||
var V = new Array(16); | ||
o.bufferInsert64(V, 0, H, 8); | ||
V[8] = S[0].xor(CB[0]); | ||
V[9] = S[1].xor(CB[1]); | ||
V[10] = S[2].xor(CB[2]); | ||
V[11] = S[3].xor(CB[3]); | ||
V[12] = T0.xor(CB[4]); | ||
V[13] = T0.xor(CB[5]); | ||
V[14] = T1.xor(CB[6]); | ||
V[15] = T1.xor(CB[7]); | ||
for (var i = 0; i < 16; i++) { | ||
round(i % 10, V, M); | ||
} | ||
for (var i = 0; i < 8; i++) { | ||
H[i] = o.xor64(H[i], S[i % 4], V[i], V[8 + i]); | ||
} | ||
}; | ||
var blake = function(ctx, data, len) { | ||
var buf, ptr; | ||
//create a local copy of states | ||
var H = new Array(8); | ||
var S = new Array(4); | ||
var T0 = ctx.T0.clone(); | ||
var T1 = ctx.T1.clone(); | ||
buf = ctx.buffer; | ||
ptr = ctx.ptr; | ||
if (len < ctx.buffer.length - ptr) { | ||
op.bufferInsert(buf, ptr, data, data.length); | ||
ptr += data.length; | ||
var buf, ptr; | ||
//create a local copy of states | ||
var H = new Array(8); | ||
var S = new Array(4); | ||
var T0 = ctx.T0.clone(); | ||
var T1 = ctx.T1.clone(); | ||
buf = ctx.buffer; | ||
ptr = ctx.ptr; | ||
if (len < ctx.buffer.length - ptr) { | ||
o.bufferInsert(buf, ptr, data, data.length); | ||
ptr += data.length; | ||
ctx.ptr = ptr; | ||
return; | ||
} | ||
//perform a deep copy of current state | ||
o.bufferInsert(H, 0, ctx.state, 8); | ||
o.bufferInsert(S, 0, ctx.salt, 4); | ||
while (len > 0) { | ||
var clen = ctx.buffer.length - ptr; | ||
if (clen > len) clen = len; | ||
o.bufferInsert(buf, ptr, data, clen); | ||
ptr += clen; | ||
data = data.slice(clen); | ||
len -= clen; | ||
if (ptr === ctx.buffer.length) { | ||
T0.add(o.u(0, 1024)); | ||
if (T0.hi < 0 || T0.lo < 1024) T1.addOne(); | ||
var int64Buf = h.bytes2Int64Buffer(buf); | ||
compress(int64Buf, H, S, T0, T1); | ||
ptr = 0; | ||
} | ||
} | ||
ctx.state = H; | ||
ctx.salt = S; | ||
ctx.T0 = T0; | ||
ctx.T1 = T1; | ||
ctx.ptr = ptr; | ||
return; | ||
} | ||
//perform a deep copy of current state | ||
op.bufferInsert(H, 0, ctx.state, 8); | ||
op.bufferInsert(S, 0, ctx.salt, 4); | ||
while (len > 0) { | ||
var clen = ctx.buffer.length - ptr; | ||
if (clen > len) clen = len; | ||
op.bufferInsert(buf, ptr, data, clen); | ||
ptr += clen; | ||
data = data.slice(clen); | ||
len -= clen; | ||
if (ptr === ctx.buffer.length) { | ||
T0.add(new op.u64(0, 1024)); | ||
if (T0.hi < 0 || T0.lo < 1024) | ||
T1.addOne(); | ||
var int64Buf = h.bytes2Int64Buffer(buf); | ||
compress(int64Buf, H, S, T0, T1); | ||
ptr = 0; | ||
} | ||
} | ||
ctx.state = H; | ||
ctx.salt = S; | ||
ctx.T0 = T0; | ||
ctx.T1 = T1; | ||
ctx.ptr = ptr; | ||
} | ||
}; | ||
var blakeClose = function(ctx) { | ||
var buf = new Array(128); | ||
var ptr = ctx.ptr; | ||
var bitLen = (new op.u64(0, ptr)).shiftLeft(3); | ||
var len = buf.length; | ||
var padLen; | ||
var count; | ||
var tl = ctx.T0.plus(bitLen); | ||
var th = ctx.T1.clone(); | ||
buf[ptr] = 0x80; | ||
if (ptr === 0) { | ||
ctx.T0 = new op.u64(0xFFFFFFFF, 0xFFFFFC00); | ||
ctx.T1 = new op.u64(0xFFFFFFFF, 0xFFFFFFFF); | ||
} | ||
else if (ctx.T0.isZero()) { | ||
ctx.T0 = new op.u64(0xFFFFFFFF, 0xFFFFFC00).plus(bitLen); | ||
ctx.T1 = ctx.T1.minus(new op.u64(0, 1)); | ||
} | ||
else { | ||
ctx.T0 = ctx.T0.minus(new op.u64(0, 1024).minus(bitLen)); | ||
} | ||
if (bitLen.lo <= 894) { | ||
op.bufferSet(buf, ptr + 1, 0, 111 - ptr); | ||
buf[111] |= 1; | ||
h.bufferEncode64(buf, 112, th); | ||
h.bufferEncode64(buf, 120, tl); | ||
blake(ctx, buf.slice(ptr), 128 - ptr); | ||
} | ||
else { | ||
op.bufferSet(u.buf, ptr + 1, 0, 127 - ptr); | ||
blake(ctx, buf.slice(ptr), 128 - ptr); | ||
ctx.T0 = new op.u64(0xFFFFFFFFFFFFFC00); | ||
ctx.T1 = new op.u64(0xFFFFFFFFFFFFFFFF); | ||
op.bufferSet(buf, 0, 0, 112); | ||
buf[111] = 1; | ||
h.bufferEncode64(buf, 112, th); | ||
h.bufferEncode64(buf, 120, tl); | ||
blake(ctx, buf, 128); | ||
} | ||
var out = new Array(16); | ||
for (var u = 0; u < 8; u++) { | ||
out[2 * u] = ctx.state[u].hi; | ||
out[2 * u + 1] = ctx.state[u].lo; | ||
} | ||
return out; | ||
} | ||
var buf = new Array(128); | ||
var ptr = ctx.ptr; | ||
var bitLen = (o.u(0, ptr)).shiftLeft(3); | ||
var tl = ctx.T0.plus(bitLen); | ||
var th = ctx.T1.clone(); | ||
buf[ptr] = 0x80; | ||
if (ptr === 0) { | ||
ctx.T0 = o.u(0xFFFFFFFF, 0xFFFFFC00); | ||
ctx.T1 = o.u(0xFFFFFFFF, 0xFFFFFFFF); | ||
} | ||
else if (ctx.T0.isZero()) { | ||
ctx.T0 = o.u(0xFFFFFFFF, 0xFFFFFC00).plus(bitLen); | ||
ctx.T1 = ctx.T1.minus(o.u(0, 1)); | ||
} | ||
else { | ||
ctx.T0 = ctx.T0.minus(o.u(0, 1024).minus(bitLen)); | ||
} | ||
if (bitLen.lo <= 894) { | ||
o.bufferSet(buf, ptr + 1, 0, 111 - ptr); | ||
buf[111] |= 1; | ||
h.bufferEncode64(buf, 112, th); | ||
h.bufferEncode64(buf, 120, tl); | ||
blake(ctx, buf.slice(ptr), 128 - ptr); | ||
} | ||
else { | ||
o.bufferSet(u.buf, ptr + 1, 0, 127 - ptr); | ||
blake(ctx, buf.slice(ptr), 128 - ptr); | ||
ctx.T0 = o.u(0xFFFFFFFF,0xFFFFFC00); | ||
ctx.T1 = o.u(0xFFFFFFFF,0xFFFFFFFF); | ||
o.bufferSet(buf, 0, 0, 112); | ||
buf[111] = 1; | ||
h.bufferEncode64(buf, 112, th); | ||
h.bufferEncode64(buf, 120, tl); | ||
blake(ctx, buf, 128); | ||
} | ||
var out = new Array(16); | ||
for (var u = 0; u < 8; u++) { | ||
out[2 * u] = ctx.state[u].hi; | ||
out[2 * u + 1] = ctx.state[u].lo; | ||
} | ||
return out; | ||
}; | ||
module.exports = function(input, format, output) { | ||
var msg; | ||
if (format === 1) { | ||
msg = input; | ||
} | ||
else if (format === 2) { | ||
msg = h.int32Buffer2Bytes(input); | ||
} | ||
else { | ||
msg = h.string2bytes(input); | ||
} | ||
var ctx = {}; | ||
ctx.state = op.clone64Array(initialValues); | ||
ctx.salt = [op.u64.prototype.zero(), op.u64.prototype.zero(), op.u64.prototype.zero(), op.u64.prototype.zero()]; | ||
ctx.T0 = op.u64.prototype.zero(); | ||
ctx.T1 = op.u64.prototype.zero(); | ||
ctx.ptr = 0; | ||
ctx.buffer = new Array(128); | ||
blake(ctx, msg, msg.length); | ||
var r = blakeClose(ctx, 0, 0); | ||
var out; | ||
if (output === 2) { | ||
out = r; | ||
} | ||
else if (output === 1) { | ||
out = h.int32Buffer2Bytes(r) | ||
} | ||
else { | ||
out = h.int32ArrayToHexString(r) | ||
} | ||
return out; | ||
} | ||
var msg; | ||
if (format === 1) { | ||
msg = input; | ||
} | ||
else if (format === 2) { | ||
msg = h.int32Buffer2Bytes(input); | ||
} | ||
else { | ||
msg = h.string2bytes(input); | ||
} | ||
var ctx = {}; | ||
ctx.state = o.clone64Array(initialValues); | ||
var zero = o.u(0,0); | ||
ctx.salt = [zero, zero, zero, zero]; | ||
ctx.T0 = zero.clone(); | ||
ctx.T1 = zero.clone(); | ||
ctx.ptr = 0; | ||
ctx.buffer = new Array(128); | ||
blake(ctx, msg, msg.length); | ||
var r = blakeClose(ctx, 0, 0); | ||
var out; | ||
if (output === 2) { | ||
out = r; | ||
} | ||
else if (output === 1) { | ||
out = h.int32Buffer2Bytes(r); | ||
} | ||
else { | ||
out = h.int32ArrayToHexString(r); | ||
} | ||
return out; | ||
}; |
516
lib/bmw.js
@@ -0,1 +1,2 @@ | ||
'use strict'; | ||
///////////////////////////////////// | ||
@@ -9,27 +10,31 @@ ////////////// BMW ///////////////// | ||
var op = require('./op'); | ||
var o = require('./op'); | ||
var h = require('./helper'); | ||
var V_INIT = [ | ||
new op.u64(0x80818283, 0x84858687), new op.u64(0x88898A8B, 0x8C8D8E8F), | ||
new op.u64(0x90919293, 0x94959697), new op.u64(0x98999A9B, 0x9C9D9E9F), | ||
new op.u64(0xA0A1A2A3, 0xA4A5A6A7), new op.u64(0xA8A9AAAB, 0xACADAEAF), | ||
new op.u64(0xB0B1B2B3, 0xB4B5B6B7), new op.u64(0xB8B9BABB, 0xBCBDBEBF), | ||
new op.u64(0xC0C1C2C3, 0xC4C5C6C7), new op.u64(0xC8C9CACB, 0xCCCDCECF), | ||
new op.u64(0xD0D1D2D3, 0xD4D5D6D7), new op.u64(0xD8D9DADB, 0xDCDDDEDF), | ||
new op.u64(0xE0E1E2E3, 0xE4E5E6E7), new op.u64(0xE8E9EAEB, 0xECEDEEEF), | ||
new op.u64(0xF0F1F2F3, 0xF4F5F6F7), new op.u64(0xF8F9FAFB, 0xFCFDFEFF) | ||
]; | ||
// var V_INIT = [ | ||
// o.u(0x80818283, 0x84858687), o.u(0x88898A8B, 0x8C8D8E8F), | ||
// o.u(0x90919293, 0x94959697), o.u(0x98999A9B, 0x9C9D9E9F), | ||
// o.u(0xA0A1A2A3, 0xA4A5A6A7), o.u(0xA8A9AAAB, 0xACADAEAF), | ||
// o.u(0xB0B1B2B3, 0xB4B5B6B7), o.u(0xB8B9BABB, 0xBCBDBEBF), | ||
// o.u(0xC0C1C2C3, 0xC4C5C6C7), o.u(0xC8C9CACB, 0xCCCDCECF), | ||
// o.u(0xD0D1D2D3, 0xD4D5D6D7), o.u(0xD8D9DADB, 0xDCDDDEDF), | ||
// o.u(0xE0E1E2E3, 0xE4E5E6E7), o.u(0xE8E9EAEB, 0xECEDEEEF), | ||
// o.u(0xF0F1F2F3, 0xF4F5F6F7), o.u(0xF8F9FAFB, 0xFCFDFEFF) | ||
// ]; | ||
var final = [ | ||
new op.u64(0xaaaaaaaa, 0xaaaaaaa0), new op.u64(0xaaaaaaaa, 0xaaaaaaa1), | ||
new op.u64(0xaaaaaaaa, 0xaaaaaaa2), new op.u64(0xaaaaaaaa, 0xaaaaaaa3), | ||
new op.u64(0xaaaaaaaa, 0xaaaaaaa4), new op.u64(0xaaaaaaaa, 0xaaaaaaa5), | ||
new op.u64(0xaaaaaaaa, 0xaaaaaaa6), new op.u64(0xaaaaaaaa, 0xaaaaaaa7), | ||
new op.u64(0xaaaaaaaa, 0xaaaaaaa8), new op.u64(0xaaaaaaaa, 0xaaaaaaa9), | ||
new op.u64(0xaaaaaaaa, 0xaaaaaaaa), new op.u64(0xaaaaaaaa, 0xaaaaaaab), | ||
new op.u64(0xaaaaaaaa, 0xaaaaaaac), new op.u64(0xaaaaaaaa, 0xaaaaaaad), | ||
new op.u64(0xaaaaaaaa, 0xaaaaaaae), new op.u64(0xaaaaaaaa, 0xaaaaaaaf) | ||
]; | ||
var V_INIT = h.bytes2Int64Buffer(h.b64Decode('gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8=')); | ||
// var final = [ | ||
// o.u(0xaaaaaaaa, 0xaaaaaaa0), o.u(0xaaaaaaaa, 0xaaaaaaa1), | ||
// o.u(0xaaaaaaaa, 0xaaaaaaa2), o.u(0xaaaaaaaa, 0xaaaaaaa3), | ||
// o.u(0xaaaaaaaa, 0xaaaaaaa4), o.u(0xaaaaaaaa, 0xaaaaaaa5), | ||
// o.u(0xaaaaaaaa, 0xaaaaaaa6), o.u(0xaaaaaaaa, 0xaaaaaaa7), | ||
// o.u(0xaaaaaaaa, 0xaaaaaaa8), o.u(0xaaaaaaaa, 0xaaaaaaa9), | ||
// o.u(0xaaaaaaaa, 0xaaaaaaaa), o.u(0xaaaaaaaa, 0xaaaaaaab), | ||
// o.u(0xaaaaaaaa, 0xaaaaaaac), o.u(0xaaaaaaaa, 0xaaaaaaad), | ||
// o.u(0xaaaaaaaa, 0xaaaaaaae), o.u(0xaaaaaaaa, 0xaaaaaaaf) | ||
// ]; | ||
var final = h.bytes2Int64Buffer(h.b64Decode('qqqqqqqqqqCqqqqqqqqqoaqqqqqqqqqiqqqqqqqqqqOqqqqqqqqqpKqqqqqqqqqlqqqqqqqqqqaqqqqqqqqqp6qqqqqqqqqoqqqqqqqqqqmqqqqqqqqqqqqqqqqqqqqrqqqqqqqqqqyqqqqqqqqqraqqqqqqqqquqqqqqqqqqq8=')); | ||
var sb_a = [1, 1, 2, 2, 1, 2]; | ||
@@ -79,281 +84,286 @@ var sb_b = [3, 2, 1, 2]; | ||
var sb = function(n, x) { | ||
//xOriginal must be of type u64 | ||
if (n < 4) { | ||
return op.xor64(x.shiftRight(sb_a[n]), x.shiftLeft(sb_b[n]), x.rotateLeft(sb_c[n]), x.rotateLeft(sb_d[n])); | ||
} | ||
else { | ||
//xOriginal must be of type u64 | ||
if (n < 4) { | ||
return o.xor64(x.shiftRight(sb_a[n]), x.shiftLeft(sb_b[n]), x.rotateLeft(sb_c[n]), x.rotateLeft(sb_d[n])); | ||
} | ||
return x.shiftRight(sb_a[n]).xor(x); | ||
} | ||
} | ||
}; | ||
var rbn = [0, 5, 11, 27, 32, 37, 43, 53]; | ||
var rb = function(n, x) { | ||
//x must be of type u64 | ||
return x.rotateLeft(rbn[n]); | ||
} | ||
//x must be of type u64 | ||
return x.rotateLeft(rbn[n]); | ||
}; | ||
var makeW = function(M,H,i, op) { | ||
var a = M[i[0]].xor(H[i[0]]); | ||
var b = M[i[1]].xor(H[i[1]]); | ||
var c = M[i[2]].xor(H[i[2]]); | ||
var d = M[i[3]].xor(H[i[3]]); | ||
var e = M[i[4]].xor(H[i[4]]); | ||
var w = op[3](op[2](op[1](op[0](a,b),c),d),e); | ||
var a = M[i[0]].xor(H[i[0]]); | ||
var b = M[i[1]].xor(H[i[1]]); | ||
var c = M[i[2]].xor(H[i[2]]); | ||
var d = M[i[3]].xor(H[i[3]]); | ||
var e = M[i[4]].xor(H[i[4]]); | ||
var w = op[3](op[2](op[1](op[0](a,b),c),d),e); | ||
return w; | ||
} | ||
return w; | ||
}; | ||
var wbn = [ | ||
[5, 7, 10, 13, 14], | ||
[6, 8, 11, 14, 15], | ||
[0, 7, 9, 12, 15], | ||
[0, 1, 8, 10, 13], | ||
[1, 2, 9, 11, 14], | ||
[3, 2, 10, 12, 15], | ||
[4, 0, 3, 11, 13], | ||
[1, 4, 5, 12, 14], | ||
[2, 5, 6, 13, 15], | ||
[0, 3, 6, 7, 14], | ||
[8, 1, 4, 7, 15], | ||
[8, 0, 2, 5, 9], | ||
[1, 3, 6, 9, 10], | ||
[2, 4, 7, 10, 11], | ||
[3, 5, 8, 11, 12], | ||
[12, 4, 6, 9, 13], | ||
[5, 7, 10, 13, 14], | ||
[6, 8, 11, 14, 15], | ||
[0, 7, 9, 12, 15], | ||
[0, 1, 8, 10, 13], | ||
[1, 2, 9, 11, 14], | ||
[3, 2, 10, 12, 15], | ||
[4, 0, 3, 11, 13], | ||
[1, 4, 5, 12, 14], | ||
[2, 5, 6, 13, 15], | ||
[0, 3, 6, 7, 14], | ||
[8, 1, 4, 7, 15], | ||
[8, 0, 2, 5, 9], | ||
[1, 3, 6, 9, 10], | ||
[2, 4, 7, 10, 11], | ||
[3, 5, 8, 11, 12], | ||
[12, 4, 6, 9, 13], | ||
]; | ||
var plus = function(a,b) { | ||
return a.plus(b); | ||
} | ||
return a.plus(b); | ||
}; | ||
var minus = function(a,b) { | ||
return a.minus(b); | ||
} | ||
return a.minus(b); | ||
}; | ||
var wboperators = [ | ||
[minus, plus, plus, plus], | ||
[minus, plus, plus, minus], | ||
[plus, plus, minus, plus], | ||
[minus, plus, minus, plus], | ||
[plus, plus, minus, minus], | ||
[minus, plus, minus, plus], | ||
[minus, minus, minus, plus], | ||
[minus, minus, minus, minus], | ||
[minus, minus, plus, minus], | ||
[minus, plus, minus, plus], | ||
[minus, minus, minus, plus], | ||
[minus, minus, minus, plus], | ||
[plus, minus, minus, plus], | ||
[plus, plus, plus, plus], | ||
[minus, plus, minus, minus], | ||
[minus, minus, minus, plus], | ||
] | ||
[minus, plus, plus, plus], | ||
[minus, plus, plus, minus], | ||
[plus, plus, minus, plus], | ||
[minus, plus, minus, plus], | ||
[plus, plus, minus, minus], | ||
[minus, plus, minus, plus], | ||
[minus, minus, minus, plus], | ||
[minus, minus, minus, minus], | ||
[minus, minus, plus, minus], | ||
[minus, plus, minus, plus], | ||
[minus, minus, minus, plus], | ||
[minus, minus, minus, plus], | ||
[plus, minus, minus, plus], | ||
[plus, plus, plus, plus], | ||
[minus, plus, minus, minus], | ||
[minus, minus, minus, plus], | ||
]; | ||
var wb = function(M,H,i) { | ||
return makeW(M,H,wbn[i],wboperators[i]); | ||
} | ||
return makeW(M,H,wbn[i],wboperators[i]); | ||
}; | ||
var kb = function(j) { | ||
var fives = new op.u64(0x05555555, 0x55555555); | ||
return fives.multiply(j); | ||
} | ||
var fives = o.u(0x05555555, 0x55555555); | ||
return fives.multiply(j); | ||
}; | ||
var addElt = function(buffer64, state, mVars, i) { | ||
var k = kb(i); | ||
var elt = buffer64[mVars[0]].rotateLeft(mVars[1]) | ||
.add(buffer64[mVars[2]].rotateLeft(mVars[3])) | ||
.minus(buffer64[mVars[5]].rotateLeft(mVars[6])) | ||
.add(k) | ||
.xor(state[mVars[4]]); | ||
var k = kb(i); | ||
var elt = buffer64[mVars[0]].rotateLeft(mVars[1]) | ||
.add(buffer64[mVars[2]].rotateLeft(mVars[3])) | ||
.minus(buffer64[mVars[5]].rotateLeft(mVars[6])) | ||
.add(k) | ||
.xor(state[mVars[4]]); | ||
return elt; | ||
} | ||
}; | ||
var expand2Inner = function(qt, mf, state, i, iVars, mVars) { | ||
return qt[iVars[0]] | ||
.plus(rb(1, qt[iVars[1]])) | ||
.add(qt[iVars[2]]) | ||
.add(rb(2, qt[iVars[3]])) | ||
.add(qt[iVars[4]]) | ||
.add(rb(3, qt[iVars[5]])) | ||
.add(qt[iVars[6]]) | ||
.add(rb(4, qt[iVars[7]])) | ||
.add(qt[iVars[8]]) | ||
.add(rb(5, qt[iVars[9]])) | ||
.add(qt[iVars[10]]) | ||
.add(rb(6, qt[iVars[11]])) | ||
.add(qt[iVars[12]]) | ||
.add(rb(7, qt[iVars[13]])) | ||
.add(sb(4, qt[iVars[14]])) | ||
.add(sb(5, qt[iVars[15]])) | ||
.add(addElt(mf, state, mVars, i)); | ||
} | ||
return qt[iVars[0]] | ||
.plus(rb(1, qt[iVars[1]])) | ||
.add(qt[iVars[2]]) | ||
.add(rb(2, qt[iVars[3]])) | ||
.add(qt[iVars[4]]) | ||
.add(rb(3, qt[iVars[5]])) | ||
.add(qt[iVars[6]]) | ||
.add(rb(4, qt[iVars[7]])) | ||
.add(qt[iVars[8]]) | ||
.add(rb(5, qt[iVars[9]])) | ||
.add(qt[iVars[10]]) | ||
.add(rb(6, qt[iVars[11]])) | ||
.add(qt[iVars[12]]) | ||
.add(rb(7, qt[iVars[13]])) | ||
.add(sb(4, qt[iVars[14]])) | ||
.add(sb(5, qt[iVars[15]])) | ||
.add(addElt(mf, state, mVars, i)); | ||
}; | ||
var expand1Inner = function(qt, mf, state, i, iVars, mVars) { | ||
return sb(1, qt[iVars[0]]) | ||
.add(sb(2, qt[iVars[1]])) | ||
.add(sb(3, qt[iVars[2]])) | ||
.add(sb(0, qt[iVars[3]])) | ||
.add(sb(1, qt[iVars[4]])) | ||
.add(sb(2, qt[iVars[5]])) | ||
.add(sb(3, qt[iVars[6]])) | ||
.add(sb(0, qt[iVars[7]])) | ||
.add(sb(1, qt[iVars[8]])) | ||
.add(sb(2, qt[iVars[9]])) | ||
.add(sb(3, qt[iVars[10]])) | ||
.add(sb(0, qt[iVars[11]])) | ||
.add(sb(1, qt[iVars[12]])) | ||
.add(sb(2, qt[iVars[13]])) | ||
.add(sb(3, qt[iVars[14]])) | ||
.add(sb(0, qt[iVars[15]])) | ||
.add(addElt(mf, state, mVars, i)); | ||
} | ||
return sb(1, qt[iVars[0]]) | ||
.add(sb(2, qt[iVars[1]])) | ||
.add(sb(3, qt[iVars[2]])) | ||
.add(sb(0, qt[iVars[3]])) | ||
.add(sb(1, qt[iVars[4]])) | ||
.add(sb(2, qt[iVars[5]])) | ||
.add(sb(3, qt[iVars[6]])) | ||
.add(sb(0, qt[iVars[7]])) | ||
.add(sb(1, qt[iVars[8]])) | ||
.add(sb(2, qt[iVars[9]])) | ||
.add(sb(3, qt[iVars[10]])) | ||
.add(sb(0, qt[iVars[11]])) | ||
.add(sb(1, qt[iVars[12]])) | ||
.add(sb(2, qt[iVars[13]])) | ||
.add(sb(3, qt[iVars[14]])) | ||
.add(sb(0, qt[iVars[15]])) | ||
.add(addElt(mf, state, mVars, i)); | ||
}; | ||
var expand1b = function(qt, mf, state, i) { | ||
var iVars = I16[i]; | ||
var mVars = M16[i]; | ||
return expand1Inner(qt, mf, state, i, iVars, mVars); | ||
} | ||
var iVars = I16[i]; | ||
var mVars = M16[i]; | ||
return expand1Inner(qt, mf, state, i, iVars, mVars); | ||
}; | ||
var expand2b = function(qt, mf, state, i) { | ||
var iVars = I16[i]; | ||
var mVars = M16[i]; | ||
return expand2Inner(qt, mf, state, i, iVars, mVars); | ||
} | ||
var iVars = I16[i]; | ||
var mVars = M16[i]; | ||
return expand2Inner(qt, mf, state, i, iVars, mVars); | ||
}; | ||
var makeQ = function(mf, state) { | ||
var qt = new Array(32); | ||
for (var i = 0; i < 16; i++) { | ||
var w = wb(mf,state,i); | ||
var s = sb(i % 5, w); | ||
qt[i] = s.plus(state[(i + 1) % 16]); | ||
} | ||
qt[16] = expand1b(qt, mf, state, 16); | ||
qt[17] = expand1b(qt, mf, state, 17); | ||
for (var i = 18; i < 32; i++) { | ||
qt[i] = expand2b(qt, mf, state, i); | ||
} | ||
return qt; | ||
} | ||
var qt = new Array(32); | ||
for (var i = 0; i < 16; i++) { | ||
var w = wb(mf,state,i); | ||
var s = sb(i % 5, w); | ||
qt[i] = s.plus(state[(i + 1) % 16]); | ||
} | ||
qt[16] = expand1b(qt, mf, state, 16); | ||
qt[17] = expand1b(qt, mf, state, 17); | ||
for (var i = 18; i < 32; i++) { | ||
qt[i] = expand2b(qt, mf, state, i); | ||
} | ||
return qt; | ||
}; | ||
var fold = function(int64Buffer, state) { | ||
var out = new Array(16); | ||
var qt = makeQ(int64Buffer, state); | ||
var xl = op.xor64(qt[16], qt[17], qt[18], qt[19], qt[20], qt[21], qt[22], qt[23]); | ||
var xh = op.xor64(xl, qt[24], qt[25], qt[26], qt[27], qt[28], qt[29], qt[30], qt[31]); | ||
out[0] = op.xor64(xh.shiftLeft(5), qt[16].shiftRight(5), int64Buffer[0]).add(op.xor64(xl, qt[24], qt[0])); | ||
out[1] = op.xor64(xh.shiftRight(7), qt[17].shiftLeft(8), int64Buffer[1]).add(op.xor64(xl, qt[25], qt[1])); | ||
out[2] = op.xor64(xh.shiftRight(5), qt[18].shiftLeft(5), int64Buffer[2]).add(op.xor64(xl, qt[26], qt[2])); | ||
out[3] = op.xor64(xh.shiftRight(1), qt[19].shiftLeft(5), int64Buffer[3]).add(op.xor64(xl, qt[27], qt[3])); | ||
out[4] = op.xor64(xh.shiftRight(3), qt[20], int64Buffer[4]).add(op.xor64(xl, qt[28], qt[4])); | ||
out[5] = op.xor64(xh.shiftLeft(6), qt[21].shiftRight(6), int64Buffer[5]).add(op.xor64(xl, qt[29], qt[5])); | ||
out[6] = op.xor64(xh.shiftRight(4), qt[22].shiftLeft(6), int64Buffer[6]).add(op.xor64(xl, qt[30], qt[6])); | ||
out[7] = op.xor64(xh.shiftRight(11), qt[23].shiftLeft(2), int64Buffer[7]).add(op.xor64(xl, qt[31], qt[7])); | ||
out[8] = out[4].rotateLeft(9).add(op.xor64(xh, qt[24], int64Buffer[8])).add(op.xor64(xl.shiftLeft(8), qt[23], qt[8])); | ||
out[9] = out[5].rotateLeft(10).add(op.xor64(xh, qt[25], int64Buffer[9])).add(op.xor64(xl.shiftRight(6), qt[16], qt[9])); | ||
out[10] = out[6].rotateLeft(11).add(op.xor64(xh, qt[26], int64Buffer[10])).add(op.xor64(xl.shiftLeft(6), qt[17], qt[10])); | ||
out[11] = out[7].rotateLeft(12).add(op.xor64(xh, qt[27], int64Buffer[11])).add(op.xor64(xl.shiftLeft(4), qt[18], qt[11])); | ||
out[12] = out[0].rotateLeft(13).add(op.xor64(xh, qt[28], int64Buffer[12])).add(op.xor64(xl.shiftRight(3), qt[19], qt[12])); | ||
out[13] = out[1].rotateLeft(14).add(op.xor64(xh, qt[29], int64Buffer[13])).add(op.xor64(xl.shiftRight(4), qt[20], qt[13])); | ||
out[14] = out[2].rotateLeft(15).add(op.xor64(xh, qt[30], int64Buffer[14])).add(op.xor64(xl.shiftRight(7), qt[21], qt[14])); | ||
out[15] = out[3].rotateLeft(16).add(op.xor64(xh, qt[31], int64Buffer[15])).add(op.xor64(xl.shiftRight(2), qt[22], qt[15])); | ||
return out; | ||
} | ||
var out = new Array(16); | ||
var qt = makeQ(int64Buffer, state); | ||
var xl = o.xor64(qt[16], qt[17], qt[18], qt[19], qt[20], qt[21], qt[22], qt[23]); | ||
var xh = o.xor64(xl, qt[24], qt[25], qt[26], qt[27], qt[28], qt[29], qt[30], qt[31]); | ||
out[0] = o.xor64(xh.shiftLeft(5), qt[16].shiftRight(5), int64Buffer[0]).add(o.xor64(xl, qt[24], qt[0])); | ||
out[1] = o.xor64(xh.shiftRight(7), qt[17].shiftLeft(8), int64Buffer[1]).add(o.xor64(xl, qt[25], qt[1])); | ||
out[2] = o.xor64(xh.shiftRight(5), qt[18].shiftLeft(5), int64Buffer[2]).add(o.xor64(xl, qt[26], qt[2])); | ||
out[3] = o.xor64(xh.shiftRight(1), qt[19].shiftLeft(5), int64Buffer[3]).add(o.xor64(xl, qt[27], qt[3])); | ||
out[4] = o.xor64(xh.shiftRight(3), qt[20], int64Buffer[4]).add(o.xor64(xl, qt[28], qt[4])); | ||
out[5] = o.xor64(xh.shiftLeft(6), qt[21].shiftRight(6), int64Buffer[5]).add(o.xor64(xl, qt[29], qt[5])); | ||
out[6] = o.xor64(xh.shiftRight(4), qt[22].shiftLeft(6), int64Buffer[6]).add(o.xor64(xl, qt[30], qt[6])); | ||
out[7] = o.xor64(xh.shiftRight(11), qt[23].shiftLeft(2), int64Buffer[7]).add(o.xor64(xl, qt[31], qt[7])); | ||
out[8] = out[4].rotateLeft(9).add(o.xor64(xh, qt[24], int64Buffer[8])) | ||
.add(o.xor64(xl.shiftLeft(8), qt[23], qt[8])); | ||
out[9] = out[5].rotateLeft(10).add(o.xor64(xh, qt[25], int64Buffer[9])) | ||
.add(o.xor64(xl.shiftRight(6), qt[16], qt[9])); | ||
out[10] = out[6].rotateLeft(11).add(o.xor64(xh, qt[26], int64Buffer[10])) | ||
.add(o.xor64(xl.shiftLeft(6), qt[17], qt[10])); | ||
out[11] = out[7].rotateLeft(12).add(o.xor64(xh, qt[27], int64Buffer[11])) | ||
.add(o.xor64(xl.shiftLeft(4), qt[18], qt[11])); | ||
out[12] = out[0].rotateLeft(13).add(o.xor64(xh, qt[28], int64Buffer[12])) | ||
.add(o.xor64(xl.shiftRight(3), qt[19], qt[12])); | ||
out[13] = out[1].rotateLeft(14).add(o.xor64(xh, qt[29], int64Buffer[13])) | ||
.add(o.xor64(xl.shiftRight(4), qt[20], qt[13])); | ||
out[14] = out[2].rotateLeft(15).add(o.xor64(xh, qt[30], int64Buffer[14])) | ||
.add(o.xor64(xl.shiftRight(7), qt[21], qt[14])); | ||
out[15] = out[3].rotateLeft(16).add(o.xor64(xh, qt[31], int64Buffer[15])) | ||
.add(o.xor64(xl.shiftRight(2), qt[22], qt[15])); | ||
return out; | ||
}; | ||
var compress = function(buf, state) { | ||
var int64Buf = h.bytes2Int64BufferLeAligned(buf); | ||
return fold(int64Buf, state); | ||
} | ||
var int64Buf = h.bytes2Int64BufferLeAligned(buf); | ||
return fold(int64Buf, state); | ||
}; | ||
var bmw = function(ctx, data) { | ||
var htmp = new Array(16); | ||
var len = data.length; | ||
var lenL3 = new op.u64(0, len); | ||
lenL3 = lenL3.shiftLeft(3); | ||
ctx.bitCount.add(lenL3); | ||
var buf = ctx.buffer; | ||
var ptr = ctx.ptr; | ||
var h1 = ctx.state; | ||
var h2 = htmp; | ||
while (len > 0) { | ||
var clen = ctx.buffer.length - ptr; | ||
if (clen > len) | ||
clen = len; | ||
op.bufferInsert(buf, ptr, data, clen); | ||
data = data.slice(clen); | ||
len -= clen; | ||
ptr += clen; | ||
if (ptr === ctx.buffer.length) { | ||
var ht; | ||
h2 = compress(buf, h1); | ||
ht = h1; | ||
h1 = h2; | ||
h2 = ht; | ||
ptr = 0; | ||
var htmp = new Array(16); | ||
var len = data.length; | ||
var lenL3 = o.u(0, len); | ||
lenL3 = lenL3.shiftLeft(3); | ||
ctx.bitCount.add(lenL3); | ||
var buf = ctx.buffer; | ||
var ptr = ctx.ptr; | ||
var h1 = ctx.state; | ||
var h2 = htmp; | ||
while (len > 0) { | ||
var clen = ctx.buffer.length - ptr; | ||
if (clen > len) clen = len; | ||
o.bufferInsert(buf, ptr, data, clen); | ||
data = data.slice(clen); | ||
len -= clen; | ||
ptr += clen; | ||
if (ptr === ctx.buffer.length) { | ||
var ht; | ||
h2 = compress(buf, h1); | ||
ht = h1; | ||
h1 = h2; | ||
h2 = ht; | ||
ptr = 0; | ||
} | ||
} | ||
} | ||
ctx.ptr = ptr; | ||
if (h1 !== ctx.state) | ||
op.bufferInsert(ctx.state, 0, h1, ctx.state.length); | ||
} | ||
ctx.ptr = ptr; | ||
if (h1 !== ctx.state) o.bufferInsert(ctx.state, 0, h1, ctx.state.length); | ||
}; | ||
var bmwClose = function(ctx) { | ||
var h1; | ||
var h2 = new Array(16); | ||
var h1; | ||
var h2 = new Array(16); | ||
var buf = ctx.buffer; | ||
var ptr = ctx.ptr; | ||
var len = buf.length; | ||
buf[ptr++] = 0x80; | ||
var hState = ctx.state; | ||
if (ptr > len - 8) { | ||
op.bufferSet(buf, ptr, 0, len - ptr); | ||
hState = compress(buf, hState); | ||
ptr = 0; | ||
} | ||
op.bufferSet(buf, ptr, 0, len - 8 - ptr); | ||
h.bufferEncode64leAligned(buf, len - 8, ctx.bitCount); | ||
h2 = compress(buf, hState); | ||
for (u = 0; u < 16; u++) | ||
h.bufferEncode64leAligned(buf, 8 * u, h2[u]); | ||
h1 = compress(buf, final); | ||
var out = new Array(16); | ||
for (var u = 0, v = 8; u < 8; u++, v++) { | ||
out[2 * u] = op.swap32(h1[v].lo); | ||
out[2 * u + 1] = op.swap32(h1[v].hi); | ||
} | ||
return out; | ||
} | ||
var buf = ctx.buffer; | ||
var ptr = ctx.ptr; | ||
var len = buf.length; | ||
buf[ptr++] = 0x80; | ||
var hState = ctx.state; | ||
if (ptr > len - 8) { | ||
o.bufferSet(buf, ptr, 0, len - ptr); | ||
hState = compress(buf, hState); | ||
ptr = 0; | ||
} | ||
o.bufferSet(buf, ptr, 0, len - 8 - ptr); | ||
h.bufferEncode64leAligned(buf, len - 8, ctx.bitCount); | ||
h2 = compress(buf, hState); | ||
for (u = 0; u < 16; u++) h.bufferEncode64leAligned(buf, 8 * u, h2[u]); | ||
h1 = compress(buf, final); | ||
var out = new Array(16); | ||
for (var u = 0, v = 8; u < 8; u++, v++) { | ||
out[2 * u] = o.swap32(h1[v].lo); | ||
out[2 * u + 1] = o.swap32(h1[v].hi); | ||
} | ||
return out; | ||
}; | ||
module.exports = function(input, format, output) { | ||
var msg; | ||
if (format === 1) { | ||
msg = input; | ||
} | ||
else if (format === 2) { | ||
msg = h.int32Buffer2Bytes(input); | ||
} | ||
else { | ||
msg = h.string2bytes(input); | ||
} | ||
var ctx = {}; | ||
ctx.state = op.clone64Array(V_INIT); | ||
ctx.ptr = 0; | ||
ctx.bitCount = op.u64.prototype.zero(); | ||
ctx.buffer = new Array(128); | ||
bmw(ctx, msg); | ||
var r = bmwClose(ctx, 0, 0); | ||
var out; | ||
if (output === 2) { | ||
out = r; | ||
} | ||
else if (output === 1) { | ||
out = h.int32Buffer2Bytes(r) | ||
} | ||
else { | ||
out = h.int32ArrayToHexString(r) | ||
} | ||
return out; | ||
} | ||
var msg; | ||
if (format === 1) { | ||
msg = input; | ||
} | ||
else if (format === 2) { | ||
msg = h.int32Buffer2Bytes(input); | ||
} | ||
else { | ||
msg = h.string2bytes(input); | ||
} | ||
var ctx = {}; | ||
ctx.state = o.clone64Array(V_INIT); | ||
ctx.ptr = 0; | ||
ctx.bitCount = o.u(0,0); | ||
ctx.buffer = new Array(128); | ||
bmw(ctx, msg); | ||
var r = bmwClose(ctx, 0, 0); | ||
var out; | ||
if (output === 2) { | ||
out = r; | ||
} | ||
else if (output === 1) { | ||
out = h.int32Buffer2Bytes(r); | ||
} | ||
else { | ||
out = h.int32ArrayToHexString(r); | ||
} | ||
return out; | ||
}; |
@@ -0,1 +1,2 @@ | ||
'use strict'; | ||
///////////////////////////////////// | ||
@@ -16,317 +17,315 @@ //////////// Cubehash ////////////// | ||
var IV512 = [ | ||
0x2AEA2A61, 0x50F494D4, 0x2D538B8B, | ||
0x4167D83E, 0x3FEE2313, 0xC701CF8C, | ||
0xCC39968E, 0x50AC5695, 0x4D42C787, | ||
0xA647A8B3, 0x97CF0BEF, 0x825B4537, | ||
0xEEF864D2, 0xF22090C4, 0xD0E5CD33, | ||
0xA23911AE, 0xFCD398D9, 0x148FE485, | ||
0x1B017BEF, 0xB6444532, 0x6A536159, | ||
0x2FF5781C, 0x91FA7934, 0x0DBADEA9, | ||
0xD65C8A2B, 0xA5A70E75, 0xB1C62456, | ||
0xBC796576, 0x1921C8F7, 0xE7989AF1, | ||
0x7795D246, 0xD43E3B44, | ||
0x2AEA2A61, 0x50F494D4, 0x2D538B8B, | ||
0x4167D83E, 0x3FEE2313, 0xC701CF8C, | ||
0xCC39968E, 0x50AC5695, 0x4D42C787, | ||
0xA647A8B3, 0x97CF0BEF, 0x825B4537, | ||
0xEEF864D2, 0xF22090C4, 0xD0E5CD33, | ||
0xA23911AE, 0xFCD398D9, 0x148FE485, | ||
0x1B017BEF, 0xB6444532, 0x6A536159, | ||
0x2FF5781C, 0x91FA7934, 0x0DBADEA9, | ||
0xD65C8A2B, 0xA5A70E75, 0xB1C62456, | ||
0xBC796576, 0x1921C8F7, 0xE7989AF1, | ||
0x7795D246, 0xD43E3B44, | ||
]; | ||
var ROUND_EVEN = function(x) { | ||
x[16] = 0xFFFFFFFF & (x[0] + x[16]); | ||
x[0] = op.rotl32(x[0], 7); | ||
x[17] = 0xFFFFFFFF & (x[1] + x[17]); | ||
x[1] = op.rotl32(x[1], 7); | ||
x[18] = 0xFFFFFFFF & (x[2] + x[18]); | ||
x[2] = op.rotl32(x[2], 7); | ||
x[19] = 0xFFFFFFFF & (x[3] + x[19]); | ||
x[3] = op.rotl32(x[3], 7); | ||
x[20] = 0xFFFFFFFF & (x[4] + x[20]); | ||
x[4] = op.rotl32(x[4], 7); | ||
x[21] = 0xFFFFFFFF & (x[5] + x[21]); | ||
x[5] = op.rotl32(x[5], 7); | ||
x[22] = 0xFFFFFFFF & (x[6] + x[22]); | ||
x[6] = op.rotl32(x[6], 7); | ||
x[23] = 0xFFFFFFFF & (x[7] + x[23]); | ||
x[7] = op.rotl32(x[7], 7); | ||
x[24] = 0xFFFFFFFF & (x[8] + x[24]); | ||
x[8] = op.rotl32(x[8], 7); | ||
x[25] = 0xFFFFFFFF & (x[9] + x[25]); | ||
x[9] = op.rotl32(x[9], 7); | ||
x[26] = 0xFFFFFFFF & (x[10] + x[26]); | ||
x[10] = op.rotl32(x[10], 7); | ||
x[27] = 0xFFFFFFFF & (x[11] + x[27]); | ||
x[11] = op.rotl32(x[11], 7); | ||
x[28] = 0xFFFFFFFF & (x[12] + x[28]); | ||
x[12] = op.rotl32(x[12], 7); | ||
x[29] = 0xFFFFFFFF & (x[13] + x[29]); | ||
x[13] = op.rotl32(x[13], 7); | ||
x[30] = 0xFFFFFFFF & (x[14] + x[30]); | ||
x[14] = op.rotl32(x[14], 7); | ||
x[31] = 0xFFFFFFFF & (x[15] + x[31]); | ||
x[15] = op.rotl32(x[15], 7); | ||
x[8] ^= x[16]; | ||
x[9] ^= x[17]; | ||
x[10] ^= x[18]; | ||
x[11] ^= x[19]; | ||
x[12] ^= x[20]; | ||
x[13] ^= x[21]; | ||
x[14] ^= x[22]; | ||
x[15] ^= x[23]; | ||
x[0] ^= x[24]; | ||
x[1] ^= x[25]; | ||
x[2] ^= x[26]; | ||
x[3] ^= x[27]; | ||
x[4] ^= x[28]; | ||
x[5] ^= x[29]; | ||
x[6] ^= x[30]; | ||
x[7] ^= x[31]; | ||
x[18] = 0xFFFFFFFF & (x[8] + x[18]); | ||
x[8] = op.rotl32(x[8], 11); | ||
x[19] = 0xFFFFFFFF & (x[9] + x[19]); | ||
x[9] = op.rotl32(x[9], 11); | ||
x[16] = 0xFFFFFFFF & (x[10] + x[16]); | ||
x[10] = op.rotl32(x[10], 11); | ||
x[17] = 0xFFFFFFFF & (x[11] + x[17]); | ||
x[11] = op.rotl32(x[11], 11); | ||
x[22] = 0xFFFFFFFF & (x[12] + x[22]); | ||
x[12] = op.rotl32(x[12], 11); | ||
x[23] = 0xFFFFFFFF & (x[13] + x[23]); | ||
x[13] = op.rotl32(x[13], 11); | ||
x[20] = 0xFFFFFFFF & (x[14] + x[20]); | ||
x[14] = op.rotl32(x[14], 11); | ||
x[21] = 0xFFFFFFFF & (x[15] + x[21]); | ||
x[15] = op.rotl32(x[15], 11); | ||
x[26] = 0xFFFFFFFF & (x[0] + x[26]); | ||
x[0] = op.rotl32(x[0], 11); | ||
x[27] = 0xFFFFFFFF & (x[1] + x[27]); | ||
x[1] = op.rotl32(x[1], 11); | ||
x[24] = 0xFFFFFFFF & (x[2] + x[24]); | ||
x[2] = op.rotl32(x[2], 11); | ||
x[25] = 0xFFFFFFFF & (x[3] + x[25]); | ||
x[3] = op.rotl32(x[3], 11); | ||
x[30] = 0xFFFFFFFF & (x[4] + x[30]); | ||
x[4] = op.rotl32(x[4], 11); | ||
x[31] = 0xFFFFFFFF & (x[5] + x[31]); | ||
x[5] = op.rotl32(x[5], 11); | ||
x[28] = 0xFFFFFFFF & (x[6] + x[28]); | ||
x[6] = op.rotl32(x[6], 11); | ||
x[29] = 0xFFFFFFFF & (x[7] + x[29]); | ||
x[7] = op.rotl32(x[7], 11); | ||
x[12] ^= x[18]; | ||
x[13] ^= x[19]; | ||
x[14] ^= x[16]; | ||
x[15] ^= x[17]; | ||
x[8] ^= x[22]; | ||
x[9] ^= x[23]; | ||
x[10] ^= x[20]; | ||
x[11] ^= x[21]; | ||
x[4] ^= x[26]; | ||
x[5] ^= x[27]; | ||
x[6] ^= x[24]; | ||
x[7] ^= x[25]; | ||
x[0] ^= x[30]; | ||
x[1] ^= x[31]; | ||
x[2] ^= x[28]; | ||
x[3] ^= x[29]; | ||
} | ||
x[16] = 0xFFFFFFFF & (x[0] + x[16]); | ||
x[0] = op.rotl32(x[0], 7); | ||
x[17] = 0xFFFFFFFF & (x[1] + x[17]); | ||
x[1] = op.rotl32(x[1], 7); | ||
x[18] = 0xFFFFFFFF & (x[2] + x[18]); | ||
x[2] = op.rotl32(x[2], 7); | ||
x[19] = 0xFFFFFFFF & (x[3] + x[19]); | ||
x[3] = op.rotl32(x[3], 7); | ||
x[20] = 0xFFFFFFFF & (x[4] + x[20]); | ||
x[4] = op.rotl32(x[4], 7); | ||
x[21] = 0xFFFFFFFF & (x[5] + x[21]); | ||
x[5] = op.rotl32(x[5], 7); | ||
x[22] = 0xFFFFFFFF & (x[6] + x[22]); | ||
x[6] = op.rotl32(x[6], 7); | ||
x[23] = 0xFFFFFFFF & (x[7] + x[23]); | ||
x[7] = op.rotl32(x[7], 7); | ||
x[24] = 0xFFFFFFFF & (x[8] + x[24]); | ||
x[8] = op.rotl32(x[8], 7); | ||
x[25] = 0xFFFFFFFF & (x[9] + x[25]); | ||
x[9] = op.rotl32(x[9], 7); | ||
x[26] = 0xFFFFFFFF & (x[10] + x[26]); | ||
x[10] = op.rotl32(x[10], 7); | ||
x[27] = 0xFFFFFFFF & (x[11] + x[27]); | ||
x[11] = op.rotl32(x[11], 7); | ||
x[28] = 0xFFFFFFFF & (x[12] + x[28]); | ||
x[12] = op.rotl32(x[12], 7); | ||
x[29] = 0xFFFFFFFF & (x[13] + x[29]); | ||
x[13] = op.rotl32(x[13], 7); | ||
x[30] = 0xFFFFFFFF & (x[14] + x[30]); | ||
x[14] = op.rotl32(x[14], 7); | ||
x[31] = 0xFFFFFFFF & (x[15] + x[31]); | ||
x[15] = op.rotl32(x[15], 7); | ||
x[8] ^= x[16]; | ||
x[9] ^= x[17]; | ||
x[10] ^= x[18]; | ||
x[11] ^= x[19]; | ||
x[12] ^= x[20]; | ||
x[13] ^= x[21]; | ||
x[14] ^= x[22]; | ||
x[15] ^= x[23]; | ||
x[0] ^= x[24]; | ||
x[1] ^= x[25]; | ||
x[2] ^= x[26]; | ||
x[3] ^= x[27]; | ||
x[4] ^= x[28]; | ||
x[5] ^= x[29]; | ||
x[6] ^= x[30]; | ||
x[7] ^= x[31]; | ||
x[18] = 0xFFFFFFFF & (x[8] + x[18]); | ||
x[8] = op.rotl32(x[8], 11); | ||
x[19] = 0xFFFFFFFF & (x[9] + x[19]); | ||
x[9] = op.rotl32(x[9], 11); | ||
x[16] = 0xFFFFFFFF & (x[10] + x[16]); | ||
x[10] = op.rotl32(x[10], 11); | ||
x[17] = 0xFFFFFFFF & (x[11] + x[17]); | ||
x[11] = op.rotl32(x[11], 11); | ||
x[22] = 0xFFFFFFFF & (x[12] + x[22]); | ||
x[12] = op.rotl32(x[12], 11); | ||
x[23] = 0xFFFFFFFF & (x[13] + x[23]); | ||
x[13] = op.rotl32(x[13], 11); | ||
x[20] = 0xFFFFFFFF & (x[14] + x[20]); | ||
x[14] = op.rotl32(x[14], 11); | ||
x[21] = 0xFFFFFFFF & (x[15] + x[21]); | ||
x[15] = op.rotl32(x[15], 11); | ||
x[26] = 0xFFFFFFFF & (x[0] + x[26]); | ||
x[0] = op.rotl32(x[0], 11); | ||
x[27] = 0xFFFFFFFF & (x[1] + x[27]); | ||
x[1] = op.rotl32(x[1], 11); | ||
x[24] = 0xFFFFFFFF & (x[2] + x[24]); | ||
x[2] = op.rotl32(x[2], 11); | ||
x[25] = 0xFFFFFFFF & (x[3] + x[25]); | ||
x[3] = op.rotl32(x[3], 11); | ||
x[30] = 0xFFFFFFFF & (x[4] + x[30]); | ||
x[4] = op.rotl32(x[4], 11); | ||
x[31] = 0xFFFFFFFF & (x[5] + x[31]); | ||
x[5] = op.rotl32(x[5], 11); | ||
x[28] = 0xFFFFFFFF & (x[6] + x[28]); | ||
x[6] = op.rotl32(x[6], 11); | ||
x[29] = 0xFFFFFFFF & (x[7] + x[29]); | ||
x[7] = op.rotl32(x[7], 11); | ||
x[12] ^= x[18]; | ||
x[13] ^= x[19]; | ||
x[14] ^= x[16]; | ||
x[15] ^= x[17]; | ||
x[8] ^= x[22]; | ||
x[9] ^= x[23]; | ||
x[10] ^= x[20]; | ||
x[11] ^= x[21]; | ||
x[4] ^= x[26]; | ||
x[5] ^= x[27]; | ||
x[6] ^= x[24]; | ||
x[7] ^= x[25]; | ||
x[0] ^= x[30]; | ||
x[1] ^= x[31]; | ||
x[2] ^= x[28]; | ||
x[3] ^= x[29]; | ||
}; | ||
var ROUND_ODD = function(x) { | ||
x[19] = 0xFFFFFFFF & (x[12] + x[19]); | ||
x[12] = op.rotl32(x[12], 7); | ||
x[18] = 0xFFFFFFFF & (x[13] + x[18]); | ||
x[13] = op.rotl32(x[13], 7); | ||
x[17] = 0xFFFFFFFF & (x[14] + x[17]); | ||
x[14] = op.rotl32(x[14], 7); | ||
x[16] = 0xFFFFFFFF & (x[15] + x[16]); | ||
x[15] = op.rotl32(x[15], 7); | ||
x[23] = 0xFFFFFFFF & (x[8] + x[23]); | ||
x[8] = op.rotl32(x[8], 7); | ||
x[22] = 0xFFFFFFFF & (x[9] + x[22]); | ||
x[9] = op.rotl32(x[9], 7); | ||
x[21] = 0xFFFFFFFF & (x[10] + x[21]); | ||
x[10] = op.rotl32(x[10], 7); | ||
x[20] = 0xFFFFFFFF & (x[11] + x[20]); | ||
x[11] = op.rotl32(x[11], 7); | ||
x[27] = 0xFFFFFFFF & (x[4] + x[27]); | ||
x[4] = op.rotl32(x[4], 7); | ||
x[26] = 0xFFFFFFFF & (x[5] + x[26]); | ||
x[5] = op.rotl32(x[5], 7); | ||
x[25] = 0xFFFFFFFF & (x[6] + x[25]); | ||
x[6] = op.rotl32(x[6], 7); | ||
x[24] = 0xFFFFFFFF & (x[7] + x[24]); | ||
x[7] = op.rotl32(x[7], 7); | ||
x[31] = 0xFFFFFFFF & (x[0] + x[31]); | ||
x[0] = op.rotl32(x[0], 7); | ||
x[30] = 0xFFFFFFFF & (x[1] + x[30]); | ||
x[1] = op.rotl32(x[1], 7); | ||
x[29] = 0xFFFFFFFF & (x[2] + x[29]); | ||
x[2] = op.rotl32(x[2], 7); | ||
x[28] = 0xFFFFFFFF & (x[3] + x[28]); | ||
x[3] = op.rotl32(x[3], 7); | ||
x[4] ^= x[19]; | ||
x[5] ^= x[18]; | ||
x[6] ^= x[17]; | ||
x[7] ^= x[16]; | ||
x[0] ^= x[23]; | ||
x[1] ^= x[22]; | ||
x[2] ^= x[21]; | ||
x[3] ^= x[20]; | ||
x[12] ^= x[27]; | ||
x[13] ^= x[26]; | ||
x[14] ^= x[25]; | ||
x[15] ^= x[24]; | ||
x[8] ^= x[31]; | ||
x[9] ^= x[30]; | ||
x[10] ^= x[29]; | ||
x[11] ^= x[28]; | ||
x[17] = 0xFFFFFFFF & (x[4] + x[17]); | ||
x[4] = op.rotl32(x[4], 11); | ||
x[16] = 0xFFFFFFFF & (x[5] + x[16]); | ||
x[5] = op.rotl32(x[5], 11); | ||
x[19] = 0xFFFFFFFF & (x[6] + x[19]); | ||
x[6] = op.rotl32(x[6], 11); | ||
x[18] = 0xFFFFFFFF & (x[7] + x[18]); | ||
x[7] = op.rotl32(x[7], 11); | ||
x[21] = 0xFFFFFFFF & (x[0] + x[21]); | ||
x[0] = op.rotl32(x[0], 11); | ||
x[20] = 0xFFFFFFFF & (x[1] + x[20]); | ||
x[1] = op.rotl32(x[1], 11); | ||
x[23] = 0xFFFFFFFF & (x[2] + x[23]); | ||
x[2] = op.rotl32(x[2], 11); | ||
x[22] = 0xFFFFFFFF & (x[3] + x[22]); | ||
x[3] = op.rotl32(x[3], 11); | ||
x[25] = 0xFFFFFFFF & (x[12] + x[25]); | ||
x[12] = op.rotl32(x[12], 11); | ||
x[24] = 0xFFFFFFFF & (x[13] + x[24]); | ||
x[13] = op.rotl32(x[13], 11); | ||
x[27] = 0xFFFFFFFF & (x[14] + x[27]); | ||
x[14] = op.rotl32(x[14], 11); | ||
x[26] = 0xFFFFFFFF & (x[15] + x[26]); | ||
x[15] = op.rotl32(x[15], 11); | ||
x[29] = 0xFFFFFFFF & (x[8] + x[29]); | ||
x[8] = op.rotl32(x[8], 11); | ||
x[28] = 0xFFFFFFFF & (x[9] + x[28]); | ||
x[9] = op.rotl32(x[9], 11); | ||
x[31] = 0xFFFFFFFF & (x[10] + x[31]); | ||
x[10] = op.rotl32(x[10], 11); | ||
x[30] = 0xFFFFFFFF & (x[11] + x[30]); | ||
x[11] = op.rotl32(x[11], 11); | ||
x[0] ^= x[17]; | ||
x[1] ^= x[16]; | ||
x[2] ^= x[19]; | ||
x[3] ^= x[18]; | ||
x[4] ^= x[21]; | ||
x[5] ^= x[20]; | ||
x[6] ^= x[23]; | ||
x[7] ^= x[22]; | ||
x[8] ^= x[25]; | ||
x[9] ^= x[24]; | ||
x[10] ^= x[27]; | ||
x[11] ^= x[26]; | ||
x[12] ^= x[29]; | ||
x[13] ^= x[28]; | ||
x[14] ^= x[31]; | ||
x[15] ^= x[30]; | ||
} | ||
x[19] = 0xFFFFFFFF & (x[12] + x[19]); | ||
x[12] = op.rotl32(x[12], 7); | ||
x[18] = 0xFFFFFFFF & (x[13] + x[18]); | ||
x[13] = op.rotl32(x[13], 7); | ||
x[17] = 0xFFFFFFFF & (x[14] + x[17]); | ||
x[14] = op.rotl32(x[14], 7); | ||
x[16] = 0xFFFFFFFF & (x[15] + x[16]); | ||
x[15] = op.rotl32(x[15], 7); | ||
x[23] = 0xFFFFFFFF & (x[8] + x[23]); | ||
x[8] = op.rotl32(x[8], 7); | ||
x[22] = 0xFFFFFFFF & (x[9] + x[22]); | ||
x[9] = op.rotl32(x[9], 7); | ||
x[21] = 0xFFFFFFFF & (x[10] + x[21]); | ||
x[10] = op.rotl32(x[10], 7); | ||
x[20] = 0xFFFFFFFF & (x[11] + x[20]); | ||
x[11] = op.rotl32(x[11], 7); | ||
x[27] = 0xFFFFFFFF & (x[4] + x[27]); | ||
x[4] = op.rotl32(x[4], 7); | ||
x[26] = 0xFFFFFFFF & (x[5] + x[26]); | ||
x[5] = op.rotl32(x[5], 7); | ||
x[25] = 0xFFFFFFFF & (x[6] + x[25]); | ||
x[6] = op.rotl32(x[6], 7); | ||
x[24] = 0xFFFFFFFF & (x[7] + x[24]); | ||
x[7] = op.rotl32(x[7], 7); | ||
x[31] = 0xFFFFFFFF & (x[0] + x[31]); | ||
x[0] = op.rotl32(x[0], 7); | ||
x[30] = 0xFFFFFFFF & (x[1] + x[30]); | ||
x[1] = op.rotl32(x[1], 7); | ||
x[29] = 0xFFFFFFFF & (x[2] + x[29]); | ||
x[2] = op.rotl32(x[2], 7); | ||
x[28] = 0xFFFFFFFF & (x[3] + x[28]); | ||
x[3] = op.rotl32(x[3], 7); | ||
x[4] ^= x[19]; | ||
x[5] ^= x[18]; | ||
x[6] ^= x[17]; | ||
x[7] ^= x[16]; | ||
x[0] ^= x[23]; | ||
x[1] ^= x[22]; | ||
x[2] ^= x[21]; | ||
x[3] ^= x[20]; | ||
x[12] ^= x[27]; | ||
x[13] ^= x[26]; | ||
x[14] ^= x[25]; | ||
x[15] ^= x[24]; | ||
x[8] ^= x[31]; | ||
x[9] ^= x[30]; | ||
x[10] ^= x[29]; | ||
x[11] ^= x[28]; | ||
x[17] = 0xFFFFFFFF & (x[4] + x[17]); | ||
x[4] = op.rotl32(x[4], 11); | ||
x[16] = 0xFFFFFFFF & (x[5] + x[16]); | ||
x[5] = op.rotl32(x[5], 11); | ||
x[19] = 0xFFFFFFFF & (x[6] + x[19]); | ||
x[6] = op.rotl32(x[6], 11); | ||
x[18] = 0xFFFFFFFF & (x[7] + x[18]); | ||
x[7] = op.rotl32(x[7], 11); | ||
x[21] = 0xFFFFFFFF & (x[0] + x[21]); | ||
x[0] = op.rotl32(x[0], 11); | ||
x[20] = 0xFFFFFFFF & (x[1] + x[20]); | ||
x[1] = op.rotl32(x[1], 11); | ||
x[23] = 0xFFFFFFFF & (x[2] + x[23]); | ||
x[2] = op.rotl32(x[2], 11); | ||
x[22] = 0xFFFFFFFF & (x[3] + x[22]); | ||
x[3] = op.rotl32(x[3], 11); | ||
x[25] = 0xFFFFFFFF & (x[12] + x[25]); | ||
x[12] = op.rotl32(x[12], 11); | ||
x[24] = 0xFFFFFFFF & (x[13] + x[24]); | ||
x[13] = op.rotl32(x[13], 11); | ||
x[27] = 0xFFFFFFFF & (x[14] + x[27]); | ||
x[14] = op.rotl32(x[14], 11); | ||
x[26] = 0xFFFFFFFF & (x[15] + x[26]); | ||
x[15] = op.rotl32(x[15], 11); | ||
x[29] = 0xFFFFFFFF & (x[8] + x[29]); | ||
x[8] = op.rotl32(x[8], 11); | ||
x[28] = 0xFFFFFFFF & (x[9] + x[28]); | ||
x[9] = op.rotl32(x[9], 11); | ||
x[31] = 0xFFFFFFFF & (x[10] + x[31]); | ||
x[10] = op.rotl32(x[10], 11); | ||
x[30] = 0xFFFFFFFF & (x[11] + x[30]); | ||
x[11] = op.rotl32(x[11], 11); | ||
x[0] ^= x[17]; | ||
x[1] ^= x[16]; | ||
x[2] ^= x[19]; | ||
x[3] ^= x[18]; | ||
x[4] ^= x[21]; | ||
x[5] ^= x[20]; | ||
x[6] ^= x[23]; | ||
x[7] ^= x[22]; | ||
x[8] ^= x[25]; | ||
x[9] ^= x[24]; | ||
x[10] ^= x[27]; | ||
x[11] ^= x[26]; | ||
x[12] ^= x[29]; | ||
x[13] ^= x[28]; | ||
x[14] ^= x[31]; | ||
x[15] ^= x[30]; | ||
}; | ||
var SIXTEEN_ROUNDS = function(x) { | ||
ROUND_EVEN(x); | ||
ROUND_ODD(x); | ||
ROUND_EVEN(x); | ||
ROUND_ODD(x); | ||
ROUND_EVEN(x); | ||
ROUND_ODD(x); | ||
ROUND_EVEN(x); | ||
ROUND_ODD(x); | ||
ROUND_EVEN(x); | ||
ROUND_ODD(x); | ||
ROUND_EVEN(x); | ||
ROUND_ODD(x); | ||
ROUND_EVEN(x); | ||
ROUND_ODD(x); | ||
ROUND_EVEN(x); | ||
ROUND_ODD(x); | ||
} | ||
ROUND_EVEN(x); | ||
ROUND_ODD(x); | ||
ROUND_EVEN(x); | ||
ROUND_ODD(x); | ||
ROUND_EVEN(x); | ||
ROUND_ODD(x); | ||
ROUND_EVEN(x); | ||
ROUND_ODD(x); | ||
ROUND_EVEN(x); | ||
ROUND_ODD(x); | ||
ROUND_EVEN(x); | ||
ROUND_ODD(x); | ||
ROUND_EVEN(x); | ||
ROUND_ODD(x); | ||
ROUND_EVEN(x); | ||
ROUND_ODD(x); | ||
}; | ||
var cubehash = function(ctx, data) { | ||
var buf, ptr; | ||
//create a local copy of states | ||
var x = new Array(Cubehash_StateSize); | ||
buf = ctx.buffer; | ||
ptr = ctx.ptr; | ||
var len = data.length; | ||
if (len < ctx.buffer.length - ptr) { | ||
op.bufferInsert(buf, ptr, data, data.length); | ||
ptr += data.length; | ||
ctx.ptr = ptr; | ||
return; | ||
} | ||
//perform a deep copy of current state | ||
for (var i = 0; i < Cubehash_StateSize; i++) { | ||
x[i] = ctx.state[i]; | ||
} | ||
while (len > 0) { | ||
var clen = ctx.buffer.length - ptr; | ||
if (clen > len) clen = len; | ||
op.bufferInsert(buf, ptr, data, clen); | ||
ptr += clen; | ||
data = data.slice(clen); | ||
len -= clen; | ||
if (ptr === ctx.buffer.length) { | ||
var int32Buf = op.swap32Array(h.bytes2Int32Buffer(buf)); | ||
op.bufferXORInsert(x, 0, int32Buf,0, 8) | ||
SIXTEEN_ROUNDS(x); | ||
ptr = 0; | ||
} | ||
} | ||
ctx.state = x; | ||
ctx.ptr = ptr; | ||
} | ||
var buf, ptr; | ||
//create a local copy of states | ||
var x = new Array(Cubehash_StateSize); | ||
buf = ctx.buffer; | ||
ptr = ctx.ptr; | ||
var len = data.length; | ||
if (len < ctx.buffer.length - ptr) { | ||
op.bufferInsert(buf, ptr, data, data.length); | ||
ptr += data.length; | ||
ctx.ptr = ptr; | ||
return; | ||
} | ||
//perform a deep copy of current state | ||
for (var i = 0; i < Cubehash_StateSize; i++) { | ||
x[i] = ctx.state[i]; | ||
} | ||
while (len > 0) { | ||
var clen = ctx.buffer.length - ptr; | ||
if (clen > len) clen = len; | ||
op.bufferInsert(buf, ptr, data, clen); | ||
ptr += clen; | ||
data = data.slice(clen); | ||
len -= clen; | ||
if (ptr === ctx.buffer.length) { | ||
var int32Buf = op.swap32Array(h.bytes2Int32Buffer(buf)); | ||
op.bufferXORInsert(x, 0, int32Buf,0, 8); | ||
SIXTEEN_ROUNDS(x); | ||
ptr = 0; | ||
} | ||
} | ||
ctx.state = x; | ||
ctx.ptr = ptr; | ||
}; | ||
var cubehashClose = function(ctx) { | ||
var buf = ctx.buffer; | ||
var ptr = ctx.ptr; | ||
var x = new Array(Cubehash_StateSize); | ||
buf[ptr++] = 0x80; | ||
op.bufferSet(buf, ptr, 0, ctx.buffer.length - ptr); | ||
for (var i = 0; i < Cubehash_StateSize; i++) { | ||
x[i] = ctx.state[i]; | ||
} | ||
var int32Buf = op.swap32Array(h.bytes2Int32Buffer(buf)); | ||
op.bufferXORInsert(x, 0, int32Buf,0, 8) | ||
for (i = 0; i < 11; i++) { | ||
SIXTEEN_ROUNDS(x); | ||
if (i == 0) | ||
x[31] ^= 0xFFFFFFFF & (1); | ||
} | ||
ctx.state = x; | ||
var out = new Array(16); | ||
for (var u = 0; u < 16; u++) | ||
out[u] = op.swap32(ctx.state[u]); | ||
return out; | ||
} | ||
var buf = ctx.buffer; | ||
var ptr = ctx.ptr; | ||
var x = new Array(Cubehash_StateSize); | ||
buf[ptr++] = 0x80; | ||
op.bufferSet(buf, ptr, 0, ctx.buffer.length - ptr); | ||
for (var i = 0; i < Cubehash_StateSize; i++) { | ||
x[i] = ctx.state[i]; | ||
} | ||
var int32Buf = op.swap32Array(h.bytes2Int32Buffer(buf)); | ||
op.bufferXORInsert(x, 0, int32Buf,0, 8); | ||
for (i = 0; i < 11; i++) { | ||
SIXTEEN_ROUNDS(x); | ||
if (i === 0) x[31] ^= 0xFFFFFFFF & (1); | ||
} | ||
ctx.state = x; | ||
var out = new Array(16); | ||
for (var u = 0; u < 16; u++) out[u] = op.swap32(ctx.state[u]); | ||
return out; | ||
}; | ||
module.exports = function(input, format, output) { | ||
var msg; | ||
if (format === 1) { | ||
msg = input; | ||
} | ||
else if (format === 2) { | ||
msg = h.int32Buffer2Bytes(input); | ||
} | ||
else { | ||
msg = h.string2bytes(input); | ||
} | ||
var ctx = {}; | ||
ctx.state = IV512; | ||
ctx.ptr = 0; | ||
ctx.buffer = new Array(Cubehash_BlockSize); | ||
cubehash(ctx, msg); | ||
var r = cubehashClose(ctx); | ||
var out; | ||
if (output === 2) { | ||
out = r; | ||
} | ||
else if (output === 1) { | ||
out = h.int32Buffer2Bytes(r) | ||
} | ||
else { | ||
out = h.int32ArrayToHexString(r) | ||
} | ||
return out; | ||
} | ||
var msg; | ||
if (format === 1) { | ||
msg = input; | ||
} | ||
else if (format === 2) { | ||
msg = h.int32Buffer2Bytes(input); | ||
} | ||
else { | ||
msg = h.string2bytes(input); | ||
} | ||
var ctx = {}; | ||
ctx.state = IV512; | ||
ctx.ptr = 0; | ||
ctx.buffer = new Array(Cubehash_BlockSize); | ||
cubehash(ctx, msg); | ||
var r = cubehashClose(ctx); | ||
var out; | ||
if (output === 2) { | ||
out = r; | ||
} | ||
else if (output === 1) { | ||
out = h.int32Buffer2Bytes(r); | ||
} | ||
else { | ||
out = h.int32ArrayToHexString(r); | ||
} | ||
return out; | ||
}; |
456
lib/echo.js
@@ -0,1 +1,2 @@ | ||
'use strict'; | ||
///////////////////////////////////// | ||
@@ -16,272 +17,269 @@ /////////////// Echo /////////////// | ||
var subWords = function(W, pK) { | ||
for (var n = 0; n < 16; n++) { | ||
var X = W[n]; | ||
var Y = new Array(4); | ||
aes.AES_ROUND_LE(X, pK, Y); | ||
aes.AES_ROUND_NOKEY_LE(Y, X); | ||
if ((pK[0] = op.t32(pK[0] + 1)) === 0) { | ||
if ((pK[1] = op.t32(pK[1] + 1)) === 0) | ||
if ((pK[2] = op.t32(pK[2] + 1)) === 0) | ||
pK[3] = op.t32(pK[3] + 1); | ||
for (var n = 0; n < 16; n++) { | ||
var X = W[n]; | ||
var Y = new Array(4); | ||
aes.AES_ROUND_LE(X, pK, Y); | ||
aes.AES_ROUND_NOKEY_LE(Y, X); | ||
if ((pK[0] = op.t32(pK[0] + 1)) === 0) { | ||
if ((pK[1] = op.t32(pK[1] + 1)) === 0) if ((pK[2] = op.t32(pK[2] + 1)) === 0) pK[3] = op.t32(pK[3] + 1); | ||
} | ||
} | ||
} | ||
} | ||
}; | ||
var shiftRow1 = function(W, a, b, c, d) { | ||
var tmp; | ||
tmp = W[a][0]; | ||
W[a][0] = W[b][0]; | ||
W[b][0] = W[c][0]; | ||
W[c][0] = W[d][0]; | ||
W[d][0] = tmp; | ||
tmp = W[a][1]; | ||
W[a][1] = W[b][1]; | ||
W[b][1] = W[c][1]; | ||
W[c][1] = W[d][1]; | ||
W[d][1] = tmp; | ||
tmp = W[a][2]; | ||
W[a][2] = W[b][2]; | ||
W[b][2] = W[c][2]; | ||
W[c][2] = W[d][2]; | ||
W[d][2] = tmp; | ||
tmp = W[a][3]; | ||
W[a][3] = W[b][3]; | ||
W[b][3] = W[c][3]; | ||
W[c][3] = W[d][3]; | ||
W[d][3] = tmp; | ||
} | ||
var tmp; | ||
tmp = W[a][0]; | ||
W[a][0] = W[b][0]; | ||
W[b][0] = W[c][0]; | ||
W[c][0] = W[d][0]; | ||
W[d][0] = tmp; | ||
tmp = W[a][1]; | ||
W[a][1] = W[b][1]; | ||
W[b][1] = W[c][1]; | ||
W[c][1] = W[d][1]; | ||
W[d][1] = tmp; | ||
tmp = W[a][2]; | ||
W[a][2] = W[b][2]; | ||
W[b][2] = W[c][2]; | ||
W[c][2] = W[d][2]; | ||
W[d][2] = tmp; | ||
tmp = W[a][3]; | ||
W[a][3] = W[b][3]; | ||
W[b][3] = W[c][3]; | ||
W[c][3] = W[d][3]; | ||
W[d][3] = tmp; | ||
}; | ||
var shiftRow2 = function(W, a, b, c, d) { | ||
var tmp; | ||
tmp = W[a][0]; | ||
W[a][0] = W[c][0]; | ||
W[c][0] = tmp; | ||
tmp = W[b][0]; | ||
W[b][0] = W[d][0]; | ||
W[d][0] = tmp; | ||
tmp = W[a][1]; | ||
W[a][1] = W[c][1]; | ||
W[c][1] = tmp; | ||
tmp = W[b][1]; | ||
W[b][1] = W[d][1]; | ||
W[d][1] = tmp; | ||
tmp = W[a][2]; | ||
W[a][2] = W[c][2]; | ||
W[c][2] = tmp; | ||
tmp = W[b][2]; | ||
W[b][2] = W[d][2]; | ||
W[d][2] = tmp; | ||
tmp = W[a][3]; | ||
W[a][3] = W[c][3]; | ||
W[c][3] = tmp; | ||
tmp = W[b][3]; | ||
W[b][3] = W[d][3]; | ||
W[d][3] = tmp; | ||
} | ||
var tmp; | ||
tmp = W[a][0]; | ||
W[a][0] = W[c][0]; | ||
W[c][0] = tmp; | ||
tmp = W[b][0]; | ||
W[b][0] = W[d][0]; | ||
W[d][0] = tmp; | ||
tmp = W[a][1]; | ||
W[a][1] = W[c][1]; | ||
W[c][1] = tmp; | ||
tmp = W[b][1]; | ||
W[b][1] = W[d][1]; | ||
W[d][1] = tmp; | ||
tmp = W[a][2]; | ||
W[a][2] = W[c][2]; | ||
W[c][2] = tmp; | ||
tmp = W[b][2]; | ||
W[b][2] = W[d][2]; | ||
W[d][2] = tmp; | ||
tmp = W[a][3]; | ||
W[a][3] = W[c][3]; | ||
W[c][3] = tmp; | ||
tmp = W[b][3]; | ||
W[b][3] = W[d][3]; | ||
W[d][3] = tmp; | ||
}; | ||
var shiftRow3 = function(W, a, b, c, d) { | ||
shiftRow1(W, d, c, b, a); | ||
} | ||
shiftRow1(W, d, c, b, a); | ||
}; | ||
var shiftRows = function(W) { | ||
shiftRow1(W, 1, 5, 9, 13); | ||
shiftRow2(W, 2, 6, 10, 14); | ||
shiftRow3(W, 3, 7, 11, 15); | ||
} | ||
shiftRow1(W, 1, 5, 9, 13); | ||
shiftRow2(W, 2, 6, 10, 14); | ||
shiftRow3(W, 3, 7, 11, 15); | ||
}; | ||
var mixColumn = function(W, ia, ib, ic, id) { | ||
for (var n = 0; n < 4; n++) { | ||
var a = W[ia][n]; | ||
var b = W[ib][n]; | ||
var c = W[ic][n]; | ||
var d = W[id][n]; | ||
var ab = a ^ b; | ||
var bc = b ^ c; | ||
var cd = c ^ d; | ||
var abx = ((ab & (0x80808080)) >>> 7) * 27 ^ | ||
for (var n = 0; n < 4; n++) { | ||
var a = W[ia][n]; | ||
var b = W[ib][n]; | ||
var c = W[ic][n]; | ||
var d = W[id][n]; | ||
var ab = a ^ b; | ||
var bc = b ^ c; | ||
var cd = c ^ d; | ||
var abx = ((ab & (0x80808080)) >>> 7) * 27 ^ | ||
((ab & (0x7F7F7F7F)) << 1); | ||
var bcx = ((bc & (0x80808080)) >>> 7) * 27 ^ | ||
var bcx = ((bc & (0x80808080)) >>> 7) * 27 ^ | ||
((bc & (0x7F7F7F7F)) << 1); | ||
var cdx = ((cd & (0x80808080)) >>> 7) * 27 ^ | ||
var cdx = ((cd & (0x80808080)) >>> 7) * 27 ^ | ||
((cd & (0x7F7F7F7F)) << 1); | ||
W[ia][n] = abx ^ bc ^ d; | ||
W[ib][n] = bcx ^ a ^ cd; | ||
W[ic][n] = cdx ^ ab ^ d; | ||
W[id][n] = abx ^ bcx ^ cdx ^ ab ^ c; | ||
} | ||
} | ||
W[ia][n] = abx ^ bc ^ d; | ||
W[ib][n] = bcx ^ a ^ cd; | ||
W[ic][n] = cdx ^ ab ^ d; | ||
W[id][n] = abx ^ bcx ^ cdx ^ ab ^ c; | ||
} | ||
}; | ||
var finalize = function(ctx, W) { | ||
var int32Buf = op.swap32Array(h.bytes2Int32Buffer(ctx.buffer)); | ||
for (var u = 0; u < 8; u++) { | ||
for (var v = 0; v < 4; v++) { | ||
ctx.state[u][v] ^= int32Buf[u * 4 + v] ^ W[u][v] ^ W[u + 8][v]; | ||
var int32Buf = op.swap32Array(h.bytes2Int32Buffer(ctx.buffer)); | ||
for (var u = 0; u < 8; u++) { | ||
for (var v = 0; v < 4; v++) { | ||
ctx.state[u][v] ^= int32Buf[u * 4 + v] ^ W[u][v] ^ W[u + 8][v]; | ||
} | ||
} | ||
} | ||
} | ||
}; | ||
var inputBlock = function(ctx, W) { | ||
op.buffer2Insert(W, 0, 0, ctx.state, 8, 4); | ||
var int32Buf = op.swap32Array(h.bytes2Int32Buffer(ctx.buffer)); | ||
for (var u = 0; u < 8; u++) { | ||
W[u + 8][0] = (int32Buf[4 * u]); | ||
W[u + 8][1] = (int32Buf[4 * u + 1]); | ||
W[u + 8][2] = (int32Buf[4 * u + 2]); | ||
W[u + 8][3] = (int32Buf[4 * u + 3]); | ||
} | ||
} | ||
op.buffer2Insert(W, 0, 0, ctx.state, 8, 4); | ||
var int32Buf = op.swap32Array(h.bytes2Int32Buffer(ctx.buffer)); | ||
for (var u = 0; u < 8; u++) { | ||
W[u + 8][0] = (int32Buf[4 * u]); | ||
W[u + 8][1] = (int32Buf[4 * u + 1]); | ||
W[u + 8][2] = (int32Buf[4 * u + 2]); | ||
W[u + 8][3] = (int32Buf[4 * u + 3]); | ||
} | ||
}; | ||
var mixColumns = function(W) { | ||
mixColumn(W, 0, 1, 2, 3); | ||
mixColumn(W, 4, 5, 6, 7); | ||
mixColumn(W, 8, 9, 10, 11); | ||
mixColumn(W, 12, 13, 14, 15); | ||
} | ||
mixColumn(W, 0, 1, 2, 3); | ||
mixColumn(W, 4, 5, 6, 7); | ||
mixColumn(W, 8, 9, 10, 11); | ||
mixColumn(W, 12, 13, 14, 15); | ||
}; | ||
var ROUND = function(W,K) { | ||
subWords(W,K); | ||
shiftRows(W); | ||
mixColumns(W); | ||
} | ||
subWords(W,K); | ||
shiftRows(W); | ||
mixColumns(W); | ||
}; | ||
var compress = function(ctx) { | ||
var W = new Array(16); | ||
for (var i = 0; i < 16; i++) { | ||
W[i] = new Array(4); | ||
} | ||
var K = new Array(4); | ||
op.bufferInsert(K,0,ctx.C,4); | ||
inputBlock(ctx, W); | ||
for (var u = 0; u < 10; u++) { | ||
ROUND(W,K); | ||
} | ||
finalize(ctx,W); | ||
} | ||
var W = new Array(16); | ||
for (var i = 0; i < 16; i++) { | ||
W[i] = new Array(4); | ||
} | ||
var K = new Array(4); | ||
op.bufferInsert(K,0,ctx.C,4); | ||
inputBlock(ctx, W); | ||
for (var u = 0; u < 10; u++) { | ||
ROUND(W,K); | ||
} | ||
finalize(ctx,W); | ||
}; | ||
var incrCounter = function(ctx, val) { | ||
ctx.C[0] = op.t32(ctx.C[0] + op.t32(val)); | ||
if (ctx.C[0] < op.t32(val)) { | ||
if ((ctx.C[1] = op.t32(ctx.C[1] + 1)) === 0) { | ||
if ((ctx.C[2] = op.t32(ctx.C[2] + 1)) === 0) { | ||
ctx.C[3] = op.t32(ctx.C[3] + 1); | ||
} | ||
ctx.C[0] = op.t32(ctx.C[0] + op.t32(val)); | ||
if (ctx.C[0] < op.t32(val)) { | ||
if ((ctx.C[1] = op.t32(ctx.C[1] + 1)) === 0) { | ||
if ((ctx.C[2] = op.t32(ctx.C[2] + 1)) === 0) { | ||
ctx.C[3] = op.t32(ctx.C[3] + 1); | ||
} | ||
} | ||
} | ||
} | ||
} | ||
}; | ||
var echoInit = function(ctx) { | ||
ctx.state = new Array(8); | ||
for (var i = 0; i < 8; i++) { | ||
ctx.state[i] = new Array(4); | ||
} | ||
ctx.state[0][0] = 512; | ||
ctx.state[0][1] = ctx.state[0][2] = ctx.state[0][3] = 0; | ||
ctx.state[1][0] = 512; | ||
ctx.state[1][1] = ctx.state[1][2] = ctx.state[1][3] = 0; | ||
ctx.state[2][0] = 512; | ||
ctx.state[2][1] = ctx.state[2][2] = ctx.state[2][3] = 0; | ||
ctx.state[3][0] = 512; | ||
ctx.state[3][1] = ctx.state[3][2] = ctx.state[3][3] = 0; | ||
ctx.state[4][0] = 512; | ||
ctx.state[4][1] = ctx.state[4][2] = ctx.state[4][3] = 0; | ||
ctx.state[5][0] = 512; | ||
ctx.state[5][1] = ctx.state[5][2] = ctx.state[5][3] = 0; | ||
ctx.state[6][0] = 512; | ||
ctx.state[6][1] = ctx.state[6][2] = ctx.state[6][3] = 0; | ||
ctx.state[7][0] = 512; | ||
ctx.state[7][1] = ctx.state[7][2] = ctx.state[7][3] = 0; | ||
ctx.ptr = 0; | ||
ctx.C = new Array(4); | ||
op.bufferSet(ctx.C,0,0,4); | ||
ctx.buffer = new Array(ECHO_BlockSize); | ||
} | ||
ctx.state = new Array(8); | ||
for (var i = 0; i < 8; i++) { | ||
ctx.state[i] = new Array(4); | ||
} | ||
ctx.state[0][0] = 512; | ||
ctx.state[0][1] = ctx.state[0][2] = ctx.state[0][3] = 0; | ||
ctx.state[1][0] = 512; | ||
ctx.state[1][1] = ctx.state[1][2] = ctx.state[1][3] = 0; | ||
ctx.state[2][0] = 512; | ||
ctx.state[2][1] = ctx.state[2][2] = ctx.state[2][3] = 0; | ||
ctx.state[3][0] = 512; | ||
ctx.state[3][1] = ctx.state[3][2] = ctx.state[3][3] = 0; | ||
ctx.state[4][0] = 512; | ||
ctx.state[4][1] = ctx.state[4][2] = ctx.state[4][3] = 0; | ||
ctx.state[5][0] = 512; | ||
ctx.state[5][1] = ctx.state[5][2] = ctx.state[5][3] = 0; | ||
ctx.state[6][0] = 512; | ||
ctx.state[6][1] = ctx.state[6][2] = ctx.state[6][3] = 0; | ||
ctx.state[7][0] = 512; | ||
ctx.state[7][1] = ctx.state[7][2] = ctx.state[7][3] = 0; | ||
ctx.ptr = 0; | ||
ctx.C = new Array(4); | ||
op.bufferSet(ctx.C,0,0,4); | ||
ctx.buffer = new Array(ECHO_BlockSize); | ||
}; | ||
var echo = function(ctx, data) { | ||
var buf, ptr; | ||
buf = ctx.buffer; | ||
ptr = ctx.ptr; | ||
var len = data.length; | ||
if (len < ctx.buffer.length - ptr) { | ||
op.bufferInsert(buf, ptr, data, data.length); | ||
ptr += data.length; | ||
var buf, ptr; | ||
buf = ctx.buffer; | ||
ptr = ctx.ptr; | ||
var len = data.length; | ||
if (len < ctx.buffer.length - ptr) { | ||
op.bufferInsert(buf, ptr, data, data.length); | ||
ptr += data.length; | ||
ctx.ptr = ptr; | ||
return; | ||
} | ||
while (len > 0) { | ||
var clen = ctx.buffer.length - ptr; | ||
if (clen > len) clen = len; | ||
op.bufferInsert(buf, ptr, data, clen); | ||
ptr += clen; | ||
data = data.slice(clen); | ||
len -= clen; | ||
if (ptr === ctx.buffer.length) { | ||
incrCounter(ctx, 1024); | ||
compress(ctx); | ||
ptr = 0; | ||
} | ||
} | ||
ctx.ptr = ptr; | ||
return; | ||
} | ||
while (len > 0) { | ||
var clen = ctx.buffer.length - ptr; | ||
if (clen > len) clen = len; | ||
op.bufferInsert(buf, ptr, data, clen); | ||
ptr += clen; | ||
data = data.slice(clen); | ||
len -= clen; | ||
if (ptr === ctx.buffer.length) { | ||
var int32Buf = h.bytes2Int32Buffer(buf); | ||
incrCounter(ctx, 1024); | ||
compress(ctx); | ||
ptr = 0; | ||
} | ||
} | ||
ctx.ptr = ptr; | ||
} | ||
}; | ||
var echoClose = function(ctx) { | ||
var out = new Array(16); | ||
var buf = ctx.buffer; | ||
var len = ctx.buffer.length; | ||
var ptr = ctx.ptr; | ||
var elen = (ptr << 3); | ||
incrCounter(ctx, elen); | ||
var cBytes = h.int32Buffer2Bytes(op.swap32Array(ctx.C)); | ||
/* | ||
var out = new Array(16); | ||
var buf = ctx.buffer; | ||
var len = ctx.buffer.length; | ||
var ptr = ctx.ptr; | ||
var elen = (ptr << 3); | ||
incrCounter(ctx, elen); | ||
var cBytes = h.int32Buffer2Bytes(op.swap32Array(ctx.C)); | ||
/* | ||
* If elen is zero, then this block actually contains no message | ||
* bit, only the first padding bit. | ||
*/ | ||
if (elen === 0) { | ||
ctx.C[0] = ctx.C[1] = ctx.C[2] = ctx.C[3] = 0; | ||
} | ||
buf[ptr++] = 0x80; | ||
op.bufferSet(buf,ptr, 0, len - ptr); | ||
if (ptr > (len - 18)) { | ||
if (elen === 0) { | ||
ctx.C[0] = ctx.C[1] = ctx.C[2] = ctx.C[3] = 0; | ||
} | ||
buf[ptr++] = 0x80; | ||
op.bufferSet(buf,ptr, 0, len - ptr); | ||
if (ptr > (len - 18)) { | ||
compress(ctx); | ||
op.bufferSet(ctx.C,0,0,4); | ||
op.bufferSet(buf, 0, 0,len); | ||
} | ||
buf[len - 17] = 2; | ||
op.bufferInsert(buf,len - 16, cBytes, 16); | ||
compress(ctx); | ||
op.bufferSet(ctx.C,0,0,4); | ||
op.bufferSet(buf, 0, 0,len); | ||
} | ||
buf[len - 17] = 2; | ||
op.bufferInsert(buf,len - 16, cBytes, 16); | ||
compress(ctx); | ||
for (var u = 0; u < 4; u++) { | ||
for (var v = 0; v < 4; v++) { | ||
out[u*4 + v] = op.swap32(ctx.state[u][v]); | ||
for (var u = 0; u < 4; u++) { | ||
for (var v = 0; v < 4; v++) { | ||
out[u*4 + v] = op.swap32(ctx.state[u][v]); | ||
} | ||
} | ||
} | ||
return out; | ||
} | ||
return out; | ||
}; | ||
module.exports = function(input, format, output) { | ||
var msg; | ||
if (format === 1) { | ||
msg = input; | ||
} | ||
else if (format === 2) { | ||
msg = h.int32Buffer2Bytes(input); | ||
} | ||
else { | ||
msg = h.string2bytes(input); | ||
} | ||
var ctx = {}; | ||
echoInit(ctx); | ||
echo(ctx, msg); | ||
var r = echoClose(ctx); | ||
var out; | ||
if (output === 2) { | ||
out = r; | ||
} | ||
else if (output === 1) { | ||
out = h.int32Buffer2Bytes(r) | ||
} | ||
else { | ||
out = h.int32ArrayToHexString(r) | ||
} | ||
return out; | ||
} | ||
var msg; | ||
if (format === 1) { | ||
msg = input; | ||
} | ||
else if (format === 2) { | ||
msg = h.int32Buffer2Bytes(input); | ||
} | ||
else { | ||
msg = h.string2bytes(input); | ||
} | ||
var ctx = {}; | ||
echoInit(ctx); | ||
echo(ctx, msg); | ||
var r = echoClose(ctx); | ||
var out; | ||
if (output === 2) { | ||
out = r; | ||
} | ||
else if (output === 1) { | ||
out = h.int32Buffer2Bytes(r); | ||
} | ||
else { | ||
out = h.int32ArrayToHexString(r); | ||
} | ||
return out; | ||
}; |
@@ -7,44 +7,45 @@ 'use strict'; | ||
module.exports.int8ArrayToHexString = function toString(array) { | ||
var string = ''; | ||
for (var i in array) { | ||
if (array[i] < 16) { | ||
string += '0' + array[i].toString(16); | ||
} | ||
else { | ||
string += array[i].toString(16); | ||
} | ||
} | ||
return string; | ||
} | ||
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 = ''; | ||
for (var i in array) { | ||
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; | ||
} | ||
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(''); | ||
} | ||
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; | ||
} | ||
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) { | ||
module.exports.string2hex = function toString(s) { | ||
for (var p = [], len = s.length, i = 0; i < len; i++) { | ||
@@ -55,98 +56,126 @@ p.push((256 + s.charCodeAt(i)).toString(16).substring(1)); | ||
} | ||
module.exports.string2bytes = function (s) { | ||
for (var b = [], i = 0; i < s.length; i++) b[i] = s.charCodeAt(i); | ||
return b; | ||
} | ||
*/ | ||
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 bufferLength = len ? (((len - 1) >>> 1) + 1) : 0; | ||
var buffer = new Array(bufferLength); | ||
var i = 0; | ||
var j = 0; | ||
while (i<len) { | ||
while (i < len) { | ||
buffer[j] = (buffer[j] << 8) | b[i]; | ||
i++; | ||
if (!(i%2)) j++; | ||
if (!(i % 2)) j++; | ||
} | ||
return buffer; | ||
} | ||
*/ | ||
module.exports.bytes2Int32Buffer = function(b) { | ||
var len = b.length; | ||
if (!len) return []; | ||
var bufferLength = len?(((len - 1) >>> 2) + 1):0; | ||
var buffer = new Array(bufferLength); | ||
for (var j = 0;j<bufferLength;j++) { | ||
buffer[j] = (b[j*4] << 24) | (b[j*4 + 1] << 16) | (b[j*4 + 2] << 8) | b[j*4 + 3]; | ||
} | ||
return buffer; | ||
} | ||
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 bufferLength = len?(((len - 1) >>> 2) + 1):0; | ||
var buffer = new Array(bufferLength); | ||
for (var j = 0;j<bufferLength;j++) { | ||
buffer[j] = (b[j*4 + 3] << 24) | (b[j*4 + 2] << 16) | (b[j*4 + 1] << 8) | b[j*4]; | ||
} | ||
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) { | ||
var len = b.length; | ||
if (!len) return []; | ||
var bufferLength = len?(((len - 1) >>> 3) + 1):0; | ||
var buffer = new Array(bufferLength); | ||
for (var j = 0;j<bufferLength;j++) { | ||
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]); | ||
} | ||
return buffer; | ||
} | ||
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) { | ||
var len = b.length; | ||
if (!len) return []; | ||
var bufferLength = len?(((len - 1) >>> 3) + 1):0; | ||
var buffer = new Array(bufferLength); | ||
for (var j = 0;j<bufferLength;j++) { | ||
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]); | ||
} | ||
return buffer; | ||
} | ||
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.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.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 len = b.length; | ||
var bufferLength = len*4; | ||
var buffer = new Array(bufferLength); | ||
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<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); | ||
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++; | ||
@@ -156,6 +185,70 @@ } | ||
} | ||
*/ | ||
module.exports.string2Int32Buffer = function(s) { | ||
return this.bytes2Int32Buffer(this.string2bytes(s)); | ||
}; | ||
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; | ||
}; |
873
lib/jh.js
@@ -0,1 +1,2 @@ | ||
'use strict'; | ||
///////////////////////////////////// | ||
@@ -10,3 +11,3 @@ /////////////// Jh ///////////////// | ||
var op = require('./op'); | ||
var helper = require('./helper'); | ||
var he = require('./helper'); | ||
@@ -19,471 +20,473 @@ var Jh_BlockSize = 64; | ||
var IV512 = [ | ||
(0x6fd14b96), (0x3e00aa17), (0x636a2e05), (0x7a15d543), | ||
(0x8a225e8d), (0x0c97ef0b), (0xe9341259), (0xf2b3c361), | ||
(0x891da0c1), (0x536f801e), (0x2aa9056b), (0xea2b6d80), | ||
(0x588eccdb), (0x2075baa6), (0xa90f3a76), (0xbaf83bf7), | ||
(0x0169e605), (0x41e34a69), (0x46b58a8e), (0x2e6fe65a), | ||
(0x1047a7d0), (0xc1843c24), (0x3b6e71b1), (0x2d5ac199), | ||
(0xcf57f6ec), (0x9db1f856), (0xa706887c), (0x5716b156), | ||
(0xe3c2fcdf), (0xe68517fb), (0x545a4678), (0xcc8cdd4b) | ||
]; | ||
var IV512 = he.bytes2Int32Buffer(he.b64Decode('b9FLlj4Aqhdjai4FehXVQ4oiXo0Ml+8L6TQSWfKzw2GJHaDBU2+AHiqpBWvqK22AWI7M2yB1uqapDzp2uvg79wFp5gVB40ppRrWKji5v5loQR6fQwYQ8JDtucbEtWsGZz1f27J2x+FanBoh8VxaxVuPC/N/mhRf7VFpGeMyM3Us=')); | ||
var C = [ | ||
(0x72d5dea2), (0xdf15f867), (0x7b84150a), | ||
(0xb7231557), (0x81abd690), (0x4d5a87f6), | ||
(0x4e9f4fc5), (0xc3d12b40), (0xea983ae0), | ||
(0x5c45fa9c), (0x03c5d299), (0x66b2999a), | ||
(0x660296b4), (0xf2bb538a), (0xb556141a), | ||
(0x88dba231), (0x03a35a5c), (0x9a190edb), | ||
(0x403fb20a), (0x87c14410), (0x1c051980), | ||
(0x849e951d), (0x6f33ebad), (0x5ee7cddc), | ||
(0x10ba1392), (0x02bf6b41), (0xdc786515), | ||
(0xf7bb27d0), (0x0a2c8139), (0x37aa7850), | ||
(0x3f1abfd2), (0x410091d3), (0x422d5a0d), | ||
(0xf6cc7e90), (0xdd629f9c), (0x92c097ce), | ||
(0x185ca70b), (0xc72b44ac), (0xd1df65d6), | ||
(0x63c6fc23), (0x976e6c03), (0x9ee0b81a), | ||
(0x2105457e), (0x446ceca8), (0xeef103bb), | ||
(0x5d8e61fa), (0xfd9697b2), (0x94838197), | ||
(0x4a8e8537), (0xdb03302f), (0x2a678d2d), | ||
(0xfb9f6a95), (0x8afe7381), (0xf8b8696c), | ||
(0x8ac77246), (0xc07f4214), (0xc5f4158f), | ||
(0xbdc75ec4), (0x75446fa7), (0x8f11bb80), | ||
(0x52de75b7), (0xaee488bc), (0x82b8001e), | ||
(0x98a6a3f4), (0x8ef48f33), (0xa9a36315), | ||
(0xaa5f5624), (0xd5b7f989), (0xb6f1ed20), | ||
(0x7c5ae0fd), (0x36cae95a), (0x06422c36), | ||
(0xce293543), (0x4efe983d), (0x533af974), | ||
(0x739a4ba7), (0xd0f51f59), (0x6f4e8186), | ||
(0x0e9dad81), (0xafd85a9f), (0xa7050667), | ||
(0xee34626a), (0x8b0b28be), (0x6eb91727), | ||
(0x47740726), (0xc680103f), (0xe0a07e6f), | ||
(0xc67e487b), (0x0d550aa5), (0x4af8a4c0), | ||
(0x91e3e79f), (0x978ef19e), (0x86767281), | ||
(0x50608dd4), (0x7e9e5a41), (0xf3e5b062), | ||
(0xfc9f1fec), (0x4054207a), (0xe3e41a00), | ||
(0xcef4c984), (0x4fd794f5), (0x9dfa95d8), | ||
(0x552e7e11), (0x24c354a5), (0x5bdf7228), | ||
(0xbdfe6e28), (0x78f57fe2), (0x0fa5c4b2), | ||
(0x05897cef), (0xee49d32e), (0x447e9385), | ||
(0xeb28597f), (0x705f6937), (0xb324314a), | ||
(0x5e8628f1), (0x1dd6e465), (0xc71b7704), | ||
(0x51b920e7), (0x74fe43e8), (0x23d4878a), | ||
(0x7d29e8a3), (0x927694f2), (0xddcb7a09), | ||
(0x9b30d9c1), (0x1d1b30fb), (0x5bdc1be0), | ||
(0xda24494f), (0xf29c82bf), (0xa4e7ba31), | ||
(0xb470bfff), (0x0d324405), (0xdef8bc48), | ||
(0x3baefc32), (0x53bbd339), (0x459fc3c1), | ||
(0xe0298ba0), (0xe5c905fd), (0xf7ae090f), | ||
(0x94703412), (0x4290f134), (0xa271b701), | ||
(0xe344ed95), (0xe93b8e36), (0x4f2f984a), | ||
(0x88401d63), (0xa06cf615), (0x47c1444b), | ||
(0x8752afff), (0x7ebb4af1), (0xe20ac630), | ||
(0x4670b6c5), (0xcc6e8ce6), (0xa4d5a456), | ||
(0xbd4fca00), (0xda9d844b), (0xc83e18ae), | ||
(0x7357ce45), (0x3064d1ad), (0xe8a6ce68), | ||
(0x145c2567), (0xa3da8cf2), (0xcb0ee116), | ||
(0x33e90658), (0x9a94999a), (0x1f60b220), | ||
(0xc26f847b), (0xd1ceac7f), (0xa0d18518), | ||
(0x32595ba1), (0x8ddd19d3), (0x509a1cc0), | ||
(0xaaa5b446), (0x9f3d6367), (0xe4046bba), | ||
(0xf6ca19ab), (0x0b56ee7e), (0x1fb179ea), | ||
(0xa9282174), (0xe9bdf735), (0x3b3651ee), | ||
(0x1d57ac5a), (0x7550d376), (0x3a46c2fe), | ||
(0xa37d7001), (0xf735c1af), (0x98a4d842), | ||
(0x78edec20), (0x9e6b6779), (0x41836315), | ||
(0xea3adba8), (0xfac33b4d), (0x32832c83), | ||
(0xa7403b1f), (0x1c2747f3), (0x5940f034), | ||
(0xb72d769a), (0xe73e4e6c), (0xd2214ffd), | ||
(0xb8fd8d39), (0xdc5759ef), (0x8d9b0c49), | ||
(0x2b49ebda), (0x5ba2d749), (0x68f3700d), | ||
(0x7d3baed0), (0x7a8d5584), (0xf5a5e9f0), | ||
(0xe4f88e65), (0xa0b8a2f4), (0x36103b53), | ||
(0x0ca8079e), (0x753eec5a), (0x91689492), | ||
(0x56e8884f), (0x5bb05c55), (0xf8babc4c), | ||
(0xe3bb3b99), (0xf387947b), (0x75daf4d6), | ||
(0x726b1c5d), (0x64aeac28), (0xdc34b36d), | ||
(0x6c34a550), (0xb828db71), (0xf861e2f2), | ||
(0x108d512a), (0xe3db6433), (0x59dd75fc), | ||
(0x1cacbcf1), (0x43ce3fa2), (0x67bbd13c), | ||
(0x02e843b0), (0x330a5bca), (0x8829a175), | ||
(0x7f34194d), (0xb416535c), (0x923b94c3), | ||
(0x0e794d1e), (0x797475d7), (0xb6eeaf3f), | ||
(0xeaa8d4f7), (0xbe1a3921), (0x5cf47e09), | ||
(0x4c232751), (0x26a32453), (0xba323cd2), | ||
(0x44a3174a), (0x6da6d5ad), (0xb51d3ea6), | ||
(0xaff2c908), (0x83593d98), (0x916b3c56), | ||
(0x4cf87ca1), (0x7286604d), (0x46e23ecc), | ||
(0x086ec7f6), (0x2f9833b3), (0xb1bc765e), | ||
(0x2bd666a5), (0xefc4e62a), (0x06f4b6e8), | ||
(0xbec1d436), (0x74ee8215), (0xbcef2163), | ||
(0xfdc14e0d), (0xf453c969), (0xa77d5ac4), | ||
(0x06585826), (0x7ec11416), (0x06e0fa16), | ||
(0x7e90af3d), (0x28639d3f), (0xd2c9f2e3), | ||
(0x009bd20c), (0x5faace30), (0xb7d40c30), | ||
(0x742a5116), (0xf2e03298), (0x0deb30d8), | ||
(0xe3cef89a), (0x4bc59e7b), (0xb5f17992), | ||
(0xff51e66e), (0x048668d3), (0x9b234d57), | ||
(0xe6966731), (0xcce6a6f3), (0x170a7505), | ||
(0xb17681d9), (0x13326cce), (0x3c175284), | ||
(0xf805a262), (0xf42bcbb3), (0x78471547), | ||
(0xff465482), (0x23936a48), (0x38df5807), | ||
(0x4e5e6565), (0xf2fc7c89), (0xfc86508e), | ||
(0x31702e44), (0xd00bca86), (0xf04009a2), | ||
(0x3078474e), (0x65a0ee39), (0xd1f73883), | ||
(0xf75ee937), (0xe42c3abd), (0x2197b226), | ||
(0x0113f86f), (0xa344edd1), (0xef9fdee7), | ||
(0x8ba0df15), (0x762592d9), (0x3c85f7f6), | ||
(0x12dc42be), (0xd8a7ec7c), (0xab27b07e), | ||
(0x538d7dda), (0xaa3ea8de), (0xaa25ce93), | ||
(0xbd0269d8), (0x5af643fd), (0x1a7308f9), | ||
(0xc05fefda), (0x174a19a5), (0x974d6633), | ||
(0x4cfd216a), (0x35b49831), (0xdb411570), | ||
(0xea1e0fbb), (0xedcd549b), (0x9ad063a1), | ||
(0x51974072), (0xf6759dbf), (0x91476fe2) | ||
]; | ||
var C = he.bytes2Int32Buffer(he.b64Decode('ot7Vcmf4Fd8KFYR7VxUjt5DWq4H2h1pNxU+fTkAr0cPgOpjqnPpFXJnSxQOambJmtJYCZopTu/IaFFa1MaLbiFxaowPbDhmaCrI/QBBEwYeAGQUcHZWehK3rM2/czedekhO6EEFrvwIVZXjc0Ce79zmBLApQeKo30r8aP9ORAEENWi1CkH7M9pyfYt3Ol8CSC6dcGKxEK8fWZd/RI/zGYwNsbpcauOCefkUFIajsbES7A/Hu+mGOXbKXlv2XgYOUN4WOSi8wA9stjWcqlWqf+4Fz/opsabj4RnLHihRCf8CPFfTFxF7HvadvRHWAuxGPt3XeUryI5K4eALiC9KOmmDOP9I4VY6OpJFZfqon5t9Ug7fG2/eBafFrpyjY2LEIGQzUpzj2Y/k50+TpTp0uac1kf9dCGgU5vga2dDp9a2K9nBgWnamI07r4oC4snF7luJgd0Rz8QgMZvfqDge0h+xqUKVQ3ApPhKn+fjkZ7xjpeBcnaG1I1gUEFann5isOXz7B+f/HogVEAAGuTjhMn0zvWU10/YlfqdEX4uVaVUwyQoct9bKG7+veJ/9XiyxKUP73yJBS7TSe6Fk35Ef1ko6zdpX3BKMSSz8SiGXmXk1h0EdxvH5yC5UehD/nSKh9Qjo+gpffKUdpIJesvdwdkwm/swGx3gG9xbT0kk2r+CnPIxuuek/79wtAVEMg1IvPjeMvyuOznTu1PBw59FoIsp4P0FyeUPCa73EjRwlDTxkEIBt3Gile1E4zaOO+lKmC9PYx1AiBX2bKBLRMFH/69Sh/FKu34wxgrixbZwRuaMbsxWpNWkAMpPvUuEndquGD7IRc5Xc63RZDBozqboZyVcFPKM2qMW4Q7LWAbpM5qZlJogsmAfe4Rvwn+sztEYhdGgoVtZMtMZ3Y3AHJpQRrSlqmdjPZ+6awTkqxnK9n7uVgvqebEfdCEoqTX3venuUTY7WqxXHXbTUHX+wkY6AXB9o6/BNfdC2KSYIOzteHlna54VY4NBqNs66k07w/qDLIMyHztAp/NHJxw08EBZmnYtt2xOPuf9TyHSOY39uO9ZV9xJDJuN2utJK0nXolsNcPNo0K47fYRVjXrw6aX1ZY745PSiuKBTOxA2ngeoDFrsPnWSlGiRT4joVlVcsFtMvLr4mTu743uUh/PW9Np1XRxrciisrmRtszTcUKU0bHHbKLjy4mH4KlGNEDNk2+P8dd1Z8bysHKI/zkM80btnsEPoAspbCjN1oSmITRk0f1xTFrTDlDuSHk15Dtd1dHk/r+6299So6iE5Gr4JfvRcUScjTFMkoybSPDK6ShejRK3Vpm2mPh21CMnyr5g9WYNWPGuRoXz4TE1ghnLMPuJG9sduCLMzmC9edryxpWbWKyrmxO/otvQGNtTBvhWC7nRjIe+8DU7B/WnJU/TEWn2nJlhYBhYUwX4W+uAGPa+Qfj+dYyjj8snSDNKbADDOql8wDNS3FlEqdJgy4PLYMOsNmvjO43uexUuSefG1buZR/9NohgRXTSObMWeW5vOm5swFdQoX2YF2sc5sMhOEUhc8YqIF+LPLK/RHFUd4glRG/0hqkyMHWN84ZWVeTol8/PKOUIb8RC5wMYbKC9CiCUDwTkd4MDnuoGWDOPfRN+le9706LOQmspchb/gTAdHtRKPn3p/vFd+gi9mSJXb294U8vkLcEnzsp9h+sCer2n2NU96oPqqTziWq2GkCvf1D9lr5CHMa2u9fwKUZShczZk2XaiH9TDGYtDVwFUHbuw8e6ptUze2hY9CackCXUb+ddfbib0eR')); | ||
// var IV512 = [ | ||
// (0x6fd14b96), (0x3e00aa17), (0x636a2e05), (0x7a15d543), | ||
// (0x8a225e8d), (0x0c97ef0b), (0xe9341259), (0xf2b3c361), | ||
// (0x891da0c1), (0x536f801e), (0x2aa9056b), (0xea2b6d80), | ||
// (0x588eccdb), (0x2075baa6), (0xa90f3a76), (0xbaf83bf7), | ||
// (0x0169e605), (0x41e34a69), (0x46b58a8e), (0x2e6fe65a), | ||
// (0x1047a7d0), (0xc1843c24), (0x3b6e71b1), (0x2d5ac199), | ||
// (0xcf57f6ec), (0x9db1f856), (0xa706887c), (0x5716b156), | ||
// (0xe3c2fcdf), (0xe68517fb), (0x545a4678), (0xcc8cdd4b) | ||
// ]; | ||
//C would need to be 32 bit swapped if using these values | ||
// var C = [ | ||
// (0x72d5dea2), (0xdf15f867), (0x7b84150a), | ||
// (0xb7231557), (0x81abd690), (0x4d5a87f6), | ||
// (0x4e9f4fc5), (0xc3d12b40), (0xea983ae0), | ||
// (0x5c45fa9c), (0x03c5d299), (0x66b2999a), | ||
// (0x660296b4), (0xf2bb538a), (0xb556141a), | ||
// (0x88dba231), (0x03a35a5c), (0x9a190edb), | ||
// (0x403fb20a), (0x87c14410), (0x1c051980), | ||
// (0x849e951d), (0x6f33ebad), (0x5ee7cddc), | ||
// (0x10ba1392), (0x02bf6b41), (0xdc786515), | ||
// (0xf7bb27d0), (0x0a2c8139), (0x37aa7850), | ||
// (0x3f1abfd2), (0x410091d3), (0x422d5a0d), | ||
// (0xf6cc7e90), (0xdd629f9c), (0x92c097ce), | ||
// (0x185ca70b), (0xc72b44ac), (0xd1df65d6), | ||
// (0x63c6fc23), (0x976e6c03), (0x9ee0b81a), | ||
// (0x2105457e), (0x446ceca8), (0xeef103bb), | ||
// (0x5d8e61fa), (0xfd9697b2), (0x94838197), | ||
// (0x4a8e8537), (0xdb03302f), (0x2a678d2d), | ||
// (0xfb9f6a95), (0x8afe7381), (0xf8b8696c), | ||
// (0x8ac77246), (0xc07f4214), (0xc5f4158f), | ||
// (0xbdc75ec4), (0x75446fa7), (0x8f11bb80), | ||
// (0x52de75b7), (0xaee488bc), (0x82b8001e), | ||
// (0x98a6a3f4), (0x8ef48f33), (0xa9a36315), | ||
// (0xaa5f5624), (0xd5b7f989), (0xb6f1ed20), | ||
// (0x7c5ae0fd), (0x36cae95a), (0x06422c36), | ||
// (0xce293543), (0x4efe983d), (0x533af974), | ||
// (0x739a4ba7), (0xd0f51f59), (0x6f4e8186), | ||
// (0x0e9dad81), (0xafd85a9f), (0xa7050667), | ||
// (0xee34626a), (0x8b0b28be), (0x6eb91727), | ||
// (0x47740726), (0xc680103f), (0xe0a07e6f), | ||
// (0xc67e487b), (0x0d550aa5), (0x4af8a4c0), | ||
// (0x91e3e79f), (0x978ef19e), (0x86767281), | ||
// (0x50608dd4), (0x7e9e5a41), (0xf3e5b062), | ||
// (0xfc9f1fec), (0x4054207a), (0xe3e41a00), | ||
// (0xcef4c984), (0x4fd794f5), (0x9dfa95d8), | ||
// (0x552e7e11), (0x24c354a5), (0x5bdf7228), | ||
// (0xbdfe6e28), (0x78f57fe2), (0x0fa5c4b2), | ||
// (0x05897cef), (0xee49d32e), (0x447e9385), | ||
// (0xeb28597f), (0x705f6937), (0xb324314a), | ||
// (0x5e8628f1), (0x1dd6e465), (0xc71b7704), | ||
// (0x51b920e7), (0x74fe43e8), (0x23d4878a), | ||
// (0x7d29e8a3), (0x927694f2), (0xddcb7a09), | ||
// (0x9b30d9c1), (0x1d1b30fb), (0x5bdc1be0), | ||
// (0xda24494f), (0xf29c82bf), (0xa4e7ba31), | ||
// (0xb470bfff), (0x0d324405), (0xdef8bc48), | ||
// (0x3baefc32), (0x53bbd339), (0x459fc3c1), | ||
// (0xe0298ba0), (0xe5c905fd), (0xf7ae090f), | ||
// (0x94703412), (0x4290f134), (0xa271b701), | ||
// (0xe344ed95), (0xe93b8e36), (0x4f2f984a), | ||
// (0x88401d63), (0xa06cf615), (0x47c1444b), | ||
// (0x8752afff), (0x7ebb4af1), (0xe20ac630), | ||
// (0x4670b6c5), (0xcc6e8ce6), (0xa4d5a456), | ||
// (0xbd4fca00), (0xda9d844b), (0xc83e18ae), | ||
// (0x7357ce45), (0x3064d1ad), (0xe8a6ce68), | ||
// (0x145c2567), (0xa3da8cf2), (0xcb0ee116), | ||
// (0x33e90658), (0x9a94999a), (0x1f60b220), | ||
// (0xc26f847b), (0xd1ceac7f), (0xa0d18518), | ||
// (0x32595ba1), (0x8ddd19d3), (0x509a1cc0), | ||
// (0xaaa5b446), (0x9f3d6367), (0xe4046bba), | ||
// (0xf6ca19ab), (0x0b56ee7e), (0x1fb179ea), | ||
// (0xa9282174), (0xe9bdf735), (0x3b3651ee), | ||
// (0x1d57ac5a), (0x7550d376), (0x3a46c2fe), | ||
// (0xa37d7001), (0xf735c1af), (0x98a4d842), | ||
// (0x78edec20), (0x9e6b6779), (0x41836315), | ||
// (0xea3adba8), (0xfac33b4d), (0x32832c83), | ||
// (0xa7403b1f), (0x1c2747f3), (0x5940f034), | ||
// (0xb72d769a), (0xe73e4e6c), (0xd2214ffd), | ||
// (0xb8fd8d39), (0xdc5759ef), (0x8d9b0c49), | ||
// (0x2b49ebda), (0x5ba2d749), (0x68f3700d), | ||
// (0x7d3baed0), (0x7a8d5584), (0xf5a5e9f0), | ||
// (0xe4f88e65), (0xa0b8a2f4), (0x36103b53), | ||
// (0x0ca8079e), (0x753eec5a), (0x91689492), | ||
// (0x56e8884f), (0x5bb05c55), (0xf8babc4c), | ||
// (0xe3bb3b99), (0xf387947b), (0x75daf4d6), | ||
// (0x726b1c5d), (0x64aeac28), (0xdc34b36d), | ||
// (0x6c34a550), (0xb828db71), (0xf861e2f2), | ||
// (0x108d512a), (0xe3db6433), (0x59dd75fc), | ||
// (0x1cacbcf1), (0x43ce3fa2), (0x67bbd13c), | ||
// (0x02e843b0), (0x330a5bca), (0x8829a175), | ||
// (0x7f34194d), (0xb416535c), (0x923b94c3), | ||
// (0x0e794d1e), (0x797475d7), (0xb6eeaf3f), | ||
// (0xeaa8d4f7), (0xbe1a3921), (0x5cf47e09), | ||
// (0x4c232751), (0x26a32453), (0xba323cd2), | ||
// (0x44a3174a), (0x6da6d5ad), (0xb51d3ea6), | ||
// (0xaff2c908), (0x83593d98), (0x916b3c56), | ||
// (0x4cf87ca1), (0x7286604d), (0x46e23ecc), | ||
// (0x086ec7f6), (0x2f9833b3), (0xb1bc765e), | ||
// (0x2bd666a5), (0xefc4e62a), (0x06f4b6e8), | ||
// (0xbec1d436), (0x74ee8215), (0xbcef2163), | ||
// (0xfdc14e0d), (0xf453c969), (0xa77d5ac4), | ||
// (0x06585826), (0x7ec11416), (0x06e0fa16), | ||
// (0x7e90af3d), (0x28639d3f), (0xd2c9f2e3), | ||
// (0x009bd20c), (0x5faace30), (0xb7d40c30), | ||
// (0x742a5116), (0xf2e03298), (0x0deb30d8), | ||
// (0xe3cef89a), (0x4bc59e7b), (0xb5f17992), | ||
// (0xff51e66e), (0x048668d3), (0x9b234d57), | ||
// (0xe6966731), (0xcce6a6f3), (0x170a7505), | ||
// (0xb17681d9), (0x13326cce), (0x3c175284), | ||
// (0xf805a262), (0xf42bcbb3), (0x78471547), | ||
// (0xff465482), (0x23936a48), (0x38df5807), | ||
// (0x4e5e6565), (0xf2fc7c89), (0xfc86508e), | ||
// (0x31702e44), (0xd00bca86), (0xf04009a2), | ||
// (0x3078474e), (0x65a0ee39), (0xd1f73883), | ||
// (0xf75ee937), (0xe42c3abd), (0x2197b226), | ||
// (0x0113f86f), (0xa344edd1), (0xef9fdee7), | ||
// (0x8ba0df15), (0x762592d9), (0x3c85f7f6), | ||
// (0x12dc42be), (0xd8a7ec7c), (0xab27b07e), | ||
// (0x538d7dda), (0xaa3ea8de), (0xaa25ce93), | ||
// (0xbd0269d8), (0x5af643fd), (0x1a7308f9), | ||
// (0xc05fefda), (0x174a19a5), (0x974d6633), | ||
// (0x4cfd216a), (0x35b49831), (0xdb411570), | ||
// (0xea1e0fbb), (0xedcd549b), (0x9ad063a1), | ||
// (0x51974072), (0xf6759dbf), (0x91476fe2) | ||
// ]; | ||
var Sb = function(x, c) { | ||
x[3] = ~x[3]; | ||
x[0] ^= (c) & ~x[2]; | ||
var tmp = (c) ^ (x[0] & x[1]); | ||
x[0] ^= x[2] & x[3]; | ||
x[3] ^= ~x[1] & x[2]; | ||
x[1] ^= x[0] & x[2]; | ||
x[2] ^= x[0] & ~x[3]; | ||
x[0] ^= x[1] | x[3]; | ||
x[3] ^= x[1] & x[2]; | ||
x[1] ^= tmp & x[0]; | ||
x[2] ^= tmp; | ||
return x; | ||
} | ||
x[3] = ~x[3]; | ||
x[0] ^= (c) & ~x[2]; | ||
var tmp = (c) ^ (x[0] & x[1]); | ||
x[0] ^= x[2] & x[3]; | ||
x[3] ^= ~x[1] & x[2]; | ||
x[1] ^= x[0] & x[2]; | ||
x[2] ^= x[0] & ~x[3]; | ||
x[0] ^= x[1] | x[3]; | ||
x[3] ^= x[1] & x[2]; | ||
x[1] ^= tmp & x[0]; | ||
x[2] ^= tmp; | ||
return x; | ||
}; | ||
var Lb = function(x) { | ||
x[4] ^= x[1]; | ||
x[5] ^= x[2]; | ||
x[6] ^= x[3] ^ x[0]; | ||
x[7] ^= x[0]; | ||
x[0] ^= x[5]; | ||
x[1] ^= x[6]; | ||
x[2] ^= x[7] ^ x[4]; | ||
x[3] ^= x[4]; | ||
return x; | ||
} | ||
x[4] ^= x[1]; | ||
x[5] ^= x[2]; | ||
x[6] ^= x[3] ^ x[0]; | ||
x[7] ^= x[0]; | ||
x[0] ^= x[5]; | ||
x[1] ^= x[6]; | ||
x[2] ^= x[7] ^ x[4]; | ||
x[3] ^= x[4]; | ||
return x; | ||
}; | ||
var Ceven = function(n, r) { | ||
return op.swap32(C[((r) << 3) + 3 - n]); | ||
} | ||
return C[((r) << 3) + 3 - n]; | ||
}; | ||
var Codd = function(n, r) { | ||
return op.swap32(C[((r) << 3) + 7 - n]); | ||
} | ||
return C[((r) << 3) + 7 - n]; | ||
}; | ||
var S = function(x0, x1, x2, x3, cb, r) { | ||
var x = Sb([x0[3], x1[3], x2[3], x3[3]], cb(3, r)); | ||
x0[3] = x[0]; | ||
x1[3] = x[1]; | ||
x2[3] = x[2]; | ||
x3[3] = x[3]; | ||
x = Sb([x0[2], x1[2], x2[2], x3[2]], cb(2, r)); | ||
x0[2] = x[0]; | ||
x1[2] = x[1]; | ||
x2[2] = x[2]; | ||
x3[2] = x[3]; | ||
x = Sb([x0[1], x1[1], x2[1], x3[1]], cb(1, r)); | ||
x0[1] = x[0]; | ||
x1[1] = x[1]; | ||
x2[1] = x[2]; | ||
x3[1] = x[3]; | ||
x = Sb([x0[0], x1[0], x2[0], x3[0]], cb(0, r)); | ||
x0[0] = x[0]; | ||
x1[0] = x[1]; | ||
x2[0] = x[2]; | ||
x3[0] = x[3]; | ||
} | ||
var x = Sb([x0[3], x1[3], x2[3], x3[3]], cb(3, r)); | ||
x0[3] = x[0]; | ||
x1[3] = x[1]; | ||
x2[3] = x[2]; | ||
x3[3] = x[3]; | ||
x = Sb([x0[2], x1[2], x2[2], x3[2]], cb(2, r)); | ||
x0[2] = x[0]; | ||
x1[2] = x[1]; | ||
x2[2] = x[2]; | ||
x3[2] = x[3]; | ||
x = Sb([x0[1], x1[1], x2[1], x3[1]], cb(1, r)); | ||
x0[1] = x[0]; | ||
x1[1] = x[1]; | ||
x2[1] = x[2]; | ||
x3[1] = x[3]; | ||
x = Sb([x0[0], x1[0], x2[0], x3[0]], cb(0, r)); | ||
x0[0] = x[0]; | ||
x1[0] = x[1]; | ||
x2[0] = x[2]; | ||
x3[0] = x[3]; | ||
}; | ||
var L = function(x0, x1, x2, x3, x4, x5, x6, x7) { | ||
var x = Lb([x0[3], x1[3], x2[3], x3[3], x4[3], x5[3], x6[3], x7[3]]); | ||
x0[3] = x[0]; | ||
x1[3] = x[1]; | ||
x2[3] = x[2]; | ||
x3[3] = x[3]; | ||
x4[3] = x[4]; | ||
x5[3] = x[5]; | ||
x6[3] = x[6]; | ||
x7[3] = x[7]; | ||
x = Lb([x0[2], x1[2], x2[2], x3[2], x4[2], x5[2], x6[2], x7[2]]); | ||
x0[2] = x[0]; | ||
x1[2] = x[1]; | ||
x2[2] = x[2]; | ||
x3[2] = x[3]; | ||
x4[2] = x[4]; | ||
x5[2] = x[5]; | ||
x6[2] = x[6]; | ||
x7[2] = x[7]; | ||
x = Lb([x0[1], x1[1], x2[1], x3[1], x4[1], x5[1], x6[1], x7[1]]); | ||
x0[1] = x[0]; | ||
x1[1] = x[1]; | ||
x2[1] = x[2]; | ||
x3[1] = x[3]; | ||
x4[1] = x[4]; | ||
x5[1] = x[5]; | ||
x6[1] = x[6]; | ||
x7[1] = x[7]; | ||
x = Lb([x0[0], x1[0], x2[0], x3[0], x4[0], x5[0], x6[0], x7[0]]); | ||
x0[0] = x[0]; | ||
x1[0] = x[1]; | ||
x2[0] = x[2]; | ||
x3[0] = x[3]; | ||
x4[0] = x[4]; | ||
x5[0] = x[5]; | ||
x6[0] = x[6]; | ||
x7[0] = x[7]; | ||
} | ||
var x = Lb([x0[3], x1[3], x2[3], x3[3], x4[3], x5[3], x6[3], x7[3]]); | ||
x0[3] = x[0]; | ||
x1[3] = x[1]; | ||
x2[3] = x[2]; | ||
x3[3] = x[3]; | ||
x4[3] = x[4]; | ||
x5[3] = x[5]; | ||
x6[3] = x[6]; | ||
x7[3] = x[7]; | ||
x = Lb([x0[2], x1[2], x2[2], x3[2], x4[2], x5[2], x6[2], x7[2]]); | ||
x0[2] = x[0]; | ||
x1[2] = x[1]; | ||
x2[2] = x[2]; | ||
x3[2] = x[3]; | ||
x4[2] = x[4]; | ||
x5[2] = x[5]; | ||
x6[2] = x[6]; | ||
x7[2] = x[7]; | ||
x = Lb([x0[1], x1[1], x2[1], x3[1], x4[1], x5[1], x6[1], x7[1]]); | ||
x0[1] = x[0]; | ||
x1[1] = x[1]; | ||
x2[1] = x[2]; | ||
x3[1] = x[3]; | ||
x4[1] = x[4]; | ||
x5[1] = x[5]; | ||
x6[1] = x[6]; | ||
x7[1] = x[7]; | ||
x = Lb([x0[0], x1[0], x2[0], x3[0], x4[0], x5[0], x6[0], x7[0]]); | ||
x0[0] = x[0]; | ||
x1[0] = x[1]; | ||
x2[0] = x[2]; | ||
x3[0] = x[3]; | ||
x4[0] = x[4]; | ||
x5[0] = x[5]; | ||
x6[0] = x[6]; | ||
x7[0] = x[7]; | ||
}; | ||
var Wz = function(x, c, n) { | ||
var t = (x[3] & (c)) << (n); | ||
x[3] = ((x[3] >> (n)) & (c)) | t; | ||
t = (x[2] & (c)) << (n); | ||
x[2] = ((x[2] >> (n)) & (c)) | t; | ||
t = (x[1] & (c)) << (n); | ||
x[1] = ((x[1] >> (n)) & (c)) | t; | ||
t = (x[0] & (c)) << (n); | ||
x[0] = ((x[0] >> (n)) & (c)) | t; | ||
} | ||
var t = (x[3] & (c)) << (n); | ||
x[3] = ((x[3] >> (n)) & (c)) | t; | ||
t = (x[2] & (c)) << (n); | ||
x[2] = ((x[2] >> (n)) & (c)) | t; | ||
t = (x[1] & (c)) << (n); | ||
x[1] = ((x[1] >> (n)) & (c)) | t; | ||
t = (x[0] & (c)) << (n); | ||
x[0] = ((x[0] >> (n)) & (c)) | t; | ||
}; | ||
var W = function(ro, x) { | ||
switch (ro) { | ||
case 0: | ||
return Wz(x, (0x55555555), 1); | ||
case 1: | ||
return Wz(x, (0x33333333), 2); | ||
case 2: | ||
return Wz(x, (0x0F0F0F0F), 4); | ||
case 3: | ||
return Wz(x, (0x00FF00FF), 8); | ||
case 4: | ||
return Wz(x, (0x0000FFFF), 16); | ||
case 5: | ||
{ | ||
var t = x[3]; | ||
x[3] = x[2]; | ||
x[2] = t; | ||
t = x[1]; | ||
x[1] = x[0]; | ||
x[0] = t; | ||
return; | ||
} | ||
case 6: | ||
{ | ||
var t = x[3]; | ||
x[3] = x[1]; | ||
x[1] = t; | ||
t = x[2]; | ||
x[2] = x[0]; | ||
x[0] = t; | ||
return; | ||
} | ||
} | ||
} | ||
switch (ro) { | ||
case 0: | ||
return Wz(x, (0x55555555), 1); | ||
case 1: | ||
return Wz(x, (0x33333333), 2); | ||
case 2: | ||
return Wz(x, (0x0F0F0F0F), 4); | ||
case 3: | ||
return Wz(x, (0x00FF00FF), 8); | ||
case 4: | ||
return Wz(x, (0x0000FFFF), 16); | ||
case 5: | ||
{ | ||
var t = x[3]; | ||
x[3] = x[2]; | ||
x[2] = t; | ||
t = x[1]; | ||
x[1] = x[0]; | ||
x[0] = t; | ||
return; | ||
} | ||
case 6: | ||
{ | ||
var t = x[3]; | ||
x[3] = x[1]; | ||
x[1] = t; | ||
t = x[2]; | ||
x[2] = x[0]; | ||
x[0] = t; | ||
} | ||
} | ||
}; | ||
var SL = function(h, r, ro) { | ||
S(h[0], h[2], h[4], h[6], Ceven, r); | ||
S(h[1], h[3], h[5], h[7], Codd, r); | ||
L(h[0], h[2], h[4], h[6], h[1], h[3], h[5], h[7]); | ||
W(ro, h[1]); | ||
W(ro, h[3]); | ||
W(ro, h[5]); | ||
W(ro, h[7]); | ||
} | ||
S(h[0], h[2], h[4], h[6], Ceven, r); | ||
S(h[1], h[3], h[5], h[7], Codd, r); | ||
L(h[0], h[2], h[4], h[6], h[1], h[3], h[5], h[7]); | ||
W(ro, h[1]); | ||
W(ro, h[3]); | ||
W(ro, h[5]); | ||
W(ro, h[7]); | ||
}; | ||
var READ_STATE = function(h, state) { | ||
h[0][3] = state[0]; | ||
h[0][2] = state[1]; | ||
h[0][1] = state[2]; | ||
h[0][0] = state[3]; | ||
h[1][3] = state[4]; | ||
h[1][2] = state[5]; | ||
h[1][1] = state[6]; | ||
h[1][0] = state[7]; | ||
h[2][3] = state[8]; | ||
h[2][2] = state[9]; | ||
h[2][1] = state[10]; | ||
h[2][0] = state[11]; | ||
h[3][3] = state[12]; | ||
h[3][2] = state[13]; | ||
h[3][1] = state[14]; | ||
h[3][0] = state[15]; | ||
h[4][3] = state[16]; | ||
h[4][2] = state[17]; | ||
h[4][1] = state[18]; | ||
h[4][0] = state[19]; | ||
h[5][3] = state[20]; | ||
h[5][2] = state[21]; | ||
h[5][1] = state[22]; | ||
h[5][0] = state[23]; | ||
h[6][3] = state[24]; | ||
h[6][2] = state[25]; | ||
h[6][1] = state[26]; | ||
h[6][0] = state[27]; | ||
h[7][3] = state[28]; | ||
h[7][2] = state[29]; | ||
h[7][1] = state[30]; | ||
h[7][0] = state[31]; | ||
} | ||
h[0][3] = state[0]; | ||
h[0][2] = state[1]; | ||
h[0][1] = state[2]; | ||
h[0][0] = state[3]; | ||
h[1][3] = state[4]; | ||
h[1][2] = state[5]; | ||
h[1][1] = state[6]; | ||
h[1][0] = state[7]; | ||
h[2][3] = state[8]; | ||
h[2][2] = state[9]; | ||
h[2][1] = state[10]; | ||
h[2][0] = state[11]; | ||
h[3][3] = state[12]; | ||
h[3][2] = state[13]; | ||
h[3][1] = state[14]; | ||
h[3][0] = state[15]; | ||
h[4][3] = state[16]; | ||
h[4][2] = state[17]; | ||
h[4][1] = state[18]; | ||
h[4][0] = state[19]; | ||
h[5][3] = state[20]; | ||
h[5][2] = state[21]; | ||
h[5][1] = state[22]; | ||
h[5][0] = state[23]; | ||
h[6][3] = state[24]; | ||
h[6][2] = state[25]; | ||
h[6][1] = state[26]; | ||
h[6][0] = state[27]; | ||
h[7][3] = state[28]; | ||
h[7][2] = state[29]; | ||
h[7][1] = state[30]; | ||
h[7][0] = state[31]; | ||
}; | ||
var WRITE_STATE = function(h, state) { | ||
state[0] = h[0][3]; | ||
state[1] = h[0][2]; | ||
state[2] = h[0][1]; | ||
state[3] = h[0][0]; | ||
state[4] = h[1][3]; | ||
state[5] = h[1][2]; | ||
state[6] = h[1][1]; | ||
state[7] = h[1][0]; | ||
state[8] = h[2][3]; | ||
state[9] = h[2][2]; | ||
state[10] = h[2][1]; | ||
state[11] = h[2][0]; | ||
state[12] = h[3][3]; | ||
state[13] = h[3][2]; | ||
state[14] = h[3][1]; | ||
state[15] = h[3][0]; | ||
state[16] = h[4][3]; | ||
state[17] = h[4][2]; | ||
state[18] = h[4][1]; | ||
state[19] = h[4][0]; | ||
state[20] = h[5][3]; | ||
state[21] = h[5][2]; | ||
state[22] = h[5][1]; | ||
state[23] = h[5][0]; | ||
state[24] = h[6][3]; | ||
state[25] = h[6][2]; | ||
state[26] = h[6][1]; | ||
state[27] = h[6][0]; | ||
state[28] = h[7][3]; | ||
state[29] = h[7][2]; | ||
state[30] = h[7][1]; | ||
state[31] = h[7][0]; | ||
} | ||
state[0] = h[0][3]; | ||
state[1] = h[0][2]; | ||
state[2] = h[0][1]; | ||
state[3] = h[0][0]; | ||
state[4] = h[1][3]; | ||
state[5] = h[1][2]; | ||
state[6] = h[1][1]; | ||
state[7] = h[1][0]; | ||
state[8] = h[2][3]; | ||
state[9] = h[2][2]; | ||
state[10] = h[2][1]; | ||
state[11] = h[2][0]; | ||
state[12] = h[3][3]; | ||
state[13] = h[3][2]; | ||
state[14] = h[3][1]; | ||
state[15] = h[3][0]; | ||
state[16] = h[4][3]; | ||
state[17] = h[4][2]; | ||
state[18] = h[4][1]; | ||
state[19] = h[4][0]; | ||
state[20] = h[5][3]; | ||
state[21] = h[5][2]; | ||
state[22] = h[5][1]; | ||
state[23] = h[5][0]; | ||
state[24] = h[6][3]; | ||
state[25] = h[6][2]; | ||
state[26] = h[6][1]; | ||
state[27] = h[6][0]; | ||
state[28] = h[7][3]; | ||
state[29] = h[7][2]; | ||
state[30] = h[7][1]; | ||
state[31] = h[7][0]; | ||
}; | ||
var E8 = function(h) { | ||
for (var r = 0; r < 42; r += 7) { | ||
SL(h, r + 0, 0); | ||
SL(h, r + 1, 1); | ||
SL(h, r + 2, 2); | ||
SL(h, r + 3, 3); | ||
SL(h, r + 4, 4); | ||
SL(h, r + 5, 5); | ||
SL(h, r + 6, 6); | ||
} | ||
} | ||
for (var r = 0; r < 42; r += 7) { | ||
SL(h, r + 0, 0); | ||
SL(h, r + 1, 1); | ||
SL(h, r + 2, 2); | ||
SL(h, r + 3, 3); | ||
SL(h, r + 4, 4); | ||
SL(h, r + 5, 5); | ||
SL(h, r + 6, 6); | ||
} | ||
}; | ||
var bufferXORInsertBackwards = function(buffer, data, x, y, bufferOffsetX, bufferOffsetY) { | ||
if (!bufferOffsetX) bufferOffsetX = 0; | ||
if (!bufferOffsetY) bufferOffsetY = 0; | ||
for (var i = 0; i < x; i++) { | ||
for (var j = 0; j < x; j++) { | ||
var m = i + bufferOffsetX; | ||
var n = bufferOffsetY + y - 1 - j; | ||
var xOr = buffer[m][n] ^ data[i * 4 + j]; | ||
buffer[m][n] = xOr; | ||
if (!bufferOffsetX) bufferOffsetX = 0; | ||
if (!bufferOffsetY) bufferOffsetY = 0; | ||
for (var i = 0; i < x; i++) { | ||
for (var j = 0; j < x; j++) { | ||
var m = i + bufferOffsetX; | ||
var n = bufferOffsetY + y - 1 - j; | ||
var xOr = buffer[m][n] ^ data[i * 4 + j]; | ||
buffer[m][n] = xOr; | ||
} | ||
} | ||
} | ||
} | ||
}; | ||
var jh = function(ctx, data, len) { | ||
var buf, ptr; | ||
//create a local copy of states | ||
buf = ctx.buffer; | ||
ptr = ctx.ptr; | ||
if (!len) len = data.length; | ||
if (len < ctx.buffer.length - ptr) { | ||
op.bufferInsert(buf, ptr, data, data.length); | ||
ptr += data.length; | ||
ctx.ptr = ptr; | ||
return; | ||
} | ||
var V = new Array(JH_HX); | ||
for (var i = 0; i < JH_HX; i++) { | ||
V[i] = new Array(JH_HY); | ||
} | ||
READ_STATE(V, ctx.state); | ||
while (len > 0) { | ||
var clen = ctx.buffer.length - ptr; | ||
if (clen > len) clen = len; | ||
op.bufferInsert(buf, ptr, data, clen); | ||
ptr += clen; | ||
data = data.slice(clen); | ||
len -= clen; | ||
if (ptr === ctx.buffer.length) { | ||
var int32Buf = op.swap32Array(helper.bytes2Int32Buffer(buf)); | ||
var buf, ptr; | ||
//create a local copy of states | ||
buf = ctx.buffer; | ||
ptr = ctx.ptr; | ||
if (!len) len = data.length; | ||
if (len < ctx.buffer.length - ptr) { | ||
op.bufferInsert(buf, ptr, data, data.length); | ||
ptr += data.length; | ||
ctx.ptr = ptr; | ||
return; | ||
} | ||
var V = new Array(JH_HX); | ||
for (var i = 0; i < JH_HX; i++) { | ||
V[i] = new Array(JH_HY); | ||
} | ||
READ_STATE(V, ctx.state); | ||
while (len > 0) { | ||
var clen = ctx.buffer.length - ptr; | ||
if (clen > len) clen = len; | ||
op.bufferInsert(buf, ptr, data, clen); | ||
ptr += clen; | ||
data = data.slice(clen); | ||
len -= clen; | ||
if (ptr === ctx.buffer.length) { | ||
var int32Buf = op.swap32Array(he.bytes2Int32Buffer(buf)); | ||
bufferXORInsertBackwards(V, int32Buf, 4, 4); | ||
E8(V); | ||
bufferXORInsertBackwards(V, int32Buf, 4, 4, 4, 0); | ||
if ((ctx.blockCountLow = op.t32(ctx.blockCountLow + 1)) == 0) | ||
ctx.blockCountHigh++; | ||
ptr = 0; | ||
bufferXORInsertBackwards(V, int32Buf, 4, 4); | ||
E8(V); | ||
bufferXORInsertBackwards(V, int32Buf, 4, 4, 4, 0); | ||
if ((ctx.blockCountLow = op.t32(ctx.blockCountLow + 1)) === 0) ctx.blockCountHigh++; | ||
ptr = 0; | ||
} | ||
} | ||
} | ||
WRITE_STATE(V, ctx.state); | ||
ctx.ptr = ptr; | ||
} | ||
WRITE_STATE(V, ctx.state); | ||
ctx.ptr = ptr; | ||
}; | ||
var jhClose = function(ctx) { | ||
var z; | ||
var buf = new Array(128); | ||
var numz, u; | ||
var l = new Array(4); | ||
buf[0] = 0x80; | ||
if (ctx.ptr == 0) { | ||
numz = 47; | ||
} | ||
else { | ||
numz = 111 - ctx.ptr; | ||
} | ||
op.bufferSet(buf, 1, 0, numz); | ||
l[0] = op.t32(ctx.blockCountLow << 9) + (ctx.ptr << 3); | ||
l[1] = op.t32(ctx.blockCountLow >> 23) + op.t32(ctx.blockCountHigh << 9); | ||
l[2] = op.t32(ctx.blockCountHigh >> 23); | ||
l[3] = 0; | ||
var lBytes = helper.int32Buffer2Bytes(op.swap32Array(l)); | ||
op.bufferInsertBackwards(buf, 1 + numz, lBytes, 16); | ||
jh(ctx, buf, numz + 17); | ||
var out = new Array(16); | ||
for (u = 0; u < 16; u++) | ||
out[u] = op.swap32(ctx.state[u + 16]); | ||
return out; | ||
} | ||
var buf = new Array(128); | ||
var numz, u; | ||
var l = new Array(4); | ||
buf[0] = 0x80; | ||
if (ctx.ptr === 0) { | ||
numz = 47; | ||
} | ||
else { | ||
numz = 111 - ctx.ptr; | ||
} | ||
op.bufferSet(buf, 1, 0, numz); | ||
l[0] = op.t32(ctx.blockCountLow << 9) + (ctx.ptr << 3); | ||
l[1] = op.t32(ctx.blockCountLow >> 23) + op.t32(ctx.blockCountHigh << 9); | ||
l[2] = op.t32(ctx.blockCountHigh >> 23); | ||
l[3] = 0; | ||
var lBytes = he.int32Buffer2Bytes(op.swap32Array(l)); | ||
op.bufferInsertBackwards(buf, 1 + numz, lBytes, 16); | ||
jh(ctx, buf, numz + 17); | ||
var out = new Array(16); | ||
for (u = 0; u < 16; u++) out[u] = op.swap32(ctx.state[u + 16]); | ||
return out; | ||
}; | ||
module.exports = function(input, format, output) { | ||
var msg; | ||
if (format === 1) { | ||
msg = input; | ||
} | ||
else if (format === 2) { | ||
msg = helper.int32Buffer2Bytes(input); | ||
} | ||
else { | ||
msg = helper.string2bytes(input); | ||
} | ||
var ctx = {}; | ||
ctx.state = op.swap32Array(IV512); | ||
ctx.ptr = 0; | ||
ctx.buffer = new Array(Jh_BlockSize); | ||
ctx.blockCountHigh = 0; | ||
ctx.blockCountLow = 0; | ||
jh(ctx, msg); | ||
var r = jhClose(ctx); | ||
var out; | ||
if (output === 2) { | ||
out = r; | ||
} | ||
else if (output === 1) { | ||
out = helper.int32Buffer2Bytes(r) | ||
} | ||
else { | ||
out = helper.int32ArrayToHexString(r) | ||
} | ||
return out; | ||
} | ||
var msg; | ||
if (format === 1) { | ||
msg = input; | ||
} | ||
else if (format === 2) { | ||
msg = he.int32Buffer2Bytes(input); | ||
} | ||
else { | ||
msg = he.string2bytes(input); | ||
} | ||
var ctx = {}; | ||
ctx.state = op.swap32Array(IV512); | ||
ctx.ptr = 0; | ||
ctx.buffer = new Array(Jh_BlockSize); | ||
ctx.blockCountHigh = 0; | ||
ctx.blockCountLow = 0; | ||
jh(ctx, msg); | ||
var r = jhClose(ctx); | ||
var out; | ||
if (output === 2) { | ||
out = r; | ||
} | ||
else if (output === 1) { | ||
out = he.int32Buffer2Bytes(r); | ||
} | ||
else { | ||
out = he.int32ArrayToHexString(r); | ||
} | ||
return out; | ||
}; |
@@ -0,1 +1,2 @@ | ||
'use strict'; | ||
// Copyright 2015-2016 Chen, Yi-Cyuan | ||
@@ -26,6 +27,6 @@ | ||
var RC = [1, 0, 32898, 0, 32906, 2147483648, 2147516416, 2147483648, 32907, 0, 2147483649, | ||
0, 2147516545, 2147483648, 32777, 2147483648, 138, 0, 136, 0, 2147516425, 0, | ||
2147483658, 0, 2147516555, 0, 139, 2147483648, 32905, 2147483648, 32771, | ||
2147483648, 32770, 2147483648, 128, 2147483648, 32778, 0, 2147483658, 2147483648, | ||
2147516545, 2147483648, 32896, 2147483648, 2147483649, 0, 2147516424, 2147483648 | ||
0, 2147516545, 2147483648, 32777, 2147483648, 138, 0, 136, 0, 2147516425, 0, | ||
2147483658, 0, 2147516555, 0, 139, 2147483648, 32905, 2147483648, 32771, | ||
2147483648, 32770, 2147483648, 128, 2147483648, 32778, 0, 2147483658, 2147483648, | ||
2147516545, 2147483648, 32896, 2147483648, 2147483649, 0, 2147516424, 2147483648 | ||
]; | ||
@@ -38,33 +39,35 @@ var BITS = [512]; | ||
var createOutputMethod = function(bits, padding, outputType) { | ||
return function(message) { | ||
return new Keccak(bits, padding, bits).update(message)[outputType](); | ||
} | ||
return function(message) { | ||
return new Keccak(bits, padding, bits).update(message) | ||
[outputType](); | ||
}; | ||
}; | ||
var createShakeOutputMethod = function(bits, padding, outputType) { | ||
return function(message, outputBits) { | ||
return new Keccak(bits, padding, outputBits).update(message)[outputType](); | ||
} | ||
return function(message, outputBits) { | ||
return new Keccak(bits, padding, outputBits).update(message) | ||
[outputType](); | ||
}; | ||
}; | ||
var createMethod = function(bits, padding) { | ||
var method = createOutputMethod(bits, padding, 'array'); | ||
method.create = function() { | ||
return new Keccak(bits, padding, bits); | ||
}; | ||
method.update = function(message) { | ||
return method.create().update(message); | ||
}; | ||
for (var i = 0; i < OUTPUT_TYPES.length; ++i) { | ||
var type = OUTPUT_TYPES[i]; | ||
method[type] = createOutputMethod(bits, padding, type); | ||
} | ||
return method; | ||
var method = createOutputMethod(bits, padding, 'array'); | ||
method.create = function() { | ||
return new Keccak(bits, padding, bits); | ||
}; | ||
method.update = function(message) { | ||
return method.create().update(message); | ||
}; | ||
for (var i = 0; i < OUTPUT_TYPES.length; ++i) { | ||
var type = OUTPUT_TYPES[i]; | ||
method[type] = createOutputMethod(bits, padding, type); | ||
} | ||
return method; | ||
}; | ||
var algorithms = [{ | ||
name: 'keccak', | ||
padding: KECCAK_PADDING, | ||
bits: BITS, | ||
createMethod: createMethod | ||
name: 'keccak', | ||
padding: KECCAK_PADDING, | ||
bits: BITS, | ||
createMethod: createMethod | ||
}]; | ||
@@ -75,411 +78,411 @@ | ||
for (var i = 0; i < algorithms.length; ++i) { | ||
var algorithm = algorithms[i]; | ||
var bits = algorithm.bits; | ||
var createMethod = algorithm.createMethod; | ||
for (var j = 0; j < bits.length; ++j) { | ||
var method = algorithm.createMethod(bits[j], algorithm.padding); | ||
methods[algorithm.name + '_' + bits[j]] = method; | ||
} | ||
var algorithm = algorithms[i]; | ||
var bits = algorithm.bits; | ||
var createMethod = algorithm.createMethod; | ||
for (var j = 0; j < bits.length; ++j) { | ||
var method = algorithm.createMethod(bits[j], algorithm.padding); | ||
methods[algorithm.name + '_' + bits[j]] = method; | ||
} | ||
} | ||
function Keccak(bits, padding, outputBits) { | ||
this.blocks = []; | ||
this.s = []; | ||
this.padding = padding; | ||
this.outputBits = outputBits; | ||
this.reset = true; | ||
this.block = 0; | ||
this.start = 0; | ||
this.blockCount = (1600 - (bits << 1)) >> 5; | ||
this.byteCount = this.blockCount << 2; | ||
this.outputBlocks = outputBits >> 5; | ||
this.extraBytes = (outputBits & 31) >> 3; | ||
this.blocks = []; | ||
this.s = []; | ||
this.padding = padding; | ||
this.outputBits = outputBits; | ||
this.reset = true; | ||
this.block = 0; | ||
this.start = 0; | ||
this.blockCount = (1600 - (bits << 1)) >> 5; | ||
this.byteCount = this.blockCount << 2; | ||
this.outputBlocks = outputBits >> 5; | ||
this.extraBytes = (outputBits & 31) >> 3; | ||
for (var i = 0; i < 50; ++i) { | ||
this.s[i] = 0; | ||
} | ||
}; | ||
for (var i = 0; i < 50; ++i) { | ||
this.s[i] = 0; | ||
} | ||
} | ||
Keccak.prototype.update = function(message) { | ||
var notString = typeof(message) != 'string'; | ||
if (notString && Object.prototype.toString.call(message.constructor) === "[object ArrayBuffer]") { | ||
message = h.string2bytes(message); | ||
} | ||
var length = message.length, | ||
blocks = this.blocks, | ||
byteCount = this.byteCount, | ||
blockCount = this.blockCount, | ||
index = 0, | ||
s = this.s, | ||
i, code; | ||
var notString = typeof(message) !== 'string'; | ||
if (notString && Object.prototype.toString.call(message.constructor) === '[object ArrayBuffer]') { | ||
message = h.string2bytes(message); | ||
} | ||
var length = message.length, | ||
blocks = this.blocks, | ||
byteCount = this.byteCount, | ||
blockCount = this.blockCount, | ||
index = 0, | ||
s = this.s, | ||
i, code; | ||
while (index < length) { | ||
if (this.reset) { | ||
this.reset = false; | ||
blocks[0] = this.block; | ||
for (i = 1; i < blockCount + 1; ++i) { | ||
blocks[i] = 0; | ||
} | ||
} | ||
if (notString) { | ||
for (i = this.start; index < length && i < byteCount; ++index) { | ||
blocks[i >> 2] |= message[index] << SHIFT[i++ & 3]; | ||
} | ||
} | ||
else { | ||
for (i = this.start; index < length && i < byteCount; ++index) { | ||
code = message.charCodeAt(index); | ||
if (code < 0x80) { | ||
blocks[i >> 2] |= code << SHIFT[i++ & 3]; | ||
while (index < length) { | ||
if (this.reset) { | ||
this.reset = false; | ||
blocks[0] = this.block; | ||
for (i = 1; i < blockCount + 1; ++i) { | ||
blocks[i] = 0; | ||
} | ||
} | ||
else if (code < 0x800) { | ||
blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3]; | ||
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; | ||
if (notString) { | ||
for (i = this.start; index < length && i < byteCount; ++index) { | ||
blocks[i >> 2] |= message[index] << SHIFT[i++ & 3]; | ||
} | ||
} | ||
else if (code < 0xd800 || code >= 0xe000) { | ||
blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3]; | ||
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3]; | ||
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; | ||
else { | ||
for (i = this.start; index < length && i < byteCount; ++index) { | ||
code = message.charCodeAt(index); | ||
if (code < 0x80) { | ||
blocks[i >> 2] |= code << SHIFT[i++ & 3]; | ||
} | ||
else if (code < 0x800) { | ||
blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3]; | ||
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; | ||
} | ||
else if (code < 0xd800 || code >= 0xe000) { | ||
blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3]; | ||
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3]; | ||
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; | ||
} | ||
else { | ||
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff)); | ||
blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3]; | ||
blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3]; | ||
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3]; | ||
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; | ||
} | ||
} | ||
} | ||
this.lastByteIndex = i; | ||
if (i >= byteCount) { | ||
this.start = i - byteCount; | ||
this.block = blocks[blockCount]; | ||
for (i = 0; i < blockCount; ++i) { | ||
s[i] ^= blocks[i]; | ||
} | ||
f(s); | ||
this.reset = true; | ||
} | ||
else { | ||
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff)); | ||
blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3]; | ||
blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3]; | ||
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3]; | ||
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; | ||
this.start = i; | ||
} | ||
} | ||
} | ||
this.lastByteIndex = i; | ||
if (i >= byteCount) { | ||
this.start = i - byteCount; | ||
this.block = blocks[blockCount]; | ||
for (i = 0; i < blockCount; ++i) { | ||
s[i] ^= blocks[i]; | ||
} | ||
f(s); | ||
this.reset = true; | ||
} | ||
else { | ||
this.start = i; | ||
} | ||
} | ||
return this; | ||
return this; | ||
}; | ||
Keccak.prototype.finalize = function() { | ||
var blocks = this.blocks, | ||
i = this.lastByteIndex, | ||
blockCount = this.blockCount, | ||
s = this.s; | ||
blocks[i >> 2] |= this.padding[i & 3]; | ||
if (this.lastByteIndex == this.byteCount) { | ||
blocks[0] = blocks[blockCount]; | ||
for (i = 1; i < blockCount + 1; ++i) { | ||
blocks[i] = 0; | ||
var blocks = this.blocks, | ||
i = this.lastByteIndex, | ||
blockCount = this.blockCount, | ||
s = this.s; | ||
blocks[i >> 2] |= this.padding[i & 3]; | ||
if (this.lastByteIndex == this.byteCount) { | ||
blocks[0] = blocks[blockCount]; | ||
for (i = 1; i < blockCount + 1; ++i) { | ||
blocks[i] = 0; | ||
} | ||
} | ||
} | ||
blocks[blockCount - 1] |= 0x80000000; | ||
for (i = 0; i < blockCount; ++i) { | ||
s[i] ^= blocks[i]; | ||
} | ||
f(s); | ||
blocks[blockCount - 1] |= 0x80000000; | ||
for (i = 0; i < blockCount; ++i) { | ||
s[i] ^= blocks[i]; | ||
} | ||
f(s); | ||
}; | ||
Keccak.prototype.toString = Keccak.prototype.hex = function() { | ||
this.finalize(); | ||
this.finalize(); | ||
var blockCount = this.blockCount, | ||
s = this.s, | ||
outputBlocks = this.outputBlocks, | ||
extraBytes = this.extraBytes, | ||
i = 0, | ||
j = 0; | ||
var hex = '', | ||
block; | ||
while (j < outputBlocks) { | ||
for (i = 0; i < blockCount && j < outputBlocks; ++i, ++j) { | ||
block = s[i]; | ||
hex += HEX_CHARS[(block >> 4) & 0x0F] + HEX_CHARS[block & 0x0F] + | ||
var blockCount = this.blockCount, | ||
s = this.s, | ||
outputBlocks = this.outputBlocks, | ||
extraBytes = this.extraBytes, | ||
i = 0, | ||
j = 0; | ||
var hex = '', | ||
block; | ||
while (j < outputBlocks) { | ||
for (i = 0; i < blockCount && j < outputBlocks; ++i, ++j) { | ||
block = s[i]; | ||
hex += HEX_CHARS[(block >> 4) & 0x0F] + HEX_CHARS[block & 0x0F] + | ||
HEX_CHARS[(block >> 12) & 0x0F] + HEX_CHARS[(block >> 8) & 0x0F] + | ||
HEX_CHARS[(block >> 20) & 0x0F] + HEX_CHARS[(block >> 16) & 0x0F] + | ||
HEX_CHARS[(block >> 28) & 0x0F] + HEX_CHARS[(block >> 24) & 0x0F]; | ||
} | ||
if (j % blockCount == 0) { | ||
f(s); | ||
i = 0; | ||
} | ||
} | ||
if (j % blockCount == 0) { | ||
f(s); | ||
i = 0; | ||
if (extraBytes) { | ||
block = s[i]; | ||
if (extraBytes > 0) { | ||
hex += HEX_CHARS[(block >> 4) & 0x0F] + HEX_CHARS[block & 0x0F]; | ||
} | ||
if (extraBytes > 1) { | ||
hex += HEX_CHARS[(block >> 12) & 0x0F] + HEX_CHARS[(block >> 8) & 0x0F]; | ||
} | ||
if (extraBytes > 2) { | ||
hex += HEX_CHARS[(block >> 20) & 0x0F] + HEX_CHARS[(block >> 16) & 0x0F]; | ||
} | ||
} | ||
} | ||
if (extraBytes) { | ||
block = s[i]; | ||
if (extraBytes > 0) { | ||
hex += HEX_CHARS[(block >> 4) & 0x0F] + HEX_CHARS[block & 0x0F]; | ||
} | ||
if (extraBytes > 1) { | ||
hex += HEX_CHARS[(block >> 12) & 0x0F] + HEX_CHARS[(block >> 8) & 0x0F]; | ||
} | ||
if (extraBytes > 2) { | ||
hex += HEX_CHARS[(block >> 20) & 0x0F] + HEX_CHARS[(block >> 16) & 0x0F]; | ||
} | ||
} | ||
return hex; | ||
return hex; | ||
}; | ||
Keccak.prototype.buffer = function() { | ||
this.finalize(); | ||
this.finalize(); | ||
var blockCount = this.blockCount, | ||
s = this.s, | ||
outputBlocks = this.outputBlocks, | ||
extraBytes = this.extraBytes, | ||
i = 0, | ||
j = 0; | ||
var bytes = this.outputBits >> 3; | ||
var buffer; | ||
if (extraBytes) { | ||
buffer = new ArrayBuffer((outputBlocks + 1) << 2); | ||
} | ||
else { | ||
buffer = new ArrayBuffer(bytes); | ||
} | ||
var array = new Uint32Array(buffer); | ||
while (j < outputBlocks) { | ||
for (i = 0; i < blockCount && j < outputBlocks; ++i, ++j) { | ||
array[j] = s[i]; | ||
var blockCount = this.blockCount, | ||
s = this.s, | ||
outputBlocks = this.outputBlocks, | ||
extraBytes = this.extraBytes, | ||
i = 0, | ||
j = 0; | ||
var bytes = this.outputBits >> 3; | ||
var buffer; | ||
if (extraBytes) { | ||
buffer = new ArrayBuffer((outputBlocks + 1) << 2); | ||
} | ||
if (j % blockCount == 0) { | ||
f(s); | ||
else { | ||
buffer = new ArrayBuffer(bytes); | ||
} | ||
} | ||
if (extraBytes) { | ||
array[i] = s[i]; | ||
buffer = buffer.slice(0, bytes); | ||
} | ||
return buffer; | ||
var array = new Uint32Array(buffer); | ||
while (j < outputBlocks) { | ||
for (i = 0; i < blockCount && j < outputBlocks; ++i, ++j) { | ||
array[j] = s[i]; | ||
} | ||
if (j % blockCount == 0) { | ||
f(s); | ||
} | ||
} | ||
if (extraBytes) { | ||
array[i] = s[i]; | ||
buffer = buffer.slice(0, bytes); | ||
} | ||
return buffer; | ||
}; | ||
Keccak.prototype.digest = Keccak.prototype.array = function() { | ||
this.finalize(); | ||
this.finalize(); | ||
var blockCount = this.blockCount, | ||
s = this.s, | ||
outputBlocks = this.outputBlocks, | ||
extraBytes = this.extraBytes, | ||
i = 0, | ||
j = 0; | ||
var array = [], | ||
offset, block; | ||
while (j < outputBlocks) { | ||
for (i = 0; i < blockCount && j < outputBlocks; ++i, ++j) { | ||
offset = j << 2; | ||
block = s[i]; | ||
array[offset] = block & 0xFF; | ||
array[offset + 1] = (block >> 8) & 0xFF; | ||
array[offset + 2] = (block >> 16) & 0xFF; | ||
array[offset + 3] = (block >> 24) & 0xFF; | ||
var blockCount = this.blockCount, | ||
s = this.s, | ||
outputBlocks = this.outputBlocks, | ||
extraBytes = this.extraBytes, | ||
i = 0, | ||
j = 0; | ||
var array = [], | ||
offset, block; | ||
while (j < outputBlocks) { | ||
for (i = 0; i < blockCount && j < outputBlocks; ++i, ++j) { | ||
offset = j << 2; | ||
block = s[i]; | ||
array[offset] = block & 0xFF; | ||
array[offset + 1] = (block >> 8) & 0xFF; | ||
array[offset + 2] = (block >> 16) & 0xFF; | ||
array[offset + 3] = (block >> 24) & 0xFF; | ||
} | ||
if (j % blockCount == 0) { | ||
f(s); | ||
} | ||
} | ||
if (j % blockCount == 0) { | ||
f(s); | ||
if (extraBytes) { | ||
offset = j << 2; | ||
block = s[i]; | ||
if (extraBytes > 0) { | ||
array[offset] = block & 0xFF; | ||
} | ||
if (extraBytes > 1) { | ||
array[offset + 1] = (block >> 8) & 0xFF; | ||
} | ||
if (extraBytes > 2) { | ||
array[offset + 2] = (block >> 16) & 0xFF; | ||
} | ||
} | ||
} | ||
if (extraBytes) { | ||
offset = j << 2; | ||
block = s[i]; | ||
if (extraBytes > 0) { | ||
array[offset] = block & 0xFF; | ||
} | ||
if (extraBytes > 1) { | ||
array[offset + 1] = (block >> 8) & 0xFF; | ||
} | ||
if (extraBytes > 2) { | ||
array[offset + 2] = (block >> 16) & 0xFF; | ||
} | ||
} | ||
return array; | ||
return array; | ||
}; | ||
var f = function(s) { | ||
var h, l, n, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, | ||
b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17, | ||
b18, b19, b20, b21, b22, b23, b24, b25, b26, b27, b28, b29, b30, b31, b32, b33, | ||
b34, b35, b36, b37, b38, b39, b40, b41, b42, b43, b44, b45, b46, b47, b48, b49; | ||
for (n = 0; n < 48; n += 2) { | ||
c0 = s[0] ^ s[10] ^ s[20] ^ s[30] ^ s[40]; | ||
c1 = s[1] ^ s[11] ^ s[21] ^ s[31] ^ s[41]; | ||
c2 = s[2] ^ s[12] ^ s[22] ^ s[32] ^ s[42]; | ||
c3 = s[3] ^ s[13] ^ s[23] ^ s[33] ^ s[43]; | ||
c4 = s[4] ^ s[14] ^ s[24] ^ s[34] ^ s[44]; | ||
c5 = s[5] ^ s[15] ^ s[25] ^ s[35] ^ s[45]; | ||
c6 = s[6] ^ s[16] ^ s[26] ^ s[36] ^ s[46]; | ||
c7 = s[7] ^ s[17] ^ s[27] ^ s[37] ^ s[47]; | ||
c8 = s[8] ^ s[18] ^ s[28] ^ s[38] ^ s[48]; | ||
c9 = s[9] ^ s[19] ^ s[29] ^ s[39] ^ s[49]; | ||
var h, l, n, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, | ||
b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17, | ||
b18, b19, b20, b21, b22, b23, b24, b25, b26, b27, b28, b29, b30, b31, b32, b33, | ||
b34, b35, b36, b37, b38, b39, b40, b41, b42, b43, b44, b45, b46, b47, b48, b49; | ||
for (n = 0; n < 48; n += 2) { | ||
c0 = s[0] ^ s[10] ^ s[20] ^ s[30] ^ s[40]; | ||
c1 = s[1] ^ s[11] ^ s[21] ^ s[31] ^ s[41]; | ||
c2 = s[2] ^ s[12] ^ s[22] ^ s[32] ^ s[42]; | ||
c3 = s[3] ^ s[13] ^ s[23] ^ s[33] ^ s[43]; | ||
c4 = s[4] ^ s[14] ^ s[24] ^ s[34] ^ s[44]; | ||
c5 = s[5] ^ s[15] ^ s[25] ^ s[35] ^ s[45]; | ||
c6 = s[6] ^ s[16] ^ s[26] ^ s[36] ^ s[46]; | ||
c7 = s[7] ^ s[17] ^ s[27] ^ s[37] ^ s[47]; | ||
c8 = s[8] ^ s[18] ^ s[28] ^ s[38] ^ s[48]; | ||
c9 = s[9] ^ s[19] ^ s[29] ^ s[39] ^ s[49]; | ||
h = c8 ^ ((c2 << 1) | (c3 >>> 31)); | ||
l = c9 ^ ((c3 << 1) | (c2 >>> 31)); | ||
s[0] ^= h; | ||
s[1] ^= l; | ||
s[10] ^= h; | ||
s[11] ^= l; | ||
s[20] ^= h; | ||
s[21] ^= l; | ||
s[30] ^= h; | ||
s[31] ^= l; | ||
s[40] ^= h; | ||
s[41] ^= l; | ||
h = c0 ^ ((c4 << 1) | (c5 >>> 31)); | ||
l = c1 ^ ((c5 << 1) | (c4 >>> 31)); | ||
s[2] ^= h; | ||
s[3] ^= l; | ||
s[12] ^= h; | ||
s[13] ^= l; | ||
s[22] ^= h; | ||
s[23] ^= l; | ||
s[32] ^= h; | ||
s[33] ^= l; | ||
s[42] ^= h; | ||
s[43] ^= l; | ||
h = c2 ^ ((c6 << 1) | (c7 >>> 31)); | ||
l = c3 ^ ((c7 << 1) | (c6 >>> 31)); | ||
s[4] ^= h; | ||
s[5] ^= l; | ||
s[14] ^= h; | ||
s[15] ^= l; | ||
s[24] ^= h; | ||
s[25] ^= l; | ||
s[34] ^= h; | ||
s[35] ^= l; | ||
s[44] ^= h; | ||
s[45] ^= l; | ||
h = c4 ^ ((c8 << 1) | (c9 >>> 31)); | ||
l = c5 ^ ((c9 << 1) | (c8 >>> 31)); | ||
s[6] ^= h; | ||
s[7] ^= l; | ||
s[16] ^= h; | ||
s[17] ^= l; | ||
s[26] ^= h; | ||
s[27] ^= l; | ||
s[36] ^= h; | ||
s[37] ^= l; | ||
s[46] ^= h; | ||
s[47] ^= l; | ||
h = c6 ^ ((c0 << 1) | (c1 >>> 31)); | ||
l = c7 ^ ((c1 << 1) | (c0 >>> 31)); | ||
s[8] ^= h; | ||
s[9] ^= l; | ||
s[18] ^= h; | ||
s[19] ^= l; | ||
s[28] ^= h; | ||
s[29] ^= l; | ||
s[38] ^= h; | ||
s[39] ^= l; | ||
s[48] ^= h; | ||
s[49] ^= l; | ||
h = c8 ^ ((c2 << 1) | (c3 >>> 31)); | ||
l = c9 ^ ((c3 << 1) | (c2 >>> 31)); | ||
s[0] ^= h; | ||
s[1] ^= l; | ||
s[10] ^= h; | ||
s[11] ^= l; | ||
s[20] ^= h; | ||
s[21] ^= l; | ||
s[30] ^= h; | ||
s[31] ^= l; | ||
s[40] ^= h; | ||
s[41] ^= l; | ||
h = c0 ^ ((c4 << 1) | (c5 >>> 31)); | ||
l = c1 ^ ((c5 << 1) | (c4 >>> 31)); | ||
s[2] ^= h; | ||
s[3] ^= l; | ||
s[12] ^= h; | ||
s[13] ^= l; | ||
s[22] ^= h; | ||
s[23] ^= l; | ||
s[32] ^= h; | ||
s[33] ^= l; | ||
s[42] ^= h; | ||
s[43] ^= l; | ||
h = c2 ^ ((c6 << 1) | (c7 >>> 31)); | ||
l = c3 ^ ((c7 << 1) | (c6 >>> 31)); | ||
s[4] ^= h; | ||
s[5] ^= l; | ||
s[14] ^= h; | ||
s[15] ^= l; | ||
s[24] ^= h; | ||
s[25] ^= l; | ||
s[34] ^= h; | ||
s[35] ^= l; | ||
s[44] ^= h; | ||
s[45] ^= l; | ||
h = c4 ^ ((c8 << 1) | (c9 >>> 31)); | ||
l = c5 ^ ((c9 << 1) | (c8 >>> 31)); | ||
s[6] ^= h; | ||
s[7] ^= l; | ||
s[16] ^= h; | ||
s[17] ^= l; | ||
s[26] ^= h; | ||
s[27] ^= l; | ||
s[36] ^= h; | ||
s[37] ^= l; | ||
s[46] ^= h; | ||
s[47] ^= l; | ||
h = c6 ^ ((c0 << 1) | (c1 >>> 31)); | ||
l = c7 ^ ((c1 << 1) | (c0 >>> 31)); | ||
s[8] ^= h; | ||
s[9] ^= l; | ||
s[18] ^= h; | ||
s[19] ^= l; | ||
s[28] ^= h; | ||
s[29] ^= l; | ||
s[38] ^= h; | ||
s[39] ^= l; | ||
s[48] ^= h; | ||
s[49] ^= l; | ||
b0 = s[0]; | ||
b1 = s[1]; | ||
b32 = (s[11] << 4) | (s[10] >>> 28); | ||
b33 = (s[10] << 4) | (s[11] >>> 28); | ||
b14 = (s[20] << 3) | (s[21] >>> 29); | ||
b15 = (s[21] << 3) | (s[20] >>> 29); | ||
b46 = (s[31] << 9) | (s[30] >>> 23); | ||
b47 = (s[30] << 9) | (s[31] >>> 23); | ||
b28 = (s[40] << 18) | (s[41] >>> 14); | ||
b29 = (s[41] << 18) | (s[40] >>> 14); | ||
b20 = (s[2] << 1) | (s[3] >>> 31); | ||
b21 = (s[3] << 1) | (s[2] >>> 31); | ||
b2 = (s[13] << 12) | (s[12] >>> 20); | ||
b3 = (s[12] << 12) | (s[13] >>> 20); | ||
b34 = (s[22] << 10) | (s[23] >>> 22); | ||
b35 = (s[23] << 10) | (s[22] >>> 22); | ||
b16 = (s[33] << 13) | (s[32] >>> 19); | ||
b17 = (s[32] << 13) | (s[33] >>> 19); | ||
b48 = (s[42] << 2) | (s[43] >>> 30); | ||
b49 = (s[43] << 2) | (s[42] >>> 30); | ||
b40 = (s[5] << 30) | (s[4] >>> 2); | ||
b41 = (s[4] << 30) | (s[5] >>> 2); | ||
b22 = (s[14] << 6) | (s[15] >>> 26); | ||
b23 = (s[15] << 6) | (s[14] >>> 26); | ||
b4 = (s[25] << 11) | (s[24] >>> 21); | ||
b5 = (s[24] << 11) | (s[25] >>> 21); | ||
b36 = (s[34] << 15) | (s[35] >>> 17); | ||
b37 = (s[35] << 15) | (s[34] >>> 17); | ||
b18 = (s[45] << 29) | (s[44] >>> 3); | ||
b19 = (s[44] << 29) | (s[45] >>> 3); | ||
b10 = (s[6] << 28) | (s[7] >>> 4); | ||
b11 = (s[7] << 28) | (s[6] >>> 4); | ||
b42 = (s[17] << 23) | (s[16] >>> 9); | ||
b43 = (s[16] << 23) | (s[17] >>> 9); | ||
b24 = (s[26] << 25) | (s[27] >>> 7); | ||
b25 = (s[27] << 25) | (s[26] >>> 7); | ||
b6 = (s[36] << 21) | (s[37] >>> 11); | ||
b7 = (s[37] << 21) | (s[36] >>> 11); | ||
b38 = (s[47] << 24) | (s[46] >>> 8); | ||
b39 = (s[46] << 24) | (s[47] >>> 8); | ||
b30 = (s[8] << 27) | (s[9] >>> 5); | ||
b31 = (s[9] << 27) | (s[8] >>> 5); | ||
b12 = (s[18] << 20) | (s[19] >>> 12); | ||
b13 = (s[19] << 20) | (s[18] >>> 12); | ||
b44 = (s[29] << 7) | (s[28] >>> 25); | ||
b45 = (s[28] << 7) | (s[29] >>> 25); | ||
b26 = (s[38] << 8) | (s[39] >>> 24); | ||
b27 = (s[39] << 8) | (s[38] >>> 24); | ||
b8 = (s[48] << 14) | (s[49] >>> 18); | ||
b9 = (s[49] << 14) | (s[48] >>> 18); | ||
b0 = s[0]; | ||
b1 = s[1]; | ||
b32 = (s[11] << 4) | (s[10] >>> 28); | ||
b33 = (s[10] << 4) | (s[11] >>> 28); | ||
b14 = (s[20] << 3) | (s[21] >>> 29); | ||
b15 = (s[21] << 3) | (s[20] >>> 29); | ||
b46 = (s[31] << 9) | (s[30] >>> 23); | ||
b47 = (s[30] << 9) | (s[31] >>> 23); | ||
b28 = (s[40] << 18) | (s[41] >>> 14); | ||
b29 = (s[41] << 18) | (s[40] >>> 14); | ||
b20 = (s[2] << 1) | (s[3] >>> 31); | ||
b21 = (s[3] << 1) | (s[2] >>> 31); | ||
b2 = (s[13] << 12) | (s[12] >>> 20); | ||
b3 = (s[12] << 12) | (s[13] >>> 20); | ||
b34 = (s[22] << 10) | (s[23] >>> 22); | ||
b35 = (s[23] << 10) | (s[22] >>> 22); | ||
b16 = (s[33] << 13) | (s[32] >>> 19); | ||
b17 = (s[32] << 13) | (s[33] >>> 19); | ||
b48 = (s[42] << 2) | (s[43] >>> 30); | ||
b49 = (s[43] << 2) | (s[42] >>> 30); | ||
b40 = (s[5] << 30) | (s[4] >>> 2); | ||
b41 = (s[4] << 30) | (s[5] >>> 2); | ||
b22 = (s[14] << 6) | (s[15] >>> 26); | ||
b23 = (s[15] << 6) | (s[14] >>> 26); | ||
b4 = (s[25] << 11) | (s[24] >>> 21); | ||
b5 = (s[24] << 11) | (s[25] >>> 21); | ||
b36 = (s[34] << 15) | (s[35] >>> 17); | ||
b37 = (s[35] << 15) | (s[34] >>> 17); | ||
b18 = (s[45] << 29) | (s[44] >>> 3); | ||
b19 = (s[44] << 29) | (s[45] >>> 3); | ||
b10 = (s[6] << 28) | (s[7] >>> 4); | ||
b11 = (s[7] << 28) | (s[6] >>> 4); | ||
b42 = (s[17] << 23) | (s[16] >>> 9); | ||
b43 = (s[16] << 23) | (s[17] >>> 9); | ||
b24 = (s[26] << 25) | (s[27] >>> 7); | ||
b25 = (s[27] << 25) | (s[26] >>> 7); | ||
b6 = (s[36] << 21) | (s[37] >>> 11); | ||
b7 = (s[37] << 21) | (s[36] >>> 11); | ||
b38 = (s[47] << 24) | (s[46] >>> 8); | ||
b39 = (s[46] << 24) | (s[47] >>> 8); | ||
b30 = (s[8] << 27) | (s[9] >>> 5); | ||
b31 = (s[9] << 27) | (s[8] >>> 5); | ||
b12 = (s[18] << 20) | (s[19] >>> 12); | ||
b13 = (s[19] << 20) | (s[18] >>> 12); | ||
b44 = (s[29] << 7) | (s[28] >>> 25); | ||
b45 = (s[28] << 7) | (s[29] >>> 25); | ||
b26 = (s[38] << 8) | (s[39] >>> 24); | ||
b27 = (s[39] << 8) | (s[38] >>> 24); | ||
b8 = (s[48] << 14) | (s[49] >>> 18); | ||
b9 = (s[49] << 14) | (s[48] >>> 18); | ||
s[0] = b0 ^ (~b2 & b4); | ||
s[1] = b1 ^ (~b3 & b5); | ||
s[10] = b10 ^ (~b12 & b14); | ||
s[11] = b11 ^ (~b13 & b15); | ||
s[20] = b20 ^ (~b22 & b24); | ||
s[21] = b21 ^ (~b23 & b25); | ||
s[30] = b30 ^ (~b32 & b34); | ||
s[31] = b31 ^ (~b33 & b35); | ||
s[40] = b40 ^ (~b42 & b44); | ||
s[41] = b41 ^ (~b43 & b45); | ||
s[2] = b2 ^ (~b4 & b6); | ||
s[3] = b3 ^ (~b5 & b7); | ||
s[12] = b12 ^ (~b14 & b16); | ||
s[13] = b13 ^ (~b15 & b17); | ||
s[22] = b22 ^ (~b24 & b26); | ||
s[23] = b23 ^ (~b25 & b27); | ||
s[32] = b32 ^ (~b34 & b36); | ||
s[33] = b33 ^ (~b35 & b37); | ||
s[42] = b42 ^ (~b44 & b46); | ||
s[43] = b43 ^ (~b45 & b47); | ||
s[4] = b4 ^ (~b6 & b8); | ||
s[5] = b5 ^ (~b7 & b9); | ||
s[14] = b14 ^ (~b16 & b18); | ||
s[15] = b15 ^ (~b17 & b19); | ||
s[24] = b24 ^ (~b26 & b28); | ||
s[25] = b25 ^ (~b27 & b29); | ||
s[34] = b34 ^ (~b36 & b38); | ||
s[35] = b35 ^ (~b37 & b39); | ||
s[44] = b44 ^ (~b46 & b48); | ||
s[45] = b45 ^ (~b47 & b49); | ||
s[6] = b6 ^ (~b8 & b0); | ||
s[7] = b7 ^ (~b9 & b1); | ||
s[16] = b16 ^ (~b18 & b10); | ||
s[17] = b17 ^ (~b19 & b11); | ||
s[26] = b26 ^ (~b28 & b20); | ||
s[27] = b27 ^ (~b29 & b21); | ||
s[36] = b36 ^ (~b38 & b30); | ||
s[37] = b37 ^ (~b39 & b31); | ||
s[46] = b46 ^ (~b48 & b40); | ||
s[47] = b47 ^ (~b49 & b41); | ||
s[8] = b8 ^ (~b0 & b2); | ||
s[9] = b9 ^ (~b1 & b3); | ||
s[18] = b18 ^ (~b10 & b12); | ||
s[19] = b19 ^ (~b11 & b13); | ||
s[28] = b28 ^ (~b20 & b22); | ||
s[29] = b29 ^ (~b21 & b23); | ||
s[38] = b38 ^ (~b30 & b32); | ||
s[39] = b39 ^ (~b31 & b33); | ||
s[48] = b48 ^ (~b40 & b42); | ||
s[49] = b49 ^ (~b41 & b43); | ||
s[0] = b0 ^ (~b2 & b4); | ||
s[1] = b1 ^ (~b3 & b5); | ||
s[10] = b10 ^ (~b12 & b14); | ||
s[11] = b11 ^ (~b13 & b15); | ||
s[20] = b20 ^ (~b22 & b24); | ||
s[21] = b21 ^ (~b23 & b25); | ||
s[30] = b30 ^ (~b32 & b34); | ||
s[31] = b31 ^ (~b33 & b35); | ||
s[40] = b40 ^ (~b42 & b44); | ||
s[41] = b41 ^ (~b43 & b45); | ||
s[2] = b2 ^ (~b4 & b6); | ||
s[3] = b3 ^ (~b5 & b7); | ||
s[12] = b12 ^ (~b14 & b16); | ||
s[13] = b13 ^ (~b15 & b17); | ||
s[22] = b22 ^ (~b24 & b26); | ||
s[23] = b23 ^ (~b25 & b27); | ||
s[32] = b32 ^ (~b34 & b36); | ||
s[33] = b33 ^ (~b35 & b37); | ||
s[42] = b42 ^ (~b44 & b46); | ||
s[43] = b43 ^ (~b45 & b47); | ||
s[4] = b4 ^ (~b6 & b8); | ||
s[5] = b5 ^ (~b7 & b9); | ||
s[14] = b14 ^ (~b16 & b18); | ||
s[15] = b15 ^ (~b17 & b19); | ||
s[24] = b24 ^ (~b26 & b28); | ||
s[25] = b25 ^ (~b27 & b29); | ||
s[34] = b34 ^ (~b36 & b38); | ||
s[35] = b35 ^ (~b37 & b39); | ||
s[44] = b44 ^ (~b46 & b48); | ||
s[45] = b45 ^ (~b47 & b49); | ||
s[6] = b6 ^ (~b8 & b0); | ||
s[7] = b7 ^ (~b9 & b1); | ||
s[16] = b16 ^ (~b18 & b10); | ||
s[17] = b17 ^ (~b19 & b11); | ||
s[26] = b26 ^ (~b28 & b20); | ||
s[27] = b27 ^ (~b29 & b21); | ||
s[36] = b36 ^ (~b38 & b30); | ||
s[37] = b37 ^ (~b39 & b31); | ||
s[46] = b46 ^ (~b48 & b40); | ||
s[47] = b47 ^ (~b49 & b41); | ||
s[8] = b8 ^ (~b0 & b2); | ||
s[9] = b9 ^ (~b1 & b3); | ||
s[18] = b18 ^ (~b10 & b12); | ||
s[19] = b19 ^ (~b11 & b13); | ||
s[28] = b28 ^ (~b20 & b22); | ||
s[29] = b29 ^ (~b21 & b23); | ||
s[38] = b38 ^ (~b30 & b32); | ||
s[39] = b39 ^ (~b31 & b33); | ||
s[48] = b48 ^ (~b40 & b42); | ||
s[49] = b49 ^ (~b41 & b43); | ||
s[0] ^= RC[n]; | ||
s[1] ^= RC[n + 1]; | ||
} | ||
} | ||
s[0] ^= RC[n]; | ||
s[1] ^= RC[n + 1]; | ||
} | ||
}; | ||
module.exports = methods; | ||
@@ -515,2 +518,2 @@ // if (!root.JS_SHA3_TEST && NODE_JS) { | ||
// } | ||
// } | ||
// } |
843
lib/luffa.js
@@ -0,1 +1,2 @@ | ||
'use strict'; | ||
///////////////////////////////////// | ||
@@ -9,482 +10,478 @@ ////////////// Luffa /////////////// | ||
var op = require('./op'); | ||
var o = require('./op'); | ||
var h = require('./helper'); | ||
var Luffa_BlockSize = 32; | ||
var Luffa_VX = 5; | ||
var Luffa_VY = 8; | ||
var V_INIT = [ | ||
[ | ||
0x6d251e69, 0x44b051e0, | ||
0x4eaa6fb4, 0xdbf78465, | ||
0x6e292011, 0x90152df4, | ||
0xee058139, 0xdef610bb | ||
], | ||
[ | ||
0xc3b44b95, 0xd9d2f256, | ||
0x70eee9a0, 0xde099fa3, | ||
0x5d9b0557, 0x8fc944b3, | ||
0xcf1ccf0e, 0x746cd581 | ||
], | ||
[ | ||
0xf7efc89d, 0x5dba5781, | ||
0x04016ce5, 0xad659c05, | ||
0x0306194f, 0x666d1836, | ||
0x24aa230a, 0x8b264ae7 | ||
], | ||
[ | ||
0x858075d5, 0x36d79cce, | ||
0xe571f7d7, 0x204b1f67, | ||
0x35870c6a, 0x57e9e923, | ||
0x14bcb808, 0x7cde72ce | ||
], | ||
[ | ||
0x6c68e9be, 0x5ec41e22, | ||
0xc825b7c7, 0xaffb4363, | ||
0xf5df3999, 0x0fc688f1, | ||
0xb07224cc, 0x03e86cea | ||
] | ||
[ | ||
0x6d251e69, 0x44b051e0, | ||
0x4eaa6fb4, 0xdbf78465, | ||
0x6e292011, 0x90152df4, | ||
0xee058139, 0xdef610bb | ||
], | ||
[ | ||
0xc3b44b95, 0xd9d2f256, | ||
0x70eee9a0, 0xde099fa3, | ||
0x5d9b0557, 0x8fc944b3, | ||
0xcf1ccf0e, 0x746cd581 | ||
], | ||
[ | ||
0xf7efc89d, 0x5dba5781, | ||
0x04016ce5, 0xad659c05, | ||
0x0306194f, 0x666d1836, | ||
0x24aa230a, 0x8b264ae7 | ||
], | ||
[ | ||
0x858075d5, 0x36d79cce, | ||
0xe571f7d7, 0x204b1f67, | ||
0x35870c6a, 0x57e9e923, | ||
0x14bcb808, 0x7cde72ce | ||
], | ||
[ | ||
0x6c68e9be, 0x5ec41e22, | ||
0xc825b7c7, 0xaffb4363, | ||
0xf5df3999, 0x0fc688f1, | ||
0xb07224cc, 0x03e86cea | ||
] | ||
]; | ||
var RC00 = [ | ||
0x303994a6, 0xc0e65299, | ||
0x6cc33a12, 0xdc56983e, | ||
0x1e00108f, 0x7800423d, | ||
0x8f5b7882, 0x96e1db12 | ||
0x303994a6, 0xc0e65299, | ||
0x6cc33a12, 0xdc56983e, | ||
0x1e00108f, 0x7800423d, | ||
0x8f5b7882, 0x96e1db12 | ||
]; | ||
var RC04 = [ | ||
0xe0337818, 0x441ba90d, | ||
0x7f34d442, 0x9389217f, | ||
0xe5a8bce6, 0x5274baf4, | ||
0x26889ba7, 0x9a226e9d | ||
0xe0337818, 0x441ba90d, | ||
0x7f34d442, 0x9389217f, | ||
0xe5a8bce6, 0x5274baf4, | ||
0x26889ba7, 0x9a226e9d | ||
]; | ||
var RC10 = [ | ||
0xb6de10ed, 0x70f47aae, | ||
0x0707a3d4, 0x1c1e8f51, | ||
0x707a3d45, 0xaeb28562, | ||
0xbaca1589, 0x40a46f3e | ||
0xb6de10ed, 0x70f47aae, | ||
0x0707a3d4, 0x1c1e8f51, | ||
0x707a3d45, 0xaeb28562, | ||
0xbaca1589, 0x40a46f3e | ||
]; | ||
var RC14 = [ | ||
0x01685f3d, 0x05a17cf4, | ||
0xbd09caca, 0xf4272b28, | ||
0x144ae5cc, 0xfaa7ae2b, | ||
0x2e48f1c1, 0xb923c704 | ||
0x01685f3d, 0x05a17cf4, | ||
0xbd09caca, 0xf4272b28, | ||
0x144ae5cc, 0xfaa7ae2b, | ||
0x2e48f1c1, 0xb923c704 | ||
]; | ||
var RC20 = [ | ||
0xfc20d9d2, 0x34552e25, | ||
0x7ad8818f, 0x8438764a, | ||
0xbb6de032, 0xedb780c8, | ||
0xd9847356, 0xa2c78434 | ||
0xfc20d9d2, 0x34552e25, | ||
0x7ad8818f, 0x8438764a, | ||
0xbb6de032, 0xedb780c8, | ||
0xd9847356, 0xa2c78434 | ||
]; | ||
var RC24 = [ | ||
0xe25e72c1, 0xe623bb72, | ||
0x5c58a4a4, 0x1e38e2e7, | ||
0x78e38b9d, 0x27586719, | ||
0x36eda57f, 0x703aace7 | ||
0xe25e72c1, 0xe623bb72, | ||
0x5c58a4a4, 0x1e38e2e7, | ||
0x78e38b9d, 0x27586719, | ||
0x36eda57f, 0x703aace7 | ||
]; | ||
var RC30 = [ | ||
0xb213afa5, 0xc84ebe95, | ||
0x4e608a22, 0x56d858fe, | ||
0x343b138f, 0xd0ec4e3d, | ||
0x2ceb4882, 0xb3ad2208 | ||
0xb213afa5, 0xc84ebe95, | ||
0x4e608a22, 0x56d858fe, | ||
0x343b138f, 0xd0ec4e3d, | ||
0x2ceb4882, 0xb3ad2208 | ||
]; | ||
var RC34 = [ | ||
0xe028c9bf, 0x44756f91, | ||
0x7e8fce32, 0x956548be, | ||
0xfe191be2, 0x3cb226e5, | ||
0x5944a28e, 0xa1c4c355 | ||
0xe028c9bf, 0x44756f91, | ||
0x7e8fce32, 0x956548be, | ||
0xfe191be2, 0x3cb226e5, | ||
0x5944a28e, 0xa1c4c355 | ||
]; | ||
var RC40 = [ | ||
0xf0d2e9e3, 0xac11d7fa, | ||
0x1bcb66f2, 0x6f2d9bc9, | ||
0x78602649, 0x8edae952, | ||
0x3b6ba548, 0xedae9520 | ||
0xf0d2e9e3, 0xac11d7fa, | ||
0x1bcb66f2, 0x6f2d9bc9, | ||
0x78602649, 0x8edae952, | ||
0x3b6ba548, 0xedae9520 | ||
]; | ||
var RC44 = [ | ||
0x5090d577, 0x2d1925ab, | ||
0xb46496ac, 0xd1925ab0, | ||
0x29131ab6, 0x0fc053c3, | ||
0x3f014f0c, 0xfc053c31 | ||
0x5090d577, 0x2d1925ab, | ||
0xb46496ac, 0xd1925ab0, | ||
0x29131ab6, 0x0fc053c3, | ||
0x3f014f0c, 0xfc053c31 | ||
]; | ||
var M2 = function(d, s) { | ||
var tmp = s[7]; | ||
d[7] = s[6]; | ||
d[6] = s[5]; | ||
d[5] = s[4]; | ||
d[4] = s[3] ^ tmp; | ||
d[3] = s[2] ^ tmp; | ||
d[2] = s[1]; | ||
d[1] = s[0] ^ tmp; | ||
d[0] = tmp; | ||
} | ||
var tmp = s[7]; | ||
d[7] = s[6]; | ||
d[6] = s[5]; | ||
d[5] = s[4]; | ||
d[4] = s[3] ^ tmp; | ||
d[3] = s[2] ^ tmp; | ||
d[2] = s[1]; | ||
d[1] = s[0] ^ tmp; | ||
d[0] = tmp; | ||
}; | ||
//V is a table of states | ||
var MI5 = function(buf, V) { | ||
var M = Array(8); | ||
var a = Array(8); | ||
var b = Array(8); | ||
M[0] = buf[0]; | ||
M[1] = buf[1]; | ||
M[2] = buf[2]; | ||
M[3] = buf[3]; | ||
M[4] = buf[4]; | ||
M[5] = buf[5]; | ||
M[6] = buf[6]; | ||
M[7] = buf[7]; | ||
op.xORTable(a, V[0], V[1], 8); | ||
op.xORTable(b, V[2], V[3], 8); | ||
op.xORTable(a, a, b, 8); | ||
op.xORTable(a, a, V[4], 8); | ||
M2(a, a); | ||
op.xORTable(V[0], a, V[0], 8); | ||
op.xORTable(V[1], a, V[1], 8); | ||
op.xORTable(V[2], a, V[2], 8); | ||
op.xORTable(V[3], a, V[3], 8); | ||
op.xORTable(V[4], a, V[4], 8); | ||
M2(b, V[0]); | ||
op.xORTable(b, b, V[1], 8); | ||
M2(V[1], V[1]); | ||
op.xORTable(V[1], V[1], V[2], 8); | ||
M2(V[2], V[2]); | ||
op.xORTable(V[2], V[2], V[3], 8); | ||
M2(V[3], V[3]); | ||
op.xORTable(V[3], V[3], V[4], 8); | ||
M2(V[4], V[4]); | ||
op.xORTable(V[4], V[4], V[0], 8); | ||
M2(V[0], b); | ||
op.xORTable(V[0], V[0], V[4], 8); | ||
M2(V[4], V[4]); | ||
op.xORTable(V[4], V[4], V[3], 8); | ||
M2(V[3], V[3]); | ||
op.xORTable(V[3], V[3], V[2], 8); | ||
M2(V[2], V[2]); | ||
op.xORTable(V[2], V[2], V[1], 8); | ||
M2(V[1], V[1]); | ||
op.xORTable(V[1], V[1], b, 8); | ||
op.xORTable(V[0], V[0], M, 8); | ||
M2(M, M); | ||
op.xORTable(V[1], V[1], M, 8); | ||
M2(M, M); | ||
op.xORTable(V[2], V[2], M, 8); | ||
M2(M, M); | ||
op.xORTable(V[3], V[3], M, 8); | ||
M2(M, M); | ||
op.xORTable(V[4], V[4], M, 8); | ||
} | ||
var M = Array(8); | ||
var a = Array(8); | ||
var b = Array(8); | ||
M[0] = buf[0]; | ||
M[1] = buf[1]; | ||
M[2] = buf[2]; | ||
M[3] = buf[3]; | ||
M[4] = buf[4]; | ||
M[5] = buf[5]; | ||
M[6] = buf[6]; | ||
M[7] = buf[7]; | ||
o.xORTable(a, V[0], V[1], 8); | ||
o.xORTable(b, V[2], V[3], 8); | ||
o.xORTable(a, a, b, 8); | ||
o.xORTable(a, a, V[4], 8); | ||
M2(a, a); | ||
o.xORTable(V[0], a, V[0], 8); | ||
o.xORTable(V[1], a, V[1], 8); | ||
o.xORTable(V[2], a, V[2], 8); | ||
o.xORTable(V[3], a, V[3], 8); | ||
o.xORTable(V[4], a, V[4], 8); | ||
M2(b, V[0]); | ||
o.xORTable(b, b, V[1], 8); | ||
M2(V[1], V[1]); | ||
o.xORTable(V[1], V[1], V[2], 8); | ||
M2(V[2], V[2]); | ||
o.xORTable(V[2], V[2], V[3], 8); | ||
M2(V[3], V[3]); | ||
o.xORTable(V[3], V[3], V[4], 8); | ||
M2(V[4], V[4]); | ||
o.xORTable(V[4], V[4], V[0], 8); | ||
M2(V[0], b); | ||
o.xORTable(V[0], V[0], V[4], 8); | ||
M2(V[4], V[4]); | ||
o.xORTable(V[4], V[4], V[3], 8); | ||
M2(V[3], V[3]); | ||
o.xORTable(V[3], V[3], V[2], 8); | ||
M2(V[2], V[2]); | ||
o.xORTable(V[2], V[2], V[1], 8); | ||
M2(V[1], V[1]); | ||
o.xORTable(V[1], V[1], b, 8); | ||
o.xORTable(V[0], V[0], M, 8); | ||
M2(M, M); | ||
o.xORTable(V[1], V[1], M, 8); | ||
M2(M, M); | ||
o.xORTable(V[2], V[2], M, 8); | ||
M2(M, M); | ||
o.xORTable(V[3], V[3], M, 8); | ||
M2(M, M); | ||
o.xORTable(V[4], V[4], M, 8); | ||
}; | ||
var TWEAK5 = function(V) { | ||
V[1][4] = op.rotl32(V[1][4], 1); | ||
V[1][5] = op.rotl32(V[1][5], 1); | ||
V[1][6] = op.rotl32(V[1][6], 1); | ||
V[1][7] = op.rotl32(V[1][7], 1); | ||
V[2][4] = op.rotl32(V[2][4], 2); | ||
V[2][5] = op.rotl32(V[2][5], 2); | ||
V[2][6] = op.rotl32(V[2][6], 2); | ||
V[2][7] = op.rotl32(V[2][7], 2); | ||
V[3][4] = op.rotl32(V[3][4], 3); | ||
V[3][5] = op.rotl32(V[3][5], 3); | ||
V[3][6] = op.rotl32(V[3][6], 3); | ||
V[3][7] = op.rotl32(V[3][7], 3); | ||
V[4][4] = op.rotl32(V[4][4], 4); | ||
V[4][5] = op.rotl32(V[4][5], 4); | ||
V[4][6] = op.rotl32(V[4][6], 4); | ||
V[4][7] = op.rotl32(V[4][7], 4); | ||
} | ||
V[1][4] = o.rotl32(V[1][4], 1); | ||
V[1][5] = o.rotl32(V[1][5], 1); | ||
V[1][6] = o.rotl32(V[1][6], 1); | ||
V[1][7] = o.rotl32(V[1][7], 1); | ||
V[2][4] = o.rotl32(V[2][4], 2); | ||
V[2][5] = o.rotl32(V[2][5], 2); | ||
V[2][6] = o.rotl32(V[2][6], 2); | ||
V[2][7] = o.rotl32(V[2][7], 2); | ||
V[3][4] = o.rotl32(V[3][4], 3); | ||
V[3][5] = o.rotl32(V[3][5], 3); | ||
V[3][6] = o.rotl32(V[3][6], 3); | ||
V[3][7] = o.rotl32(V[3][7], 3); | ||
V[4][4] = o.rotl32(V[4][4], 4); | ||
V[4][5] = o.rotl32(V[4][5], 4); | ||
V[4][6] = o.rotl32(V[4][6], 4); | ||
V[4][7] = o.rotl32(V[4][7], 4); | ||
}; | ||
var SUB_CRUMB = function(a0, a1, a2, a3) { | ||
var tmp; | ||
tmp = (a0); | ||
(a0) |= (a1); | ||
(a2) ^= (a3); | ||
(a1) = op.t32(~(a1)); | ||
(a0) ^= (a3); | ||
(a3) &= tmp; | ||
(a1) ^= (a3); | ||
(a3) ^= (a2); | ||
(a2) &= (a0); | ||
(a0) = op.t32(~(a0)); | ||
(a2) ^= (a1); | ||
(a1) |= (a3); | ||
tmp ^= (a1); | ||
(a3) ^= (a2); | ||
(a2) &= (a1); | ||
(a1) ^= (a0); | ||
(a0) = tmp; | ||
return [a0, a1, a2, a3]; | ||
} | ||
var tmp; | ||
tmp = (a0); | ||
(a0) |= (a1); | ||
(a2) ^= (a3); | ||
(a1) = o.t32(~(a1)); | ||
(a0) ^= (a3); | ||
(a3) &= tmp; | ||
(a1) ^= (a3); | ||
(a3) ^= (a2); | ||
(a2) &= (a0); | ||
(a0) = o.t32(~(a0)); | ||
(a2) ^= (a1); | ||
(a1) |= (a3); | ||
tmp ^= (a1); | ||
(a3) ^= (a2); | ||
(a2) &= (a1); | ||
(a1) ^= (a0); | ||
(a0) = tmp; | ||
return [a0, a1, a2, a3]; | ||
}; | ||
var MIX_WORD = function(u, v) { | ||
(v) ^= (u); | ||
(u) = op.rotl32((u), 2) ^ (v); | ||
(v) = op.rotl32((v), 14) ^ (u); | ||
(u) = op.rotl32((u), 10) ^ (v); | ||
(v) = op.rotl32((v), 1); | ||
return [u,v]; | ||
} | ||
(v) ^= (u); | ||
(u) = o.rotl32((u), 2) ^ (v); | ||
(v) = o.rotl32((v), 14) ^ (u); | ||
(u) = o.rotl32((u), 10) ^ (v); | ||
(v) = o.rotl32((v), 1); | ||
return [u,v]; | ||
}; | ||
var P5 = function(V) { | ||
TWEAK5(V); | ||
var tmp; | ||
for (var r = 0; r < 8; r++) { | ||
tmp = SUB_CRUMB(V[0][0], V[0][1], V[0][2], V[0][3]); | ||
V[0][0] = tmp[0]; | ||
V[0][1] = tmp[1]; | ||
V[0][2] = tmp[2]; | ||
V[0][3] = tmp[3]; | ||
tmp = SUB_CRUMB(V[0][5], V[0][6], V[0][7], V[0][4]); | ||
V[0][5] = tmp[0]; | ||
V[0][6] = tmp[1]; | ||
V[0][7] = tmp[2]; | ||
V[0][4] = tmp[3]; | ||
tmp = MIX_WORD(V[0][0], V[0][4]); | ||
V[0][0] = tmp[0]; | ||
V[0][4] = tmp[1]; | ||
tmp = MIX_WORD(V[0][1], V[0][5]); | ||
V[0][1] = tmp[0]; | ||
V[0][5] = tmp[1]; | ||
tmp = MIX_WORD(V[0][2], V[0][6]); | ||
V[0][2] = tmp[0]; | ||
V[0][6] = tmp[1]; | ||
tmp = MIX_WORD(V[0][3], V[0][7]); | ||
V[0][3] = tmp[0]; | ||
V[0][7] = tmp[1]; | ||
V[0][0] ^= RC00[r]; | ||
V[0][4] ^= RC04[r]; | ||
} | ||
for (var r = 0; r < 8; r++) { | ||
tmp = SUB_CRUMB(V[1][0], V[1][1], V[1][2], V[1][3]); | ||
V[1][0] = tmp[0]; | ||
V[1][1] = tmp[1]; | ||
V[1][2] = tmp[2]; | ||
V[1][3] = tmp[3]; | ||
tmp = SUB_CRUMB(V[1][5], V[1][6], V[1][7], V[1][4]); | ||
V[1][5] = tmp[0]; | ||
V[1][6] = tmp[1]; | ||
V[1][7] = tmp[2]; | ||
V[1][4] = tmp[3]; | ||
tmp = MIX_WORD(V[1][0], V[1][4]); | ||
V[1][0] = tmp[0]; | ||
V[1][4] = tmp[1]; | ||
tmp = MIX_WORD(V[1][1], V[1][5]); | ||
V[1][1] = tmp[0]; | ||
V[1][5] = tmp[1]; | ||
tmp = MIX_WORD(V[1][2], V[1][6]); | ||
V[1][2] = tmp[0]; | ||
V[1][6] = tmp[1]; | ||
tmp = MIX_WORD(V[1][3], V[1][7]); | ||
V[1][3] = tmp[0]; | ||
V[1][7] = tmp[1]; | ||
V[1][0] ^= RC10[r]; | ||
V[1][4] ^= RC14[r]; | ||
} | ||
for (var r = 0; r < 8; r++) { | ||
tmp = SUB_CRUMB(V[2][0], V[2][1], V[2][2], V[2][3]); | ||
V[2][0] = tmp[0]; | ||
V[2][1] = tmp[1]; | ||
V[2][2] = tmp[2]; | ||
V[2][3] = tmp[3]; | ||
tmp = SUB_CRUMB(V[2][5], V[2][6], V[2][7], V[2][4]); | ||
V[2][5] = tmp[0]; | ||
V[2][6] = tmp[1]; | ||
V[2][7] = tmp[2]; | ||
V[2][4] = tmp[3]; | ||
tmp = MIX_WORD(V[2][0], V[2][4]); | ||
V[2][0] = tmp[0]; | ||
V[2][4] = tmp[1]; | ||
tmp = MIX_WORD(V[2][1], V[2][5]); | ||
V[2][1] = tmp[0]; | ||
V[2][5] = tmp[1]; | ||
tmp = MIX_WORD(V[2][2], V[2][6]); | ||
V[2][2] = tmp[0]; | ||
V[2][6] = tmp[1]; | ||
tmp = MIX_WORD(V[2][3], V[2][7]); | ||
V[2][3] = tmp[0]; | ||
V[2][7] = tmp[1]; | ||
V[2][0] ^= RC20[r]; | ||
V[2][4] ^= RC24[r]; | ||
} | ||
for (var r = 0; r < 8; r++) { | ||
tmp = SUB_CRUMB(V[3][0], V[3][1], V[3][2], V[3][3]); | ||
V[3][0] = tmp[0]; | ||
V[3][1] = tmp[1]; | ||
V[3][2] = tmp[2]; | ||
V[3][3] = tmp[3]; | ||
tmp = SUB_CRUMB(V[3][5], V[3][6], V[3][7], V[3][4]); | ||
V[3][5] = tmp[0]; | ||
V[3][6] = tmp[1]; | ||
V[3][7] = tmp[2]; | ||
V[3][4] = tmp[3]; | ||
tmp = MIX_WORD(V[3][0], V[3][4]); | ||
V[3][0] = tmp[0]; | ||
V[3][4] = tmp[1]; | ||
tmp = MIX_WORD(V[3][1], V[3][5]); | ||
V[3][1] = tmp[0]; | ||
V[3][5] = tmp[1]; | ||
tmp = MIX_WORD(V[3][2], V[3][6]); | ||
V[3][2] = tmp[0]; | ||
V[3][6] = tmp[1]; | ||
tmp = MIX_WORD(V[3][3], V[3][7]); | ||
V[3][3] = tmp[0]; | ||
V[3][7] = tmp[1]; | ||
V[3][0] ^= RC30[r]; | ||
V[3][4] ^= RC34[r]; | ||
} | ||
for (var r = 0; r < 8; r++) { | ||
tmp = SUB_CRUMB(V[4][0], V[4][1], V[4][2], V[4][3]); | ||
V[4][0] = tmp[0]; | ||
V[4][1] = tmp[1]; | ||
V[4][2] = tmp[2]; | ||
V[4][3] = tmp[3]; | ||
tmp = SUB_CRUMB(V[4][5], V[4][6], V[4][7], V[4][4]); | ||
V[4][5] = tmp[0]; | ||
V[4][6] = tmp[1]; | ||
V[4][7] = tmp[2]; | ||
V[4][4] = tmp[3]; | ||
tmp = MIX_WORD(V[4][0], V[4][4]); | ||
V[4][0] = tmp[0]; | ||
V[4][4] = tmp[1]; | ||
tmp = MIX_WORD(V[4][1], V[4][5]); | ||
V[4][1] = tmp[0]; | ||
V[4][5] = tmp[1]; | ||
tmp = MIX_WORD(V[4][2], V[4][6]); | ||
V[4][2] = tmp[0]; | ||
V[4][6] = tmp[1]; | ||
tmp = MIX_WORD(V[4][3], V[4][7]); | ||
V[4][3] = tmp[0]; | ||
V[4][7] = tmp[1]; | ||
V[4][0] ^= RC40[r]; | ||
V[4][4] ^= RC44[r]; | ||
} | ||
} | ||
TWEAK5(V); | ||
var tmp; | ||
for (var r = 0; r < 8; r++) { | ||
tmp = SUB_CRUMB(V[0][0], V[0][1], V[0][2], V[0][3]); | ||
V[0][0] = tmp[0]; | ||
V[0][1] = tmp[1]; | ||
V[0][2] = tmp[2]; | ||
V[0][3] = tmp[3]; | ||
tmp = SUB_CRUMB(V[0][5], V[0][6], V[0][7], V[0][4]); | ||
V[0][5] = tmp[0]; | ||
V[0][6] = tmp[1]; | ||
V[0][7] = tmp[2]; | ||
V[0][4] = tmp[3]; | ||
tmp = MIX_WORD(V[0][0], V[0][4]); | ||
V[0][0] = tmp[0]; | ||
V[0][4] = tmp[1]; | ||
tmp = MIX_WORD(V[0][1], V[0][5]); | ||
V[0][1] = tmp[0]; | ||
V[0][5] = tmp[1]; | ||
tmp = MIX_WORD(V[0][2], V[0][6]); | ||
V[0][2] = tmp[0]; | ||
V[0][6] = tmp[1]; | ||
tmp = MIX_WORD(V[0][3], V[0][7]); | ||
V[0][3] = tmp[0]; | ||
V[0][7] = tmp[1]; | ||
V[0][0] ^= RC00[r]; | ||
V[0][4] ^= RC04[r]; | ||
} | ||
for (var r = 0; r < 8; r++) { | ||
tmp = SUB_CRUMB(V[1][0], V[1][1], V[1][2], V[1][3]); | ||
V[1][0] = tmp[0]; | ||
V[1][1] = tmp[1]; | ||
V[1][2] = tmp[2]; | ||
V[1][3] = tmp[3]; | ||
tmp = SUB_CRUMB(V[1][5], V[1][6], V[1][7], V[1][4]); | ||
V[1][5] = tmp[0]; | ||
V[1][6] = tmp[1]; | ||
V[1][7] = tmp[2]; | ||
V[1][4] = tmp[3]; | ||
tmp = MIX_WORD(V[1][0], V[1][4]); | ||
V[1][0] = tmp[0]; | ||
V[1][4] = tmp[1]; | ||
tmp = MIX_WORD(V[1][1], V[1][5]); | ||
V[1][1] = tmp[0]; | ||
V[1][5] = tmp[1]; | ||
tmp = MIX_WORD(V[1][2], V[1][6]); | ||
V[1][2] = tmp[0]; | ||
V[1][6] = tmp[1]; | ||
tmp = MIX_WORD(V[1][3], V[1][7]); | ||
V[1][3] = tmp[0]; | ||
V[1][7] = tmp[1]; | ||
V[1][0] ^= RC10[r]; | ||
V[1][4] ^= RC14[r]; | ||
} | ||
for (var r = 0; r < 8; r++) { | ||
tmp = SUB_CRUMB(V[2][0], V[2][1], V[2][2], V[2][3]); | ||
V[2][0] = tmp[0]; | ||
V[2][1] = tmp[1]; | ||
V[2][2] = tmp[2]; | ||
V[2][3] = tmp[3]; | ||
tmp = SUB_CRUMB(V[2][5], V[2][6], V[2][7], V[2][4]); | ||
V[2][5] = tmp[0]; | ||
V[2][6] = tmp[1]; | ||
V[2][7] = tmp[2]; | ||
V[2][4] = tmp[3]; | ||
tmp = MIX_WORD(V[2][0], V[2][4]); | ||
V[2][0] = tmp[0]; | ||
V[2][4] = tmp[1]; | ||
tmp = MIX_WORD(V[2][1], V[2][5]); | ||
V[2][1] = tmp[0]; | ||
V[2][5] = tmp[1]; | ||
tmp = MIX_WORD(V[2][2], V[2][6]); | ||
V[2][2] = tmp[0]; | ||
V[2][6] = tmp[1]; | ||
tmp = MIX_WORD(V[2][3], V[2][7]); | ||
V[2][3] = tmp[0]; | ||
V[2][7] = tmp[1]; | ||
V[2][0] ^= RC20[r]; | ||
V[2][4] ^= RC24[r]; | ||
} | ||
for (var r = 0; r < 8; r++) { | ||
tmp = SUB_CRUMB(V[3][0], V[3][1], V[3][2], V[3][3]); | ||
V[3][0] = tmp[0]; | ||
V[3][1] = tmp[1]; | ||
V[3][2] = tmp[2]; | ||
V[3][3] = tmp[3]; | ||
tmp = SUB_CRUMB(V[3][5], V[3][6], V[3][7], V[3][4]); | ||
V[3][5] = tmp[0]; | ||
V[3][6] = tmp[1]; | ||
V[3][7] = tmp[2]; | ||
V[3][4] = tmp[3]; | ||
tmp = MIX_WORD(V[3][0], V[3][4]); | ||
V[3][0] = tmp[0]; | ||
V[3][4] = tmp[1]; | ||
tmp = MIX_WORD(V[3][1], V[3][5]); | ||
V[3][1] = tmp[0]; | ||
V[3][5] = tmp[1]; | ||
tmp = MIX_WORD(V[3][2], V[3][6]); | ||
V[3][2] = tmp[0]; | ||
V[3][6] = tmp[1]; | ||
tmp = MIX_WORD(V[3][3], V[3][7]); | ||
V[3][3] = tmp[0]; | ||
V[3][7] = tmp[1]; | ||
V[3][0] ^= RC30[r]; | ||
V[3][4] ^= RC34[r]; | ||
} | ||
for (var r = 0; r < 8; r++) { | ||
tmp = SUB_CRUMB(V[4][0], V[4][1], V[4][2], V[4][3]); | ||
V[4][0] = tmp[0]; | ||
V[4][1] = tmp[1]; | ||
V[4][2] = tmp[2]; | ||
V[4][3] = tmp[3]; | ||
tmp = SUB_CRUMB(V[4][5], V[4][6], V[4][7], V[4][4]); | ||
V[4][5] = tmp[0]; | ||
V[4][6] = tmp[1]; | ||
V[4][7] = tmp[2]; | ||
V[4][4] = tmp[3]; | ||
tmp = MIX_WORD(V[4][0], V[4][4]); | ||
V[4][0] = tmp[0]; | ||
V[4][4] = tmp[1]; | ||
tmp = MIX_WORD(V[4][1], V[4][5]); | ||
V[4][1] = tmp[0]; | ||
V[4][5] = tmp[1]; | ||
tmp = MIX_WORD(V[4][2], V[4][6]); | ||
V[4][2] = tmp[0]; | ||
V[4][6] = tmp[1]; | ||
tmp = MIX_WORD(V[4][3], V[4][7]); | ||
V[4][3] = tmp[0]; | ||
V[4][7] = tmp[1]; | ||
V[4][0] ^= RC40[r]; | ||
V[4][4] ^= RC44[r]; | ||
} | ||
}; | ||
var luffa5 = function(ctx, data) { | ||
var buf, ptr; | ||
//create a local copy of states | ||
var V = new Array(Luffa_VX); | ||
for (var i = 0; i < Luffa_VX; i++) { | ||
V[i] = new Array(Luffa_VY); | ||
} | ||
buf = ctx.buffer; | ||
ptr = ctx.ptr; | ||
var len = data.length; | ||
if (len < ctx.buffer.length - ptr) { | ||
op.bufferInsert(buf, ptr, data, data.length); | ||
ptr += data.length; | ||
ctx.ptr = ptr; | ||
return; | ||
} | ||
//perform a deep copy of current state | ||
for (var i = 0; i < Luffa_VX; i++) { | ||
for (var j = 0; j < Luffa_VY; j++) { | ||
V[i][j] = ctx.state[i][j]; | ||
var buf, ptr; | ||
//create a local copy of states | ||
var V = new Array(5); | ||
for (var i = 0; i < 5; i++) { | ||
V[i] = new Array(8); | ||
} | ||
} | ||
while (len > 0) { | ||
var clen = ctx.buffer.length - ptr; | ||
if (clen > len) clen = len; | ||
op.bufferInsert(buf, ptr, data, clen); | ||
ptr += clen; | ||
data = data.slice(clen); | ||
len -= clen; | ||
if (ptr === ctx.buffer.length) { | ||
var int32Buf = h.bytes2Int32Buffer(buf); | ||
MI5(int32Buf, V); | ||
P5(V); | ||
ptr = 0; | ||
buf = ctx.buffer; | ||
ptr = ctx.ptr; | ||
var len = data.length; | ||
if (len < ctx.buffer.length - ptr) { | ||
o.bufferInsert(buf, ptr, data, data.length); | ||
ptr += data.length; | ||
ctx.ptr = ptr; | ||
return; | ||
} | ||
} | ||
ctx.state = V; | ||
ctx.ptr = ptr; | ||
} | ||
//perform a deep copy of current state | ||
for (var i = 0; i < 5; i++) { | ||
for (var j = 0; j < 8; j++) { | ||
V[i][j] = ctx.state[i][j]; | ||
} | ||
} | ||
while (len > 0) { | ||
var clen = ctx.buffer.length - ptr; | ||
if (clen > len) clen = len; | ||
o.bufferInsert(buf, ptr, data, clen); | ||
ptr += clen; | ||
data = data.slice(clen); | ||
len -= clen; | ||
if (ptr === ctx.buffer.length) { | ||
var int32Buf = h.bytes2Int32Buffer(buf); | ||
MI5(int32Buf, V); | ||
P5(V); | ||
ptr = 0; | ||
} | ||
} | ||
ctx.state = V; | ||
ctx.ptr = ptr; | ||
}; | ||
var luffa5Close = function(ctx, ub, n) { | ||
var buf, out, ptr, z, i; | ||
var V = new Array(Luffa_VX); | ||
for (var i = 0; i < Luffa_VX; i++) { | ||
V[i] = new Array(Luffa_VY); | ||
} | ||
buf = ctx.buffer; | ||
ptr = ctx.ptr; | ||
z = 0x80 >> n; | ||
buf[ptr++] = ((ub & -z) | z) & 0xFF; | ||
op.bufferSet(buf, ptr, 0, ctx.buffer.length - ptr); | ||
for (var i = 0; i < Luffa_VX; i++) { | ||
for (var j = 0; j < Luffa_VY; j++) { | ||
V[i][j] = ctx.state[i][j]; | ||
var buf, out, ptr, z, i; | ||
var V = new Array(5); | ||
for (var i = 0; i < 5; i++) { | ||
V[i] = new Array(8); | ||
} | ||
} | ||
var out = new Array(16); | ||
for (i = 0; i < 3; i++) { | ||
var int32Buf = h.bytes2Int32Buffer(buf); | ||
MI5(int32Buf, V); | ||
P5(V); | ||
switch (i) { | ||
case 0: | ||
op.bufferSet(buf, 0, 0, ctx.buffer.length); | ||
break; | ||
case 1: | ||
out[0] = V[0][0] ^ V[1][0] ^ V[2][0] ^ V[3][0] ^ V[4][0]; | ||
out[1] = V[0][1] ^ V[1][1] ^ V[2][1] ^ V[3][1] ^ V[4][1]; | ||
out[2] = V[0][2] ^ V[1][2] ^ V[2][2] ^ V[3][2] ^ V[4][2]; | ||
out[3] = V[0][3] ^ V[1][3] ^ V[2][3] ^ V[3][3] ^ V[4][3]; | ||
out[4] = V[0][4] ^ V[1][4] ^ V[2][4] ^ V[3][4] ^ V[4][4]; | ||
out[5] = V[0][5] ^ V[1][5] ^ V[2][5] ^ V[3][5] ^ V[4][5]; | ||
out[6] = V[0][6] ^ V[1][6] ^ V[2][6] ^ V[3][6] ^ V[4][6]; | ||
out[7] = V[0][7] ^ V[1][7] ^ V[2][7] ^ V[3][7] ^ V[4][7]; | ||
break; | ||
case 2: | ||
out[8] = V[0][0] ^ V[1][0] ^ V[2][0] ^ V[3][0] ^ V[4][0]; | ||
out[9] = V[0][1] ^ V[1][1] ^ V[2][1] ^ V[3][1] ^ V[4][1]; | ||
out[10] = V[0][2] ^ V[1][2] ^ V[2][2] ^ V[3][2] ^ V[4][2]; | ||
out[11] = V[0][3] ^ V[1][3] ^ V[2][3] ^ V[3][3] ^ V[4][3]; | ||
out[12] = V[0][4] ^ V[1][4] ^ V[2][4] ^ V[3][4] ^ V[4][4]; | ||
out[13] = V[0][5] ^ V[1][5] ^ V[2][5] ^ V[3][5] ^ V[4][5]; | ||
out[14] = V[0][6] ^ V[1][6] ^ V[2][6] ^ V[3][6] ^ V[4][6]; | ||
out[15] = V[0][7] ^ V[1][7] ^ V[2][7] ^ V[3][7] ^ V[4][7]; | ||
break; | ||
buf = ctx.buffer; | ||
ptr = ctx.ptr; | ||
z = 0x80 >> n; | ||
buf[ptr++] = ((ub & -z) | z) & 0xFF; | ||
o.bufferSet(buf, ptr, 0, ctx.buffer.length - ptr); | ||
for (var i = 0; i < 5; i++) { | ||
for (var j = 0; j < 8; j++) { | ||
V[i][j] = ctx.state[i][j]; | ||
} | ||
} | ||
} | ||
return out; | ||
} | ||
var out = new Array(16); | ||
for (i = 0; i < 3; i++) { | ||
var int32Buf = h.bytes2Int32Buffer(buf); | ||
MI5(int32Buf, V); | ||
P5(V); | ||
switch (i) { | ||
case 0: | ||
o.bufferSet(buf, 0, 0, ctx.buffer.length); | ||
break; | ||
case 1: | ||
out[0] = V[0][0] ^ V[1][0] ^ V[2][0] ^ V[3][0] ^ V[4][0]; | ||
out[1] = V[0][1] ^ V[1][1] ^ V[2][1] ^ V[3][1] ^ V[4][1]; | ||
out[2] = V[0][2] ^ V[1][2] ^ V[2][2] ^ V[3][2] ^ V[4][2]; | ||
out[3] = V[0][3] ^ V[1][3] ^ V[2][3] ^ V[3][3] ^ V[4][3]; | ||
out[4] = V[0][4] ^ V[1][4] ^ V[2][4] ^ V[3][4] ^ V[4][4]; | ||
out[5] = V[0][5] ^ V[1][5] ^ V[2][5] ^ V[3][5] ^ V[4][5]; | ||
out[6] = V[0][6] ^ V[1][6] ^ V[2][6] ^ V[3][6] ^ V[4][6]; | ||
out[7] = V[0][7] ^ V[1][7] ^ V[2][7] ^ V[3][7] ^ V[4][7]; | ||
break; | ||
case 2: | ||
out[8] = V[0][0] ^ V[1][0] ^ V[2][0] ^ V[3][0] ^ V[4][0]; | ||
out[9] = V[0][1] ^ V[1][1] ^ V[2][1] ^ V[3][1] ^ V[4][1]; | ||
out[10] = V[0][2] ^ V[1][2] ^ V[2][2] ^ V[3][2] ^ V[4][2]; | ||
out[11] = V[0][3] ^ V[1][3] ^ V[2][3] ^ V[3][3] ^ V[4][3]; | ||
out[12] = V[0][4] ^ V[1][4] ^ V[2][4] ^ V[3][4] ^ V[4][4]; | ||
out[13] = V[0][5] ^ V[1][5] ^ V[2][5] ^ V[3][5] ^ V[4][5]; | ||
out[14] = V[0][6] ^ V[1][6] ^ V[2][6] ^ V[3][6] ^ V[4][6]; | ||
out[15] = V[0][7] ^ V[1][7] ^ V[2][7] ^ V[3][7] ^ V[4][7]; | ||
break; | ||
} | ||
} | ||
return out; | ||
}; | ||
module.exports = function(input, format, output) { | ||
var msg; | ||
if (format === 1) { | ||
msg = input; | ||
} | ||
else if (format === 2) { | ||
msg = h.int32Buffer2Bytes(input); | ||
} | ||
else { | ||
msg = h.string2bytes(input); | ||
} | ||
var ctx = {}; | ||
ctx.state = V_INIT; | ||
ctx.ptr = 0; | ||
ctx.buffer = new Array(Luffa_BlockSize); | ||
luffa5(ctx, msg); | ||
var r = luffa5Close(ctx, 0, 0); | ||
var out; | ||
if (output === 2) { | ||
out = r; | ||
} | ||
else if (output === 1) { | ||
out = h.int32Buffer2Bytes(r) | ||
} | ||
else { | ||
out = h.int32ArrayToHexString(r) | ||
} | ||
return out; | ||
} | ||
var msg; | ||
if (format === 1) { | ||
msg = input; | ||
} | ||
else if (format === 2) { | ||
msg = h.int32Buffer2Bytes(input); | ||
} | ||
else { | ||
msg = h.string2bytes(input); | ||
} | ||
var ctx = {}; | ||
ctx.state = V_INIT; | ||
ctx.ptr = 0; | ||
ctx.buffer = new Array(32); | ||
luffa5(ctx, msg); | ||
var r = luffa5Close(ctx, 0, 0); | ||
var out; | ||
if (output === 2) { | ||
out = r; | ||
} | ||
else if (output === 1) { | ||
out = h.int32Buffer2Bytes(r); | ||
} | ||
else { | ||
out = h.int32ArrayToHexString(r); | ||
} | ||
return out; | ||
}; |
639
lib/op.js
'use strict'; | ||
//the right shift is important, it has to do with 32 bit operations in javascript, it will make things faster | ||
function u64(h, l) { | ||
this.hi = h >>> 0; | ||
this.lo = l >>> 0; | ||
this.hi = h >>> 0; | ||
this.lo = l >>> 0; | ||
} | ||
u64.prototype.set = function(oWord) { | ||
this.lo = oWord.lo; | ||
this.hi = oWord.hi; | ||
} | ||
this.lo = oWord.lo; | ||
this.hi = oWord.hi; | ||
}; | ||
u64.prototype.add = function(oWord) { | ||
var lowest, lowMid, highMid, highest; //four parts of the whole 64 bit number.. | ||
var lowest, lowMid, highMid, highest; //four parts of the whole 64 bit number.. | ||
//need to add the respective parts from each number and the carry if on is present.. | ||
lowest = (this.lo & 0XFFFF) + (oWord.lo & 0XFFFF); | ||
lowMid = (this.lo >>> 16) + (oWord.lo >>> 16) + (lowest >>> 16); | ||
highMid = (this.hi & 0XFFFF) + (oWord.hi & 0XFFFF) + (lowMid >>> 16); | ||
highest = (this.hi >>> 16) + (oWord.hi >>> 16) + (highMid >>> 16); | ||
//need to add the respective parts from each number and the carry if on is present.. | ||
lowest = (this.lo & 0XFFFF) + (oWord.lo & 0XFFFF); | ||
lowMid = (this.lo >>> 16) + (oWord.lo >>> 16) + (lowest >>> 16); | ||
highMid = (this.hi & 0XFFFF) + (oWord.hi & 0XFFFF) + (lowMid >>> 16); | ||
highest = (this.hi >>> 16) + (oWord.hi >>> 16) + (highMid >>> 16); | ||
//now set the hgih and the low accordingly.. | ||
this.lo = (lowMid << 16) | (lowest & 0XFFFF); | ||
this.hi = (highest << 16) | (highMid & 0XFFFF); | ||
//now set the hgih and the low accordingly.. | ||
this.lo = (lowMid << 16) | (lowest & 0XFFFF); | ||
this.hi = (highest << 16) | (highMid & 0XFFFF); | ||
return this; //for chaining.. | ||
return this; //for chaining.. | ||
}; | ||
u64.prototype.addOne = function() { | ||
if (this.lo === -1 || this.lo === 0xFFFFFFFF) { | ||
this.lo = 0; | ||
this.hi++; | ||
} else { | ||
this.lo++; | ||
} | ||
} | ||
if (this.lo === -1 || this.lo === 0xFFFFFFFF) { | ||
this.lo = 0; | ||
this.hi++; | ||
} | ||
else { | ||
this.lo++; | ||
} | ||
}; | ||
u64.prototype.plus = function(oWord) { | ||
var c = new u64(0, 0); | ||
var lowest, lowMid, highMid, highest; //four parts of the whole 64 bit number.. | ||
var c = new u64(0, 0); | ||
var lowest, lowMid, highMid, highest; //four parts of the whole 64 bit number.. | ||
//need to add the respective parts from each number and the carry if on is present.. | ||
lowest = (this.lo & 0XFFFF) + (oWord.lo & 0XFFFF); | ||
lowMid = (this.lo >>> 16) + (oWord.lo >>> 16) + (lowest >>> 16); | ||
highMid = (this.hi & 0XFFFF) + (oWord.hi & 0XFFFF) + (lowMid >>> 16); | ||
highest = (this.hi >>> 16) + (oWord.hi >>> 16) + (highMid >>> 16); | ||
//need to add the respective parts from each number and the carry if on is present.. | ||
lowest = (this.lo & 0XFFFF) + (oWord.lo & 0XFFFF); | ||
lowMid = (this.lo >>> 16) + (oWord.lo >>> 16) + (lowest >>> 16); | ||
highMid = (this.hi & 0XFFFF) + (oWord.hi & 0XFFFF) + (lowMid >>> 16); | ||
highest = (this.hi >>> 16) + (oWord.hi >>> 16) + (highMid >>> 16); | ||
//now set the hgih and the low accordingly.. | ||
c.lo = (lowMid << 16) | (lowest & 0XFFFF); | ||
c.hi = (highest << 16) | (highMid & 0XFFFF); | ||
//now set the hgih and the low accordingly.. | ||
c.lo = (lowMid << 16) | (lowest & 0XFFFF); | ||
c.hi = (highest << 16) | (highMid & 0XFFFF); | ||
return c; //for chaining.. | ||
return c; //for chaining.. | ||
}; | ||
u64.prototype.not = function() { | ||
return new u64(~this.hi, ~this.lo); | ||
} | ||
return new u64(~this.hi, ~this.lo); | ||
}; | ||
u64.prototype.one = function() { | ||
return new u64(0x0, 0x1); | ||
} | ||
return new u64(0x0, 0x1); | ||
}; | ||
u64.prototype.zero = function() { | ||
return new u64(0x0, 0x0); | ||
} | ||
return new u64(0x0, 0x0); | ||
}; | ||
u64.prototype.neg = function() { | ||
return this.not().plus(this.one()); | ||
} | ||
return this.not().plus(this.one()); | ||
}; | ||
u64.prototype.minus = function(oWord) { | ||
return this.plus(oWord.neg()); | ||
return this.plus(oWord.neg()); | ||
}; | ||
u64.prototype.isZero = function() { | ||
return (this.lo === 0) && (this.hi === 0); | ||
} | ||
return (this.lo === 0) && (this.hi === 0); | ||
}; | ||
function isLong(obj) { | ||
return (obj && obj["__isLong__"]) === true; | ||
return (obj && obj.__isLong__) === true; | ||
} | ||
function fromNumber(value) { | ||
if (isNaN(value) || !isFinite(value)) | ||
return this.zero(); | ||
var pow32 = (1 << 32); | ||
return new u64((value % pow32) | 0, (value / pow32) | 0); | ||
if (isNaN(value) || !isFinite(value)) return this.zero(); | ||
var pow32 = (1 << 32); | ||
return new u64((value % pow32) | 0, (value / pow32) | 0); | ||
} | ||
u64.prototype.multiply = function(multiplier) { | ||
if (this.isZero()) | ||
return this.zero(); | ||
if (!isLong(multiplier)) | ||
multiplier = fromNumber(multiplier); | ||
if (multiplier.isZero()) | ||
return this.zero(); | ||
if (this.isZero()) return this.zero(); | ||
if (!isLong(multiplier)) multiplier = fromNumber(multiplier); | ||
if (multiplier.isZero()) return this.zero(); | ||
// Divide each long into 4 chunks of 16 bits, and then add up 4x4 products. | ||
// We can skip products that would overflow. | ||
// Divide each long into 4 chunks of 16 bits, and then add up 4x4 products. | ||
// We can skip products that would overflow. | ||
var a48 = this.hi >>> 16; | ||
var a32 = this.hi & 0xFFFF; | ||
var a16 = this.lo >>> 16; | ||
var a00 = this.lo & 0xFFFF; | ||
var a48 = this.hi >>> 16; | ||
var a32 = this.hi & 0xFFFF; | ||
var a16 = this.lo >>> 16; | ||
var a00 = this.lo & 0xFFFF; | ||
var b48 = multiplier.hi >>> 16; | ||
var b32 = multiplier.hi & 0xFFFF; | ||
var b16 = multiplier.lo >>> 16; | ||
var b00 = multiplier.lo & 0xFFFF; | ||
var b48 = multiplier.hi >>> 16; | ||
var b32 = multiplier.hi & 0xFFFF; | ||
var b16 = multiplier.lo >>> 16; | ||
var b00 = multiplier.lo & 0xFFFF; | ||
var c48 = 0, | ||
c32 = 0, | ||
c16 = 0, | ||
c00 = 0; | ||
c00 += a00 * b00; | ||
c16 += c00 >>> 16; | ||
c00 &= 0xFFFF; | ||
c16 += a16 * b00; | ||
c32 += c16 >>> 16; | ||
c16 &= 0xFFFF; | ||
c16 += a00 * b16; | ||
c32 += c16 >>> 16; | ||
c16 &= 0xFFFF; | ||
c32 += a32 * b00; | ||
c48 += c32 >>> 16; | ||
c32 &= 0xFFFF; | ||
c32 += a16 * b16; | ||
c48 += c32 >>> 16; | ||
c32 &= 0xFFFF; | ||
c32 += a00 * b32; | ||
c48 += c32 >>> 16; | ||
c32 &= 0xFFFF; | ||
c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48; | ||
c48 &= 0xFFFF; | ||
return new u64((c48 << 16) | c32, (c16 << 16) | c00); | ||
var c48 = 0, | ||
c32 = 0, | ||
c16 = 0, | ||
c00 = 0; | ||
c00 += a00 * b00; | ||
c16 += c00 >>> 16; | ||
c00 &= 0xFFFF; | ||
c16 += a16 * b00; | ||
c32 += c16 >>> 16; | ||
c16 &= 0xFFFF; | ||
c16 += a00 * b16; | ||
c32 += c16 >>> 16; | ||
c16 &= 0xFFFF; | ||
c32 += a32 * b00; | ||
c48 += c32 >>> 16; | ||
c32 &= 0xFFFF; | ||
c32 += a16 * b16; | ||
c48 += c32 >>> 16; | ||
c32 &= 0xFFFF; | ||
c32 += a00 * b32; | ||
c48 += c32 >>> 16; | ||
c32 &= 0xFFFF; | ||
c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48; | ||
c48 &= 0xFFFF; | ||
return new u64((c48 << 16) | c32, (c16 << 16) | c00); | ||
}; | ||
u64.prototype.shiftLeft = function(bits) { | ||
bits = bits % 64; | ||
var c = new u64(0, 0); | ||
if (bits === 0) { | ||
return this.clone(); | ||
} else if (bits >= 32) { | ||
c.lo = 0; | ||
c.hi = this.lo << (bits - 32); | ||
} | ||
else { | ||
var toMoveUp = this.lo >>> 32 - bits; | ||
c.lo = this.lo << bits; | ||
c.hi = (this.hi << bits) | toMoveUp; | ||
} | ||
return c; //for chaining.. | ||
bits = bits % 64; | ||
var c = new u64(0, 0); | ||
if (bits === 0) { | ||
return this.clone(); | ||
} | ||
else if (bits > 31) { | ||
c.lo = 0; | ||
c.hi = this.lo << (bits - 32); | ||
} | ||
else { | ||
var toMoveUp = this.lo >>> 32 - bits; | ||
c.lo = this.lo << bits; | ||
c.hi = (this.hi << bits) | toMoveUp; | ||
} | ||
return c; //for chaining.. | ||
}; | ||
u64.prototype.setShiftLeft = function(bits) { | ||
if (bits === 0) { | ||
return this; | ||
} | ||
if (bits > 63) { | ||
bits = bits % 64; | ||
} | ||
if (bits > 31) { | ||
this.hi = this.lo << (bits - 32); | ||
this.lo = 0; | ||
} | ||
else { | ||
var toMoveUp = this.lo >>> 32 - bits; | ||
this.lo <<= bits; | ||
this.hi = (this.hi << bits) | toMoveUp; | ||
} | ||
return this; //for chaining.. | ||
}; | ||
//Shifts this word by the given number of bits to the right (max 32).. | ||
u64.prototype.shiftRight = function(bits) { | ||
bits = bits % 64; | ||
var c = new u64(0, 0); | ||
if (bits === 0) { | ||
return this.clone(); | ||
} else if (bits >= 32) { | ||
c.hi = 0; | ||
c.lo = this.hi >>> (bits - 32); | ||
} | ||
else { | ||
var bitsOff32 = 32 - bits, | ||
toMoveDown = this.hi << bitsOff32 >>> bitsOff32; | ||
c.hi = this.hi >>> bits; | ||
c.lo = this.lo >>> bits | (toMoveDown << bitsOff32); | ||
} | ||
return c; //for chaining.. | ||
bits = bits % 64; | ||
var c = new u64(0, 0); | ||
if (bits === 0) { | ||
return this.clone(); | ||
} | ||
else if (bits >= 32) { | ||
c.hi = 0; | ||
c.lo = this.hi >>> (bits - 32); | ||
} | ||
else { | ||
var bitsOff32 = 32 - bits, | ||
toMoveDown = this.hi << bitsOff32 >>> bitsOff32; | ||
c.hi = this.hi >>> bits; | ||
c.lo = this.lo >>> bits | (toMoveDown << bitsOff32); | ||
} | ||
return c; //for chaining.. | ||
}; | ||
//Rotates the bits of this word round to the left (max 32).. | ||
u64.prototype.rotateLeft = function(bits) { | ||
if (bits > 32) { | ||
return this.rotateRight(64 - bits); | ||
} | ||
var c = new u64(0, 0); | ||
var newHigh; | ||
if (bits === 0) { | ||
c.lo = this.lo >>> 0; | ||
c.hi = this.hi >>> 0; | ||
} else if (bits === 32) { //just switch high and low over in this case.. | ||
newHigh = this.lo; | ||
c.lo = this.hi; | ||
c.hi = newHigh; | ||
} | ||
else { | ||
newHigh = (this.hi << bits) | (this.lo >>> (32 - bits)); | ||
c.lo = (this.lo << bits) | (this.hi >>> (32 - bits)); | ||
c.hi = newHigh; | ||
} | ||
return c; //for chaining.. | ||
if (bits > 32) { | ||
return this.rotateRight(64 - bits); | ||
} | ||
var c = new u64(0, 0); | ||
if (bits === 0) { | ||
c.lo = this.lo >>> 0; | ||
c.hi = this.hi >>> 0; | ||
} | ||
else if (bits === 32) { //just switch high and low over in this case.. | ||
c.lo = this.hi; | ||
c.hi = this.lo; | ||
} | ||
else { | ||
c.lo = (this.lo << bits) | (this.hi >>> (32 - bits)); | ||
c.hi = (this.hi << bits) | (this.lo >>> (32 - bits)); | ||
} | ||
return c; //for chaining.. | ||
}; | ||
u64.prototype.setRotateLeft = function(bits) { | ||
if (bits > 32) { | ||
return this.setRotateRight(64 - bits); | ||
} | ||
var newHigh; | ||
if (bits === 0) { | ||
return this; | ||
} | ||
else if (bits === 32) { //just switch high and low over in this case.. | ||
newHigh = this.lo; | ||
this.lo = this.hi; | ||
this.hi = newHigh; | ||
} | ||
else { | ||
newHigh = (this.hi << bits) | (this.lo >>> (32 - bits)); | ||
this.lo = (this.lo << bits) | (this.hi >>> (32 - bits)); | ||
this.hi = newHigh; | ||
} | ||
return this; //for chaining.. | ||
}; | ||
//Rotates the bits of this word round to the right (max 32).. | ||
u64.prototype.rotateRight = function(bits) { | ||
if (bits > 32) { | ||
return this.rotateLeft(64 - bits); | ||
} | ||
var c = new u64(0, 0); | ||
var newHigh; | ||
if (bits === 0) { | ||
c.lo = this.lo >>> 0; | ||
c.hi = this.hi >>> 0; | ||
} else if (bits === 32) { //just switch high and low over in this case.. | ||
if (bits > 32) { | ||
return this.rotateLeft(64 - bits); | ||
} | ||
var c = new u64(0, 0); | ||
if (bits === 0) { | ||
c.lo = this.lo >>> 0; | ||
c.hi = this.hi >>> 0; | ||
} | ||
else if (bits === 32) { //just switch high and low over in this case.. | ||
c.lo = this.hi; | ||
c.hi = this.lo; | ||
} | ||
else { | ||
c.lo = (this.hi << (32 - bits)) | (this.lo >>> bits); | ||
c.hi = (this.lo << (32 - bits)) | (this.hi >>> bits); | ||
} | ||
return c; //for chaining.. | ||
}; | ||
u64.prototype.setFlip = function() { | ||
var newHigh; | ||
newHigh = this.lo; | ||
c.lo = this.hi; | ||
c.hi = newHigh; | ||
} | ||
else { | ||
newHigh = (this.lo << (32 - bits)) | (this.hi >>> bits); | ||
c.lo = (this.hi << (32 - bits)) | (this.lo >>> bits); | ||
c.hi = newHigh; | ||
} | ||
return c; //for chaining.. | ||
this.lo = this.hi; | ||
this.hi = newHigh; | ||
return this; | ||
}; | ||
//Rotates the bits of this word round to the right (max 32).. | ||
u64.prototype.setRotateRight = function(bits) { | ||
if (bits > 32) { | ||
return this.setRotateLeft(64 - bits); | ||
} | ||
if (bits === 0) { | ||
return this; | ||
} | ||
else if (bits === 32) { //just switch high and low over in this case.. | ||
var newHigh; | ||
newHigh = this.lo; | ||
this.lo = this.hi; | ||
this.hi = newHigh; | ||
} | ||
else { | ||
newHigh = (this.lo << (32 - bits)) | (this.hi >>> bits); | ||
this.lo = (this.hi << (32 - bits)) | (this.lo >>> bits); | ||
this.hi = newHigh; | ||
} | ||
return this; //for chaining.. | ||
}; | ||
//Xors this word with the given other.. | ||
u64.prototype.xor = function(oWord) { | ||
var c = new u64(0, 0); | ||
c.hi = this.hi ^ oWord.hi; | ||
c.lo = this.lo ^ oWord.lo; | ||
return c; //for chaining.. | ||
var c = new u64(0, 0); | ||
c.hi = this.hi ^ oWord.hi; | ||
c.lo = this.lo ^ oWord.lo; | ||
return c; //for chaining.. | ||
}; | ||
//Xors this word with the given other.. | ||
u64.prototype.setxorOne = function(oWord) { | ||
this.hi ^= oWord.hi; | ||
this.lo ^= oWord.lo; | ||
return this; //for chaining.. | ||
}; | ||
//Ands this word with the given other.. | ||
u64.prototype.and = function(oWord) { | ||
var c = new u64(0, 0); | ||
c.hi = this.hi & oWord.hi; | ||
c.lo = this.lo & oWord.lo; | ||
return c; //for chaining.. | ||
var c = new u64(0, 0); | ||
c.hi = this.hi & oWord.hi; | ||
c.lo = this.lo & oWord.lo; | ||
return c; //for chaining.. | ||
}; | ||
//Converts this word to a string representing it's encoding as 4 UTF2 16 bit | ||
//characters.. | ||
u64.prototype.toString = function() { | ||
var str = "", | ||
high = this.hi, | ||
low = this.lo; | ||
str += String.fromCharCode(high >>> 16); | ||
str += String.fromCharCode(high << 16 >>> 16); | ||
str += String.fromCharCode(low >>> 16); | ||
str += String.fromCharCode(low << 16 >>> 16); | ||
return str; | ||
}; | ||
u64.prototype.toBinaryString = function(sep) { | ||
var str = "", | ||
high = this.hi, | ||
low = this.lo; | ||
var a = new Array(4); | ||
a[0] = (high >>> 16).toString(2); | ||
a[1] = (high << 16 >>> 16).toString(2); | ||
a[2] = (low >>> 16).toString(2); | ||
a[3] = (low << 16 >>> 16).toString(2); | ||
for (var i = 0; i < 4; i++) { | ||
while (a[i].length < 16) { | ||
a[i] = '0' + a[i]; | ||
} | ||
} | ||
if (!sep) sep = ''; | ||
return a.join(sep); | ||
}; | ||
//Creates a deep copy of this Word.. | ||
u64.prototype.clone = function() { | ||
return new u64(this.hi, this.lo); | ||
return new u64(this.hi, this.lo); | ||
}; | ||
//Given a string a a starting index, returns a new Word which encodes the | ||
//four characters starting from index up to index + 3. | ||
u64.fromChars = function(str, index) { | ||
var low, high; | ||
//pairs of UTF2 chars need to be stored as one 32 bit int.. | ||
high = (str.charCodeAt(index) << 16) + str.charCodeAt(index + 1); | ||
low = (str.charCodeAt(index + 2) << 16) + str.charCodeAt(index + 3); | ||
return new u64(high, low); | ||
}; | ||
u64.prototype.setxor64 = function() { | ||
var a = arguments; | ||
for (var i = 0, len = a.length; i < len; i++) { | ||
this.hi ^= a[i].hi; | ||
this.lo ^= a[i].lo; | ||
} | ||
return this; | ||
} | ||
var a = arguments; | ||
var i = a.length; | ||
while (i--) { | ||
this.hi ^= a[i].hi; | ||
this.lo ^= a[i].lo; | ||
} | ||
return this; | ||
}; | ||
module.exports.u64 = u64; | ||
module.exports.u = function(h, l) { | ||
return new u64(h, l); | ||
}; | ||
/* | ||
module.exports.add64 = function(a, b) { | ||
@@ -298,84 +336,62 @@ var lowest, lowMid, highMid, highest; //four parts of the whole 64 bit number.. | ||
}; | ||
*/ | ||
module.exports.xor64 = function() { | ||
var a = arguments, | ||
h = a[0].hi, | ||
l = a[0].lo; | ||
for (var i = 1, len = a.length; i < len; i++) { | ||
h ^= a[i].hi; | ||
l ^= a[i].lo; | ||
} | ||
return new this.u64(h, l); | ||
} | ||
var a = arguments, | ||
h = a[0].hi, | ||
l = a[0].lo; | ||
var i = a.length-1; | ||
do { | ||
h ^= a[i].hi; | ||
l ^= a[i].lo; | ||
i--; | ||
} while (i>0); | ||
return new this.u64(h, l); | ||
}; | ||
module.exports.clone64Array = function(array) { | ||
var a = []; | ||
for (var i in array) { | ||
a.push(array[i].clone()); | ||
} | ||
return a; | ||
} | ||
var i = 0; | ||
var len = array.length; | ||
var a = new Array(len); | ||
while (i<len) { | ||
a[i] = array[i]; | ||
i++; | ||
} | ||
return a; | ||
}; | ||
//this shouldn't be a problem, but who knows in the future javascript might support 64bits | ||
module.exports.t32 = function(x) { | ||
return (x & 0xFFFFFFFF) | ||
} | ||
return (x & 0xFFFFFFFF); | ||
}; | ||
module.exports.rotl32 = function(x, c) { | ||
return (((x) << (c)) | ((x) >>> (32 - (c)))) & (0xFFFFFFFF); | ||
} | ||
return (((x) << (c)) | ((x) >>> (32 - (c)))) & (0xFFFFFFFF); | ||
}; | ||
module.exports.rotr32 = function(x, c) { | ||
return this.rotl32(x, (32 - (c))); | ||
} | ||
return this.rotl32(x, (32 - (c))); | ||
}; | ||
module.exports.swap32 = function(val) { | ||
return ((val & 0xFF) << 24) | | ||
return ((val & 0xFF) << 24) | | ||
((val & 0xFF00) << 8) | | ||
((val >>> 8) & 0xFF00) | | ||
((val >>> 24) & 0xFF); | ||
} | ||
}; | ||
module.exports.swap32Array = function(a) { | ||
//can't do this with map because of support for IE8 (Don't hate me plz). | ||
var r = Array(a.length); | ||
for (var i in a) { | ||
r[i] = (this.swap32(a[i])); | ||
} | ||
return r; | ||
} | ||
//for skein | ||
//can't do this with map because of support for IE8 (Don't hate me plz). | ||
var i = 0, len = a.length; | ||
var r = new Array(i); | ||
while (i<len) { | ||
r[i] = (this.swap32(a[i])); | ||
i++; | ||
} | ||
return r; | ||
}; | ||
module.exports.rotl64 = function(x, c) { | ||
var h0 = 0, | ||
l0 = 0, | ||
h1 = 0, | ||
l1 = 0, | ||
c1 = 64 - c; | ||
// shift left | ||
if (c < 32) { | ||
h0 = (x.hi << c) | ((x.lo & (((1 << c) - 1) | 0) << (32 - c)) >>> (32 - c)); | ||
l0 = x.lo << c; | ||
} | ||
else { | ||
h0 = x.lo << (c - 32); | ||
} | ||
// shift right | ||
if (c1 < 32) { | ||
h1 = x.hi >>> c1; | ||
l1 = (x.lo >>> c1) | (x.hi & (((1 << c1) - 1) | 0)) << (32 - c1); | ||
} | ||
else { | ||
l1 = x.hi >>> (c1 - 32); | ||
} | ||
return new this.u64(h0 | h1, l0 | l1); | ||
} | ||
module.exports.xnd64 = function(x, y, z) { | ||
return new this.u64(x.hi ^ ((~y.hi) & z.hi), x.lo ^ ((~y.lo) & z.lo)); | ||
} | ||
return new this.u64(x.hi ^ ((~y.hi) & z.hi), x.lo ^ ((~y.lo) & z.lo)); | ||
}; | ||
/* | ||
module.exports.load64 = function(x, i) { | ||
@@ -386,46 +402,59 @@ var l = x[i] | (x[i + 1] << 8) | (x[i + 2] << 16) | (x[i + 3] << 24); | ||
} | ||
*/ | ||
module.exports.bufferInsert = function(buffer, bufferOffset, data, len, dataOffset) { | ||
dataOffset = dataOffset | 0; | ||
var i = 0; | ||
while (i < len) { | ||
buffer[i + bufferOffset] = data[i + dataOffset]; | ||
i++; | ||
} | ||
}; | ||
module.exports.bufferInsert = function(buffer, bufferOffset, data, len) { | ||
for (var i = 0; i < len; i++) { | ||
buffer[i + bufferOffset] = data[i]; | ||
} | ||
} | ||
module.exports.bufferInsert64 = function(buffer, bufferOffset, data, len) { | ||
for (var i = len - 1; i >= 0; i--) { | ||
buffer[i + bufferOffset] = data[i].clone(); | ||
} | ||
} | ||
var i = 0; | ||
while (i < len) { | ||
buffer[i + bufferOffset] = data[i].clone(); | ||
i++; | ||
} | ||
}; | ||
module.exports.buffer2Insert = function(buffer, bufferOffset, bufferOffset2, data, len, len2) { | ||
for (var i = len - 1; i >= 0; i--) { | ||
for (var j = len2 - 1; j >= 0; j--) { | ||
buffer[i + bufferOffset][j + bufferOffset2] = data[i][j]; | ||
while (len--) { | ||
var j = len2; | ||
while (j--) { | ||
buffer[len + bufferOffset][j + bufferOffset2] = data[len][j]; | ||
} | ||
} | ||
} | ||
} | ||
}; | ||
module.exports.bufferInsertBackwards = function(buffer, bufferOffset, data, len) { | ||
for (var i = len - 1; i >= 0; i--) { | ||
buffer[i + bufferOffset] = data[len - 1 - i]; | ||
} | ||
} | ||
var i = 0; | ||
while (i < len) { | ||
buffer[i + bufferOffset] = data[len - 1 - i]; | ||
i++; | ||
} | ||
}; | ||
module.exports.bufferSet = function(buffer, bufferOffset, value, len) { | ||
for (var i = len - 1; i >= 0; i--) { | ||
buffer[i + bufferOffset] = value; | ||
} | ||
} | ||
var i = 0; | ||
while (i < len) { | ||
buffer[i + bufferOffset] = value; | ||
i++; | ||
} | ||
}; | ||
module.exports.bufferXORInsert = function(buffer, bufferOffset, data, dataOffset, len) { | ||
for (var i = 0; i < len; i++) { | ||
buffer[i + bufferOffset] ^= data[i + dataOffset]; | ||
} | ||
} | ||
var i = 0; | ||
while (i < len) { | ||
buffer[i + bufferOffset] ^= data[i + dataOffset]; | ||
i++; | ||
} | ||
}; | ||
module.exports.xORTable = function(d, s1, s2, len) { | ||
for (var i = 0; i < len; i++) { | ||
d[i] = s1[i] ^ s2[i]; | ||
} | ||
} | ||
var i = 0; | ||
while (i < len) { | ||
d[i] = s1[i] ^ s2[i]; | ||
i++; | ||
} | ||
}; |
1115
lib/shavite.js
@@ -0,1 +1,2 @@ | ||
'use strict'; | ||
///////////////////////////////////// | ||
@@ -13,260 +14,107 @@ //////////// Shavite /////////////// | ||
var Shavite_BlockSize = 128; | ||
var Simd_HSize = 4; | ||
var IV512 = [ | ||
0x72FCCDD8, 0x79CA4727, 0x128A077B, 0x40D55AEC, | ||
0xD1901A06, 0x430AE307, 0xB29F5CD1, 0xDF07FBFC, | ||
0x8E45D73D, 0x681AB538, 0xBDE86578, 0xDD577E47, | ||
0xE275EADE, 0x502D9FCD, 0xB9357178, 0x022A4B9A, | ||
0x72FCCDD8, 0x79CA4727, 0x128A077B, 0x40D55AEC, | ||
0xD1901A06, 0x430AE307, 0xB29F5CD1, 0xDF07FBFC, | ||
0x8E45D73D, 0x681AB538, 0xBDE86578, 0xDD577E47, | ||
0xE275EADE, 0x502D9FCD, 0xB9357178, 0x022A4B9A, | ||
]; | ||
var AES_ROUND_NOKEY = function(x) { | ||
var t = new Array(4); | ||
op.bufferInsert(t, 0, x, 4); | ||
aes.AES_ROUND_NOKEY_LE(t, x); | ||
return x; | ||
} | ||
var t = new Array(4); | ||
op.bufferInsert(t, 0, x, 4); | ||
aes.AES_ROUND_NOKEY_LE(t, x); | ||
return x; | ||
}; | ||
var KEY_EXPAND_ELT = function(k, start, end) { | ||
var kt = k.slice(start, end); | ||
var l = AES_ROUND_NOKEY([kt[1], kt[2], kt[3], kt[0]]); | ||
op.bufferInsert(k, start, l, end - start); | ||
} | ||
var kt = k.slice(start, end); | ||
var l = AES_ROUND_NOKEY([kt[1], kt[2], kt[3], kt[0]]); | ||
op.bufferInsert(k, start, l, end - start); | ||
}; | ||
var c512 = function(ctx, msg) { | ||
var m = h.bytes2Int32Buffer(msg); | ||
var p = Array(16); | ||
var x = Array(4); | ||
var rk = Array(32); | ||
var r; | ||
var m = h.bytes2Int32Buffer(msg); | ||
var p = Array(16); | ||
var x = Array(4); | ||
var rk = Array(32); | ||
var r; | ||
op.bufferInsert(p, 0, ctx.h, 16); | ||
/* round 0 */ | ||
rk[0] = op.swap32(m[0]); | ||
x[0] = p[4] ^ rk[0]; | ||
rk[1] = op.swap32(m[1]); | ||
x[1] = p[5] ^ rk[1]; | ||
rk[2] = op.swap32(m[2]); | ||
x[2] = p[6] ^ rk[2]; | ||
rk[3] = op.swap32(m[3]); | ||
x[3] = p[7] ^ rk[3]; | ||
AES_ROUND_NOKEY(x); | ||
rk[4] = op.swap32(m[4]); | ||
x[0] ^= rk[4]; | ||
rk[5] = op.swap32(m[5]); | ||
x[1] ^= rk[5]; | ||
rk[6] = op.swap32(m[6]); | ||
x[2] ^= rk[6]; | ||
rk[7] = op.swap32(m[7]); | ||
x[3] ^= rk[7]; | ||
AES_ROUND_NOKEY(x); | ||
rk[8] = op.swap32(m[8]); | ||
x[0] ^= rk[8]; | ||
rk[9] = op.swap32(m[9]); | ||
x[1] ^= rk[9]; | ||
rk[10] = op.swap32(m[10]); | ||
x[2] ^= rk[10]; | ||
rk[11] = op.swap32(m[11]); | ||
x[3] ^= rk[11]; | ||
AES_ROUND_NOKEY(x); | ||
rk[12] = op.swap32(m[12]); | ||
x[0] ^= rk[12]; | ||
rk[13] = op.swap32(m[13]); | ||
x[1] ^= rk[13]; | ||
rk[14] = op.swap32(m[14]); | ||
x[2] ^= rk[14]; | ||
rk[15] = op.swap32(m[15]); | ||
x[3] ^= rk[15]; | ||
AES_ROUND_NOKEY(x); | ||
p[0] ^= x[0]; | ||
p[1] ^= x[1]; | ||
p[2] ^= x[2]; | ||
p[3] ^= x[3]; | ||
rk[16] = op.swap32(m[16]); | ||
x[0] = p[12] ^ rk[16]; | ||
rk[17] = op.swap32(m[17]); | ||
x[1] = p[13] ^ rk[17]; | ||
rk[18] = op.swap32(m[18]); | ||
x[2] = p[14] ^ rk[18]; | ||
rk[19] = op.swap32(m[19]); | ||
x[3] = p[15] ^ rk[19]; | ||
AES_ROUND_NOKEY(x); | ||
rk[20] = op.swap32(m[20]); | ||
x[0] ^= rk[20]; | ||
rk[21] = op.swap32(m[21]); | ||
x[1] ^= rk[21]; | ||
rk[22] = op.swap32(m[22]); | ||
x[2] ^= rk[22]; | ||
rk[23] = op.swap32(m[23]); | ||
x[3] ^= rk[23]; | ||
AES_ROUND_NOKEY(x); | ||
rk[24] = op.swap32(m[24]); | ||
x[0] ^= rk[24]; | ||
rk[25] = op.swap32(m[25]); | ||
x[1] ^= rk[25]; | ||
rk[26] = op.swap32(m[26]); | ||
x[2] ^= rk[26]; | ||
rk[27] = op.swap32(m[27]); | ||
x[3] ^= rk[27]; | ||
AES_ROUND_NOKEY(x); | ||
rk[28] = op.swap32(m[28]); | ||
x[0] ^= rk[28]; | ||
rk[29] = op.swap32(m[29]); | ||
x[1] ^= rk[29]; | ||
rk[30] = op.swap32(m[30]); | ||
x[2] ^= rk[30]; | ||
rk[31] = op.swap32(m[31]); | ||
x[3] ^= rk[31]; | ||
AES_ROUND_NOKEY(x); | ||
p[8] ^= x[0]; | ||
p[9] ^= x[1]; | ||
p[10] ^= x[2]; | ||
p[11] ^= x[3]; | ||
for (r = 0; r < 3; r++) { | ||
/* round 1, 5, 9 */ | ||
KEY_EXPAND_ELT(rk, 0, 4); | ||
rk[0] ^= rk[28]; | ||
rk[1] ^= rk[29]; | ||
rk[2] ^= rk[30]; | ||
rk[3] ^= rk[31]; | ||
if (r == 0) { | ||
rk[0] ^= ctx.count[0]; | ||
rk[1] ^= ctx.count[1]; | ||
rk[2] ^= ctx.count[2]; | ||
rk[3] ^= op.t32(~ctx.count[3]); | ||
} | ||
x[0] = p[0] ^ rk[0]; | ||
x[1] = p[1] ^ rk[1]; | ||
x[2] = p[2] ^ rk[2]; | ||
x[3] = p[3] ^ rk[3]; | ||
op.bufferInsert(p, 0, ctx.h, 16); | ||
/* round 0 */ | ||
rk[0] = op.swap32(m[0]); | ||
x[0] = p[4] ^ rk[0]; | ||
rk[1] = op.swap32(m[1]); | ||
x[1] = p[5] ^ rk[1]; | ||
rk[2] = op.swap32(m[2]); | ||
x[2] = p[6] ^ rk[2]; | ||
rk[3] = op.swap32(m[3]); | ||
x[3] = p[7] ^ rk[3]; | ||
AES_ROUND_NOKEY(x); | ||
KEY_EXPAND_ELT(rk, 4, 8); | ||
rk[4] ^= rk[0]; | ||
rk[5] ^= rk[1]; | ||
rk[6] ^= rk[2]; | ||
rk[7] ^= rk[3]; | ||
if (r == 1) { | ||
rk[4] ^= ctx.count[3]; | ||
rk[5] ^= ctx.count[2]; | ||
rk[6] ^= ctx.count[1]; | ||
rk[7] ^= op.t32(~ctx.count[0]); | ||
} | ||
rk[4] = op.swap32(m[4]); | ||
x[0] ^= rk[4]; | ||
rk[5] = op.swap32(m[5]); | ||
x[1] ^= rk[5]; | ||
rk[6] = op.swap32(m[6]); | ||
x[2] ^= rk[6]; | ||
rk[7] = op.swap32(m[7]); | ||
x[3] ^= rk[7]; | ||
AES_ROUND_NOKEY(x); | ||
KEY_EXPAND_ELT(rk, 8, 12); | ||
rk[8] ^= rk[4]; | ||
rk[9] ^= rk[5]; | ||
rk[10] ^= rk[6]; | ||
rk[11] ^= rk[7]; | ||
rk[8] = op.swap32(m[8]); | ||
x[0] ^= rk[8]; | ||
rk[9] = op.swap32(m[9]); | ||
x[1] ^= rk[9]; | ||
rk[10] = op.swap32(m[10]); | ||
x[2] ^= rk[10]; | ||
rk[11] = op.swap32(m[11]); | ||
x[3] ^= rk[11]; | ||
AES_ROUND_NOKEY(x); | ||
KEY_EXPAND_ELT(rk, 12, 16); | ||
rk[12] ^= rk[8]; | ||
rk[13] ^= rk[9]; | ||
rk[14] ^= rk[10]; | ||
rk[15] ^= rk[11]; | ||
rk[12] = op.swap32(m[12]); | ||
x[0] ^= rk[12]; | ||
rk[13] = op.swap32(m[13]); | ||
x[1] ^= rk[13]; | ||
rk[14] = op.swap32(m[14]); | ||
x[2] ^= rk[14]; | ||
rk[15] = op.swap32(m[15]); | ||
x[3] ^= rk[15]; | ||
AES_ROUND_NOKEY(x); | ||
p[12] ^= x[0]; | ||
p[13] ^= x[1]; | ||
p[14] ^= x[2]; | ||
p[15] ^= x[3]; | ||
KEY_EXPAND_ELT(rk, 16, 20); | ||
rk[16] ^= rk[12]; | ||
rk[17] ^= rk[13]; | ||
rk[18] ^= rk[14]; | ||
rk[19] ^= rk[15]; | ||
x[0] = p[8] ^ rk[16]; | ||
x[1] = p[9] ^ rk[17]; | ||
x[2] = p[10] ^ rk[18]; | ||
x[3] = p[11] ^ rk[19]; | ||
p[0] ^= x[0]; | ||
p[1] ^= x[1]; | ||
p[2] ^= x[2]; | ||
p[3] ^= x[3]; | ||
rk[16] = op.swap32(m[16]); | ||
x[0] = p[12] ^ rk[16]; | ||
rk[17] = op.swap32(m[17]); | ||
x[1] = p[13] ^ rk[17]; | ||
rk[18] = op.swap32(m[18]); | ||
x[2] = p[14] ^ rk[18]; | ||
rk[19] = op.swap32(m[19]); | ||
x[3] = p[15] ^ rk[19]; | ||
AES_ROUND_NOKEY(x); | ||
KEY_EXPAND_ELT(rk, 20, 24); | ||
rk[20] ^= rk[16]; | ||
rk[21] ^= rk[17]; | ||
rk[22] ^= rk[18]; | ||
rk[23] ^= rk[19]; | ||
rk[20] = op.swap32(m[20]); | ||
x[0] ^= rk[20]; | ||
rk[21] = op.swap32(m[21]); | ||
x[1] ^= rk[21]; | ||
rk[22] = op.swap32(m[22]); | ||
x[2] ^= rk[22]; | ||
rk[23] = op.swap32(m[23]); | ||
x[3] ^= rk[23]; | ||
AES_ROUND_NOKEY(x); | ||
KEY_EXPAND_ELT(rk, 24, 28); | ||
rk[24] ^= rk[20]; | ||
rk[25] ^= rk[21]; | ||
rk[26] ^= rk[22]; | ||
rk[27] ^= rk[23]; | ||
rk[24] = op.swap32(m[24]); | ||
x[0] ^= rk[24]; | ||
rk[25] = op.swap32(m[25]); | ||
x[1] ^= rk[25]; | ||
rk[26] = op.swap32(m[26]); | ||
x[2] ^= rk[26]; | ||
rk[27] = op.swap32(m[27]); | ||
x[3] ^= rk[27]; | ||
AES_ROUND_NOKEY(x); | ||
KEY_EXPAND_ELT(rk, 28, 32); | ||
rk[28] ^= rk[24]; | ||
rk[29] ^= rk[25]; | ||
rk[30] ^= rk[26]; | ||
rk[31] ^= rk[27]; | ||
if (r == 2) { | ||
rk[28] ^= ctx.count[2]; | ||
rk[29] ^= ctx.count[3]; | ||
rk[30] ^= ctx.count[0]; | ||
rk[31] ^= op.t32(~ctx.count[1]); | ||
} | ||
rk[28] = op.swap32(m[28]); | ||
x[0] ^= rk[28]; | ||
rk[29] = op.swap32(m[29]); | ||
x[1] ^= rk[29]; | ||
rk[30] = op.swap32(m[30]); | ||
x[2] ^= rk[30]; | ||
rk[31] = op.swap32(m[31]); | ||
x[3] ^= rk[31]; | ||
AES_ROUND_NOKEY(x); | ||
p[4] ^= x[0]; | ||
p[5] ^= x[1]; | ||
p[6] ^= x[2]; | ||
p[7] ^= x[3]; | ||
/* round 2, 6, 10 */ | ||
rk[0] ^= rk[25]; | ||
x[0] = p[12] ^ rk[0]; | ||
rk[1] ^= rk[26]; | ||
x[1] = p[13] ^ rk[1]; | ||
rk[2] ^= rk[27]; | ||
x[2] = p[14] ^ rk[2]; | ||
rk[3] ^= rk[28]; | ||
x[3] = p[15] ^ rk[3]; | ||
AES_ROUND_NOKEY(x); | ||
rk[4] ^= rk[29]; | ||
x[0] ^= rk[4]; | ||
rk[5] ^= rk[30]; | ||
x[1] ^= rk[5]; | ||
rk[6] ^= rk[31]; | ||
x[2] ^= rk[6]; | ||
rk[7] ^= rk[0]; | ||
x[3] ^= rk[7]; | ||
AES_ROUND_NOKEY(x); | ||
rk[8] ^= rk[1]; | ||
x[0] ^= rk[8]; | ||
rk[9] ^= rk[2]; | ||
x[1] ^= rk[9]; | ||
rk[10] ^= rk[3]; | ||
x[2] ^= rk[10]; | ||
rk[11] ^= rk[4]; | ||
x[3] ^= rk[11]; | ||
AES_ROUND_NOKEY(x); | ||
rk[12] ^= rk[5]; | ||
x[0] ^= rk[12]; | ||
rk[13] ^= rk[6]; | ||
x[1] ^= rk[13]; | ||
rk[14] ^= rk[7]; | ||
x[2] ^= rk[14]; | ||
rk[15] ^= rk[8]; | ||
x[3] ^= rk[15]; | ||
AES_ROUND_NOKEY(x); | ||
p[8] ^= x[0]; | ||
@@ -276,43 +124,364 @@ p[9] ^= x[1]; | ||
p[11] ^= x[3]; | ||
rk[16] ^= rk[9]; | ||
x[0] = p[4] ^ rk[16]; | ||
rk[17] ^= rk[10]; | ||
x[1] = p[5] ^ rk[17]; | ||
rk[18] ^= rk[11]; | ||
x[2] = p[6] ^ rk[18]; | ||
rk[19] ^= rk[12]; | ||
x[3] = p[7] ^ rk[19]; | ||
AES_ROUND_NOKEY(x); | ||
rk[20] ^= rk[13]; | ||
x[0] ^= rk[20]; | ||
rk[21] ^= rk[14]; | ||
x[1] ^= rk[21]; | ||
rk[22] ^= rk[15]; | ||
x[2] ^= rk[22]; | ||
rk[23] ^= rk[16]; | ||
x[3] ^= rk[23]; | ||
AES_ROUND_NOKEY(x); | ||
rk[24] ^= rk[17]; | ||
x[0] ^= rk[24]; | ||
rk[25] ^= rk[18]; | ||
x[1] ^= rk[25]; | ||
rk[26] ^= rk[19]; | ||
x[2] ^= rk[26]; | ||
rk[27] ^= rk[20]; | ||
x[3] ^= rk[27]; | ||
AES_ROUND_NOKEY(x); | ||
rk[28] ^= rk[21]; | ||
x[0] ^= rk[28]; | ||
rk[29] ^= rk[22]; | ||
x[1] ^= rk[29]; | ||
rk[30] ^= rk[23]; | ||
x[2] ^= rk[30]; | ||
rk[31] ^= rk[24]; | ||
x[3] ^= rk[31]; | ||
AES_ROUND_NOKEY(x); | ||
p[0] ^= x[0]; | ||
p[1] ^= x[1]; | ||
p[2] ^= x[2]; | ||
p[3] ^= x[3]; | ||
/* round 3, 7, 11 */ | ||
for (r = 0; r < 3; r++) { | ||
/* round 1, 5, 9 */ | ||
KEY_EXPAND_ELT(rk, 0, 4); | ||
rk[0] ^= rk[28]; | ||
rk[1] ^= rk[29]; | ||
rk[2] ^= rk[30]; | ||
rk[3] ^= rk[31]; | ||
if (r === 0) { | ||
rk[0] ^= ctx.count[0]; | ||
rk[1] ^= ctx.count[1]; | ||
rk[2] ^= ctx.count[2]; | ||
rk[3] ^= op.t32(~ctx.count[3]); | ||
} | ||
x[0] = p[0] ^ rk[0]; | ||
x[1] = p[1] ^ rk[1]; | ||
x[2] = p[2] ^ rk[2]; | ||
x[3] = p[3] ^ rk[3]; | ||
AES_ROUND_NOKEY(x); | ||
KEY_EXPAND_ELT(rk, 4, 8); | ||
rk[4] ^= rk[0]; | ||
rk[5] ^= rk[1]; | ||
rk[6] ^= rk[2]; | ||
rk[7] ^= rk[3]; | ||
if (r === 1) { | ||
rk[4] ^= ctx.count[3]; | ||
rk[5] ^= ctx.count[2]; | ||
rk[6] ^= ctx.count[1]; | ||
rk[7] ^= op.t32(~ctx.count[0]); | ||
} | ||
x[0] ^= rk[4]; | ||
x[1] ^= rk[5]; | ||
x[2] ^= rk[6]; | ||
x[3] ^= rk[7]; | ||
AES_ROUND_NOKEY(x); | ||
KEY_EXPAND_ELT(rk, 8, 12); | ||
rk[8] ^= rk[4]; | ||
rk[9] ^= rk[5]; | ||
rk[10] ^= rk[6]; | ||
rk[11] ^= rk[7]; | ||
x[0] ^= rk[8]; | ||
x[1] ^= rk[9]; | ||
x[2] ^= rk[10]; | ||
x[3] ^= rk[11]; | ||
AES_ROUND_NOKEY(x); | ||
KEY_EXPAND_ELT(rk, 12, 16); | ||
rk[12] ^= rk[8]; | ||
rk[13] ^= rk[9]; | ||
rk[14] ^= rk[10]; | ||
rk[15] ^= rk[11]; | ||
x[0] ^= rk[12]; | ||
x[1] ^= rk[13]; | ||
x[2] ^= rk[14]; | ||
x[3] ^= rk[15]; | ||
AES_ROUND_NOKEY(x); | ||
p[12] ^= x[0]; | ||
p[13] ^= x[1]; | ||
p[14] ^= x[2]; | ||
p[15] ^= x[3]; | ||
KEY_EXPAND_ELT(rk, 16, 20); | ||
rk[16] ^= rk[12]; | ||
rk[17] ^= rk[13]; | ||
rk[18] ^= rk[14]; | ||
rk[19] ^= rk[15]; | ||
x[0] = p[8] ^ rk[16]; | ||
x[1] = p[9] ^ rk[17]; | ||
x[2] = p[10] ^ rk[18]; | ||
x[3] = p[11] ^ rk[19]; | ||
AES_ROUND_NOKEY(x); | ||
KEY_EXPAND_ELT(rk, 20, 24); | ||
rk[20] ^= rk[16]; | ||
rk[21] ^= rk[17]; | ||
rk[22] ^= rk[18]; | ||
rk[23] ^= rk[19]; | ||
x[0] ^= rk[20]; | ||
x[1] ^= rk[21]; | ||
x[2] ^= rk[22]; | ||
x[3] ^= rk[23]; | ||
AES_ROUND_NOKEY(x); | ||
KEY_EXPAND_ELT(rk, 24, 28); | ||
rk[24] ^= rk[20]; | ||
rk[25] ^= rk[21]; | ||
rk[26] ^= rk[22]; | ||
rk[27] ^= rk[23]; | ||
x[0] ^= rk[24]; | ||
x[1] ^= rk[25]; | ||
x[2] ^= rk[26]; | ||
x[3] ^= rk[27]; | ||
AES_ROUND_NOKEY(x); | ||
KEY_EXPAND_ELT(rk, 28, 32); | ||
rk[28] ^= rk[24]; | ||
rk[29] ^= rk[25]; | ||
rk[30] ^= rk[26]; | ||
rk[31] ^= rk[27]; | ||
if (r === 2) { | ||
rk[28] ^= ctx.count[2]; | ||
rk[29] ^= ctx.count[3]; | ||
rk[30] ^= ctx.count[0]; | ||
rk[31] ^= op.t32(~ctx.count[1]); | ||
} | ||
x[0] ^= rk[28]; | ||
x[1] ^= rk[29]; | ||
x[2] ^= rk[30]; | ||
x[3] ^= rk[31]; | ||
AES_ROUND_NOKEY(x); | ||
p[4] ^= x[0]; | ||
p[5] ^= x[1]; | ||
p[6] ^= x[2]; | ||
p[7] ^= x[3]; | ||
/* round 2, 6, 10 */ | ||
rk[0] ^= rk[25]; | ||
x[0] = p[12] ^ rk[0]; | ||
rk[1] ^= rk[26]; | ||
x[1] = p[13] ^ rk[1]; | ||
rk[2] ^= rk[27]; | ||
x[2] = p[14] ^ rk[2]; | ||
rk[3] ^= rk[28]; | ||
x[3] = p[15] ^ rk[3]; | ||
AES_ROUND_NOKEY(x); | ||
rk[4] ^= rk[29]; | ||
x[0] ^= rk[4]; | ||
rk[5] ^= rk[30]; | ||
x[1] ^= rk[5]; | ||
rk[6] ^= rk[31]; | ||
x[2] ^= rk[6]; | ||
rk[7] ^= rk[0]; | ||
x[3] ^= rk[7]; | ||
AES_ROUND_NOKEY(x); | ||
rk[8] ^= rk[1]; | ||
x[0] ^= rk[8]; | ||
rk[9] ^= rk[2]; | ||
x[1] ^= rk[9]; | ||
rk[10] ^= rk[3]; | ||
x[2] ^= rk[10]; | ||
rk[11] ^= rk[4]; | ||
x[3] ^= rk[11]; | ||
AES_ROUND_NOKEY(x); | ||
rk[12] ^= rk[5]; | ||
x[0] ^= rk[12]; | ||
rk[13] ^= rk[6]; | ||
x[1] ^= rk[13]; | ||
rk[14] ^= rk[7]; | ||
x[2] ^= rk[14]; | ||
rk[15] ^= rk[8]; | ||
x[3] ^= rk[15]; | ||
AES_ROUND_NOKEY(x); | ||
p[8] ^= x[0]; | ||
p[9] ^= x[1]; | ||
p[10] ^= x[2]; | ||
p[11] ^= x[3]; | ||
rk[16] ^= rk[9]; | ||
x[0] = p[4] ^ rk[16]; | ||
rk[17] ^= rk[10]; | ||
x[1] = p[5] ^ rk[17]; | ||
rk[18] ^= rk[11]; | ||
x[2] = p[6] ^ rk[18]; | ||
rk[19] ^= rk[12]; | ||
x[3] = p[7] ^ rk[19]; | ||
AES_ROUND_NOKEY(x); | ||
rk[20] ^= rk[13]; | ||
x[0] ^= rk[20]; | ||
rk[21] ^= rk[14]; | ||
x[1] ^= rk[21]; | ||
rk[22] ^= rk[15]; | ||
x[2] ^= rk[22]; | ||
rk[23] ^= rk[16]; | ||
x[3] ^= rk[23]; | ||
AES_ROUND_NOKEY(x); | ||
rk[24] ^= rk[17]; | ||
x[0] ^= rk[24]; | ||
rk[25] ^= rk[18]; | ||
x[1] ^= rk[25]; | ||
rk[26] ^= rk[19]; | ||
x[2] ^= rk[26]; | ||
rk[27] ^= rk[20]; | ||
x[3] ^= rk[27]; | ||
AES_ROUND_NOKEY(x); | ||
rk[28] ^= rk[21]; | ||
x[0] ^= rk[28]; | ||
rk[29] ^= rk[22]; | ||
x[1] ^= rk[29]; | ||
rk[30] ^= rk[23]; | ||
x[2] ^= rk[30]; | ||
rk[31] ^= rk[24]; | ||
x[3] ^= rk[31]; | ||
AES_ROUND_NOKEY(x); | ||
p[0] ^= x[0]; | ||
p[1] ^= x[1]; | ||
p[2] ^= x[2]; | ||
p[3] ^= x[3]; | ||
/* round 3, 7, 11 */ | ||
KEY_EXPAND_ELT(rk, 0, 4); | ||
rk[0] ^= rk[28]; | ||
rk[1] ^= rk[29]; | ||
rk[2] ^= rk[30]; | ||
rk[3] ^= rk[31]; | ||
x[0] = p[8] ^ rk[0]; | ||
x[1] = p[9] ^ rk[1]; | ||
x[2] = p[10] ^ rk[2]; | ||
x[3] = p[11] ^ rk[3]; | ||
AES_ROUND_NOKEY(x); | ||
KEY_EXPAND_ELT(rk, 4, 8); | ||
rk[4] ^= rk[0]; | ||
rk[5] ^= rk[1]; | ||
rk[6] ^= rk[2]; | ||
rk[7] ^= rk[3]; | ||
x[0] ^= rk[4]; | ||
x[1] ^= rk[5]; | ||
x[2] ^= rk[6]; | ||
x[3] ^= rk[7]; | ||
AES_ROUND_NOKEY(x); | ||
KEY_EXPAND_ELT(rk, 8, 12); | ||
rk[8] ^= rk[4]; | ||
rk[9] ^= rk[5]; | ||
rk[10] ^= rk[6]; | ||
rk[11] ^= rk[7]; | ||
x[0] ^= rk[8]; | ||
x[1] ^= rk[9]; | ||
x[2] ^= rk[10]; | ||
x[3] ^= rk[11]; | ||
AES_ROUND_NOKEY(x); | ||
KEY_EXPAND_ELT(rk, 12, 16); | ||
rk[12] ^= rk[8]; | ||
rk[13] ^= rk[9]; | ||
rk[14] ^= rk[10]; | ||
rk[15] ^= rk[11]; | ||
x[0] ^= rk[12]; | ||
x[1] ^= rk[13]; | ||
x[2] ^= rk[14]; | ||
x[3] ^= rk[15]; | ||
AES_ROUND_NOKEY(x); | ||
p[4] ^= x[0]; | ||
p[5] ^= x[1]; | ||
p[6] ^= x[2]; | ||
p[7] ^= x[3]; | ||
KEY_EXPAND_ELT(rk, 16, 20); | ||
rk[16] ^= rk[12]; | ||
rk[17] ^= rk[13]; | ||
rk[18] ^= rk[14]; | ||
rk[19] ^= rk[15]; | ||
x[0] = p[0] ^ rk[16]; | ||
x[1] = p[1] ^ rk[17]; | ||
x[2] = p[2] ^ rk[18]; | ||
x[3] = p[3] ^ rk[19]; | ||
AES_ROUND_NOKEY(x); | ||
KEY_EXPAND_ELT(rk, 20, 24); | ||
rk[20] ^= rk[16]; | ||
rk[21] ^= rk[17]; | ||
rk[22] ^= rk[18]; | ||
rk[23] ^= rk[19]; | ||
x[0] ^= rk[20]; | ||
x[1] ^= rk[21]; | ||
x[2] ^= rk[22]; | ||
x[3] ^= rk[23]; | ||
AES_ROUND_NOKEY(x); | ||
KEY_EXPAND_ELT(rk, 24, 28); | ||
rk[24] ^= rk[20]; | ||
rk[25] ^= rk[21]; | ||
rk[26] ^= rk[22]; | ||
rk[27] ^= rk[23]; | ||
x[0] ^= rk[24]; | ||
x[1] ^= rk[25]; | ||
x[2] ^= rk[26]; | ||
x[3] ^= rk[27]; | ||
AES_ROUND_NOKEY(x); | ||
KEY_EXPAND_ELT(rk, 28, 32); | ||
rk[28] ^= rk[24]; | ||
rk[29] ^= rk[25]; | ||
rk[30] ^= rk[26]; | ||
rk[31] ^= rk[27]; | ||
x[0] ^= rk[28]; | ||
x[1] ^= rk[29]; | ||
x[2] ^= rk[30]; | ||
x[3] ^= rk[31]; | ||
AES_ROUND_NOKEY(x); | ||
p[12] ^= x[0]; | ||
p[13] ^= x[1]; | ||
p[14] ^= x[2]; | ||
p[15] ^= x[3]; | ||
/* round 4, 8, 12 */ | ||
rk[0] ^= rk[25]; | ||
x[0] = p[4] ^ rk[0]; | ||
rk[1] ^= rk[26]; | ||
x[1] = p[5] ^ rk[1]; | ||
rk[2] ^= rk[27]; | ||
x[2] = p[6] ^ rk[2]; | ||
rk[3] ^= rk[28]; | ||
x[3] = p[7] ^ rk[3]; | ||
AES_ROUND_NOKEY(x); | ||
rk[4] ^= rk[29]; | ||
x[0] ^= rk[4]; | ||
rk[5] ^= rk[30]; | ||
x[1] ^= rk[5]; | ||
rk[6] ^= rk[31]; | ||
x[2] ^= rk[6]; | ||
rk[7] ^= rk[0]; | ||
x[3] ^= rk[7]; | ||
AES_ROUND_NOKEY(x); | ||
rk[8] ^= rk[1]; | ||
x[0] ^= rk[8]; | ||
rk[9] ^= rk[2]; | ||
x[1] ^= rk[9]; | ||
rk[10] ^= rk[3]; | ||
x[2] ^= rk[10]; | ||
rk[11] ^= rk[4]; | ||
x[3] ^= rk[11]; | ||
AES_ROUND_NOKEY(x); | ||
rk[12] ^= rk[5]; | ||
x[0] ^= rk[12]; | ||
rk[13] ^= rk[6]; | ||
x[1] ^= rk[13]; | ||
rk[14] ^= rk[7]; | ||
x[2] ^= rk[14]; | ||
rk[15] ^= rk[8]; | ||
x[3] ^= rk[15]; | ||
AES_ROUND_NOKEY(x); | ||
p[0] ^= x[0]; | ||
p[1] ^= x[1]; | ||
p[2] ^= x[2]; | ||
p[3] ^= x[3]; | ||
rk[16] ^= rk[9]; | ||
x[0] = p[12] ^ rk[16]; | ||
rk[17] ^= rk[10]; | ||
x[1] = p[13] ^ rk[17]; | ||
rk[18] ^= rk[11]; | ||
x[2] = p[14] ^ rk[18]; | ||
rk[19] ^= rk[12]; | ||
x[3] = p[15] ^ rk[19]; | ||
AES_ROUND_NOKEY(x); | ||
rk[20] ^= rk[13]; | ||
x[0] ^= rk[20]; | ||
rk[21] ^= rk[14]; | ||
x[1] ^= rk[21]; | ||
rk[22] ^= rk[15]; | ||
x[2] ^= rk[22]; | ||
rk[23] ^= rk[16]; | ||
x[3] ^= rk[23]; | ||
AES_ROUND_NOKEY(x); | ||
rk[24] ^= rk[17]; | ||
x[0] ^= rk[24]; | ||
rk[25] ^= rk[18]; | ||
x[1] ^= rk[25]; | ||
rk[26] ^= rk[19]; | ||
x[2] ^= rk[26]; | ||
rk[27] ^= rk[20]; | ||
x[3] ^= rk[27]; | ||
AES_ROUND_NOKEY(x); | ||
rk[28] ^= rk[21]; | ||
x[0] ^= rk[28]; | ||
rk[29] ^= rk[22]; | ||
x[1] ^= rk[29]; | ||
rk[30] ^= rk[23]; | ||
x[2] ^= rk[30]; | ||
rk[31] ^= rk[24]; | ||
x[3] ^= rk[31]; | ||
AES_ROUND_NOKEY(x); | ||
p[8] ^= x[0]; | ||
p[9] ^= x[1]; | ||
p[10] ^= x[2]; | ||
p[11] ^= x[3]; | ||
} | ||
/* round 13 */ | ||
KEY_EXPAND_ELT(rk, 0, 4); | ||
@@ -323,6 +492,6 @@ rk[0] ^= rk[28]; | ||
rk[3] ^= rk[31]; | ||
x[0] = p[8] ^ rk[0]; | ||
x[1] = p[9] ^ rk[1]; | ||
x[2] = p[10] ^ rk[2]; | ||
x[3] = p[11] ^ rk[3]; | ||
x[0] = p[0] ^ rk[0]; | ||
x[1] = p[1] ^ rk[1]; | ||
x[2] = p[2] ^ rk[2]; | ||
x[3] = p[3] ^ rk[3]; | ||
AES_ROUND_NOKEY(x); | ||
@@ -359,6 +528,6 @@ KEY_EXPAND_ELT(rk, 4, 8); | ||
AES_ROUND_NOKEY(x); | ||
p[4] ^= x[0]; | ||
p[5] ^= x[1]; | ||
p[6] ^= x[2]; | ||
p[7] ^= x[3]; | ||
p[12] ^= x[0]; | ||
p[13] ^= x[1]; | ||
p[14] ^= x[2]; | ||
p[15] ^= x[3]; | ||
KEY_EXPAND_ELT(rk, 16, 20); | ||
@@ -369,6 +538,6 @@ rk[16] ^= rk[12]; | ||
rk[19] ^= rk[15]; | ||
x[0] = p[0] ^ rk[16]; | ||
x[1] = p[1] ^ rk[17]; | ||
x[2] = p[2] ^ rk[18]; | ||
x[3] = p[3] ^ rk[19]; | ||
x[0] = p[8] ^ rk[16]; | ||
x[1] = p[9] ^ rk[17]; | ||
x[2] = p[10] ^ rk[18]; | ||
x[3] = p[11] ^ rk[19]; | ||
AES_ROUND_NOKEY(x); | ||
@@ -386,6 +555,6 @@ KEY_EXPAND_ELT(rk, 20, 24); | ||
KEY_EXPAND_ELT(rk, 24, 28); | ||
rk[24] ^= rk[20]; | ||
rk[25] ^= rk[21]; | ||
rk[26] ^= rk[22]; | ||
rk[27] ^= rk[23]; | ||
rk[24] ^= rk[20] ^ ctx.count[1]; | ||
rk[25] ^= rk[21] ^ ctx.count[0]; | ||
rk[26] ^= rk[22] ^ ctx.count[3]; | ||
rk[27] ^= rk[23] ^ op.t32(~ctx.count[2]); | ||
x[0] ^= rk[24]; | ||
@@ -406,297 +575,125 @@ x[1] ^= rk[25]; | ||
AES_ROUND_NOKEY(x); | ||
p[12] ^= x[0]; | ||
p[13] ^= x[1]; | ||
p[14] ^= x[2]; | ||
p[15] ^= x[3]; | ||
/* round 4, 8, 12 */ | ||
rk[0] ^= rk[25]; | ||
x[0] = p[4] ^ rk[0]; | ||
rk[1] ^= rk[26]; | ||
x[1] = p[5] ^ rk[1]; | ||
rk[2] ^= rk[27]; | ||
x[2] = p[6] ^ rk[2]; | ||
rk[3] ^= rk[28]; | ||
x[3] = p[7] ^ rk[3]; | ||
AES_ROUND_NOKEY(x); | ||
rk[4] ^= rk[29]; | ||
x[0] ^= rk[4]; | ||
rk[5] ^= rk[30]; | ||
x[1] ^= rk[5]; | ||
rk[6] ^= rk[31]; | ||
x[2] ^= rk[6]; | ||
rk[7] ^= rk[0]; | ||
x[3] ^= rk[7]; | ||
AES_ROUND_NOKEY(x); | ||
rk[8] ^= rk[1]; | ||
x[0] ^= rk[8]; | ||
rk[9] ^= rk[2]; | ||
x[1] ^= rk[9]; | ||
rk[10] ^= rk[3]; | ||
x[2] ^= rk[10]; | ||
rk[11] ^= rk[4]; | ||
x[3] ^= rk[11]; | ||
AES_ROUND_NOKEY(x); | ||
rk[12] ^= rk[5]; | ||
x[0] ^= rk[12]; | ||
rk[13] ^= rk[6]; | ||
x[1] ^= rk[13]; | ||
rk[14] ^= rk[7]; | ||
x[2] ^= rk[14]; | ||
rk[15] ^= rk[8]; | ||
x[3] ^= rk[15]; | ||
AES_ROUND_NOKEY(x); | ||
p[0] ^= x[0]; | ||
p[1] ^= x[1]; | ||
p[2] ^= x[2]; | ||
p[3] ^= x[3]; | ||
rk[16] ^= rk[9]; | ||
x[0] = p[12] ^ rk[16]; | ||
rk[17] ^= rk[10]; | ||
x[1] = p[13] ^ rk[17]; | ||
rk[18] ^= rk[11]; | ||
x[2] = p[14] ^ rk[18]; | ||
rk[19] ^= rk[12]; | ||
x[3] = p[15] ^ rk[19]; | ||
AES_ROUND_NOKEY(x); | ||
rk[20] ^= rk[13]; | ||
x[0] ^= rk[20]; | ||
rk[21] ^= rk[14]; | ||
x[1] ^= rk[21]; | ||
rk[22] ^= rk[15]; | ||
x[2] ^= rk[22]; | ||
rk[23] ^= rk[16]; | ||
x[3] ^= rk[23]; | ||
AES_ROUND_NOKEY(x); | ||
rk[24] ^= rk[17]; | ||
x[0] ^= rk[24]; | ||
rk[25] ^= rk[18]; | ||
x[1] ^= rk[25]; | ||
rk[26] ^= rk[19]; | ||
x[2] ^= rk[26]; | ||
rk[27] ^= rk[20]; | ||
x[3] ^= rk[27]; | ||
AES_ROUND_NOKEY(x); | ||
rk[28] ^= rk[21]; | ||
x[0] ^= rk[28]; | ||
rk[29] ^= rk[22]; | ||
x[1] ^= rk[29]; | ||
rk[30] ^= rk[23]; | ||
x[2] ^= rk[30]; | ||
rk[31] ^= rk[24]; | ||
x[3] ^= rk[31]; | ||
AES_ROUND_NOKEY(x); | ||
p[8] ^= x[0]; | ||
p[9] ^= x[1]; | ||
p[10] ^= x[2]; | ||
p[11] ^= x[3]; | ||
} | ||
/* round 13 */ | ||
KEY_EXPAND_ELT(rk, 0, 4); | ||
rk[0] ^= rk[28]; | ||
rk[1] ^= rk[29]; | ||
rk[2] ^= rk[30]; | ||
rk[3] ^= rk[31]; | ||
x[0] = p[0] ^ rk[0]; | ||
x[1] = p[1] ^ rk[1]; | ||
x[2] = p[2] ^ rk[2]; | ||
x[3] = p[3] ^ rk[3]; | ||
AES_ROUND_NOKEY(x); | ||
KEY_EXPAND_ELT(rk, 4, 8); | ||
rk[4] ^= rk[0]; | ||
rk[5] ^= rk[1]; | ||
rk[6] ^= rk[2]; | ||
rk[7] ^= rk[3]; | ||
x[0] ^= rk[4]; | ||
x[1] ^= rk[5]; | ||
x[2] ^= rk[6]; | ||
x[3] ^= rk[7]; | ||
AES_ROUND_NOKEY(x); | ||
KEY_EXPAND_ELT(rk, 8, 12); | ||
rk[8] ^= rk[4]; | ||
rk[9] ^= rk[5]; | ||
rk[10] ^= rk[6]; | ||
rk[11] ^= rk[7]; | ||
x[0] ^= rk[8]; | ||
x[1] ^= rk[9]; | ||
x[2] ^= rk[10]; | ||
x[3] ^= rk[11]; | ||
AES_ROUND_NOKEY(x); | ||
KEY_EXPAND_ELT(rk, 12, 16); | ||
rk[12] ^= rk[8]; | ||
rk[13] ^= rk[9]; | ||
rk[14] ^= rk[10]; | ||
rk[15] ^= rk[11]; | ||
x[0] ^= rk[12]; | ||
x[1] ^= rk[13]; | ||
x[2] ^= rk[14]; | ||
x[3] ^= rk[15]; | ||
AES_ROUND_NOKEY(x); | ||
p[12] ^= x[0]; | ||
p[13] ^= x[1]; | ||
p[14] ^= x[2]; | ||
p[15] ^= x[3]; | ||
KEY_EXPAND_ELT(rk, 16, 20); | ||
rk[16] ^= rk[12]; | ||
rk[17] ^= rk[13]; | ||
rk[18] ^= rk[14]; | ||
rk[19] ^= rk[15]; | ||
x[0] = p[8] ^ rk[16]; | ||
x[1] = p[9] ^ rk[17]; | ||
x[2] = p[10] ^ rk[18]; | ||
x[3] = p[11] ^ rk[19]; | ||
AES_ROUND_NOKEY(x); | ||
KEY_EXPAND_ELT(rk, 20, 24); | ||
rk[20] ^= rk[16]; | ||
rk[21] ^= rk[17]; | ||
rk[22] ^= rk[18]; | ||
rk[23] ^= rk[19]; | ||
x[0] ^= rk[20]; | ||
x[1] ^= rk[21]; | ||
x[2] ^= rk[22]; | ||
x[3] ^= rk[23]; | ||
AES_ROUND_NOKEY(x); | ||
KEY_EXPAND_ELT(rk, 24, 28); | ||
rk[24] ^= rk[20] ^ ctx.count[1]; | ||
rk[25] ^= rk[21] ^ ctx.count[0]; | ||
rk[26] ^= rk[22] ^ ctx.count[3]; | ||
rk[27] ^= rk[23] ^ op.t32(~ctx.count[2]); | ||
x[0] ^= rk[24]; | ||
x[1] ^= rk[25]; | ||
x[2] ^= rk[26]; | ||
x[3] ^= rk[27]; | ||
AES_ROUND_NOKEY(x); | ||
KEY_EXPAND_ELT(rk, 28, 32); | ||
rk[28] ^= rk[24]; | ||
rk[29] ^= rk[25]; | ||
rk[30] ^= rk[26]; | ||
rk[31] ^= rk[27]; | ||
x[0] ^= rk[28]; | ||
x[1] ^= rk[29]; | ||
x[2] ^= rk[30]; | ||
x[3] ^= rk[31]; | ||
AES_ROUND_NOKEY(x); | ||
p[4] ^= x[0]; | ||
p[5] ^= x[1]; | ||
p[6] ^= x[2]; | ||
p[7] ^= x[3]; | ||
ctx.h[0] ^= p[8]; | ||
ctx.h[1] ^= p[9]; | ||
ctx.h[2] ^= p[10]; | ||
ctx.h[3] ^= p[11]; | ||
ctx.h[4] ^= p[12]; | ||
ctx.h[5] ^= p[13]; | ||
ctx.h[6] ^= p[14]; | ||
ctx.h[7] ^= p[15]; | ||
ctx.h[8] ^= p[0]; | ||
ctx.h[9] ^= p[1]; | ||
ctx.h[10] ^= p[2]; | ||
ctx.h[11] ^= p[3]; | ||
ctx.h[12] ^= p[4]; | ||
ctx.h[13] ^= p[5]; | ||
ctx.h[14] ^= p[6]; | ||
ctx.h[15] ^= p[7]; | ||
} | ||
p[4] ^= x[0]; | ||
p[5] ^= x[1]; | ||
p[6] ^= x[2]; | ||
p[7] ^= x[3]; | ||
ctx.h[0] ^= p[8]; | ||
ctx.h[1] ^= p[9]; | ||
ctx.h[2] ^= p[10]; | ||
ctx.h[3] ^= p[11]; | ||
ctx.h[4] ^= p[12]; | ||
ctx.h[5] ^= p[13]; | ||
ctx.h[6] ^= p[14]; | ||
ctx.h[7] ^= p[15]; | ||
ctx.h[8] ^= p[0]; | ||
ctx.h[9] ^= p[1]; | ||
ctx.h[10] ^= p[2]; | ||
ctx.h[11] ^= p[3]; | ||
ctx.h[12] ^= p[4]; | ||
ctx.h[13] ^= p[5]; | ||
ctx.h[14] ^= p[6]; | ||
ctx.h[15] ^= p[7]; | ||
}; | ||
var shavite = function(ctx, data) { | ||
var len = data.length; | ||
var buf = ctx.buffer; | ||
var ptr = ctx.ptr; | ||
while (len > 0) { | ||
var clen = ctx.buffer.length - ctx.ptr; | ||
if (clen > len) clen = len; | ||
op.bufferInsert(buf, ptr, data, clen); | ||
ptr += clen; | ||
data = data.slice(clen); | ||
len -= clen; | ||
if (ptr === ctx.buffer.length) { | ||
if ((ctx.count[0] = op.t32(ctx.count[0] + 1024)) == 0) { | ||
ctx.count[1] = op.t32(ctx.count[1] + 1); | ||
if (ctx.count[1] == 0) { | ||
ctx.count[2] = op.t32(ctx.count[2] + 1); | ||
if (ctx.count[2] == 0) { | ||
ctx.count[3] = op.t32(ctx.count[3] + 1); | ||
} | ||
var len = data.length; | ||
var buf = ctx.buffer; | ||
var ptr = ctx.ptr; | ||
while (len > 0) { | ||
var clen = ctx.buffer.length - ctx.ptr; | ||
if (clen > len) clen = len; | ||
op.bufferInsert(buf, ptr, data, clen); | ||
ptr += clen; | ||
data = data.slice(clen); | ||
len -= clen; | ||
if (ptr === ctx.buffer.length) { | ||
if ((ctx.count[0] = op.t32(ctx.count[0] + 1024)) === 0) { | ||
ctx.count[1] = op.t32(ctx.count[1] + 1); | ||
if (ctx.count[1] === 0) { | ||
ctx.count[2] = op.t32(ctx.count[2] + 1); | ||
if (ctx.count[2] === 0) { | ||
ctx.count[3] = op.t32(ctx.count[3] + 1); | ||
} | ||
} | ||
} | ||
c512(ctx, buf); | ||
ptr = 0; | ||
} | ||
} | ||
c512(ctx, buf); | ||
ptr = 0; | ||
} | ||
} | ||
ctx.ptr = ptr; | ||
} | ||
ctx.ptr = ptr; | ||
}; | ||
var shaviteClose = function(ctx, ub, n) { | ||
var buf; | ||
var ptr, u; | ||
var z; | ||
var count = new Array(4); | ||
var buf; | ||
var ptr, u; | ||
var z; | ||
var count = new Array(4); | ||
buf = ctx.buffer; | ||
ptr = ctx.ptr; | ||
count[0] = (ctx.count[0] += (ptr << 3) + n); | ||
count[1] = ctx.count[1]; | ||
count[2] = ctx.count[2]; | ||
count[3] = ctx.count[3]; | ||
z = 0x80 >> n; | ||
z = ((ub & -z) | z) & 0xFF; | ||
if (ptr == 0 && n == 0) { | ||
buf[0] = 0x80; | ||
op.bufferSet(buf, 1, 0, 109); | ||
op.bufferSet(ctx.count, 0, 0, 4); | ||
} | ||
else if (ptr < 110) { | ||
buf[ptr++] = z; | ||
op.bufferSet(buf, ptr, 0, 110 - ptr); | ||
} | ||
else { | ||
buf[ptr++] = z; | ||
op.bufferSet(buf, ptr, 0, 128 - ptr); | ||
buf = ctx.buffer; | ||
ptr = ctx.ptr; | ||
count[0] = (ctx.count[0] += (ptr << 3) + n); | ||
count[1] = ctx.count[1]; | ||
count[2] = ctx.count[2]; | ||
count[3] = ctx.count[3]; | ||
z = 0x80 >> n; | ||
z = ((ub & -z) | z) & 0xFF; | ||
if (ptr === 0 && n === 0) { | ||
buf[0] = 0x80; | ||
op.bufferSet(buf, 1, 0, 109); | ||
op.bufferSet(ctx.count, 0, 0, 4); | ||
} | ||
else if (ptr < 110) { | ||
buf[ptr++] = z; | ||
op.bufferSet(buf, ptr, 0, 110 - ptr); | ||
} | ||
else { | ||
buf[ptr++] = z; | ||
op.bufferSet(buf, ptr, 0, 128 - ptr); | ||
c512(ctx, buf); | ||
op.bufferSet(buf, 0, 0, 110); | ||
op.bufferSet(ctx.count, 0, 0, 4); | ||
} | ||
var countSwapped = op.swap32Array(count); | ||
var countBytes = h.int32Buffer2Bytes(countSwapped); | ||
op.bufferInsert(buf, 110, countBytes, 16); | ||
buf[126] = (16 << 5) & 0xFF; //just to copy the spec (doesn't make sense) | ||
buf[127] = 16 >>> 3; | ||
c512(ctx, buf); | ||
op.bufferSet(buf, 0, 0, 110); | ||
op.bufferSet(ctx.count, 0, 0, 4); | ||
} | ||
var countSwapped = op.swap32Array(count); | ||
var countBytes = h.int32Buffer2Bytes(countSwapped); | ||
op.bufferInsert(buf, 110, countBytes, 16); | ||
buf[126] = (16 << 5) & 0xFF; //just to copy the spec (doesn't make sense) | ||
buf[127] = 16 >>> 3; | ||
c512(ctx, buf); | ||
var out = new Array(16); | ||
for (u = 0; u < 16; u++) out[u] = op.swap32(ctx.h[u]); | ||
return out; | ||
}; | ||
var out = new Array(16); | ||
for (u = 0; u < 16; u++) | ||
out[u] = op.swap32(ctx.h[u]); | ||
return out; | ||
} | ||
module.exports = function(input, format, output) { | ||
var msg; | ||
if (format === 1) { | ||
msg = input; | ||
} | ||
else if (format === 2) { | ||
msg = h.int32Buffer2Bytes(input); | ||
} | ||
else { | ||
msg = h.string2bytes(input); | ||
} | ||
var ctx = {}; | ||
ctx.ptr = 0; | ||
ctx.count = new Array(4); | ||
op.bufferSet(ctx.count, 0, 0, 4); | ||
ctx.h = IV512.slice(); | ||
ctx.buffer = new Array(Shavite_BlockSize); | ||
shavite(ctx, msg); | ||
var r = shaviteClose(ctx, 0, 0); | ||
var out; | ||
if (output === 2) { | ||
out = r; | ||
} | ||
else if (output === 1) { | ||
out = h.int32Buffer2Bytes(r) | ||
} | ||
else { | ||
out = h.int32ArrayToHexString(r) | ||
} | ||
return out; | ||
} | ||
var msg; | ||
if (format === 1) { | ||
msg = input; | ||
} | ||
else if (format === 2) { | ||
msg = h.int32Buffer2Bytes(input); | ||
} | ||
else { | ||
msg = h.string2bytes(input); | ||
} | ||
var ctx = {}; | ||
ctx.ptr = 0; | ||
ctx.count = new Array(4); | ||
op.bufferSet(ctx.count, 0, 0, 4); | ||
ctx.h = IV512.slice(); | ||
ctx.buffer = new Array(128); | ||
shavite(ctx, msg); | ||
var r = shaviteClose(ctx, 0, 0); | ||
var out; | ||
if (output === 2) { | ||
out = r; | ||
} | ||
else if (output === 1) { | ||
out = h.int32Buffer2Bytes(r); | ||
} | ||
else { | ||
out = h.int32ArrayToHexString(r); | ||
} | ||
return out; | ||
}; |
855
lib/simd.js
@@ -0,1 +1,2 @@ | ||
'use strict'; | ||
///////////////////////////////////// | ||
@@ -12,15 +13,14 @@ ////////////// Simd /////////////// | ||
var Simd_BlockSize = 128; | ||
var Simd_StateSize = 32; | ||
var IV512 = h.bytes2Int32Buffer(h.b64Decode('C6FrlXL5ma2f7MKuujJk/F6JSSmOnzDlLx2qN/DyxVisUGZDqQY1peJbh4uqt4ePiIF/egoCiStVmnVQWY9lfn7vYKFrcOPonBcU0blY4qirAmde7RwBT82NZbv9t6JXCSVImdaZx7yQGbbcK5Ai5I+hSVYhv5vTuU0JQ2/93CI=')); | ||
var IV512 = [ | ||
0x0BA16B95, 0x72F999AD, 0x9FECC2AE, 0xBA3264FC, | ||
0x5E894929, 0x8E9F30E5, 0x2F1DAA37, 0xF0F2C558, | ||
0xAC506643, 0xA90635A5, 0xE25B878B, 0xAAB7878F, | ||
0x88817F7A, 0x0A02892B, 0x559A7550, 0x598F657E, | ||
0x7EEF60A1, 0x6B70E3E8, 0x9C1714D1, 0xB958E2A8, | ||
0xAB02675E, 0xED1C014F, 0xCD8D65BB, 0xFDB7A257, | ||
0x09254899, 0xD699C7BC, 0x9019B6DC, 0x2B9022E4, | ||
0x8FA14956, 0x21BF9BD3, 0xB94D0943, 0x6FFDDC22, | ||
]; | ||
// var IV512 = [ | ||
// 0x0BA16B95, 0x72F999AD, 0x9FECC2AE, 0xBA3264FC, | ||
// 0x5E894929, 0x8E9F30E5, 0x2F1DAA37, 0xF0F2C558, | ||
// 0xAC506643, 0xA90635A5, 0xE25B878B, 0xAAB7878F, | ||
// 0x88817F7A, 0x0A02892B, 0x559A7550, 0x598F657E, | ||
// 0x7EEF60A1, 0x6B70E3E8, 0x9C1714D1, 0xB958E2A8, | ||
// 0xAB02675E, 0xED1C014F, 0xCD8D65BB, 0xFDB7A257, | ||
// 0x09254899, 0xD699C7BC, 0x9019B6DC, 0x2B9022E4, | ||
// 0x8FA14956, 0x21BF9BD3, 0xB94D0943, 0x6FFDDC22, | ||
// ]; | ||
@@ -30,27 +30,33 @@ /* | ||
*/ | ||
var alpha_tab = [ | ||
1, 41, 139, 45, 46, 87, 226, 14, 60, 147, 116, 130, | ||
190, 80, 196, 69, 2, 82, 21, 90, 92, 174, 195, 28, | ||
120, 37, 232, 3, 123, 160, 135, 138, 4, 164, 42, 180, | ||
184, 91, 133, 56, 240, 74, 207, 6, 246, 63, 13, 19, | ||
8, 71, 84, 103, 111, 182, 9, 112, 223, 148, 157, 12, | ||
235, 126, 26, 38, 16, 142, 168, 206, 222, 107, 18, 224, | ||
189, 39, 57, 24, 213, 252, 52, 76, 32, 27, 79, 155, | ||
187, 214, 36, 191, 121, 78, 114, 48, 169, 247, 104, 152, | ||
64, 54, 158, 53, 117, 171, 72, 125, 242, 156, 228, 96, | ||
81, 237, 208, 47, 128, 108, 59, 106, 234, 85, 144, 250, | ||
227, 55, 199, 192, 162, 217, 159, 94, 256, 216, 118, 212, | ||
211, 170, 31, 243, 197, 110, 141, 127, 67, 177, 61, 188, | ||
255, 175, 236, 167, 165, 83, 62, 229, 137, 220, 25, 254, | ||
134, 97, 122, 119, 253, 93, 215, 77, 73, 166, 124, 201, | ||
17, 183, 50, 251, 11, 194, 244, 238, 249, 186, 173, 154, | ||
146, 75, 248, 145, 34, 109, 100, 245, 22, 131, 231, 219, | ||
241, 115, 89, 51, 35, 150, 239, 33, 68, 218, 200, 233, | ||
44, 5, 205, 181, 225, 230, 178, 102, 70, 43, 221, 66, | ||
136, 179, 143, 209, 88, 10, 153, 105, 193, 203, 99, 204, | ||
140, 86, 185, 132, 15, 101, 29, 161, 176, 20, 49, 210, | ||
129, 149, 198, 151, 23, 172, 113, 7, 30, 202, 58, 65, | ||
95, 40, 98, 163 | ||
1, 41, 139, 45, 46, 87, 226, 14, 60, 147, 116, 130, | ||
190, 80, 196, 69, 2, 82, 21, 90, 92, 174, 195, 28, | ||
120, 37, 232, 3, 123, 160, 135, 138, 4, 164, 42, 180, | ||
184, 91, 133, 56, 240, 74, 207, 6, 246, 63, 13, 19, | ||
8, 71, 84, 103, 111, 182, 9, 112, 223, 148, 157, 12, | ||
235, 126, 26, 38, 16, 142, 168, 206, 222, 107, 18, 224, | ||
189, 39, 57, 24, 213, 252, 52, 76, 32, 27, 79, 155, | ||
187, 214, 36, 191, 121, 78, 114, 48, 169, 247, 104, 152, | ||
64, 54, 158, 53, 117, 171, 72, 125, 242, 156, 228, 96, | ||
81, 237, 208, 47, 128, 108, 59, 106, 234, 85, 144, 250, | ||
227, 55, 199, 192, 162, 217, 159, 94, 256, 216, 118, 212, | ||
211, 170, 31, 243, 197, 110, 141, 127, 67, 177, 61, 188, | ||
255, 175, 236, 167, 165, 83, 62, 229, 137, 220, 25, 254, | ||
134, 97, 122, 119, 253, 93, 215, 77, 73, 166, 124, 201, | ||
17, 183, 50, 251, 11, 194, 244, 238, 249, 186, 173, 154, | ||
146, 75, 248, 145, 34, 109, 100, 245, 22, 131, 231, 219, | ||
241, 115, 89, 51, 35, 150, 239, 33, 68, 218, 200, 233, | ||
44, 5, 205, 181, 225, 230, 178, 102, 70, 43, 221, 66, | ||
136, 179, 143, 209, 88, 10, 153, 105, 193, 203, 99, 204, | ||
140, 86, 185, 132, 15, 101, 29, 161, 176, 20, 49, 210, | ||
129, 149, 198, 151, 23, 172, 113, 7, 30, 202, 58, 65, | ||
95, 40, 98, 163 | ||
]; | ||
// console.log(alpha_tab); | ||
//console.log(h.b64Encode(alpha_tab)); | ||
/* | ||
@@ -60,24 +66,24 @@ * beta^(255*i) mod 257 | ||
var yoff_b_n = [ | ||
1, 163, 98, 40, 95, 65, 58, 202, 30, 7, 113, 172, | ||
23, 151, 198, 149, 129, 210, 49, 20, 176, 161, 29, 101, | ||
15, 132, 185, 86, 140, 204, 99, 203, 193, 105, 153, 10, | ||
88, 209, 143, 179, 136, 66, 221, 43, 70, 102, 178, 230, | ||
225, 181, 205, 5, 44, 233, 200, 218, 68, 33, 239, 150, | ||
35, 51, 89, 115, 241, 219, 231, 131, 22, 245, 100, 109, | ||
34, 145, 248, 75, 146, 154, 173, 186, 249, 238, 244, 194, | ||
11, 251, 50, 183, 17, 201, 124, 166, 73, 77, 215, 93, | ||
253, 119, 122, 97, 134, 254, 25, 220, 137, 229, 62, 83, | ||
165, 167, 236, 175, 255, 188, 61, 177, 67, 127, 141, 110, | ||
197, 243, 31, 170, 211, 212, 118, 216, 256, 94, 159, 217, | ||
162, 192, 199, 55, 227, 250, 144, 85, 234, 106, 59, 108, | ||
128, 47, 208, 237, 81, 96, 228, 156, 242, 125, 72, 171, | ||
117, 53, 158, 54, 64, 152, 104, 247, 169, 48, 114, 78, | ||
121, 191, 36, 214, 187, 155, 79, 27, 32, 76, 52, 252, | ||
213, 24, 57, 39, 189, 224, 18, 107, 222, 206, 168, 142, | ||
16, 38, 26, 126, 235, 12, 157, 148, 223, 112, 9, 182, | ||
111, 103, 84, 71, 8, 19, 13, 63, 246, 6, 207, 74, | ||
240, 56, 133, 91, 184, 180, 42, 164, 4, 138, 135, 160, | ||
123, 3, 232, 37, 120, 28, 195, 174, 92, 90, 21, 82, | ||
2, 69, 196, 80, 190, 130, 116, 147, 60, 14, 226, 87, | ||
46, 45, 139, 41 | ||
1, 163, 98, 40, 95, 65, 58, 202, 30, 7, 113, 172, | ||
23, 151, 198, 149, 129, 210, 49, 20, 176, 161, 29, 101, | ||
15, 132, 185, 86, 140, 204, 99, 203, 193, 105, 153, 10, | ||
88, 209, 143, 179, 136, 66, 221, 43, 70, 102, 178, 230, | ||
225, 181, 205, 5, 44, 233, 200, 218, 68, 33, 239, 150, | ||
35, 51, 89, 115, 241, 219, 231, 131, 22, 245, 100, 109, | ||
34, 145, 248, 75, 146, 154, 173, 186, 249, 238, 244, 194, | ||
11, 251, 50, 183, 17, 201, 124, 166, 73, 77, 215, 93, | ||
253, 119, 122, 97, 134, 254, 25, 220, 137, 229, 62, 83, | ||
165, 167, 236, 175, 255, 188, 61, 177, 67, 127, 141, 110, | ||
197, 243, 31, 170, 211, 212, 118, 216, 256, 94, 159, 217, | ||
162, 192, 199, 55, 227, 250, 144, 85, 234, 106, 59, 108, | ||
128, 47, 208, 237, 81, 96, 228, 156, 242, 125, 72, 171, | ||
117, 53, 158, 54, 64, 152, 104, 247, 169, 48, 114, 78, | ||
121, 191, 36, 214, 187, 155, 79, 27, 32, 76, 52, 252, | ||
213, 24, 57, 39, 189, 224, 18, 107, 222, 206, 168, 142, | ||
16, 38, 26, 126, 235, 12, 157, 148, 223, 112, 9, 182, | ||
111, 103, 84, 71, 8, 19, 13, 63, 246, 6, 207, 74, | ||
240, 56, 133, 91, 184, 180, 42, 164, 4, 138, 135, 160, | ||
123, 3, 232, 37, 120, 28, 195, 174, 92, 90, 21, 82, | ||
2, 69, 196, 80, 190, 130, 116, 147, 60, 14, 226, 87, | ||
46, 45, 139, 41 | ||
]; | ||
@@ -89,269 +95,189 @@ | ||
var yoff_b_f = [ | ||
2, 203, 156, 47, 118, 214, 107, 106, 45, 93, 212, 20, | ||
111, 73, 162, 251, 97, 215, 249, 53, 211, 19, 3, 89, | ||
49, 207, 101, 67, 151, 130, 223, 23, 189, 202, 178, 239, | ||
253, 127, 204, 49, 76, 236, 82, 137, 232, 157, 65, 79, | ||
96, 161, 176, 130, 161, 30, 47, 9, 189, 247, 61, 226, | ||
248, 90, 107, 64, 0, 88, 131, 243, 133, 59, 113, 115, | ||
17, 236, 33, 213, 12, 191, 111, 19, 251, 61, 103, 208, | ||
57, 35, 148, 248, 47, 116, 65, 119, 249, 178, 143, 40, | ||
189, 129, 8, 163, 204, 227, 230, 196, 205, 122, 151, 45, | ||
187, 19, 227, 72, 247, 125, 111, 121, 140, 220, 6, 107, | ||
77, 69, 10, 101, 21, 65, 149, 171, 255, 54, 101, 210, | ||
139, 43, 150, 151, 212, 164, 45, 237, 146, 184, 95, 6, | ||
160, 42, 8, 204, 46, 238, 254, 168, 208, 50, 156, 190, | ||
106, 127, 34, 234, 68, 55, 79, 18, 4, 130, 53, 208, | ||
181, 21, 175, 120, 25, 100, 192, 178, 161, 96, 81, 127, | ||
96, 227, 210, 248, 68, 10, 196, 31, 9, 167, 150, 193, | ||
0, 169, 126, 14, 124, 198, 144, 142, 240, 21, 224, 44, | ||
245, 66, 146, 238, 6, 196, 154, 49, 200, 222, 109, 9, | ||
210, 141, 192, 138, 8, 79, 114, 217, 68, 128, 249, 94, | ||
53, 30, 27, 61, 52, 135, 106, 212, 70, 238, 30, 185, | ||
10, 132, 146, 136, 117, 37, 251, 150, 180, 188, 247, 156, | ||
236, 192, 108, 86 | ||
2, 203, 156, 47, 118, 214, 107, 106, 45, 93, 212, 20, | ||
111, 73, 162, 251, 97, 215, 249, 53, 211, 19, 3, 89, | ||
49, 207, 101, 67, 151, 130, 223, 23, 189, 202, 178, 239, | ||
253, 127, 204, 49, 76, 236, 82, 137, 232, 157, 65, 79, | ||
96, 161, 176, 130, 161, 30, 47, 9, 189, 247, 61, 226, | ||
248, 90, 107, 64, 0, 88, 131, 243, 133, 59, 113, 115, | ||
17, 236, 33, 213, 12, 191, 111, 19, 251, 61, 103, 208, | ||
57, 35, 148, 248, 47, 116, 65, 119, 249, 178, 143, 40, | ||
189, 129, 8, 163, 204, 227, 230, 196, 205, 122, 151, 45, | ||
187, 19, 227, 72, 247, 125, 111, 121, 140, 220, 6, 107, | ||
77, 69, 10, 101, 21, 65, 149, 171, 255, 54, 101, 210, | ||
139, 43, 150, 151, 212, 164, 45, 237, 146, 184, 95, 6, | ||
160, 42, 8, 204, 46, 238, 254, 168, 208, 50, 156, 190, | ||
106, 127, 34, 234, 68, 55, 79, 18, 4, 130, 53, 208, | ||
181, 21, 175, 120, 25, 100, 192, 178, 161, 96, 81, 127, | ||
96, 227, 210, 248, 68, 10, 196, 31, 9, 167, 150, 193, | ||
0, 169, 126, 14, 124, 198, 144, 142, 240, 21, 224, 44, | ||
245, 66, 146, 238, 6, 196, 154, 49, 200, 222, 109, 9, | ||
210, 141, 192, 138, 8, 79, 114, 217, 68, 128, 249, 94, | ||
53, 30, 27, 61, 52, 135, 106, 212, 70, 238, 30, 185, | ||
10, 132, 146, 136, 117, 37, 251, 150, 180, 188, 247, 156, | ||
236, 192, 108, 86 | ||
]; | ||
var WB_DATA = [ | ||
[ | ||
[4, 0, 1, 185], | ||
[6, 0, 1, 185], | ||
[0, 0, 1, 185], | ||
[2, 0, 1, 185], | ||
[7, 0, 1, 185], | ||
[5, 0, 1, 185], | ||
[3, 0, 1, 185], | ||
[1, 0, 1, 185] | ||
], | ||
[ | ||
[15, 0, 1, 185], | ||
[11, 0, 1, 185], | ||
[12, 0, 1, 185], | ||
[8, 0, 1, 185], | ||
[9, 0, 1, 185], | ||
[13, 0, 1, 185], | ||
[10, 0, 1, 185], | ||
[14, 0, 1, 185] | ||
], | ||
[ | ||
[17, -256, -128, 233], | ||
[18, -256, -128, 233], | ||
[23, -256, -128, 233], | ||
[20, -256, -128, 233], | ||
[22, -256, -128, 233], | ||
[21, -256, -128, 233], | ||
[16, -256, -128, 233], | ||
[19, -256, -128, 233] | ||
], | ||
[ | ||
[30, -383, -255, 233], | ||
[24, -383, -255, 233], | ||
[25, -383, -255, 233], | ||
[31, -383, -255, 233], | ||
[27, -383, -255, 233], | ||
[29, -383, -255, 233], | ||
[28, -383, -255, 233], | ||
[26, -383, -255, 233] | ||
] | ||
[ | ||
[4, 0, 1, 185], | ||
[6, 0, 1, 185], | ||
[0, 0, 1, 185], | ||
[2, 0, 1, 185], | ||
[7, 0, 1, 185], | ||
[5, 0, 1, 185], | ||
[3, 0, 1, 185], | ||
[1, 0, 1, 185] | ||
], | ||
[ | ||
[15, 0, 1, 185], | ||
[11, 0, 1, 185], | ||
[12, 0, 1, 185], | ||
[8, 0, 1, 185], | ||
[9, 0, 1, 185], | ||
[13, 0, 1, 185], | ||
[10, 0, 1, 185], | ||
[14, 0, 1, 185] | ||
], | ||
[ | ||
[17, -256, -128, 233], | ||
[18, -256, -128, 233], | ||
[23, -256, -128, 233], | ||
[20, -256, -128, 233], | ||
[22, -256, -128, 233], | ||
[21, -256, -128, 233], | ||
[16, -256, -128, 233], | ||
[19, -256, -128, 233] | ||
], | ||
[ | ||
[30, -383, -255, 233], | ||
[24, -383, -255, 233], | ||
[25, -383, -255, 233], | ||
[31, -383, -255, 233], | ||
[27, -383, -255, 233], | ||
[29, -383, -255, 233], | ||
[28, -383, -255, 233], | ||
[26, -383, -255, 233] | ||
] | ||
]; | ||
var REDS1 = function(x) { | ||
return (((x) & 0xFF) - ((x) >> 8)); | ||
} | ||
return ((x & 0xFF) - (x >> 8)); | ||
}; | ||
var REDS2 = function(x) { | ||
return (((x) & 0xFFFF) + ((x) >> 16)); | ||
} | ||
return ((x & 0xFFFF) + (x >> 16)); | ||
}; | ||
var IF = function(x, y, z) { | ||
return ((((y) ^ (z)) & (x)) ^ (z)); | ||
} | ||
return ((y ^ z) & x) ^ (z); | ||
}; | ||
var MAJ = function(x, y, z) { | ||
return (((x) & (y)) | (((x) | (y)) & (z))); | ||
} | ||
return (x & y) | ((x | y) & (z)); | ||
}; | ||
var FFT_LOOP = function(q, qOffset, hk, as) { | ||
var u, v; | ||
var m = q[(qOffset)]; | ||
var n = q[(qOffset) + (hk)]; | ||
q[(qOffset)] = m + n; | ||
q[(qOffset) + (hk)] = m - n; | ||
u = v = 0; | ||
var firstTime = true; | ||
for (; u < (hk); u += 4, v += 4 * (as)) { | ||
if (!firstTime) { | ||
var t; | ||
m = q[(qOffset) + u + 0]; | ||
n = q[(qOffset) + u + 0 + (hk)]; | ||
t = REDS2(n * alpha_tab[v + 0 * (as)]); | ||
q[(qOffset) + u + 0] = m + t; | ||
q[(qOffset) + u + 0 + (hk)] = m - t; | ||
var u, v; | ||
var m = q[(qOffset)]; | ||
var n = q[(qOffset) + (hk)]; | ||
q[(qOffset)] = m + n; | ||
q[(qOffset) + (hk)] = m - n; | ||
u = v = 0; | ||
var firstTime = true; | ||
for (; u < (hk); u += 4, v += 4 * (as)) { | ||
if (!firstTime) { | ||
var t; | ||
m = q[(qOffset) + u + 0]; | ||
n = q[(qOffset) + u + 0 + (hk)]; | ||
t = REDS2(n * alpha_tab[v + 0 * (as)]); | ||
q[(qOffset) + u + 0] = m + t; | ||
q[(qOffset) + u + 0 + (hk)] = m - t; | ||
} | ||
else { | ||
firstTime = false; | ||
} | ||
m = q[(qOffset) + u + 1]; | ||
n = q[(qOffset) + u + 1 + (hk)]; | ||
t = REDS2(n * alpha_tab[v + Number(as)]); | ||
q[(qOffset) + u + 1] = m + t; | ||
q[(qOffset) + u + 1 + (hk)] = m - t; | ||
m = q[(qOffset) + u + 2]; | ||
n = q[(qOffset) + u + 2 + (hk)]; | ||
t = REDS2(n * alpha_tab[v + 2 * (as)]); | ||
q[(qOffset) + u + 2] = m + t; | ||
q[(qOffset) + u + 2 + (hk)] = m - t; | ||
m = q[(qOffset) + u + 3]; | ||
n = q[(qOffset) + u + 3 + (hk)]; | ||
t = REDS2(n * alpha_tab[v + 3 * (as)]); | ||
q[(qOffset) + u + 3] = m + t; | ||
q[(qOffset) + u + 3 + (hk)] = m - t; | ||
} | ||
else { | ||
firstTime = false; | ||
} | ||
m = q[(qOffset) + u + 1]; | ||
n = q[(qOffset) + u + 1 + (hk)]; | ||
t = REDS2(n * alpha_tab[v + 1 * (as)]); | ||
q[(qOffset) + u + 1] = m + t; | ||
q[(qOffset) + u + 1 + (hk)] = m - t; | ||
m = q[(qOffset) + u + 2]; | ||
n = q[(qOffset) + u + 2 + (hk)]; | ||
t = REDS2(n * alpha_tab[v + 2 * (as)]); | ||
q[(qOffset) + u + 2] = m + t; | ||
q[(qOffset) + u + 2 + (hk)] = m - t; | ||
m = q[(qOffset) + u + 3]; | ||
n = q[(qOffset) + u + 3 + (hk)]; | ||
t = REDS2(n * alpha_tab[v + 3 * (as)]); | ||
q[(qOffset) + u + 3] = m + t; | ||
q[(qOffset) + u + 3 + (hk)] = m - t; | ||
} | ||
} | ||
}; | ||
var FFT8 = function(x, xOffset, xs, d) { | ||
var x0 = x[(xOffset)]; | ||
var x1 = x[(xOffset) + (xs)]; | ||
var x2 = x[(xOffset) + 2 * (xs)]; | ||
var x3 = x[(xOffset) + 3 * (xs)]; | ||
var a0 = x0 + x2; | ||
var a1 = x0 + (x2 << 4); | ||
var a2 = x0 - x2; | ||
var a3 = x0 - (x2 << 4); | ||
var b0 = x1 + x3; | ||
var b1 = REDS1((x1 << 2) + (x3 << 6)); | ||
var b2 = (x1 << 4) - (x3 << 4); | ||
var b3 = REDS1((x1 << 6) + (x3 << 2)); | ||
d[0] = a0 + b0; | ||
d[1] = a1 + b1; | ||
d[2] = a2 + b2; | ||
d[3] = a3 + b3; | ||
d[4] = a0 - b0; | ||
d[5] = a1 - b1; | ||
d[6] = a2 - b2; | ||
d[7] = a3 - b3; | ||
} | ||
var x0 = x[(xOffset)]; | ||
var x1 = x[(xOffset) + (xs)]; | ||
var x2 = x[(xOffset) + 2 * (xs)]; | ||
var x3 = x[(xOffset) + 3 * (xs)]; | ||
var a0 = x0 + x2; | ||
var a1 = x0 + (x2 << 4); | ||
var a2 = x0 - x2; | ||
var a3 = x0 - (x2 << 4); | ||
var b0 = x1 + x3; | ||
var b1 = REDS1((x1 << 2) + (x3 << 6)); | ||
var b2 = (x1 << 4) - (x3 << 4); | ||
var b3 = REDS1((x1 << 6) + (x3 << 2)); | ||
d[0] = a0 + b0; | ||
d[1] = a1 + b1; | ||
d[2] = a2 + b2; | ||
d[3] = a3 + b3; | ||
d[4] = a0 - b0; | ||
d[5] = a1 - b1; | ||
d[6] = a2 - b2; | ||
d[7] = a3 - b3; | ||
}; | ||
var FFT16 = function(x, xOffset, q, qOffset, xs) { | ||
var d1 = new Array(8); | ||
var d2 = new Array(8); | ||
FFT8(x, xOffset, (xs) << 1, d1); | ||
FFT8(x, (xOffset) + (xs), (xs) << 1, d2); | ||
q[(qOffset) + 0] = d1[0] + d2[0]; | ||
q[(qOffset) + 1] = d1[1] + (d2[1] << 1); | ||
q[(qOffset) + 2] = d1[2] + (d2[2] << 2); | ||
q[(qOffset) + 3] = d1[3] + (d2[3] << 3); | ||
q[(qOffset) + 4] = d1[4] + (d2[4] << 4); | ||
q[(qOffset) + 5] = d1[5] + (d2[5] << 5); | ||
q[(qOffset) + 6] = d1[6] + (d2[6] << 6); | ||
q[(qOffset) + 7] = d1[7] + (d2[7] << 7); | ||
q[(qOffset) + 8] = d1[0] - d2[0]; | ||
q[(qOffset) + 9] = d1[1] - (d2[1] << 1); | ||
q[(qOffset) + 10] = d1[2] - (d2[2] << 2); | ||
q[(qOffset) + 11] = d1[3] - (d2[3] << 3); | ||
q[(qOffset) + 12] = d1[4] - (d2[4] << 4); | ||
q[(qOffset) + 13] = d1[5] - (d2[5] << 5); | ||
q[(qOffset) + 14] = d1[6] - (d2[6] << 6); | ||
q[(qOffset) + 15] = d1[7] - (d2[7] << 7); | ||
} | ||
var d1 = new Array(8); | ||
var d2 = new Array(8); | ||
FFT8(x, xOffset, (xs) << 1, d1); | ||
FFT8(x, (xOffset) + (xs), (xs) << 1, d2); | ||
for (var i = 0;i<8;i++) { | ||
q[(qOffset) + i] = d1[i] + (d2[i] << i); | ||
} | ||
for (var i = 0;i<8;i++) { | ||
q[(qOffset) + 8 + i] = d1[i] - (d2[i] << i); | ||
} | ||
}; | ||
var FFT32 = function(x, xOffset, q, qOffset, xs) { | ||
var xd = xs << 1; | ||
FFT16(x, xOffset, q, qOffset, xd); | ||
FFT16(x, xOffset + xs, q, qOffset + 16, xd); | ||
FFT_LOOP(q, qOffset, 16, 8); | ||
} | ||
var xd = xs << 1; | ||
FFT16(x, xOffset, q, qOffset, xd); | ||
FFT16(x, xOffset + xs, q, qOffset + 16, xd); | ||
FFT_LOOP(q, qOffset, 16, 8); | ||
}; | ||
var FFT64 = function(x, xOffset, q, qOffset, xs) { | ||
var xd = xs << 1; | ||
FFT32(x, xOffset, q, qOffset, xd); | ||
FFT32(x, xOffset + xs, q, qOffset + 32, xd); | ||
FFT_LOOP(q, qOffset, 32, 4); | ||
} | ||
var xd = xs << 1; | ||
FFT32(x, xOffset, q, qOffset, xd); | ||
FFT32(x, xOffset + xs, q, qOffset + 32, xd); | ||
FFT_LOOP(q, qOffset, 32, 4); | ||
}; | ||
var FFT256 = function(x, xOffset, q, qOffset, xs) { | ||
FFT64(x, xOffset, q, qOffset, (xs) << 2); | ||
FFT64(x, (xOffset) + ((xs) * 2), q, qOffset + 64, (xs) << 2); | ||
FFT_LOOP(q, qOffset, 64, 2); | ||
FFT64(x, (xOffset) + ((xs) * 1), q, qOffset + 128, (xs) << 2); | ||
FFT64(x, (xOffset) + ((xs) * 3), q, qOffset + 192, (xs) << 2); | ||
FFT_LOOP(q, qOffset + 128, 64, 2); | ||
FFT_LOOP(q, qOffset, 128, 1); | ||
} | ||
FFT64(x, xOffset, q, qOffset, (xs) << 2); | ||
FFT64(x, (xOffset) + ((xs) * 2), q, qOffset + 64, (xs) << 2); | ||
FFT_LOOP(q, qOffset, 64, 2); | ||
FFT64(x, (xOffset) + (Number(xs)), q, qOffset + 128, (xs) << 2); | ||
FFT64(x, (xOffset) + ((xs) * 3), q, qOffset + 192, (xs) << 2); | ||
FFT_LOOP(q, qOffset + 128, 64, 2); | ||
FFT_LOOP(q, qOffset, 128, 1); | ||
}; | ||
var READ_STATES = function(A, B, C, D, states) { | ||
A[0] = states[0]; | ||
A[1] = states[1]; | ||
A[2] = states[2]; | ||
A[3] = states[3]; | ||
A[4] = states[4]; | ||
A[5] = states[5]; | ||
A[6] = states[6]; | ||
A[7] = states[7]; | ||
B[0] = states[8]; | ||
B[1] = states[9]; | ||
B[2] = states[10]; | ||
B[3] = states[11]; | ||
B[4] = states[12]; | ||
B[5] = states[13]; | ||
B[6] = states[14]; | ||
B[7] = states[15]; | ||
C[0] = states[16]; | ||
C[1] = states[17]; | ||
C[2] = states[18]; | ||
C[3] = states[19]; | ||
C[4] = states[20]; | ||
C[5] = states[21]; | ||
C[6] = states[22]; | ||
C[7] = states[23]; | ||
D[0] = states[24]; | ||
D[1] = states[25]; | ||
D[2] = states[26]; | ||
D[3] = states[27]; | ||
D[4] = states[28]; | ||
D[5] = states[29]; | ||
D[6] = states[30]; | ||
D[7] = states[31]; | ||
} | ||
var WRITE_STATES = function(A, B, C, D, states) { | ||
states[0] = A[0]; | ||
states[1] = A[1]; | ||
states[2] = A[2]; | ||
states[3] = A[3]; | ||
states[4] = A[4]; | ||
states[5] = A[5]; | ||
states[6] = A[6]; | ||
states[7] = A[7]; | ||
states[8] = B[0]; | ||
states[9] = B[1]; | ||
states[10] = B[2]; | ||
states[11] = B[3]; | ||
states[12] = B[4]; | ||
states[13] = B[5]; | ||
states[14] = B[6]; | ||
states[15] = B[7]; | ||
states[16] = C[0]; | ||
states[17] = C[1]; | ||
states[18] = C[2]; | ||
states[19] = C[3]; | ||
states[20] = C[4]; | ||
states[21] = C[5]; | ||
states[22] = C[6]; | ||
states[23] = C[7]; | ||
states[24] = D[0]; | ||
states[25] = D[1]; | ||
states[26] = D[2]; | ||
states[27] = D[3]; | ||
states[28] = D[4]; | ||
states[29] = D[5]; | ||
states[30] = D[6]; | ||
states[31] = D[7]; | ||
} | ||
var PP8 = [ | ||
[1, 0, 3, 2, 5, 4, 7, 6], | ||
[6, 7, 4, 5, 2, 3, 0, 1], | ||
[2, 3, 0, 1, 6, 7, 4, 5], | ||
[3, 2, 1, 0, 7, 6, 5, 4], | ||
[5, 4, 7, 6, 1, 0, 3, 2], | ||
[7, 6, 5, 4, 3, 2, 1, 0], | ||
[4, 5, 6, 7, 0, 1, 2, 3] | ||
[1, 0, 3, 2, 5, 4, 7, 6], | ||
[6, 7, 4, 5, 2, 3, 0, 1], | ||
[2, 3, 0, 1, 6, 7, 4, 5], | ||
[3, 2, 1, 0, 7, 6, 5, 4], | ||
[5, 4, 7, 6, 1, 0, 3, 2], | ||
[7, 6, 5, 4, 3, 2, 1, 0], | ||
[4, 5, 6, 7, 0, 1, 2, 3] | ||
]; | ||
@@ -361,205 +287,194 @@ | ||
var M7 = [ | ||
[0, 1, 2, 3], | ||
[1, 2, 3, 4], | ||
[2, 3, 4, 5], | ||
[3, 4, 5, 6], | ||
[4, 5, 6, 0], | ||
[5, 6, 0, 1], | ||
[6, 0, 1, 2], | ||
[0, 1, 2, 3] | ||
[0, 1, 2, 3], | ||
[1, 2, 3, 4], | ||
[2, 3, 4, 5], | ||
[3, 4, 5, 6], | ||
[4, 5, 6, 0], | ||
[5, 6, 0, 1], | ||
[6, 0, 1, 2], | ||
[0, 1, 2, 3] | ||
]; | ||
var INNER = function(l, h, mm) { | ||
return (((l * mm) & 0xFFFF) + ((h * mm) << 16)); | ||
} | ||
return (((l * mm) & 0xFFFF) + ((h * mm) << 16)); | ||
}; | ||
var W_BIG = function(sb, o1, o2, mm, q) { | ||
var r = new Array(8); | ||
r[0] = INNER(q[16 * (sb) + 2 * 0 + o1], q[16 * (sb) + 2 * 0 + o2], mm); | ||
r[1] = INNER(q[16 * (sb) + 2 * 1 + o1], q[16 * (sb) + 2 * 1 + o2], mm); | ||
r[2] = INNER(q[16 * (sb) + 2 * 2 + o1], q[16 * (sb) + 2 * 2 + o2], mm); | ||
r[3] = INNER(q[16 * (sb) + 2 * 3 + o1], q[16 * (sb) + 2 * 3 + o2], mm); | ||
r[4] = INNER(q[16 * (sb) + 2 * 4 + o1], q[16 * (sb) + 2 * 4 + o2], mm); | ||
r[5] = INNER(q[16 * (sb) + 2 * 5 + o1], q[16 * (sb) + 2 * 5 + o2], mm); | ||
r[6] = INNER(q[16 * (sb) + 2 * 6 + o1], q[16 * (sb) + 2 * 6 + o2], mm); | ||
r[7] = INNER(q[16 * (sb) + 2 * 7 + o1], q[16 * (sb) + 2 * 7 + o2], mm); | ||
return r; | ||
} | ||
var r = new Array(8); | ||
for (var i = 0;i<8;i++) { | ||
r[i] = INNER(q[16 * (sb) + 2 * i + o1], q[16 * (sb) + 2 * i + o2], mm); | ||
} | ||
return r; | ||
}; | ||
var WB = function(x, y, q) { | ||
var wb = WB_DATA[x][y]; | ||
return W_BIG(wb[0], wb[1], wb[2], wb[3], q); | ||
} | ||
var wb = WB_DATA[x][y]; | ||
return W_BIG(wb[0], wb[1], wb[2], wb[3], q); | ||
}; | ||
var STEP_ELT = function(n, w, fun, s, ppb, tA, A, B, C, D) { | ||
var tt = op.t32(D[n] + (w) + fun(A[n], B[n], C[n])); | ||
A[n] = op.t32(op.rotl32(tt, s) + tA[ppb[n]]); | ||
D[n] = C[n]; | ||
C[n] = B[n]; | ||
B[n] = tA[n]; | ||
var tt = op.t32(D[n] + (w) + fun(A[n], B[n], C[n])); | ||
A[n] = op.t32(op.rotl32(tt, s) + tA[ppb[n]]); | ||
D[n] = C[n]; | ||
C[n] = B[n]; | ||
B[n] = tA[n]; | ||
}; | ||
var STEP_BIG = function(w, fun, r, s, pp8b, A, B, C, D) { | ||
var tA = new Array(8); | ||
tA[0] = op.rotl32(A[0], r); | ||
tA[1] = op.rotl32(A[1], r); | ||
tA[2] = op.rotl32(A[2], r); | ||
tA[3] = op.rotl32(A[3], r); | ||
tA[4] = op.rotl32(A[4], r); | ||
tA[5] = op.rotl32(A[5], r); | ||
tA[6] = op.rotl32(A[6], r); | ||
tA[7] = op.rotl32(A[7], r); | ||
STEP_ELT(0, w[0], fun, s, pp8b, tA, A, B, C, D); | ||
STEP_ELT(1, w[1], fun, s, pp8b, tA, A, B, C, D); | ||
STEP_ELT(2, w[2], fun, s, pp8b, tA, A, B, C, D); | ||
STEP_ELT(3, w[3], fun, s, pp8b, tA, A, B, C, D); | ||
STEP_ELT(4, w[4], fun, s, pp8b, tA, A, B, C, D); | ||
STEP_ELT(5, w[5], fun, s, pp8b, tA, A, B, C, D); | ||
STEP_ELT(6, w[6], fun, s, pp8b, tA, A, B, C, D); | ||
STEP_ELT(7, w[7], fun, s, pp8b, tA, A, B, C, D); | ||
} | ||
var tA = new Array(8); | ||
for (var i = 0;i<8;i++) { | ||
tA[i] = op.rotl32(A[i], r); | ||
} | ||
for (var i = 0;i<8;i++) { | ||
STEP_ELT(i, w[i], fun, s, pp8b, tA, A, B, C, D); | ||
} | ||
}; | ||
var ONE_ROUND_BIG = function(ri, isp, p0, p1, p2, p3, A, B, C, D, q) { | ||
STEP_BIG(WB(ri, 0, q), IF, p0, p1, PP8[M7[0][isp]], A, B, C, D); | ||
STEP_BIG(WB(ri, 1, q), IF, p1, p2, PP8[M7[1][isp]], A, B, C, D); | ||
STEP_BIG(WB(ri, 2, q), IF, p2, p3, PP8[M7[2][isp]], A, B, C, D); | ||
STEP_BIG(WB(ri, 3, q), IF, p3, p0, PP8[M7[3][isp]], A, B, C, D); | ||
STEP_BIG(WB(ri, 4, q), MAJ, p0, p1, PP8[M7[4][isp]], A, B, C, D); | ||
STEP_BIG(WB(ri, 5, q), MAJ, p1, p2, PP8[M7[5][isp]], A, B, C, D); | ||
STEP_BIG(WB(ri, 6, q), MAJ, p2, p3, PP8[M7[6][isp]], A, B, C, D); | ||
STEP_BIG(WB(ri, 7, q), MAJ, p3, p0, PP8[M7[7][isp]], A, B, C, D); | ||
} | ||
STEP_BIG(WB(ri, 0, q), IF, p0, p1, PP8[M7[0][isp]], A, B, C, D); | ||
STEP_BIG(WB(ri, 1, q), IF, p1, p2, PP8[M7[1][isp]], A, B, C, D); | ||
STEP_BIG(WB(ri, 2, q), IF, p2, p3, PP8[M7[2][isp]], A, B, C, D); | ||
STEP_BIG(WB(ri, 3, q), IF, p3, p0, PP8[M7[3][isp]], A, B, C, D); | ||
STEP_BIG(WB(ri, 4, q), MAJ, p0, p1, PP8[M7[4][isp]], A, B, C, D); | ||
STEP_BIG(WB(ri, 5, q), MAJ, p1, p2, PP8[M7[5][isp]], A, B, C, D); | ||
STEP_BIG(WB(ri, 6, q), MAJ, p2, p3, PP8[M7[6][isp]], A, B, C, D); | ||
STEP_BIG(WB(ri, 7, q), MAJ, p3, p0, PP8[M7[7][isp]], A, B, C, D); | ||
}; | ||
var compress = function(ctx, last) { | ||
var q = new Array(256); | ||
var i; | ||
var A = new Array(8); | ||
var B = new Array(8); | ||
var C = new Array(8); | ||
var D = new Array(8); | ||
FFT256(ctx.buffer, 0, q, 0, 1); | ||
if (last) { | ||
for (i = 0; i < 256; i++) { | ||
var tq; | ||
var q = new Array(256); | ||
var i; | ||
var A = new Array(8); | ||
var B = new Array(8); | ||
var C = new Array(8); | ||
var D = new Array(8); | ||
FFT256(ctx.buffer, 0, q, 0, 1); | ||
if (last) { | ||
for (i = 0; i < 256; i++) { | ||
var tq; | ||
tq = q[i] + yoff_b_f[i]; | ||
tq = REDS2(tq); | ||
tq = REDS1(tq); | ||
tq = REDS1(tq); | ||
q[i] = (tq <= 128 ? tq : tq - 257); | ||
tq = q[i] + yoff_b_f[i]; | ||
tq = REDS2(tq); | ||
tq = REDS1(tq); | ||
tq = REDS1(tq); | ||
q[i] = (tq <= 128 ? tq : tq - 257); | ||
} | ||
} | ||
} | ||
else { | ||
for (i = 0; i < 256; i++) { | ||
var tq; | ||
else { | ||
for (i = 0; i < 256; i++) { | ||
var tq; | ||
tq = q[i] + yoff_b_n[i]; | ||
tq = REDS2(tq); | ||
tq = REDS1(tq); | ||
tq = REDS1(tq); | ||
q[i] = (tq <= 128 ? tq : tq - 257); | ||
tq = q[i] + yoff_b_n[i]; | ||
tq = REDS2(tq); | ||
tq = REDS1(tq); | ||
tq = REDS1(tq); | ||
q[i] = (tq <= 128 ? tq : tq - 257); | ||
} | ||
} | ||
} | ||
READ_STATES(A, B, C, D, ctx.state); | ||
var x = op.swap32Array(h.bytes2Int32Buffer(ctx.buffer)); | ||
op.bufferXORInsert(A,0,x,0,8); | ||
op.bufferXORInsert(B,0,x,8,8); | ||
op.bufferXORInsert(C,0,x,16,8); | ||
op.bufferXORInsert(D,0,x,24,8); | ||
op.bufferInsert(A,0,ctx.state,8); | ||
op.bufferInsert(B,0,ctx.state,8,8); | ||
op.bufferInsert(C,0,ctx.state,8,16); | ||
op.bufferInsert(D,0,ctx.state,8,24); | ||
var x = op.swap32Array(h.bytes2Int32Buffer(ctx.buffer)); | ||
op.bufferXORInsert(A,0,x,0,8); | ||
op.bufferXORInsert(B,0,x,8,8); | ||
op.bufferXORInsert(C,0,x,16,8); | ||
op.bufferXORInsert(D,0,x,24,8); | ||
ONE_ROUND_BIG(0, 0, 3, 23, 17, 27, A, B, C, D, q); | ||
ONE_ROUND_BIG(1, 1, 28, 19, 22, 7, A, B, C, D, q); | ||
ONE_ROUND_BIG(2, 2, 29, 9, 15, 5, A, B, C, D, q); | ||
ONE_ROUND_BIG(3, 3, 4, 13, 10, 25, A, B, C, D, q); | ||
ONE_ROUND_BIG(0, 0, 3, 23, 17, 27, A, B, C, D, q); | ||
ONE_ROUND_BIG(1, 1, 28, 19, 22, 7, A, B, C, D, q); | ||
ONE_ROUND_BIG(2, 2, 29, 9, 15, 5, A, B, C, D, q); | ||
ONE_ROUND_BIG(3, 3, 4, 13, 10, 25, A, B, C, D, q); | ||
STEP_BIG(ctx.state.slice(0, 8),IF, 4, 13, PP8[4],A,B,C,D); | ||
STEP_BIG(ctx.state.slice(8, 16),IF, 13, 10, PP8[5],A,B,C,D); | ||
STEP_BIG(ctx.state.slice(16, 24),IF, 10, 25, PP8[6],A,B,C,D); | ||
STEP_BIG(ctx.state.slice(24, 32),IF, 25, 4, PP8[0],A,B,C,D); | ||
WRITE_STATES(A, B, C, D, ctx.state); | ||
} | ||
STEP_BIG(ctx.state.slice(0, 8),IF, 4, 13, PP8[4],A,B,C,D); | ||
STEP_BIG(ctx.state.slice(8, 16),IF, 13, 10, PP8[5],A,B,C,D); | ||
STEP_BIG(ctx.state.slice(16, 24),IF, 10, 25, PP8[6],A,B,C,D); | ||
STEP_BIG(ctx.state.slice(24, 32),IF, 25, 4, PP8[0],A,B,C,D); | ||
op.bufferInsert(ctx.state,0,A,8); | ||
op.bufferInsert(ctx.state,8,B,8); | ||
op.bufferInsert(ctx.state,16,C,8); | ||
op.bufferInsert(ctx.state,24,D,8); | ||
}; | ||
var simd = function(ctx, data) { | ||
var len = data.length; | ||
while (len > 0) { | ||
var clen = ctx.buffer.length - ctx.ptr; | ||
if (clen > len) clen = len; | ||
op.bufferInsert(ctx.buffer, ctx.ptr, data, clen); | ||
ctx.ptr += clen; | ||
data = data.slice(clen); | ||
len -= clen; | ||
if (ctx.ptr === ctx.buffer.length) { | ||
compress(ctx, 0); | ||
ctx.ptr = 0; | ||
ctx.countLow = op.t32(ctx.countLow + 1); | ||
if (ctx.countLow == 0) | ||
ctx.countHigh++; | ||
var len = data.length; | ||
while (len > 0) { | ||
var clen = ctx.buffer.length - ctx.ptr; | ||
if (clen > len) clen = len; | ||
op.bufferInsert(ctx.buffer, ctx.ptr, data, clen); | ||
ctx.ptr += clen; | ||
data = data.slice(clen); | ||
len -= clen; | ||
if (ctx.ptr === ctx.buffer.length) { | ||
compress(ctx, 0); | ||
ctx.ptr = 0; | ||
ctx.countLow = op.t32(ctx.countLow + 1); | ||
if (ctx.countLow === 0) ctx.countHigh++; | ||
} | ||
} | ||
} | ||
} | ||
}; | ||
var encode_count = function(dst, offset, low, high, ptr, n) { | ||
low = op.t32(low << 10); | ||
high = op.t32(high << 10) + (low >> 22); | ||
low += (ptr << 3) + n; | ||
dst[offset] = low & 0xFF; | ||
dst[offset + 1] = (low & 0xFF00) >>> 8; | ||
dst[offset + 2] = (low & 0xFF0000) >>> 8; | ||
dst[offset + 3] = (low & 0xFF000000) >>> 8; | ||
dst[offset + 4] = high & 0xFF; | ||
dst[offset + 5] = (high & 0xFF00) >>> 8; | ||
dst[offset + 6] = (high & 0xFF0000) >>> 8; | ||
dst[offset + 7] = (high & 0xFF000000) >>> 8; | ||
} | ||
low = op.t32(low << 10); | ||
high = op.t32(high << 10) + (low >> 22); | ||
low += (ptr << 3) + n; | ||
dst[offset] = low & 0xFF; | ||
dst[offset + 1] = (low & 0xFF00) >>> 8; | ||
dst[offset + 2] = (low & 0xFF0000) >>> 8; | ||
dst[offset + 3] = (low & 0xFF000000) >>> 8; | ||
dst[offset + 4] = high & 0xFF; | ||
dst[offset + 5] = (high & 0xFF00) >>> 8; | ||
dst[offset + 6] = (high & 0xFF0000) >>> 8; | ||
dst[offset + 7] = (high & 0xFF000000) >>> 8; | ||
}; | ||
var simdClose = function(ctx, ub, n) { | ||
var buf = ctx.buffer; | ||
var ptr = ctx.ptr; | ||
var d; | ||
var u; | ||
var buf = ctx.buffer; | ||
var ptr = ctx.ptr; | ||
var d; | ||
var u; | ||
if (ctx.ptr > 0 || n > 0) { | ||
op.bufferSet(buf, ptr, 0, buf.length - ptr); | ||
buf[ptr] = ub & (0xFF << (8 - n)); | ||
compress(ctx, 0); | ||
} | ||
op.bufferSet(buf, 0, 0, buf.length); | ||
encode_count(buf, 0, ctx.countLow, ctx.countHigh, ctx.ptr, n); | ||
compress(ctx, 1); | ||
var out = new Array(16); | ||
for (u = 0; u < 16; u++) | ||
out[u] = op.swap32(ctx.state[u]); | ||
return out; | ||
} | ||
if (ctx.ptr > 0 || n > 0) { | ||
op.bufferSet(buf, ptr, 0, buf.length - ptr); | ||
buf[ptr] = ub & (0xFF << (8 - n)); | ||
compress(ctx, 0); | ||
} | ||
op.bufferSet(buf, 0, 0, buf.length); | ||
encode_count(buf, 0, ctx.countLow, ctx.countHigh, ctx.ptr, n); | ||
compress(ctx, 1); | ||
var out = new Array(16); | ||
for (u = 0; u < 16; u++) out[u] = op.swap32(ctx.state[u]); | ||
return out; | ||
}; | ||
module.exports = function(input, format, output) { | ||
var msg; | ||
if (format === 1) { | ||
msg = input; | ||
} | ||
else if (format === 2) { | ||
msg = h.int32Buffer2Bytes(input); | ||
} | ||
else { | ||
msg = h.string2bytes(input); | ||
} | ||
var ctx = {}; | ||
ctx.state = IV512.slice(); | ||
ctx.ptr = 0; | ||
ctx.countLow = 0; | ||
ctx.countHigh = 0; | ||
ctx.buffer = new Array(Simd_BlockSize); | ||
simd(ctx, msg); | ||
var r = simdClose(ctx, 0, 0); | ||
var out; | ||
if (output === 2) { | ||
out = r; | ||
} | ||
else if (output === 1) { | ||
out = h.int32Buffer2Bytes(r) | ||
} | ||
else { | ||
out = h.int32ArrayToHexString(r) | ||
} | ||
return out; | ||
} | ||
var msg; | ||
if (format === 1) { | ||
msg = input; | ||
} | ||
else if (format === 2) { | ||
msg = h.int32Buffer2Bytes(input); | ||
} | ||
else { | ||
msg = h.string2bytes(input); | ||
} | ||
var ctx = {}; | ||
ctx.state = IV512.slice(); | ||
ctx.ptr = 0; | ||
ctx.countLow = 0; | ||
ctx.countHigh = 0; | ||
ctx.buffer = new Array(128); | ||
simd(ctx, msg); | ||
var r = simdClose(ctx, 0, 0); | ||
var out; | ||
if (output === 2) { | ||
out = r; | ||
} | ||
else if (output === 1) { | ||
out = h.int32Buffer2Bytes(r); | ||
} | ||
else { | ||
out = h.int32ArrayToHexString(r); | ||
} | ||
return out; | ||
}; |
214
lib/skein.js
@@ -8,125 +8,123 @@ //from http://www.h2database.com/skein/ | ||
module.exports = function(input, format, output) { | ||
var msg; | ||
if (format === 1) { | ||
msg = input; | ||
} | ||
else if (format === 2) { | ||
msg = h.int32Buffer2Bytes(input); | ||
} | ||
else { | ||
msg = h.string2bytes(input); | ||
} | ||
// final: 0x80; first: 0x40; conf: 0x4; msg: 0x30; out: 0x3f | ||
var tweak = [ | ||
[0, 32], | ||
[(0x80 + 0x40 + 0x4) << 24, 0] | ||
], | ||
c = []; | ||
var buff = h.string2bytes("SHA3\1\0\0\0\0\2"); | ||
block(c, tweak, buff, 0); | ||
tweak = [ | ||
[0, 0], | ||
[(0x40 + 0x30) << 24, 0] | ||
]; | ||
var len = msg.length, | ||
pos = 0; | ||
for (; len > 64; len -= 64, pos += 64) { | ||
tweak[0][1] += 64; | ||
block(c, tweak, msg, pos); | ||
tweak[1][0] = 0x30 << 24; | ||
} | ||
tweak[0][1] += len; | ||
tweak[1][0] |= 0x80 << 24; | ||
block(c, tweak, msg, pos); | ||
tweak[0][1] = 8; | ||
tweak[1][0] = (0x80 + 0x40 + 0x3f) << 24; | ||
block(c, tweak, [], 0); | ||
for (var hash = [], i = 0; i < 64; i++) { | ||
var b = (shiftRight(c[i >> 3], (i & 7) * 8)[1] & 255); | ||
hash.push(b); | ||
} | ||
var out; | ||
if (output === 2) { | ||
out = h.bytes2Int32Buffer(hash); | ||
} | ||
else if (output === 1) { | ||
var msg; | ||
if (format === 1) { | ||
msg = input; | ||
} | ||
else if (format === 2) { | ||
msg = h.int32Buffer2Bytes(input); | ||
} | ||
else { | ||
msg = h.string2bytes(input); | ||
} | ||
// final: 0x80; first: 0x40; conf: 0x4; msg: 0x30; out: 0x3f | ||
var tweak = [ | ||
[0, 32], | ||
[(0x80 + 0x40 + 0x4) << 24, 0] | ||
], | ||
c = []; | ||
var buff = [83, 72, 65, 51, 1, 0, 0, 0, 0, 2]; | ||
block(c, tweak, buff, 0); | ||
tweak = [ | ||
[0, 0], | ||
[(0x40 + 0x30) << 24, 0] | ||
]; | ||
var len = msg.length, | ||
pos = 0; | ||
for (; len > 64; len -= 64, pos += 64) { | ||
tweak[0][1] += 64; | ||
block(c, tweak, msg, pos); | ||
tweak[1][0] = 0x30 << 24; | ||
} | ||
tweak[0][1] += len; | ||
tweak[1][0] |= 0x80 << 24; | ||
block(c, tweak, msg, pos); | ||
tweak[0][1] = 8; | ||
tweak[1][0] = (0x80 + 0x40 + 0x3f) << 24; | ||
block(c, tweak, [], 0); | ||
for (var hash = [], i = 0; i < 64; i++) { | ||
var b = (shiftRight(c[i >> 3], (i & 7) * 8)[1] & 255); | ||
hash.push(b); | ||
} | ||
var out; | ||
if (output === 2) { | ||
out = h.bytes2Int32Buffer(hash); | ||
} | ||
else if (output === 1) { | ||
return hash; | ||
} | ||
else { | ||
out = h.int8ArrayToHexString(hash); | ||
} | ||
return out; | ||
} | ||
else { | ||
out = h.int8ArrayToHexString(hash); | ||
} | ||
return out; | ||
} | ||
}; | ||
function shiftLeft(x, n) { | ||
if (x == null) return [0, 0]; | ||
if (n > 32) return [x[1] << (n - 32), 0]; | ||
if (n == 32) return [x[1], 0]; | ||
if (n == 0) return x; | ||
return [(x[0] << n) | (x[1] >>> (32 - n)), x[1] << n]; | ||
if (x == null) return [0, 0]; | ||
if (n > 32) return [x[1] << (n - 32), 0]; | ||
if (n == 32) return [x[1], 0]; | ||
if (n == 0) return x; | ||
return [(x[0] << n) | (x[1] >>> (32 - n)), x[1] << n]; | ||
} | ||
function shiftRight(x, n) { | ||
if (x == null) return [0, 0]; | ||
if (n > 32) return [0, x[0] >>> (n - 32)]; | ||
if (n == 32) return [0, x[0]]; | ||
if (n == 0) return x; | ||
return [x[0] >>> n, (x[0] << (32 - n)) | (x[1] >>> n)]; | ||
if (x == null) return [0, 0]; | ||
if (n > 32) return [0, x[0] >>> (n - 32)]; | ||
if (n == 32) return [0, x[0]]; | ||
if (n == 0) return x; | ||
return [x[0] >>> n, (x[0] << (32 - n)) | (x[1] >>> n)]; | ||
} | ||
function add(x, y) { | ||
if (y == null) return x; | ||
var lsw = (x[1] & 0xffff) + (y[1] & 0xffff); | ||
var msw = (x[1] >>> 16) + (y[1] >>> 16) + (lsw >>> 16); | ||
var lowOrder = ((msw & 0xffff) << 16) | (lsw & 0xffff); | ||
lsw = (x[0] & 0xffff) + (y[0] & 0xffff) + (msw >>> 16); | ||
msw = (x[0] >>> 16) + (y[0] >>> 16) + (lsw >>> 16); | ||
var highOrder = ((msw & 0xffff) << 16) | (lsw & 0xffff); | ||
return [highOrder, lowOrder]; | ||
if (y == null) return x; | ||
var lsw = (x[1] & 0xffff) + (y[1] & 0xffff); | ||
var msw = (x[1] >>> 16) + (y[1] >>> 16) + (lsw >>> 16); | ||
var lowOrder = ((msw & 0xffff) << 16) | (lsw & 0xffff); | ||
lsw = (x[0] & 0xffff) + (y[0] & 0xffff) + (msw >>> 16); | ||
msw = (x[0] >>> 16) + (y[0] >>> 16) + (lsw >>> 16); | ||
var highOrder = ((msw & 0xffff) << 16) | (lsw & 0xffff); | ||
return [highOrder, lowOrder]; | ||
} | ||
function xor(a, b) { | ||
if (b == null) return a; | ||
return [a[0] ^ b[0], a[1] ^ b[1]]; | ||
if (b == null) return a; | ||
return [a[0] ^ b[0], a[1] ^ b[1]]; | ||
} | ||
function block(c, tweak, b, off) { | ||
var R = [46, 36, 19, 37, 33, 42, 14, 27, 17, 49, 36, 39, 44, 56, 54, 9, | ||
39, 30, 34, 24, 13, 17, 10, 50, 25, 29, 39, 43, 8, 22, 56, 35 | ||
]; | ||
var x = [], | ||
t = []; | ||
// c[8] = [0x55555555, 0x55555555]; | ||
c[8] = [0x1BD11BDA, 0xA9FC1A22]; | ||
for (var i = 0; i < 8; i++) { | ||
for (var j = 7, k = off + i * 8 + 7; j >= 0; j--, k--) { | ||
t[i] = shiftLeft(t[i], 8); | ||
t[i][1] |= b[k] & 255; | ||
} | ||
x[i] = add(t[i], c[i]); | ||
c[8] = xor(c[8], c[i]); | ||
} | ||
x[5] = add(x[5], tweak[0]); | ||
x[6] = add(x[6], tweak[1]); | ||
tweak[2] = xor(tweak[0], tweak[1]); | ||
for (var round = 1; round <= 18; round++) { | ||
var p = 16 - ((round & 1) << 4); | ||
for (var i = 0; i < 16; i++) { | ||
// m: 0, 2, 4, 6, 2, 0, 6, 4, 4, 6, 0, 2, 6, 4, 2, 0 | ||
var m = 2 * ((i + (1 + i + i) * (i >> 2)) & 3); | ||
var n = (1 + i + i) & 7; | ||
var r = R[p + i]; | ||
x[m] = add(x[m], x[n]); | ||
x[n] = xor(shiftLeft(x[n], r), shiftRight(x[n], 64 - r)); | ||
x[n] = xor(x[n], x[m]); | ||
var R = [46, 36, 19, 37, 33, 42, 14, 27, 17, 49, 36, 39, 44, 56, 54, 9, | ||
39, 30, 34, 24, 13, 17, 10, 50, 25, 29, 39, 43, 8, 22, 56, 35 | ||
]; | ||
var x = [], | ||
t = []; | ||
// c[8] = [0x55555555, 0x55555555]; | ||
c[8] = [0x1BD11BDA, 0xA9FC1A22]; | ||
for (var i = 0; i < 8; i++) { | ||
for (var j = 7, k = off + i * 8 + 7; j >= 0; j--, k--) { | ||
t[i] = shiftLeft(t[i], 8); | ||
t[i][1] |= b[k] & 255; | ||
} | ||
x[i] = add(t[i], c[i]); | ||
c[8] = xor(c[8], c[i]); | ||
} | ||
x[5] = add(x[5], tweak[0]); | ||
x[6] = add(x[6], tweak[1]); | ||
tweak[2] = xor(tweak[0], tweak[1]); | ||
for (var round = 1; round <= 18; round++) { | ||
var p = 16 - ((round & 1) << 4); | ||
for (var i = 0; i < 16; i++) { | ||
// m: 0, 2, 4, 6, 2, 0, 6, 4, 4, 6, 0, 2, 6, 4, 2, 0 | ||
var m = 2 * ((i + (1 + i + i) * (i >> 2)) & 3); | ||
var n = (1 + i + i) & 7; | ||
var r = R[p + i]; | ||
x[m] = add(x[m], x[n]); | ||
x[n] = xor(shiftLeft(x[n], r), shiftRight(x[n], 64 - r)); | ||
x[n] = xor(x[n], x[m]); | ||
} | ||
for (var i = 0; i < 8; i++) | ||
x[i] = add(x[i], c[(round + i) % 9]); | ||
x[5] = add(x[5], tweak[round % 3]); | ||
x[6] = add(x[6], tweak[(round + 1) % 3]); | ||
x[7] = add(x[7], [0, round]); | ||
} | ||
for (var i = 0; i < 8; i++) | ||
c[i] = xor(t[i], x[i]); | ||
} | ||
} | ||
for (var i = 0; i < 8; i++) x[i] = add(x[i], c[(round + i) % 9]); | ||
x[5] = add(x[5], tweak[round % 3]); | ||
x[6] = add(x[6], tweak[(round + 1) % 3]); | ||
x[7] = add(x[7], [0, round]); | ||
} | ||
for (var i = 0; i < 8; i++) c[i] = xor(t[i], x[i]); | ||
} |
{ | ||
"name": "x11-hash-js", | ||
"version": "1.0.0", | ||
"version": "1.0.1", | ||
"description": "x11 javascript hashing algorithm in pure javascript", | ||
"main": "index.js", | ||
"scripts": { | ||
"test": "mocha test/test.js", | ||
"clean": "rm -rfv dist/*", | ||
"benchmark": "node test/benchmarks.js", | ||
"build": "grunt" | ||
"build": "grunt", | ||
"test": "mocha --timeout 10000 --full-trace --check-leaks test/test.js && npm run build", | ||
"bench": "node test/benchmarks.js", | ||
"lint": "eslint index.js lib" | ||
}, | ||
@@ -39,12 +39,23 @@ "repository": { | ||
"devDependencies": { | ||
"benchmark": "^2.1.0", | ||
"browserify": "^13.0.1", | ||
"benchmark": "^2.1.4", | ||
"browserify": "^13.3.0", | ||
"chai": "^3.5.0", | ||
"grunt": "^1.0.1", | ||
"grunt-browserify": "^5.0.0", | ||
"grunt-contrib-uglify": "^1.0.1", | ||
"grunt-contrib-watch": "^1.0.0", | ||
"eslint": "^4.19.1", | ||
"eslint-config-standard": "^10.2.1", | ||
"grunt": "^1.0.2", | ||
"grunt-browserify": "^5.3.0", | ||
"grunt-contrib-clean": "^1.1.0", | ||
"grunt-contrib-uglify": "^1.0.2", | ||
"grunt-karma": "^2.0.0", | ||
"grunt-multi": "0.0.7", | ||
"karma": "^2.0.2", | ||
"karma-chai": "^0.1.0", | ||
"karma-firefox-launcher": "^1.1.0", | ||
"karma-mocha": "^1.3.0", | ||
"karma-mocha-reporter": "^2.2.5", | ||
"karma-phantomjs-launcher": "^1.0.4", | ||
"mocha": "^2.5.3", | ||
"phantomjs": "^2.1.7", | ||
"uglify": "^0.1.5" | ||
} | ||
} |
# x11-hash-js | ||
> Performs the x11 hash. | ||
> Performs the [x11 hashing](https://docs.dash.org/en/latest/introduction/features.html#x11-hash-algorithm) algorithm used in the [Dash cryptocurrency](https://dash.org) in JavaScript. | ||
## Installation | ||
## Usage | ||
Install the library as a Node module. | ||
``` | ||
@@ -10,3 +13,3 @@ $ npm install --save x11-hash-js | ||
## Usage | ||
Reference the library within a Node module. | ||
@@ -16,36 +19,56 @@ ```js | ||
x11.x11('The great experiment continues.'); | ||
console.log(x11.digest('The great experiment continues.')); | ||
// -> '4da3b7c5ff698c6546564ebc72204f31885cd87b75b2b3ca5a93b5d75db85b8c' | ||
``` | ||
x11.blake('The great experiment continues.'); | ||
Download the browserified library from the [dist](https://github.com/dashpay/x11-hash-js/tree/master/dist) folder and include it in your HTML. | ||
```html | ||
<html> | ||
<head> | ||
<script src='./dist/x11-hash.min.js'></script> | ||
<script> | ||
let x11 = require('x11hash'); | ||
console.log(x11.digest('The great experiment continues.')); | ||
// -> '4da3b7c5ff698c6546564ebc72204f31885cd87b75b2b3ca5a93b5d75db85b8c' | ||
</script> | ||
</head> | ||
<body></body> | ||
</html> | ||
``` | ||
Call individual hash functions within the x11 digest. | ||
```js | ||
console.log(x11.blake('The great experiment continues.')); | ||
// -> '8f257723af0741fb7d3d8c264a5ea86a57d4ae833557de04f5f78fad1ac17d6dfa1ae4a78a7564c08fc21d5d8cdd2793ca17d5500ecc2b43eb8aaf9c220d7b49' | ||
x11.bmw('The great experiment continues.'); | ||
console.log(x11.bmw('The great experiment continues.')); | ||
// -> '7b30b4f1ccd83692bc6a01b1f7e374b59b81da6b21421679ae59d84c4f73afec5a0857565b6ebc1b9ddf9da5e75bf1ecd0ba6f5a75b7926ba9278385fb83533c' | ||
x11.cubehash('The great experiment continues.'); | ||
console.log(x11.cubehash('The great experiment continues.')); | ||
// -> '64394bcb9d7844070c8516480ea5f03f68386f33c3829e08bf38bea11f09eba5806aa7831cfbe8e515678b0cad7d4ac888ea2b9ea8f63f0cc918d5a6a76b7ae9' | ||
x11.echo('The great experiment continues.'); | ||
console.log(x11.echo('The great experiment continues.')); | ||
// -> 'b1db282b1672f3423c1e1bdf4496a8ddda0b6f483e92e9a8be2efbaab0ea230814f1f1485d919285deac13794dc215000eb39a47ac32bfc07299a0475049be2e' | ||
x11.groestl('The great experiment continues.'); | ||
console.log(x11.groestl('The great experiment continues.')); | ||
// -> '6cea044acf31194eab7d1adb704712c34dd4f0b6a470b0f297832addab691faa459474c651efdbebddb138a2a9adb41705e0fb75741775314ddd8e5449ace986' | ||
x11.jh('The great experiment continues.'); | ||
console.log(x11.jh('The great experiment continues.')); | ||
// -> '90c7090e9d9a45bc79f476ae7fa3e7e4416d1c26b127d1d418ee9bd96b541933b0f144a0d4c6594944393e39fb6b98ceb54752af55198e00953d638183482521' | ||
x11.keccak('The great experiment continues.'); | ||
console.log(x11.keccak('The great experiment continues.')); | ||
// -> '4c7e9c893fcdc87a2fd604574a4a5b9a0b6864665ed19057dedf24858314690ba45d6bbcfb86cd7182d1677e2d30dad9716ee99eb8ea267c6638f47ef20e0226' | ||
x11.luffa('The great experiment continues.'); | ||
console.log(x11.luffa('The great experiment continues.')); | ||
// -> 'ea531ce38473fc4bd508c5396194dd6201699d47e25bd4d6b0c5dc7ab0627831e01ea027ebe33d80f608f139aa9fd0c6d923f32de9b5d714026300ed1c9a2f48' | ||
x11.shavite('The great experiment continues.'); | ||
console.log(x11.shavite('The great experiment continues.')); | ||
// -> '6fbca2d53a26e22e6df1a8064230bdb98c0a612b64dad958f16757cf8ee8526862a0e4f56be69b98b07f0ea47db7211cf42352443fc806013374e819f26cb923' | ||
x11.simd('The great experiment continues.'); | ||
console.log(x11.simd('The great experiment continues.')); | ||
// -> '13ae2c08260f7d5abcfa791446800c1eaed8c5332ec437222428a28823aa2ba19a5907a2c860c12c0b894bdf9c0d64f807cb9512f1ed42980d15747ff4a26c1c' | ||
x11.skein('The great experiment continues.'); | ||
console.log(x11.skein('The great experiment continues.')); | ||
// -> '88a9dd727bb9b7cbd59612edbcd6b321427f473acc5673d7dffb16071dc71821d0cc1b94dccf7e5f71a0a94019a7e764d3315c3f4a40f73aee4ad98c75bcc2f7' | ||
@@ -57,4 +80,6 @@ | ||
### x11(str) | ||
### x11.digest(str) | ||
Returns a `string` representation of the x11 hash of an input `string` ***str***. | ||
#### str | ||
@@ -64,10 +89,32 @@ | ||
Get the x11 hash. | ||
The string to be hashed. | ||
### x11(str,input,output) | ||
### x11.digest(input, inputFormat, outputFormat) | ||
#### str | ||
Returns the x11 hash of ***input*** with the input and output types variable between a `string`, 8 bit `array` or 32 bit `array` | ||
Type: `string` (input 0), 8 bit `array` (input 1), 32 bit `array` (input 2) | ||
#### input | ||
Get the x11 hash as `string` (output 0), a 8 bit `array` (output 1), a 32 bit `array` (output 2). | ||
Type: `string` or `array` | ||
The input data to be hashed. | ||
#### inputFormat | ||
Type: `number` | ||
Specifies the format and type of the ***input*** value: | ||
- **0**: `string` | ||
- **1**: 8 bit `array` | ||
- **2**: 32 bit `array` | ||
#### outputFormat | ||
Type: `number` | ||
Specifies the format and type of the return value: | ||
- **0**: `string` | ||
- **1**: 8 bit `array` | ||
- **2**: 32 bit `array` |
@@ -0,4 +1,5 @@ | ||
'use strict'; | ||
var Benchmark = require('benchmark'); | ||
var suite = new Benchmark.Suite; | ||
var suite = new Benchmark.Suite(); | ||
@@ -10,48 +11,49 @@ var x11 = require('../'); | ||
var sentence = longDream; | ||
// add tests | ||
// add tests | ||
suite | ||
.add('Hash#x11', function() { | ||
x11.digest(sentence); | ||
}) | ||
.add('Hash#blake', function() { | ||
x11.blake(sentence); | ||
}) | ||
.add('Hash#bmw', function() { | ||
x11.bmw(sentence); | ||
}) | ||
.add('Hash#cubehash', function() { | ||
x11.cubehash(sentence); | ||
}) | ||
.add('Hash#echo', function() { | ||
x11.echo(sentence); | ||
}) | ||
.add('Hash#groestl', function() { | ||
x11.groestl(sentence); | ||
}) | ||
.add('Hash#js', function() { | ||
x11.jh(sentence); | ||
}) | ||
.add('Hash#keccak', function() { | ||
x11.keccak(sentence); | ||
}) | ||
.add('Hash#luffa', function() { | ||
x11.luffa(sentence); | ||
}) | ||
.add('Hash#shavite', function() { | ||
x11.shavite(sentence); | ||
}) | ||
.add('Hash#simd', function() { | ||
x11.simd(sentence); | ||
}) | ||
.add('Hash#skein', function() { | ||
x11.skein(sentence); | ||
}) | ||
//add listeners | ||
.on('cycle', function(event) { | ||
console.log(String(event.target)); | ||
}) | ||
.on('complete', function() { | ||
console.log('Fastest is ' + this.filter('fastest').map('name')); | ||
}) | ||
// run async | ||
.run({ 'async': true }); | ||
.add('Hash#blake', function() { | ||
x11.blake(sentence); | ||
}) | ||
.add('Hash#bmw', function() { | ||
x11.bmw(sentence); | ||
}) | ||
.add('Hash#cubehash', function() { | ||
x11.cubehash(sentence); | ||
}) | ||
.add('Hash#echo', function() { | ||
x11.echo(sentence); | ||
}) | ||
.add('Hash#groestl', function() { | ||
x11.groestl(sentence); | ||
}) | ||
.add('Hash#jh', function() { | ||
x11.jh(sentence); | ||
}) | ||
.add('Hash#keccak', function() { | ||
x11.keccak(sentence); | ||
}) | ||
.add('Hash#luffa', function() { | ||
x11.luffa(sentence); | ||
}) | ||
.add('Hash#shavite', function() { | ||
x11.shavite(sentence); | ||
}) | ||
.add('Hash#simd', function() { | ||
x11.simd(sentence); | ||
}) | ||
.add('Hash#skein', function() { | ||
x11.skein(sentence); | ||
}) | ||
.add('Hash#x11', function() { | ||
x11.digest(sentence); | ||
}) | ||
//add listeners | ||
.on('cycle', function(event) { | ||
console.log(String(event.target)); | ||
}) | ||
.on('complete', function() { | ||
console.log('Fastest is ' + this.filter('fastest').map('name')); | ||
}) | ||
// run async | ||
.run({'async': true}); |
589
test/test.js
'use strict'; | ||
var x11 = require('../'); | ||
var expect = require("chai").expect; | ||
// enable reuse of this test between npm test and karma browser test... | ||
var x11, expect; | ||
if (typeof module !== 'undefined' && module.exports) { | ||
x11 = require('../'); | ||
expect = require('chai').expect; | ||
} else { | ||
x11 = require('x11hash'); | ||
} | ||
@@ -12,220 +18,387 @@ var fox = 'The quick brown fox jumps over the lazy dog'; | ||
describe("X11 Hash Functions", function() { | ||
describe("blake", function() { | ||
it("empty string", function() { | ||
expect(x11.blake(empty)).to.equal("a8cfbbd73726062df0c6864dda65defe58ef0cc52a5625090fa17601e1eecd1b628e94f396ae402a00acc9eab77b4d4c2e852aaaa25a636d80af3fc7913ef5b8"); | ||
describe('X11 Hash Functions', function () { | ||
// main x11 digest function tests | ||
describe('x11 (digest)', function () { | ||
it('empty string', function () { | ||
expect(x11.digest(empty)).to.equal('51b572209083576ea221c27e62b4e22063257571ccb6cc3dc3cd17eb67584eba'); | ||
}); | ||
it('fox string', function () { | ||
expect(x11.digest(fox)).to.equal('534536a4e4f16b32447f02f77200449dc2f23b532e3d9878fe111c9de666bc5c'); | ||
}); | ||
it('dash string', function () { | ||
expect(x11.digest(dash)).to.equal('fe809ebca8753d907f6ad32cdcf8e5c4e090d7bece5df35b2147e10b88c12d26'); | ||
}); | ||
it('dream string', function () { | ||
expect(x11.digest(longDream)).to.equal('5c0996b9d49dbe84e29f1b818c1fa9e73549f894a71b8a258964b8f0ecf3c866'); | ||
}); | ||
it('int32', function () { | ||
expect(x11.digest(int32, 2)).to.equal('ce06ca169b75084cd7b245966296e637e9af85091e848937af070f110cdb6298'); | ||
}); | ||
// argument exceptions... | ||
describe('input argument exceptions', function () { | ||
it('invalid input type: missing', function () { | ||
expect(function () { | ||
x11.digest(); | ||
}).to.throw(x11.errors.input_not_specified); | ||
}); | ||
it('invalid single-arg input type: array', function () { | ||
expect(function () { | ||
x11.digest(int32); | ||
}).to.throw(x11.errors.input_single_invalid_type); | ||
}); | ||
it('invalid single-arg input type: object', function () { | ||
expect(function () { | ||
x11.digest({}); | ||
}).to.throw(x11.errors.input_single_invalid_type); | ||
}); | ||
}); | ||
describe('inputFormat argument exceptions', function () { | ||
it('invalid inputFormat argument type: string', function () { | ||
expect(function () { | ||
x11.digest(longDream, ''); | ||
}).to.throw(x11.errors.input_format_invalid); | ||
}); | ||
it('invalid inputFormat argument type: boolean', function () { | ||
expect(function () { | ||
x11.digest(longDream, false); | ||
}).to.throw(x11.errors.input_format_invalid); | ||
}); | ||
it('invalid inputFormat argument type: object', function () { | ||
expect(function () { | ||
x11.digest(longDream, {}); | ||
}).to.throw(x11.errors.input_format_invalid); | ||
}); | ||
it('invalid inputFormat argument value: min', function () { | ||
expect(function () { | ||
x11.digest(longDream, -1); | ||
}).to.throw(x11.errors.input_format_invalid); | ||
}); | ||
it('invalid inputFormat argument value: max', function () { | ||
expect(function () { | ||
x11.digest(longDream, 3); | ||
}).to.throw(x11.errors.input_format_invalid); | ||
}); | ||
it('mismatch of input argument to inputFormat: string', function () { | ||
expect(function () { | ||
x11.digest(int32, 0); | ||
}).to.throw(x11.errors.input_format_mismatch_string); | ||
}); | ||
it('mismatch of input argument to inputFormat: array 1', function () { | ||
expect(function () { | ||
x11.digest(longDream, 1); | ||
}).to.throw(x11.errors.input_format_mismatch_array); | ||
}); | ||
it('mismatch of input argument to inputFormat: array 2', function () { | ||
expect(function () { | ||
x11.digest(longDream, 2); | ||
}).to.throw(x11.errors.input_format_mismatch_array); | ||
}); | ||
}); | ||
describe('outputFormat argument exceptions', function () { | ||
it('invalid outputFormat argument type: string', function () { | ||
expect(function () { | ||
x11.digest(longDream, 0, ''); | ||
}).to.throw(x11.errors.output_format_invalid); | ||
}); | ||
it('invalid outputFormat argument type: boolean', function () { | ||
expect(function () { | ||
x11.digest(longDream, 0, false); | ||
}).to.throw(x11.errors.output_format_invalid); | ||
}); | ||
it('invalid outputFormat argument type: object', function () { | ||
expect(function () { | ||
x11.digest(longDream, 0, {}); | ||
}).to.throw(x11.errors.output_format_invalid); | ||
}); | ||
it('invalid outputFormat argument value: below min', function () { | ||
expect(function () { | ||
x11.digest(longDream, 0, -1); | ||
}).to.throw(x11.errors.output_format_invalid); | ||
}); | ||
it('invalid outputFormat argument value: above max', function () { | ||
expect(function () { | ||
x11.digest(longDream, 0, 3); | ||
}).to.throw(x11.errors.output_format_invalid); | ||
}); | ||
}); | ||
}); | ||
it("fox string", function() { | ||
expect(x11.blake(fox)).to.equal("1f7e26f63b6ad25a0896fd978fd050a1766391d2fd0471a77afb975e5034b7ad2d9ccf8dfb47abbbe656e1b82fbc634ba42ce186e8dc5e1ce09a885d41f43451"); | ||
// individual x11 hash function tests... | ||
describe('blake', function () { | ||
it('empty string', function () { | ||
expect(x11.blake(empty)).to.equal('a8cfbbd73726062df0c6864dda65defe58ef0cc52a5625090fa17601e1eecd1b628e94f396ae402a00acc9eab77b4d4c2e852aaaa25a636d80af3fc7913ef5b8'); | ||
}); | ||
it('fox string', function () { | ||
expect(x11.blake(fox)).to.equal('1f7e26f63b6ad25a0896fd978fd050a1766391d2fd0471a77afb975e5034b7ad2d9ccf8dfb47abbbe656e1b82fbc634ba42ce186e8dc5e1ce09a885d41f43451'); | ||
}); | ||
it('dash string', function () { | ||
expect(x11.blake(dash)).to.equal('d187e862889f3d3eb106e825b3ea4385f88a750cb6614d18219f9809ccd25874d46e856e741e334daf160270031280f61cca5c807ced7f4a7bf8beba1fd9a053'); | ||
}); | ||
it('dream string', function () { | ||
expect(x11.blake(longDream)).to.equal('f1323b1e875cf2b02058cf4ac11e97dff4cfb48c86253961458dc7bcd1e61c4df47a7b441d5083b2275209dc0d28a2bc802a5fdbf10537454026e369e949428e'); | ||
}); | ||
it('int32', function () { | ||
expect(x11.blake(int32, 2)).to.equal('8305e9ea49cc8f30906844ae07555b8085f8ce44f7fddbc9c5ff6c50295dfc35f7d4fbb20ed4c3aa9d9601d48580b1d896689d490708103baab29ebf8ae4c5db'); | ||
}); | ||
}); | ||
it("dash string", function() { | ||
expect(x11.blake(dash)).to.equal("d187e862889f3d3eb106e825b3ea4385f88a750cb6614d18219f9809ccd25874d46e856e741e334daf160270031280f61cca5c807ced7f4a7bf8beba1fd9a053"); | ||
describe('BMW', function () { | ||
it('empty string', function () { | ||
expect(x11.bmw(empty)).to.equal('6a725655c42bc8a2a20549dd5a233a6a2beb01616975851fd122504e604b46af7d96697d0b6333db1d1709d6df328d2a6c786551b0cce2255e8c7332b4819c0e'); | ||
}); | ||
it('fox string', function () { | ||
expect(x11.bmw(fox)).to.equal('2998d4cb31323e1169b458ab03a54d0b68e411a3c7cc7612adbf05bf901b8197dfd852c1c0099c09717d2fad3537207e737c6159c31d377d1ab8f5ed1ceeea06'); | ||
}); | ||
it('dash string', function () { | ||
expect(x11.bmw(dash)).to.equal('4146f08952d34cb498486dc0a063939d7f7be69ede232f379f93c08091ea6d13d6ebdb4e06fe24030f7ca9ac07b8f59e5cfadbb05bded3b9bb3a9abecea031cb'); | ||
}); | ||
it('dream string', function () { | ||
expect(x11.bmw(longDream)).to.equal('a2fd4436b4c481a4e31847f3c3af8d64810102c776bdaadd5558520edd6f90f30e1dd9450a0aa75c4b34410e0a61a3c26c7991a8f19967a1f452582337a68cb5'); | ||
}); | ||
it('int32', function () { | ||
expect(x11.bmw(int32, 2)).to.equal('da21a7228a373f438523725cdac884bcc864f35d2228242dd054fced566b136b27103b41ded31488be3da69c86ed37fe3290f156ecdb57e7c47adfe909aa48a2'); | ||
}); | ||
}); | ||
it("dream string", function() { | ||
expect(x11.blake(longDream)).to.equal("f1323b1e875cf2b02058cf4ac11e97dff4cfb48c86253961458dc7bcd1e61c4df47a7b441d5083b2275209dc0d28a2bc802a5fdbf10537454026e369e949428e"); | ||
describe('cubehash', function () { | ||
it('empty string', function () { | ||
expect(x11.cubehash(empty)).to.equal('4a1d00bbcfcb5a9562fb981e7f7db3350fe2658639d948b9d57452c22328bb32f468b072208450bad5ee178271408be0b16e5633ac8a1e3cf9864cfbfc8e043a'); | ||
}); | ||
it('fox string', function () { | ||
expect(x11.cubehash(fox)).to.equal('bdba44a28cd16b774bdf3c9511def1a2baf39d4ef98b92c27cf5e37beb8990b7cdb6575dae1a548330780810618b8a5c351c1368904db7ebdf8857d596083a86'); | ||
}); | ||
it('dash string', function () { | ||
expect(x11.cubehash(dash)).to.equal('3258d531a2c1fd2006d67d739b7a15a249d9c8cdbeabe51561a38d02ebdd0f15f41b9515001d3993d8f462925b015d53494c5b4dc6e046647c6e8b6b620b4d15'); | ||
}); | ||
it('dream string', function () { | ||
expect(x11.cubehash(longDream)).to.equal('d628c68d46d0aa676e3899d2136c8349f4217b3206a1d9101de8bb40e45e772ad2d8ce820cebb59357db5516367f4e8990e0c324eaa2d31b574235cc3ba888ca'); | ||
}); | ||
it('int32', function () { | ||
expect(x11.cubehash(int32, 2)).to.equal('3ce006e60529195db33e8490a085930b004e30a9c9ce7754c1e554a956bab65b19fb03586fa3ff50b7001686bc8fea41c2af6a4472345f2b8ebebcaf9cdad600'); | ||
}); | ||
}); | ||
it("int32", function() { | ||
expect(x11.blake(int32,2)).to.equal("8305e9ea49cc8f30906844ae07555b8085f8ce44f7fddbc9c5ff6c50295dfc35f7d4fbb20ed4c3aa9d9601d48580b1d896689d490708103baab29ebf8ae4c5db"); | ||
describe('echo', function () { | ||
it('empty string', function () { | ||
expect(x11.echo(empty)).to.equal('158f58cc79d300a9aa292515049275d051a28ab931726d0ec44bdd9faef4a702c36db9e7922fff077402236465833c5cc76af4efc352b4b44c7fa15aa0ef234e'); | ||
}); | ||
it('fox string', function () { | ||
expect(x11.echo(fox)).to.equal('fe61eba97bdfcaa027ded44a5f883fcb900b97449596d7b4a7187c76e71ad750e6117b529bd69992bec015bef862d16d62c384b600cb300d486e565f94202abf'); | ||
}); | ||
it('dash string', function () { | ||
expect(x11.echo(dash)).to.equal('42a2ee2bb582f59d1be01e4a24ed31041aa1898a3c6c2efe6956e5c6b9eb33d4a9f390f6eccdb7c757d4cb6ad3d3aed302d97740fdf78f569f599ab8cd71ff49'); | ||
}); | ||
it('dream string', function () { | ||
expect(x11.echo(longDream)).to.equal('1b357deeac6e3dc2458fa71023c61b06e3756fb7a1ec81ebb6e5ef0124d1609e240921efa1599098000433c01cc2c766b5c4562949be8e3a5020d1c249c05e6d'); | ||
}); | ||
it('int32', function () { | ||
expect(x11.echo(int32, 2)).to.equal('cb8ff728a325fbed34454df9b862816deb0fcaf818ec029513277f1ed2d2f82440f380832f5ef984f56fd6c48a39616811d5af0e411d8ebe2862816b2e0c6c01'); | ||
}); | ||
}); | ||
}); | ||
describe("BMW", function() { | ||
it("empty string", function() { | ||
expect(x11.bmw(empty)).to.equal("6a725655c42bc8a2a20549dd5a233a6a2beb01616975851fd122504e604b46af7d96697d0b6333db1d1709d6df328d2a6c786551b0cce2255e8c7332b4819c0e"); | ||
describe('groestl', function () { | ||
it('empty string', function () { | ||
expect(x11.groestl(empty)).to.equal('6d3ad29d279110eef3adbd66de2a0345a77baede1557f5d099fce0c03d6dc2ba8e6d4a6633dfbd66053c20faa87d1a11f39a7fbe4a6c2f009801370308fc4ad8'); | ||
}); | ||
it('fox string', function () { | ||
expect(x11.groestl(fox)).to.equal('badc1f70ccd69e0cf3760c3f93884289da84ec13c70b3d12a53a7a8a4a513f99715d46288f55e1dbf926e6d084a0538e4eebfc91cf2b21452921ccde9131718d'); | ||
}); | ||
it('dash string', function () { | ||
expect(x11.groestl(dash)).to.equal('f4c9ce627e2ed9d79c6942e5ff22939048afa1e59ce2f1adeec3f22ea6e7d7f39b8b15c543a4eae74bf9df7a2e9a987dbb4d17537cbb26e994499cd5c22907df'); | ||
}); | ||
it('dream string', function () { | ||
expect(x11.groestl(longDream)).to.equal('c678ea36128ff654d371609b3d68e509e99a0920c076b0214600a5184e6bdadfc4cd37b02a33dbdd2374b1151f2f07a7fcde61d56333dbc85d1791f6dc1d0b61'); | ||
}); | ||
it('int32', function () { | ||
expect(x11.groestl(int32, 2)).to.equal('b62c929b4db0a8a15fa862b1cf6b5043b939fef6be0659d2efb5c0089f53620e40d113c8e441c5009fbba6dd098992da0d357fb27b2bf29ec21887d780ae2ec2'); | ||
}); | ||
}); | ||
it("fox string", function() { | ||
expect(x11.bmw(fox)).to.equal("2998d4cb31323e1169b458ab03a54d0b68e411a3c7cc7612adbf05bf901b8197dfd852c1c0099c09717d2fad3537207e737c6159c31d377d1ab8f5ed1ceeea06"); | ||
describe('jh', function () { | ||
it('empty string', function () { | ||
expect(x11.jh(empty)).to.equal('90ecf2f76f9d2c8017d979ad5ab96b87d58fc8fc4b83060f3f900774faa2c8fabe69c5f4ff1ec2b61d6b316941cedee117fb04b1f4c5bc1b919ae841c50eec4f'); | ||
}); | ||
it('fox string', function () { | ||
expect(x11.jh(fox)).to.equal('043f14e7c0775e7b1ef5ad657b1e858250b21e2e61fd699783f8634cb86f3ff938451cabd0c8cdae91d4f659d3f9f6f654f1bfedca117ffba735c15fedda47a3'); | ||
}); | ||
it('dash string', function () { | ||
expect(x11.jh(dash)).to.equal('9999b3770256821e3a74c780ada66013df52378103addef0bceaac4be4f889d5ff93dc99d654310cc0063f15baa4ab168a2d8b6301104905619c334a92f521a1'); | ||
}); | ||
it('dream string', function () { | ||
expect(x11.jh(longDream)).to.equal('007693ed766b8427eb1b07f5624146f2613c3ba0e69a1ea481428ecf8053970cd9e22608a0fd21aa78e5390a71f48fabf310bcc4de24a8c6fd1c51a81fd448a8'); | ||
}); | ||
it('int32', function () { | ||
expect(x11.jh(int32, 2)).to.equal('a76659570f4f3e8d31000141a2ad2e2ed86d33780a71913e02eb6e8898cb55b09c939fb2052b54a205772e1ecc1a2c70f837d5648f287376d7b72e4e0c749c49'); | ||
}); | ||
}); | ||
it("dash string", function() { | ||
expect(x11.bmw(dash)).to.equal("4146f08952d34cb498486dc0a063939d7f7be69ede232f379f93c08091ea6d13d6ebdb4e06fe24030f7ca9ac07b8f59e5cfadbb05bded3b9bb3a9abecea031cb"); | ||
describe('keccak', function () { | ||
it('empty string', function () { | ||
expect(x11.keccak(empty)).to.equal('0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e'); | ||
}); | ||
it('fox string', function () { | ||
expect(x11.keccak(fox)).to.equal('d135bb84d0439dbac432247ee573a23ea7d3c9deb2a968eb31d47c4fb45f1ef4422d6c531b5b9bd6f449ebcc449ea94d0a8f05f62130fda612da53c79659f609'); | ||
}); | ||
it('dash string', function () { | ||
expect(x11.keccak(dash)).to.equal('b166196bc60ee0a6d355d3b2e9418fd7b89d49308bdec6e78e3a47e126421966aacb875bd881b4c2987ae37b3cc31774aa2e2847c967f82338ce4046cb593eb6'); | ||
}); | ||
it('dream string', function () { | ||
expect(x11.keccak(longDream)).to.equal('fea769af10da95a6ba64542cc2c575080a22af3c468d70056cd141bb6c04da19676eb469c4e37492510d321190aae0c3196a3db87f9941c7d5eceed9b5e00f7a'); | ||
}); | ||
it('int32', function () { | ||
expect(x11.keccak(int32, 2)).to.equal('6c0fedd5fb03e8e7075d4bfc8f4e26262a47aa373bf1ff0a25cd3f168b5ed1ef59a40231098a57a3fee96a3f19250ffe49d0728507c82bf0c40fe10242d30f1c'); | ||
}); | ||
}); | ||
it("dream string", function() { | ||
expect(x11.bmw(longDream)).to.equal("a2fd4436b4c481a4e31847f3c3af8d64810102c776bdaadd5558520edd6f90f30e1dd9450a0aa75c4b34410e0a61a3c26c7991a8f19967a1f452582337a68cb5"); | ||
describe('luffa', function () { | ||
it('empty string', function () { | ||
expect(x11.luffa(empty)).to.equal('6e7de4501189b3ca58f3ac114916654bbcd4922024b4cc1cd764acfe8ab4b7805df133eab345ffdb1c414564c924f48e0a301824e2ac4c34bd4efde2e43da90e'); | ||
}); | ||
it('fox string', function () { | ||
expect(x11.luffa(fox)).to.equal('459e2280a7cdb0c721d8d9dbeb9ed339659dc9e7b158e9dd2d328d946cb21474dc9177edfc93602f1aadb31944c795c9b5df859a3dc6132d4f0a4c476aaf797f'); | ||
}); | ||
it('dash string', function () { | ||
expect(x11.luffa(dash)).to.equal('7181d2550acde547eff499c1d533293f6bf4a0464dd9f2264ff5f35e17bb3238a6f7eb036645119a7575627f65fd74288c9581f6cf8a8df034547900aa86d634'); | ||
}); | ||
it('dream string', function () { | ||
expect(x11.luffa(longDream)).to.equal('570d89629d59804454c8f3ab205e3dadd2dd7d27dccf1bc6ae99d854360b817d3ef6c75d9a2753779e5e893f06572c3e51b7d220747c405380bab02f47cc949c'); | ||
}); | ||
it('int32', function () { | ||
expect(x11.luffa(int32, 2)).to.equal('6023f30947ec516eb21810b7a85b5beb3477e62831c666d21346c830ab09e1c686d7a81847fcb1d52d0feaf33bca9e44b31773733705f396e739f74a3f935c8b'); | ||
}); | ||
}); | ||
it("int32", function() { | ||
expect(x11.bmw(int32,2)).to.equal("da21a7228a373f438523725cdac884bcc864f35d2228242dd054fced566b136b27103b41ded31488be3da69c86ed37fe3290f156ecdb57e7c47adfe909aa48a2"); | ||
describe('shavite', function () { | ||
it('empty string', function () { | ||
expect(x11.shavite(empty)).to.equal('a485c1b2578459d1efc5dddd840bb0b4a650ac82fe68f58c4442ccda747da006b2d1dc6b4a4eb7d84ff91e1f466fef429d259acd995dddcad16fa545c7a6e5ba'); | ||
}); | ||
it('fox string', function () { | ||
expect(x11.shavite(fox)).to.equal('4dbd97835c4e5cfa14799884a7adc96688dd808ff53d5c4cfe7db89a55ee98d0260791ec0c9b5466482ab3f6f236da7e65e1cb6d1ee624f61a5b2b79f63c4120'); | ||
}); | ||
it('dash string', function () { | ||
expect(x11.shavite(dash)).to.equal('45f24351ef4f5b7477214efe97f8cef4d69007e94e1e5f397011c4fecd4517fe69c509ea6aa758a9055dd6d0864b885498f4fdab5cc0458dbf98e7069b2c52dd'); | ||
}); | ||
it('dream string', function () { | ||
expect(x11.shavite(longDream)).to.equal('62f5a238a53ca81d49ef1282fcd94256895899a8536481493803604f91ad82630682eb35579a384430954e2b4d863f8b7dda50b9346df23db58b874031e4b65d'); | ||
}); | ||
it('int32', function () { | ||
expect(x11.shavite(int32, 2)).to.equal('ba96b7af4ee87106b7cc2c0ba6b7c2682e0c32e4035a0dcb4cbd16e61c619d875154c18e473ac19180061791b4a0c1fdbc755d5b0d8d349c0dd4a8cc9632b314'); | ||
}); | ||
}); | ||
}); | ||
describe("cubehash", function() { | ||
it("empty string", function() { | ||
expect(x11.cubehash(empty)).to.equal("4a1d00bbcfcb5a9562fb981e7f7db3350fe2658639d948b9d57452c22328bb32f468b072208450bad5ee178271408be0b16e5633ac8a1e3cf9864cfbfc8e043a"); | ||
describe('simd', function () { | ||
it('empty string', function () { | ||
expect(x11.simd(empty)).to.equal('51a5af7e243cd9a5989f7792c880c4c3168c3d60c4518725fe5757d1f7a69c6366977eaba7905ce2da5d7cfd07773725f0935b55f3efb954996689a49b6d29e0'); | ||
}); | ||
it('fox string', function () { | ||
expect(x11.simd(fox)).to.equal('ca493ce78cc2a63b5a48393e61d113d59a930b3e76d062ab58177345c48b59890a08661d04dd6160a1b42d215f1e303d97ab0abb54e65f758f79aee2b182b34b'); | ||
}); | ||
it('dash string', function () { | ||
expect(x11.simd(dash)).to.equal('e736a132375bd8aa02d00ea3ff3f0ef4cb8fbdd0b3cf3d619cf3e270896d2911105dc9bf46c395db98f17601529d24b8fa89a28e75f73da110d91a19c44f8975'); | ||
}); | ||
it('dream string', function () { | ||
expect(x11.simd(longDream)).to.equal('0b73b8ba451b53acc9c489ed5b5233429525abcacc63378e31883323b5630546337b2ece37688fd91507c60f7f3ac5494bc104451b776103e7dd308a3fb4d1c8'); | ||
}); | ||
it('int32', function () { | ||
expect(x11.simd(int32, 2)).to.equal('e4e176b21fa5453267af41fac25aea3519ddf9a6e734c240508216f159ce01188a6024955c689030a1558fa9d4f94835046d4d77c27c607ee4582e554e81dfe4'); | ||
}); | ||
}); | ||
it("fox string", function() { | ||
expect(x11.cubehash(fox)).to.equal("bdba44a28cd16b774bdf3c9511def1a2baf39d4ef98b92c27cf5e37beb8990b7cdb6575dae1a548330780810618b8a5c351c1368904db7ebdf8857d596083a86"); | ||
}); | ||
it("dash string", function() { | ||
expect(x11.cubehash(dash)).to.equal("3258d531a2c1fd2006d67d739b7a15a249d9c8cdbeabe51561a38d02ebdd0f15f41b9515001d3993d8f462925b015d53494c5b4dc6e046647c6e8b6b620b4d15"); | ||
}); | ||
it("dream string", function() { | ||
expect(x11.cubehash(longDream)).to.equal("d628c68d46d0aa676e3899d2136c8349f4217b3206a1d9101de8bb40e45e772ad2d8ce820cebb59357db5516367f4e8990e0c324eaa2d31b574235cc3ba888ca"); | ||
}); | ||
it("int32", function() { | ||
expect(x11.cubehash(int32,2)).to.equal("3ce006e60529195db33e8490a085930b004e30a9c9ce7754c1e554a956bab65b19fb03586fa3ff50b7001686bc8fea41c2af6a4472345f2b8ebebcaf9cdad600"); | ||
}); | ||
}); | ||
describe("echo", function() { | ||
it("empty string", function() { | ||
expect(x11.echo(empty)).to.equal("158f58cc79d300a9aa292515049275d051a28ab931726d0ec44bdd9faef4a702c36db9e7922fff077402236465833c5cc76af4efc352b4b44c7fa15aa0ef234e"); | ||
}); | ||
it("fox string", function() { | ||
expect(x11.echo(fox)).to.equal("fe61eba97bdfcaa027ded44a5f883fcb900b97449596d7b4a7187c76e71ad750e6117b529bd69992bec015bef862d16d62c384b600cb300d486e565f94202abf"); | ||
}); | ||
it("dash string", function() { | ||
expect(x11.echo(dash)).to.equal("42a2ee2bb582f59d1be01e4a24ed31041aa1898a3c6c2efe6956e5c6b9eb33d4a9f390f6eccdb7c757d4cb6ad3d3aed302d97740fdf78f569f599ab8cd71ff49"); | ||
}); | ||
it("dream string", function() { | ||
expect(x11.echo(longDream)).to.equal("1b357deeac6e3dc2458fa71023c61b06e3756fb7a1ec81ebb6e5ef0124d1609e240921efa1599098000433c01cc2c766b5c4562949be8e3a5020d1c249c05e6d"); | ||
}); | ||
it("int32", function() { | ||
expect(x11.echo(int32,2)).to.equal("cb8ff728a325fbed34454df9b862816deb0fcaf818ec029513277f1ed2d2f82440f380832f5ef984f56fd6c48a39616811d5af0e411d8ebe2862816b2e0c6c01"); | ||
}); | ||
}); | ||
describe("groestl", function() { | ||
it("empty string", function() { | ||
expect(x11.groestl(empty)).to.equal("6d3ad29d279110eef3adbd66de2a0345a77baede1557f5d099fce0c03d6dc2ba8e6d4a6633dfbd66053c20faa87d1a11f39a7fbe4a6c2f009801370308fc4ad8"); | ||
}); | ||
it("fox string", function() { | ||
expect(x11.groestl(fox)).to.equal("badc1f70ccd69e0cf3760c3f93884289da84ec13c70b3d12a53a7a8a4a513f99715d46288f55e1dbf926e6d084a0538e4eebfc91cf2b21452921ccde9131718d"); | ||
}); | ||
it("dash string", function() { | ||
expect(x11.groestl(dash)).to.equal("f4c9ce627e2ed9d79c6942e5ff22939048afa1e59ce2f1adeec3f22ea6e7d7f39b8b15c543a4eae74bf9df7a2e9a987dbb4d17537cbb26e994499cd5c22907df"); | ||
}); | ||
it("dream string", function() { | ||
expect(x11.groestl(longDream)).to.equal("c678ea36128ff654d371609b3d68e509e99a0920c076b0214600a5184e6bdadfc4cd37b02a33dbdd2374b1151f2f07a7fcde61d56333dbc85d1791f6dc1d0b61"); | ||
}); | ||
it("int32", function() { | ||
expect(x11.groestl(int32,2)).to.equal("b62c929b4db0a8a15fa862b1cf6b5043b939fef6be0659d2efb5c0089f53620e40d113c8e441c5009fbba6dd098992da0d357fb27b2bf29ec21887d780ae2ec2"); | ||
}); | ||
}); | ||
describe("jh", function() { | ||
it("empty string", function() { | ||
expect(x11.jh(empty)).to.equal("90ecf2f76f9d2c8017d979ad5ab96b87d58fc8fc4b83060f3f900774faa2c8fabe69c5f4ff1ec2b61d6b316941cedee117fb04b1f4c5bc1b919ae841c50eec4f"); | ||
}); | ||
it("fox string", function() { | ||
expect(x11.jh(fox)).to.equal("043f14e7c0775e7b1ef5ad657b1e858250b21e2e61fd699783f8634cb86f3ff938451cabd0c8cdae91d4f659d3f9f6f654f1bfedca117ffba735c15fedda47a3"); | ||
}); | ||
it("dash string", function() { | ||
expect(x11.jh(dash)).to.equal("9999b3770256821e3a74c780ada66013df52378103addef0bceaac4be4f889d5ff93dc99d654310cc0063f15baa4ab168a2d8b6301104905619c334a92f521a1"); | ||
}); | ||
it("dream string", function() { | ||
expect(x11.jh(longDream)).to.equal("007693ed766b8427eb1b07f5624146f2613c3ba0e69a1ea481428ecf8053970cd9e22608a0fd21aa78e5390a71f48fabf310bcc4de24a8c6fd1c51a81fd448a8"); | ||
}); | ||
it("int32", function() { | ||
expect(x11.jh(int32,2)).to.equal("a76659570f4f3e8d31000141a2ad2e2ed86d33780a71913e02eb6e8898cb55b09c939fb2052b54a205772e1ecc1a2c70f837d5648f287376d7b72e4e0c749c49"); | ||
}); | ||
}); | ||
describe("keccak", function() { | ||
it("empty string", function() { | ||
expect(x11.keccak(empty)).to.equal("0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e"); | ||
}); | ||
it("fox string", function() { | ||
expect(x11.keccak(fox)).to.equal("d135bb84d0439dbac432247ee573a23ea7d3c9deb2a968eb31d47c4fb45f1ef4422d6c531b5b9bd6f449ebcc449ea94d0a8f05f62130fda612da53c79659f609"); | ||
}); | ||
it("dash string", function() { | ||
expect(x11.keccak(dash)).to.equal("b166196bc60ee0a6d355d3b2e9418fd7b89d49308bdec6e78e3a47e126421966aacb875bd881b4c2987ae37b3cc31774aa2e2847c967f82338ce4046cb593eb6"); | ||
}); | ||
it("dream string", function() { | ||
expect(x11.keccak(longDream)).to.equal("fea769af10da95a6ba64542cc2c575080a22af3c468d70056cd141bb6c04da19676eb469c4e37492510d321190aae0c3196a3db87f9941c7d5eceed9b5e00f7a"); | ||
}); | ||
it("int32", function() { | ||
expect(x11.keccak(int32,2)).to.equal("6c0fedd5fb03e8e7075d4bfc8f4e26262a47aa373bf1ff0a25cd3f168b5ed1ef59a40231098a57a3fee96a3f19250ffe49d0728507c82bf0c40fe10242d30f1c"); | ||
}); | ||
}); | ||
describe("luffa", function() { | ||
it("empty string", function() { | ||
expect(x11.luffa(empty)).to.equal("6e7de4501189b3ca58f3ac114916654bbcd4922024b4cc1cd764acfe8ab4b7805df133eab345ffdb1c414564c924f48e0a301824e2ac4c34bd4efde2e43da90e"); | ||
}); | ||
it("fox string", function() { | ||
expect(x11.luffa(fox)).to.equal("459e2280a7cdb0c721d8d9dbeb9ed339659dc9e7b158e9dd2d328d946cb21474dc9177edfc93602f1aadb31944c795c9b5df859a3dc6132d4f0a4c476aaf797f"); | ||
}); | ||
it("dash string", function() { | ||
expect(x11.luffa(dash)).to.equal("7181d2550acde547eff499c1d533293f6bf4a0464dd9f2264ff5f35e17bb3238a6f7eb036645119a7575627f65fd74288c9581f6cf8a8df034547900aa86d634"); | ||
}); | ||
it("dream string", function() { | ||
expect(x11.luffa(longDream)).to.equal("570d89629d59804454c8f3ab205e3dadd2dd7d27dccf1bc6ae99d854360b817d3ef6c75d9a2753779e5e893f06572c3e51b7d220747c405380bab02f47cc949c"); | ||
}); | ||
it("int32", function() { | ||
expect(x11.luffa(int32,2)).to.equal("6023f30947ec516eb21810b7a85b5beb3477e62831c666d21346c830ab09e1c686d7a81847fcb1d52d0feaf33bca9e44b31773733705f396e739f74a3f935c8b"); | ||
}); | ||
}); | ||
describe("shavite", function() { | ||
it("empty string", function() { | ||
expect(x11.shavite(empty)).to.equal("a485c1b2578459d1efc5dddd840bb0b4a650ac82fe68f58c4442ccda747da006b2d1dc6b4a4eb7d84ff91e1f466fef429d259acd995dddcad16fa545c7a6e5ba"); | ||
describe('skein', function () { | ||
it('empty string', function () { | ||
expect(x11.skein(empty)).to.equal('bc5b4c50925519c290cc634277ae3d6257212395cba733bbad37a4af0fa06af41fca7903d06564fea7a2d3730dbdb80c1f85562dfcc070334ea4d1d9e72cba7a'); | ||
}); | ||
it('fox string', function () { | ||
expect(x11.skein(fox)).to.equal('94c2ae036dba8783d0b3f7d6cc111ff810702f5c77707999be7e1c9486ff238a7044de734293147359b4ac7e1d09cd247c351d69826b78dcddd951f0ef912713'); | ||
}); | ||
it('dash string', function () { | ||
expect(x11.skein(dash)).to.equal('1db131ba5bc4b3ec9e381a752b3f0d53e8dd25e3d22aa8b9f17b570c3b5938833b91a54939ba873d28483e8b936f9584f06e80b1232a716a074377abd5c2b3f0'); | ||
}); | ||
it('dream string', function () { | ||
expect(x11.skein(longDream)).to.equal('56eda4c36c514c2088ca4fc80f53aa083041ccc070b933f450e748cb432fa664821fd0f1d07e9ef2db3e2d6864d1a6239009b55767d9d7de7789734b351e7c00'); | ||
}); | ||
it('int32', function () { | ||
expect(x11.skein(int32, 2)).to.equal('a66d180741a60737bdfc6a94f92bed9726bf03f162de2dc0829d1b285b1d2fbcd132ca42e97b178a97268a8d3e0f0f6548ea305e5c3ac2b5a9a2d1c9bd9f7fac'); | ||
}); | ||
}); | ||
it("fox string", function() { | ||
expect(x11.shavite(fox)).to.equal("4dbd97835c4e5cfa14799884a7adc96688dd808ff53d5c4cfe7db89a55ee98d0260791ec0c9b5466482ab3f6f236da7e65e1cb6d1ee624f61a5b2b79f63c4120"); | ||
}); | ||
it("dash string", function() { | ||
expect(x11.shavite(dash)).to.equal("45f24351ef4f5b7477214efe97f8cef4d69007e94e1e5f397011c4fecd4517fe69c509ea6aa758a9055dd6d0864b885498f4fdab5cc0458dbf98e7069b2c52dd"); | ||
}); | ||
it("dream string", function() { | ||
expect(x11.shavite(longDream)).to.equal("62f5a238a53ca81d49ef1282fcd94256895899a8536481493803604f91ad82630682eb35579a384430954e2b4d863f8b7dda50b9346df23db58b874031e4b65d"); | ||
}); | ||
it("int32", function() { | ||
expect(x11.shavite(int32,2)).to.equal("ba96b7af4ee87106b7cc2c0ba6b7c2682e0c32e4035a0dcb4cbd16e61c619d875154c18e473ac19180061791b4a0c1fdbc755d5b0d8d349c0dd4a8cc9632b314"); | ||
}); | ||
}); | ||
describe("simd", function() { | ||
it("empty string", function() { | ||
expect(x11.simd(empty)).to.equal("51a5af7e243cd9a5989f7792c880c4c3168c3d60c4518725fe5757d1f7a69c6366977eaba7905ce2da5d7cfd07773725f0935b55f3efb954996689a49b6d29e0"); | ||
}); | ||
it("fox string", function() { | ||
expect(x11.simd(fox)).to.equal("ca493ce78cc2a63b5a48393e61d113d59a930b3e76d062ab58177345c48b59890a08661d04dd6160a1b42d215f1e303d97ab0abb54e65f758f79aee2b182b34b"); | ||
}); | ||
it("dash string", function() { | ||
expect(x11.simd(dash)).to.equal("e736a132375bd8aa02d00ea3ff3f0ef4cb8fbdd0b3cf3d619cf3e270896d2911105dc9bf46c395db98f17601529d24b8fa89a28e75f73da110d91a19c44f8975"); | ||
}); | ||
it("dream string", function() { | ||
expect(x11.simd(longDream)).to.equal("0b73b8ba451b53acc9c489ed5b5233429525abcacc63378e31883323b5630546337b2ece37688fd91507c60f7f3ac5494bc104451b776103e7dd308a3fb4d1c8"); | ||
}); | ||
it("int32", function() { | ||
expect(x11.simd(int32,2)).to.equal("e4e176b21fa5453267af41fac25aea3519ddf9a6e734c240508216f159ce01188a6024955c689030a1558fa9d4f94835046d4d77c27c607ee4582e554e81dfe4"); | ||
}); | ||
}); | ||
describe("skein", function() { | ||
it("empty string", function() { | ||
expect(x11.skein(empty)).to.equal("bc5b4c50925519c290cc634277ae3d6257212395cba733bbad37a4af0fa06af41fca7903d06564fea7a2d3730dbdb80c1f85562dfcc070334ea4d1d9e72cba7a"); | ||
}); | ||
it("fox string", function() { | ||
expect(x11.skein(fox)).to.equal("94c2ae036dba8783d0b3f7d6cc111ff810702f5c77707999be7e1c9486ff238a7044de734293147359b4ac7e1d09cd247c351d69826b78dcddd951f0ef912713"); | ||
}); | ||
it("dash string", function() { | ||
expect(x11.skein(dash)).to.equal("1db131ba5bc4b3ec9e381a752b3f0d53e8dd25e3d22aa8b9f17b570c3b5938833b91a54939ba873d28483e8b936f9584f06e80b1232a716a074377abd5c2b3f0"); | ||
}); | ||
it("dream string", function() { | ||
expect(x11.skein(longDream)).to.equal("56eda4c36c514c2088ca4fc80f53aa083041ccc070b933f450e748cb432fa664821fd0f1d07e9ef2db3e2d6864d1a6239009b55767d9d7de7789734b351e7c00"); | ||
}); | ||
it("int32", function() { | ||
expect(x11.skein(int32,2)).to.equal("a66d180741a60737bdfc6a94f92bed9726bf03f162de2dc0829d1b285b1d2fbcd132ca42e97b178a97268a8d3e0f0f6548ea305e5c3ac2b5a9a2d1c9bd9f7fac"); | ||
}); | ||
}); | ||
describe("x11", function() { | ||
it("empty string", function() { | ||
expect(x11.digest(empty)).to.equal("51b572209083576ea221c27e62b4e22063257571ccb6cc3dc3cd17eb67584eba"); | ||
}); | ||
it("fox string", function() { | ||
expect(x11.digest(fox)).to.equal("534536a4e4f16b32447f02f77200449dc2f23b532e3d9878fe111c9de666bc5c"); | ||
}); | ||
it("dash string", function() { | ||
expect(x11.digest(dash)).to.equal("fe809ebca8753d907f6ad32cdcf8e5c4e090d7bece5df35b2147e10b88c12d26"); | ||
}); | ||
it("dream string", function() { | ||
expect(x11.digest(longDream)).to.equal("5c0996b9d49dbe84e29f1b818c1fa9e73549f894a71b8a258964b8f0ecf3c866"); | ||
}); | ||
// TODO: | ||
//it("int32", function() { | ||
// expect(x11.digest(int32,2)).to.equal("?"); | ||
//}); | ||
}); | ||
}); | ||
}); |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
643816
13081
117
20
43
1