~ubuntu-branches/ubuntu/vivid/emscripten/vivid-proposed

« back to all changes in this revision

Viewing changes to third_party/websockify/include/web-socket-js/src/flash-src/third-party/com/hurlant/crypto/symmetric/DESKey.as

  • Committer: Package Import Robot
  • Author(s): Sylvestre Ledru
  • Date: 2014-01-19 14:12:40 UTC
  • mfrom: (4.1.2 sid)
  • Revision ID: package-import@ubuntu.com-20140119141240-nfiw0p8033oitpfz
Tags: 1.9.0~20140119~7dc8c2f-1
* New snapshot release (Closes: #733714)
* Provide sources for javascript and flash. Done in orig-tar.sh
  Available in third_party/websockify/include/web-socket-js/src/
  (Closes: #735903)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/**
 
2
 * DESKey
 
3
 * 
 
4
 * An Actionscript 3 implementation of the Data Encryption Standard (DES)
 
5
 * Copyright (c) 2007 Henri Torgemane
 
6
 * 
 
7
 * Derived from:
 
8
 *              The Bouncy Castle Crypto package, 
 
9
 *              Copyright (c) 2000-2004 The Legion Of The Bouncy Castle
 
10
 *              (http://www.bouncycastle.org)
 
11
 * 
 
12
 * See LICENSE.txt for full license information.
 
13
 */
 
14
package com.hurlant.crypto.symmetric
 
15
{
 
16
        import flash.utils.ByteArray;
 
17
        import com.hurlant.util.Hex;
 
18
        import com.hurlant.util.Memory;
 
19
 
 
20
        public class DESKey implements ISymmetricKey
 
21
        {
 
22
                /**
 
23
                 * what follows is mainly taken from "Applied Cryptography", by Bruce
 
24
                 * Schneier, however it also bears great resemblance to Richard
 
25
                 * Outerbridge's D3DES...
 
26
                 */
 
27
        
 
28
                private static const Df_Key:Array = [ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32,
 
29
                                0x10, 0x89, 0xab, 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67 ];
 
30
        
 
31
                private static const bytebit:Array = [ 128, 64, 32, 16, 8, 4, 2, 1 ];
 
32
        
 
33
                private static const bigbyte:Array = [ 0x800000, 0x400000, 0x200000, 0x100000, 0x80000, 0x40000, 0x20000, 0x10000, 0x8000,
 
34
                                0x4000, 0x2000, 0x1000, 0x800, 0x400, 0x200, 0x100, 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1 ];
 
35
        
 
36
                /*
 
37
                 * Use the key schedule specified in the Standard (ANSI X3.92-1981).
 
38
                 */
 
39
        
 
40
                private static const pc1:Array = [ 56, 48, 40, 32, 24, 16, 8, 0, 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2,
 
41
                                59, 51, 43, 35, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 60, 52, 44, 36, 28, 20, 12,
 
42
                                4, 27, 19, 11, 3 ];
 
43
        
 
44
                private static const totrot:Array = [ 1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28 ];
 
45
        
 
46
                private static const pc2:Array = [ 13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9, 22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1, 40,
 
47
                                51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47, 43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31 ];
 
48
        
 
49
                private static const SP1:Array = [ 0x01010400, 0x00000000, 0x00010000, 0x01010404, 0x01010004, 0x00010404, 0x00000004,
 
50
                                0x00010000, 0x00000400, 0x01010400, 0x01010404, 0x00000400, 0x01000404, 0x01010004, 0x01000000, 0x00000004,
 
51
                                0x00000404, 0x01000400, 0x01000400, 0x00010400, 0x00010400, 0x01010000, 0x01010000, 0x01000404, 0x00010004,
 
52
                                0x01000004, 0x01000004, 0x00010004, 0x00000000, 0x00000404, 0x00010404, 0x01000000, 0x00010000, 0x01010404,
 
53
                                0x00000004, 0x01010000, 0x01010400, 0x01000000, 0x01000000, 0x00000400, 0x01010004, 0x00010000, 0x00010400,
 
54
                                0x01000004, 0x00000400, 0x00000004, 0x01000404, 0x00010404, 0x01010404, 0x00010004, 0x01010000, 0x01000404,
 
55
                                0x01000004, 0x00000404, 0x00010404, 0x01010400, 0x00000404, 0x01000400, 0x01000400, 0x00000000, 0x00010004,
 
56
                                0x00010400, 0x00000000, 0x01010004 ];
 
57
        
 
58
                private static const SP2:Array = [ 0x80108020, 0x80008000, 0x00008000, 0x00108020, 0x00100000, 0x00000020, 0x80100020,
 
59
                                0x80008020, 0x80000020, 0x80108020, 0x80108000, 0x80000000, 0x80008000, 0x00100000, 0x00000020, 0x80100020,
 
60
                                0x00108000, 0x00100020, 0x80008020, 0x00000000, 0x80000000, 0x00008000, 0x00108020, 0x80100000, 0x00100020,
 
61
                                0x80000020, 0x00000000, 0x00108000, 0x00008020, 0x80108000, 0x80100000, 0x00008020, 0x00000000, 0x00108020,
 
62
                                0x80100020, 0x00100000, 0x80008020, 0x80100000, 0x80108000, 0x00008000, 0x80100000, 0x80008000, 0x00000020,
 
63
                                0x80108020, 0x00108020, 0x00000020, 0x00008000, 0x80000000, 0x00008020, 0x80108000, 0x00100000, 0x80000020,
 
64
                                0x00100020, 0x80008020, 0x80000020, 0x00100020, 0x00108000, 0x00000000, 0x80008000, 0x00008020, 0x80000000,
 
65
                                0x80100020, 0x80108020, 0x00108000 ];
 
66
        
 
67
                private static const SP3:Array = [ 0x00000208, 0x08020200, 0x00000000, 0x08020008, 0x08000200, 0x00000000, 0x00020208,
 
68
                                0x08000200, 0x00020008, 0x08000008, 0x08000008, 0x00020000, 0x08020208, 0x00020008, 0x08020000, 0x00000208,
 
69
                                0x08000000, 0x00000008, 0x08020200, 0x00000200, 0x00020200, 0x08020000, 0x08020008, 0x00020208, 0x08000208,
 
70
                                0x00020200, 0x00020000, 0x08000208, 0x00000008, 0x08020208, 0x00000200, 0x08000000, 0x08020200, 0x08000000,
 
71
                                0x00020008, 0x00000208, 0x00020000, 0x08020200, 0x08000200, 0x00000000, 0x00000200, 0x00020008, 0x08020208,
 
72
                                0x08000200, 0x08000008, 0x00000200, 0x00000000, 0x08020008, 0x08000208, 0x00020000, 0x08000000, 0x08020208,
 
73
                                0x00000008, 0x00020208, 0x00020200, 0x08000008, 0x08020000, 0x08000208, 0x00000208, 0x08020000, 0x00020208,
 
74
                                0x00000008, 0x08020008, 0x00020200 ];
 
75
        
 
76
                private static const SP4:Array = [ 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802080, 0x00800081, 0x00800001,
 
77
                                0x00002001, 0x00000000, 0x00802000, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00800080, 0x00800001,
 
78
                                0x00000001, 0x00002000, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002001, 0x00002080, 0x00800081,
 
79
                                0x00000001, 0x00002080, 0x00800080, 0x00002000, 0x00802080, 0x00802081, 0x00000081, 0x00800080, 0x00800001,
 
80
                                0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00000000, 0x00802000, 0x00002080, 0x00800080, 0x00800081,
 
81
                                0x00000001, 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802081, 0x00000081, 0x00000001, 0x00002000,
 
82
                                0x00800001, 0x00002001, 0x00802080, 0x00800081, 0x00002001, 0x00002080, 0x00800000, 0x00802001, 0x00000080,
 
83
                                0x00800000, 0x00002000, 0x00802080 ];
 
84
        
 
85
                private static const SP5:Array = [ 0x00000100, 0x02080100, 0x02080000, 0x42000100, 0x00080000, 0x00000100, 0x40000000,
 
86
                                0x02080000, 0x40080100, 0x00080000, 0x02000100, 0x40080100, 0x42000100, 0x42080000, 0x00080100, 0x40000000,
 
87
                                0x02000000, 0x40080000, 0x40080000, 0x00000000, 0x40000100, 0x42080100, 0x42080100, 0x02000100, 0x42080000,
 
88
                                0x40000100, 0x00000000, 0x42000000, 0x02080100, 0x02000000, 0x42000000, 0x00080100, 0x00080000, 0x42000100,
 
89
                                0x00000100, 0x02000000, 0x40000000, 0x02080000, 0x42000100, 0x40080100, 0x02000100, 0x40000000, 0x42080000,
 
90
                                0x02080100, 0x40080100, 0x00000100, 0x02000000, 0x42080000, 0x42080100, 0x00080100, 0x42000000, 0x42080100,
 
91
                                0x02080000, 0x00000000, 0x40080000, 0x42000000, 0x00080100, 0x02000100, 0x40000100, 0x00080000, 0x00000000,
 
92
                                0x40080000, 0x02080100, 0x40000100 ];
 
93
        
 
94
                private static const SP6:Array = [ 0x20000010, 0x20400000, 0x00004000, 0x20404010, 0x20400000, 0x00000010, 0x20404010,
 
95
                                0x00400000, 0x20004000, 0x00404010, 0x00400000, 0x20000010, 0x00400010, 0x20004000, 0x20000000, 0x00004010,
 
96
                                0x00000000, 0x00400010, 0x20004010, 0x00004000, 0x00404000, 0x20004010, 0x00000010, 0x20400010, 0x20400010,
 
97
                                0x00000000, 0x00404010, 0x20404000, 0x00004010, 0x00404000, 0x20404000, 0x20000000, 0x20004000, 0x00000010,
 
98
                                0x20400010, 0x00404000, 0x20404010, 0x00400000, 0x00004010, 0x20000010, 0x00400000, 0x20004000, 0x20000000,
 
99
                                0x00004010, 0x20000010, 0x20404010, 0x00404000, 0x20400000, 0x00404010, 0x20404000, 0x00000000, 0x20400010,
 
100
                                0x00000010, 0x00004000, 0x20400000, 0x00404010, 0x00004000, 0x00400010, 0x20004010, 0x00000000, 0x20404000,
 
101
                                0x20000000, 0x00400010, 0x20004010 ];
 
102
        
 
103
                private static const SP7:Array = [ 0x00200000, 0x04200002, 0x04000802, 0x00000000, 0x00000800, 0x04000802, 0x00200802,
 
104
                                0x04200800, 0x04200802, 0x00200000, 0x00000000, 0x04000002, 0x00000002, 0x04000000, 0x04200002, 0x00000802,
 
105
                                0x04000800, 0x00200802, 0x00200002, 0x04000800, 0x04000002, 0x04200000, 0x04200800, 0x00200002, 0x04200000,
 
106
                                0x00000800, 0x00000802, 0x04200802, 0x00200800, 0x00000002, 0x04000000, 0x00200800, 0x04000000, 0x00200800,
 
107
                                0x00200000, 0x04000802, 0x04000802, 0x04200002, 0x04200002, 0x00000002, 0x00200002, 0x04000000, 0x04000800,
 
108
                                0x00200000, 0x04200800, 0x00000802, 0x00200802, 0x04200800, 0x00000802, 0x04000002, 0x04200802, 0x04200000,
 
109
                                0x00200800, 0x00000000, 0x00000002, 0x04200802, 0x00000000, 0x00200802, 0x04200000, 0x00000800, 0x04000002,
 
110
                                0x04000800, 0x00000800, 0x00200002 ];
 
111
        
 
112
                private static const SP8:Array = [ 0x10001040, 0x00001000, 0x00040000, 0x10041040, 0x10000000, 0x10001040, 0x00000040,
 
113
                                0x10000000, 0x00040040, 0x10040000, 0x10041040, 0x00041000, 0x10041000, 0x00041040, 0x00001000, 0x00000040,
 
114
                                0x10040000, 0x10000040, 0x10001000, 0x00001040, 0x00041000, 0x00040040, 0x10040040, 0x10041000, 0x00001040,
 
115
                                0x00000000, 0x00000000, 0x10040040, 0x10000040, 0x10001000, 0x00041040, 0x00040000, 0x00041040, 0x00040000,
 
116
                                0x10041000, 0x00001000, 0x00000040, 0x10040040, 0x00001000, 0x00041040, 0x10001000, 0x00000040, 0x10000040,
 
117
                                0x10040000, 0x10040040, 0x10000000, 0x00040000, 0x10001040, 0x00000000, 0x10041040, 0x00040040, 0x10000040,
 
118
                                0x10040000, 0x10001000, 0x10001040, 0x00000000, 0x10041040, 0x00041000, 0x00041000, 0x00001040, 0x00001040,
 
119
                                0x00040040, 0x10000000, 0x10041000 ];
 
120
 
 
121
        
 
122
                protected var key:ByteArray;
 
123
                protected var encKey:Array;
 
124
                protected var decKey:Array;
 
125
        
 
126
 
 
127
                public function DESKey(key:ByteArray) {
 
128
                        this.key = key;
 
129
                        this.encKey = generateWorkingKey(true, key, 0);
 
130
                        this.decKey = generateWorkingKey(false, key, 0);
 
131
                }
 
132
 
 
133
                public function getBlockSize():uint
 
134
                {
 
135
                        return 8;
 
136
                }
 
137
                
 
138
                public function decrypt(block:ByteArray, index:uint=0):void
 
139
                {
 
140
                        desFunc(decKey, block, index, block, index);
 
141
                }
 
142
                
 
143
                public function dispose():void
 
144
                {
 
145
                        var i:uint=0;
 
146
                        for (i=0;i<encKey.length;i++) { encKey[i]=0; }
 
147
                        for (i=0;i<decKey.length;i++) { decKey[i]=0; }
 
148
                        encKey=null;
 
149
                        decKey=null;
 
150
                        for (i=0;i<key.length;i++) { key[i]=0; }
 
151
                        key.length = 0;
 
152
                        key = null;
 
153
                        Memory.gc();
 
154
                }
 
155
                
 
156
                public function encrypt(block:ByteArray, index:uint=0):void
 
157
                {
 
158
                        desFunc(encKey, block, index, block, index);
 
159
                }
 
160
                        
 
161
        
 
162
                /**
 
163
                 * generate an integer based working key based on our secret key and what we
 
164
                 * processing we are planning to do.
 
165
                 * 
 
166
                 * Acknowledgements for this routine go to James Gillogly & Phil Karn.
 
167
                 */
 
168
                protected function generateWorkingKey(encrypting:Boolean, key:ByteArray, off:uint):Array
 
169
                {
 
170
                        //int[] newKey = new int[32];
 
171
                        var newKey:Array = [];
 
172
                        //boolean[] pc1m = new boolean[56], pcr = new boolean[56];
 
173
                        var pc1m:ByteArray = new ByteArray;
 
174
                        var pcr:ByteArray = new ByteArray;
 
175
                        
 
176
                        var l:uint;
 
177
        
 
178
                        for (var j:uint = 0; j < 56; j++)
 
179
                        {
 
180
                                l = pc1[j];
 
181
        
 
182
                                pc1m[j] = ((key[off + (l >>> 3)] & bytebit[l & 07]) != 0);
 
183
                        }
 
184
        
 
185
                        for (var i:uint = 0; i < 16; i++)
 
186
                        {
 
187
                                var m:uint;
 
188
                                var n:uint;
 
189
        
 
190
                                if (encrypting)
 
191
                                {
 
192
                                        m = i << 1;
 
193
                                }
 
194
                                else
 
195
                                {
 
196
                                        m = (15 - i) << 1;
 
197
                                }
 
198
        
 
199
                                n = m + 1;
 
200
                                newKey[m] = newKey[n] = 0;
 
201
        
 
202
                                for (j = 0; j < 28; j++)
 
203
                                {
 
204
                                        l = j + totrot[i];
 
205
                                        if (l < 28)
 
206
                                        {
 
207
                                                pcr[j] = pc1m[l];
 
208
                                        }
 
209
                                        else
 
210
                                        {
 
211
                                                pcr[j] = pc1m[l - 28];
 
212
                                        }
 
213
                                }
 
214
        
 
215
                                for (j = 28; j < 56; j++)
 
216
                                {
 
217
                                        l = j + totrot[i];
 
218
                                        if (l < 56)
 
219
                                        {
 
220
                                                pcr[j] = pc1m[l];
 
221
                                        }
 
222
                                        else
 
223
                                        {
 
224
                                                pcr[j] = pc1m[l - 28];
 
225
                                        }
 
226
                                }
 
227
        
 
228
                                for (j = 0; j < 24; j++)
 
229
                                {
 
230
                                        if (pcr[pc2[j]])
 
231
                                        {
 
232
                                                newKey[m] |= bigbyte[j];
 
233
                                        }
 
234
        
 
235
                                        if (pcr[pc2[j + 24]])
 
236
                                        {
 
237
                                                newKey[n] |= bigbyte[j];
 
238
                                        }
 
239
                                }
 
240
                        }
 
241
        
 
242
                        //
 
243
                        // store the processed key
 
244
                        //
 
245
                        for (i = 0; i != 32; i += 2)
 
246
                        {
 
247
                                var i1:uint;
 
248
                                var i2:uint;
 
249
        
 
250
                                i1 = newKey[i];
 
251
                                i2 = newKey[i + 1];
 
252
        
 
253
                                newKey[i] = ((i1 & 0x00fc0000) << 6) | ((i1 & 0x00000fc0) << 10) | ((i2 & 0x00fc0000) >>> 10)
 
254
                                                | ((i2 & 0x00000fc0) >>> 6);
 
255
        
 
256
                                newKey[i + 1] = ((i1 & 0x0003f000) << 12) | ((i1 & 0x0000003f) << 16) | ((i2 & 0x0003f000) >>> 4)
 
257
                                                | (i2 & 0x0000003f);
 
258
                        }
 
259
                        return newKey;
 
260
                }
 
261
        
 
262
                /**
 
263
                 * the DES engine.
 
264
                 */
 
265
                protected function desFunc(wKey:Array, inp:ByteArray, inOff:uint, out:ByteArray, outOff:uint):void
 
266
                {
 
267
                        var work:uint;
 
268
                        var right:uint;
 
269
                        var left:uint;
 
270
        
 
271
                        left = (inp[inOff + 0] & 0xff) << 24;
 
272
                        left |= (inp[inOff + 1] & 0xff) << 16;
 
273
                        left |= (inp[inOff + 2] & 0xff) << 8;
 
274
                        left |= (inp[inOff + 3] & 0xff);
 
275
        
 
276
                        right = (inp[inOff + 4] & 0xff) << 24;
 
277
                        right |= (inp[inOff + 5] & 0xff) << 16;
 
278
                        right |= (inp[inOff + 6] & 0xff) << 8;
 
279
                        right |= (inp[inOff + 7] & 0xff);
 
280
 
 
281
                        work = ((left >>> 4) ^ right) & 0x0f0f0f0f;
 
282
                        right ^= work;
 
283
                        left ^= (work << 4);
 
284
                        work = ((left >>> 16) ^ right) & 0x0000ffff;
 
285
                        right ^= work;
 
286
                        left ^= (work << 16);
 
287
                        work = ((right >>> 2) ^ left) & 0x33333333;
 
288
                        left ^= work;
 
289
                        right ^= (work << 2);
 
290
                        work = ((right >>> 8) ^ left) & 0x00ff00ff;
 
291
                        left ^= work;
 
292
                        right ^= (work << 8);
 
293
                        right = ((right << 1) | ((right >>> 31) & 1)) & 0xffffffff;
 
294
                        work = (left ^ right) & 0xaaaaaaaa;
 
295
                        left ^= work;
 
296
                        right ^= work;
 
297
                        left = ((left << 1) | ((left >>> 31) & 1)) & 0xffffffff;
 
298
 
 
299
                        for (var round:uint = 0; round < 8; round++)
 
300
                        {
 
301
                                var fval:uint;
 
302
        
 
303
                                work = (right << 28) | (right >>> 4);
 
304
                                work ^= wKey[round * 4 + 0];
 
305
                                fval = SP7[work & 0x3f];
 
306
                                fval |= SP5[(work >>> 8) & 0x3f];
 
307
                                fval |= SP3[(work >>> 16) & 0x3f];
 
308
                                fval |= SP1[(work >>> 24) & 0x3f];
 
309
                                work = right ^ wKey[round * 4 + 1];
 
310
                                fval |= SP8[work & 0x3f];
 
311
                                fval |= SP6[(work >>> 8) & 0x3f];
 
312
                                fval |= SP4[(work >>> 16) & 0x3f];
 
313
                                fval |= SP2[(work >>> 24) & 0x3f];
 
314
                                left ^= fval;
 
315
                                work = (left << 28) | (left >>> 4);
 
316
                                work ^= wKey[round * 4 + 2];
 
317
                                fval = SP7[work & 0x3f];
 
318
                                fval |= SP5[(work >>> 8) & 0x3f];
 
319
                                fval |= SP3[(work >>> 16) & 0x3f];
 
320
                                fval |= SP1[(work >>> 24) & 0x3f];
 
321
                                work = left ^ wKey[round * 4 + 3];
 
322
                                fval |= SP8[work & 0x3f];
 
323
                                fval |= SP6[(work >>> 8) & 0x3f];
 
324
                                fval |= SP4[(work >>> 16) & 0x3f];
 
325
                                fval |= SP2[(work >>> 24) & 0x3f];
 
326
                                right ^= fval;
 
327
                        }
 
328
        
 
329
                        right = (right << 31) | (right >>> 1);
 
330
                        work = (left ^ right) & 0xaaaaaaaa;
 
331
                        left ^= work;
 
332
                        right ^= work;
 
333
                        left = (left << 31) | (left >>> 1);
 
334
                        work = ((left >>> 8) ^ right) & 0x00ff00ff;
 
335
                        right ^= work;
 
336
                        left ^= (work << 8);
 
337
                        work = ((left >>> 2) ^ right) & 0x33333333;
 
338
                        right ^= work;
 
339
                        left ^= (work << 2);
 
340
                        work = ((right >>> 16) ^ left) & 0x0000ffff;
 
341
                        left ^= work;
 
342
                        right ^= (work << 16);
 
343
                        work = ((right >>> 4) ^ left) & 0x0f0f0f0f;
 
344
                        left ^= work;
 
345
                        right ^= (work << 4);
 
346
        
 
347
                        out[outOff + 0] = ((right >>> 24) & 0xff);
 
348
                        out[outOff + 1] = ((right >>> 16) & 0xff);
 
349
                        out[outOff + 2] = ((right >>> 8) & 0xff);
 
350
                        out[outOff + 3] = (right & 0xff);
 
351
                        out[outOff + 4] = ((left >>> 24) & 0xff);
 
352
                        out[outOff + 5] = ((left >>> 16) & 0xff);
 
353
                        out[outOff + 6] = ((left >>> 8) & 0xff);
 
354
                        out[outOff + 7] = (left & 0xff);
 
355
                }
 
356
                
 
357
                
 
358
                public function toString():String {
 
359
                        return "des";
 
360
                }
 
361
                
 
362
                
 
363
                
 
364
        }
 
365
}
 
 
b'\\ No newline at end of file'