Diffstat (limited to 'frontend/beta/js/Clipperz/Crypto/AES.js') (more/less context) (ignore whitespace changes)
-rw-r--r-- | frontend/beta/js/Clipperz/Crypto/AES.js | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/frontend/beta/js/Clipperz/Crypto/AES.js b/frontend/beta/js/Clipperz/Crypto/AES.js index 7ddda3e..a5c63fb 100644 --- a/frontend/beta/js/Clipperz/Crypto/AES.js +++ b/frontend/beta/js/Clipperz/Crypto/AES.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.AES depends on Clipperz.ByteArray!"; | 25 | throw "Clipperz.Crypto.AES depends on Clipperz.ByteArray!"; |
28 | } | 26 | } |
29 | 27 | ||
30 | //Dependency commented to avoid a circular reference | 28 | //Dependency commented to avoid a circular reference |
31 | //try { if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { throw ""; }} catch (e) { | 29 | //try { if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { throw ""; }} catch (e) { |
32 | //throw "Clipperz.Crypto.AES depends on Clipperz.Crypto.PRNG!"; | 30 | //throw "Clipperz.Crypto.AES depends on Clipperz.Crypto.PRNG!"; |
33 | //} | 31 | //} |
34 | 32 | ||
35 | if (typeof(Clipperz.Crypto.AES) == 'undefined') { Clipperz.Crypto.AES = {}; } | 33 | if (typeof(Clipperz.Crypto.AES) == 'undefined') { Clipperz.Crypto.AES = {}; } |
36 | 34 | ||
37 | //############################################################################# | 35 | //############################################################################# |
38 | 36 | ||
39 | Clipperz.Crypto.AES.DeferredExecutionContext = function(args) { | 37 | Clipperz.Crypto.AES.DeferredExecutionContext = function(args) { |
40 | args = args || {}; | 38 | args = args || {}; |
41 | 39 | ||
42 | this._key = args.key; | 40 | this._key = args.key; |
43 | this._message = args.message; | 41 | this._message = args.message; |
44 | this._result = args.message.clone(); | 42 | this._result = args.message.clone(); |
45 | this._nonce = args.nonce; | 43 | this._nonce = args.nonce; |
46 | this._messageLength = this._message.length(); | 44 | this._messageLength = this._message.length(); |
47 | 45 | ||
48 | this._messageArray = this._message.arrayValues(); | 46 | this._messageArray = this._message.arrayValues(); |
49 | this._resultArray = this._result.arrayValues(); | 47 | this._resultArray = this._result.arrayValues(); |
50 | this._nonceArray = this._nonce.arrayValues(); | 48 | this._nonceArray = this._nonce.arrayValues(); |
51 | 49 | ||
52 | this._executionStep = 0; | 50 | this._executionStep = 0; |
53 | 51 | ||
54 | return this; | 52 | return this; |
55 | } | 53 | } |
56 | 54 | ||
57 | Clipperz.Crypto.AES.DeferredExecutionContext.prototype = MochiKit.Base.update(null, { | 55 | Clipperz.Crypto.AES.DeferredExecutionContext.prototype = MochiKit.Base.update(null, { |
58 | 56 | ||
59 | 'key': function() { | 57 | 'key': function() { |
60 | return this._key; | 58 | return this._key; |
61 | }, | 59 | }, |
62 | 60 | ||
63 | 'message': function() { | 61 | 'message': function() { |
64 | return this._message; | 62 | return this._message; |
65 | }, | 63 | }, |
66 | 64 | ||
67 | 'messageLength': function() { | 65 | 'messageLength': function() { |
68 | return this._messageLength; | 66 | return this._messageLength; |
69 | }, | 67 | }, |
70 | 68 | ||
71 | 'result': function() { | 69 | 'result': function() { |
72 | return new Clipperz.ByteArray(this.resultArray()); | 70 | return new Clipperz.ByteArray(this.resultArray()); |
73 | }, | 71 | }, |
74 | 72 | ||
75 | 'nonce': function() { | 73 | 'nonce': function() { |
76 | return this._nonce; | 74 | return this._nonce; |
77 | }, | 75 | }, |
78 | 76 | ||
79 | 'messageArray': function() { | 77 | 'messageArray': function() { |
80 | return this._messageArray; | 78 | return this._messageArray; |
81 | }, | 79 | }, |
82 | 80 | ||
83 | 'resultArray': function() { | 81 | 'resultArray': function() { |
84 | return this._resultArray; | 82 | return this._resultArray; |
85 | }, | 83 | }, |
86 | 84 | ||
87 | 'nonceArray': function() { | 85 | 'nonceArray': function() { |
88 | return this._nonceArray; | 86 | return this._nonceArray; |
89 | }, | 87 | }, |
90 | 88 | ||
91 | 'elaborationChunkSize': function() { | 89 | 'elaborationChunkSize': function() { |
92 | return Clipperz.Crypto.AES.DeferredExecution.chunkSize; | 90 | return Clipperz.Crypto.AES.DeferredExecution.chunkSize; |
93 | }, | 91 | }, |
94 | 92 | ||
95 | 'executionStep': function() { | 93 | 'executionStep': function() { |
96 | return this._executionStep; | 94 | return this._executionStep; |
97 | }, | 95 | }, |
98 | 96 | ||
99 | 'setExecutionStep': function(aValue) { | 97 | 'setExecutionStep': function(aValue) { |
100 | this._executionStep = aValue; | 98 | this._executionStep = aValue; |
101 | }, | 99 | }, |
102 | 100 | ||
103 | 'pause': function(aValue) { | 101 | 'pause': function(aValue) { |
104 | return MochiKit.Async.wait(Clipperz.Crypto.AES.DeferredExecution.pauseTime, aValue); | 102 | return MochiKit.Async.wait(Clipperz.Crypto.AES.DeferredExecution.pauseTime, aValue); |
105 | }, | 103 | }, |
106 | 104 | ||
107 | //----------------------------------------------------------------------------- | 105 | //----------------------------------------------------------------------------- |
108 | __syntaxFix__: "syntax fix" | 106 | __syntaxFix__: "syntax fix" |
109 | 107 | ||
110 | }); | 108 | }); |
111 | 109 | ||
112 | //############################################################################# | 110 | //############################################################################# |
113 | 111 | ||
114 | Clipperz.Crypto.AES.Key = function(args) { | 112 | Clipperz.Crypto.AES.Key = function(args) { |
115 | args = args || {}; | 113 | args = args || {}; |
116 | 114 | ||
117 | this._key = args.key; | 115 | this._key = args.key; |
118 | this._keySize = args.keySize || this.key().length(); | 116 | this._keySize = args.keySize || this.key().length(); |
119 | 117 | ||
120 | if (this.keySize() == 128/8) { | 118 | if (this.keySize() == 128/8) { |
121 | this._b = 176; | 119 | this._b = 176; |
122 | this._numberOfRounds = 10; | 120 | this._numberOfRounds = 10; |
123 | } else if (this.keySize() == 256/8) { | 121 | } else if (this.keySize() == 256/8) { |
124 | this._b = 240; | 122 | this._b = 240; |
125 | this._numberOfRounds = 14; | 123 | this._numberOfRounds = 14; |
126 | } else { | 124 | } else { |
127 | MochiKit.Logging.logError("AES unsupported key size: " + (this.keySize() * 8) + " bits"); | 125 | MochiKit.Logging.logError("AES unsupported key size: " + (this.keySize() * 8) + " bits"); |
128 | throw Clipperz.Crypto.AES.exception.UnsupportedKeySize; | 126 | throw Clipperz.Crypto.AES.exception.UnsupportedKeySize; |
129 | } | 127 | } |
130 | 128 | ||
131 | this._stretchedKey = null; | 129 | this._stretchedKey = null; |
132 | 130 | ||
133 | return this; | 131 | return this; |
134 | } | 132 | } |
135 | 133 | ||
136 | Clipperz.Crypto.AES.Key.prototype = MochiKit.Base.update(null, { | 134 | Clipperz.Crypto.AES.Key.prototype = MochiKit.Base.update(null, { |
137 | 135 | ||
138 | 'asString': function() { | 136 | 'asString': function() { |
139 | return "Clipperz.Crypto.AES.Key (" + this.key().toHexString() + ")"; | 137 | return "Clipperz.Crypto.AES.Key (" + this.key().toHexString() + ")"; |
140 | }, | 138 | }, |
141 | 139 | ||
142 | //----------------------------------------------------------------------------- | 140 | //----------------------------------------------------------------------------- |
143 | 141 | ||
144 | 'key': function() { | 142 | 'key': function() { |
145 | return this._key; | 143 | return this._key; |
146 | }, | 144 | }, |
147 | 145 | ||
148 | 'keySize': function() { | 146 | 'keySize': function() { |
149 | return this._keySize; | 147 | return this._keySize; |
150 | }, | 148 | }, |
151 | 149 | ||
152 | 'b': function() { | 150 | 'b': function() { |
153 | return this._b; | 151 | return this._b; |
154 | }, | 152 | }, |
155 | 153 | ||
156 | 'numberOfRounds': function() { | 154 | 'numberOfRounds': function() { |
157 | return this._numberOfRounds; | 155 | return this._numberOfRounds; |
158 | }, | 156 | }, |
159 | //========================================================================= | 157 | //========================================================================= |
160 | 158 | ||
161 | 'keyScheduleCore': function(aWord, aRoundConstantsIndex) { | 159 | 'keyScheduleCore': function(aWord, aRoundConstantsIndex) { |
162 | varresult; | 160 | varresult; |
163 | var sbox; | 161 | var sbox; |
164 | 162 | ||
165 | sbox = Clipperz.Crypto.AES.sbox(); | 163 | sbox = Clipperz.Crypto.AES.sbox(); |
166 | 164 | ||
167 | result = [sbox[aWord[1]] ^ Clipperz.Crypto.AES.roundConstants()[aRoundConstantsIndex], | 165 | result = [sbox[aWord[1]] ^ Clipperz.Crypto.AES.roundConstants()[aRoundConstantsIndex], |
168 | sbox[aWord[2]], | 166 | sbox[aWord[2]], |
169 | sbox[aWord[3]], | 167 | sbox[aWord[3]], |
170 | sbox[aWord[0]]]; | 168 | sbox[aWord[0]]]; |
171 | 169 | ||
172 | return result; | 170 | return result; |
173 | }, | 171 | }, |
174 | 172 | ||
175 | //----------------------------------------------------------------------------- | 173 | //----------------------------------------------------------------------------- |
176 | 174 | ||
177 | 'xorWithPreviousStretchValues': function(aKey, aWord, aPreviousWordIndex) { | 175 | 'xorWithPreviousStretchValues': function(aKey, aWord, aPreviousWordIndex) { |
178 | varresult; | 176 | varresult; |
179 | var i,c; | 177 | var i,c; |
180 | 178 | ||
181 | result = []; | 179 | result = []; |
182 | c = 4; | 180 | c = 4; |
183 | for (i=0; i<c; i++) { | 181 | for (i=0; i<c; i++) { |
184 | result[i] = aWord[i] ^ aKey.byteAtIndex(aPreviousWordIndex + i); | 182 | result[i] = aWord[i] ^ aKey.byteAtIndex(aPreviousWordIndex + i); |
185 | } | 183 | } |
186 | 184 | ||
187 | return result; | 185 | return result; |
188 | }, | 186 | }, |
189 | 187 | ||
190 | //----------------------------------------------------------------------------- | 188 | //----------------------------------------------------------------------------- |
191 | 189 | ||
192 | 'sboxShakeup': function(aWord) { | 190 | 'sboxShakeup': function(aWord) { |
193 | var result; | 191 | var result; |
194 | var sbox; | 192 | var sbox; |
195 | var i,c; | 193 | var i,c; |
196 | 194 | ||
197 | result = []; | 195 | result = []; |
198 | sbox = Clipperz.Crypto.AES.sbox(); | 196 | sbox = Clipperz.Crypto.AES.sbox(); |
199 | c =4; | 197 | c =4; |
200 | for (i=0; i<c; i++) { | 198 | for (i=0; i<c; i++) { |
201 | result[i] = sbox[aWord[i]]; | 199 | result[i] = sbox[aWord[i]]; |
202 | } | 200 | } |
203 | 201 | ||
204 | return result; | 202 | return result; |
205 | }, | 203 | }, |
206 | 204 | ||
207 | //----------------------------------------------------------------------------- | 205 | //----------------------------------------------------------------------------- |
208 | 206 | ||
209 | 'stretchKey': function(aKey) { | 207 | 'stretchKey': function(aKey) { |
210 | varcurrentWord; | 208 | varcurrentWord; |
211 | varkeyLength; | 209 | varkeyLength; |
212 | varpreviousStretchIndex; | 210 | varpreviousStretchIndex; |
213 | var i,c; | 211 | var i,c; |
214 | 212 | ||