From 6174e01ccd403f7c9f24212f9fda99f3477fe0be Mon Sep 17 00:00:00 2001 From: Daniel Cousens Date: Tue, 23 May 2017 15:23:04 +1000 Subject: [PATCH 1/7] safe-buffer --- browser.js | 1 + make-hash.js | 24 +++++++++++++----------- package.json | 1 + test.js | 7 ++++--- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/browser.js b/browser.js index 56a46d8..e380f3b 100644 --- a/browser.js +++ b/browser.js @@ -1,4 +1,5 @@ 'use strict' +var Buffer = require('safe-buffer').Buffer var inherits = require('inherits') var md5 = require('./md5') var RIPEMD160 = require('ripemd160') diff --git a/make-hash.js b/make-hash.js index c9f7862..f6b5df1 100644 --- a/make-hash.js +++ b/make-hash.js @@ -1,19 +1,19 @@ 'use strict' -var intSize = 4 -var zeroBuffer = new Buffer(intSize) -zeroBuffer.fill(0) +var INT32_SIZE = 4 +var CHAR64_SIZE = 8 +var HASH128_SIZE = 16 -var charSize = 8 -var hashSize = 16 +var Buffer = require('safe-buffer').Buffer +var zeroBuffer = Buffer.alloc(INT32_SIZE, 0) -function toArray (buf) { - if ((buf.length % intSize) !== 0) { - var len = buf.length + (intSize - (buf.length % intSize)) +function asUInt32Array (buf) { + if ((buf.length % INT32_SIZE) !== 0) { + var len = buf.length + (INT32_SIZE - (buf.length % INT32_SIZE)) buf = Buffer.concat([buf, zeroBuffer], len) } var arr = new Array(buf.length >>> 2) - for (var i = 0, j = 0; i < buf.length; i += intSize, j++) { + for (var i = 0, j = 0; i < buf.length; i += INT32_SIZE, j++) { arr[j] = buf.readInt32LE(i) } @@ -21,10 +21,12 @@ function toArray (buf) { } module.exports = function hash (buf, fn) { - var arr = fn(toArray(buf), buf.length * charSize) - buf = new Buffer(hashSize) + var arr = fn(asUInt32Array(buf), buf.length * CHAR64_SIZE) + buf = new Buffer(HASH128_SIZE) + for (var i = 0; i < arr.length; i++) { buf.writeInt32LE(arr[i], i << 2, true) } + return buf } diff --git a/package.json b/package.json index c9a4ea6..391cb4c 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "cipher-base": "^1.0.1", "inherits": "^2.0.1", "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", "sha.js": "^2.4.0" } } diff --git a/test.js b/test.js index 3928d66..7c98f9f 100644 --- a/test.js +++ b/test.js @@ -1,5 +1,6 @@ var test = require('tape') +var Buffer = require('safe-buffer').Buffer var algorithms = ['sha1', 'sha224', 'sha256', 'sha384', 'sha512', 'md5', 'rmd160', 'ripemd160'] var encodings = ['hex', 'base64'] // ignore binary var vectors = require('hash-test-vectors') @@ -11,7 +12,7 @@ var createHash = require('./browser') algorithms.forEach(function (algorithm) { test('test ' + algorithm + ' against test vectors', function (t) { vectors.forEach(function (obj, i) { - var input = new Buffer(obj.input, 'base64') + var input = Buffer.from(obj.input, 'base64') var node = obj[algorithm] var js = createHash(algorithm).update(input).digest('hex') t.equal(js, node, algorithm + '(testVector[' + i + ']) == ' + node) @@ -19,7 +20,7 @@ algorithms.forEach(function (algorithm) { encodings.forEach(function (encoding) { vectors.forEach(function (obj, i) { - var input = new Buffer(obj.input, 'base64').toString(encoding) + var input = Buffer.from(obj.input, 'base64').toString(encoding) var node = obj[algorithm] var js = createHash(algorithm).update(input, encoding).digest('hex') t.equal(js, node, algorithm + '(testVector[' + i + '], ' + encoding + ') == ' + node) @@ -27,7 +28,7 @@ algorithms.forEach(function (algorithm) { }) vectors.forEach(function (obj, i) { - var input = new Buffer(obj.input, 'base64') + var input = Buffer.from(obj.input, 'base64') var node = obj[algorithm] var hash = createHash(algorithm) hash.end(input) From c66a06d0849e7eeb5fb145b560275f6f57636bea Mon Sep 17 00:00:00 2001 From: Daniel Cousens Date: Wed, 24 May 2017 17:06:36 +1000 Subject: [PATCH 2/7] add MIT LICENSE --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f06007a --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017 crypto-browserify contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From 352e1e84bb14db2d779c3ccd67bfda875e301b0b Mon Sep 17 00:00:00 2001 From: Daniel Cousens Date: Wed, 24 May 2017 17:08:05 +1000 Subject: [PATCH 3/7] travis: drop Node <4 --- .travis.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6c48541..da59431 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,13 +3,15 @@ language: node_js before_install: - "npm install npm -g" node_js: - - "0.10" - - "0.12" - "4" - "5" - "6" + - "7" env: - - TEST_SUITE=standard - - TEST_SUITE=unit -script: "npm run-script $TEST_SUITE" - + matrix: + - TEST_SUITE=unit +matrix: + include: + - node_js: "7" + env: TEST_SUITE=standard +script: npm run $TEST_SUITE From 3fee95a78f4cb45b08c7d6a076f411eae3ee6bd5 Mon Sep 17 00:00:00 2001 From: Daniel Cousens Date: Wed, 24 May 2017 17:09:06 +1000 Subject: [PATCH 4/7] README: cleanup --- README.md | 19 +++++++++++++++++++ readme.md | 19 ------------------- 2 files changed, 19 insertions(+), 19 deletions(-) create mode 100644 README.md delete mode 100644 readme.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..bad028d --- /dev/null +++ b/README.md @@ -0,0 +1,19 @@ +# create-hash + +[![Build Status](https://travis-ci.org/crypto-browserify/createHash.svg)](https://travis-ci.org/crypto-browserify/createHash) + +Node style hashes for use in the browser, with native hash functions in node. + +API is the same as hashes in node: +```js +var createHash = require('create-hash') +var hash = createHash('sha224') +hash.update('synchronous write') // optional encoding parameter +hash.digest() // synchronously get result with optional encoding parameter + +hash.write('write to it as a stream') +hash.end() // remember it's a stream +hash.read() // only if you ended it as a stream though +``` + +To get the JavaScript version even in node do `require('create-hash/browser')` diff --git a/readme.md b/readme.md deleted file mode 100644 index a4a6815..0000000 --- a/readme.md +++ /dev/null @@ -1,19 +0,0 @@ -create-hash -=== - -[![Build Status](https://travis-ci.org/crypto-browserify/createHash.svg)](https://travis-ci.org/crypto-browserify/createHash) - -Node style hashes for use in the browser, with native hash functions in node. Api is the same as hashes in node: - -```js -var createHash = require('create-hash'); -var hash = createHash('sha224'); -hash.update('synchronous write'); //optional encoding parameter -hash.digest();// synchronously get result with optional encoding parameter - -hash.write('write to it as a stream'); -hash.end();//remember it's a stream -hash.read();//only if you ended it as a stream though -``` - -To get the JavaScript version even in node do `require('create-hash/browser');` \ No newline at end of file From 082b20eed6e2c44ba2649e0c7e9ec80e29bda853 Mon Sep 17 00:00:00 2001 From: Daniel Cousens Date: Wed, 24 May 2017 17:09:34 +1000 Subject: [PATCH 5/7] package: bump standard --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 391cb4c..a6c109d 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "homepage": "https://github.com/crypto-browserify/createHash", "devDependencies": { "hash-test-vectors": "^1.3.2", - "standard": "^5.3.1", + "standard": "^10.0.2", "tap-spec": "^2.1.2", "tape": "^3.0.3" }, From d4096c81934bc691f8d0fce6d390cf7c88a90206 Mon Sep 17 00:00:00 2001 From: Daniel Cousens Date: Wed, 24 May 2017 17:11:16 +1000 Subject: [PATCH 6/7] md5: re-order for define-before-use --- md5.js | 218 +++++++++++++++++++++++++-------------------------- package.json | 2 +- 2 files changed, 110 insertions(+), 110 deletions(-) diff --git a/md5.js b/md5.js index 55b5a94..3d213c7 100644 --- a/md5.js +++ b/md5.js @@ -10,130 +10,34 @@ var makeHash = require('./make-hash') -/* - * Calculate the MD5 of an array of little-endian words, and a bit length - */ -function core_md5 (x, len) { - /* append padding */ - x[len >> 5] |= 0x80 << ((len) % 32) - x[(((len + 64) >>> 9) << 4) + 14] = len - - var a = 1732584193 - var b = -271733879 - var c = -1732584194 - var d = 271733878 - - for (var i = 0; i < x.length; i += 16) { - var olda = a - var oldb = b - var oldc = c - var oldd = d - - a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936) - d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586) - c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819) - b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330) - a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897) - d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426) - c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341) - b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983) - a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416) - d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417) - c = md5_ff(c, d, a, b, x[i + 10], 17, -42063) - b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162) - a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682) - d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101) - c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290) - b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329) - - a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510) - d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632) - c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713) - b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302) - a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691) - d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083) - c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335) - b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848) - a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438) - d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690) - c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961) - b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501) - a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467) - d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784) - c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473) - b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734) - - a = md5_hh(a, b, c, d, x[i + 5], 4, -378558) - d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463) - c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562) - b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556) - a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060) - d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353) - c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632) - b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640) - a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174) - d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222) - c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979) - b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189) - a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487) - d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835) - c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520) - b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651) - - a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844) - d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415) - c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905) - b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055) - a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571) - d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606) - c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523) - b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799) - a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359) - d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744) - c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380) - b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649) - a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070) - d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379) - c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259) - b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551) - - a = safe_add(a, olda) - b = safe_add(b, oldb) - c = safe_add(c, oldc) - d = safe_add(d, oldd) - } - - return [a, b, c, d] -} - /* * These functions implement the four basic operations the algorithm uses. */ -function md5_cmn (q, a, b, x, s, t) { - return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b) +function md5cmn (q, a, b, x, s, t) { + return safeAdd(bitRol(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b) } -function md5_ff (a, b, c, d, x, s, t) { - return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t) +function md5ff (a, b, c, d, x, s, t) { + return md5cmn((b & c) | ((~b) & d), a, b, x, s, t) } -function md5_gg (a, b, c, d, x, s, t) { - return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t) +function md5gg (a, b, c, d, x, s, t) { + return md5cmn((b & d) | (c & (~d)), a, b, x, s, t) } -function md5_hh (a, b, c, d, x, s, t) { - return md5_cmn(b ^ c ^ d, a, b, x, s, t) +function md5hh (a, b, c, d, x, s, t) { + return md5cmn(b ^ c ^ d, a, b, x, s, t) } -function md5_ii (a, b, c, d, x, s, t) { - return md5_cmn(c ^ (b | (~d)), a, b, x, s, t) +function md5ii (a, b, c, d, x, s, t) { + return md5cmn(c ^ (b | (~d)), a, b, x, s, t) } /* * Add integers, wrapping at 2^32. This uses 16-bit operations internally * to work around bugs in some JS interpreters. */ -function safe_add (x, y) { +function safeAdd (x, y) { var lsw = (x & 0xFFFF) + (y & 0xFFFF) var msw = (x >> 16) + (y >> 16) + (lsw >> 16) return (msw << 16) | (lsw & 0xFFFF) @@ -142,10 +46,106 @@ function safe_add (x, y) { /* * Bitwise rotate a 32-bit number to the left. */ -function bit_rol (num, cnt) { +function bitRol (num, cnt) { return (num << cnt) | (num >>> (32 - cnt)) } +/* + * Calculate the MD5 of an array of little-endian words, and a bit length + */ +function coreMd5 (x, len) { + /* append padding */ + x[len >> 5] |= 0x80 << ((len) % 32) + x[(((len + 64) >>> 9) << 4) + 14] = len + + var a = 1732584193 + var b = -271733879 + var c = -1732584194 + var d = 271733878 + + for (var i = 0; i < x.length; i += 16) { + var olda = a + var oldb = b + var oldc = c + var oldd = d + + a = md5ff(a, b, c, d, x[i + 0], 7, -680876936) + d = md5ff(d, a, b, c, x[i + 1], 12, -389564586) + c = md5ff(c, d, a, b, x[i + 2], 17, 606105819) + b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330) + a = md5ff(a, b, c, d, x[i + 4], 7, -176418897) + d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426) + c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341) + b = md5ff(b, c, d, a, x[i + 7], 22, -45705983) + a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416) + d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417) + c = md5ff(c, d, a, b, x[i + 10], 17, -42063) + b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162) + a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682) + d = md5ff(d, a, b, c, x[i + 13], 12, -40341101) + c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290) + b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329) + + a = md5gg(a, b, c, d, x[i + 1], 5, -165796510) + d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632) + c = md5gg(c, d, a, b, x[i + 11], 14, 643717713) + b = md5gg(b, c, d, a, x[i + 0], 20, -373897302) + a = md5gg(a, b, c, d, x[i + 5], 5, -701558691) + d = md5gg(d, a, b, c, x[i + 10], 9, 38016083) + c = md5gg(c, d, a, b, x[i + 15], 14, -660478335) + b = md5gg(b, c, d, a, x[i + 4], 20, -405537848) + a = md5gg(a, b, c, d, x[i + 9], 5, 568446438) + d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690) + c = md5gg(c, d, a, b, x[i + 3], 14, -187363961) + b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501) + a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467) + d = md5gg(d, a, b, c, x[i + 2], 9, -51403784) + c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473) + b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734) + + a = md5hh(a, b, c, d, x[i + 5], 4, -378558) + d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463) + c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562) + b = md5hh(b, c, d, a, x[i + 14], 23, -35309556) + a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060) + d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353) + c = md5hh(c, d, a, b, x[i + 7], 16, -155497632) + b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640) + a = md5hh(a, b, c, d, x[i + 13], 4, 681279174) + d = md5hh(d, a, b, c, x[i + 0], 11, -358537222) + c = md5hh(c, d, a, b, x[i + 3], 16, -722521979) + b = md5hh(b, c, d, a, x[i + 6], 23, 76029189) + a = md5hh(a, b, c, d, x[i + 9], 4, -640364487) + d = md5hh(d, a, b, c, x[i + 12], 11, -421815835) + c = md5hh(c, d, a, b, x[i + 15], 16, 530742520) + b = md5hh(b, c, d, a, x[i + 2], 23, -995338651) + + a = md5ii(a, b, c, d, x[i + 0], 6, -198630844) + d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415) + c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905) + b = md5ii(b, c, d, a, x[i + 5], 21, -57434055) + a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571) + d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606) + c = md5ii(c, d, a, b, x[i + 10], 15, -1051523) + b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799) + a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359) + d = md5ii(d, a, b, c, x[i + 15], 10, -30611744) + c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380) + b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649) + a = md5ii(a, b, c, d, x[i + 4], 6, -145523070) + d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379) + c = md5ii(c, d, a, b, x[i + 2], 15, 718787259) + b = md5ii(b, c, d, a, x[i + 9], 21, -343485551) + + a = safeAdd(a, olda) + b = safeAdd(b, oldb) + c = safeAdd(c, oldc) + d = safeAdd(d, oldd) + } + + return [a, b, c, d] +} + module.exports = function md5 (buf) { - return makeHash(buf, core_md5) + return makeHash(buf, coreMd5) } diff --git a/package.json b/package.json index a6c109d..3143468 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "hash-test-vectors": "^1.3.2", "standard": "^10.0.2", "tap-spec": "^2.1.2", - "tape": "^3.0.3" + "tape": "^4.6.3" }, "dependencies": { "cipher-base": "^1.0.1", From f612e3329865d23fbfb20cd2a873f08432c1c9aa Mon Sep 17 00:00:00 2001 From: Daniel Cousens Date: Wed, 24 May 2017 17:17:38 +1000 Subject: [PATCH 7/7] rm safe-buffer dependency, use md5.js and latest ripemd160 --- browser.js | 29 +--------- make-hash.js | 32 ----------- md5.js | 151 --------------------------------------------------- package.json | 5 +- 4 files changed, 6 insertions(+), 211 deletions(-) delete mode 100644 make-hash.js delete mode 100644 md5.js diff --git a/browser.js b/browser.js index e380f3b..01841bb 100644 --- a/browser.js +++ b/browser.js @@ -1,33 +1,10 @@ 'use strict' -var Buffer = require('safe-buffer').Buffer var inherits = require('inherits') -var md5 = require('./md5') +var MD5 = require('md5.js') var RIPEMD160 = require('ripemd160') var sha = require('sha.js') - var Base = require('cipher-base') -function HashNoConstructor (hash) { - Base.call(this, 'digest') - - this._hash = hash - this.buffers = [] -} - -inherits(HashNoConstructor, Base) - -HashNoConstructor.prototype._update = function (data) { - this.buffers.push(data) -} - -HashNoConstructor.prototype._final = function () { - var buf = Buffer.concat(this.buffers) - var r = this._hash(buf) - this.buffers = null - - return r -} - function Hash (hash) { Base.call(this, 'digest') @@ -46,8 +23,8 @@ Hash.prototype._final = function () { module.exports = function createHash (alg) { alg = alg.toLowerCase() - if (alg === 'md5') return new HashNoConstructor(md5) - if (alg === 'rmd160' || alg === 'ripemd160') return new Hash(new RIPEMD160()) + if (alg === 'md5') return new MD5() + if (alg === 'rmd160' || alg === 'ripemd160') return new RIPEMD160() return new Hash(sha(alg)) } diff --git a/make-hash.js b/make-hash.js deleted file mode 100644 index f6b5df1..0000000 --- a/make-hash.js +++ /dev/null @@ -1,32 +0,0 @@ -'use strict' -var INT32_SIZE = 4 -var CHAR64_SIZE = 8 -var HASH128_SIZE = 16 - -var Buffer = require('safe-buffer').Buffer -var zeroBuffer = Buffer.alloc(INT32_SIZE, 0) - -function asUInt32Array (buf) { - if ((buf.length % INT32_SIZE) !== 0) { - var len = buf.length + (INT32_SIZE - (buf.length % INT32_SIZE)) - buf = Buffer.concat([buf, zeroBuffer], len) - } - - var arr = new Array(buf.length >>> 2) - for (var i = 0, j = 0; i < buf.length; i += INT32_SIZE, j++) { - arr[j] = buf.readInt32LE(i) - } - - return arr -} - -module.exports = function hash (buf, fn) { - var arr = fn(asUInt32Array(buf), buf.length * CHAR64_SIZE) - buf = new Buffer(HASH128_SIZE) - - for (var i = 0; i < arr.length; i++) { - buf.writeInt32LE(arr[i], i << 2, true) - } - - return buf -} diff --git a/md5.js b/md5.js deleted file mode 100644 index 3d213c7..0000000 --- a/md5.js +++ /dev/null @@ -1,151 +0,0 @@ -'use strict' -/* - * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message - * Digest Algorithm, as defined in RFC 1321. - * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002. - * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet - * Distributed under the BSD License - * See http://pajhome.org.uk/crypt/md5 for more info. - */ - -var makeHash = require('./make-hash') - -/* - * These functions implement the four basic operations the algorithm uses. - */ -function md5cmn (q, a, b, x, s, t) { - return safeAdd(bitRol(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b) -} - -function md5ff (a, b, c, d, x, s, t) { - return md5cmn((b & c) | ((~b) & d), a, b, x, s, t) -} - -function md5gg (a, b, c, d, x, s, t) { - return md5cmn((b & d) | (c & (~d)), a, b, x, s, t) -} - -function md5hh (a, b, c, d, x, s, t) { - return md5cmn(b ^ c ^ d, a, b, x, s, t) -} - -function md5ii (a, b, c, d, x, s, t) { - return md5cmn(c ^ (b | (~d)), a, b, x, s, t) -} - -/* - * Add integers, wrapping at 2^32. This uses 16-bit operations internally - * to work around bugs in some JS interpreters. - */ -function safeAdd (x, y) { - var lsw = (x & 0xFFFF) + (y & 0xFFFF) - var msw = (x >> 16) + (y >> 16) + (lsw >> 16) - return (msw << 16) | (lsw & 0xFFFF) -} - -/* - * Bitwise rotate a 32-bit number to the left. - */ -function bitRol (num, cnt) { - return (num << cnt) | (num >>> (32 - cnt)) -} - -/* - * Calculate the MD5 of an array of little-endian words, and a bit length - */ -function coreMd5 (x, len) { - /* append padding */ - x[len >> 5] |= 0x80 << ((len) % 32) - x[(((len + 64) >>> 9) << 4) + 14] = len - - var a = 1732584193 - var b = -271733879 - var c = -1732584194 - var d = 271733878 - - for (var i = 0; i < x.length; i += 16) { - var olda = a - var oldb = b - var oldc = c - var oldd = d - - a = md5ff(a, b, c, d, x[i + 0], 7, -680876936) - d = md5ff(d, a, b, c, x[i + 1], 12, -389564586) - c = md5ff(c, d, a, b, x[i + 2], 17, 606105819) - b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330) - a = md5ff(a, b, c, d, x[i + 4], 7, -176418897) - d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426) - c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341) - b = md5ff(b, c, d, a, x[i + 7], 22, -45705983) - a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416) - d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417) - c = md5ff(c, d, a, b, x[i + 10], 17, -42063) - b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162) - a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682) - d = md5ff(d, a, b, c, x[i + 13], 12, -40341101) - c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290) - b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329) - - a = md5gg(a, b, c, d, x[i + 1], 5, -165796510) - d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632) - c = md5gg(c, d, a, b, x[i + 11], 14, 643717713) - b = md5gg(b, c, d, a, x[i + 0], 20, -373897302) - a = md5gg(a, b, c, d, x[i + 5], 5, -701558691) - d = md5gg(d, a, b, c, x[i + 10], 9, 38016083) - c = md5gg(c, d, a, b, x[i + 15], 14, -660478335) - b = md5gg(b, c, d, a, x[i + 4], 20, -405537848) - a = md5gg(a, b, c, d, x[i + 9], 5, 568446438) - d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690) - c = md5gg(c, d, a, b, x[i + 3], 14, -187363961) - b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501) - a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467) - d = md5gg(d, a, b, c, x[i + 2], 9, -51403784) - c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473) - b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734) - - a = md5hh(a, b, c, d, x[i + 5], 4, -378558) - d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463) - c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562) - b = md5hh(b, c, d, a, x[i + 14], 23, -35309556) - a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060) - d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353) - c = md5hh(c, d, a, b, x[i + 7], 16, -155497632) - b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640) - a = md5hh(a, b, c, d, x[i + 13], 4, 681279174) - d = md5hh(d, a, b, c, x[i + 0], 11, -358537222) - c = md5hh(c, d, a, b, x[i + 3], 16, -722521979) - b = md5hh(b, c, d, a, x[i + 6], 23, 76029189) - a = md5hh(a, b, c, d, x[i + 9], 4, -640364487) - d = md5hh(d, a, b, c, x[i + 12], 11, -421815835) - c = md5hh(c, d, a, b, x[i + 15], 16, 530742520) - b = md5hh(b, c, d, a, x[i + 2], 23, -995338651) - - a = md5ii(a, b, c, d, x[i + 0], 6, -198630844) - d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415) - c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905) - b = md5ii(b, c, d, a, x[i + 5], 21, -57434055) - a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571) - d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606) - c = md5ii(c, d, a, b, x[i + 10], 15, -1051523) - b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799) - a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359) - d = md5ii(d, a, b, c, x[i + 15], 10, -30611744) - c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380) - b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649) - a = md5ii(a, b, c, d, x[i + 4], 6, -145523070) - d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379) - c = md5ii(c, d, a, b, x[i + 2], 15, 718787259) - b = md5ii(b, c, d, a, x[i + 9], 21, -343485551) - - a = safeAdd(a, olda) - b = safeAdd(b, oldb) - c = safeAdd(c, oldc) - d = safeAdd(d, oldd) - } - - return [a, b, c, d] -} - -module.exports = function md5 (buf) { - return makeHash(buf, coreMd5) -} diff --git a/package.json b/package.json index 3143468..a87ad22 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "homepage": "https://github.com/crypto-browserify/createHash", "devDependencies": { "hash-test-vectors": "^1.3.2", + "safe-buffer": "^5.0.1", "standard": "^10.0.2", "tap-spec": "^2.1.2", "tape": "^4.6.3" @@ -31,8 +32,8 @@ "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", "sha.js": "^2.4.0" } }