includes/clientside/static/sha256.js
changeset 436 242353360e37
equal deleted inserted replaced
435:a434d60e525d 436:242353360e37
       
     1 /* A JavaScript implementation of the Secure Hash Algorithm, SHA-256
       
     2  * Version 0.3 Copyright Angel Marin 2003-2004 - http://anmar.eu.org/
       
     3  * Distributed under the BSD License
       
     4  * Some bits taken from Paul Johnston's SHA-1 implementation
       
     5  */
       
     6 /*
       
     7 Copyright (c) 2003-2004, Angel Marin
       
     8 All rights reserved.
       
     9 
       
    10 Redistribution and use in source and binary forms, with or without modification,
       
    11 are permitted provided that the following conditions are met:
       
    12 
       
    13  * Redistributions of source code must retain the above copyright notice, this
       
    14    list of conditions and the following disclaimer.
       
    15  * Redistributions in binary form must reproduce the above copyright notice,
       
    16    this list of conditions and the following disclaimer in the documentation
       
    17    and/or other materials provided with the distribution.
       
    18  * Neither the name of the <ORGANIZATION> nor the names of its contributors may
       
    19    be used to endorse or promote products derived from this software without
       
    20    specific prior written permission.
       
    21 
       
    22 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
       
    23 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
       
    24 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
       
    25 IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
       
    26 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
       
    27 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
    28 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
       
    29 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
       
    30 OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
       
    31 OF THE POSSIBILITY OF SUCH DAMAGE.
       
    32 */
       
    33 var chrsz = 8;  /* bits per input character. 8 - ASCII; 16 - Unicode  */
       
    34 function safe_add (x, y) {
       
    35   var lsw = (x & 0xFFFF) + (y & 0xFFFF);
       
    36   var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
       
    37   return (msw << 16) | (lsw & 0xFFFF);
       
    38 }
       
    39 function S (X, n) {return ( X >>> n ) | (X << (32 - n));}
       
    40 function R (X, n) {return ( X >>> n );}
       
    41 function Ch(x, y, z) {return ((x & y) ^ ((~x) & z));}
       
    42 function Maj(x, y, z) {return ((x & y) ^ (x & z) ^ (y & z));}
       
    43 function Sigma0256(x) {return (S(x, 2) ^ S(x, 13) ^ S(x, 22));}
       
    44 function Sigma1256(x) {return (S(x, 6) ^ S(x, 11) ^ S(x, 25));}
       
    45 function Gamma0256(x) {return (S(x, 7) ^ S(x, 18) ^ R(x, 3));}
       
    46 function Gamma1256(x) {return (S(x, 17) ^ S(x, 19) ^ R(x, 10));}
       
    47 function core_sha256 (m, l) {
       
    48     var K = new Array(0x428A2F98,0x71374491,0xB5C0FBCF,0xE9B5DBA5,0x3956C25B,0x59F111F1,0x923F82A4,0xAB1C5ED5,0xD807AA98,0x12835B01,0x243185BE,0x550C7DC3,0x72BE5D74,0x80DEB1FE,0x9BDC06A7,0xC19BF174,0xE49B69C1,0xEFBE4786,0xFC19DC6,0x240CA1CC,0x2DE92C6F,0x4A7484AA,0x5CB0A9DC,0x76F988DA,0x983E5152,0xA831C66D,0xB00327C8,0xBF597FC7,0xC6E00BF3,0xD5A79147,0x6CA6351,0x14292967,0x27B70A85,0x2E1B2138,0x4D2C6DFC,0x53380D13,0x650A7354,0x766A0ABB,0x81C2C92E,0x92722C85,0xA2BFE8A1,0xA81A664B,0xC24B8B70,0xC76C51A3,0xD192E819,0xD6990624,0xF40E3585,0x106AA070,0x19A4C116,0x1E376C08,0x2748774C,0x34B0BCB5,0x391C0CB3,0x4ED8AA4A,0x5B9CCA4F,0x682E6FF3,0x748F82EE,0x78A5636F,0x84C87814,0x8CC70208,0x90BEFFFA,0xA4506CEB,0xBEF9A3F7,0xC67178F2);
       
    49     var HASH = new Array(0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19);
       
    50     var W = new Array(64);
       
    51     var a, b, c, d, e, f, g, h, i, j;
       
    52     var T1, T2;
       
    53     /* append padding */
       
    54     m[l >> 5] |= 0x80 << (24 - l % 32);
       
    55     m[((l + 64 >> 9) << 4) + 15] = l;
       
    56     for ( var i = 0; i<m.length; i+=16 ) {
       
    57         a = HASH[0]; b = HASH[1]; c = HASH[2]; d = HASH[3]; e = HASH[4]; f = HASH[5]; g = HASH[6]; h = HASH[7];
       
    58         for ( var j = 0; j<64; j++) {
       
    59             if (j < 16) W[j] = m[j + i];
       
    60             else W[j] = safe_add(safe_add(safe_add(Gamma1256(W[j - 2]), W[j - 7]), Gamma0256(W[j - 15])), W[j - 16]);
       
    61             T1 = safe_add(safe_add(safe_add(safe_add(h, Sigma1256(e)), Ch(e, f, g)), K[j]), W[j]);
       
    62             T2 = safe_add(Sigma0256(a), Maj(a, b, c));
       
    63             h = g; g = f; f = e; e = safe_add(d, T1); d = c; c = b; b = a; a = safe_add(T1, T2);
       
    64         }
       
    65         HASH[0] = safe_add(a, HASH[0]); HASH[1] = safe_add(b, HASH[1]); HASH[2] = safe_add(c, HASH[2]); HASH[3] = safe_add(d, HASH[3]); HASH[4] = safe_add(e, HASH[4]); HASH[5] = safe_add(f, HASH[5]); HASH[6] = safe_add(g, HASH[6]); HASH[7] = safe_add(h, HASH[7]);
       
    66     }
       
    67     return HASH;
       
    68 }
       
    69 function str2binb (str) {
       
    70   var bin = Array();
       
    71   var mask = (1 << chrsz) - 1;
       
    72   for(var i = 0; i < str.length * chrsz; i += chrsz)
       
    73     bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i%32);
       
    74   return bin;
       
    75 }
       
    76 function binb2hex (binarray) {
       
    77   var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
       
    78   var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
       
    79   var str = "";
       
    80   for (var i = 0; i < binarray.length * 4; i++) {
       
    81     str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) + hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8  )) & 0xF);
       
    82   }
       
    83   return str;
       
    84 }
       
    85 function hex_sha256(s){return binb2hex(core_sha256(str2binb(s),s.length * chrsz));}