Import: Handle uploads with sha1 starting with 0 properly
[mediawiki.git] / resources / lib / phpjs-sha1 / sha1.js
blob93c533d7f8281febbe10cb29e330d0f5c08696d5
1 function sha1(str) {
2   //  discuss at: http://phpjs.org/functions/sha1/
3   // original by: Webtoolkit.info (http://www.webtoolkit.info/)
4   // improved by: Michael White (http://getsprink.com)
5   // improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
6   //    input by: Brett Zamir (http://brett-zamir.me)
7   //   example 1: sha1('Kevin van Zonneveld');
8   //   returns 1: '54916d2e62f65b3afa6e192e6a601cdbe5cb5897'
10   var rotate_left = function (n, s) {
11     var t4 = (n << s) | (n >>> (32 - s));
12     return t4;
13   };
15   /*var lsb_hex = function (val) {
16    // Not in use; needed?
17     var str="";
18     var i;
19     var vh;
20     var vl;
22     for ( i=0; i<=6; i+=2 ) {
23       vh = (val>>>(i*4+4))&0x0f;
24       vl = (val>>>(i*4))&0x0f;
25       str += vh.toString(16) + vl.toString(16);
26     }
27     return str;
28   };*/
30   var cvt_hex = function (val) {
31     var str = '';
32     var i;
33     var v;
35     for (i = 7; i >= 0; i--) {
36       v = (val >>> (i * 4)) & 0x0f;
37       str += v.toString(16);
38     }
39     return str;
40   };
42   var blockstart;
43   var i, j;
44   var W = new Array(80);
45   var H0 = 0x67452301;
46   var H1 = 0xEFCDAB89;
47   var H2 = 0x98BADCFE;
48   var H3 = 0x10325476;
49   var H4 = 0xC3D2E1F0;
50   var A, B, C, D, E;
51   var temp;
53   // utf8_encode
54   str = unescape(encodeURIComponent(str));
55   var str_len = str.length;
57   var word_array = [];
58   for (i = 0; i < str_len - 3; i += 4) {
59     j = str.charCodeAt(i) << 24 | str.charCodeAt(i + 1) << 16 | str.charCodeAt(i + 2) << 8 | str.charCodeAt(i + 3);
60     word_array.push(j);
61   }
63   switch (str_len % 4) {
64   case 0:
65     i = 0x080000000;
66     break;
67   case 1:
68     i = str.charCodeAt(str_len - 1) << 24 | 0x0800000;
69     break;
70   case 2:
71     i = str.charCodeAt(str_len - 2) << 24 | str.charCodeAt(str_len - 1) << 16 | 0x08000;
72     break;
73   case 3:
74     i = str.charCodeAt(str_len - 3) << 24 | str.charCodeAt(str_len - 2) << 16 | str.charCodeAt(str_len - 1) <<
75       8 | 0x80;
76     break;
77   }
79   word_array.push(i);
81   while ((word_array.length % 16) != 14) {
82     word_array.push(0);
83   }
85   word_array.push(str_len >>> 29);
86   word_array.push((str_len << 3) & 0x0ffffffff);
88   for (blockstart = 0; blockstart < word_array.length; blockstart += 16) {
89     for (i = 0; i < 16; i++) {
90       W[i] = word_array[blockstart + i];
91     }
92     for (i = 16; i <= 79; i++) {
93       W[i] = rotate_left(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1);
94     }
96     A = H0;
97     B = H1;
98     C = H2;
99     D = H3;
100     E = H4;
102     for (i = 0; i <= 19; i++) {
103       temp = (rotate_left(A, 5) + ((B & C) | (~B & D)) + E + W[i] + 0x5A827999) & 0x0ffffffff;
104       E = D;
105       D = C;
106       C = rotate_left(B, 30);
107       B = A;
108       A = temp;
109     }
111     for (i = 20; i <= 39; i++) {
112       temp = (rotate_left(A, 5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff;
113       E = D;
114       D = C;
115       C = rotate_left(B, 30);
116       B = A;
117       A = temp;
118     }
120     for (i = 40; i <= 59; i++) {
121       temp = (rotate_left(A, 5) + ((B & C) | (B & D) | (C & D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff;
122       E = D;
123       D = C;
124       C = rotate_left(B, 30);
125       B = A;
126       A = temp;
127     }
129     for (i = 60; i <= 79; i++) {
130       temp = (rotate_left(A, 5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff;
131       E = D;
132       D = C;
133       C = rotate_left(B, 30);
134       B = A;
135       A = temp;
136     }
138     H0 = (H0 + A) & 0x0ffffffff;
139     H1 = (H1 + B) & 0x0ffffffff;
140     H2 = (H2 + C) & 0x0ffffffff;
141     H3 = (H3 + D) & 0x0ffffffff;
142     H4 = (H4 + E) & 0x0ffffffff;
143   }
145   temp = cvt_hex(H0) + cvt_hex(H1) + cvt_hex(H2) + cvt_hex(H3) + cvt_hex(H4);
146   return temp.toLowerCase();