Przeglądaj źródła

Add aes.c and required headers from axtls tree

tags/v0.9.3
Michael Brown 17 lat temu
rodzic
commit
9542c016cd

+ 478
- 0
src/crypto/axtls/aes.c Wyświetl plik

@@ -0,0 +1,478 @@
1
+/*
2
+ *  Copyright(C) 2006 Cameron Rich
3
+ *
4
+ *  This library is free software; you can redistribute it and/or modify
5
+ *  it under the terms of the GNU Lesser General Public License as published by
6
+ *  the Free Software Foundation; either version 2 of the License, or
7
+ *  (at your option) any later version.
8
+ *
9
+ *  This library is distributed in the hope that it will be useful,
10
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
+ *  GNU Lesser General Public License for more details.
13
+ *
14
+ *  You should have received a copy of the GNU Lesser General Public License
15
+ *  along with this library; if not, write to the Free Software
16
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
+ */
18
+
19
+/**
20
+ * AES implementation - this is a small code version. There are much faster
21
+ * versions around but they are much larger in size (i.e. they use large 
22
+ * submix tables).
23
+ */
24
+
25
+#include <string.h>
26
+#include "crypto.h"
27
+
28
+/* all commented out in skeleton mode */
29
+#ifndef CONFIG_SSL_SKELETON_MODE
30
+
31
+#define rot1(x) (((x) << 24) | ((x) >> 8))
32
+#define rot2(x) (((x) << 16) | ((x) >> 16))
33
+#define rot3(x) (((x) <<  8) | ((x) >> 24))
34
+
35
+/* 
36
+ * This cute trick does 4 'mul by two' at once.  Stolen from
37
+ * Dr B. R. Gladman <brg@gladman.uk.net> but I'm sure the u-(u>>7) is
38
+ * a standard graphics trick
39
+ * The key to this is that we need to xor with 0x1b if the top bit is set.
40
+ * a 1xxx xxxx   0xxx 0xxx First we mask the 7bit,
41
+ * b 1000 0000   0000 0000 then we shift right by 7 putting the 7bit in 0bit,
42
+ * c 0000 0001   0000 0000 we then subtract (c) from (b)
43
+ * d 0111 1111   0000 0000 and now we and with our mask
44
+ * e 0001 1011   0000 0000
45
+ */
46
+#define mt  0x80808080
47
+#define ml  0x7f7f7f7f
48
+#define mh  0xfefefefe
49
+#define mm  0x1b1b1b1b
50
+#define mul2(x,t)	((t)=((x)&mt), \
51
+			((((x)+(x))&mh)^(((t)-((t)>>7))&mm)))
52
+
53
+#define inv_mix_col(x,f2,f4,f8,f9) (\
54
+			(f2)=mul2(x,f2), \
55
+			(f4)=mul2(f2,f4), \
56
+			(f8)=mul2(f4,f8), \
57
+			(f9)=(x)^(f8), \
58
+			(f8)=((f2)^(f4)^(f8)), \
59
+			(f2)^=(f9), \
60
+			(f4)^=(f9), \
61
+			(f8)^=rot3(f2), \
62
+			(f8)^=rot2(f4), \
63
+			(f8)^rot1(f9))
64
+
65
+/* some macros to do endian independent byte extraction */
66
+#define n2l(c,l) l=ntohl(*c); c++
67
+#define l2n(l,c) *c++=htonl(l)
68
+
69
+/*
70
+ * AES S-box
71
+ */
72
+static const uint8_t aes_sbox[256] =
73
+{
74
+	0x63,0x7C,0x77,0x7B,0xF2,0x6B,0x6F,0xC5,
75
+	0x30,0x01,0x67,0x2B,0xFE,0xD7,0xAB,0x76,
76
+	0xCA,0x82,0xC9,0x7D,0xFA,0x59,0x47,0xF0,
77
+	0xAD,0xD4,0xA2,0xAF,0x9C,0xA4,0x72,0xC0,
78
+	0xB7,0xFD,0x93,0x26,0x36,0x3F,0xF7,0xCC,
79
+	0x34,0xA5,0xE5,0xF1,0x71,0xD8,0x31,0x15,
80
+	0x04,0xC7,0x23,0xC3,0x18,0x96,0x05,0x9A,
81
+	0x07,0x12,0x80,0xE2,0xEB,0x27,0xB2,0x75,
82
+	0x09,0x83,0x2C,0x1A,0x1B,0x6E,0x5A,0xA0,
83
+	0x52,0x3B,0xD6,0xB3,0x29,0xE3,0x2F,0x84,
84
+	0x53,0xD1,0x00,0xED,0x20,0xFC,0xB1,0x5B,
85
+	0x6A,0xCB,0xBE,0x39,0x4A,0x4C,0x58,0xCF,
86
+	0xD0,0xEF,0xAA,0xFB,0x43,0x4D,0x33,0x85,
87
+	0x45,0xF9,0x02,0x7F,0x50,0x3C,0x9F,0xA8,
88
+	0x51,0xA3,0x40,0x8F,0x92,0x9D,0x38,0xF5,
89
+	0xBC,0xB6,0xDA,0x21,0x10,0xFF,0xF3,0xD2,
90
+	0xCD,0x0C,0x13,0xEC,0x5F,0x97,0x44,0x17,
91
+	0xC4,0xA7,0x7E,0x3D,0x64,0x5D,0x19,0x73,
92
+	0x60,0x81,0x4F,0xDC,0x22,0x2A,0x90,0x88,
93
+	0x46,0xEE,0xB8,0x14,0xDE,0x5E,0x0B,0xDB,
94
+	0xE0,0x32,0x3A,0x0A,0x49,0x06,0x24,0x5C,
95
+	0xC2,0xD3,0xAC,0x62,0x91,0x95,0xE4,0x79,
96
+	0xE7,0xC8,0x37,0x6D,0x8D,0xD5,0x4E,0xA9,
97
+	0x6C,0x56,0xF4,0xEA,0x65,0x7A,0xAE,0x08,
98
+	0xBA,0x78,0x25,0x2E,0x1C,0xA6,0xB4,0xC6,
99
+	0xE8,0xDD,0x74,0x1F,0x4B,0xBD,0x8B,0x8A,
100
+	0x70,0x3E,0xB5,0x66,0x48,0x03,0xF6,0x0E,
101
+	0x61,0x35,0x57,0xB9,0x86,0xC1,0x1D,0x9E,
102
+	0xE1,0xF8,0x98,0x11,0x69,0xD9,0x8E,0x94,
103
+	0x9B,0x1E,0x87,0xE9,0xCE,0x55,0x28,0xDF,
104
+	0x8C,0xA1,0x89,0x0D,0xBF,0xE6,0x42,0x68,
105
+	0x41,0x99,0x2D,0x0F,0xB0,0x54,0xBB,0x16,
106
+};
107
+
108
+/*
109
+ * AES is-box
110
+ */
111
+static const uint8_t aes_isbox[256] = 
112
+{
113
+    0x52,0x09,0x6a,0xd5,0x30,0x36,0xa5,0x38,
114
+    0xbf,0x40,0xa3,0x9e,0x81,0xf3,0xd7,0xfb,
115
+    0x7c,0xe3,0x39,0x82,0x9b,0x2f,0xff,0x87,
116
+    0x34,0x8e,0x43,0x44,0xc4,0xde,0xe9,0xcb,
117
+    0x54,0x7b,0x94,0x32,0xa6,0xc2,0x23,0x3d,
118
+    0xee,0x4c,0x95,0x0b,0x42,0xfa,0xc3,0x4e,
119
+    0x08,0x2e,0xa1,0x66,0x28,0xd9,0x24,0xb2,
120
+    0x76,0x5b,0xa2,0x49,0x6d,0x8b,0xd1,0x25,
121
+    0x72,0xf8,0xf6,0x64,0x86,0x68,0x98,0x16,
122
+    0xd4,0xa4,0x5c,0xcc,0x5d,0x65,0xb6,0x92,
123
+    0x6c,0x70,0x48,0x50,0xfd,0xed,0xb9,0xda,
124
+    0x5e,0x15,0x46,0x57,0xa7,0x8d,0x9d,0x84,
125
+    0x90,0xd8,0xab,0x00,0x8c,0xbc,0xd3,0x0a,
126
+    0xf7,0xe4,0x58,0x05,0xb8,0xb3,0x45,0x06,
127
+    0xd0,0x2c,0x1e,0x8f,0xca,0x3f,0x0f,0x02,
128
+    0xc1,0xaf,0xbd,0x03,0x01,0x13,0x8a,0x6b,
129
+    0x3a,0x91,0x11,0x41,0x4f,0x67,0xdc,0xea,
130
+    0x97,0xf2,0xcf,0xce,0xf0,0xb4,0xe6,0x73,
131
+    0x96,0xac,0x74,0x22,0xe7,0xad,0x35,0x85,
132
+    0xe2,0xf9,0x37,0xe8,0x1c,0x75,0xdf,0x6e,
133
+    0x47,0xf1,0x1a,0x71,0x1d,0x29,0xc5,0x89,
134
+    0x6f,0xb7,0x62,0x0e,0xaa,0x18,0xbe,0x1b,
135
+    0xfc,0x56,0x3e,0x4b,0xc6,0xd2,0x79,0x20,
136
+    0x9a,0xdb,0xc0,0xfe,0x78,0xcd,0x5a,0xf4,
137
+    0x1f,0xdd,0xa8,0x33,0x88,0x07,0xc7,0x31,
138
+    0xb1,0x12,0x10,0x59,0x27,0x80,0xec,0x5f,
139
+    0x60,0x51,0x7f,0xa9,0x19,0xb5,0x4a,0x0d,
140
+    0x2d,0xe5,0x7a,0x9f,0x93,0xc9,0x9c,0xef,
141
+    0xa0,0xe0,0x3b,0x4d,0xae,0x2a,0xf5,0xb0,
142
+    0xc8,0xeb,0xbb,0x3c,0x83,0x53,0x99,0x61,
143
+    0x17,0x2b,0x04,0x7e,0xba,0x77,0xd6,0x26,
144
+    0xe1,0x69,0x14,0x63,0x55,0x21,0x0c,0x7d
145
+};
146
+
147
+static const unsigned char Rcon[30]=
148
+{
149
+	0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,
150
+	0x1b,0x36,0x6c,0xd8,0xab,0x4d,0x9a,0x2f,
151
+	0x5e,0xbc,0x63,0xc6,0x97,0x35,0x6a,0xd4,
152
+	0xb3,0x7d,0xfa,0xef,0xc5,0x91,
153
+};
154
+
155
+/* ----- static functions ----- */
156
+static void AES_encrypt(const AES_CTX *ctx, uint32_t *data);
157
+static void AES_decrypt(const AES_CTX *ctx, uint32_t *data);
158
+
159
+/* Perform doubling in Galois Field GF(2^8) using the irreducible polynomial
160
+   x^8+x^4+x^3+x+1 */
161
+static unsigned char AES_xtime(uint32_t x)
162
+{
163
+	return x = (x&0x80) ? (x<<1)^0x1b : x<<1;
164
+}
165
+
166
+/**
167
+ * Set up AES with the key/iv and cipher size.
168
+ */
169
+void AES_set_key(AES_CTX *ctx, const uint8_t *key, 
170
+        const uint8_t *iv, AES_MODE mode)
171
+{
172
+    int i, ii;
173
+    uint32_t *W, tmp, tmp2;
174
+    const unsigned char *ip;
175
+    int words;
176
+
177
+    switch (mode)
178
+    {
179
+        case AES_MODE_128:
180
+            i = 10;
181
+            words = 4;
182
+            break;
183
+
184
+        case AES_MODE_256:
185
+            i = 14;
186
+            words = 8;
187
+            break;
188
+
189
+        default:        /* fail silently */
190
+            return;
191
+    }
192
+
193
+    ctx->rounds = i;
194
+    ctx->key_size = words;
195
+    W = ctx->ks;
196
+    for (i = 0; i < words; i+=2)
197
+    {
198
+        W[i+0]=	((uint32_t)key[ 0]<<24)|
199
+            ((uint32_t)key[ 1]<<16)|
200
+            ((uint32_t)key[ 2]<< 8)|
201
+            ((uint32_t)key[ 3]    );
202
+        W[i+1]=	((uint32_t)key[ 4]<<24)|
203
+            ((uint32_t)key[ 5]<<16)|
204
+            ((uint32_t)key[ 6]<< 8)|
205
+            ((uint32_t)key[ 7]    );
206
+        key += 8;
207
+    }
208
+
209
+    ip = Rcon;
210
+    ii = 4 * (ctx->rounds+1);
211
+    for (i = words; i<ii; i++)
212
+    {
213
+        tmp = W[i-1];
214
+
215
+        if ((i % words) == 0)
216
+        {
217
+            tmp2 =(uint32_t)aes_sbox[(tmp    )&0xff]<< 8;
218
+            tmp2|=(uint32_t)aes_sbox[(tmp>> 8)&0xff]<<16;
219
+            tmp2|=(uint32_t)aes_sbox[(tmp>>16)&0xff]<<24;
220
+            tmp2|=(uint32_t)aes_sbox[(tmp>>24)     ];
221
+            tmp=tmp2^(((unsigned int)*ip)<<24);
222
+            ip++;
223
+        }
224
+
225
+        if ((words == 8) && ((i % words) == 4))
226
+        {
227
+            tmp2 =(uint32_t)aes_sbox[(tmp    )&0xff]    ;
228
+            tmp2|=(uint32_t)aes_sbox[(tmp>> 8)&0xff]<< 8;
229
+            tmp2|=(uint32_t)aes_sbox[(tmp>>16)&0xff]<<16;
230
+            tmp2|=(uint32_t)aes_sbox[(tmp>>24)     ]<<24;
231
+            tmp=tmp2;
232
+        }
233
+
234
+        W[i]=W[i-words]^tmp;
235
+    }
236
+
237
+    /* copy the iv across */
238
+    memcpy(ctx->iv, iv, 16);
239
+}
240
+
241
+/**
242
+ * Change a key for decryption.
243
+ */
244
+void AES_convert_key(AES_CTX *ctx)
245
+{
246
+    int i;
247
+    uint32_t *k,w,t1,t2,t3,t4;
248
+
249
+    k = ctx->ks;
250
+    k += 4;
251
+
252
+    for (i=ctx->rounds*4; i>4; i--)
253
+    {
254
+        w= *k;
255
+        w = inv_mix_col(w,t1,t2,t3,t4);
256
+        *k++ =w;
257
+    }
258
+}
259
+
260
+/**
261
+ * Encrypt a byte sequence (with a block size 16) using the AES cipher.
262
+ */
263
+void AES_cbc_encrypt(AES_CTX *ctx, const uint8_t *msg, uint8_t *out, int length)
264
+{
265
+    uint32_t tin0, tin1, tin2, tin3;
266
+    uint32_t tout0, tout1, tout2, tout3;
267
+    uint32_t tin[4];
268
+    uint32_t *iv = (uint32_t *)ctx->iv;
269
+    uint32_t *msg_32 = (uint32_t *)msg;
270
+    uint32_t *out_32 = (uint32_t *)out;
271
+
272
+    n2l(iv, tout0);
273
+    n2l(iv, tout1);
274
+    n2l(iv, tout2);
275
+    n2l(iv, tout3);
276
+    iv -= 4;
277
+
278
+    for (length -= 16; length >= 0; length -= 16)
279
+    {
280
+        n2l(msg_32, tin0);
281
+        n2l(msg_32, tin1);
282
+        n2l(msg_32, tin2);
283
+        n2l(msg_32, tin3);
284
+        tin[0] = tin0^tout0;
285
+        tin[1] = tin1^tout1;
286
+        tin[2] = tin2^tout2;
287
+        tin[3] = tin3^tout3;
288
+
289
+        AES_encrypt(ctx, tin);
290
+
291
+        tout0 = tin[0]; 
292
+        l2n(tout0, out_32);
293
+        tout1 = tin[1]; 
294
+        l2n(tout1, out_32);
295
+        tout2 = tin[2]; 
296
+        l2n(tout2, out_32);
297
+        tout3 = tin[3]; 
298
+        l2n(tout3, out_32);
299
+    }
300
+
301
+    l2n(tout0, iv);
302
+    l2n(tout1, iv);
303
+    l2n(tout2, iv);
304
+    l2n(tout3, iv);
305
+}
306
+
307
+/**
308
+ * Decrypt a byte sequence (with a block size 16) using the AES cipher.
309
+ */
310
+void AES_cbc_decrypt(AES_CTX *ctx, const uint8_t *msg, uint8_t *out, int length)
311
+{
312
+    uint32_t tin0, tin1, tin2, tin3;
313
+    uint32_t xor0,xor1,xor2,xor3;
314
+    uint32_t tout0,tout1,tout2,tout3;
315
+    uint32_t data[4];
316
+    uint32_t *iv = (uint32_t *)ctx->iv;
317
+    uint32_t *msg_32 = (uint32_t *)msg;
318
+    uint32_t *out_32 = (uint32_t *)out;
319
+
320
+    n2l(iv ,xor0);
321
+    n2l(iv, xor1);
322
+    n2l(iv, xor2);
323
+    n2l(iv, xor3);
324
+    iv -= 4;
325
+
326
+    for (length-=16; length >= 0; length -= 16)
327
+    {
328
+        n2l(msg_32, tin0);
329
+        n2l(msg_32, tin1);
330
+        n2l(msg_32, tin2);
331
+        n2l(msg_32, tin3);
332
+
333
+        data[0] = tin0;
334
+        data[1] = tin1;
335
+        data[2] = tin2;
336
+        data[3] = tin3;
337
+
338
+        AES_decrypt(ctx, data);
339
+
340
+        tout0 = data[0]^xor0;
341
+        tout1 = data[1]^xor1;
342
+        tout2 = data[2]^xor2;
343
+        tout3 = data[3]^xor3;
344
+
345
+        xor0 = tin0;
346
+        xor1 = tin1;
347
+        xor2 = tin2;
348
+        xor3 = tin3;
349
+
350
+        l2n(tout0, out_32);
351
+        l2n(tout1, out_32);
352
+        l2n(tout2, out_32);
353
+        l2n(tout3, out_32);
354
+    }
355
+
356
+    l2n(xor0, iv);
357
+    l2n(xor1, iv);
358
+    l2n(xor2, iv);
359
+    l2n(xor3, iv);
360
+}
361
+
362
+/**
363
+ * Encrypt a single block (16 bytes) of data
364
+ */
365
+static void AES_encrypt(const AES_CTX *ctx, uint32_t *data)
366
+{
367
+    /* To make this code smaller, generate the sbox entries on the fly.
368
+     * This will have a really heavy effect upon performance.
369
+     */
370
+    uint32_t tmp[4];
371
+    uint32_t tmp1, old_a0, a0, a1, a2, a3, row;
372
+    int curr_rnd;
373
+    int rounds = ctx->rounds; 
374
+    const uint32_t *k = ctx->ks;
375
+
376
+    /* Pre-round key addition */
377
+    for (row = 0; row < 4; row++)
378
+    {
379
+        data[row] ^= *(k++);
380
+    }
381
+
382
+    /* Encrypt one block. */
383
+    for (curr_rnd = 0; curr_rnd < rounds; curr_rnd++)
384
+    {
385
+        /* Perform ByteSub and ShiftRow operations together */
386
+        for (row = 0; row < 4; row++)
387
+        {
388
+            a0 = (uint32_t)aes_sbox[(data[row%4]>>24)&0xFF];
389
+            a1 = (uint32_t)aes_sbox[(data[(row+1)%4]>>16)&0xFF];
390
+            a2 = (uint32_t)aes_sbox[(data[(row+2)%4]>>8)&0xFF]; 
391
+            a3 = (uint32_t)aes_sbox[(data[(row+3)%4])&0xFF];
392
+
393
+            /* Perform MixColumn iff not last round */
394
+            if (curr_rnd < (rounds - 1))
395
+            {
396
+                tmp1 = a0 ^ a1 ^ a2 ^ a3;
397
+                old_a0 = a0;
398
+
399
+                a0 ^= tmp1 ^ AES_xtime(a0 ^ a1);
400
+                a1 ^= tmp1 ^ AES_xtime(a1 ^ a2);
401
+                a2 ^= tmp1 ^ AES_xtime(a2 ^ a3);
402
+                a3 ^= tmp1 ^ AES_xtime(a3 ^ old_a0);
403
+
404
+            }
405
+
406
+            tmp[row] = ((a0 << 24) | (a1 << 16) | (a2 << 8) | a3);
407
+        }
408
+
409
+        /* KeyAddition - note that it is vital that this loop is separate from
410
+           the MixColumn operation, which must be atomic...*/ 
411
+        for (row = 0; row < 4; row++)
412
+        {
413
+            data[row] = tmp[row] ^ *(k++);
414
+        }
415
+    }
416
+}
417
+
418
+/**
419
+ * Decrypt a single block (16 bytes) of data
420
+ */
421
+static void AES_decrypt(const AES_CTX *ctx, uint32_t *data)
422
+{ 
423
+    uint32_t tmp[4];
424
+    uint32_t xt0,xt1,xt2,xt3,xt4,xt5,xt6;
425
+    uint32_t a0, a1, a2, a3, row;
426
+    int curr_rnd;
427
+    int rounds = ctx->rounds;
428
+    uint32_t *k = (uint32_t*)ctx->ks + ((rounds+1)*4);
429
+
430
+    /* pre-round key addition */
431
+    for (row=4; row > 0;row--)
432
+    {
433
+        data[row-1] ^= *(--k);
434
+    }
435
+
436
+    /* Decrypt one block */
437
+    for (curr_rnd=0; curr_rnd < rounds; curr_rnd++)
438
+    {
439
+        /* Perform ByteSub and ShiftRow operations together */
440
+        for (row = 4; row > 0; row--)
441
+        {
442
+            a0 = aes_isbox[(data[(row+3)%4]>>24)&0xFF];
443
+            a1 = aes_isbox[(data[(row+2)%4]>>16)&0xFF];
444
+            a2 = aes_isbox[(data[(row+1)%4]>>8)&0xFF];
445
+            a3 = aes_isbox[(data[row%4])&0xFF];
446
+
447
+            /* Perform MixColumn iff not last round */
448
+            if (curr_rnd<(rounds-1))
449
+            {
450
+                /* The MDS cofefficients (0x09, 0x0B, 0x0D, 0x0E)
451
+                   are quite large compared to encryption; this 
452
+                   operation slows decryption down noticeably. */
453
+                xt0 = AES_xtime(a0^a1);
454
+                xt1 = AES_xtime(a1^a2);
455
+                xt2 = AES_xtime(a2^a3);
456
+                xt3 = AES_xtime(a3^a0);
457
+                xt4 = AES_xtime(xt0^xt1);
458
+                xt5 = AES_xtime(xt1^xt2);
459
+                xt6 = AES_xtime(xt4^xt5);
460
+
461
+                xt0 ^= a1^a2^a3^xt4^xt6;
462
+                xt1 ^= a0^a2^a3^xt5^xt6;
463
+                xt2 ^= a0^a1^a3^xt4^xt6;
464
+                xt3 ^= a0^a1^a2^xt5^xt6;
465
+                tmp[row-1] = ((xt0<<24)|(xt1<<16)|(xt2<<8)|xt3);
466
+            }
467
+            else
468
+                tmp[row-1] = ((a0<<24)|(a1<<16)|(a2<<8)|a3);
469
+        }
470
+
471
+        for (row = 4; row > 0; row--)
472
+        {
473
+            data[row-1] = tmp[row-1] ^ *(--k);
474
+        }
475
+    }
476
+}
477
+
478
+#endif

