-
Notifications
You must be signed in to change notification settings - Fork 578
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
59e245e
commit 5b5ae3e
Showing
8 changed files
with
471 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
|
||
var Buffer = require('buffer').Buffer; | ||
var sha = require('./sha'); | ||
var sha256 = require('./sha256'); | ||
var md5 = require('./md5'); | ||
|
||
var algorithms = { | ||
sha1: sha, | ||
sha256: sha256, | ||
md5: md5 | ||
}; | ||
|
||
var blocksize = 64; | ||
var zeroBuffer = new Buffer(blocksize); | ||
zeroBuffer.fill(0); | ||
|
||
function hmac(fn, key, data) { | ||
if(!Buffer.isBuffer(key)) key = new Buffer(key); | ||
if(!Buffer.isBuffer(data)) data = new Buffer(data); | ||
|
||
if(key.length > blocksize) { | ||
key = fn(key) | ||
} else if(key.length < blocksize) { | ||
key = Buffer.concat([key, zeroBuffer], blocksize) | ||
} | ||
|
||
var ipad = new Buffer(blocksize), opad = new Buffer(blocksize); | ||
for(var i = 0; i < blocksize; i++) { | ||
ipad[i] = key[i] ^ 0x36 | ||
opad[i] = key[i] ^ 0x5C | ||
} | ||
|
||
var hash = fn(Buffer.concat([ipad, data])) | ||
return fn(Buffer.concat([opad, hash])) | ||
} | ||
|
||
function hash(alg, key) { | ||
alg = alg || 'sha1'; | ||
var fn = algorithms[alg]; | ||
var bufs = []; | ||
var length = 0; | ||
if(!fn) error('algorithm:', alg, 'is not yet supported'); | ||
return { | ||
update: function (data) { | ||
if(!Buffer.isBuffer(data)) data = new Buffer(data); | ||
|
||
bufs.push(data); | ||
length += data.length; | ||
return this | ||
}, | ||
digest: function (enc) { | ||
var buf = Buffer.concat(bufs); | ||
var r = key ? hmac(fn, key, buf) : fn(buf); | ||
bufs = null; | ||
return enc ? r.toString(enc) : r | ||
} | ||
} | ||
} | ||
|
||
function error () { | ||
var m = [].slice.call(arguments).join(' ') | ||
throw new Error([ | ||
m, | ||
'we accept pull requests', | ||
'http://github.com/dominictarr/crypto-browserify' | ||
].join('\n')) | ||
} | ||
|
||
exports.createHash = function (alg) { return hash(alg) }; | ||
exports.createHmac = function (alg, key) { return hash(alg, key) }; | ||
|
||
function each(a, f) { | ||
for(var i in a) | ||
f(a[i], i) | ||
} | ||
|
||
// the least I can do is make error messages for the rest of the node.js/crypto api. | ||
each(['createCredentials' | ||
, 'createCipher' | ||
, 'createCipheriv' | ||
, 'createDecipher' | ||
, 'createDecipheriv' | ||
, 'createSign' | ||
, 'createVerify' | ||
, 'createDiffieHellman' | ||
, 'pbkdf2'], function (name) { | ||
exports[name] = function () { | ||
error('sorry,', name, 'is not implemented yet') | ||
} | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
var Buffer = require('buffer').Buffer; | ||
var intSize = 4; | ||
var zeroBuffer = new Buffer(intSize); zeroBuffer.fill(0); | ||
var chrsz = 8; | ||
|
||
function toArray(buf, bigEndian) { | ||
if ((buf.length % intSize) !== 0) { | ||
var len = buf.length + (intSize - (buf.length % intSize)); | ||
buf = Buffer.concat([buf, zeroBuffer], len); | ||
} | ||
|
||
var arr = []; | ||
var fn = bigEndian ? buf.readInt32BE : buf.readInt32LE; | ||
for (var i = 0; i < buf.length; i += intSize) { | ||
arr.push(fn.call(buf, i)); | ||
} | ||
return arr; | ||
} | ||
|
||
function toBuffer(arr, size, bigEndian) { | ||
var buf = new Buffer(size); | ||
var fn = bigEndian ? buf.writeInt32BE : buf.writeInt32LE; | ||
for (var i = 0; i < arr.length; i++) { | ||
fn.call(buf, arr[i], i * 4, true); | ||
} | ||
return buf; | ||
} | ||
|
||
function hash(buf, fn, hashSize, bigEndian) { | ||
if (!Buffer.isBuffer(buf)) buf = new Buffer(buf); | ||
var arr = fn(toArray(buf, bigEndian), buf.length * chrsz); | ||
return toBuffer(arr, hashSize, bigEndian); | ||
} | ||
|
||
module.exports = { hash: hash }; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,163 @@ | ||
/* | ||
* 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 helpers = require('./helpers'); | ||
|
||
/* | ||
* Perform a simple self-test to see if the VM is working | ||
*/ | ||
function md5_vm_test() | ||
{ | ||
return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72"; | ||
} | ||
|
||
/* | ||
* 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 Array(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 md5_ff(a, b, c, d, x, s, t) | ||
{ | ||
return md5_cmn((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 md5_hh(a, b, c, d, x, s, t) | ||
{ | ||
return md5_cmn(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); | ||
} | ||
|
||
/* | ||
* 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) | ||
{ | ||
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 bit_rol(num, cnt) | ||
{ | ||
return (num << cnt) | (num >>> (32 - cnt)); | ||
} | ||
|
||
module.exports = function md5(buf) { | ||
return helpers.hash(buf, core_md5, 16); | ||
}; |
Oops, something went wrong.