Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ultraviolet
GitHub Repository: ultraviolet/bitaddress.org
Path: blob/master/src/cryptojs.ripemd160.js
248 views
1
/*!
2
* Crypto-JS v2.0.0 RIPEMD-160
3
* http://code.google.com/p/crypto-js/
4
* Copyright (c) 2009, Jeff Mott. All rights reserved.
5
* http://code.google.com/p/crypto-js/wiki/License
6
*
7
* A JavaScript implementation of the RIPEMD-160 Algorithm
8
* Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.
9
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
10
* Distributed under the BSD License
11
* See http://pajhome.org.uk/crypt/md5 for details.
12
* Also http://www.ocf.berkeley.edu/~jjlin/jsotp/
13
* Ported to Crypto-JS by Stefan Thomas.
14
*/
15
16
(function () {
17
// Shortcuts
18
var C = Crypto,
19
util = C.util,
20
charenc = C.charenc,
21
UTF8 = charenc.UTF8,
22
Binary = charenc.Binary;
23
24
// Convert a byte array to little-endian 32-bit words
25
util.bytesToLWords = function (bytes) {
26
27
var output = Array(bytes.length >> 2);
28
for (var i = 0; i < output.length; i++)
29
output[i] = 0;
30
for (var i = 0; i < bytes.length * 8; i += 8)
31
output[i >> 5] |= (bytes[i / 8] & 0xFF) << (i % 32);
32
return output;
33
};
34
35
// Convert little-endian 32-bit words to a byte array
36
util.lWordsToBytes = function (words) {
37
var output = [];
38
for (var i = 0; i < words.length * 32; i += 8)
39
output.push((words[i >> 5] >>> (i % 32)) & 0xff);
40
return output;
41
};
42
43
// Public API
44
var RIPEMD160 = C.RIPEMD160 = function (message, options) {
45
var digestbytes = util.lWordsToBytes(RIPEMD160._rmd160(message));
46
return options && options.asBytes ? digestbytes :
47
options && options.asString ? Binary.bytesToString(digestbytes) :
48
util.bytesToHex(digestbytes);
49
};
50
51
// The core
52
RIPEMD160._rmd160 = function (message) {
53
// Convert to byte array
54
if (message.constructor == String) message = UTF8.stringToBytes(message);
55
56
var x = util.bytesToLWords(message),
57
len = message.length * 8;
58
59
/* append padding */
60
x[len >> 5] |= 0x80 << (len % 32);
61
x[(((len + 64) >>> 9) << 4) + 14] = len;
62
63
var h0 = 0x67452301;
64
var h1 = 0xefcdab89;
65
var h2 = 0x98badcfe;
66
var h3 = 0x10325476;
67
var h4 = 0xc3d2e1f0;
68
69
for (var i = 0; i < x.length; i += 16) {
70
var T;
71
var A1 = h0, B1 = h1, C1 = h2, D1 = h3, E1 = h4;
72
var A2 = h0, B2 = h1, C2 = h2, D2 = h3, E2 = h4;
73
for (var j = 0; j <= 79; ++j) {
74
T = safe_add(A1, rmd160_f(j, B1, C1, D1));
75
T = safe_add(T, x[i + rmd160_r1[j]]);
76
T = safe_add(T, rmd160_K1(j));
77
T = safe_add(bit_rol(T, rmd160_s1[j]), E1);
78
A1 = E1; E1 = D1; D1 = bit_rol(C1, 10); C1 = B1; B1 = T;
79
T = safe_add(A2, rmd160_f(79 - j, B2, C2, D2));
80
T = safe_add(T, x[i + rmd160_r2[j]]);
81
T = safe_add(T, rmd160_K2(j));
82
T = safe_add(bit_rol(T, rmd160_s2[j]), E2);
83
A2 = E2; E2 = D2; D2 = bit_rol(C2, 10); C2 = B2; B2 = T;
84
}
85
T = safe_add(h1, safe_add(C1, D2));
86
h1 = safe_add(h2, safe_add(D1, E2));
87
h2 = safe_add(h3, safe_add(E1, A2));
88
h3 = safe_add(h4, safe_add(A1, B2));
89
h4 = safe_add(h0, safe_add(B1, C2));
90
h0 = T;
91
}
92
return [h0, h1, h2, h3, h4];
93
}
94
95
function rmd160_f(j, x, y, z) {
96
return (0 <= j && j <= 15) ? (x ^ y ^ z) :
97
(16 <= j && j <= 31) ? (x & y) | (~x & z) :
98
(32 <= j && j <= 47) ? (x | ~y) ^ z :
99
(48 <= j && j <= 63) ? (x & z) | (y & ~z) :
100
(64 <= j && j <= 79) ? x ^ (y | ~z) :
101
"rmd160_f: j out of range";
102
}
103
function rmd160_K1(j) {
104
return (0 <= j && j <= 15) ? 0x00000000 :
105
(16 <= j && j <= 31) ? 0x5a827999 :
106
(32 <= j && j <= 47) ? 0x6ed9eba1 :
107
(48 <= j && j <= 63) ? 0x8f1bbcdc :
108
(64 <= j && j <= 79) ? 0xa953fd4e :
109
"rmd160_K1: j out of range";
110
}
111
function rmd160_K2(j) {
112
return (0 <= j && j <= 15) ? 0x50a28be6 :
113
(16 <= j && j <= 31) ? 0x5c4dd124 :
114
(32 <= j && j <= 47) ? 0x6d703ef3 :
115
(48 <= j && j <= 63) ? 0x7a6d76e9 :
116
(64 <= j && j <= 79) ? 0x00000000 :
117
"rmd160_K2: j out of range";
118
}
119
var rmd160_r1 = [
120
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
121
7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
122
3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
123
1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
124
4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
125
];
126
var rmd160_r2 = [
127
5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
128
6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
129
15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
130
8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
131
12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
132
];
133
var rmd160_s1 = [
134
11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
135
7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
136
11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
137
11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
138
9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
139
];
140
var rmd160_s2 = [
141
8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
142
9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
143
9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
144
15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
145
8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
146
];
147
148
/*
149
* Add integers, wrapping at 2^32. This uses 16-bit operations internally
150
* to work around bugs in some JS interpreters.
151
*/
152
function safe_add(x, y) {
153
var lsw = (x & 0xFFFF) + (y & 0xFFFF);
154
var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
155
return (msw << 16) | (lsw & 0xFFFF);
156
}
157
158
/*
159
* Bitwise rotate a 32-bit number to the left.
160
*/
161
function bit_rol(num, cnt) {
162
return (num << cnt) | (num >>> (32 - cnt));
163
}
164
})();
165