+ 93
- 0
src/crypto/axtls/bigint.h Wyświetl plik

@@ -0,0 +1,93 @@
1
+/*
2
+ *  Copyright(C) 2006 Cameron Rich
3
+ *
4
+ *  This library is free software; you can redistribute it and/or modify
5
+ *  it under the terms of the GNU Lesser General Public License as published by
6
+ *  the Free Software Foundation; either version 2 of the License, or
7
+ *  (at your option) any later version.
8
+ *
9
+ *  This library is distributed in the hope that it will be useful,
10
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
+ *  GNU Lesser General Public License for more details.
13
+ *
14
+ *  You should have received a copy of the GNU Lesser General Public License
15
+ *  along with this library; if not, write to the Free Software
16
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
+ */
18
+
19
+#ifndef BIGINT_HEADER
20
+#define BIGINT_HEADER
21
+
22
+#include "config.h"
23
+
24
+/* enable features based on a 'super-set' capbaility. */
25
+#if defined(CONFIG_SSL_FULL_MODE) 
26
+#define CONFIG_SSL_ENABLE_CLIENT
27
+#define CONFIG_SSL_CERT_VERIFICATION
28
+#elif defined(CONFIG_SSL_ENABLE_CLIENT)
29
+#define CONFIG_SSL_CERT_VERIFICATION
30
+#endif
31
+
32
+#include "os_port.h"
33
+#include "bigint_impl.h"
34
+
35
+#ifndef CONFIG_BIGINT_CHECK_ON
36
+#define check(A)                /**< disappears in normal production mode */
37
+#endif
38
+BI_CTX *bi_initialize(void);
39
+void bi_terminate(BI_CTX *ctx);
40
+void bi_permanent(bigint *bi);
41
+void bi_depermanent(bigint *bi);
42
+void bi_free(BI_CTX *ctx, bigint *bi);
43
+bigint *bi_copy(bigint *bi);
44
+bigint *bi_clone(BI_CTX *ctx, const bigint *bi);
45
+void bi_export(BI_CTX *ctx, bigint *bi, uint8_t *data, int size);
46
+bigint *bi_import(BI_CTX *ctx, const uint8_t *data, int len);
47
+bigint *int_to_bi(BI_CTX *ctx, comp i);
48
+
49
+/* the functions that actually do something interesting */
50
+bigint *bi_add(BI_CTX *ctx, bigint *bia, bigint *bib);
51
+bigint *bi_subtract(BI_CTX *ctx, bigint *bia, 
52
+        bigint *bib, int *is_negative);
53
+bigint *bi_divide(BI_CTX *ctx, bigint *bia, bigint *bim, int is_mod);
54
+bigint *bi_multiply(BI_CTX *ctx, bigint *bia, bigint *bib);
55
+bigint *bi_mod_power(BI_CTX *ctx, bigint *bi, bigint *biexp);
56
+bigint *bi_mod_power2(BI_CTX *ctx, bigint *bi, bigint *bim, bigint *biexp);
57
+int bi_compare(bigint *bia, bigint *bib);
58
+void bi_set_mod(BI_CTX *ctx, bigint *bim, int mod_offset);
59
+void bi_free_mod(BI_CTX *ctx, int mod_offset);
60
+
61
+#ifdef CONFIG_SSL_FULL_MODE
62
+void bi_print(const char *label, bigint *bi);
63
+bigint *bi_str_import(BI_CTX *ctx, const char *data);
64
+#endif
65
+
66
+/**
67
+ * @def bi_mod
68
+ * Find the residue of B. bi_set_mod() must be called before hand.
69
+ */
70
+#define bi_mod(A, B)      bi_divide(A, B, ctx->bi_mod[ctx->mod_offset], 1)
71
+
72
+/**
73
+ * bi_residue() is technically the same as bi_mod(), but it uses the
74
+ * appropriate reduction technique (which is bi_mod() when doing classical
75
+ * reduction).
76
+ */
77
+#if defined(CONFIG_BIGINT_CLASSICAL)
78
+#define bi_residue(A, B)         bi_mod(A, B)
79
+#elif defined(CONFIG_BIGINT_BARRETT)
80
+#define bi_residue(A, B)         bi_barrett(A, B)
81
+bigint *bi_barrett(BI_CTX *ctx, bigint *bi);
82
+#else   /* CONFIG_BIGINT_MONTGOMERY */
83
+#define bi_residue(A, B)         bi_mont(A, B)
84
+bigint *bi_mont(BI_CTX *ctx, bigint *bixy);
85
+#endif
86
+
87
+#ifdef CONFIG_BIGINT_SQUARE
88
+bigint *bi_square(BI_CTX *ctx, bigint *bi);
89
+#else
90
+#define bi_square(A, B)     bi_multiply(A, bi_copy(B), B)
91
+#endif
92
+
93
+#endif

