src/tizen/hashes/rmd160.js

Wed, 31 Jul 2013 19:48:00 +0200

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Jul 2013 19:48:00 +0200
changeset 14
d1b294812560
permissions
-rw-r--r--

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 }

mercurial