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

Sat, 03 Jan 2015 20:18:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sat, 03 Jan 2015 20:18:00 +0100
branch
TOR_BUG_3246
changeset 7
129ffea94266
permissions
-rw-r--r--

Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.

     1 /*
     2  * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
     3  * in FIPS PUB 180-1
     4  * Version 2.1a Copyright Paul Johnston 2000 - 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 details.
     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_sha1(s){return binb2hex(core_sha1(str2binb(s),s.length * chrsz));}
    23 function b64_sha1(s){return binb2b64(core_sha1(str2binb(s),s.length * chrsz));}
    24 function str_sha1(s){return binb2str(core_sha1(str2binb(s),s.length * chrsz));}
    25 function hex_hmac_sha1(key, data){ return binb2hex(core_hmac_sha1(key, data));}
    26 function b64_hmac_sha1(key, data){ return binb2b64(core_hmac_sha1(key, data));}
    27 function str_hmac_sha1(key, data){ return binb2str(core_hmac_sha1(key, data));}
    29 /*
    30  * Perform a simple self-test to see if the VM is working
    31  */
    32 function sha1_vm_test()
    33 {
    34   return hex_sha1("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d";
    35 }
    37 /*
    38  * Calculate the SHA-1 of an array of big-endian words, and a bit length
    39  */
    40 function core_sha1(x, len)
    41 {
    42   /* append padding */
    43   x[len >> 5] |= 0x80 << (24 - len % 32);
    44   x[((len + 64 >> 9) << 4) + 15] = len;
    46   var w = Array(80);
    47   var a =  1732584193;
    48   var b = -271733879;
    49   var c = -1732584194;
    50   var d =  271733878;
    51   var e = -1009589776;
    53   /* BEGIN LOOP */
    54   for(var i = 0; i < x.length; i += 16)
    55   {
    56     var olda = a;
    57     var oldb = b;
    58     var oldc = c;
    59     var oldd = d;
    60     var olde = e;
    62   /* BEGIN LOOP */
    63     for(var j = 0; j < 80; j++)
    64     {
    65       if(j < 16) w[j] = x[i + j];
    66       else w[j] = rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1);
    67       var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)),
    68                        safe_add(safe_add(e, w[j]), sha1_kt(j)));
    69       e = d;
    70       d = c;
    71       c = rol(b, 30);
    72       b = a;
    73       a = t;
    74     }
    75   /* END LOOP */
    77     a = safe_add(a, olda);
    78     b = safe_add(b, oldb);
    79     c = safe_add(c, oldc);
    80     d = safe_add(d, oldd);
    81     e = safe_add(e, olde);
    82   }
    83   /* END LOOP */
    84   return Array(a, b, c, d, e);
    86 }
    88 /*
    89  * Perform the appropriate triplet combination function for the current
    90  * iteration
    91  */
    92 function sha1_ft(t, b, c, d)
    93 {
    94   if(t < 20) return (b & c) | ((~b) & d);
    95   if(t < 40) return b ^ c ^ d;
    96   if(t < 60) return (b & c) | (b & d) | (c & d);
    97   return b ^ c ^ d;
    98 }
   100 /*
   101  * Determine the appropriate additive constant for the current iteration
   102  */
   103 function sha1_kt(t)
   104 {
   105   return (t < 20) ?  1518500249 : (t < 40) ?  1859775393 :
   106          (t < 60) ? -1894007588 : -899497514;
   107 }
   109 /*
   110  * Calculate the HMAC-SHA1 of a key and some data
   111  */
   112 function core_hmac_sha1(key, data)
   113 {
   114   var bkey = str2binb(key);
   115   if(bkey.length > 16) bkey = core_sha1(bkey, key.length * chrsz);
   117   var ipad = Array(16), opad = Array(16);
   118   /* BEGIN LOOP */
   119   for(var i = 0; i < 16; i++)
   120   {
   121     ipad[i] = bkey[i] ^ 0x36363636;
   122     opad[i] = bkey[i] ^ 0x5C5C5C5C;
   123   }
   124   /* END LOOP */
   126   var hash = core_sha1(ipad.concat(str2binb(data)), 512 + data.length * chrsz);
   127   return core_sha1(opad.concat(hash), 512 + 160);
   128 }
   130 /*
   131  * Add integers, wrapping at 2^32. This uses 16-bit operations internally
   132  * to work around bugs in some JS interpreters.
   133  */
   134 function safe_add(x, y)
   135 {
   136   var lsw = (x & 0xFFFF) + (y & 0xFFFF);
   137   var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
   138   return (msw << 16) | (lsw & 0xFFFF);
   139 }
   141 /*
   142  * Bitwise rotate a 32-bit number to the left.
   143  */
   144 function rol(num, cnt)
   145 {
   146   return (num << cnt) | (num >>> (32 - cnt));
   147 }
   149 /*
   150  * Convert an 8-bit or 16-bit string to an array of big-endian words
   151  * In 8-bit function, characters >255 have their hi-byte silently ignored.
   152  */
   153 function str2binb(str)
   154 {
   155   var bin = Array();
   156   var mask = (1 << chrsz) - 1;
   157   /* BEGIN LOOP */
   158   for(var i = 0; i < str.length * chrsz; i += chrsz)
   159     bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (32 - chrsz - i%32);
   160   /* END LOOP */
   161   return bin;
   162 }
   164 /*
   165  * Convert an array of big-endian words to a string
   166  */
   167 function binb2str(bin)
   168 {
   169   var str = "";
   170   var mask = (1 << chrsz) - 1;
   171   /* BEGIN LOOP */
   172   for(var i = 0; i < bin.length * 32; i += chrsz)
   173     str += String.fromCharCode((bin[i>>5] >>> (32 - chrsz - i%32)) & mask);
   174   /* END LOOP */
   175   return str;
   176 }
   178 /*
   179  * Convert an array of big-endian words to a hex string.
   180  */
   181 function binb2hex(binarray)
   182 {
   183   var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
   184   var str = "";
   185   /* BEGIN LOOP */
   186   for(var i = 0; i < binarray.length * 4; i++)
   187   {
   188     str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) +
   189            hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8  )) & 0xF);
   190   }
   191   /* END LOOP */
   192   return str;
   193 }
   195 /*
   196  * Convert an array of big-endian words to a base-64 string
   197  */
   198 function binb2b64(binarray)
   199 {
   200   var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
   201   var str = "";
   202   /* BEGIN LOOP */
   203   for(var i = 0; i < binarray.length * 4; i += 3)
   204   {
   205     var triplet = (((binarray[i   >> 2] >> 8 * (3 -  i   %4)) & 0xFF) << 16)
   206                 | (((binarray[i+1 >> 2] >> 8 * (3 - (i+1)%4)) & 0xFF) << 8 )
   207                 |  ((binarray[i+2 >> 2] >> 8 * (3 - (i+2)%4)) & 0xFF);
   208   /* BEGIN LOOP */
   209     for(var j = 0; j < 4; j++)
   210     {
   211       if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
   212       else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
   213     }
   214   /* END LOOP */
   215   }
   216   /* END LOOP */
   217   return str;
   218 }
   221 var plainText = "Two households, both alike in dignity,\n\
   222 In fair Verona, where we lay our scene,\n\
   223 From ancient grudge break to new mutiny,\n\
   224 Where civil blood makes civil hands unclean.\n\
   225 From forth the fatal loins of these two foes\n\
   226 A pair of star-cross'd lovers take their life;\n\
   227 Whole misadventured piteous overthrows\n\
   228 Do with their death bury their parents' strife.\n\
   229 The fearful passage of their death-mark'd love,\n\
   230 And the continuance of their parents' rage,\n\
   231 Which, but their children's end, nought could remove,\n\
   232 Is now the two hours' traffic of our stage;\n\
   233 The which if you with patient ears attend,\n\
   234 What here shall miss, our toil shall strive to mend.";
   236   /* BEGIN LOOP */
   237 for (var i = 0; i <4; i++) {
   238     plainText += plainText;
   239 }
   240   /* END LOOP */
   242 var sha1Output = hex_sha1(plainText);

mercurial