+ 105
- 0
src/crypto/axtls/bigint_impl.h Wyświetl plik

@@ -0,0 +1,105 @@
1
+/*
2
+ *  Copyright(C) 2006 Cameron Rich
3
+ *
4
+ *  This library is free software; you can redistribute it and/or modify
5
+ *  it under the terms of the GNU Lesser General Public License as published by
6
+ *  the Free Software Foundation; either version 2.1 of the License, or
7
+ *  (at your option) any later version.
8
+ *
9
+ *  This library is distributed in the hope that it will be useful,
10
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
+ *  GNU Lesser General Public License for more details.
13
+ *
14
+ *  You should have received a copy of the GNU Lesser General Public License
15
+ *  along with this library; if not, write to the Free Software
16
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
+ */
18
+
19
+#ifndef BIGINT_IMPL_HEADER
20
+#define BIGINT_IMPL_HEADER
21
+
22
+/* Maintain a number of precomputed variables when doing reduction */
23
+#define BIGINT_M_OFFSET     0    /**< Normal modulo offset. */
24
+#ifdef CONFIG_BIGINT_CRT
25
+#define BIGINT_P_OFFSET     1    /**< p modulo offset. */
26
+#define BIGINT_Q_OFFSET     2    /**< q module offset. */
27
+#define BIGINT_NUM_MODS     3    /**< The number of modulus constants used. */
28
+#else
29
+#define BIGINT_NUM_MODS     1    
30
+#endif
31
+
32
+/* Architecture specific functions for big ints */
33
+#ifdef WIN32
34
+#define COMP_RADIX          4294967296i64         
35
+#define COMP_BIG_MSB        0x8000000000000000i64 
36
+#else
37
+#define COMP_RADIX          4294967296ULL         /**< Max component + 1 */
38
+#define COMP_BIG_MSB        0x8000000000000000ULL /**< (Max dbl comp + 1)/ 2 */
39
+#endif
40
+#define COMP_BIT_SIZE       32  /**< Number of bits in a component. */
41
+#define COMP_BYTE_SIZE      4   /**< Number of bytes in a component. */
42
+#define COMP_NUM_NIBBLES    8   /**< Used For diagnostics only. */
43
+
44
+typedef uint32_t comp;	        /**< A single precision component. */
45
+typedef uint64_t long_comp;     /**< A double precision component. */
46
+typedef int64_t slong_comp;     /**< A signed double precision component. */
47
+
48
+/**
49
+ * @struct  _bigint
50
+ * @brief A big integer basic object
51
+ */
52
+struct _bigint
53
+{
54
+    struct _bigint* next;       /**< The next bigint in the cache. */
55
+    short size;                 /**< The number of components in this bigint. */
56
+    short max_comps;            /**< The heapsize allocated for this bigint */
57
+    int refs;                   /**< An internal reference count. */
58
+    comp* comps;                /**< A ptr to the actual component data */
59
+};
60
+
61
+typedef struct _bigint bigint;  /**< An alias for _bigint */
62
+
63
+/**
64
+ * Maintains the state of the cache, and a number of variables used in 
65
+ * reduction.
66
+ */
67
+typedef struct /**< A big integer "session" context. */
68
+{
69
+    bigint *active_list;                    /**< Bigints currently used. */
70
+    bigint *free_list;                      /**< Bigints not used. */
71
+    bigint *bi_radix;                       /**< The radix used. */
72
+    bigint *bi_mod[BIGINT_NUM_MODS];        /**< modulus */
73
+
74
+#if defined(CONFIG_BIGINT_MONTGOMERY)
75
+    bigint *bi_RR_mod_m[BIGINT_NUM_MODS];   /**< R^2 mod m */
76
+    bigint *bi_R_mod_m[BIGINT_NUM_MODS];    /**< R mod m */
77
+    comp N0_dash[BIGINT_NUM_MODS];
78
+#elif defined(CONFIG_BIGINT_BARRETT)
79
+    bigint *bi_mu[BIGINT_NUM_MODS];         /**< Storage for mu */
80
+#endif
81
+    bigint *bi_normalised_mod[BIGINT_NUM_MODS]; /**< Normalised mod storage. */
82
+    bigint **g;                 /**< Used by sliding-window. */
83
+    int window;                 /**< The size of the sliding window */
84
+    int active_count;           /**< Number of active bigints. */
85
+    int free_count;             /**< Number of free bigints. */
86
+
87
+#ifdef CONFIG_BIGINT_MONTGOMERY
88
+    uint8_t use_classical;      /**< Use classical reduction. */
89
+#endif
90
+    uint8_t mod_offset;         /**< The mod offset we are using */
91
+} BI_CTX;
92
+
93
+#ifndef WIN32
94
+#define max(a,b) ((a)>(b)?(a):(b))  /**< Find the maximum of 2 numbers. */
95
+#define min(a,b) ((a)<(b)?(a):(b))  /**< Find the minimum of 2 numbers. */
96
+#endif
97
+
98
+#define PERMANENT           0x7FFF55AA  /**< A magic number for permanents. */
99
+
100
+#define V1      v->comps[v->size-1]                 /**< v1 for division */
101
+#define V2      v->comps[v->size-2]                 /**< v2 for division */
102
+#define U(j)    tmp_u->comps[tmp_u->size-j-1]       /**< uj for division */
103
+#define Q(j)    quotient->comps[quotient->size-j-1] /**< qj for division */
104
+
105
+#endif

