Wed, 31 Jul 2013 19:48:00 +0200
Introduce port to the Tizen OS.
1 /* A JavaScript implementation of RIPEMD-160, as specified at
2 *
3 * http://www.esat.kuleuven.ac.be/~cosicart/pdf/AB-9601/
4 *
5 * This is pretty much a straight translation of the pseudocode, which is
6 * shorter than the reference version which has loops unrolled, but is
7 * also somewhat slower.
8 *
9 * More information about RIPEMD-160 can be found at
10 *
11 * http://www.esat.kuleuven.ac.be/~bosselae/ripemd160.html
12 *
13 * Copyright (c) 2004, Jeremy Lin. Written 2004/02/29.
14 *
15 * You may use this code under the terms of the BSD-style jsotp license:
16 *
17 * http://www.ocf.berkeley.edu/~jjlin/jsotp/license.html
18 *
19 * The utility functions and general framework are borrowed from Paul Johnston's
20 * MD4/MD5/SHA-1 JavaScript implementations (http://pajhome.org.uk/crypt/md5), so
21 *
22 * Portions copyright (c) 1999-2002, Paul Johnston.
23 */
25 /*
26 * Configurable variables. You may need to tweak these to be compatible with
27 * the server-side, but the defaults work in most cases.
28 */
29 var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
30 var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */
31 var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */
33 /*
34 * These are the functions you'll usually want to call
35 * They take string arguments and return either hex or base-64 encoded strings
36 */
37 function hexrmd160(s){return binl2hex(corermd160(str2binl(s),s.length * chrsz));}
38 function b64rmd160(s){return binl2b64(corermd160(str2binl(s),s.length * chrsz));}
39 function strrmd160(s){return binl2str(corermd160(str2binl(s),s.length * chrsz));}
40 function hexhmacrmd160(key, data){ return binl2hex(corehmacrmd160(key, data));}
41 function b64hmacrmd160(key, data){ return binl2b64(corehmacrmd160(key, data));}
42 function strhmacrmd160(key, data){ return binl2str(corehmacrmd160(key, data));}
44 /*
45 * Perform a simple self-test to see if the VM is working
46 */
47 function rmd160vmtest()
48 {
49 return hexrmd160("abc") == "8eb208f7e05d987a9b044a8e98c6b087f15a0bfc";
50 }
52 /*
53 * Calculate the RMD-160 of an array of big-endian words, and a bit length
54 */
55 function corermd160(x, len)
56 {
57 /* append padding */
58 x[len >> 5] |= 0x80 << (len % 32);
59 x[(((len + 64) >>> 9) << 4) + 14] = len;
61 var h0 = 0x67452301;
62 var h1 = 0xefcdab89;
63 var h2 = 0x98badcfe;
64 var h3 = 0x10325476;
65 var h4 = 0xc3d2e1f0;
67 for (var i = 0; i < x.length; i += 16) {
68 var T;
69 var A1 = h0, B1 = h1, C1 = h2, D1 = h3, E1 = h4;
70 var A2 = h0, B2 = h1, C2 = h2, D2 = h3, E2 = h4;
71 for (var j = 0; j <= 79; ++j) {
72 T = safeadd(A1, rmd160f(j, B1, C1, D1));
73 T = safeadd(T, x[i + rmd160r1[j]]);
74 T = safeadd(T, rmd160K1(j));
75 T = safeadd(rol(T, rmd160s1[j]), E1);
76 A1 = E1; E1 = D1; D1 = rol(C1, 10); C1 = B1; B1 = T;
77 T = safeadd(A2, rmd160f(79-j, B2, C2, D2));
78 T = safeadd(T, x[i + rmd160r2[j]]);
79 T = safeadd(T, rmd160K2(j));
80 T = safeadd(rol(T, rmd160s2[j]), E2);
81 A2 = E2; E2 = D2; D2 = rol(C2, 10); C2 = B2; B2 = T;
82 }
83 T = safeadd(h1, safeadd(C1, D2));
84 h1 = safeadd(h2, safeadd(D1, E2));
85 h2 = safeadd(h3, safeadd(E1, A2));
86 h3 = safeadd(h4, safeadd(A1, B2));
87 h4 = safeadd(h0, safeadd(B1, C2));
88 h0 = T;
89 }
90 return [h0, h1, h2, h3, h4];
91 }
93 function rmd160f(j, x, y, z)
94 {
95 return ( 0 <= j && j <= 15) ? (x ^ y ^ z) :
96 (16 <= j && j <= 31) ? (x & y) | (~x & z) :
97 (32 <= j && j <= 47) ? (x | ~y) ^ z :
98 (48 <= j && j <= 63) ? (x & z) | (y & ~z) :
99 (64 <= j && j <= 79) ? x ^ (y | ~z) :
100 "rmd160f: j out of range";
101 }
103 function rmd160K1(j)
104 {
105 return ( 0 <= j && j <= 15) ? 0x00000000 :
106 (16 <= j && j <= 31) ? 0x5a827999 :
107 (32 <= j && j <= 47) ? 0x6ed9eba1 :
108 (48 <= j && j <= 63) ? 0x8f1bbcdc :
109 (64 <= j && j <= 79) ? 0xa953fd4e :
110 "rmd160K1: j out of range";
111 }
113 function rmd160K2(j)
114 {
115 return ( 0 <= j && j <= 15) ? 0x50a28be6 :
116 (16 <= j && j <= 31) ? 0x5c4dd124 :
117 (32 <= j && j <= 47) ? 0x6d703ef3 :
118 (48 <= j && j <= 63) ? 0x7a6d76e9 :
119 (64 <= j && j <= 79) ? 0x00000000 :
120 "rmd160K2: j out of range";
121 }
123 var rmd160r1 = [
124 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
125 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
126 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
127 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
128 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
129 ];
130 var rmd160r2 = [
131 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
132 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
133 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
134 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
135 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
136 ];
137 var rmd160s1 = [
138 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
139 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
140 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
141 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
142 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
143 ];
144 var rmd160s2 = [
145 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
146 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
147 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
148 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
149 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
150 ];
152 /*
153 * Calculate the HMAC-RMD160 of a key and some data
154 */
155 function corehmacrmd160(key, data)
156 {
157 var bkey = str2binl(key);
158 if(bkey.length > 16) bkey = corermd160(bkey, key.length * chrsz);
160 var ipad = Array(16), opad = Array(16);
161 for(var i = 0; i < 16; i++)
162 {
163 ipad[i] = bkey[i] ^ 0x36363636;
164 opad[i] = bkey[i] ^ 0x5C5C5C5C;
165 }
167 var hash = corermd160(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
168 return corermd160(opad.concat(hash), 512 + 160);
169 }
171 /*
172 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
173 * to work around bugs in some JS interpreters.
174 */
175 function safeadd(x, y)
176 {
177 var lsw = (x & 0xFFFF) + (y & 0xFFFF);
178 var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
179 return (msw << 16) | (lsw & 0xFFFF);
180 }
182 /*
183 * Bitwise rotate a 32-bit number to the left.
184 */
185 function rol(num, cnt)
186 {
187 return (num << cnt) | (num >>> (32 - cnt));
188 }
190 /*
191 * Convert a string to an array of little-endian words
192 * If chrsz is ASCII, characters >255 have their hi-byte silently ignored.
193 */
194 function str2binl(str)
195 {
196 var bin = Array();
197 var mask = (1 << chrsz) - 1;
198 for(var i = 0; i < str.length * chrsz; i += chrsz)
199 bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
200 return bin;
201 }
203 /*
204 * Convert an array of little-endian words to a string
205 */
206 function binl2str(bin)
207 {
208 var str = "";
209 var mask = (1 << chrsz) - 1;
210 for(var i = 0; i < bin.length * 32; i += chrsz)
211 str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);
212 return str;
213 }
215 /*
216 * Convert an array of little-endian words to a hex string.
217 */
218 function binl2hex(binarray)
219 {
220 var hextab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
221 var str = "";
222 for(var i = 0; i < binarray.length * 4; i++)
223 {
224 str += hextab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
225 hextab.charAt((binarray[i>>2] >> ((i%4)*8 )) & 0xF);
226 }
227 return str;
228 }
230 /*
231 * Convert an array of little-endian words to a base-64 string
232 */
233 function binl2b64(binarray)
234 {
235 var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
236 var str = "";
237 for(var i = 0; i < binarray.length * 4; i += 3)
238 {
239 var triplet = (((binarray[i >> 2] >> 8 * ( i %4)) & 0xFF) << 16)
240 | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )
241 | ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
242 for(var j = 0; j < 4; j++)
243 {
244 if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
245 else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
246 }
247 }
248 return str;
249 }