├── .eslintrc.yml ├── .gitignore ├── .travis.yml ├── Gruntfile.js ├── LICENSE ├── README.md ├── dist ├── x11-hash.js └── x11-hash.min.js ├── index.js ├── lib ├── aes.js ├── blake.js ├── bmw.js ├── cubehash.js ├── echo.js ├── groestl.js ├── helper.js ├── jh.js ├── keccak.js ├── luffa.js ├── op.js ├── shavite.js ├── simd.js └── skein.js ├── package-lock.json ├── package.json └── test ├── benchmarks.js └── test.js /.eslintrc.yml: -------------------------------------------------------------------------------- 1 | extends: eslint:recommended 2 | env: 3 | node: true 4 | browser: true 5 | es6: true 6 | mocha: true 7 | 8 | rules: 9 | block-scoped-var: 2 10 | callback-return: 2 11 | complexity: [2, 17] 12 | dot-location: [2, property] 13 | dot-notation: 2 14 | eol-last: 2 15 | eqeqeq: 2 16 | indent: [1, 4, SwitchCase: 1] 17 | function-paren-newline: 2 18 | key-spacing: 2 19 | keyword-spacing: 2 20 | linebreak-style: [2, unix] 21 | new-parens: 2 22 | newline-per-chained-call: 2 23 | no-alert: 2 24 | no-console: [1, allow: [warn, error]] 25 | no-control-regex: 0 26 | no-eq-null: 2 27 | no-delete-var: 2 28 | no-dupe-keys: 2 29 | no-else-return: 2 30 | no-empty-pattern: 2 31 | no-fallthrough: 2 32 | no-floating-decimal: 2 33 | no-implicit-coercion: 2 34 | no-invalid-this: 2 35 | no-irregular-whitespace: 2 36 | no-lonely-if: 2 37 | no-multi-spaces: 2 38 | no-multiple-empty-lines: 2 39 | no-redeclare: 2 40 | no-regex-spaces: 2 41 | no-return-assign: 2 42 | no-shadow: 1 43 | no-self-assign: 2 44 | no-trailing-spaces: 2 45 | no-undef: 2 46 | no-unneeded-ternary: 2 47 | no-unused-labels: 2 48 | no-use-before-define: [2, nofunc] 49 | no-useless-escape: 2 50 | no-useless-return: 2 51 | no-whitespace-before-property: 2 52 | nonblock-statement-body-position: 2 53 | object-curly-spacing: 2 54 | object-property-newline: 2 55 | quotes: [2, single, avoid-escape] 56 | semi: [2, always] 57 | strict: [2, global] 58 | wrap-iife: 2 59 | 60 | parserOptions: 61 | ecmaVersion: 6 62 | sourceType: script 63 | ecmaFeatures: 64 | jsx: true 65 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | 3 | # Logs 4 | logs 5 | *.log 6 | npm-debug.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | 13 | # WebStorm settings 14 | .idea 15 | .idea/* 16 | 17 | # Directory for instrumented libs generated by jscoverage/JSCover 18 | lib-cov 19 | 20 | # Coverage directory used by tools like istanbul 21 | coverage 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # node-waf configuration 27 | .lock-wscript 28 | 29 | # Compiled binary addons (http://nodejs.org/api/addons.html) 30 | build/Release 31 | 32 | # Dependency directory 33 | node_modules 34 | 35 | # Optional npm cache directory 36 | .npm 37 | 38 | # Optional REPL history 39 | .node_repl_history 40 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | dist: trusty 3 | sudo: required 4 | node_js: 5 | - '6' 6 | - '7' 7 | - '8' 8 | - '9' 9 | 10 | addons: 11 | chrome: stable 12 | before_install: 13 | # Needed for Karma test runner 14 | - export DISPLAY=:99.0 15 | - sh -e /etc/init.d/xvfb start 16 | - sleep 3 # give xvfb some time to start 17 | install: 18 | - npm install 19 | 20 | script: 21 | - npm run test 22 | -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = function (grunt) { 4 | 5 | grunt.loadNpmTasks('grunt-browserify'); 6 | grunt.loadNpmTasks('grunt-contrib-uglify'); 7 | grunt.loadNpmTasks('grunt-contrib-clean'); 8 | grunt.loadNpmTasks('grunt-karma'); 9 | grunt.loadNpmTasks('grunt-multi'); 10 | grunt.registerTask('default', ['clean', 'browserify', 'multi:karmaDebug', 'uglify', 'multi:karmaMin']); 11 | 12 | grunt.initConfig({ 13 | 14 | // property for browserified or minified bundle path for Karma 15 | targetBundle: '', 16 | 17 | clean: ['dist/*'], 18 | 19 | pkg: grunt.file.readJSON('package.json'), 20 | 21 | // browserify the AMD code 22 | browserify: { 23 | main: { 24 | files: { 25 | 'dist/x11-hash.js': ['lib'] 26 | }, 27 | options: { 28 | require: [ 29 | './index.js:x11hash', 30 | 'buffer' 31 | ] 32 | } 33 | } 34 | }, 35 | // inline Karma config 36 | karma: { 37 | unit: { 38 | options: { 39 | basePath: '', 40 | frameworks: ['mocha', 'chai'], 41 | files: [ 42 | '<%= targetBundle %>', 43 | 'test/test.js' 44 | ], 45 | exclude: [], 46 | browserNoActivityTimeout: 60000, 47 | reporters: ['mocha'], 48 | port: 9876, 49 | colors: true, 50 | logLevel: 'INFO', 51 | autoWatch: false, 52 | concurrency: Infinity, 53 | customLaunchers: { 54 | FirefoxHeadless: { 55 | base: 'Firefox', 56 | flags: ['-headless'], 57 | }, 58 | }, 59 | browsers: ['ChromeHeadless', 'Firefox'], 60 | singleRun: true, 61 | plugins: [ 62 | 'karma-chrome-launcher', 63 | 'karma-firefox-launcher', 64 | 'karma-mocha-reporter', 65 | 'karma-mocha', 66 | 'karma-chai' 67 | ] 68 | } 69 | } 70 | }, 71 | // karma task is ran first on the browserified bundle then again 72 | // on the minified version to ensure all bundles are tested 73 | multi: { 74 | karmaDebug: { 75 | options: { 76 | config: { 77 | targetBundle: 'dist/x11-hash.js' 78 | }, 79 | tasks: ['karma'] 80 | } 81 | }, 82 | karmaMin: { 83 | options: { 84 | config: { 85 | targetBundle: 'dist/x11-hash.min.js' 86 | }, 87 | tasks: ['karma'] 88 | } 89 | } 90 | }, 91 | // minify 92 | uglify: { 93 | my_target: { 94 | files: { 95 | 'dist/x11-hash.min.js': ['dist/x11-hash.js'] 96 | } 97 | } 98 | } 99 | }); 100 | }; 101 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Quantum Explorer 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # x11-hash-js 2 | 3 | > 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. 4 | 5 | ## Usage 6 | 7 | Install the library as a Node module. 8 | 9 | ``` 10 | $ npm install --save @dashevo/x11-hash-js 11 | ``` 12 | 13 | Reference the library within a Node module. 14 | 15 | ```js 16 | var x11 = require('x11-hash-js'); 17 | 18 | console.log(x11.digest('The great experiment continues.')); 19 | // -> '4da3b7c5ff698c6546564ebc72204f31885cd87b75b2b3ca5a93b5d75db85b8c' 20 | ``` 21 | 22 | Download the browserified library from the [dist](https://github.com/dashpay/x11-hash-js/tree/master/dist) folder and include it in your HTML. 23 | 24 | ```html 25 | 26 |
27 | 28 | 33 | 34 | 35 | 36 | ``` 37 | 38 | Call individual hash functions within the x11 digest. 39 | 40 | ```js 41 | console.log(x11.blake('The great experiment continues.')); 42 | // -> '8f257723af0741fb7d3d8c264a5ea86a57d4ae833557de04f5f78fad1ac17d6dfa1ae4a78a7564c08fc21d5d8cdd2793ca17d5500ecc2b43eb8aaf9c220d7b49' 43 | 44 | console.log(x11.bmw('The great experiment continues.')); 45 | // -> '7b30b4f1ccd83692bc6a01b1f7e374b59b81da6b21421679ae59d84c4f73afec5a0857565b6ebc1b9ddf9da5e75bf1ecd0ba6f5a75b7926ba9278385fb83533c' 46 | 47 | console.log(x11.cubehash('The great experiment continues.')); 48 | // -> '64394bcb9d7844070c8516480ea5f03f68386f33c3829e08bf38bea11f09eba5806aa7831cfbe8e515678b0cad7d4ac888ea2b9ea8f63f0cc918d5a6a76b7ae9' 49 | 50 | console.log(x11.echo('The great experiment continues.')); 51 | // -> 'b1db282b1672f3423c1e1bdf4496a8ddda0b6f483e92e9a8be2efbaab0ea230814f1f1485d919285deac13794dc215000eb39a47ac32bfc07299a0475049be2e' 52 | 53 | console.log(x11.groestl('The great experiment continues.')); 54 | // -> '6cea044acf31194eab7d1adb704712c34dd4f0b6a470b0f297832addab691faa459474c651efdbebddb138a2a9adb41705e0fb75741775314ddd8e5449ace986' 55 | 56 | console.log(x11.jh('The great experiment continues.')); 57 | // -> '90c7090e9d9a45bc79f476ae7fa3e7e4416d1c26b127d1d418ee9bd96b541933b0f144a0d4c6594944393e39fb6b98ceb54752af55198e00953d638183482521' 58 | 59 | console.log(x11.keccak('The great experiment continues.')); 60 | // -> '4c7e9c893fcdc87a2fd604574a4a5b9a0b6864665ed19057dedf24858314690ba45d6bbcfb86cd7182d1677e2d30dad9716ee99eb8ea267c6638f47ef20e0226' 61 | 62 | console.log(x11.luffa('The great experiment continues.')); 63 | // -> 'ea531ce38473fc4bd508c5396194dd6201699d47e25bd4d6b0c5dc7ab0627831e01ea027ebe33d80f608f139aa9fd0c6d923f32de9b5d714026300ed1c9a2f48' 64 | 65 | console.log(x11.shavite('The great experiment continues.')); 66 | // -> '6fbca2d53a26e22e6df1a8064230bdb98c0a612b64dad958f16757cf8ee8526862a0e4f56be69b98b07f0ea47db7211cf42352443fc806013374e819f26cb923' 67 | 68 | console.log(x11.simd('The great experiment continues.')); 69 | // -> '13ae2c08260f7d5abcfa791446800c1eaed8c5332ec437222428a28823aa2ba19a5907a2c860c12c0b894bdf9c0d64f807cb9512f1ed42980d15747ff4a26c1c' 70 | 71 | console.log(x11.skein('The great experiment continues.')); 72 | // -> '88a9dd727bb9b7cbd59612edbcd6b321427f473acc5673d7dffb16071dc71821d0cc1b94dccf7e5f71a0a94019a7e764d3315c3f4a40f73aee4ad98c75bcc2f7' 73 | 74 | ``` 75 | 76 | ## API 77 | 78 | ### x11.digest(str) 79 | 80 | Returns a `string` representation of the x11 hash of an input `string` ***str***. 81 | 82 | #### str 83 | 84 | Type: `string` 85 | 86 | The string to be hashed. 87 | 88 | ### x11.digest(input, inputFormat, outputFormat) 89 | 90 | Returns the x11 hash of ***input*** with the input and output types variable between a `string`, 8 bit `array` or 32 bit `array` 91 | 92 | #### input 93 | 94 | Type: `string` or `array` 95 | 96 | The input data to be hashed. 97 | 98 | #### inputFormat 99 | 100 | Type: `number` 101 | 102 | Specifies the format and type of the ***input*** value: 103 | 104 | - **0**: `string` 105 | - **1**: 8 bit `array` 106 | - **2**: 32 bit `array` 107 | 108 | #### outputFormat 109 | 110 | Type: `number` 111 | 112 | Specifies the format and type of the return value: 113 | 114 | - **0**: `string` 115 | - **1**: 8 bit `array` 116 | - **2**: 32 bit `array` 117 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var blake = require('./lib/blake'); 4 | var keccak = require('./lib/keccak').keccak_512; 5 | var skein = require('./lib/skein'); 6 | var luffa = require('./lib/luffa'); 7 | var simd = require('./lib/simd'); 8 | var shavite = require('./lib/shavite'); 9 | var cubehash = require('./lib/cubehash'); 10 | var jh = require('./lib/jh'); 11 | var echo = require('./lib/echo'); 12 | var groestl = require('./lib/groestl'); 13 | var bmw = require('./lib/bmw'); 14 | var h = require('./lib/helper'); 15 | 16 | /** 17 | * Error codes 18 | */ 19 | var errors = module.exports.errors = { 20 | input_not_specified: 'input not specified', 21 | input_single_invalid_type: 'input must be string when inputFormat is not specified', 22 | input_format_mismatch_string: 'input format mismatch: input should be an string', 23 | input_format_mismatch_array: 'input format mismatch: input should be an array', 24 | input_format_invalid: 'invalid input format', 25 | output_format_invalid: 'invalid output format' 26 | }; 27 | 28 | /** 29 | * Obtain an x11 hash 30 | * @param input {string|array|buffer} input data to hash 31 | * @param inputFormat {number} optional - format of the input: 0: string, 1: 8 bit array/Buffer, 2: 32 bit array 32 | * @param outputFormat {number} optional - format of the output: 0: string, 1: 8 bit array, 2: 32 bit array 33 | * @returns {string|array} x11 hash of input as a string, 8-bit array or 32-bit array 34 | */ 35 | module.exports.digest = function (input, inputFormat, outputFormat) { 36 | 37 | // argument exceptions 38 | if (input === undefined) { 39 | throw (errors.input_not_specified); 40 | } else if (inputFormat === undefined) { 41 | 42 | // single input arg must be string 43 | if (!(typeof input === 'string' || input instanceof String)) { 44 | throw (errors.input_single_invalid_type); 45 | } 46 | } else { 47 | 48 | // validate input arguments 49 | if (inputFormat === 0) { 50 | if (!(typeof input === 'string' || input instanceof String)) { 51 | throw (errors.input_format_mismatch_string); 52 | } 53 | } else if (inputFormat === 1 || inputFormat === 2) { 54 | if (!Array.isArray(input) && !h.isBuffer(input)) { 55 | throw (errors.input_format_mismatch_array); 56 | } 57 | } else { 58 | throw (errors.input_format_invalid); 59 | } 60 | 61 | // validate output format 62 | if (outputFormat !== undefined 63 | && outputFormat !== 0 64 | && outputFormat !== 1 65 | && outputFormat !== 2) { 66 | throw (errors.output_format_invalid); 67 | } 68 | } 69 | 70 | // obtain the x11 hash of the input 71 | var a = blake(input, inputFormat, 2); 72 | a = bmw(a, 2, 2); 73 | a = groestl(a, 2, 2); 74 | a = skein(a, 2, 2); 75 | a = jh(a, 2, 2); 76 | a = this.keccak(a, 2, 1); 77 | a = luffa(a, 1, 2); 78 | a = cubehash(a, 2, 2); 79 | a = shavite(a, 2, 2); 80 | a = simd(a, 2, 2); 81 | a = echo(a, 2, 2); 82 | a = a.slice(0, 8); 83 | 84 | // output 32-bit array 85 | if (outputFormat === 2) { 86 | return h.int32Buffer2Bytes(a); 87 | } 88 | // output 8-bit array 89 | else if (outputFormat === 1) { 90 | return a; 91 | } 92 | // output string 93 | return h.int32ArrayToHexString(a); 94 | }; 95 | 96 | // individual x11 hash functions... 97 | module.exports.blake = function (str, format, output) { 98 | return blake(str, format, output); 99 | }; 100 | 101 | module.exports.bmw = function (str, format, output) { 102 | return bmw(str, format, output); 103 | }; 104 | 105 | module.exports.cubehash = function (str, format, output) { 106 | return cubehash(str, format, output); 107 | }; 108 | 109 | module.exports.echo = function (str, format, output) { 110 | return echo(str, format, output); 111 | }; 112 | 113 | module.exports.groestl = function (str, format, output) { 114 | return groestl(str, format, output); 115 | }; 116 | 117 | module.exports.jh = function (str, format, output) { 118 | return jh(str, format, output); 119 | }; 120 | 121 | module.exports.keccak = function (str, format, output) { 122 | var msg = str; 123 | if (format === 2) { 124 | msg = h.int32Buffer2Bytes(str); 125 | } 126 | if (output === 1) { 127 | return keccak.array(msg); 128 | } else if (output === 2) { 129 | return h.bytes2Int32Buffer(keccak.array(msg)); 130 | } 131 | return keccak.hex(msg); 132 | 133 | }; 134 | 135 | module.exports.luffa = function (str, format, output) { 136 | return luffa(str, format, output); 137 | }; 138 | 139 | module.exports.shavite = function (str, format, output) { 140 | return shavite(str, format, output); 141 | }; 142 | 143 | module.exports.simd = function (str, format, output) { 144 | return simd(str, format, output); 145 | }; 146 | 147 | module.exports.skein = function (str, format, output) { 148 | return skein(str, format, output); 149 | }; 150 | -------------------------------------------------------------------------------- /lib/aes.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var op = require('./op'); 3 | var h = require('./helper'); 4 | 5 | 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==')); 6 | 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==')); 7 | 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==')); 8 | 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==')); 9 | // var AES0 = [ 10 | // 0xA56363C6, 0x847C7CF8, 0x997777EE, 0x8D7B7BF6, 11 | // 0x0DF2F2FF, 0xBD6B6BD6, 0xB16F6FDE, 0x54C5C591, 12 | // 0x50303060, 0x03010102, 0xA96767CE, 0x7D2B2B56, 13 | // 0x19FEFEE7, 0x62D7D7B5, 0xE6ABAB4D, 0x9A7676EC, 14 | // 0x45CACA8F, 0x9D82821F, 0x40C9C989, 0x877D7DFA, 15 | // 0x15FAFAEF, 0xEB5959B2, 0xC947478E, 0x0BF0F0FB, 16 | // 0xECADAD41, 0x67D4D4B3, 0xFDA2A25F, 0xEAAFAF45, 17 | // 0xBF9C9C23, 0xF7A4A453, 0x967272E4, 0x5BC0C09B, 18 | // 0xC2B7B775, 0x1CFDFDE1, 0xAE93933D, 0x6A26264C, 19 | // 0x5A36366C, 0x413F3F7E, 0x02F7F7F5, 0x4FCCCC83, 20 | // 0x5C343468, 0xF4A5A551, 0x34E5E5D1, 0x08F1F1F9, 21 | // 0x937171E2, 0x73D8D8AB, 0x53313162, 0x3F15152A, 22 | // 0x0C040408, 0x52C7C795, 0x65232346, 0x5EC3C39D, 23 | // 0x28181830, 0xA1969637, 0x0F05050A, 0xB59A9A2F, 24 | // 0x0907070E, 0x36121224, 0x9B80801B, 0x3DE2E2DF, 25 | // 0x26EBEBCD, 0x6927274E, 0xCDB2B27F, 0x9F7575EA, 26 | // 0x1B090912, 0x9E83831D, 0x742C2C58, 0x2E1A1A34, 27 | // 0x2D1B1B36, 0xB26E6EDC, 0xEE5A5AB4, 0xFBA0A05B, 28 | // 0xF65252A4, 0x4D3B3B76, 0x61D6D6B7, 0xCEB3B37D, 29 | // 0x7B292952, 0x3EE3E3DD, 0x712F2F5E, 0x97848413, 30 | // 0xF55353A6, 0x68D1D1B9, 0x00000000, 0x2CEDEDC1, 31 | // 0x60202040, 0x1FFCFCE3, 0xC8B1B179, 0xED5B5BB6, 32 | // 0xBE6A6AD4, 0x46CBCB8D, 0xD9BEBE67, 0x4B393972, 33 | // 0xDE4A4A94, 0xD44C4C98, 0xE85858B0, 0x4ACFCF85, 34 | // 0x6BD0D0BB, 0x2AEFEFC5, 0xE5AAAA4F, 0x16FBFBED, 35 | // 0xC5434386, 0xD74D4D9A, 0x55333366, 0x94858511, 36 | // 0xCF45458A, 0x10F9F9E9, 0x06020204, 0x817F7FFE, 37 | // 0xF05050A0, 0x443C3C78, 0xBA9F9F25, 0xE3A8A84B, 38 | // 0xF35151A2, 0xFEA3A35D, 0xC0404080, 0x8A8F8F05, 39 | // 0xAD92923F, 0xBC9D9D21, 0x48383870, 0x04F5F5F1, 40 | // 0xDFBCBC63, 0xC1B6B677, 0x75DADAAF, 0x63212142, 41 | // 0x30101020, 0x1AFFFFE5, 0x0EF3F3FD, 0x6DD2D2BF, 42 | // 0x4CCDCD81, 0x140C0C18, 0x35131326, 0x2FECECC3, 43 | // 0xE15F5FBE, 0xA2979735, 0xCC444488, 0x3917172E, 44 | // 0x57C4C493, 0xF2A7A755, 0x827E7EFC, 0x473D3D7A, 45 | // 0xAC6464C8, 0xE75D5DBA, 0x2B191932, 0x957373E6, 46 | // 0xA06060C0, 0x98818119, 0xD14F4F9E, 0x7FDCDCA3, 47 | // 0x66222244, 0x7E2A2A54, 0xAB90903B, 0x8388880B, 48 | // 0xCA46468C, 0x29EEEEC7, 0xD3B8B86B, 0x3C141428, 49 | // 0x79DEDEA7, 0xE25E5EBC, 0x1D0B0B16, 0x76DBDBAD, 50 | // 0x3BE0E0DB, 0x56323264, 0x4E3A3A74, 0x1E0A0A14, 51 | // 0xDB494992, 0x0A06060C, 0x6C242448, 0xE45C5CB8, 52 | // 0x5DC2C29F, 0x6ED3D3BD, 0xEFACAC43, 0xA66262C4, 53 | // 0xA8919139, 0xA4959531, 0x37E4E4D3, 0x8B7979F2, 54 | // 0x32E7E7D5, 0x43C8C88B, 0x5937376E, 0xB76D6DDA, 55 | // 0x8C8D8D01, 0x64D5D5B1, 0xD24E4E9C, 0xE0A9A949, 56 | // 0xB46C6CD8, 0xFA5656AC, 0x07F4F4F3, 0x25EAEACF, 57 | // 0xAF6565CA, 0x8E7A7AF4, 0xE9AEAE47, 0x18080810, 58 | // 0xD5BABA6F, 0x887878F0, 0x6F25254A, 0x722E2E5C, 59 | // 0x241C1C38, 0xF1A6A657, 0xC7B4B473, 0x51C6C697, 60 | // 0x23E8E8CB, 0x7CDDDDA1, 0x9C7474E8, 0x211F1F3E, 61 | // 0xDD4B4B96, 0xDCBDBD61, 0x868B8B0D, 0x858A8A0F, 62 | // 0x907070E0, 0x423E3E7C, 0xC4B5B571, 0xAA6666CC, 63 | // 0xD8484890, 0x05030306, 0x01F6F6F7, 0x120E0E1C, 64 | // 0xA36161C2, 0x5F35356A, 0xF95757AE, 0xD0B9B969, 65 | // 0x91868617, 0x58C1C199, 0x271D1D3A, 0xB99E9E27, 66 | // 0x38E1E1D9, 0x13F8F8EB, 0xB398982B, 0x33111122, 67 | // 0xBB6969D2, 0x70D9D9A9, 0x898E8E07, 0xA7949433, 68 | // 0xB69B9B2D, 0x221E1E3C, 0x92878715, 0x20E9E9C9, 69 | // 0x49CECE87, 0xFF5555AA, 0x78282850, 0x7ADFDFA5, 70 | // 0x8F8C8C03, 0xF8A1A159, 0x80898909, 0x170D0D1A, 71 | // 0xDABFBF65, 0x31E6E6D7, 0xC6424284, 0xB86868D0, 72 | // 0xC3414182, 0xB0999929, 0x772D2D5A, 0x110F0F1E, 73 | // 0xCBB0B07B, 0xFC5454A8, 0xD6BBBB6D, 0x3A16162C 74 | // ]; 75 | 76 | // var AES1 = [ 77 | // 0x6363C6A5, 0x7C7CF884, 0x7777EE99, 0x7B7BF68D, 78 | // 0xF2F2FF0D, 0x6B6BD6BD, 0x6F6FDEB1, 0xC5C59154, 79 | // 0x30306050, 0x01010203, 0x6767CEA9, 0x2B2B567D, 80 | // 0xFEFEE719, 0xD7D7B562, 0xABAB4DE6, 0x7676EC9A, 81 | // 0xCACA8F45, 0x82821F9D, 0xC9C98940, 0x7D7DFA87, 82 | // 0xFAFAEF15, 0x5959B2EB, 0x47478EC9, 0xF0F0FB0B, 83 | // 0xADAD41EC, 0xD4D4B367, 0xA2A25FFD, 0xAFAF45EA, 84 | // 0x9C9C23BF, 0xA4A453F7, 0x7272E496, 0xC0C09B5B, 85 | // 0xB7B775C2, 0xFDFDE11C, 0x93933DAE, 0x26264C6A, 86 | // 0x36366C5A, 0x3F3F7E41, 0xF7F7F502, 0xCCCC834F, 87 | // 0x3434685C, 0xA5A551F4, 0xE5E5D134, 0xF1F1F908, 88 | // 0x7171E293, 0xD8D8AB73, 0x31316253, 0x15152A3F, 89 | // 0x0404080C, 0xC7C79552, 0x23234665, 0xC3C39D5E, 90 | // 0x18183028, 0x969637A1, 0x05050A0F, 0x9A9A2FB5, 91 | // 0x07070E09, 0x12122436, 0x80801B9B, 0xE2E2DF3D, 92 | // 0xEBEBCD26, 0x27274E69, 0xB2B27FCD, 0x7575EA9F, 93 | // 0x0909121B, 0x83831D9E, 0x2C2C5874, 0x1A1A342E, 94 | // 0x1B1B362D, 0x6E6EDCB2, 0x5A5AB4EE, 0xA0A05BFB, 95 | // 0x5252A4F6, 0x3B3B764D, 0xD6D6B761, 0xB3B37DCE, 96 | // 0x2929527B, 0xE3E3DD3E, 0x2F2F5E71, 0x84841397, 97 | // 0x5353A6F5, 0xD1D1B968, 0x00000000, 0xEDEDC12C, 98 | // 0x20204060, 0xFCFCE31F, 0xB1B179C8, 0x5B5BB6ED, 99 | // 0x6A6AD4BE, 0xCBCB8D46, 0xBEBE67D9, 0x3939724B, 100 | // 0x4A4A94DE, 0x4C4C98D4, 0x5858B0E8, 0xCFCF854A, 101 | // 0xD0D0BB6B, 0xEFEFC52A, 0xAAAA4FE5, 0xFBFBED16, 102 | // 0x434386C5, 0x4D4D9AD7, 0x33336655, 0x85851194, 103 | // 0x45458ACF, 0xF9F9E910, 0x02020406, 0x7F7FFE81, 104 | // 0x5050A0F0, 0x3C3C7844, 0x9F9F25BA, 0xA8A84BE3, 105 | // 0x5151A2F3, 0xA3A35DFE, 0x404080C0, 0x8F8F058A, 106 | // 0x92923FAD, 0x9D9D21BC, 0x38387048, 0xF5F5F104, 107 | // 0xBCBC63DF, 0xB6B677C1, 0xDADAAF75, 0x21214263, 108 | // 0x10102030, 0xFFFFE51A, 0xF3F3FD0E, 0xD2D2BF6D, 109 | // 0xCDCD814C, 0x0C0C1814, 0x13132635, 0xECECC32F, 110 | // 0x5F5FBEE1, 0x979735A2, 0x444488CC, 0x17172E39, 111 | // 0xC4C49357, 0xA7A755F2, 0x7E7EFC82, 0x3D3D7A47, 112 | // 0x6464C8AC, 0x5D5DBAE7, 0x1919322B, 0x7373E695, 113 | // 0x6060C0A0, 0x81811998, 0x4F4F9ED1, 0xDCDCA37F, 114 | // 0x22224466, 0x2A2A547E, 0x90903BAB, 0x88880B83, 115 | // 0x46468CCA, 0xEEEEC729, 0xB8B86BD3, 0x1414283C, 116 | // 0xDEDEA779, 0x5E5EBCE2, 0x0B0B161D, 0xDBDBAD76, 117 | // 0xE0E0DB3B, 0x32326456, 0x3A3A744E, 0x0A0A141E, 118 | // 0x494992DB, 0x06060C0A, 0x2424486C, 0x5C5CB8E4, 119 | // 0xC2C29F5D, 0xD3D3BD6E, 0xACAC43EF, 0x6262C4A6, 120 | // 0x919139A8, 0x959531A4, 0xE4E4D337, 0x7979F28B, 121 | // 0xE7E7D532, 0xC8C88B43, 0x37376E59, 0x6D6DDAB7, 122 | // 0x8D8D018C, 0xD5D5B164, 0x4E4E9CD2, 0xA9A949E0, 123 | // 0x6C6CD8B4, 0x5656ACFA, 0xF4F4F307, 0xEAEACF25, 124 | // 0x6565CAAF, 0x7A7AF48E, 0xAEAE47E9, 0x08081018, 125 | // 0xBABA6FD5, 0x7878F088, 0x25254A6F, 0x2E2E5C72, 126 | // 0x1C1C3824, 0xA6A657F1, 0xB4B473C7, 0xC6C69751, 127 | // 0xE8E8CB23, 0xDDDDA17C, 0x7474E89C, 0x1F1F3E21, 128 | // 0x4B4B96DD, 0xBDBD61DC, 0x8B8B0D86, 0x8A8A0F85, 129 | // 0x7070E090, 0x3E3E7C42, 0xB5B571C4, 0x6666CCAA, 130 | // 0x484890D8, 0x03030605, 0xF6F6F701, 0x0E0E1C12, 131 | // 0x6161C2A3, 0x35356A5F, 0x5757AEF9, 0xB9B969D0, 132 | // 0x86861791, 0xC1C19958, 0x1D1D3A27, 0x9E9E27B9, 133 | // 0xE1E1D938, 0xF8F8EB13, 0x98982BB3, 0x11112233, 134 | // 0x6969D2BB, 0xD9D9A970, 0x8E8E0789, 0x949433A7, 135 | // 0x9B9B2DB6, 0x1E1E3C22, 0x87871592, 0xE9E9C920, 136 | // 0xCECE8749, 0x5555AAFF, 0x28285078, 0xDFDFA57A, 137 | // 0x8C8C038F, 0xA1A159F8, 0x89890980, 0x0D0D1A17, 138 | // 0xBFBF65DA, 0xE6E6D731, 0x424284C6, 0x6868D0B8, 139 | // 0x414182C3, 0x999929B0, 0x2D2D5A77, 0x0F0F1E11, 140 | // 0xB0B07BCB, 0x5454A8FC, 0xBBBB6DD6, 0x16162C3A 141 | // ]; 142 | 143 | // var AES2 = [ 144 | // 0x63C6A563, 0x7CF8847C, 0x77EE9977, 0x7BF68D7B, 145 | // 0xF2FF0DF2, 0x6BD6BD6B, 0x6FDEB16F, 0xC59154C5, 146 | // 0x30605030, 0x01020301, 0x67CEA967, 0x2B567D2B, 147 | // 0xFEE719FE, 0xD7B562D7, 0xAB4DE6AB, 0x76EC9A76, 148 | // 0xCA8F45CA, 0x821F9D82, 0xC98940C9, 0x7DFA877D, 149 | // 0xFAEF15FA, 0x59B2EB59, 0x478EC947, 0xF0FB0BF0, 150 | // 0xAD41ECAD, 0xD4B367D4, 0xA25FFDA2, 0xAF45EAAF, 151 | // 0x9C23BF9C, 0xA453F7A4, 0x72E49672, 0xC09B5BC0, 152 | // 0xB775C2B7, 0xFDE11CFD, 0x933DAE93, 0x264C6A26, 153 | // 0x366C5A36, 0x3F7E413F, 0xF7F502F7, 0xCC834FCC, 154 | // 0x34685C34, 0xA551F4A5, 0xE5D134E5, 0xF1F908F1, 155 | // 0x71E29371, 0xD8AB73D8, 0x31625331, 0x152A3F15, 156 | // 0x04080C04, 0xC79552C7, 0x23466523, 0xC39D5EC3, 157 | // 0x18302818, 0x9637A196, 0x050A0F05, 0x9A2FB59A, 158 | // 0x070E0907, 0x12243612, 0x801B9B80, 0xE2DF3DE2, 159 | // 0xEBCD26EB, 0x274E6927, 0xB27FCDB2, 0x75EA9F75, 160 | // 0x09121B09, 0x831D9E83, 0x2C58742C, 0x1A342E1A, 161 | // 0x1B362D1B, 0x6EDCB26E, 0x5AB4EE5A, 0xA05BFBA0, 162 | // 0x52A4F652, 0x3B764D3B, 0xD6B761D6, 0xB37DCEB3, 163 | // 0x29527B29, 0xE3DD3EE3, 0x2F5E712F, 0x84139784, 164 | // 0x53A6F553, 0xD1B968D1, 0x00000000, 0xEDC12CED, 165 | // 0x20406020, 0xFCE31FFC, 0xB179C8B1, 0x5BB6ED5B, 166 | // 0x6AD4BE6A, 0xCB8D46CB, 0xBE67D9BE, 0x39724B39, 167 | // 0x4A94DE4A, 0x4C98D44C, 0x58B0E858, 0xCF854ACF, 168 | // 0xD0BB6BD0, 0xEFC52AEF, 0xAA4FE5AA, 0xFBED16FB, 169 | // 0x4386C543, 0x4D9AD74D, 0x33665533, 0x85119485, 170 | // 0x458ACF45, 0xF9E910F9, 0x02040602, 0x7FFE817F, 171 | // 0x50A0F050, 0x3C78443C, 0x9F25BA9F, 0xA84BE3A8, 172 | // 0x51A2F351, 0xA35DFEA3, 0x4080C040, 0x8F058A8F, 173 | // 0x923FAD92, 0x9D21BC9D, 0x38704838, 0xF5F104F5, 174 | // 0xBC63DFBC, 0xB677C1B6, 0xDAAF75DA, 0x21426321, 175 | // 0x10203010, 0xFFE51AFF, 0xF3FD0EF3, 0xD2BF6DD2, 176 | // 0xCD814CCD, 0x0C18140C, 0x13263513, 0xECC32FEC, 177 | // 0x5FBEE15F, 0x9735A297, 0x4488CC44, 0x172E3917, 178 | // 0xC49357C4, 0xA755F2A7, 0x7EFC827E, 0x3D7A473D, 179 | // 0x64C8AC64, 0x5DBAE75D, 0x19322B19, 0x73E69573, 180 | // 0x60C0A060, 0x81199881, 0x4F9ED14F, 0xDCA37FDC, 181 | // 0x22446622, 0x2A547E2A, 0x903BAB90, 0x880B8388, 182 | // 0x468CCA46, 0xEEC729EE, 0xB86BD3B8, 0x14283C14, 183 | // 0xDEA779DE, 0x5EBCE25E, 0x0B161D0B, 0xDBAD76DB, 184 | // 0xE0DB3BE0, 0x32645632, 0x3A744E3A, 0x0A141E0A, 185 | // 0x4992DB49, 0x060C0A06, 0x24486C24, 0x5CB8E45C, 186 | // 0xC29F5DC2, 0xD3BD6ED3, 0xAC43EFAC, 0x62C4A662, 187 | // 0x9139A891, 0x9531A495, 0xE4D337E4, 0x79F28B79, 188 | // 0xE7D532E7, 0xC88B43C8, 0x376E5937, 0x6DDAB76D, 189 | // 0x8D018C8D, 0xD5B164D5, 0x4E9CD24E, 0xA949E0A9, 190 | // 0x6CD8B46C, 0x56ACFA56, 0xF4F307F4, 0xEACF25EA, 191 | // 0x65CAAF65, 0x7AF48E7A, 0xAE47E9AE, 0x08101808, 192 | // 0xBA6FD5BA, 0x78F08878, 0x254A6F25, 0x2E5C722E, 193 | // 0x1C38241C, 0xA657F1A6, 0xB473C7B4, 0xC69751C6, 194 | // 0xE8CB23E8, 0xDDA17CDD, 0x74E89C74, 0x1F3E211F, 195 | // 0x4B96DD4B, 0xBD61DCBD, 0x8B0D868B, 0x8A0F858A, 196 | // 0x70E09070, 0x3E7C423E, 0xB571C4B5, 0x66CCAA66, 197 | // 0x4890D848, 0x03060503, 0xF6F701F6, 0x0E1C120E, 198 | // 0x61C2A361, 0x356A5F35, 0x57AEF957, 0xB969D0B9, 199 | // 0x86179186, 0xC19958C1, 0x1D3A271D, 0x9E27B99E, 200 | // 0xE1D938E1, 0xF8EB13F8, 0x982BB398, 0x11223311, 201 | // 0x69D2BB69, 0xD9A970D9, 0x8E07898E, 0x9433A794, 202 | // 0x9B2DB69B, 0x1E3C221E, 0x87159287, 0xE9C920E9, 203 | // 0xCE8749CE, 0x55AAFF55, 0x28507828, 0xDFA57ADF, 204 | // 0x8C038F8C, 0xA159F8A1, 0x89098089, 0x0D1A170D, 205 | // 0xBF65DABF, 0xE6D731E6, 0x4284C642, 0x68D0B868, 206 | // 0x4182C341, 0x9929B099, 0x2D5A772D, 0x0F1E110F, 207 | // 0xB07BCBB0, 0x54A8FC54, 0xBB6DD6BB, 0x162C3A16 208 | // ]; 209 | 210 | // var AES3 = [ 211 | // 0xC6A56363, 0xF8847C7C, 0xEE997777, 0xF68D7B7B, 212 | // 0xFF0DF2F2, 0xD6BD6B6B, 0xDEB16F6F, 0x9154C5C5, 213 | // 0x60503030, 0x02030101, 0xCEA96767, 0x567D2B2B, 214 | // 0xE719FEFE, 0xB562D7D7, 0x4DE6ABAB, 0xEC9A7676, 215 | // 0x8F45CACA, 0x1F9D8282, 0x8940C9C9, 0xFA877D7D, 216 | // 0xEF15FAFA, 0xB2EB5959, 0x8EC94747, 0xFB0BF0F0, 217 | // 0x41ECADAD, 0xB367D4D4, 0x5FFDA2A2, 0x45EAAFAF, 218 | // 0x23BF9C9C, 0x53F7A4A4, 0xE4967272, 0x9B5BC0C0, 219 | // 0x75C2B7B7, 0xE11CFDFD, 0x3DAE9393, 0x4C6A2626, 220 | // 0x6C5A3636, 0x7E413F3F, 0xF502F7F7, 0x834FCCCC, 221 | // 0x685C3434, 0x51F4A5A5, 0xD134E5E5, 0xF908F1F1, 222 | // 0xE2937171, 0xAB73D8D8, 0x62533131, 0x2A3F1515, 223 | // 0x080C0404, 0x9552C7C7, 0x46652323, 0x9D5EC3C3, 224 | // 0x30281818, 0x37A19696, 0x0A0F0505, 0x2FB59A9A, 225 | // 0x0E090707, 0x24361212, 0x1B9B8080, 0xDF3DE2E2, 226 | // 0xCD26EBEB, 0x4E692727, 0x7FCDB2B2, 0xEA9F7575, 227 | // 0x121B0909, 0x1D9E8383, 0x58742C2C, 0x342E1A1A, 228 | // 0x362D1B1B, 0xDCB26E6E, 0xB4EE5A5A, 0x5BFBA0A0, 229 | // 0xA4F65252, 0x764D3B3B, 0xB761D6D6, 0x7DCEB3B3, 230 | // 0x527B2929, 0xDD3EE3E3, 0x5E712F2F, 0x13978484, 231 | // 0xA6F55353, 0xB968D1D1, 0x00000000, 0xC12CEDED, 232 | // 0x40602020, 0xE31FFCFC, 0x79C8B1B1, 0xB6ED5B5B, 233 | // 0xD4BE6A6A, 0x8D46CBCB, 0x67D9BEBE, 0x724B3939, 234 | // 0x94DE4A4A, 0x98D44C4C, 0xB0E85858, 0x854ACFCF, 235 | // 0xBB6BD0D0, 0xC52AEFEF, 0x4FE5AAAA, 0xED16FBFB, 236 | // 0x86C54343, 0x9AD74D4D, 0x66553333, 0x11948585, 237 | // 0x8ACF4545, 0xE910F9F9, 0x04060202, 0xFE817F7F, 238 | // 0xA0F05050, 0x78443C3C, 0x25BA9F9F, 0x4BE3A8A8, 239 | // 0xA2F35151, 0x5DFEA3A3, 0x80C04040, 0x058A8F8F, 240 | // 0x3FAD9292, 0x21BC9D9D, 0x70483838, 0xF104F5F5, 241 | // 0x63DFBCBC, 0x77C1B6B6, 0xAF75DADA, 0x42632121, 242 | // 0x20301010, 0xE51AFFFF, 0xFD0EF3F3, 0xBF6DD2D2, 243 | // 0x814CCDCD, 0x18140C0C, 0x26351313, 0xC32FECEC, 244 | // 0xBEE15F5F, 0x35A29797, 0x88CC4444, 0x2E391717, 245 | // 0x9357C4C4, 0x55F2A7A7, 0xFC827E7E, 0x7A473D3D, 246 | // 0xC8AC6464, 0xBAE75D5D, 0x322B1919, 0xE6957373, 247 | // 0xC0A06060, 0x19988181, 0x9ED14F4F, 0xA37FDCDC, 248 | // 0x44662222, 0x547E2A2A, 0x3BAB9090, 0x0B838888, 249 | // 0x8CCA4646, 0xC729EEEE, 0x6BD3B8B8, 0x283C1414, 250 | // 0xA779DEDE, 0xBCE25E5E, 0x161D0B0B, 0xAD76DBDB, 251 | // 0xDB3BE0E0, 0x64563232, 0x744E3A3A, 0x141E0A0A, 252 | // 0x92DB4949, 0x0C0A0606, 0x486C2424, 0xB8E45C5C, 253 | // 0x9F5DC2C2, 0xBD6ED3D3, 0x43EFACAC, 0xC4A66262, 254 | // 0x39A89191, 0x31A49595, 0xD337E4E4, 0xF28B7979, 255 | // 0xD532E7E7, 0x8B43C8C8, 0x6E593737, 0xDAB76D6D, 256 | // 0x018C8D8D, 0xB164D5D5, 0x9CD24E4E, 0x49E0A9A9, 257 | // 0xD8B46C6C, 0xACFA5656, 0xF307F4F4, 0xCF25EAEA, 258 | // 0xCAAF6565, 0xF48E7A7A, 0x47E9AEAE, 0x10180808, 259 | // 0x6FD5BABA, 0xF0887878, 0x4A6F2525, 0x5C722E2E, 260 | // 0x38241C1C, 0x57F1A6A6, 0x73C7B4B4, 0x9751C6C6, 261 | // 0xCB23E8E8, 0xA17CDDDD, 0xE89C7474, 0x3E211F1F, 262 | // 0x96DD4B4B, 0x61DCBDBD, 0x0D868B8B, 0x0F858A8A, 263 | // 0xE0907070, 0x7C423E3E, 0x71C4B5B5, 0xCCAA6666, 264 | // 0x90D84848, 0x06050303, 0xF701F6F6, 0x1C120E0E, 265 | // 0xC2A36161, 0x6A5F3535, 0xAEF95757, 0x69D0B9B9, 266 | // 0x17918686, 0x9958C1C1, 0x3A271D1D, 0x27B99E9E, 267 | // 0xD938E1E1, 0xEB13F8F8, 0x2BB39898, 0x22331111, 268 | // 0xD2BB6969, 0xA970D9D9, 0x07898E8E, 0x33A79494, 269 | // 0x2DB69B9B, 0x3C221E1E, 0x15928787, 0xC920E9E9, 270 | // 0x8749CECE, 0xAAFF5555, 0x50782828, 0xA57ADFDF, 271 | // 0x038F8C8C, 0x59F8A1A1, 0x09808989, 0x1A170D0D, 272 | // 0x65DABFBF, 0xD731E6E6, 0x84C64242, 0xD0B86868, 273 | // 0x82C34141, 0x29B09999, 0x5A772D2D, 0x1E110F0F, 274 | // 0x7BCBB0B0, 0xA8FC5454, 0x6DD6BBBB, 0x2C3A1616 275 | // ]; 276 | 277 | 278 | module.exports.AES_ROUND_LE = function(X, K, Y) { 279 | (Y[0]) = AES0[(X[0]) & 0xFF] ^ 280 | AES1[((X[1]) >>> 8) & 0xFF] ^ 281 | AES2[((X[2]) >>> 16) & 0xFF] ^ 282 | AES3[((X[3]) >>> 24) & 0xFF] ^ (K[0]); 283 | (Y[1]) = AES0[(X[1]) & 0xFF] ^ 284 | AES1[((X[2]) >>> 8) & 0xFF] ^ 285 | AES2[((X[3]) >>> 16) & 0xFF] ^ 286 | AES3[((X[0]) >>> 24) & 0xFF] ^ (K[1]); 287 | (Y[2]) = AES0[(X[2]) & 0xFF] ^ 288 | AES1[((X[3]) >>> 8) & 0xFF] ^ 289 | AES2[((X[0]) >>> 16) & 0xFF] ^ 290 | AES3[((X[1]) >>> 24) & 0xFF] ^ (K[2]); 291 | (Y[3]) = AES0[(X[3]) & 0xFF] ^ 292 | AES1[((X[0]) >>> 8) & 0xFF] ^ 293 | AES2[((X[1]) >>> 16) & 0xFF] ^ 294 | AES3[((X[2]) >>> 24) & 0xFF] ^ (K[3]); 295 | }; 296 | 297 | module.exports.AES_ROUND_NOKEY_LE = function(X, Y) { 298 | var K = new Array(4); 299 | op.bufferSet(K, 0, 0, 4); 300 | this.AES_ROUND_LE(X, K, Y); 301 | }; 302 | -------------------------------------------------------------------------------- /lib/blake.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | ///////////////////////////////////// 3 | /////////////// Blake ////////////// 4 | 5 | //// Written by Quantum Explorer //// 6 | ////////// Dash Foundation ////////// 7 | /// Released under the MIT License // 8 | ///////////////////////////////////// 9 | 10 | var o = require('./op'); 11 | var h = require('./helper'); 12 | 13 | var CB = h.bytes2Int64Buffer(h.b64Decode('JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxObIlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjftawv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXTmk=')); 14 | 15 | // var CB = [ 16 | // o.u(0x243f6a88, 0x85a308d3), 17 | // o.u(0x13198a2e, 0x03707344), 18 | // o.u(0xa4093822, 0x299f31d0), 19 | // o.u(0x082efa98, 0xec4e6c89), 20 | // o.u(0x452821e6, 0x38d01377), 21 | // o.u(0xbe5466cf, 0x34e90c6c), 22 | // o.u(0xc0ac29b7, 0xc97c50dd), 23 | // o.u(0x3f84d5b5, 0xb5470917), 24 | // o.u(0x9216d5d9, 0x8979fb1b), 25 | // o.u(0xd1310ba6, 0x98dfb5ac), 26 | // o.u(0x2ffd72db, 0xd01adfb7), 27 | // o.u(0xb8e1afed, 0x6a267e96), 28 | // o.u(0xba7c9045, 0xf12c7f99), 29 | // o.u(0x24a19947, 0xb3916cf7), 30 | // o.u(0x0801f2e2, 0x858efc16), 31 | // o.u(0x636920d8, 0x71574e69) 32 | // ]; 33 | 34 | var Z = [ 35 | [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], 36 | [14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3], 37 | [11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4], 38 | [7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8], 39 | [9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13], 40 | [2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9], 41 | [12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11], 42 | [13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10], 43 | [6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5], 44 | [10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0] 45 | ]; 46 | 47 | var initialValues = [ 48 | o.u(0x6a09e667, 0xf3bcc908), 49 | o.u(0xbb67ae85, 0x84caa73b), 50 | o.u(0x3c6ef372, 0xfe94f82b), 51 | o.u(0xa54ff53a, 0x5f1d36f1), 52 | o.u(0x510e527f, 0xade682d1), 53 | o.u(0x9b05688c, 0x2b3e6c1f), 54 | o.u(0x1f83d9ab, 0xfb41bd6b), 55 | o.u(0x5be0cd19, 0x137e2179) 56 | ]; 57 | 58 | var GB = function(m0, m1, c0, c1, a, b, c, d) { 59 | a.add(m0.xor(c1).add(b)); 60 | d.setxorOne(a).setFlip(); 61 | c.add(d); 62 | b.setxorOne(c).setRotateRight(25); 63 | a.add(m1.xor(c0).add(b)); 64 | d.setxorOne(a).setRotateRight(16); 65 | c.add(d); 66 | b.setxorOne(c).setRotateRight(11); 67 | }; 68 | 69 | var round = function(r, V, M) { 70 | 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]); 71 | 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]); 72 | 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]); 73 | 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]); 74 | 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]); 75 | 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]); 76 | 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]); 77 | 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]); 78 | }; 79 | 80 | var compress = function(M, H, S, T0, T1) { 81 | var V = new Array(16); 82 | o.bufferInsert64(V, 0, H, 8); 83 | V[8] = S[0].xor(CB[0]); 84 | V[9] = S[1].xor(CB[1]); 85 | V[10] = S[2].xor(CB[2]); 86 | V[11] = S[3].xor(CB[3]); 87 | V[12] = T0.xor(CB[4]); 88 | V[13] = T0.xor(CB[5]); 89 | V[14] = T1.xor(CB[6]); 90 | V[15] = T1.xor(CB[7]); 91 | for (var i = 0; i < 16; i++) { 92 | round(i % 10, V, M); 93 | } 94 | for (var i = 0; i < 8; i++) { 95 | H[i] = o.xor64(H[i], S[i % 4], V[i], V[8 + i]); 96 | } 97 | }; 98 | 99 | var blake = function(ctx, data, len) { 100 | var buf, ptr; 101 | //create a local copy of states 102 | var H = new Array(8); 103 | var S = new Array(4); 104 | var T0 = ctx.T0.clone(); 105 | var T1 = ctx.T1.clone(); 106 | buf = ctx.buffer; 107 | ptr = ctx.ptr; 108 | if (len < ctx.buffer.length - ptr) { 109 | o.bufferInsert(buf, ptr, data, data.length); 110 | ptr += data.length; 111 | ctx.ptr = ptr; 112 | return; 113 | } 114 | //perform a deep copy of current state 115 | o.bufferInsert(H, 0, ctx.state, 8); 116 | o.bufferInsert(S, 0, ctx.salt, 4); 117 | while (len > 0) { 118 | var clen = ctx.buffer.length - ptr; 119 | if (clen > len) clen = len; 120 | o.bufferInsert(buf, ptr, data, clen); 121 | ptr += clen; 122 | data = data.slice(clen); 123 | len -= clen; 124 | if (ptr === ctx.buffer.length) { 125 | T0.add(o.u(0, 1024)); 126 | if (T0.hi < 0 || T0.lo < 1024) T1.addOne(); 127 | var int64Buf = h.bytes2Int64Buffer(buf); 128 | compress(int64Buf, H, S, T0, T1); 129 | ptr = 0; 130 | } 131 | } 132 | ctx.state = H; 133 | ctx.salt = S; 134 | ctx.T0 = T0; 135 | ctx.T1 = T1; 136 | ctx.ptr = ptr; 137 | }; 138 | 139 | var blakeClose = function(ctx) { 140 | var buf = new Array(128); 141 | var ptr = ctx.ptr; 142 | var bitLen = (o.u(0, ptr)).shiftLeft(3); 143 | var tl = ctx.T0.plus(bitLen); 144 | var th = ctx.T1.clone(); 145 | buf[ptr] = 0x80; 146 | if (ptr === 0) { 147 | ctx.T0 = o.u(0xFFFFFFFF, 0xFFFFFC00); 148 | ctx.T1 = o.u(0xFFFFFFFF, 0xFFFFFFFF); 149 | } 150 | else if (ctx.T0.isZero()) { 151 | ctx.T0 = o.u(0xFFFFFFFF, 0xFFFFFC00).plus(bitLen); 152 | ctx.T1 = ctx.T1.minus(o.u(0, 1)); 153 | } 154 | else { 155 | ctx.T0 = ctx.T0.minus(o.u(0, 1024).minus(bitLen)); 156 | } 157 | if (bitLen.lo <= 894) { 158 | o.bufferSet(buf, ptr + 1, 0, 111 - ptr); 159 | buf[111] |= 1; 160 | h.bufferEncode64(buf, 112, th); 161 | h.bufferEncode64(buf, 120, tl); 162 | blake(ctx, buf.slice(ptr), 128 - ptr); 163 | } 164 | else { 165 | o.bufferSet(u.buf, ptr + 1, 0, 127 - ptr); 166 | blake(ctx, buf.slice(ptr), 128 - ptr); 167 | ctx.T0 = o.u(0xFFFFFFFF,0xFFFFFC00); 168 | ctx.T1 = o.u(0xFFFFFFFF,0xFFFFFFFF); 169 | o.bufferSet(buf, 0, 0, 112); 170 | buf[111] = 1; 171 | h.bufferEncode64(buf, 112, th); 172 | h.bufferEncode64(buf, 120, tl); 173 | blake(ctx, buf, 128); 174 | } 175 | var out = new Array(16); 176 | for (var u = 0; u < 8; u++) { 177 | out[2 * u] = ctx.state[u].hi; 178 | out[2 * u + 1] = ctx.state[u].lo; 179 | } 180 | return out; 181 | }; 182 | 183 | 184 | module.exports = function(input, format, output) { 185 | var msg; 186 | if (format === 1) { 187 | msg = input; 188 | } 189 | else if (format === 2) { 190 | msg = h.int32Buffer2Bytes(input); 191 | } 192 | else { 193 | msg = h.string2bytes(input); 194 | } 195 | var ctx = {}; 196 | ctx.state = o.clone64Array(initialValues); 197 | var zero = o.u(0,0); 198 | ctx.salt = [zero, zero, zero, zero]; 199 | ctx.T0 = zero.clone(); 200 | ctx.T1 = zero.clone(); 201 | ctx.ptr = 0; 202 | ctx.buffer = new Array(128); 203 | blake(ctx, msg, msg.length); 204 | var r = blakeClose(ctx, 0, 0); 205 | var out; 206 | if (output === 2) { 207 | out = r; 208 | } 209 | else if (output === 1) { 210 | out = h.int32Buffer2Bytes(r); 211 | } 212 | else { 213 | out = h.int32ArrayToHexString(r); 214 | } 215 | return out; 216 | }; 217 | -------------------------------------------------------------------------------- /lib/bmw.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | ///////////////////////////////////// 3 | ////////////// BMW ///////////////// 4 | 5 | //// Written by Quantum Explorer //// 6 | ////////// Dash Foundation ////////// 7 | /// Released under the MIT License // 8 | ///////////////////////////////////// 9 | 10 | var o = require('./op'); 11 | var h = require('./helper'); 12 | 13 | // var V_INIT = [ 14 | // o.u(0x80818283, 0x84858687), o.u(0x88898A8B, 0x8C8D8E8F), 15 | // o.u(0x90919293, 0x94959697), o.u(0x98999A9B, 0x9C9D9E9F), 16 | // o.u(0xA0A1A2A3, 0xA4A5A6A7), o.u(0xA8A9AAAB, 0xACADAEAF), 17 | // o.u(0xB0B1B2B3, 0xB4B5B6B7), o.u(0xB8B9BABB, 0xBCBDBEBF), 18 | // o.u(0xC0C1C2C3, 0xC4C5C6C7), o.u(0xC8C9CACB, 0xCCCDCECF), 19 | // o.u(0xD0D1D2D3, 0xD4D5D6D7), o.u(0xD8D9DADB, 0xDCDDDEDF), 20 | // o.u(0xE0E1E2E3, 0xE4E5E6E7), o.u(0xE8E9EAEB, 0xECEDEEEF), 21 | // o.u(0xF0F1F2F3, 0xF4F5F6F7), o.u(0xF8F9FAFB, 0xFCFDFEFF) 22 | // ]; 23 | 24 | var V_INIT = h.bytes2Int64Buffer(h.b64Decode('gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8=')); 25 | 26 | // var final = [ 27 | // o.u(0xaaaaaaaa, 0xaaaaaaa0), o.u(0xaaaaaaaa, 0xaaaaaaa1), 28 | // o.u(0xaaaaaaaa, 0xaaaaaaa2), o.u(0xaaaaaaaa, 0xaaaaaaa3), 29 | // o.u(0xaaaaaaaa, 0xaaaaaaa4), o.u(0xaaaaaaaa, 0xaaaaaaa5), 30 | // o.u(0xaaaaaaaa, 0xaaaaaaa6), o.u(0xaaaaaaaa, 0xaaaaaaa7), 31 | // o.u(0xaaaaaaaa, 0xaaaaaaa8), o.u(0xaaaaaaaa, 0xaaaaaaa9), 32 | // o.u(0xaaaaaaaa, 0xaaaaaaaa), o.u(0xaaaaaaaa, 0xaaaaaaab), 33 | // o.u(0xaaaaaaaa, 0xaaaaaaac), o.u(0xaaaaaaaa, 0xaaaaaaad), 34 | // o.u(0xaaaaaaaa, 0xaaaaaaae), o.u(0xaaaaaaaa, 0xaaaaaaaf) 35 | // ]; 36 | 37 | var final = h.bytes2Int64Buffer(h.b64Decode('qqqqqqqqqqCqqqqqqqqqoaqqqqqqqqqiqqqqqqqqqqOqqqqqqqqqpKqqqqqqqqqlqqqqqqqqqqaqqqqqqqqqp6qqqqqqqqqoqqqqqqqqqqmqqqqqqqqqqqqqqqqqqqqrqqqqqqqqqqyqqqqqqqqqraqqqqqqqqquqqqqqqqqqq8=')); 38 | 39 | var sb_a = [1, 1, 2, 2, 1, 2]; 40 | var sb_b = [3, 2, 1, 2]; 41 | var sb_c = [4, 13, 19, 28]; 42 | var sb_d = [37, 43, 53, 59]; 43 | 44 | var I16 = new Array(16); //we are trying to start at 16; 45 | 46 | I16.push([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]); 47 | I16.push([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]); 48 | I16.push([2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]); 49 | I16.push([3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]); 50 | I16.push([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]); 51 | I16.push([5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]); 52 | I16.push([6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]); 53 | I16.push([7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22]); 54 | I16.push([8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]); 55 | I16.push([9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]); 56 | I16.push([10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]); 57 | I16.push([11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26]); 58 | I16.push([12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]); 59 | I16.push([13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28]); 60 | I16.push([14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]); 61 | I16.push([15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]); 62 | 63 | var M16 = new Array(16); 64 | 65 | M16.push([0, 1, 3, 4, 7, 10, 11]); 66 | M16.push([1, 2, 4, 5, 8, 11, 12]); 67 | M16.push([2, 3, 5, 6, 9, 12, 13]); 68 | M16.push([3, 4, 6, 7, 10, 13, 14]); 69 | M16.push([4, 5, 7, 8, 11, 14, 15]); 70 | M16.push([5, 6, 8, 9, 12, 15, 16]); 71 | M16.push([6, 7, 9, 10, 13, 0, 1]); 72 | M16.push([7, 8, 10, 11, 14, 1, 2]); 73 | M16.push([8, 9, 11, 12, 15, 2, 3]); 74 | M16.push([9, 10, 12, 13, 0, 3, 4]); 75 | M16.push([10, 11, 13, 14, 1, 4, 5]); 76 | M16.push([11, 12, 14, 15, 2, 5, 6]); 77 | M16.push([12, 13, 15, 16, 3, 6, 7]); 78 | M16.push([13, 14, 0, 1, 4, 7, 8]); 79 | M16.push([14, 15, 1, 2, 5, 8, 9]); 80 | M16.push([15, 16, 2, 3, 6, 9, 10]); 81 | 82 | var sb = function(n, x) { 83 | //xOriginal must be of type u64 84 | if (n < 4) { 85 | return o.xor64(x.shiftRight(sb_a[n]), x.shiftLeft(sb_b[n]), x.rotateLeft(sb_c[n]), x.rotateLeft(sb_d[n])); 86 | } 87 | 88 | return x.shiftRight(sb_a[n]).xor(x); 89 | 90 | }; 91 | 92 | 93 | var rbn = [0, 5, 11, 27, 32, 37, 43, 53]; 94 | 95 | var rb = function(n, x) { 96 | //x must be of type u64 97 | return x.rotateLeft(rbn[n]); 98 | }; 99 | 100 | var makeW = function(M,H,i, op) { 101 | var a = M[i[0]].xor(H[i[0]]); 102 | var b = M[i[1]].xor(H[i[1]]); 103 | var c = M[i[2]].xor(H[i[2]]); 104 | var d = M[i[3]].xor(H[i[3]]); 105 | var e = M[i[4]].xor(H[i[4]]); 106 | var w = op[3](op[2](op[1](op[0](a,b),c),d),e); 107 | 108 | return w; 109 | }; 110 | 111 | var wbn = [ 112 | [5, 7, 10, 13, 14], 113 | [6, 8, 11, 14, 15], 114 | [0, 7, 9, 12, 15], 115 | [0, 1, 8, 10, 13], 116 | [1, 2, 9, 11, 14], 117 | [3, 2, 10, 12, 15], 118 | [4, 0, 3, 11, 13], 119 | [1, 4, 5, 12, 14], 120 | [2, 5, 6, 13, 15], 121 | [0, 3, 6, 7, 14], 122 | [8, 1, 4, 7, 15], 123 | [8, 0, 2, 5, 9], 124 | [1, 3, 6, 9, 10], 125 | [2, 4, 7, 10, 11], 126 | [3, 5, 8, 11, 12], 127 | [12, 4, 6, 9, 13], 128 | ]; 129 | 130 | var plus = function(a,b) { 131 | return a.plus(b); 132 | }; 133 | 134 | var minus = function(a,b) { 135 | return a.minus(b); 136 | }; 137 | 138 | var wboperators = [ 139 | [minus, plus, plus, plus], 140 | [minus, plus, plus, minus], 141 | [plus, plus, minus, plus], 142 | [minus, plus, minus, plus], 143 | [plus, plus, minus, minus], 144 | [minus, plus, minus, plus], 145 | [minus, minus, minus, plus], 146 | [minus, minus, minus, minus], 147 | [minus, minus, plus, minus], 148 | [minus, plus, minus, plus], 149 | [minus, minus, minus, plus], 150 | [minus, minus, minus, plus], 151 | [plus, minus, minus, plus], 152 | [plus, plus, plus, plus], 153 | [minus, plus, minus, minus], 154 | [minus, minus, minus, plus], 155 | ]; 156 | 157 | var wb = function(M,H,i) { 158 | return makeW(M,H,wbn[i],wboperators[i]); 159 | }; 160 | 161 | var kb = function(j) { 162 | var fives = o.u(0x05555555, 0x55555555); 163 | return fives.multiply(j); 164 | }; 165 | 166 | 167 | var addElt = function(buffer64, state, mVars, i) { 168 | var k = kb(i); 169 | var elt = buffer64[mVars[0]].rotateLeft(mVars[1]) 170 | .add(buffer64[mVars[2]].rotateLeft(mVars[3])) 171 | .minus(buffer64[mVars[5]].rotateLeft(mVars[6])) 172 | .add(k) 173 | .xor(state[mVars[4]]); 174 | return elt; 175 | }; 176 | 177 | var expand2Inner = function(qt, mf, state, i, iVars, mVars) { 178 | return qt[iVars[0]] 179 | .plus(rb(1, qt[iVars[1]])) 180 | .add(qt[iVars[2]]) 181 | .add(rb(2, qt[iVars[3]])) 182 | .add(qt[iVars[4]]) 183 | .add(rb(3, qt[iVars[5]])) 184 | .add(qt[iVars[6]]) 185 | .add(rb(4, qt[iVars[7]])) 186 | .add(qt[iVars[8]]) 187 | .add(rb(5, qt[iVars[9]])) 188 | .add(qt[iVars[10]]) 189 | .add(rb(6, qt[iVars[11]])) 190 | .add(qt[iVars[12]]) 191 | .add(rb(7, qt[iVars[13]])) 192 | .add(sb(4, qt[iVars[14]])) 193 | .add(sb(5, qt[iVars[15]])) 194 | .add(addElt(mf, state, mVars, i)); 195 | }; 196 | 197 | var expand1Inner = function(qt, mf, state, i, iVars, mVars) { 198 | return sb(1, qt[iVars[0]]) 199 | .add(sb(2, qt[iVars[1]])) 200 | .add(sb(3, qt[iVars[2]])) 201 | .add(sb(0, qt[iVars[3]])) 202 | .add(sb(1, qt[iVars[4]])) 203 | .add(sb(2, qt[iVars[5]])) 204 | .add(sb(3, qt[iVars[6]])) 205 | .add(sb(0, qt[iVars[7]])) 206 | .add(sb(1, qt[iVars[8]])) 207 | .add(sb(2, qt[iVars[9]])) 208 | .add(sb(3, qt[iVars[10]])) 209 | .add(sb(0, qt[iVars[11]])) 210 | .add(sb(1, qt[iVars[12]])) 211 | .add(sb(2, qt[iVars[13]])) 212 | .add(sb(3, qt[iVars[14]])) 213 | .add(sb(0, qt[iVars[15]])) 214 | .add(addElt(mf, state, mVars, i)); 215 | }; 216 | 217 | var expand1b = function(qt, mf, state, i) { 218 | var iVars = I16[i]; 219 | var mVars = M16[i]; 220 | return expand1Inner(qt, mf, state, i, iVars, mVars); 221 | }; 222 | 223 | var expand2b = function(qt, mf, state, i) { 224 | var iVars = I16[i]; 225 | var mVars = M16[i]; 226 | return expand2Inner(qt, mf, state, i, iVars, mVars); 227 | }; 228 | 229 | var makeQ = function(mf, state) { 230 | var qt = new Array(32); 231 | for (var i = 0; i < 16; i++) { 232 | var w = wb(mf,state,i); 233 | var s = sb(i % 5, w); 234 | qt[i] = s.plus(state[(i + 1) % 16]); 235 | } 236 | qt[16] = expand1b(qt, mf, state, 16); 237 | qt[17] = expand1b(qt, mf, state, 17); 238 | for (var i = 18; i < 32; i++) { 239 | qt[i] = expand2b(qt, mf, state, i); 240 | } 241 | return qt; 242 | }; 243 | 244 | var fold = function(int64Buffer, state) { 245 | var out = new Array(16); 246 | var qt = makeQ(int64Buffer, state); 247 | var xl = o.xor64(qt[16], qt[17], qt[18], qt[19], qt[20], qt[21], qt[22], qt[23]); 248 | var xh = o.xor64(xl, qt[24], qt[25], qt[26], qt[27], qt[28], qt[29], qt[30], qt[31]); 249 | out[0] = o.xor64(xh.shiftLeft(5), qt[16].shiftRight(5), int64Buffer[0]).add(o.xor64(xl, qt[24], qt[0])); 250 | out[1] = o.xor64(xh.shiftRight(7), qt[17].shiftLeft(8), int64Buffer[1]).add(o.xor64(xl, qt[25], qt[1])); 251 | out[2] = o.xor64(xh.shiftRight(5), qt[18].shiftLeft(5), int64Buffer[2]).add(o.xor64(xl, qt[26], qt[2])); 252 | out[3] = o.xor64(xh.shiftRight(1), qt[19].shiftLeft(5), int64Buffer[3]).add(o.xor64(xl, qt[27], qt[3])); 253 | out[4] = o.xor64(xh.shiftRight(3), qt[20], int64Buffer[4]).add(o.xor64(xl, qt[28], qt[4])); 254 | out[5] = o.xor64(xh.shiftLeft(6), qt[21].shiftRight(6), int64Buffer[5]).add(o.xor64(xl, qt[29], qt[5])); 255 | out[6] = o.xor64(xh.shiftRight(4), qt[22].shiftLeft(6), int64Buffer[6]).add(o.xor64(xl, qt[30], qt[6])); 256 | out[7] = o.xor64(xh.shiftRight(11), qt[23].shiftLeft(2), int64Buffer[7]).add(o.xor64(xl, qt[31], qt[7])); 257 | out[8] = out[4].rotateLeft(9).add(o.xor64(xh, qt[24], int64Buffer[8])) 258 | .add(o.xor64(xl.shiftLeft(8), qt[23], qt[8])); 259 | out[9] = out[5].rotateLeft(10).add(o.xor64(xh, qt[25], int64Buffer[9])) 260 | .add(o.xor64(xl.shiftRight(6), qt[16], qt[9])); 261 | out[10] = out[6].rotateLeft(11).add(o.xor64(xh, qt[26], int64Buffer[10])) 262 | .add(o.xor64(xl.shiftLeft(6), qt[17], qt[10])); 263 | out[11] = out[7].rotateLeft(12).add(o.xor64(xh, qt[27], int64Buffer[11])) 264 | .add(o.xor64(xl.shiftLeft(4), qt[18], qt[11])); 265 | out[12] = out[0].rotateLeft(13).add(o.xor64(xh, qt[28], int64Buffer[12])) 266 | .add(o.xor64(xl.shiftRight(3), qt[19], qt[12])); 267 | out[13] = out[1].rotateLeft(14).add(o.xor64(xh, qt[29], int64Buffer[13])) 268 | .add(o.xor64(xl.shiftRight(4), qt[20], qt[13])); 269 | out[14] = out[2].rotateLeft(15).add(o.xor64(xh, qt[30], int64Buffer[14])) 270 | .add(o.xor64(xl.shiftRight(7), qt[21], qt[14])); 271 | out[15] = out[3].rotateLeft(16).add(o.xor64(xh, qt[31], int64Buffer[15])) 272 | .add(o.xor64(xl.shiftRight(2), qt[22], qt[15])); 273 | return out; 274 | }; 275 | 276 | var compress = function(buf, state) { 277 | var int64Buf = h.bytes2Int64BufferLeAligned(buf); 278 | return fold(int64Buf, state); 279 | }; 280 | 281 | var bmw = function(ctx, data) { 282 | var htmp = new Array(16); 283 | var len = data.length; 284 | var lenL3 = o.u(0, len); 285 | lenL3 = lenL3.shiftLeft(3); 286 | ctx.bitCount.add(lenL3); 287 | var buf = ctx.buffer; 288 | var ptr = ctx.ptr; 289 | var h1 = ctx.state; 290 | var h2 = htmp; 291 | while (len > 0) { 292 | var clen = ctx.buffer.length - ptr; 293 | if (clen > len) clen = len; 294 | o.bufferInsert(buf, ptr, data, clen); 295 | data = data.slice(clen); 296 | len -= clen; 297 | ptr += clen; 298 | if (ptr === ctx.buffer.length) { 299 | var ht; 300 | h2 = compress(buf, h1); 301 | ht = h1; 302 | h1 = h2; 303 | h2 = ht; 304 | ptr = 0; 305 | } 306 | } 307 | ctx.ptr = ptr; 308 | if (h1 !== ctx.state) o.bufferInsert(ctx.state, 0, h1, ctx.state.length); 309 | }; 310 | 311 | var bmwClose = function(ctx) { 312 | var h1; 313 | var h2 = new Array(16); 314 | 315 | var buf = ctx.buffer; 316 | var ptr = ctx.ptr; 317 | var len = buf.length; 318 | buf[ptr++] = 0x80; 319 | var hState = ctx.state; 320 | if (ptr > len - 8) { 321 | o.bufferSet(buf, ptr, 0, len - ptr); 322 | hState = compress(buf, hState); 323 | ptr = 0; 324 | } 325 | o.bufferSet(buf, ptr, 0, len - 8 - ptr); 326 | h.bufferEncode64leAligned(buf, len - 8, ctx.bitCount); 327 | h2 = compress(buf, hState); 328 | for (u = 0; u < 16; u++) h.bufferEncode64leAligned(buf, 8 * u, h2[u]); 329 | h1 = compress(buf, final); 330 | var out = new Array(16); 331 | for (var u = 0, v = 8; u < 8; u++, v++) { 332 | out[2 * u] = o.swap32(h1[v].lo); 333 | out[2 * u + 1] = o.swap32(h1[v].hi); 334 | } 335 | return out; 336 | }; 337 | 338 | module.exports = function(input, format, output) { 339 | var msg; 340 | if (format === 1) { 341 | msg = input; 342 | } 343 | else if (format === 2) { 344 | msg = h.int32Buffer2Bytes(input); 345 | } 346 | else { 347 | msg = h.string2bytes(input); 348 | } 349 | var ctx = {}; 350 | ctx.state = o.clone64Array(V_INIT); 351 | ctx.ptr = 0; 352 | ctx.bitCount = o.u(0,0); 353 | ctx.buffer = new Array(128); 354 | bmw(ctx, msg); 355 | var r = bmwClose(ctx, 0, 0); 356 | var out; 357 | if (output === 2) { 358 | out = r; 359 | } 360 | else if (output === 1) { 361 | out = h.int32Buffer2Bytes(r); 362 | } 363 | else { 364 | out = h.int32ArrayToHexString(r); 365 | } 366 | return out; 367 | }; 368 | -------------------------------------------------------------------------------- /lib/cubehash.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | ///////////////////////////////////// 3 | //////////// Cubehash ////////////// 4 | 5 | //// Written by Quantum Explorer //// 6 | ////////// Dash Foundation ////////// 7 | /// Released under the MIT License // 8 | ///////////////////////////////////// 9 | 10 | var op = require('./op'); 11 | var h = require('./helper'); 12 | 13 | var Cubehash_BlockSize = 32; 14 | var Cubehash_StateSize = 32; 15 | 16 | var IV512 = [ 17 | 0x2AEA2A61, 0x50F494D4, 0x2D538B8B, 18 | 0x4167D83E, 0x3FEE2313, 0xC701CF8C, 19 | 0xCC39968E, 0x50AC5695, 0x4D42C787, 20 | 0xA647A8B3, 0x97CF0BEF, 0x825B4537, 21 | 0xEEF864D2, 0xF22090C4, 0xD0E5CD33, 22 | 0xA23911AE, 0xFCD398D9, 0x148FE485, 23 | 0x1B017BEF, 0xB6444532, 0x6A536159, 24 | 0x2FF5781C, 0x91FA7934, 0x0DBADEA9, 25 | 0xD65C8A2B, 0xA5A70E75, 0xB1C62456, 26 | 0xBC796576, 0x1921C8F7, 0xE7989AF1, 27 | 0x7795D246, 0xD43E3B44, 28 | ]; 29 | 30 | var ROUND_EVEN = function(x) { 31 | x[16] = 0xFFFFFFFF & (x[0] + x[16]); 32 | x[0] = op.rotl32(x[0], 7); 33 | x[17] = 0xFFFFFFFF & (x[1] + x[17]); 34 | x[1] = op.rotl32(x[1], 7); 35 | x[18] = 0xFFFFFFFF & (x[2] + x[18]); 36 | x[2] = op.rotl32(x[2], 7); 37 | x[19] = 0xFFFFFFFF & (x[3] + x[19]); 38 | x[3] = op.rotl32(x[3], 7); 39 | x[20] = 0xFFFFFFFF & (x[4] + x[20]); 40 | x[4] = op.rotl32(x[4], 7); 41 | x[21] = 0xFFFFFFFF & (x[5] + x[21]); 42 | x[5] = op.rotl32(x[5], 7); 43 | x[22] = 0xFFFFFFFF & (x[6] + x[22]); 44 | x[6] = op.rotl32(x[6], 7); 45 | x[23] = 0xFFFFFFFF & (x[7] + x[23]); 46 | x[7] = op.rotl32(x[7], 7); 47 | x[24] = 0xFFFFFFFF & (x[8] + x[24]); 48 | x[8] = op.rotl32(x[8], 7); 49 | x[25] = 0xFFFFFFFF & (x[9] + x[25]); 50 | x[9] = op.rotl32(x[9], 7); 51 | x[26] = 0xFFFFFFFF & (x[10] + x[26]); 52 | x[10] = op.rotl32(x[10], 7); 53 | x[27] = 0xFFFFFFFF & (x[11] + x[27]); 54 | x[11] = op.rotl32(x[11], 7); 55 | x[28] = 0xFFFFFFFF & (x[12] + x[28]); 56 | x[12] = op.rotl32(x[12], 7); 57 | x[29] = 0xFFFFFFFF & (x[13] + x[29]); 58 | x[13] = op.rotl32(x[13], 7); 59 | x[30] = 0xFFFFFFFF & (x[14] + x[30]); 60 | x[14] = op.rotl32(x[14], 7); 61 | x[31] = 0xFFFFFFFF & (x[15] + x[31]); 62 | x[15] = op.rotl32(x[15], 7); 63 | x[8] ^= x[16]; 64 | x[9] ^= x[17]; 65 | x[10] ^= x[18]; 66 | x[11] ^= x[19]; 67 | x[12] ^= x[20]; 68 | x[13] ^= x[21]; 69 | x[14] ^= x[22]; 70 | x[15] ^= x[23]; 71 | x[0] ^= x[24]; 72 | x[1] ^= x[25]; 73 | x[2] ^= x[26]; 74 | x[3] ^= x[27]; 75 | x[4] ^= x[28]; 76 | x[5] ^= x[29]; 77 | x[6] ^= x[30]; 78 | x[7] ^= x[31]; 79 | x[18] = 0xFFFFFFFF & (x[8] + x[18]); 80 | x[8] = op.rotl32(x[8], 11); 81 | x[19] = 0xFFFFFFFF & (x[9] + x[19]); 82 | x[9] = op.rotl32(x[9], 11); 83 | x[16] = 0xFFFFFFFF & (x[10] + x[16]); 84 | x[10] = op.rotl32(x[10], 11); 85 | x[17] = 0xFFFFFFFF & (x[11] + x[17]); 86 | x[11] = op.rotl32(x[11], 11); 87 | x[22] = 0xFFFFFFFF & (x[12] + x[22]); 88 | x[12] = op.rotl32(x[12], 11); 89 | x[23] = 0xFFFFFFFF & (x[13] + x[23]); 90 | x[13] = op.rotl32(x[13], 11); 91 | x[20] = 0xFFFFFFFF & (x[14] + x[20]); 92 | x[14] = op.rotl32(x[14], 11); 93 | x[21] = 0xFFFFFFFF & (x[15] + x[21]); 94 | x[15] = op.rotl32(x[15], 11); 95 | x[26] = 0xFFFFFFFF & (x[0] + x[26]); 96 | x[0] = op.rotl32(x[0], 11); 97 | x[27] = 0xFFFFFFFF & (x[1] + x[27]); 98 | x[1] = op.rotl32(x[1], 11); 99 | x[24] = 0xFFFFFFFF & (x[2] + x[24]); 100 | x[2] = op.rotl32(x[2], 11); 101 | x[25] = 0xFFFFFFFF & (x[3] + x[25]); 102 | x[3] = op.rotl32(x[3], 11); 103 | x[30] = 0xFFFFFFFF & (x[4] + x[30]); 104 | x[4] = op.rotl32(x[4], 11); 105 | x[31] = 0xFFFFFFFF & (x[5] + x[31]); 106 | x[5] = op.rotl32(x[5], 11); 107 | x[28] = 0xFFFFFFFF & (x[6] + x[28]); 108 | x[6] = op.rotl32(x[6], 11); 109 | x[29] = 0xFFFFFFFF & (x[7] + x[29]); 110 | x[7] = op.rotl32(x[7], 11); 111 | x[12] ^= x[18]; 112 | x[13] ^= x[19]; 113 | x[14] ^= x[16]; 114 | x[15] ^= x[17]; 115 | x[8] ^= x[22]; 116 | x[9] ^= x[23]; 117 | x[10] ^= x[20]; 118 | x[11] ^= x[21]; 119 | x[4] ^= x[26]; 120 | x[5] ^= x[27]; 121 | x[6] ^= x[24]; 122 | x[7] ^= x[25]; 123 | x[0] ^= x[30]; 124 | x[1] ^= x[31]; 125 | x[2] ^= x[28]; 126 | x[3] ^= x[29]; 127 | }; 128 | 129 | var ROUND_ODD = function(x) { 130 | x[19] = 0xFFFFFFFF & (x[12] + x[19]); 131 | x[12] = op.rotl32(x[12], 7); 132 | x[18] = 0xFFFFFFFF & (x[13] + x[18]); 133 | x[13] = op.rotl32(x[13], 7); 134 | x[17] = 0xFFFFFFFF & (x[14] + x[17]); 135 | x[14] = op.rotl32(x[14], 7); 136 | x[16] = 0xFFFFFFFF & (x[15] + x[16]); 137 | x[15] = op.rotl32(x[15], 7); 138 | x[23] = 0xFFFFFFFF & (x[8] + x[23]); 139 | x[8] = op.rotl32(x[8], 7); 140 | x[22] = 0xFFFFFFFF & (x[9] + x[22]); 141 | x[9] = op.rotl32(x[9], 7); 142 | x[21] = 0xFFFFFFFF & (x[10] + x[21]); 143 | x[10] = op.rotl32(x[10], 7); 144 | x[20] = 0xFFFFFFFF & (x[11] + x[20]); 145 | x[11] = op.rotl32(x[11], 7); 146 | x[27] = 0xFFFFFFFF & (x[4] + x[27]); 147 | x[4] = op.rotl32(x[4], 7); 148 | x[26] = 0xFFFFFFFF & (x[5] + x[26]); 149 | x[5] = op.rotl32(x[5], 7); 150 | x[25] = 0xFFFFFFFF & (x[6] + x[25]); 151 | x[6] = op.rotl32(x[6], 7); 152 | x[24] = 0xFFFFFFFF & (x[7] + x[24]); 153 | x[7] = op.rotl32(x[7], 7); 154 | x[31] = 0xFFFFFFFF & (x[0] + x[31]); 155 | x[0] = op.rotl32(x[0], 7); 156 | x[30] = 0xFFFFFFFF & (x[1] + x[30]); 157 | x[1] = op.rotl32(x[1], 7); 158 | x[29] = 0xFFFFFFFF & (x[2] + x[29]); 159 | x[2] = op.rotl32(x[2], 7); 160 | x[28] = 0xFFFFFFFF & (x[3] + x[28]); 161 | x[3] = op.rotl32(x[3], 7); 162 | x[4] ^= x[19]; 163 | x[5] ^= x[18]; 164 | x[6] ^= x[17]; 165 | x[7] ^= x[16]; 166 | x[0] ^= x[23]; 167 | x[1] ^= x[22]; 168 | x[2] ^= x[21]; 169 | x[3] ^= x[20]; 170 | x[12] ^= x[27]; 171 | x[13] ^= x[26]; 172 | x[14] ^= x[25]; 173 | x[15] ^= x[24]; 174 | x[8] ^= x[31]; 175 | x[9] ^= x[30]; 176 | x[10] ^= x[29]; 177 | x[11] ^= x[28]; 178 | x[17] = 0xFFFFFFFF & (x[4] + x[17]); 179 | x[4] = op.rotl32(x[4], 11); 180 | x[16] = 0xFFFFFFFF & (x[5] + x[16]); 181 | x[5] = op.rotl32(x[5], 11); 182 | x[19] = 0xFFFFFFFF & (x[6] + x[19]); 183 | x[6] = op.rotl32(x[6], 11); 184 | x[18] = 0xFFFFFFFF & (x[7] + x[18]); 185 | x[7] = op.rotl32(x[7], 11); 186 | x[21] = 0xFFFFFFFF & (x[0] + x[21]); 187 | x[0] = op.rotl32(x[0], 11); 188 | x[20] = 0xFFFFFFFF & (x[1] + x[20]); 189 | x[1] = op.rotl32(x[1], 11); 190 | x[23] = 0xFFFFFFFF & (x[2] + x[23]); 191 | x[2] = op.rotl32(x[2], 11); 192 | x[22] = 0xFFFFFFFF & (x[3] + x[22]); 193 | x[3] = op.rotl32(x[3], 11); 194 | x[25] = 0xFFFFFFFF & (x[12] + x[25]); 195 | x[12] = op.rotl32(x[12], 11); 196 | x[24] = 0xFFFFFFFF & (x[13] + x[24]); 197 | x[13] = op.rotl32(x[13], 11); 198 | x[27] = 0xFFFFFFFF & (x[14] + x[27]); 199 | x[14] = op.rotl32(x[14], 11); 200 | x[26] = 0xFFFFFFFF & (x[15] + x[26]); 201 | x[15] = op.rotl32(x[15], 11); 202 | x[29] = 0xFFFFFFFF & (x[8] + x[29]); 203 | x[8] = op.rotl32(x[8], 11); 204 | x[28] = 0xFFFFFFFF & (x[9] + x[28]); 205 | x[9] = op.rotl32(x[9], 11); 206 | x[31] = 0xFFFFFFFF & (x[10] + x[31]); 207 | x[10] = op.rotl32(x[10], 11); 208 | x[30] = 0xFFFFFFFF & (x[11] + x[30]); 209 | x[11] = op.rotl32(x[11], 11); 210 | x[0] ^= x[17]; 211 | x[1] ^= x[16]; 212 | x[2] ^= x[19]; 213 | x[3] ^= x[18]; 214 | x[4] ^= x[21]; 215 | x[5] ^= x[20]; 216 | x[6] ^= x[23]; 217 | x[7] ^= x[22]; 218 | x[8] ^= x[25]; 219 | x[9] ^= x[24]; 220 | x[10] ^= x[27]; 221 | x[11] ^= x[26]; 222 | x[12] ^= x[29]; 223 | x[13] ^= x[28]; 224 | x[14] ^= x[31]; 225 | x[15] ^= x[30]; 226 | }; 227 | 228 | var SIXTEEN_ROUNDS = function(x) { 229 | ROUND_EVEN(x); 230 | ROUND_ODD(x); 231 | ROUND_EVEN(x); 232 | ROUND_ODD(x); 233 | ROUND_EVEN(x); 234 | ROUND_ODD(x); 235 | ROUND_EVEN(x); 236 | ROUND_ODD(x); 237 | ROUND_EVEN(x); 238 | ROUND_ODD(x); 239 | ROUND_EVEN(x); 240 | ROUND_ODD(x); 241 | ROUND_EVEN(x); 242 | ROUND_ODD(x); 243 | ROUND_EVEN(x); 244 | ROUND_ODD(x); 245 | }; 246 | 247 | var cubehash = function(ctx, data) { 248 | var buf, ptr; 249 | //create a local copy of states 250 | var x = new Array(Cubehash_StateSize); 251 | buf = ctx.buffer; 252 | ptr = ctx.ptr; 253 | var len = data.length; 254 | if (len < ctx.buffer.length - ptr) { 255 | op.bufferInsert(buf, ptr, data, data.length); 256 | ptr += data.length; 257 | ctx.ptr = ptr; 258 | return; 259 | } 260 | //perform a deep copy of current state 261 | for (var i = 0; i < Cubehash_StateSize; i++) { 262 | x[i] = ctx.state[i]; 263 | } 264 | while (len > 0) { 265 | var clen = ctx.buffer.length - ptr; 266 | if (clen > len) clen = len; 267 | op.bufferInsert(buf, ptr, data, clen); 268 | ptr += clen; 269 | data = data.slice(clen); 270 | len -= clen; 271 | if (ptr === ctx.buffer.length) { 272 | var int32Buf = op.swap32Array(h.bytes2Int32Buffer(buf)); 273 | op.bufferXORInsert(x, 0, int32Buf,0, 8); 274 | SIXTEEN_ROUNDS(x); 275 | ptr = 0; 276 | } 277 | } 278 | ctx.state = x; 279 | ctx.ptr = ptr; 280 | }; 281 | var cubehashClose = function(ctx) { 282 | var buf = ctx.buffer; 283 | var ptr = ctx.ptr; 284 | var x = new Array(Cubehash_StateSize); 285 | buf[ptr++] = 0x80; 286 | op.bufferSet(buf, ptr, 0, ctx.buffer.length - ptr); 287 | for (var i = 0; i < Cubehash_StateSize; i++) { 288 | x[i] = ctx.state[i]; 289 | } 290 | var int32Buf = op.swap32Array(h.bytes2Int32Buffer(buf)); 291 | op.bufferXORInsert(x, 0, int32Buf,0, 8); 292 | for (i = 0; i < 11; i++) { 293 | SIXTEEN_ROUNDS(x); 294 | if (i === 0) x[31] ^= 0xFFFFFFFF & (1); 295 | } 296 | ctx.state = x; 297 | var out = new Array(16); 298 | for (var u = 0; u < 16; u++) out[u] = op.swap32(ctx.state[u]); 299 | return out; 300 | }; 301 | 302 | module.exports = function(input, format, output) { 303 | var msg; 304 | if (format === 1) { 305 | msg = input; 306 | } 307 | else if (format === 2) { 308 | msg = h.int32Buffer2Bytes(input); 309 | } 310 | else { 311 | msg = h.string2bytes(input); 312 | } 313 | var ctx = {}; 314 | ctx.state = IV512; 315 | ctx.ptr = 0; 316 | ctx.buffer = new Array(Cubehash_BlockSize); 317 | cubehash(ctx, msg); 318 | var r = cubehashClose(ctx); 319 | var out; 320 | if (output === 2) { 321 | out = r; 322 | } 323 | else if (output === 1) { 324 | out = h.int32Buffer2Bytes(r); 325 | } 326 | else { 327 | out = h.int32ArrayToHexString(r); 328 | } 329 | return out; 330 | }; 331 | -------------------------------------------------------------------------------- /lib/echo.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | ///////////////////////////////////// 3 | /////////////// Echo /////////////// 4 | 5 | //// Written by Quantum Explorer //// 6 | ////////// Dash Foundation ////////// 7 | /// Released under the MIT License // 8 | ///////////////////////////////////// 9 | 10 | var op = require('./op'); 11 | var h = require('./helper'); 12 | var aes = require('./aes'); 13 | 14 | var ECHO_BlockSize = 128; 15 | 16 | var subWords = function(W, pK) { 17 | for (var n = 0; n < 16; n++) { 18 | var X = W[n]; 19 | var Y = new Array(4); 20 | aes.AES_ROUND_LE(X, pK, Y); 21 | aes.AES_ROUND_NOKEY_LE(Y, X); 22 | if ((pK[0] = op.t32(pK[0] + 1)) === 0) { 23 | 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); 24 | } 25 | } 26 | }; 27 | 28 | var shiftRow1 = function(W, a, b, c, d) { 29 | var tmp; 30 | tmp = W[a][0]; 31 | W[a][0] = W[b][0]; 32 | W[b][0] = W[c][0]; 33 | W[c][0] = W[d][0]; 34 | W[d][0] = tmp; 35 | tmp = W[a][1]; 36 | W[a][1] = W[b][1]; 37 | W[b][1] = W[c][1]; 38 | W[c][1] = W[d][1]; 39 | W[d][1] = tmp; 40 | tmp = W[a][2]; 41 | W[a][2] = W[b][2]; 42 | W[b][2] = W[c][2]; 43 | W[c][2] = W[d][2]; 44 | W[d][2] = tmp; 45 | tmp = W[a][3]; 46 | W[a][3] = W[b][3]; 47 | W[b][3] = W[c][3]; 48 | W[c][3] = W[d][3]; 49 | W[d][3] = tmp; 50 | }; 51 | 52 | var shiftRow2 = function(W, a, b, c, d) { 53 | var tmp; 54 | tmp = W[a][0]; 55 | W[a][0] = W[c][0]; 56 | W[c][0] = tmp; 57 | tmp = W[b][0]; 58 | W[b][0] = W[d][0]; 59 | W[d][0] = tmp; 60 | tmp = W[a][1]; 61 | W[a][1] = W[c][1]; 62 | W[c][1] = tmp; 63 | tmp = W[b][1]; 64 | W[b][1] = W[d][1]; 65 | W[d][1] = tmp; 66 | tmp = W[a][2]; 67 | W[a][2] = W[c][2]; 68 | W[c][2] = tmp; 69 | tmp = W[b][2]; 70 | W[b][2] = W[d][2]; 71 | W[d][2] = tmp; 72 | tmp = W[a][3]; 73 | W[a][3] = W[c][3]; 74 | W[c][3] = tmp; 75 | tmp = W[b][3]; 76 | W[b][3] = W[d][3]; 77 | W[d][3] = tmp; 78 | }; 79 | 80 | var shiftRow3 = function(W, a, b, c, d) { 81 | shiftRow1(W, d, c, b, a); 82 | }; 83 | 84 | var shiftRows = function(W) { 85 | shiftRow1(W, 1, 5, 9, 13); 86 | shiftRow2(W, 2, 6, 10, 14); 87 | shiftRow3(W, 3, 7, 11, 15); 88 | }; 89 | 90 | var mixColumn = function(W, ia, ib, ic, id) { 91 | for (var n = 0; n < 4; n++) { 92 | var a = W[ia][n]; 93 | var b = W[ib][n]; 94 | var c = W[ic][n]; 95 | var d = W[id][n]; 96 | var ab = a ^ b; 97 | var bc = b ^ c; 98 | var cd = c ^ d; 99 | var abx = ((ab & (0x80808080)) >>> 7) * 27 ^ 100 | ((ab & (0x7F7F7F7F)) << 1); 101 | var bcx = ((bc & (0x80808080)) >>> 7) * 27 ^ 102 | ((bc & (0x7F7F7F7F)) << 1); 103 | var cdx = ((cd & (0x80808080)) >>> 7) * 27 ^ 104 | ((cd & (0x7F7F7F7F)) << 1); 105 | W[ia][n] = abx ^ bc ^ d; 106 | W[ib][n] = bcx ^ a ^ cd; 107 | W[ic][n] = cdx ^ ab ^ d; 108 | W[id][n] = abx ^ bcx ^ cdx ^ ab ^ c; 109 | } 110 | }; 111 | 112 | var finalize = function(ctx, W) { 113 | var int32Buf = op.swap32Array(h.bytes2Int32Buffer(ctx.buffer)); 114 | for (var u = 0; u < 8; u++) { 115 | for (var v = 0; v < 4; v++) { 116 | ctx.state[u][v] ^= int32Buf[u * 4 + v] ^ W[u][v] ^ W[u + 8][v]; 117 | } 118 | } 119 | }; 120 | 121 | var inputBlock = function(ctx, W) { 122 | op.buffer2Insert(W, 0, 0, ctx.state, 8, 4); 123 | var int32Buf = op.swap32Array(h.bytes2Int32Buffer(ctx.buffer)); 124 | for (var u = 0; u < 8; u++) { 125 | W[u + 8][0] = (int32Buf[4 * u]); 126 | W[u + 8][1] = (int32Buf[4 * u + 1]); 127 | W[u + 8][2] = (int32Buf[4 * u + 2]); 128 | W[u + 8][3] = (int32Buf[4 * u + 3]); 129 | } 130 | }; 131 | 132 | var mixColumns = function(W) { 133 | mixColumn(W, 0, 1, 2, 3); 134 | mixColumn(W, 4, 5, 6, 7); 135 | mixColumn(W, 8, 9, 10, 11); 136 | mixColumn(W, 12, 13, 14, 15); 137 | }; 138 | 139 | var ROUND = function(W,K) { 140 | subWords(W,K); 141 | shiftRows(W); 142 | mixColumns(W); 143 | }; 144 | 145 | var compress = function(ctx) { 146 | var W = new Array(16); 147 | for (var i = 0; i < 16; i++) { 148 | W[i] = new Array(4); 149 | } 150 | var K = new Array(4); 151 | op.bufferInsert(K,0,ctx.C,4); 152 | inputBlock(ctx, W); 153 | for (var u = 0; u < 10; u++) { 154 | ROUND(W,K); 155 | } 156 | finalize(ctx,W); 157 | }; 158 | 159 | var incrCounter = function(ctx, val) { 160 | ctx.C[0] = op.t32(ctx.C[0] + op.t32(val)); 161 | if (ctx.C[0] < op.t32(val)) { 162 | if ((ctx.C[1] = op.t32(ctx.C[1] + 1)) === 0) { 163 | if ((ctx.C[2] = op.t32(ctx.C[2] + 1)) === 0) { 164 | ctx.C[3] = op.t32(ctx.C[3] + 1); 165 | } 166 | } 167 | } 168 | }; 169 | 170 | var echoInit = function(ctx) { 171 | ctx.state = new Array(8); 172 | for (var i = 0; i < 8; i++) { 173 | ctx.state[i] = new Array(4); 174 | } 175 | ctx.state[0][0] = 512; 176 | ctx.state[0][1] = ctx.state[0][2] = ctx.state[0][3] = 0; 177 | ctx.state[1][0] = 512; 178 | ctx.state[1][1] = ctx.state[1][2] = ctx.state[1][3] = 0; 179 | ctx.state[2][0] = 512; 180 | ctx.state[2][1] = ctx.state[2][2] = ctx.state[2][3] = 0; 181 | ctx.state[3][0] = 512; 182 | ctx.state[3][1] = ctx.state[3][2] = ctx.state[3][3] = 0; 183 | ctx.state[4][0] = 512; 184 | ctx.state[4][1] = ctx.state[4][2] = ctx.state[4][3] = 0; 185 | ctx.state[5][0] = 512; 186 | ctx.state[5][1] = ctx.state[5][2] = ctx.state[5][3] = 0; 187 | ctx.state[6][0] = 512; 188 | ctx.state[6][1] = ctx.state[6][2] = ctx.state[6][3] = 0; 189 | ctx.state[7][0] = 512; 190 | ctx.state[7][1] = ctx.state[7][2] = ctx.state[7][3] = 0; 191 | ctx.ptr = 0; 192 | ctx.C = new Array(4); 193 | op.bufferSet(ctx.C,0,0,4); 194 | ctx.buffer = new Array(ECHO_BlockSize); 195 | }; 196 | 197 | var echo = function(ctx, data) { 198 | var buf, ptr; 199 | buf = ctx.buffer; 200 | ptr = ctx.ptr; 201 | var len = data.length; 202 | if (len < ctx.buffer.length - ptr) { 203 | op.bufferInsert(buf, ptr, data, data.length); 204 | ptr += data.length; 205 | ctx.ptr = ptr; 206 | return; 207 | } 208 | while (len > 0) { 209 | var clen = ctx.buffer.length - ptr; 210 | if (clen > len) clen = len; 211 | op.bufferInsert(buf, ptr, data, clen); 212 | ptr += clen; 213 | data = data.slice(clen); 214 | len -= clen; 215 | if (ptr === ctx.buffer.length) { 216 | incrCounter(ctx, 1024); 217 | compress(ctx); 218 | ptr = 0; 219 | } 220 | } 221 | ctx.ptr = ptr; 222 | }; 223 | 224 | var echoClose = function(ctx) { 225 | var out = new Array(16); 226 | var buf = ctx.buffer; 227 | var len = ctx.buffer.length; 228 | var ptr = ctx.ptr; 229 | var elen = (ptr << 3); 230 | incrCounter(ctx, elen); 231 | var cBytes = h.int32Buffer2Bytes(op.swap32Array(ctx.C)); 232 | /* 233 | * If elen is zero, then this block actually contains no message 234 | * bit, only the first padding bit. 235 | */ 236 | if (elen === 0) { 237 | ctx.C[0] = ctx.C[1] = ctx.C[2] = ctx.C[3] = 0; 238 | } 239 | buf[ptr++] = 0x80; 240 | 241 | op.bufferSet(buf,ptr, 0, len - ptr); 242 | if (ptr > (len - 18)) { 243 | compress(ctx); 244 | op.bufferSet(ctx.C,0,0,4); 245 | op.bufferSet(buf, 0, 0,len); 246 | } 247 | buf[len - 17] = 2; 248 | op.bufferInsert(buf,len - 16, cBytes, 16); 249 | compress(ctx); 250 | for (var u = 0; u < 4; u++) { 251 | for (var v = 0; v < 4; v++) { 252 | out[u*4 + v] = op.swap32(ctx.state[u][v]); 253 | } 254 | } 255 | return out; 256 | }; 257 | 258 | module.exports = function(input, format, output) { 259 | var msg; 260 | if (format === 1) { 261 | msg = input; 262 | } 263 | else if (format === 2) { 264 | msg = h.int32Buffer2Bytes(input); 265 | } 266 | else { 267 | msg = h.string2bytes(input); 268 | } 269 | var ctx = {}; 270 | echoInit(ctx); 271 | echo(ctx, msg); 272 | var r = echoClose(ctx); 273 | var out; 274 | if (output === 2) { 275 | out = r; 276 | } 277 | else if (output === 1) { 278 | out = h.int32Buffer2Bytes(r); 279 | } 280 | else { 281 | out = h.int32ArrayToHexString(r); 282 | } 283 | return out; 284 | }; 285 | -------------------------------------------------------------------------------- /lib/helper.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | // String functions 3 | 4 | var op = require('./op.js'); 5 | 6 | module.exports.int8ArrayToHexString = function toString(array) { 7 | var string = ''; 8 | 9 | for (var i = 0; i < array.length; i++) { 10 | if (array[i] < 16) { 11 | string += '0' + array[i].toString(16); 12 | } 13 | else { 14 | string += array[i].toString(16); 15 | } 16 | } 17 | return string; 18 | }; 19 | 20 | module.exports.int32ArrayToHexString = function toString(array) { 21 | var string = ''; 22 | var len = array.length; 23 | for (var i = 0; i < len; i++) { 24 | var s = array[i]; 25 | if (s < 0) { 26 | s = 0xFFFFFFFF + array[i] + 1; 27 | } 28 | var l = s.toString(16); 29 | var padding = 8; 30 | while (l.length < padding) { 31 | l = '0' + l; 32 | } 33 | string += l; 34 | } 35 | return string; 36 | }; 37 | 38 | module.exports.hex2string = function toString(s) { 39 | for (var c = [], len = s.length, i = 0; i < len; i += 2) c.push(String.fromCharCode(parseInt(s.substring(i, i + 2), 16))); 40 | return c.join(''); 41 | }; 42 | 43 | module.exports.hex2bytes = function toString(s) { 44 | for (var c = [], len = s.length, i = 0; i < len; i += 2) c.push(parseInt(s.substring(i, i + 2), 16)); 45 | return c; 46 | }; 47 | /* 48 | module.exports.string2hex = function toString(s) { 49 | 50 | for (var p = [], len = s.length, i = 0; i < len; i++) { 51 | p.push((256 + s.charCodeAt(i)).toString(16).substring(1)); 52 | } 53 | return p.join(''); 54 | } 55 | */ 56 | module.exports.string2bytes = function(s) { 57 | var len = s.length; 58 | var b = new Array(len); 59 | var i = 0; 60 | while (i < len) { 61 | b[i] = s.charCodeAt(i); 62 | i++; 63 | } 64 | return b; 65 | }; 66 | /* 67 | module.exports.bytes2Int16Buffer = function(b) { 68 | var len = b.length; 69 | var bufferLength = len ? (((len - 1) >>> 1) + 1) : 0; 70 | var buffer = new Array(bufferLength); 71 | var i = 0; 72 | var j = 0; 73 | while (i < len) { 74 | buffer[j] = (buffer[j] << 8) | b[i]; 75 | i++; 76 | if (!(i % 2)) j++; 77 | } 78 | return buffer; 79 | } 80 | */ 81 | 82 | module.exports.bytes2Int32Buffer = function(b) { 83 | if (!b) return []; 84 | var len = b.length ? (((b.length - 1) >>> 2) + 1) : 0; 85 | var buffer = new Array(len); 86 | var j = 0; 87 | while (j < len) { 88 | buffer[j] = (b[j * 4] << 24) | (b[j * 4 + 1] << 16) | (b[j * 4 + 2] << 8) | b[j * 4 + 3]; 89 | j++; 90 | } 91 | return buffer; 92 | }; 93 | /* 94 | module.exports.bytes2Int32BufferLeAligned = function(b) { 95 | var len = b.length; 96 | if (!len) return []; 97 | var len2 = len ? (((len - 1) >>> 2) + 1) : 0; 98 | var buffer = new Array(len); 99 | var j = 0; 100 | while (j < len2) { 101 | buffer[j] = (b[j * 4 + 3] << 24) | (b[j * 4 + 2] << 16) | (b[j * 4 + 1] << 8) | b[j * 4]; 102 | j++; 103 | }; 104 | return buffer; 105 | } 106 | */ 107 | module.exports.bytes2Int64Buffer = function(b) { 108 | if (!b) return []; 109 | var len = b.length ? (((b.length - 1) >>> 3) + 1) : 0; 110 | var buffer = new Array(len); 111 | var j = 0; 112 | while (j < len) { 113 | 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]); 114 | j++; 115 | } 116 | return buffer; 117 | }; 118 | 119 | module.exports.bytes2Int64BufferLeAligned = function(b) { 120 | if (!b) return []; 121 | var len = b.length ? ((( b.length - 1) >>> 3) + 1) : 0; 122 | var buffer = new Array(len); 123 | var j = 0; 124 | while (j < len) { 125 | 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]); 126 | j++; 127 | } 128 | return buffer; 129 | }; 130 | 131 | module.exports.bufferEncode64leAligned = function(buffer, offset, uint64) { 132 | buffer[offset + 7] = uint64.hi >>> 24; 133 | buffer[offset + 6] = uint64.hi >>> 16 & 0xFF; 134 | buffer[offset + 5] = uint64.hi >>> 8 & 0xFF; 135 | buffer[offset + 4] = uint64.hi & 0xFF; 136 | buffer[offset + 3] = uint64.lo >>> 24; 137 | buffer[offset + 2] = uint64.lo >>> 16 & 0xFF; 138 | buffer[offset + 1] = uint64.lo >>> 8 & 0xFF; 139 | buffer[offset + 0] = uint64.lo & 0xFF; 140 | }; 141 | 142 | module.exports.bufferEncode64 = function(buffer, offset, uint64) { 143 | buffer[offset] = uint64.hi >>> 24; 144 | buffer[offset + 1] = uint64.hi >>> 16 & 0xFF; 145 | buffer[offset + 2] = uint64.hi >>> 8 & 0xFF; 146 | buffer[offset + 3] = uint64.hi & 0xFF; 147 | buffer[offset + 4] = uint64.lo >>> 24; 148 | buffer[offset + 5] = uint64.lo >>> 16 & 0xFF; 149 | buffer[offset + 6] = uint64.lo >>> 8 & 0xFF; 150 | buffer[offset + 7] = uint64.lo & 0xFF; 151 | }; 152 | 153 | module.exports.int32Buffer2Bytes = function(b) { 154 | var buffer = new Array(b.length); 155 | var len = b.length; 156 | var i = 0; 157 | while (i < len) { 158 | buffer[i * 4] = (b[i] & 0xFF000000) >>> 24; 159 | buffer[i * 4 + 1] = (b[i] & 0x00FF0000) >>> 16; 160 | buffer[i * 4 + 2] = (b[i] & 0x0000FF00) >>> 8; 161 | buffer[i * 4 + 3] = (b[i] & 0x000000FF); 162 | i++; 163 | } 164 | return buffer; 165 | }; 166 | /* 167 | module.exports.int64Buffer2Bytes = function(b) { 168 | var buffer = new Array(b.length); 169 | var i = 0; 170 | while (i < b.length) { 171 | buffer[i * 8] = (b[i].hi & 0xFF000000) >>> 24; 172 | buffer[i * 8 + 1] = (b[i].hi & 0x00FF0000) >>> 16; 173 | buffer[i * 8 + 2] = (b[i].hi & 0x0000FF00) >>> 8; 174 | buffer[i * 8 + 3] = (b[i].hi & 0x000000FF); 175 | buffer[i * 8 + 4] = (b[i].lo & 0xFF000000) >>> 24; 176 | buffer[i * 8 + 5] = (b[i].lo & 0x00FF0000) >>> 16; 177 | buffer[i * 8 + 6] = (b[i].lo & 0x0000FF00) >>> 8; 178 | buffer[i * 8 + 7] = (b[i].lo & 0x000000FF); 179 | i++; 180 | } 181 | return buffer; 182 | } 183 | */ 184 | 185 | module.exports.string2Int32Buffer = function(s) { 186 | return this.bytes2Int32Buffer(this.string2bytes(s)); 187 | }; 188 | 189 | var keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; 190 | 191 | module.exports.b64Encode = function(input) { 192 | var output = ''; 193 | var chr1, chr2, chr3, enc1, enc2, enc3, enc4; 194 | var i = 0; 195 | 196 | while (i < input.length) { 197 | 198 | chr1 = input[i++]; 199 | chr2 = input[i++]; 200 | chr3 = input[i++]; 201 | 202 | enc1 = chr1 >> 2; 203 | enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); 204 | enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); 205 | enc4 = chr3 & 63; 206 | 207 | if (isNaN(chr2)) { 208 | enc3 = enc4 = 64; 209 | } 210 | else if (isNaN(chr3)) { 211 | enc4 = 64; 212 | } 213 | 214 | output += 215 | keyStr.charAt(enc1) + keyStr.charAt(enc2) + 216 | keyStr.charAt(enc3) + keyStr.charAt(enc4); 217 | } 218 | 219 | return output; 220 | }; 221 | 222 | module.exports.b64Decode = function(input) { 223 | var output = []; 224 | var chr1, chr2, chr3; 225 | var enc1, enc2, enc3, enc4; 226 | var i = 0; 227 | 228 | input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ''); 229 | 230 | while (i < input.length) { 231 | 232 | enc1 = keyStr.indexOf(input.charAt(i++)); 233 | enc2 = keyStr.indexOf(input.charAt(i++)); 234 | enc3 = keyStr.indexOf(input.charAt(i++)); 235 | enc4 = keyStr.indexOf(input.charAt(i++)); 236 | 237 | chr1 = (enc1 << 2) | (enc2 >> 4); 238 | chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); 239 | chr3 = ((enc3 & 3) << 6) | enc4; 240 | 241 | output.push(chr1); 242 | 243 | if (enc3 != 64) { 244 | output.push(chr2); 245 | } 246 | if (enc4 != 64) { 247 | output.push(chr3); 248 | } 249 | } 250 | return output; 251 | }; 252 | module.exports.isBuffer = function(obj) { 253 | return obj !== null && obj.constructor !== null && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj); 254 | }; 255 | -------------------------------------------------------------------------------- /lib/jh.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | ///////////////////////////////////// 3 | /////////////// Jh ///////////////// 4 | 5 | //// Written by Quantum Explorer //// 6 | ////////// Dash Foundation ////////// 7 | /// Released under the MIT License // 8 | ///////////////////////////////////// 9 | 10 | var op = require('./op'); 11 | var he = require('./helper'); 12 | 13 | var Jh_BlockSize = 64; 14 | var Jh_StateSize = 32; 15 | 16 | var JH_HX = 8; 17 | var JH_HY = 4; 18 | 19 | var IV512 = he.bytes2Int32Buffer(he.b64Decode('b9FLlj4Aqhdjai4FehXVQ4oiXo0Ml+8L6TQSWfKzw2GJHaDBU2+AHiqpBWvqK22AWI7M2yB1uqapDzp2uvg79wFp5gVB40ppRrWKji5v5loQR6fQwYQ8JDtucbEtWsGZz1f27J2x+FanBoh8VxaxVuPC/N/mhRf7VFpGeMyM3Us=')); 20 | 21 | 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')); 22 | 23 | // var IV512 = [ 24 | // (0x6fd14b96), (0x3e00aa17), (0x636a2e05), (0x7a15d543), 25 | // (0x8a225e8d), (0x0c97ef0b), (0xe9341259), (0xf2b3c361), 26 | // (0x891da0c1), (0x536f801e), (0x2aa9056b), (0xea2b6d80), 27 | // (0x588eccdb), (0x2075baa6), (0xa90f3a76), (0xbaf83bf7), 28 | // (0x0169e605), (0x41e34a69), (0x46b58a8e), (0x2e6fe65a), 29 | // (0x1047a7d0), (0xc1843c24), (0x3b6e71b1), (0x2d5ac199), 30 | // (0xcf57f6ec), (0x9db1f856), (0xa706887c), (0x5716b156), 31 | // (0xe3c2fcdf), (0xe68517fb), (0x545a4678), (0xcc8cdd4b) 32 | // ]; 33 | 34 | //C would need to be 32 bit swapped if using these values 35 | // var C = [ 36 | // (0x72d5dea2), (0xdf15f867), (0x7b84150a), 37 | // (0xb7231557), (0x81abd690), (0x4d5a87f6), 38 | // (0x4e9f4fc5), (0xc3d12b40), (0xea983ae0), 39 | // (0x5c45fa9c), (0x03c5d299), (0x66b2999a), 40 | // (0x660296b4), (0xf2bb538a), (0xb556141a), 41 | // (0x88dba231), (0x03a35a5c), (0x9a190edb), 42 | // (0x403fb20a), (0x87c14410), (0x1c051980), 43 | // (0x849e951d), (0x6f33ebad), (0x5ee7cddc), 44 | // (0x10ba1392), (0x02bf6b41), (0xdc786515), 45 | // (0xf7bb27d0), (0x0a2c8139), (0x37aa7850), 46 | // (0x3f1abfd2), (0x410091d3), (0x422d5a0d), 47 | // (0xf6cc7e90), (0xdd629f9c), (0x92c097ce), 48 | // (0x185ca70b), (0xc72b44ac), (0xd1df65d6), 49 | // (0x63c6fc23), (0x976e6c03), (0x9ee0b81a), 50 | // (0x2105457e), (0x446ceca8), (0xeef103bb), 51 | // (0x5d8e61fa), (0xfd9697b2), (0x94838197), 52 | // (0x4a8e8537), (0xdb03302f), (0x2a678d2d), 53 | // (0xfb9f6a95), (0x8afe7381), (0xf8b8696c), 54 | // (0x8ac77246), (0xc07f4214), (0xc5f4158f), 55 | // (0xbdc75ec4), (0x75446fa7), (0x8f11bb80), 56 | // (0x52de75b7), (0xaee488bc), (0x82b8001e), 57 | // (0x98a6a3f4), (0x8ef48f33), (0xa9a36315), 58 | // (0xaa5f5624), (0xd5b7f989), (0xb6f1ed20), 59 | // (0x7c5ae0fd), (0x36cae95a), (0x06422c36), 60 | // (0xce293543), (0x4efe983d), (0x533af974), 61 | // (0x739a4ba7), (0xd0f51f59), (0x6f4e8186), 62 | // (0x0e9dad81), (0xafd85a9f), (0xa7050667), 63 | // (0xee34626a), (0x8b0b28be), (0x6eb91727), 64 | // (0x47740726), (0xc680103f), (0xe0a07e6f), 65 | // (0xc67e487b), (0x0d550aa5), (0x4af8a4c0), 66 | // (0x91e3e79f), (0x978ef19e), (0x86767281), 67 | // (0x50608dd4), (0x7e9e5a41), (0xf3e5b062), 68 | // (0xfc9f1fec), (0x4054207a), (0xe3e41a00), 69 | // (0xcef4c984), (0x4fd794f5), (0x9dfa95d8), 70 | // (0x552e7e11), (0x24c354a5), (0x5bdf7228), 71 | // (0xbdfe6e28), (0x78f57fe2), (0x0fa5c4b2), 72 | // (0x05897cef), (0xee49d32e), (0x447e9385), 73 | // (0xeb28597f), (0x705f6937), (0xb324314a), 74 | // (0x5e8628f1), (0x1dd6e465), (0xc71b7704), 75 | // (0x51b920e7), (0x74fe43e8), (0x23d4878a), 76 | // (0x7d29e8a3), (0x927694f2), (0xddcb7a09), 77 | // (0x9b30d9c1), (0x1d1b30fb), (0x5bdc1be0), 78 | // (0xda24494f), (0xf29c82bf), (0xa4e7ba31), 79 | // (0xb470bfff), (0x0d324405), (0xdef8bc48), 80 | // (0x3baefc32), (0x53bbd339), (0x459fc3c1), 81 | // (0xe0298ba0), (0xe5c905fd), (0xf7ae090f), 82 | // (0x94703412), (0x4290f134), (0xa271b701), 83 | // (0xe344ed95), (0xe93b8e36), (0x4f2f984a), 84 | // (0x88401d63), (0xa06cf615), (0x47c1444b), 85 | // (0x8752afff), (0x7ebb4af1), (0xe20ac630), 86 | // (0x4670b6c5), (0xcc6e8ce6), (0xa4d5a456), 87 | // (0xbd4fca00), (0xda9d844b), (0xc83e18ae), 88 | // (0x7357ce45), (0x3064d1ad), (0xe8a6ce68), 89 | // (0x145c2567), (0xa3da8cf2), (0xcb0ee116), 90 | // (0x33e90658), (0x9a94999a), (0x1f60b220), 91 | // (0xc26f847b), (0xd1ceac7f), (0xa0d18518), 92 | // (0x32595ba1), (0x8ddd19d3), (0x509a1cc0), 93 | // (0xaaa5b446), (0x9f3d6367), (0xe4046bba), 94 | // (0xf6ca19ab), (0x0b56ee7e), (0x1fb179ea), 95 | // (0xa9282174), (0xe9bdf735), (0x3b3651ee), 96 | // (0x1d57ac5a), (0x7550d376), (0x3a46c2fe), 97 | // (0xa37d7001), (0xf735c1af), (0x98a4d842), 98 | // (0x78edec20), (0x9e6b6779), (0x41836315), 99 | // (0xea3adba8), (0xfac33b4d), (0x32832c83), 100 | // (0xa7403b1f), (0x1c2747f3), (0x5940f034), 101 | // (0xb72d769a), (0xe73e4e6c), (0xd2214ffd), 102 | // (0xb8fd8d39), (0xdc5759ef), (0x8d9b0c49), 103 | // (0x2b49ebda), (0x5ba2d749), (0x68f3700d), 104 | // (0x7d3baed0), (0x7a8d5584), (0xf5a5e9f0), 105 | // (0xe4f88e65), (0xa0b8a2f4), (0x36103b53), 106 | // (0x0ca8079e), (0x753eec5a), (0x91689492), 107 | // (0x56e8884f), (0x5bb05c55), (0xf8babc4c), 108 | // (0xe3bb3b99), (0xf387947b), (0x75daf4d6), 109 | // (0x726b1c5d), (0x64aeac28), (0xdc34b36d), 110 | // (0x6c34a550), (0xb828db71), (0xf861e2f2), 111 | // (0x108d512a), (0xe3db6433), (0x59dd75fc), 112 | // (0x1cacbcf1), (0x43ce3fa2), (0x67bbd13c), 113 | // (0x02e843b0), (0x330a5bca), (0x8829a175), 114 | // (0x7f34194d), (0xb416535c), (0x923b94c3), 115 | // (0x0e794d1e), (0x797475d7), (0xb6eeaf3f), 116 | // (0xeaa8d4f7), (0xbe1a3921), (0x5cf47e09), 117 | // (0x4c232751), (0x26a32453), (0xba323cd2), 118 | // (0x44a3174a), (0x6da6d5ad), (0xb51d3ea6), 119 | // (0xaff2c908), (0x83593d98), (0x916b3c56), 120 | // (0x4cf87ca1), (0x7286604d), (0x46e23ecc), 121 | // (0x086ec7f6), (0x2f9833b3), (0xb1bc765e), 122 | // (0x2bd666a5), (0xefc4e62a), (0x06f4b6e8), 123 | // (0xbec1d436), (0x74ee8215), (0xbcef2163), 124 | // (0xfdc14e0d), (0xf453c969), (0xa77d5ac4), 125 | // (0x06585826), (0x7ec11416), (0x06e0fa16), 126 | // (0x7e90af3d), (0x28639d3f), (0xd2c9f2e3), 127 | // (0x009bd20c), (0x5faace30), (0xb7d40c30), 128 | // (0x742a5116), (0xf2e03298), (0x0deb30d8), 129 | // (0xe3cef89a), (0x4bc59e7b), (0xb5f17992), 130 | // (0xff51e66e), (0x048668d3), (0x9b234d57), 131 | // (0xe6966731), (0xcce6a6f3), (0x170a7505), 132 | // (0xb17681d9), (0x13326cce), (0x3c175284), 133 | // (0xf805a262), (0xf42bcbb3), (0x78471547), 134 | // (0xff465482), (0x23936a48), (0x38df5807), 135 | // (0x4e5e6565), (0xf2fc7c89), (0xfc86508e), 136 | // (0x31702e44), (0xd00bca86), (0xf04009a2), 137 | // (0x3078474e), (0x65a0ee39), (0xd1f73883), 138 | // (0xf75ee937), (0xe42c3abd), (0x2197b226), 139 | // (0x0113f86f), (0xa344edd1), (0xef9fdee7), 140 | // (0x8ba0df15), (0x762592d9), (0x3c85f7f6), 141 | // (0x12dc42be), (0xd8a7ec7c), (0xab27b07e), 142 | // (0x538d7dda), (0xaa3ea8de), (0xaa25ce93), 143 | // (0xbd0269d8), (0x5af643fd), (0x1a7308f9), 144 | // (0xc05fefda), (0x174a19a5), (0x974d6633), 145 | // (0x4cfd216a), (0x35b49831), (0xdb411570), 146 | // (0xea1e0fbb), (0xedcd549b), (0x9ad063a1), 147 | // (0x51974072), (0xf6759dbf), (0x91476fe2) 148 | // ]; 149 | 150 | var Sb = function(x, c) { 151 | x[3] = ~x[3]; 152 | x[0] ^= (c) & ~x[2]; 153 | var tmp = (c) ^ (x[0] & x[1]); 154 | x[0] ^= x[2] & x[3]; 155 | x[3] ^= ~x[1] & x[2]; 156 | x[1] ^= x[0] & x[2]; 157 | x[2] ^= x[0] & ~x[3]; 158 | x[0] ^= x[1] | x[3]; 159 | x[3] ^= x[1] & x[2]; 160 | x[1] ^= tmp & x[0]; 161 | x[2] ^= tmp; 162 | return x; 163 | }; 164 | 165 | var Lb = function(x) { 166 | x[4] ^= x[1]; 167 | x[5] ^= x[2]; 168 | x[6] ^= x[3] ^ x[0]; 169 | x[7] ^= x[0]; 170 | x[0] ^= x[5]; 171 | x[1] ^= x[6]; 172 | x[2] ^= x[7] ^ x[4]; 173 | x[3] ^= x[4]; 174 | return x; 175 | }; 176 | 177 | var Ceven = function(n, r) { 178 | return C[((r) << 3) + 3 - n]; 179 | }; 180 | 181 | var Codd = function(n, r) { 182 | return C[((r) << 3) + 7 - n]; 183 | }; 184 | 185 | var S = function(x0, x1, x2, x3, cb, r) { 186 | var x = Sb([x0[3], x1[3], x2[3], x3[3]], cb(3, r)); 187 | x0[3] = x[0]; 188 | x1[3] = x[1]; 189 | x2[3] = x[2]; 190 | x3[3] = x[3]; 191 | x = Sb([x0[2], x1[2], x2[2], x3[2]], cb(2, r)); 192 | x0[2] = x[0]; 193 | x1[2] = x[1]; 194 | x2[2] = x[2]; 195 | x3[2] = x[3]; 196 | x = Sb([x0[1], x1[1], x2[1], x3[1]], cb(1, r)); 197 | x0[1] = x[0]; 198 | x1[1] = x[1]; 199 | x2[1] = x[2]; 200 | x3[1] = x[3]; 201 | x = Sb([x0[0], x1[0], x2[0], x3[0]], cb(0, r)); 202 | x0[0] = x[0]; 203 | x1[0] = x[1]; 204 | x2[0] = x[2]; 205 | x3[0] = x[3]; 206 | }; 207 | 208 | var L = function(x0, x1, x2, x3, x4, x5, x6, x7) { 209 | var x = Lb([x0[3], x1[3], x2[3], x3[3], x4[3], x5[3], x6[3], x7[3]]); 210 | x0[3] = x[0]; 211 | x1[3] = x[1]; 212 | x2[3] = x[2]; 213 | x3[3] = x[3]; 214 | x4[3] = x[4]; 215 | x5[3] = x[5]; 216 | x6[3] = x[6]; 217 | x7[3] = x[7]; 218 | x = Lb([x0[2], x1[2], x2[2], x3[2], x4[2], x5[2], x6[2], x7[2]]); 219 | x0[2] = x[0]; 220 | x1[2] = x[1]; 221 | x2[2] = x[2]; 222 | x3[2] = x[3]; 223 | x4[2] = x[4]; 224 | x5[2] = x[5]; 225 | x6[2] = x[6]; 226 | x7[2] = x[7]; 227 | x = Lb([x0[1], x1[1], x2[1], x3[1], x4[1], x5[1], x6[1], x7[1]]); 228 | x0[1] = x[0]; 229 | x1[1] = x[1]; 230 | x2[1] = x[2]; 231 | x3[1] = x[3]; 232 | x4[1] = x[4]; 233 | x5[1] = x[5]; 234 | x6[1] = x[6]; 235 | x7[1] = x[7]; 236 | x = Lb([x0[0], x1[0], x2[0], x3[0], x4[0], x5[0], x6[0], x7[0]]); 237 | x0[0] = x[0]; 238 | x1[0] = x[1]; 239 | x2[0] = x[2]; 240 | x3[0] = x[3]; 241 | x4[0] = x[4]; 242 | x5[0] = x[5]; 243 | x6[0] = x[6]; 244 | x7[0] = x[7]; 245 | }; 246 | 247 | var Wz = function(x, c, n) { 248 | var t = (x[3] & (c)) << (n); 249 | x[3] = ((x[3] >> (n)) & (c)) | t; 250 | t = (x[2] & (c)) << (n); 251 | x[2] = ((x[2] >> (n)) & (c)) | t; 252 | t = (x[1] & (c)) << (n); 253 | x[1] = ((x[1] >> (n)) & (c)) | t; 254 | t = (x[0] & (c)) << (n); 255 | x[0] = ((x[0] >> (n)) & (c)) | t; 256 | }; 257 | 258 | var W = function(ro, x) { 259 | switch (ro) { 260 | case 0: 261 | return Wz(x, (0x55555555), 1); 262 | case 1: 263 | return Wz(x, (0x33333333), 2); 264 | case 2: 265 | return Wz(x, (0x0F0F0F0F), 4); 266 | case 3: 267 | return Wz(x, (0x00FF00FF), 8); 268 | case 4: 269 | return Wz(x, (0x0000FFFF), 16); 270 | case 5: 271 | { 272 | var t = x[3]; 273 | x[3] = x[2]; 274 | x[2] = t; 275 | t = x[1]; 276 | x[1] = x[0]; 277 | x[0] = t; 278 | return; 279 | } 280 | case 6: 281 | { 282 | var t = x[3]; 283 | x[3] = x[1]; 284 | x[1] = t; 285 | t = x[2]; 286 | x[2] = x[0]; 287 | x[0] = t; 288 | 289 | } 290 | } 291 | }; 292 | 293 | var SL = function(h, r, ro) { 294 | S(h[0], h[2], h[4], h[6], Ceven, r); 295 | S(h[1], h[3], h[5], h[7], Codd, r); 296 | L(h[0], h[2], h[4], h[6], h[1], h[3], h[5], h[7]); 297 | W(ro, h[1]); 298 | W(ro, h[3]); 299 | W(ro, h[5]); 300 | W(ro, h[7]); 301 | }; 302 | 303 | var READ_STATE = function(h, state) { 304 | h[0][3] = state[0]; 305 | h[0][2] = state[1]; 306 | h[0][1] = state[2]; 307 | h[0][0] = state[3]; 308 | h[1][3] = state[4]; 309 | h[1][2] = state[5]; 310 | h[1][1] = state[6]; 311 | h[1][0] = state[7]; 312 | h[2][3] = state[8]; 313 | h[2][2] = state[9]; 314 | h[2][1] = state[10]; 315 | h[2][0] = state[11]; 316 | h[3][3] = state[12]; 317 | h[3][2] = state[13]; 318 | h[3][1] = state[14]; 319 | h[3][0] = state[15]; 320 | h[4][3] = state[16]; 321 | h[4][2] = state[17]; 322 | h[4][1] = state[18]; 323 | h[4][0] = state[19]; 324 | h[5][3] = state[20]; 325 | h[5][2] = state[21]; 326 | h[5][1] = state[22]; 327 | h[5][0] = state[23]; 328 | h[6][3] = state[24]; 329 | h[6][2] = state[25]; 330 | h[6][1] = state[26]; 331 | h[6][0] = state[27]; 332 | h[7][3] = state[28]; 333 | h[7][2] = state[29]; 334 | h[7][1] = state[30]; 335 | h[7][0] = state[31]; 336 | }; 337 | 338 | var WRITE_STATE = function(h, state) { 339 | state[0] = h[0][3]; 340 | state[1] = h[0][2]; 341 | state[2] = h[0][1]; 342 | state[3] = h[0][0]; 343 | state[4] = h[1][3]; 344 | state[5] = h[1][2]; 345 | state[6] = h[1][1]; 346 | state[7] = h[1][0]; 347 | state[8] = h[2][3]; 348 | state[9] = h[2][2]; 349 | state[10] = h[2][1]; 350 | state[11] = h[2][0]; 351 | state[12] = h[3][3]; 352 | state[13] = h[3][2]; 353 | state[14] = h[3][1]; 354 | state[15] = h[3][0]; 355 | state[16] = h[4][3]; 356 | state[17] = h[4][2]; 357 | state[18] = h[4][1]; 358 | state[19] = h[4][0]; 359 | state[20] = h[5][3]; 360 | state[21] = h[5][2]; 361 | state[22] = h[5][1]; 362 | state[23] = h[5][0]; 363 | state[24] = h[6][3]; 364 | state[25] = h[6][2]; 365 | state[26] = h[6][1]; 366 | state[27] = h[6][0]; 367 | state[28] = h[7][3]; 368 | state[29] = h[7][2]; 369 | state[30] = h[7][1]; 370 | state[31] = h[7][0]; 371 | }; 372 | 373 | var E8 = function(h) { 374 | for (var r = 0; r < 42; r += 7) { 375 | SL(h, r + 0, 0); 376 | SL(h, r + 1, 1); 377 | SL(h, r + 2, 2); 378 | SL(h, r + 3, 3); 379 | SL(h, r + 4, 4); 380 | SL(h, r + 5, 5); 381 | SL(h, r + 6, 6); 382 | } 383 | }; 384 | 385 | var bufferXORInsertBackwards = function(buffer, data, x, y, bufferOffsetX, bufferOffsetY) { 386 | if (!bufferOffsetX) bufferOffsetX = 0; 387 | if (!bufferOffsetY) bufferOffsetY = 0; 388 | for (var i = 0; i < x; i++) { 389 | for (var j = 0; j < x; j++) { 390 | var m = i + bufferOffsetX; 391 | var n = bufferOffsetY + y - 1 - j; 392 | var xOr = buffer[m][n] ^ data[i * 4 + j]; 393 | buffer[m][n] = xOr; 394 | } 395 | } 396 | }; 397 | 398 | var jh = function(ctx, data, len) { 399 | var buf, ptr; 400 | //create a local copy of states 401 | buf = ctx.buffer; 402 | ptr = ctx.ptr; 403 | if (!len) len = data.length; 404 | if (len < ctx.buffer.length - ptr) { 405 | op.bufferInsert(buf, ptr, data, data.length); 406 | ptr += data.length; 407 | ctx.ptr = ptr; 408 | return; 409 | } 410 | var V = new Array(JH_HX); 411 | for (var i = 0; i < JH_HX; i++) { 412 | V[i] = new Array(JH_HY); 413 | } 414 | READ_STATE(V, ctx.state); 415 | while (len > 0) { 416 | var clen = ctx.buffer.length - ptr; 417 | if (clen > len) clen = len; 418 | op.bufferInsert(buf, ptr, data, clen); 419 | ptr += clen; 420 | data = data.slice(clen); 421 | len -= clen; 422 | if (ptr === ctx.buffer.length) { 423 | var int32Buf = op.swap32Array(he.bytes2Int32Buffer(buf)); 424 | 425 | bufferXORInsertBackwards(V, int32Buf, 4, 4); 426 | E8(V); 427 | bufferXORInsertBackwards(V, int32Buf, 4, 4, 4, 0); 428 | if ((ctx.blockCountLow = op.t32(ctx.blockCountLow + 1)) === 0) ctx.blockCountHigh++; 429 | ptr = 0; 430 | } 431 | } 432 | WRITE_STATE(V, ctx.state); 433 | ctx.ptr = ptr; 434 | }; 435 | 436 | var jhClose = function(ctx) { 437 | var buf = new Array(128); 438 | var numz, u; 439 | var l = new Array(4); 440 | buf[0] = 0x80; 441 | if (ctx.ptr === 0) { 442 | numz = 47; 443 | } 444 | else { 445 | numz = 111 - ctx.ptr; 446 | } 447 | op.bufferSet(buf, 1, 0, numz); 448 | l[0] = op.t32(ctx.blockCountLow << 9) + (ctx.ptr << 3); 449 | l[1] = op.t32(ctx.blockCountLow >> 23) + op.t32(ctx.blockCountHigh << 9); 450 | l[2] = op.t32(ctx.blockCountHigh >> 23); 451 | l[3] = 0; 452 | var lBytes = he.int32Buffer2Bytes(op.swap32Array(l)); 453 | op.bufferInsertBackwards(buf, 1 + numz, lBytes, 16); 454 | jh(ctx, buf, numz + 17); 455 | var out = new Array(16); 456 | for (u = 0; u < 16; u++) out[u] = op.swap32(ctx.state[u + 16]); 457 | return out; 458 | }; 459 | 460 | module.exports = function(input, format, output) { 461 | var msg; 462 | if (format === 1) { 463 | msg = input; 464 | } 465 | else if (format === 2) { 466 | msg = he.int32Buffer2Bytes(input); 467 | } 468 | else { 469 | msg = he.string2bytes(input); 470 | } 471 | var ctx = {}; 472 | ctx.state = op.swap32Array(IV512); 473 | ctx.ptr = 0; 474 | ctx.buffer = new Array(Jh_BlockSize); 475 | ctx.blockCountHigh = 0; 476 | ctx.blockCountLow = 0; 477 | jh(ctx, msg); 478 | var r = jhClose(ctx); 479 | var out; 480 | if (output === 2) { 481 | out = r; 482 | } 483 | else if (output === 1) { 484 | out = he.int32Buffer2Bytes(r); 485 | } 486 | else { 487 | out = he.int32ArrayToHexString(r); 488 | } 489 | return out; 490 | }; 491 | -------------------------------------------------------------------------------- /lib/keccak.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | // Copyright 2015-2016 Chen, Yi-Cyuan 3 | 4 | // Permission is hereby granted, free of charge, to any person obtaining 5 | // a copy of this software and associated documentation files (the 6 | // "Software"), to deal in the Software without restriction, including 7 | // without limitation the rights to use, copy, modify, merge, publish, 8 | // distribute, sublicense, and/or sell copies of the Software, and to 9 | // permit persons to whom the Software is furnished to do so, subject to 10 | // the following conditions: 11 | 12 | // The above copyright notice and this permission notice shall be 13 | // included in all copies or substantial portions of the Software. 14 | 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | 23 | var HEX_CHARS = '0123456789abcdef'.split(''); 24 | var KECCAK_PADDING = [1, 256, 65536, 16777216]; 25 | var SHIFT = [0, 8, 16, 24]; 26 | var RC = [1, 0, 32898, 0, 32906, 2147483648, 2147516416, 2147483648, 32907, 0, 2147483649, 27 | 0, 2147516545, 2147483648, 32777, 2147483648, 138, 0, 136, 0, 2147516425, 0, 28 | 2147483658, 0, 2147516555, 0, 139, 2147483648, 32905, 2147483648, 32771, 29 | 2147483648, 32770, 2147483648, 128, 2147483648, 32778, 0, 2147483658, 2147483648, 30 | 2147516545, 2147483648, 32896, 2147483648, 2147483649, 0, 2147516424, 2147483648 31 | ]; 32 | var BITS = [512]; 33 | var OUTPUT_TYPES = ['hex', 'buffer', 'array']; 34 | 35 | var h = require('./helper'); 36 | 37 | var createOutputMethod = function(bits, padding, outputType) { 38 | return function(message) { 39 | return new Keccak(bits, padding, bits).update(message) 40 | [outputType](); 41 | }; 42 | }; 43 | 44 | var createShakeOutputMethod = function(bits, padding, outputType) { 45 | return function(message, outputBits) { 46 | return new Keccak(bits, padding, outputBits).update(message) 47 | [outputType](); 48 | }; 49 | }; 50 | 51 | var createMethod = function(bits, padding) { 52 | var method = createOutputMethod(bits, padding, 'array'); 53 | method.create = function() { 54 | return new Keccak(bits, padding, bits); 55 | }; 56 | method.update = function(message) { 57 | return method.create().update(message); 58 | }; 59 | for (var i = 0; i < OUTPUT_TYPES.length; ++i) { 60 | var type = OUTPUT_TYPES[i]; 61 | method[type] = createOutputMethod(bits, padding, type); 62 | } 63 | return method; 64 | }; 65 | 66 | var algorithms = [{ 67 | name: 'keccak', 68 | padding: KECCAK_PADDING, 69 | bits: BITS, 70 | createMethod: createMethod 71 | }]; 72 | 73 | var methods = {}; 74 | 75 | for (var i = 0; i < algorithms.length; ++i) { 76 | var algorithm = algorithms[i]; 77 | var bits = algorithm.bits; 78 | var createMethod = algorithm.createMethod; 79 | for (var j = 0; j < bits.length; ++j) { 80 | var method = algorithm.createMethod(bits[j], algorithm.padding); 81 | methods[algorithm.name + '_' + bits[j]] = method; 82 | } 83 | } 84 | 85 | function Keccak(bits, padding, outputBits) { 86 | this.blocks = []; 87 | this.s = []; 88 | this.padding = padding; 89 | this.outputBits = outputBits; 90 | this.reset = true; 91 | this.block = 0; 92 | this.start = 0; 93 | this.blockCount = (1600 - (bits << 1)) >> 5; 94 | this.byteCount = this.blockCount << 2; 95 | this.outputBlocks = outputBits >> 5; 96 | this.extraBytes = (outputBits & 31) >> 3; 97 | 98 | for (var i = 0; i < 50; ++i) { 99 | this.s[i] = 0; 100 | } 101 | } 102 | 103 | Keccak.prototype.update = function(message) { 104 | var notString = typeof(message) !== 'string'; 105 | if (notString && Object.prototype.toString.call(message.constructor) === '[object ArrayBuffer]') { 106 | message = h.string2bytes(message); 107 | } 108 | var length = message.length, 109 | blocks = this.blocks, 110 | byteCount = this.byteCount, 111 | blockCount = this.blockCount, 112 | index = 0, 113 | s = this.s, 114 | i, code; 115 | 116 | while (index < length) { 117 | if (this.reset) { 118 | this.reset = false; 119 | blocks[0] = this.block; 120 | for (i = 1; i < blockCount + 1; ++i) { 121 | blocks[i] = 0; 122 | } 123 | } 124 | if (notString) { 125 | for (i = this.start; index < length && i < byteCount; ++index) { 126 | blocks[i >> 2] |= message[index] << SHIFT[i++ & 3]; 127 | } 128 | } 129 | else { 130 | for (i = this.start; index < length && i < byteCount; ++index) { 131 | code = message.charCodeAt(index); 132 | if (code < 0x80) { 133 | blocks[i >> 2] |= code << SHIFT[i++ & 3]; 134 | } 135 | else if (code < 0x800) { 136 | blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3]; 137 | blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; 138 | } 139 | else if (code < 0xd800 || code >= 0xe000) { 140 | blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3]; 141 | blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3]; 142 | blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; 143 | } 144 | else { 145 | code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff)); 146 | blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3]; 147 | blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3]; 148 | blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3]; 149 | blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; 150 | } 151 | } 152 | } 153 | this.lastByteIndex = i; 154 | if (i >= byteCount) { 155 | this.start = i - byteCount; 156 | this.block = blocks[blockCount]; 157 | for (i = 0; i < blockCount; ++i) { 158 | s[i] ^= blocks[i]; 159 | } 160 | f(s); 161 | this.reset = true; 162 | } 163 | else { 164 | this.start = i; 165 | } 166 | } 167 | return this; 168 | }; 169 | 170 | Keccak.prototype.finalize = function() { 171 | var blocks = this.blocks, 172 | i = this.lastByteIndex, 173 | blockCount = this.blockCount, 174 | s = this.s; 175 | blocks[i >> 2] |= this.padding[i & 3]; 176 | if (this.lastByteIndex == this.byteCount) { 177 | blocks[0] = blocks[blockCount]; 178 | for (i = 1; i < blockCount + 1; ++i) { 179 | blocks[i] = 0; 180 | } 181 | } 182 | blocks[blockCount - 1] |= 0x80000000; 183 | for (i = 0; i < blockCount; ++i) { 184 | s[i] ^= blocks[i]; 185 | } 186 | f(s); 187 | }; 188 | 189 | Keccak.prototype.toString = Keccak.prototype.hex = function() { 190 | this.finalize(); 191 | 192 | var blockCount = this.blockCount, 193 | s = this.s, 194 | outputBlocks = this.outputBlocks, 195 | extraBytes = this.extraBytes, 196 | i = 0, 197 | j = 0; 198 | var hex = '', 199 | block; 200 | while (j < outputBlocks) { 201 | for (i = 0; i < blockCount && j < outputBlocks; ++i, ++j) { 202 | block = s[i]; 203 | hex += HEX_CHARS[(block >> 4) & 0x0F] + HEX_CHARS[block & 0x0F] + 204 | HEX_CHARS[(block >> 12) & 0x0F] + HEX_CHARS[(block >> 8) & 0x0F] + 205 | HEX_CHARS[(block >> 20) & 0x0F] + HEX_CHARS[(block >> 16) & 0x0F] + 206 | HEX_CHARS[(block >> 28) & 0x0F] + HEX_CHARS[(block >> 24) & 0x0F]; 207 | } 208 | if (j % blockCount == 0) { 209 | f(s); 210 | i = 0; 211 | } 212 | } 213 | if (extraBytes) { 214 | block = s[i]; 215 | if (extraBytes > 0) { 216 | hex += HEX_CHARS[(block >> 4) & 0x0F] + HEX_CHARS[block & 0x0F]; 217 | } 218 | if (extraBytes > 1) { 219 | hex += HEX_CHARS[(block >> 12) & 0x0F] + HEX_CHARS[(block >> 8) & 0x0F]; 220 | } 221 | if (extraBytes > 2) { 222 | hex += HEX_CHARS[(block >> 20) & 0x0F] + HEX_CHARS[(block >> 16) & 0x0F]; 223 | } 224 | } 225 | return hex; 226 | }; 227 | 228 | Keccak.prototype.buffer = function() { 229 | this.finalize(); 230 | 231 | var blockCount = this.blockCount, 232 | s = this.s, 233 | outputBlocks = this.outputBlocks, 234 | extraBytes = this.extraBytes, 235 | i = 0, 236 | j = 0; 237 | var bytes = this.outputBits >> 3; 238 | var buffer; 239 | if (extraBytes) { 240 | buffer = new ArrayBuffer((outputBlocks + 1) << 2); 241 | } 242 | else { 243 | buffer = new ArrayBuffer(bytes); 244 | } 245 | var array = new Uint32Array(buffer); 246 | while (j < outputBlocks) { 247 | for (i = 0; i < blockCount && j < outputBlocks; ++i, ++j) { 248 | array[j] = s[i]; 249 | } 250 | if (j % blockCount == 0) { 251 | f(s); 252 | } 253 | } 254 | if (extraBytes) { 255 | array[i] = s[i]; 256 | buffer = buffer.slice(0, bytes); 257 | } 258 | return buffer; 259 | }; 260 | 261 | Keccak.prototype.digest = Keccak.prototype.array = function() { 262 | this.finalize(); 263 | 264 | var blockCount = this.blockCount, 265 | s = this.s, 266 | outputBlocks = this.outputBlocks, 267 | extraBytes = this.extraBytes, 268 | i = 0, 269 | j = 0; 270 | var array = [], 271 | offset, block; 272 | while (j < outputBlocks) { 273 | for (i = 0; i < blockCount && j < outputBlocks; ++i, ++j) { 274 | offset = j << 2; 275 | block = s[i]; 276 | array[offset] = block & 0xFF; 277 | array[offset + 1] = (block >> 8) & 0xFF; 278 | array[offset + 2] = (block >> 16) & 0xFF; 279 | array[offset + 3] = (block >> 24) & 0xFF; 280 | } 281 | if (j % blockCount == 0) { 282 | f(s); 283 | } 284 | } 285 | if (extraBytes) { 286 | offset = j << 2; 287 | block = s[i]; 288 | if (extraBytes > 0) { 289 | array[offset] = block & 0xFF; 290 | } 291 | if (extraBytes > 1) { 292 | array[offset + 1] = (block >> 8) & 0xFF; 293 | } 294 | if (extraBytes > 2) { 295 | array[offset + 2] = (block >> 16) & 0xFF; 296 | } 297 | } 298 | return array; 299 | }; 300 | 301 | var f = function(s) { 302 | var h, l, n, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, 303 | b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17, 304 | b18, b19, b20, b21, b22, b23, b24, b25, b26, b27, b28, b29, b30, b31, b32, b33, 305 | b34, b35, b36, b37, b38, b39, b40, b41, b42, b43, b44, b45, b46, b47, b48, b49; 306 | for (n = 0; n < 48; n += 2) { 307 | c0 = s[0] ^ s[10] ^ s[20] ^ s[30] ^ s[40]; 308 | c1 = s[1] ^ s[11] ^ s[21] ^ s[31] ^ s[41]; 309 | c2 = s[2] ^ s[12] ^ s[22] ^ s[32] ^ s[42]; 310 | c3 = s[3] ^ s[13] ^ s[23] ^ s[33] ^ s[43]; 311 | c4 = s[4] ^ s[14] ^ s[24] ^ s[34] ^ s[44]; 312 | c5 = s[5] ^ s[15] ^ s[25] ^ s[35] ^ s[45]; 313 | c6 = s[6] ^ s[16] ^ s[26] ^ s[36] ^ s[46]; 314 | c7 = s[7] ^ s[17] ^ s[27] ^ s[37] ^ s[47]; 315 | c8 = s[8] ^ s[18] ^ s[28] ^ s[38] ^ s[48]; 316 | c9 = s[9] ^ s[19] ^ s[29] ^ s[39] ^ s[49]; 317 | 318 | h = c8 ^ ((c2 << 1) | (c3 >>> 31)); 319 | l = c9 ^ ((c3 << 1) | (c2 >>> 31)); 320 | s[0] ^= h; 321 | s[1] ^= l; 322 | s[10] ^= h; 323 | s[11] ^= l; 324 | s[20] ^= h; 325 | s[21] ^= l; 326 | s[30] ^= h; 327 | s[31] ^= l; 328 | s[40] ^= h; 329 | s[41] ^= l; 330 | h = c0 ^ ((c4 << 1) | (c5 >>> 31)); 331 | l = c1 ^ ((c5 << 1) | (c4 >>> 31)); 332 | s[2] ^= h; 333 | s[3] ^= l; 334 | s[12] ^= h; 335 | s[13] ^= l; 336 | s[22] ^= h; 337 | s[23] ^= l; 338 | s[32] ^= h; 339 | s[33] ^= l; 340 | s[42] ^= h; 341 | s[43] ^= l; 342 | h = c2 ^ ((c6 << 1) | (c7 >>> 31)); 343 | l = c3 ^ ((c7 << 1) | (c6 >>> 31)); 344 | s[4] ^= h; 345 | s[5] ^= l; 346 | s[14] ^= h; 347 | s[15] ^= l; 348 | s[24] ^= h; 349 | s[25] ^= l; 350 | s[34] ^= h; 351 | s[35] ^= l; 352 | s[44] ^= h; 353 | s[45] ^= l; 354 | h = c4 ^ ((c8 << 1) | (c9 >>> 31)); 355 | l = c5 ^ ((c9 << 1) | (c8 >>> 31)); 356 | s[6] ^= h; 357 | s[7] ^= l; 358 | s[16] ^= h; 359 | s[17] ^= l; 360 | s[26] ^= h; 361 | s[27] ^= l; 362 | s[36] ^= h; 363 | s[37] ^= l; 364 | s[46] ^= h; 365 | s[47] ^= l; 366 | h = c6 ^ ((c0 << 1) | (c1 >>> 31)); 367 | l = c7 ^ ((c1 << 1) | (c0 >>> 31)); 368 | s[8] ^= h; 369 | s[9] ^= l; 370 | s[18] ^= h; 371 | s[19] ^= l; 372 | s[28] ^= h; 373 | s[29] ^= l; 374 | s[38] ^= h; 375 | s[39] ^= l; 376 | s[48] ^= h; 377 | s[49] ^= l; 378 | 379 | b0 = s[0]; 380 | b1 = s[1]; 381 | b32 = (s[11] << 4) | (s[10] >>> 28); 382 | b33 = (s[10] << 4) | (s[11] >>> 28); 383 | b14 = (s[20] << 3) | (s[21] >>> 29); 384 | b15 = (s[21] << 3) | (s[20] >>> 29); 385 | b46 = (s[31] << 9) | (s[30] >>> 23); 386 | b47 = (s[30] << 9) | (s[31] >>> 23); 387 | b28 = (s[40] << 18) | (s[41] >>> 14); 388 | b29 = (s[41] << 18) | (s[40] >>> 14); 389 | b20 = (s[2] << 1) | (s[3] >>> 31); 390 | b21 = (s[3] << 1) | (s[2] >>> 31); 391 | b2 = (s[13] << 12) | (s[12] >>> 20); 392 | b3 = (s[12] << 12) | (s[13] >>> 20); 393 | b34 = (s[22] << 10) | (s[23] >>> 22); 394 | b35 = (s[23] << 10) | (s[22] >>> 22); 395 | b16 = (s[33] << 13) | (s[32] >>> 19); 396 | b17 = (s[32] << 13) | (s[33] >>> 19); 397 | b48 = (s[42] << 2) | (s[43] >>> 30); 398 | b49 = (s[43] << 2) | (s[42] >>> 30); 399 | b40 = (s[5] << 30) | (s[4] >>> 2); 400 | b41 = (s[4] << 30) | (s[5] >>> 2); 401 | b22 = (s[14] << 6) | (s[15] >>> 26); 402 | b23 = (s[15] << 6) | (s[14] >>> 26); 403 | b4 = (s[25] << 11) | (s[24] >>> 21); 404 | b5 = (s[24] << 11) | (s[25] >>> 21); 405 | b36 = (s[34] << 15) | (s[35] >>> 17); 406 | b37 = (s[35] << 15) | (s[34] >>> 17); 407 | b18 = (s[45] << 29) | (s[44] >>> 3); 408 | b19 = (s[44] << 29) | (s[45] >>> 3); 409 | b10 = (s[6] << 28) | (s[7] >>> 4); 410 | b11 = (s[7] << 28) | (s[6] >>> 4); 411 | b42 = (s[17] << 23) | (s[16] >>> 9); 412 | b43 = (s[16] << 23) | (s[17] >>> 9); 413 | b24 = (s[26] << 25) | (s[27] >>> 7); 414 | b25 = (s[27] << 25) | (s[26] >>> 7); 415 | b6 = (s[36] << 21) | (s[37] >>> 11); 416 | b7 = (s[37] << 21) | (s[36] >>> 11); 417 | b38 = (s[47] << 24) | (s[46] >>> 8); 418 | b39 = (s[46] << 24) | (s[47] >>> 8); 419 | b30 = (s[8] << 27) | (s[9] >>> 5); 420 | b31 = (s[9] << 27) | (s[8] >>> 5); 421 | b12 = (s[18] << 20) | (s[19] >>> 12); 422 | b13 = (s[19] << 20) | (s[18] >>> 12); 423 | b44 = (s[29] << 7) | (s[28] >>> 25); 424 | b45 = (s[28] << 7) | (s[29] >>> 25); 425 | b26 = (s[38] << 8) | (s[39] >>> 24); 426 | b27 = (s[39] << 8) | (s[38] >>> 24); 427 | b8 = (s[48] << 14) | (s[49] >>> 18); 428 | b9 = (s[49] << 14) | (s[48] >>> 18); 429 | 430 | s[0] = b0 ^ (~b2 & b4); 431 | s[1] = b1 ^ (~b3 & b5); 432 | s[10] = b10 ^ (~b12 & b14); 433 | s[11] = b11 ^ (~b13 & b15); 434 | s[20] = b20 ^ (~b22 & b24); 435 | s[21] = b21 ^ (~b23 & b25); 436 | s[30] = b30 ^ (~b32 & b34); 437 | s[31] = b31 ^ (~b33 & b35); 438 | s[40] = b40 ^ (~b42 & b44); 439 | s[41] = b41 ^ (~b43 & b45); 440 | s[2] = b2 ^ (~b4 & b6); 441 | s[3] = b3 ^ (~b5 & b7); 442 | s[12] = b12 ^ (~b14 & b16); 443 | s[13] = b13 ^ (~b15 & b17); 444 | s[22] = b22 ^ (~b24 & b26); 445 | s[23] = b23 ^ (~b25 & b27); 446 | s[32] = b32 ^ (~b34 & b36); 447 | s[33] = b33 ^ (~b35 & b37); 448 | s[42] = b42 ^ (~b44 & b46); 449 | s[43] = b43 ^ (~b45 & b47); 450 | s[4] = b4 ^ (~b6 & b8); 451 | s[5] = b5 ^ (~b7 & b9); 452 | s[14] = b14 ^ (~b16 & b18); 453 | s[15] = b15 ^ (~b17 & b19); 454 | s[24] = b24 ^ (~b26 & b28); 455 | s[25] = b25 ^ (~b27 & b29); 456 | s[34] = b34 ^ (~b36 & b38); 457 | s[35] = b35 ^ (~b37 & b39); 458 | s[44] = b44 ^ (~b46 & b48); 459 | s[45] = b45 ^ (~b47 & b49); 460 | s[6] = b6 ^ (~b8 & b0); 461 | s[7] = b7 ^ (~b9 & b1); 462 | s[16] = b16 ^ (~b18 & b10); 463 | s[17] = b17 ^ (~b19 & b11); 464 | s[26] = b26 ^ (~b28 & b20); 465 | s[27] = b27 ^ (~b29 & b21); 466 | s[36] = b36 ^ (~b38 & b30); 467 | s[37] = b37 ^ (~b39 & b31); 468 | s[46] = b46 ^ (~b48 & b40); 469 | s[47] = b47 ^ (~b49 & b41); 470 | s[8] = b8 ^ (~b0 & b2); 471 | s[9] = b9 ^ (~b1 & b3); 472 | s[18] = b18 ^ (~b10 & b12); 473 | s[19] = b19 ^ (~b11 & b13); 474 | s[28] = b28 ^ (~b20 & b22); 475 | s[29] = b29 ^ (~b21 & b23); 476 | s[38] = b38 ^ (~b30 & b32); 477 | s[39] = b39 ^ (~b31 & b33); 478 | s[48] = b48 ^ (~b40 & b42); 479 | s[49] = b49 ^ (~b41 & b43); 480 | 481 | s[0] ^= RC[n]; 482 | s[1] ^= RC[n + 1]; 483 | } 484 | }; 485 | module.exports = methods; 486 | // if (!root.JS_SHA3_TEST && NODE_JS) { 487 | // module.exports = methods; 488 | // } else if (root) { 489 | // for (var key in methods) { 490 | // root[key] = methods[key]; 491 | // } 492 | // } 493 | 494 | // module.exports = function(input, format, output) { 495 | // var msg = input; 496 | // if (format === 1) { 497 | // msg = input; 498 | // } 499 | // else if (format === 2) { 500 | // msg = h.int32Buffer2Bytes(input); 501 | // } 502 | // else { 503 | // msg = h.string2bytes(input); 504 | // } 505 | // var ctx = {}; 506 | // if (output === 1) { 507 | // return h.bytes2Int32Buffer(new Keccak().update(msg).array()); 508 | // } 509 | // else if (output === 2) { 510 | // return new Keccak().update(msg).array(); 511 | // } 512 | // else { 513 | // return new Keccak().update(msg).hex(); 514 | // } 515 | // } 516 | -------------------------------------------------------------------------------- /lib/luffa.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | ///////////////////////////////////// 3 | ////////////// Luffa /////////////// 4 | 5 | //// Written by Quantum Explorer //// 6 | ////////// Dash Foundation ////////// 7 | /// Released under the MIT License // 8 | ///////////////////////////////////// 9 | 10 | var o = require('./op'); 11 | var h = require('./helper'); 12 | 13 | var V_INIT = [ 14 | [ 15 | 0x6d251e69, 0x44b051e0, 16 | 0x4eaa6fb4, 0xdbf78465, 17 | 0x6e292011, 0x90152df4, 18 | 0xee058139, 0xdef610bb 19 | ], 20 | [ 21 | 0xc3b44b95, 0xd9d2f256, 22 | 0x70eee9a0, 0xde099fa3, 23 | 0x5d9b0557, 0x8fc944b3, 24 | 0xcf1ccf0e, 0x746cd581 25 | ], 26 | [ 27 | 0xf7efc89d, 0x5dba5781, 28 | 0x04016ce5, 0xad659c05, 29 | 0x0306194f, 0x666d1836, 30 | 0x24aa230a, 0x8b264ae7 31 | ], 32 | [ 33 | 0x858075d5, 0x36d79cce, 34 | 0xe571f7d7, 0x204b1f67, 35 | 0x35870c6a, 0x57e9e923, 36 | 0x14bcb808, 0x7cde72ce 37 | ], 38 | [ 39 | 0x6c68e9be, 0x5ec41e22, 40 | 0xc825b7c7, 0xaffb4363, 41 | 0xf5df3999, 0x0fc688f1, 42 | 0xb07224cc, 0x03e86cea 43 | ] 44 | ]; 45 | 46 | var RC00 = [ 47 | 0x303994a6, 0xc0e65299, 48 | 0x6cc33a12, 0xdc56983e, 49 | 0x1e00108f, 0x7800423d, 50 | 0x8f5b7882, 0x96e1db12 51 | ]; 52 | 53 | var RC04 = [ 54 | 0xe0337818, 0x441ba90d, 55 | 0x7f34d442, 0x9389217f, 56 | 0xe5a8bce6, 0x5274baf4, 57 | 0x26889ba7, 0x9a226e9d 58 | ]; 59 | 60 | var RC10 = [ 61 | 0xb6de10ed, 0x70f47aae, 62 | 0x0707a3d4, 0x1c1e8f51, 63 | 0x707a3d45, 0xaeb28562, 64 | 0xbaca1589, 0x40a46f3e 65 | ]; 66 | 67 | var RC14 = [ 68 | 0x01685f3d, 0x05a17cf4, 69 | 0xbd09caca, 0xf4272b28, 70 | 0x144ae5cc, 0xfaa7ae2b, 71 | 0x2e48f1c1, 0xb923c704 72 | ]; 73 | 74 | var RC20 = [ 75 | 0xfc20d9d2, 0x34552e25, 76 | 0x7ad8818f, 0x8438764a, 77 | 0xbb6de032, 0xedb780c8, 78 | 0xd9847356, 0xa2c78434 79 | ]; 80 | 81 | var RC24 = [ 82 | 0xe25e72c1, 0xe623bb72, 83 | 0x5c58a4a4, 0x1e38e2e7, 84 | 0x78e38b9d, 0x27586719, 85 | 0x36eda57f, 0x703aace7 86 | ]; 87 | 88 | var RC30 = [ 89 | 0xb213afa5, 0xc84ebe95, 90 | 0x4e608a22, 0x56d858fe, 91 | 0x343b138f, 0xd0ec4e3d, 92 | 0x2ceb4882, 0xb3ad2208 93 | ]; 94 | 95 | var RC34 = [ 96 | 0xe028c9bf, 0x44756f91, 97 | 0x7e8fce32, 0x956548be, 98 | 0xfe191be2, 0x3cb226e5, 99 | 0x5944a28e, 0xa1c4c355 100 | ]; 101 | 102 | var RC40 = [ 103 | 0xf0d2e9e3, 0xac11d7fa, 104 | 0x1bcb66f2, 0x6f2d9bc9, 105 | 0x78602649, 0x8edae952, 106 | 0x3b6ba548, 0xedae9520 107 | ]; 108 | 109 | var RC44 = [ 110 | 0x5090d577, 0x2d1925ab, 111 | 0xb46496ac, 0xd1925ab0, 112 | 0x29131ab6, 0x0fc053c3, 113 | 0x3f014f0c, 0xfc053c31 114 | ]; 115 | 116 | var M2 = function(d, s) { 117 | var tmp = s[7]; 118 | d[7] = s[6]; 119 | d[6] = s[5]; 120 | d[5] = s[4]; 121 | d[4] = s[3] ^ tmp; 122 | d[3] = s[2] ^ tmp; 123 | d[2] = s[1]; 124 | d[1] = s[0] ^ tmp; 125 | d[0] = tmp; 126 | }; 127 | 128 | //V is a table of states 129 | var MI5 = function(buf, V) { 130 | var M = Array(8); 131 | var a = Array(8); 132 | var b = Array(8); 133 | M[0] = buf[0]; 134 | M[1] = buf[1]; 135 | M[2] = buf[2]; 136 | M[3] = buf[3]; 137 | M[4] = buf[4]; 138 | M[5] = buf[5]; 139 | M[6] = buf[6]; 140 | M[7] = buf[7]; 141 | o.xORTable(a, V[0], V[1], 8); 142 | o.xORTable(b, V[2], V[3], 8); 143 | o.xORTable(a, a, b, 8); 144 | o.xORTable(a, a, V[4], 8); 145 | M2(a, a); 146 | o.xORTable(V[0], a, V[0], 8); 147 | o.xORTable(V[1], a, V[1], 8); 148 | o.xORTable(V[2], a, V[2], 8); 149 | o.xORTable(V[3], a, V[3], 8); 150 | o.xORTable(V[4], a, V[4], 8); 151 | M2(b, V[0]); 152 | o.xORTable(b, b, V[1], 8); 153 | M2(V[1], V[1]); 154 | o.xORTable(V[1], V[1], V[2], 8); 155 | M2(V[2], V[2]); 156 | o.xORTable(V[2], V[2], V[3], 8); 157 | M2(V[3], V[3]); 158 | o.xORTable(V[3], V[3], V[4], 8); 159 | M2(V[4], V[4]); 160 | o.xORTable(V[4], V[4], V[0], 8); 161 | M2(V[0], b); 162 | o.xORTable(V[0], V[0], V[4], 8); 163 | M2(V[4], V[4]); 164 | o.xORTable(V[4], V[4], V[3], 8); 165 | M2(V[3], V[3]); 166 | o.xORTable(V[3], V[3], V[2], 8); 167 | M2(V[2], V[2]); 168 | o.xORTable(V[2], V[2], V[1], 8); 169 | M2(V[1], V[1]); 170 | o.xORTable(V[1], V[1], b, 8); 171 | o.xORTable(V[0], V[0], M, 8); 172 | M2(M, M); 173 | o.xORTable(V[1], V[1], M, 8); 174 | M2(M, M); 175 | o.xORTable(V[2], V[2], M, 8); 176 | M2(M, M); 177 | o.xORTable(V[3], V[3], M, 8); 178 | M2(M, M); 179 | o.xORTable(V[4], V[4], M, 8); 180 | }; 181 | 182 | var TWEAK5 = function(V) { 183 | V[1][4] = o.rotl32(V[1][4], 1); 184 | V[1][5] = o.rotl32(V[1][5], 1); 185 | V[1][6] = o.rotl32(V[1][6], 1); 186 | V[1][7] = o.rotl32(V[1][7], 1); 187 | V[2][4] = o.rotl32(V[2][4], 2); 188 | V[2][5] = o.rotl32(V[2][5], 2); 189 | V[2][6] = o.rotl32(V[2][6], 2); 190 | V[2][7] = o.rotl32(V[2][7], 2); 191 | V[3][4] = o.rotl32(V[3][4], 3); 192 | V[3][5] = o.rotl32(V[3][5], 3); 193 | V[3][6] = o.rotl32(V[3][6], 3); 194 | V[3][7] = o.rotl32(V[3][7], 3); 195 | V[4][4] = o.rotl32(V[4][4], 4); 196 | V[4][5] = o.rotl32(V[4][5], 4); 197 | V[4][6] = o.rotl32(V[4][6], 4); 198 | V[4][7] = o.rotl32(V[4][7], 4); 199 | }; 200 | 201 | var SUB_CRUMB = function(a0, a1, a2, a3) { 202 | var tmp; 203 | tmp = (a0); 204 | (a0) |= (a1); 205 | (a2) ^= (a3); 206 | (a1) = o.t32(~(a1)); 207 | (a0) ^= (a3); 208 | (a3) &= tmp; 209 | (a1) ^= (a3); 210 | (a3) ^= (a2); 211 | (a2) &= (a0); 212 | (a0) = o.t32(~(a0)); 213 | (a2) ^= (a1); 214 | (a1) |= (a3); 215 | tmp ^= (a1); 216 | (a3) ^= (a2); 217 | (a2) &= (a1); 218 | (a1) ^= (a0); 219 | (a0) = tmp; 220 | return [a0, a1, a2, a3]; 221 | }; 222 | 223 | var MIX_WORD = function(u, v) { 224 | (v) ^= (u); 225 | (u) = o.rotl32((u), 2) ^ (v); 226 | (v) = o.rotl32((v), 14) ^ (u); 227 | (u) = o.rotl32((u), 10) ^ (v); 228 | (v) = o.rotl32((v), 1); 229 | return [u,v]; 230 | }; 231 | 232 | var P5 = function(V) { 233 | TWEAK5(V); 234 | var tmp; 235 | for (var r = 0; r < 8; r++) { 236 | tmp = SUB_CRUMB(V[0][0], V[0][1], V[0][2], V[0][3]); 237 | V[0][0] = tmp[0]; 238 | V[0][1] = tmp[1]; 239 | V[0][2] = tmp[2]; 240 | V[0][3] = tmp[3]; 241 | tmp = SUB_CRUMB(V[0][5], V[0][6], V[0][7], V[0][4]); 242 | V[0][5] = tmp[0]; 243 | V[0][6] = tmp[1]; 244 | V[0][7] = tmp[2]; 245 | V[0][4] = tmp[3]; 246 | tmp = MIX_WORD(V[0][0], V[0][4]); 247 | V[0][0] = tmp[0]; 248 | V[0][4] = tmp[1]; 249 | tmp = MIX_WORD(V[0][1], V[0][5]); 250 | V[0][1] = tmp[0]; 251 | V[0][5] = tmp[1]; 252 | tmp = MIX_WORD(V[0][2], V[0][6]); 253 | V[0][2] = tmp[0]; 254 | V[0][6] = tmp[1]; 255 | tmp = MIX_WORD(V[0][3], V[0][7]); 256 | V[0][3] = tmp[0]; 257 | V[0][7] = tmp[1]; 258 | V[0][0] ^= RC00[r]; 259 | V[0][4] ^= RC04[r]; 260 | } 261 | for (var r = 0; r < 8; r++) { 262 | tmp = SUB_CRUMB(V[1][0], V[1][1], V[1][2], V[1][3]); 263 | V[1][0] = tmp[0]; 264 | V[1][1] = tmp[1]; 265 | V[1][2] = tmp[2]; 266 | V[1][3] = tmp[3]; 267 | tmp = SUB_CRUMB(V[1][5], V[1][6], V[1][7], V[1][4]); 268 | V[1][5] = tmp[0]; 269 | V[1][6] = tmp[1]; 270 | V[1][7] = tmp[2]; 271 | V[1][4] = tmp[3]; 272 | tmp = MIX_WORD(V[1][0], V[1][4]); 273 | V[1][0] = tmp[0]; 274 | V[1][4] = tmp[1]; 275 | tmp = MIX_WORD(V[1][1], V[1][5]); 276 | V[1][1] = tmp[0]; 277 | V[1][5] = tmp[1]; 278 | tmp = MIX_WORD(V[1][2], V[1][6]); 279 | V[1][2] = tmp[0]; 280 | V[1][6] = tmp[1]; 281 | tmp = MIX_WORD(V[1][3], V[1][7]); 282 | V[1][3] = tmp[0]; 283 | V[1][7] = tmp[1]; 284 | V[1][0] ^= RC10[r]; 285 | V[1][4] ^= RC14[r]; 286 | } 287 | for (var r = 0; r < 8; r++) { 288 | tmp = SUB_CRUMB(V[2][0], V[2][1], V[2][2], V[2][3]); 289 | V[2][0] = tmp[0]; 290 | V[2][1] = tmp[1]; 291 | V[2][2] = tmp[2]; 292 | V[2][3] = tmp[3]; 293 | tmp = SUB_CRUMB(V[2][5], V[2][6], V[2][7], V[2][4]); 294 | V[2][5] = tmp[0]; 295 | V[2][6] = tmp[1]; 296 | V[2][7] = tmp[2]; 297 | V[2][4] = tmp[3]; 298 | tmp = MIX_WORD(V[2][0], V[2][4]); 299 | V[2][0] = tmp[0]; 300 | V[2][4] = tmp[1]; 301 | tmp = MIX_WORD(V[2][1], V[2][5]); 302 | V[2][1] = tmp[0]; 303 | V[2][5] = tmp[1]; 304 | tmp = MIX_WORD(V[2][2], V[2][6]); 305 | V[2][2] = tmp[0]; 306 | V[2][6] = tmp[1]; 307 | tmp = MIX_WORD(V[2][3], V[2][7]); 308 | V[2][3] = tmp[0]; 309 | V[2][7] = tmp[1]; 310 | V[2][0] ^= RC20[r]; 311 | V[2][4] ^= RC24[r]; 312 | } 313 | for (var r = 0; r < 8; r++) { 314 | tmp = SUB_CRUMB(V[3][0], V[3][1], V[3][2], V[3][3]); 315 | V[3][0] = tmp[0]; 316 | V[3][1] = tmp[1]; 317 | V[3][2] = tmp[2]; 318 | V[3][3] = tmp[3]; 319 | tmp = SUB_CRUMB(V[3][5], V[3][6], V[3][7], V[3][4]); 320 | V[3][5] = tmp[0]; 321 | V[3][6] = tmp[1]; 322 | V[3][7] = tmp[2]; 323 | V[3][4] = tmp[3]; 324 | tmp = MIX_WORD(V[3][0], V[3][4]); 325 | V[3][0] = tmp[0]; 326 | V[3][4] = tmp[1]; 327 | tmp = MIX_WORD(V[3][1], V[3][5]); 328 | V[3][1] = tmp[0]; 329 | V[3][5] = tmp[1]; 330 | tmp = MIX_WORD(V[3][2], V[3][6]); 331 | V[3][2] = tmp[0]; 332 | V[3][6] = tmp[1]; 333 | tmp = MIX_WORD(V[3][3], V[3][7]); 334 | V[3][3] = tmp[0]; 335 | V[3][7] = tmp[1]; 336 | V[3][0] ^= RC30[r]; 337 | V[3][4] ^= RC34[r]; 338 | } 339 | for (var r = 0; r < 8; r++) { 340 | tmp = SUB_CRUMB(V[4][0], V[4][1], V[4][2], V[4][3]); 341 | V[4][0] = tmp[0]; 342 | V[4][1] = tmp[1]; 343 | V[4][2] = tmp[2]; 344 | V[4][3] = tmp[3]; 345 | tmp = SUB_CRUMB(V[4][5], V[4][6], V[4][7], V[4][4]); 346 | V[4][5] = tmp[0]; 347 | V[4][6] = tmp[1]; 348 | V[4][7] = tmp[2]; 349 | V[4][4] = tmp[3]; 350 | tmp = MIX_WORD(V[4][0], V[4][4]); 351 | V[4][0] = tmp[0]; 352 | V[4][4] = tmp[1]; 353 | tmp = MIX_WORD(V[4][1], V[4][5]); 354 | V[4][1] = tmp[0]; 355 | V[4][5] = tmp[1]; 356 | tmp = MIX_WORD(V[4][2], V[4][6]); 357 | V[4][2] = tmp[0]; 358 | V[4][6] = tmp[1]; 359 | tmp = MIX_WORD(V[4][3], V[4][7]); 360 | V[4][3] = tmp[0]; 361 | V[4][7] = tmp[1]; 362 | V[4][0] ^= RC40[r]; 363 | V[4][4] ^= RC44[r]; 364 | } 365 | }; 366 | 367 | 368 | var luffa5 = function(ctx, data) { 369 | var buf, ptr; 370 | //create a local copy of states 371 | var V = new Array(5); 372 | for (var i = 0; i < 5; i++) { 373 | V[i] = new Array(8); 374 | } 375 | buf = ctx.buffer; 376 | ptr = ctx.ptr; 377 | var len = data.length; 378 | if (len < ctx.buffer.length - ptr) { 379 | o.bufferInsert(buf, ptr, data, data.length); 380 | ptr += data.length; 381 | ctx.ptr = ptr; 382 | return; 383 | } 384 | //perform a deep copy of current state 385 | for (var i = 0; i < 5; i++) { 386 | for (var j = 0; j < 8; j++) { 387 | V[i][j] = ctx.state[i][j]; 388 | } 389 | } 390 | while (len > 0) { 391 | var clen = ctx.buffer.length - ptr; 392 | if (clen > len) clen = len; 393 | o.bufferInsert(buf, ptr, data, clen); 394 | ptr += clen; 395 | data = data.slice(clen); 396 | len -= clen; 397 | if (ptr === ctx.buffer.length) { 398 | var int32Buf = h.bytes2Int32Buffer(buf); 399 | MI5(int32Buf, V); 400 | P5(V); 401 | ptr = 0; 402 | } 403 | } 404 | ctx.state = V; 405 | ctx.ptr = ptr; 406 | }; 407 | 408 | var luffa5Close = function(ctx, ub, n) { 409 | var buf, out, ptr, z, i; 410 | var V = new Array(5); 411 | for (var i = 0; i < 5; i++) { 412 | V[i] = new Array(8); 413 | } 414 | buf = ctx.buffer; 415 | ptr = ctx.ptr; 416 | z = 0x80 >> n; 417 | buf[ptr++] = ((ub & -z) | z) & 0xFF; 418 | o.bufferSet(buf, ptr, 0, ctx.buffer.length - ptr); 419 | for (var i = 0; i < 5; i++) { 420 | for (var j = 0; j < 8; j++) { 421 | V[i][j] = ctx.state[i][j]; 422 | } 423 | } 424 | var out = new Array(16); 425 | for (i = 0; i < 3; i++) { 426 | var int32Buf = h.bytes2Int32Buffer(buf); 427 | MI5(int32Buf, V); 428 | P5(V); 429 | switch (i) { 430 | case 0: 431 | o.bufferSet(buf, 0, 0, ctx.buffer.length); 432 | break; 433 | case 1: 434 | out[0] = V[0][0] ^ V[1][0] ^ V[2][0] ^ V[3][0] ^ V[4][0]; 435 | out[1] = V[0][1] ^ V[1][1] ^ V[2][1] ^ V[3][1] ^ V[4][1]; 436 | out[2] = V[0][2] ^ V[1][2] ^ V[2][2] ^ V[3][2] ^ V[4][2]; 437 | out[3] = V[0][3] ^ V[1][3] ^ V[2][3] ^ V[3][3] ^ V[4][3]; 438 | out[4] = V[0][4] ^ V[1][4] ^ V[2][4] ^ V[3][4] ^ V[4][4]; 439 | out[5] = V[0][5] ^ V[1][5] ^ V[2][5] ^ V[3][5] ^ V[4][5]; 440 | out[6] = V[0][6] ^ V[1][6] ^ V[2][6] ^ V[3][6] ^ V[4][6]; 441 | out[7] = V[0][7] ^ V[1][7] ^ V[2][7] ^ V[3][7] ^ V[4][7]; 442 | break; 443 | case 2: 444 | out[8] = V[0][0] ^ V[1][0] ^ V[2][0] ^ V[3][0] ^ V[4][0]; 445 | out[9] = V[0][1] ^ V[1][1] ^ V[2][1] ^ V[3][1] ^ V[4][1]; 446 | out[10] = V[0][2] ^ V[1][2] ^ V[2][2] ^ V[3][2] ^ V[4][2]; 447 | out[11] = V[0][3] ^ V[1][3] ^ V[2][3] ^ V[3][3] ^ V[4][3]; 448 | out[12] = V[0][4] ^ V[1][4] ^ V[2][4] ^ V[3][4] ^ V[4][4]; 449 | out[13] = V[0][5] ^ V[1][5] ^ V[2][5] ^ V[3][5] ^ V[4][5]; 450 | out[14] = V[0][6] ^ V[1][6] ^ V[2][6] ^ V[3][6] ^ V[4][6]; 451 | out[15] = V[0][7] ^ V[1][7] ^ V[2][7] ^ V[3][7] ^ V[4][7]; 452 | break; 453 | } 454 | } 455 | return out; 456 | }; 457 | 458 | module.exports = function(input, format, output) { 459 | var msg; 460 | if (format === 1) { 461 | msg = input; 462 | } 463 | else if (format === 2) { 464 | msg = h.int32Buffer2Bytes(input); 465 | } 466 | else { 467 | msg = h.string2bytes(input); 468 | } 469 | var ctx = {}; 470 | ctx.state = V_INIT; 471 | ctx.ptr = 0; 472 | ctx.buffer = new Array(32); 473 | luffa5(ctx, msg); 474 | var r = luffa5Close(ctx, 0, 0); 475 | var out; 476 | if (output === 2) { 477 | out = r; 478 | } 479 | else if (output === 1) { 480 | out = h.int32Buffer2Bytes(r); 481 | } 482 | else { 483 | out = h.int32ArrayToHexString(r); 484 | } 485 | return out; 486 | }; 487 | -------------------------------------------------------------------------------- /lib/op.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | //the right shift is important, it has to do with 32 bit operations in javascript, it will make things faster 3 | function u64(h, l) { 4 | this.hi = h >>> 0; 5 | this.lo = l >>> 0; 6 | } 7 | 8 | u64.prototype.set = function(oWord) { 9 | this.lo = oWord.lo; 10 | this.hi = oWord.hi; 11 | }; 12 | 13 | u64.prototype.add = function(oWord) { 14 | var lowest, lowMid, highMid, highest; //four parts of the whole 64 bit number.. 15 | 16 | //need to add the respective parts from each number and the carry if on is present.. 17 | lowest = (this.lo & 0XFFFF) + (oWord.lo & 0XFFFF); 18 | lowMid = (this.lo >>> 16) + (oWord.lo >>> 16) + (lowest >>> 16); 19 | highMid = (this.hi & 0XFFFF) + (oWord.hi & 0XFFFF) + (lowMid >>> 16); 20 | highest = (this.hi >>> 16) + (oWord.hi >>> 16) + (highMid >>> 16); 21 | 22 | //now set the hgih and the low accordingly.. 23 | this.lo = (lowMid << 16) | (lowest & 0XFFFF); 24 | this.hi = (highest << 16) | (highMid & 0XFFFF); 25 | 26 | return this; //for chaining.. 27 | }; 28 | 29 | u64.prototype.addOne = function() { 30 | if (this.lo === -1 || this.lo === 0xFFFFFFFF) { 31 | this.lo = 0; 32 | this.hi++; 33 | } 34 | else { 35 | this.lo++; 36 | } 37 | }; 38 | 39 | u64.prototype.plus = function(oWord) { 40 | var c = new u64(0, 0); 41 | var lowest, lowMid, highMid, highest; //four parts of the whole 64 bit number.. 42 | 43 | //need to add the respective parts from each number and the carry if on is present.. 44 | lowest = (this.lo & 0XFFFF) + (oWord.lo & 0XFFFF); 45 | lowMid = (this.lo >>> 16) + (oWord.lo >>> 16) + (lowest >>> 16); 46 | highMid = (this.hi & 0XFFFF) + (oWord.hi & 0XFFFF) + (lowMid >>> 16); 47 | highest = (this.hi >>> 16) + (oWord.hi >>> 16) + (highMid >>> 16); 48 | 49 | //now set the hgih and the low accordingly.. 50 | c.lo = (lowMid << 16) | (lowest & 0XFFFF); 51 | c.hi = (highest << 16) | (highMid & 0XFFFF); 52 | 53 | return c; //for chaining.. 54 | }; 55 | 56 | u64.prototype.not = function() { 57 | return new u64(~this.hi, ~this.lo); 58 | }; 59 | 60 | u64.prototype.one = function() { 61 | return new u64(0x0, 0x1); 62 | }; 63 | 64 | u64.prototype.zero = function() { 65 | return new u64(0x0, 0x0); 66 | }; 67 | 68 | u64.prototype.neg = function() { 69 | return this.not().plus(this.one()); 70 | }; 71 | 72 | u64.prototype.minus = function(oWord) { 73 | return this.plus(oWord.neg()); 74 | }; 75 | 76 | u64.prototype.isZero = function() { 77 | return (this.lo === 0) && (this.hi === 0); 78 | }; 79 | 80 | function isLong(obj) { 81 | return (obj && obj.__isLong__) === true; 82 | } 83 | 84 | function fromNumber(value) { 85 | if (isNaN(value) || !isFinite(value)) return this.zero(); 86 | var pow32 = (1 << 32); 87 | return new u64((value % pow32) | 0, (value / pow32) | 0); 88 | } 89 | 90 | u64.prototype.multiply = function(multiplier) { 91 | if (this.isZero()) return this.zero(); 92 | if (!isLong(multiplier)) multiplier = fromNumber(multiplier); 93 | if (multiplier.isZero()) return this.zero(); 94 | 95 | // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products. 96 | // We can skip products that would overflow. 97 | 98 | var a48 = this.hi >>> 16; 99 | var a32 = this.hi & 0xFFFF; 100 | var a16 = this.lo >>> 16; 101 | var a00 = this.lo & 0xFFFF; 102 | 103 | var b48 = multiplier.hi >>> 16; 104 | var b32 = multiplier.hi & 0xFFFF; 105 | var b16 = multiplier.lo >>> 16; 106 | var b00 = multiplier.lo & 0xFFFF; 107 | 108 | var c48 = 0, 109 | c32 = 0, 110 | c16 = 0, 111 | c00 = 0; 112 | c00 += a00 * b00; 113 | c16 += c00 >>> 16; 114 | c00 &= 0xFFFF; 115 | c16 += a16 * b00; 116 | c32 += c16 >>> 16; 117 | c16 &= 0xFFFF; 118 | c16 += a00 * b16; 119 | c32 += c16 >>> 16; 120 | c16 &= 0xFFFF; 121 | c32 += a32 * b00; 122 | c48 += c32 >>> 16; 123 | c32 &= 0xFFFF; 124 | c32 += a16 * b16; 125 | c48 += c32 >>> 16; 126 | c32 &= 0xFFFF; 127 | c32 += a00 * b32; 128 | c48 += c32 >>> 16; 129 | c32 &= 0xFFFF; 130 | c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48; 131 | c48 &= 0xFFFF; 132 | return new u64((c48 << 16) | c32, (c16 << 16) | c00); 133 | }; 134 | 135 | u64.prototype.shiftLeft = function(bits) { 136 | bits = bits % 64; 137 | var c = new u64(0, 0); 138 | if (bits === 0) { 139 | return this.clone(); 140 | } 141 | else if (bits > 31) { 142 | c.lo = 0; 143 | c.hi = this.lo << (bits - 32); 144 | } 145 | else { 146 | var toMoveUp = this.lo >>> 32 - bits; 147 | c.lo = this.lo << bits; 148 | c.hi = (this.hi << bits) | toMoveUp; 149 | } 150 | return c; //for chaining.. 151 | }; 152 | 153 | u64.prototype.setShiftLeft = function(bits) { 154 | if (bits === 0) { 155 | return this; 156 | } 157 | if (bits > 63) { 158 | bits = bits % 64; 159 | } 160 | 161 | if (bits > 31) { 162 | this.hi = this.lo << (bits - 32); 163 | this.lo = 0; 164 | } 165 | else { 166 | var toMoveUp = this.lo >>> 32 - bits; 167 | this.lo <<= bits; 168 | this.hi = (this.hi << bits) | toMoveUp; 169 | } 170 | return this; //for chaining.. 171 | }; 172 | //Shifts this word by the given number of bits to the right (max 32).. 173 | u64.prototype.shiftRight = function(bits) { 174 | bits = bits % 64; 175 | var c = new u64(0, 0); 176 | if (bits === 0) { 177 | return this.clone(); 178 | } 179 | else if (bits >= 32) { 180 | c.hi = 0; 181 | c.lo = this.hi >>> (bits - 32); 182 | } 183 | else { 184 | var bitsOff32 = 32 - bits, 185 | toMoveDown = this.hi << bitsOff32 >>> bitsOff32; 186 | c.hi = this.hi >>> bits; 187 | c.lo = this.lo >>> bits | (toMoveDown << bitsOff32); 188 | } 189 | return c; //for chaining.. 190 | }; 191 | //Rotates the bits of this word round to the left (max 32).. 192 | u64.prototype.rotateLeft = function(bits) { 193 | if (bits > 32) { 194 | return this.rotateRight(64 - bits); 195 | } 196 | var c = new u64(0, 0); 197 | if (bits === 0) { 198 | c.lo = this.lo >>> 0; 199 | c.hi = this.hi >>> 0; 200 | } 201 | else if (bits === 32) { //just switch high and low over in this case.. 202 | c.lo = this.hi; 203 | c.hi = this.lo; 204 | } 205 | else { 206 | c.lo = (this.lo << bits) | (this.hi >>> (32 - bits)); 207 | c.hi = (this.hi << bits) | (this.lo >>> (32 - bits)); 208 | } 209 | return c; //for chaining.. 210 | }; 211 | 212 | u64.prototype.setRotateLeft = function(bits) { 213 | if (bits > 32) { 214 | return this.setRotateRight(64 - bits); 215 | } 216 | var newHigh; 217 | if (bits === 0) { 218 | return this; 219 | } 220 | else if (bits === 32) { //just switch high and low over in this case.. 221 | newHigh = this.lo; 222 | this.lo = this.hi; 223 | this.hi = newHigh; 224 | } 225 | else { 226 | newHigh = (this.hi << bits) | (this.lo >>> (32 - bits)); 227 | this.lo = (this.lo << bits) | (this.hi >>> (32 - bits)); 228 | this.hi = newHigh; 229 | } 230 | return this; //for chaining.. 231 | }; 232 | //Rotates the bits of this word round to the right (max 32).. 233 | u64.prototype.rotateRight = function(bits) { 234 | if (bits > 32) { 235 | return this.rotateLeft(64 - bits); 236 | } 237 | var c = new u64(0, 0); 238 | if (bits === 0) { 239 | c.lo = this.lo >>> 0; 240 | c.hi = this.hi >>> 0; 241 | } 242 | else if (bits === 32) { //just switch high and low over in this case.. 243 | c.lo = this.hi; 244 | c.hi = this.lo; 245 | } 246 | else { 247 | c.lo = (this.hi << (32 - bits)) | (this.lo >>> bits); 248 | c.hi = (this.lo << (32 - bits)) | (this.hi >>> bits); 249 | } 250 | return c; //for chaining.. 251 | }; 252 | u64.prototype.setFlip = function() { 253 | var newHigh; 254 | newHigh = this.lo; 255 | this.lo = this.hi; 256 | this.hi = newHigh; 257 | return this; 258 | }; 259 | //Rotates the bits of this word round to the right (max 32).. 260 | u64.prototype.setRotateRight = function(bits) { 261 | if (bits > 32) { 262 | return this.setRotateLeft(64 - bits); 263 | } 264 | 265 | if (bits === 0) { 266 | return this; 267 | } 268 | else if (bits === 32) { //just switch high and low over in this case.. 269 | var newHigh; 270 | newHigh = this.lo; 271 | this.lo = this.hi; 272 | this.hi = newHigh; 273 | } 274 | else { 275 | newHigh = (this.lo << (32 - bits)) | (this.hi >>> bits); 276 | this.lo = (this.hi << (32 - bits)) | (this.lo >>> bits); 277 | this.hi = newHigh; 278 | } 279 | return this; //for chaining.. 280 | }; 281 | //Xors this word with the given other.. 282 | u64.prototype.xor = function(oWord) { 283 | var c = new u64(0, 0); 284 | c.hi = this.hi ^ oWord.hi; 285 | c.lo = this.lo ^ oWord.lo; 286 | return c; //for chaining.. 287 | }; 288 | //Xors this word with the given other.. 289 | u64.prototype.setxorOne = function(oWord) { 290 | this.hi ^= oWord.hi; 291 | this.lo ^= oWord.lo; 292 | return this; //for chaining.. 293 | }; 294 | //Ands this word with the given other.. 295 | u64.prototype.and = function(oWord) { 296 | var c = new u64(0, 0); 297 | c.hi = this.hi & oWord.hi; 298 | c.lo = this.lo & oWord.lo; 299 | return c; //for chaining.. 300 | }; 301 | 302 | //Creates a deep copy of this Word.. 303 | u64.prototype.clone = function() { 304 | return new u64(this.hi, this.lo); 305 | }; 306 | 307 | u64.prototype.setxor64 = function() { 308 | var a = arguments; 309 | var i = a.length; 310 | while (i--) { 311 | this.hi ^= a[i].hi; 312 | this.lo ^= a[i].lo; 313 | } 314 | return this; 315 | }; 316 | 317 | module.exports.u64 = u64; 318 | 319 | module.exports.u = function(h, l) { 320 | return new u64(h, l); 321 | }; 322 | /* 323 | module.exports.add64 = function(a, b) { 324 | var lowest, lowMid, highMid, highest; //four parts of the whole 64 bit number.. 325 | 326 | //need to add the respective parts from each number and the carry if on is present.. 327 | lowest = (a.lo & 0XFFFF) + (b.lo & 0XFFFF); 328 | lowMid = (a.lo >>> 16) + (b.lo >>> 16) + (lowest >>> 16); 329 | highMid = (a.hi & 0XFFFF) + (b.hi & 0XFFFF) + (lowMid >>> 16); 330 | highest = (a.hi >>> 16) + (b.hi >>> 16) + (highMid >>> 16); 331 | 332 | var r = new this.u64((highest << 16) | (highMid & 0XFFFF), (lowMid << 16) | (lowest & 0XFFFF)); 333 | 334 | return r; 335 | }; 336 | */ 337 | module.exports.xor64 = function() { 338 | var a = arguments, 339 | h = a[0].hi, 340 | l = a[0].lo; 341 | var i = a.length-1; 342 | do { 343 | h ^= a[i].hi; 344 | l ^= a[i].lo; 345 | i--; 346 | } while (i>0); 347 | return new this.u64(h, l); 348 | }; 349 | 350 | module.exports.clone64Array = function(array) { 351 | var i = 0; 352 | var len = array.length; 353 | var a = new Array(len); 354 | while (i