|
(function() { |
|
var base64map |
|
= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', |
|
|
|
crypt = { |
|
|
|
rotl: function(n, b) { |
|
return (n << b) | (n >>> (32 - b)); |
|
}, |
|
|
|
|
|
rotr: function(n, b) { |
|
return (n << (32 - b)) | (n >>> b); |
|
}, |
|
|
|
|
|
endian: function(n) { |
|
|
|
if (n.constructor == Number) { |
|
return crypt.rotl(n, 8) & 0x00FF00FF | crypt.rotl(n, 24) & 0xFF00FF00; |
|
} |
|
|
|
|
|
for (var i = 0; i < n.length; i++) |
|
n[i] = crypt.endian(n[i]); |
|
return n; |
|
}, |
|
|
|
|
|
randomBytes: function(n) { |
|
for (var bytes = []; n > 0; n--) |
|
bytes.push(Math.floor(Math.random() * 256)); |
|
return bytes; |
|
}, |
|
|
|
|
|
bytesToWords: function(bytes) { |
|
for (var words = [], i = 0, b = 0; i < bytes.length; i++, b += 8) |
|
words[b >>> 5] |= bytes[i] << (24 - b % 32); |
|
return words; |
|
}, |
|
|
|
|
|
wordsToBytes: function(words) { |
|
for (var bytes = [], b = 0; b < words.length * 32; b += 8) |
|
bytes.push((words[b >>> 5] >>> (24 - b % 32)) & 0xFF); |
|
return bytes; |
|
}, |
|
|
|
|
|
bytesToHex: function(bytes) { |
|
for (var hex = [], i = 0; i < bytes.length; i++) { |
|
hex.push((bytes[i] >>> 4).toString(16)); |
|
hex.push((bytes[i] & 0xF).toString(16)); |
|
} |
|
return hex.join(''); |
|
}, |
|
|
|
|
|
hexToBytes: function(hex) { |
|
for (var bytes = [], c = 0; c < hex.length; c += 2) |
|
bytes.push(parseInt(hex.substr(c, 2), 16)); |
|
return bytes; |
|
}, |
|
|
|
|
|
bytesToBase64: function(bytes) { |
|
for (var base64 = [], i = 0; i < bytes.length; i += 3) { |
|
var triplet = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2]; |
|
for (var j = 0; j < 4; j++) |
|
if (i * 8 + j * 6 <= bytes.length * 8) |
|
base64.push(base64map.charAt((triplet >>> 6 * (3 - j)) & 0x3F)); |
|
else |
|
base64.push('='); |
|
} |
|
return base64.join(''); |
|
}, |
|
|
|
|
|
base64ToBytes: function(base64) { |
|
|
|
base64 = base64.replace(/[^A-Z0-9+\/]/ig, ''); |
|
|
|
for (var bytes = [], i = 0, imod4 = 0; i < base64.length; |
|
imod4 = ++i % 4) { |
|
if (imod4 == 0) continue; |
|
bytes.push(((base64map.indexOf(base64.charAt(i - 1)) |
|
& (Math.pow(2, -2 * imod4 + 8) - 1)) << (imod4 * 2)) |
|
| (base64map.indexOf(base64.charAt(i)) >>> (6 - imod4 * 2))); |
|
} |
|
return bytes; |
|
} |
|
}; |
|
|
|
module.exports = crypt; |
|
})(); |
|
|