+ 293
- 0
src/crypto/axtls/crypto.h Wyświetl plik

@@ -0,0 +1,293 @@
1
+/*
2
+ *  Copyright(C) 2006 Cameron Rich
3
+ *
4
+ *  This library is free software; you can redistribute it and/or modify
5
+ *  it under the terms of the GNU Lesser General Public License as published by
6
+ *  the Free Software Foundation; either version 2 of the License, or
7
+ *  (at your option) any later version.
8
+ *
9
+ *  This library is distributed in the hope that it will be useful,
10
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
+ *  GNU Lesser General Public License for more details.
13
+ *
14
+ *  You should have received a copy of the GNU Lesser General Public License
15
+ *  along with this library; if not, write to the Free Software
16
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
+ */
18
+
19
+/**
20
+ * @file crypto.h
21
+ */
22
+
23
+#ifndef HEADER_CRYPTO_H
24
+#define HEADER_CRYPTO_H
25
+
26
+#ifdef __cplusplus
27
+extern "C" {
28
+#endif
29
+
30
+#include "bigint.h"
31
+
32
+/**************************************************************************
33
+ * AES declarations 
34
+ **************************************************************************/
35
+
36
+#define AES_MAXROUNDS			14
37
+
38
+typedef struct aes_key_st 
39
+{
40
+    uint16_t rounds;
41
+    uint16_t key_size;
42
+    uint32_t ks[(AES_MAXROUNDS+1)*8];
43
+    uint8_t iv[16];
44
+} AES_CTX;
45
+
46
+typedef enum
47
+{
48
+    AES_MODE_128,
49
+    AES_MODE_256
50
+} AES_MODE;
51
+
52
+void AES_set_key(AES_CTX *ctx, const uint8_t *key, 
53
+        const uint8_t *iv, AES_MODE mode);
54
+void AES_cbc_encrypt(AES_CTX *ctx, const uint8_t *msg, 
55
+        uint8_t *out, int length);
56
+void AES_cbc_decrypt(AES_CTX *ks, const uint8_t *in, uint8_t *out, int length);
57
+void AES_convert_key(AES_CTX *ctx);
58
+
59
+/**************************************************************************
60
+ * RC4 declarations 
61
+ **************************************************************************/
62
+
63
+typedef struct 
64
+{
65
+    int x, y, m[256];
66
+} RC4_CTX;
67
+
68
+void RC4_setup(RC4_CTX *s, const uint8_t *key, int length);
69
+void RC4_crypt(RC4_CTX *s, const uint8_t *msg, uint8_t *data, int length);
70
+
71
+/**************************************************************************
72
+ * SHA1 declarations 
73
+ **************************************************************************/
74
+
75
+#define SHA1_SIZE   20
76
+
77
+/*
78
+ *  This structure will hold context information for the SHA-1
79
+ *  hashing operation
80
+ */
81
+typedef struct 
82
+{
83
+    uint32_t Intermediate_Hash[SHA1_SIZE/4]; /* Message Digest  */
84
+    uint32_t Length_Low;            /* Message length in bits      */
85
+    uint32_t Length_High;           /* Message length in bits      */
86
+    uint16_t Message_Block_Index;   /* Index into message block array   */
87
+    uint8_t Message_Block[64];      /* 512-bit message blocks      */
88
+} SHA1_CTX;
89
+
90
+void SHA1Init(SHA1_CTX *);
91
+void SHA1Update(SHA1_CTX *, const uint8_t * msg, int len);
92
+void SHA1Final(SHA1_CTX *, uint8_t *digest);
93
+
94
+/**************************************************************************
95
+ * MD5 declarations 
96
+ **************************************************************************/
97
+
98
+/* MD5 context. */
99
+
100
+#define MD5_SIZE    16
101
+
102
+typedef struct 
103
+{
104
+  uint32_t state[4];        /* state (ABCD) */
105
+  uint32_t count[2];        /* number of bits, modulo 2^64 (lsb first) */
106
+  uint8_t buffer[64];       /* input buffer */
107
+} MD5_CTX;
108
+
109
+void MD5Init(MD5_CTX *);
110
+void MD5Update(MD5_CTX *, const uint8_t *msg, int len);
111
+void MD5Final(MD5_CTX *, uint8_t *digest);
112
+
113
+/**************************************************************************
114
+ * HMAC declarations 
115
+ **************************************************************************/
116
+void hmac_md5(const uint8_t *msg, int length, const uint8_t *key, 
117
+        int key_len, uint8_t *digest);
118
+void hmac_sha1(const uint8_t *msg, int length, const uint8_t *key, 
119
+        int key_len, uint8_t *digest);
120
+
121
+/**************************************************************************
122
+ * RNG declarations 
123
+ **************************************************************************/
124
+void RNG_initialize(const uint8_t *seed_buf, int size);
125
+void RNG_terminate(void);
126
+void get_random(int num_rand_bytes, uint8_t *rand_data);
127
+void get_random_NZ(int num_rand_bytes, uint8_t *rand_data);
128
+
129
+/**************************************************************************
130
+ * RSA declarations 
131
+ **************************************************************************/
132
+
133
+typedef struct 
134
+{
135
+    bigint *m;              /* modulus */
136
+    bigint *e;              /* public exponent */
137
+    bigint *d;              /* private exponent */
138
+#ifdef CONFIG_BIGINT_CRT
139
+    bigint *p;              /* p as in m = pq */
140
+    bigint *q;              /* q as in m = pq */
141
+    bigint *dP;             /* d mod (p-1) */
142
+    bigint *dQ;             /* d mod (q-1) */
143
+    bigint *qInv;           /* q^-1 mod p */
144
+#endif
145
+    int num_octets;
146
+    bigint *sig_m;         /* signature modulus */
147
+    BI_CTX *bi_ctx;
148
+} RSA_CTX;
149
+
150
+void RSA_priv_key_new(RSA_CTX **rsa_ctx, 
151
+        const uint8_t *modulus, int mod_len,
152
+        const uint8_t *pub_exp, int pub_len,
153
+        const uint8_t *priv_exp, int priv_len
154
+#ifdef CONFIG_BIGINT_CRT
155
+      , const uint8_t *p, int p_len,
156
+        const uint8_t *q, int q_len,
157
+        const uint8_t *dP, int dP_len,
158
+        const uint8_t *dQ, int dQ_len,
159
+        const uint8_t *qInv, int qInv_len
160
+#endif
161
+        );
162
+void RSA_pub_key_new(RSA_CTX **rsa_ctx, 
163
+        const uint8_t *modulus, int mod_len,
164
+        const uint8_t *pub_exp, int pub_len);
165
+void RSA_free(RSA_CTX *ctx);
166
+int RSA_decrypt(RSA_CTX *ctx, const uint8_t *in_data, uint8_t *out_data,
167
+        int is_decryption);
168
+bigint *RSA_private(RSA_CTX *c, bigint *bi_msg);
169
+#ifdef CONFIG_SSL_CERT_VERIFICATION
170
+bigint *RSA_raw_sign_verify(RSA_CTX *c, bigint *bi_msg);
171
+bigint *RSA_sign_verify(BI_CTX *ctx, const uint8_t *sig, int sig_len,
172
+        bigint *modulus, bigint *pub_exp);
173
+bigint *RSA_public(RSA_CTX *c, bigint *bi_msg);
174
+int RSA_encrypt(RSA_CTX *ctx, const uint8_t *in_data, uint16_t in_len, 
175
+        uint8_t *out_data, int is_signing);
176
+void RSA_print(const RSA_CTX *ctx);
177
+#endif
178
+
179
+/**************************************************************************
180
+ * ASN1 declarations 
181
+ **************************************************************************/
182
+#define X509_OK                             0
183
+#define X509_NOT_OK                         -1
184
+#define X509_VFY_ERROR_NO_TRUSTED_CERT      -2
185
+#define X509_VFY_ERROR_BAD_SIGNATURE        -3      
186
+#define X509_VFY_ERROR_NOT_YET_VALID        -4
187
+#define X509_VFY_ERROR_EXPIRED              -5
188
+#define X509_VFY_ERROR_SELF_SIGNED          -6
189
+#define X509_VFY_ERROR_INVALID_CHAIN        -7
190
+#define X509_VFY_ERROR_UNSUPPORTED_DIGEST   -8
191
+#define X509_INVALID_PRIV_KEY               -9
192
+
193
+/*
194
+ * The Distinguished Name
195
+ */
196
+#define X509_NUM_DN_TYPES                   3
197
+#define X509_COMMON_NAME                    0
198
+#define X509_ORGANIZATION                   1
199
+#define X509_ORGANIZATIONAL_TYPE            2
200
+
201
+#define ASN1_INTEGER            0x02
202
+#define ASN1_BIT_STRING         0x03
203
+#define ASN1_OCTET_STRING       0x04
204
+#define ASN1_NULL               0x05
205
+#define ASN1_OID                0x06
206
+#define ASN1_PRINTABLE_STR      0x13
207
+#define ASN1_TELETEX_STR        0x14
208
+#define ASN1_IA5_STR            0x16
209
+#define ASN1_UTC_TIME           0x17
210
+#define ASN1_SEQUENCE           0x30
211
+#define ASN1_SET                0x31
212
+#define ASN1_IMPLICIT_TAG       0x80
213
+#define ASN1_EXPLICIT_TAG       0xa0
214
+
215
+#define SALT_SIZE               8
216
+
217
+struct _x509_ctx
218
+{
219
+    char *ca_cert_dn[X509_NUM_DN_TYPES];
220
+    char *cert_dn[X509_NUM_DN_TYPES];
221
+#if defined(_WIN32_WCE)
222
+    long not_before;
223
+    long not_after;
224
+#else
225
+    time_t not_before;
226
+    time_t not_after;
227
+#endif
228
+    uint8_t *signature;
229
+    uint16_t sig_len;
230
+    uint8_t sig_type;
231
+    RSA_CTX *rsa_ctx;
232
+    bigint *digest;
233
+    struct _x509_ctx *next;
234
+};
235
+
236
+typedef struct _x509_ctx X509_CTX;
237
+
238
+#ifdef CONFIG_SSL_CERT_VERIFICATION
239
+typedef struct 
240
+{
241
+    X509_CTX *cert[CONFIG_X509_MAX_CA_CERTS];
242
+} CA_CERT_CTX;
243
+#endif
244
+
245
+int asn1_get_private_key(const uint8_t *buf, int len, RSA_CTX **rsa_ctx);
246
+int asn1_next_obj(const uint8_t *buf, int *offset, int obj_type);
247
+int asn1_skip_obj(const uint8_t *buf, int *offset, int obj_type);
248
+int asn1_get_int(const uint8_t *buf, int *offset, uint8_t **object);
249
+int x509_new(const uint8_t *cert, int *len, X509_CTX **ctx);
250
+void x509_free(X509_CTX *x509_ctx);
251
+#ifdef CONFIG_SSL_CERT_VERIFICATION
252
+int x509_verify(const CA_CERT_CTX *ca_cert_ctx, const X509_CTX *cert);
253
+const uint8_t *x509_get_signature(const uint8_t *asn1_signature, int *len);
254
+#endif
255
+#ifdef CONFIG_SSL_FULL_MODE
256
+void x509_print(CA_CERT_CTX *ca_cert_ctx, const X509_CTX *cert);
257
+void x509_display_error(int error);
258
+#endif
259
+
260
+/**************************************************************************
261
+ * MISC declarations 
262
+ **************************************************************************/
263
+
264
+extern const char * const unsupported_str;
265
+
266
+typedef void (*crypt_func)(void *, const uint8_t *, uint8_t *, int);
267
+typedef void (*hmac_func)(const uint8_t *msg, int length, const uint8_t *key, 
268
+        int key_len, uint8_t *digest);
269
+
270
+typedef struct
271
+{
272
+    uint8_t *pre_data;	/* include the ssl record bytes */
273
+    uint8_t *data;	/* the regular ssl data */
274
+    int max_len;
275
+    int index;
276
+} BUF_MEM;
277
+
278
+BUF_MEM buf_new(void);
279
+void buf_grow(BUF_MEM *bm, int len);
280
+void buf_free(BUF_MEM *bm);
281
+int get_file(const char *filename, uint8_t **buf);
282
+
283
+#if defined(CONFIG_SSL_FULL_MODE) || defined(WIN32) || defined(CONFIG_DEBUG)
284
+void print_blob(const char *format, const uint8_t *data, int size, ...);
285
+#else
286
+    #define print_blob(...)
287
+#endif
288
+
289
+#ifdef __cplusplus
290
+}
291
+#endif
292
+
293
+#endif 

Ładowanie…
Anuluj
Zapisz