summaryrefslogtreecommitdiff
path: root/frontend/delta/js/Clipperz/Crypto/SHA.js
Unidiff
Diffstat (limited to 'frontend/delta/js/Clipperz/Crypto/SHA.js') (more/less context) (ignore whitespace changes)
-rw-r--r--frontend/delta/js/Clipperz/Crypto/SHA.js296
1 files changed, 296 insertions, 0 deletions
diff --git a/frontend/delta/js/Clipperz/Crypto/SHA.js b/frontend/delta/js/Clipperz/Crypto/SHA.js
new file mode 100644
index 0000000..f8bfe6e
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/Crypto/SHA.js
@@ -0,0 +1,296 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
25 throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!";
26}
27
28if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; }
29if (typeof(Clipperz.Crypto.SHA) == 'undefined') { Clipperz.Crypto.SHA = {}; }
30
31Clipperz.Crypto.SHA.VERSION = "0.3";
32Clipperz.Crypto.SHA.NAME = "Clipperz.Crypto.SHA";
33
34MochiKit.Base.update(Clipperz.Crypto.SHA, {
35
36 '__repr__': function () {
37 return "[" + this.NAME + " " + this.VERSION + "]";
38 },
39
40 'toString': function () {
41 return this.__repr__();
42 },
43
44 //-----------------------------------------------------------------------------
45
46 'rotateRight': function(aValue, aNumberOfBits) {
47//Clipperz.Profile.start("Clipperz.Crypto.SHA.rotateRight");
48 var result;
49
50 result = (aValue >>> aNumberOfBits) | (aValue << (32 - aNumberOfBits));
51
52//Clipperz.Profile.stop("Clipperz.Crypto.SHA.rotateRight");
53 return result;
54 },
55
56 'shiftRight': function(aValue, aNumberOfBits) {
57//Clipperz.Profile.start("Clipperz.Crypto.SHA.shiftRight");
58 var result;
59
60 result = aValue >>> aNumberOfBits;
61
62//Clipperz.Profile.stop("Clipperz.Crypto.SHA.shiftRight");
63 return result;
64 },
65
66 //-----------------------------------------------------------------------------
67
68 'safeAdd': function() {
69//Clipperz.Profile.start("Clipperz.Crypto.SHA.safeAdd");
70 varresult;
71 vari, c;
72
73 result = arguments[0];
74 c = arguments.length;
75 for (i=1; i<c; i++) {
76 varlowerBytesSum;
77
78 lowerBytesSum = (result & 0xffff) + (arguments[i] & 0xffff);
79 result = (((result >> 16) + (arguments[i] >> 16) + (lowerBytesSum >> 16)) << 16) | (lowerBytesSum & 0xffff);
80 }
81
82//Clipperz.Profile.stop("Clipperz.Crypto.SHA.safeAdd");
83 return result;
84 },
85
86 //-----------------------------------------------------------------------------
87
88 'sha256_array': function(aValue) {
89//Clipperz.Profile.start("Clipperz.Crypto.SHA.sha256_array");
90 varresult;
91 varmessage;
92 var h0, h1, h2, h3, h4, h5, h6, h7;
93 vark;
94 varmessageLength;
95 varmessageLengthInBits;
96 var_i, _c;
97 var charBits;
98 var rotateRight;
99 var shiftRight;
100 var safeAdd;
101 varbytesPerBlock;
102 var currentMessageIndex;
103
104 bytesPerBlock = 512/8;
105 rotateRight = Clipperz.Crypto.SHA.rotateRight;
106 shiftRight = Clipperz.Crypto.SHA.shiftRight;
107 safeAdd = Clipperz.Crypto.SHA.safeAdd;
108
109 charBits = 8;
110
111 h0 = 0x6a09e667;
112 h1 = 0xbb67ae85;
113 h2 = 0x3c6ef372;
114 h3 = 0xa54ff53a;
115 h4 = 0x510e527f;
116 h5 = 0x9b05688c;
117 h6 = 0x1f83d9ab;
118 h7 = 0x5be0cd19;
119
120 k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
121 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
122 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
123 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
124 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
125 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
126 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
127 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2];
128
129 message = aValue;
130 messageLength = message.length;
131
132 //Pre-processing:
133 message.push(0x80); //append a single "1" bit to message
134
135 _c = (512 - (((messageLength + 1) * charBits) % 512) - 64) / charBits;
136 if (_c < 0) {
137 _c = _c + (512 / charBits);
138 }
139
140 for (_i=0; _i<_c; _i++) {
141 message.push(0x00); //append "0" bits until message length ≡ 448 ≡ -64 (mod 512)
142 }
143
144 messageLengthInBits = messageLength * charBits;
145 message.push(0x00); //the 4 most high byte are alway 0 as message length is represented with a 32bit value;
146 message.push(0x00);
147 message.push(0x00);
148 message.push(0x00);
149 message.push((messageLengthInBits >> 24)& 0xff);
150 message.push((messageLengthInBits >> 16)& 0xff);
151 message.push((messageLengthInBits >> 8) & 0xff);
152 message.push( messageLengthInBits & 0xff);
153
154 currentMessageIndex = 0;
155 while(currentMessageIndex < message.length) {
156 varw;
157 vara, b, c, d, e, f, g, h;
158
159 w = Array(64);
160
161 _c = 16;
162 for (_i=0; _i<_c; _i++) {
163 var _j;
164
165 _j = currentMessageIndex + _i*4;
166 w[_i] = (message[_j] << 24) | (message[_j + 1] << 16) | (message[_j + 2] << 8) | (message[_j + 3] << 0);
167 }
168
169 _c = 64;
170 for (_i=16; _i<_c; _i++) {
171 vars0, s1;
172
173 s0 = (rotateRight(w[_i-15], 7)) ^ (rotateRight(w[_i-15], 18)) ^ (shiftRight(w[_i-15], 3));
174 s1 = (rotateRight(w[_i-2], 17)) ^ (rotateRight(w[_i-2], 19)) ^ (shiftRight(w[_i-2], 10));
175 w[_i] = safeAdd(w[_i-16], s0, w[_i-7], s1);
176 }
177
178 a=h0; b=h1; c=h2; d=h3; e=h4; f=h5; g=h6; h=h7;
179
180 _c = 64;
181 for (_i=0; _i<_c; _i++) {
182 var s0, s1, ch, maj, t1, t2;
183
184 s0 = (rotateRight(a, 2)) ^ (rotateRight(a, 13)) ^ (rotateRight(a, 22));
185 maj = (a & b) ^ (a & c) ^ (b & c);
186 t2 = safeAdd(s0, maj);
187 s1 = (rotateRight(e, 6)) ^ (rotateRight(e, 11)) ^ (rotateRight(e, 25));
188 ch = (e & f) ^ ((~e) & g);
189 t1 = safeAdd(h, s1, ch, k[_i], w[_i]);
190
191 h = g;
192 g = f;
193 f = e;
194 e = safeAdd(d, t1);
195 d = c;
196 c = b;
197 b = a;
198 a = safeAdd(t1, t2);
199 }
200
201 h0 = safeAdd(h0, a);
202 h1 = safeAdd(h1, b);
203 h2 = safeAdd(h2, c);
204 h3 = safeAdd(h3, d);
205 h4 = safeAdd(h4, e);
206 h5 = safeAdd(h5, f);
207 h6 = safeAdd(h6, g);
208 h7 = safeAdd(h7, h);
209
210 currentMessageIndex += bytesPerBlock;
211 }
212
213 result = new Array(256/8);
214 result[0] = (h0 >> 24)& 0xff;
215 result[1] = (h0 >> 16)& 0xff;
216 result[2] = (h0 >> 8)& 0xff;
217 result[3] = h0 & 0xff;
218
219 result[4] = (h1 >> 24)& 0xff;
220 result[5] = (h1 >> 16)& 0xff;
221 result[6] = (h1 >> 8)& 0xff;
222 result[7] = h1 & 0xff;
223
224 result[8] = (h2 >> 24)& 0xff;
225 result[9] = (h2 >> 16)& 0xff;
226 result[10] = (h2 >> 8)& 0xff;
227 result[11] = h2 & 0xff;
228
229 result[12] = (h3 >> 24)& 0xff;
230 result[13] = (h3 >> 16)& 0xff;
231 result[14] = (h3 >> 8)& 0xff;
232 result[15] = h3 & 0xff;
233
234 result[16] = (h4 >> 24)& 0xff;
235 result[17] = (h4 >> 16)& 0xff;
236 result[18] = (h4 >> 8)& 0xff;
237 result[19] = h4 & 0xff;
238
239 result[20] = (h5 >> 24)& 0xff;
240 result[21] = (h5 >> 16)& 0xff;
241 result[22] = (h5 >> 8)& 0xff;
242 result[23] = h5 & 0xff;
243
244 result[24] = (h6 >> 24)& 0xff;
245 result[25] = (h6 >> 16)& 0xff;
246 result[26] = (h6 >> 8)& 0xff;
247 result[27] = h6 & 0xff;
248
249 result[28] = (h7 >> 24)& 0xff;
250 result[29] = (h7 >> 16)& 0xff;
251 result[30] = (h7 >> 8)& 0xff;
252 result[31] = h7 & 0xff;
253
254//Clipperz.Profile.stop("Clipperz.Crypto.SHA.sha256_array");
255 return result;
256 },
257
258 //-----------------------------------------------------------------------------
259
260 'sha256': function(aValue) {
261//Clipperz.Profile.start("Clipperz.Crypto.SHA.sha256");
262 var result;
263 var resultArray;
264 varvalueArray;
265
266 valueArray = aValue.arrayValues();
267 resultArray = Clipperz.Crypto.SHA.sha256_array(valueArray);
268
269 result = new Clipperz.ByteArray(resultArray);
270
271//Clipperz.Profile.stop("Clipperz.Crypto.SHA.sha256");
272 return result;
273 },
274
275 //-----------------------------------------------------------------------------
276
277 'sha_d256': function(aValue) {
278//Clipperz.Profile.start("Clipperz.Crypto.SHA.sha_d256");
279 var result;
280 var resultArray;
281 varvalueArray;
282
283 valueArray = aValue.arrayValues();
284 resultArray = Clipperz.Crypto.SHA.sha256_array(valueArray);
285 resultArray = Clipperz.Crypto.SHA.sha256_array(resultArray);
286
287 result = new Clipperz.ByteArray(resultArray);
288
289//Clipperz.Profile.stop("Clipperz.Crypto.SHA.sha256");
290 return result;
291 },
292
293 //-----------------------------------------------------------------------------
294 __syntaxFix__: "syntax fix"
295
296});