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