js/src/devtools/jint/sunspider/crypto-md5.js

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /*
     2  * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
     3  * Digest Algorithm, as defined in RFC 1321.
     4  * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
     5  * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
     6  * Distributed under the BSD License
     7  * See http://pajhome.org.uk/crypt/md5 for more info.
     8  */
    10 /*
    11  * Configurable variables. You may need to tweak these to be compatible with
    12  * the server-side, but the defaults work in most cases.
    13  */
    14 var hexcase = 0;  /* hex output format. 0 - lowercase; 1 - uppercase        */
    15 var b64pad  = ""; /* base-64 pad character. "=" for strict RFC compliance   */
    16 var chrsz   = 8;  /* bits per input character. 8 - ASCII; 16 - Unicode      */
    18 /*
    19  * These are the functions you'll usually want to call
    20  * They take string arguments and return either hex or base-64 encoded strings
    21  */
    22 function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}
    23 function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));}
    24 function str_md5(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));}
    25 function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); }
    26 function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); }
    27 function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); }
    29 /*
    30  * Perform a simple self-test to see if the VM is working
    31  */
    32 function md5_vm_test()
    33 {
    34   return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";
    35 }
    37 /*
    38  * Calculate the MD5 of an array of little-endian words, and a bit length
    39  */
    40 function core_md5(x, len)
    41 {
    42   /* append padding */
    43   x[len >> 5] |= 0x80 << ((len) % 32);
    44   x[(((len + 64) >>> 9) << 4) + 14] = len;
    46   var a =  1732584193;
    47   var b = -271733879;
    48   var c = -1732584194;
    49   var d =  271733878;
    51   /* BEGIN LOOP */
    52   for(var i = 0; i < x.length; i += 16)
    53   {
    54     var olda = a;
    55     var oldb = b;
    56     var oldc = c;
    57     var oldd = d;
    59     a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
    60     d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
    61     c = md5_ff(c, d, a, b, x[i+ 2], 17,  606105819);
    62     b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
    63     a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
    64     d = md5_ff(d, a, b, c, x[i+ 5], 12,  1200080426);
    65     c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
    66     b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
    67     a = md5_ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);
    68     d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
    69     c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
    70     b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
    71     a = md5_ff(a, b, c, d, x[i+12], 7 ,  1804603682);
    72     d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
    73     c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
    74     b = md5_ff(b, c, d, a, x[i+15], 22,  1236535329);
    76     a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
    77     d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
    78     c = md5_gg(c, d, a, b, x[i+11], 14,  643717713);
    79     b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
    80     a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
    81     d = md5_gg(d, a, b, c, x[i+10], 9 ,  38016083);
    82     c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
    83     b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
    84     a = md5_gg(a, b, c, d, x[i+ 9], 5 ,  568446438);
    85     d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
    86     c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
    87     b = md5_gg(b, c, d, a, x[i+ 8], 20,  1163531501);
    88     a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
    89     d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
    90     c = md5_gg(c, d, a, b, x[i+ 7], 14,  1735328473);
    91     b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
    93     a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
    94     d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
    95     c = md5_hh(c, d, a, b, x[i+11], 16,  1839030562);
    96     b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
    97     a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
    98     d = md5_hh(d, a, b, c, x[i+ 4], 11,  1272893353);
    99     c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
   100     b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
   101     a = md5_hh(a, b, c, d, x[i+13], 4 ,  681279174);
   102     d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
   103     c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
   104     b = md5_hh(b, c, d, a, x[i+ 6], 23,  76029189);
   105     a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
   106     d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
   107     c = md5_hh(c, d, a, b, x[i+15], 16,  530742520);
   108     b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
   110     a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
   111     d = md5_ii(d, a, b, c, x[i+ 7], 10,  1126891415);
   112     c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
   113     b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
   114     a = md5_ii(a, b, c, d, x[i+12], 6 ,  1700485571);
   115     d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
   116     c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
   117     b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
   118     a = md5_ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);
   119     d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
   120     c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
   121     b = md5_ii(b, c, d, a, x[i+13], 21,  1309151649);
   122     a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
   123     d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
   124     c = md5_ii(c, d, a, b, x[i+ 2], 15,  718787259);
   125     b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
   127     a = safe_add(a, olda);
   128     b = safe_add(b, oldb);
   129     c = safe_add(c, oldc);
   130     d = safe_add(d, oldd);
   131   }
   132   /* END LOOP */
   133   return Array(a, b, c, d);
   135 }
   137 /*
   138  * These functions implement the four basic operations the algorithm uses.
   139  */
   140 function md5_cmn(q, a, b, x, s, t)
   141 {
   142   return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
   143 }
   144 function md5_ff(a, b, c, d, x, s, t)
   145 {
   146   return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
   147 }
   148 function md5_gg(a, b, c, d, x, s, t)
   149 {
   150   return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
   151 }
   152 function md5_hh(a, b, c, d, x, s, t)
   153 {
   154   return md5_cmn(b ^ c ^ d, a, b, x, s, t);
   155 }
   156 function md5_ii(a, b, c, d, x, s, t)
   157 {
   158   return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
   159 }
   161 /*
   162  * Calculate the HMAC-MD5, of a key and some data
   163  */
   164 function core_hmac_md5(key, data)
   165 {
   166   var bkey = str2binl(key);
   167   if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz);
   169   var ipad = Array(16), opad = Array(16);
   170   /* BEGIN LOOP */
   171   for(var i = 0; i < 16; i++)
   172   {
   173     ipad[i] = bkey[i] ^ 0x36363636;
   174     opad[i] = bkey[i] ^ 0x5C5C5C5C;
   175   }
   176   /* END LOOP */
   178   var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
   179   return core_md5(opad.concat(hash), 512 + 128);
   180 }
   182 /*
   183  * Add integers, wrapping at 2^32. This uses 16-bit operations internally
   184  * to work around bugs in some JS interpreters.
   185  */
   186 function safe_add(x, y)
   187 {
   188   var lsw = (x & 0xFFFF) + (y & 0xFFFF);
   189   var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
   190   return (msw << 16) | (lsw & 0xFFFF);
   191 }
   193 /*
   194  * Bitwise rotate a 32-bit number to the left.
   195  */
   196 function bit_rol(num, cnt)
   197 {
   198   return (num << cnt) | (num >>> (32 - cnt));
   199 }
   201 /*
   202  * Convert a string to an array of little-endian words
   203  * If chrsz is ASCII, characters >255 have their hi-byte silently ignored.
   204  */
   205 function str2binl(str)
   206 {
   207   var bin = Array();
   208   var mask = (1 << chrsz) - 1;
   209   /* BEGIN LOOP */
   210   for(var i = 0; i < str.length * chrsz; i += chrsz)
   211     bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
   212   /* END LOOP */
   213   return bin;
   214 }
   216 /*
   217  * Convert an array of little-endian words to a string
   218  */
   219 function binl2str(bin)
   220 {
   221   var str = "";
   222   var mask = (1 << chrsz) - 1;
   223   /* BEGIN LOOP */
   224   for(var i = 0; i < bin.length * 32; i += chrsz)
   225     str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);
   226   /* END LOOP */
   227   return str;
   228 }
   230 /*
   231  * Convert an array of little-endian words to a hex string.
   232  */
   233 function binl2hex(binarray)
   234 {
   235   var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
   236   var str = "";
   237   /* BEGIN LOOP */
   238   for(var i = 0; i < binarray.length * 4; i++)
   239   {
   240     str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
   241            hex_tab.charAt((binarray[i>>2] >> ((i%4)*8  )) & 0xF);
   242   }
   243   /* END LOOP */
   244   return str;
   245 }
   247 /*
   248  * Convert an array of little-endian words to a base-64 string
   249  */
   250 function binl2b64(binarray)
   251 {
   252   var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
   253   var str = "";
   254   /* BEGIN LOOP */
   255   for(var i = 0; i < binarray.length * 4; i += 3)
   256   {
   257     var triplet = (((binarray[i   >> 2] >> 8 * ( i   %4)) & 0xFF) << 16)
   258                 | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )
   259                 |  ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
   260     /* BEGIN LOOP */
   261     for(var j = 0; j < 4; j++)
   262     {
   263       if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
   264       else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
   265     }
   266     /* END LOOP */
   267   }
   268   /* END LOOP */
   269   return str;
   270 }
   272 var plainText = "Rebellious subjects, enemies to peace,\n\
   273 Profaners of this neighbour-stained steel,--\n\
   274 Will they not hear? What, ho! you men, you beasts,\n\
   275 That quench the fire of your pernicious rage\n\
   276 With purple fountains issuing from your veins,\n\
   277 On pain of torture, from those bloody hands\n\
   278 Throw your mistemper'd weapons to the ground,\n\
   279 And hear the sentence of your moved prince.\n\
   280 Three civil brawls, bred of an airy word,\n\
   281 By thee, old Capulet, and Montague,\n\
   282 Have thrice disturb'd the quiet of our streets,\n\
   283 And made Verona's ancient citizens\n\
   284 Cast by their grave beseeming ornaments,\n\
   285 To wield old partisans, in hands as old,\n\
   286 Canker'd with peace, to part your canker'd hate:\n\
   287 If ever you disturb our streets again,\n\
   288 Your lives shall pay the forfeit of the peace.\n\
   289 For this time, all the rest depart away:\n\
   290 You Capulet; shall go along with me:\n\
   291 And, Montague, come you this afternoon,\n\
   292 To know our further pleasure in this case,\n\
   293 To old Free-town, our common judgment-place.\n\
   294 Once more, on pain of death, all men depart."
   296     /* BEGIN LOOP */
   297 for (var i = 0; i <4; i++) {
   298     plainText += plainText;
   299 }
   300     /* END LOOP */
   302 var md5Output = hex_md5(plainText);

mercurial