Staging: rt2860: remove dead RT_BIG_ENDIAN code
[linux-2.6] / drivers / staging / rt2860 / common / md5.c
1 /*
2  *************************************************************************
3  * Ralink Tech Inc.
4  * 5F., No.36, Taiyuan St., Jhubei City,
5  * Hsinchu County 302,
6  * Taiwan, R.O.C.
7  *
8  * (c) Copyright 2002-2007, Ralink Technology, Inc.
9  *
10  * This program is free software; you can redistribute it and/or modify  *
11  * it under the terms of the GNU General Public License as published by  *
12  * the Free Software Foundation; either version 2 of the License, or     *
13  * (at your option) any later version.                                   *
14  *                                                                       *
15  * This program is distributed in the hope that it will be useful,       *
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
18  * GNU General Public License for more details.                          *
19  *                                                                       *
20  * You should have received a copy of the GNU General Public License     *
21  * along with this program; if not, write to the                         *
22  * Free Software Foundation, Inc.,                                       *
23  * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
24  *                                                                       *
25  *************************************************************************
26
27     Module Name:
28     md5.c
29
30         Abstract:
31
32         Revision History:
33         Who                     When                    What
34         --------        ----------              ----------------------------------------------
35         Name            Date                    Modification logs
36         jan                     10-28-03                Initial
37         Rita            11-23-04                Modify MD5 and SHA-1
38         Rita            10-14-05                Modify SHA-1 in big-endian platform
39  */
40 #include "../rt_config.h"
41
42 /**
43  * md5_mac:
44  * @key: pointer to     the     key     used for MAC generation
45  * @key_len: length     of the key in bytes
46  * @data: pointer to the data area for which the MAC is generated
47  * @data_len: length of the     data in bytes
48  * @mac: pointer to     the     buffer holding space for the MAC; the buffer should
49  * have space for 128-bit (16 bytes) MD5 hash value
50  *
51  * md5_mac() determines the     message authentication code     by using secure hash
52  * MD5(key | data |     key).
53  */
54 void md5_mac(u8 *key, size_t key_len, u8 *data, size_t data_len, u8 *mac)
55 {
56         MD5_CTX context;
57
58         MD5Init(&context);
59         MD5Update(&context,     key, key_len);
60         MD5Update(&context,     data, data_len);
61         MD5Update(&context,     key, key_len);
62         MD5Final(mac, &context);
63 }
64
65 /**
66  * hmac_md5:
67  * @key: pointer to     the     key     used for MAC generation
68  * @key_len: length     of the key in bytes
69  * @data: pointer to the data area for which the MAC is generated
70  * @data_len: length of the     data in bytes
71  * @mac: pointer to     the     buffer holding space for the MAC; the buffer should
72  * have space for 128-bit (16 bytes) MD5 hash value
73  *
74  * hmac_md5() determines the message authentication     code using HMAC-MD5.
75  * This implementation is based on the sample code presented in RFC     2104.
76  */
77 void hmac_md5(u8 *key, size_t key_len, u8 *data, size_t data_len, u8 *mac)
78 {
79         MD5_CTX context;
80     u8 k_ipad[65]; /* inner padding - key XORd with ipad */
81     u8 k_opad[65]; /* outer padding - key XORd with opad */
82     u8 tk[16];
83         int     i;
84
85         //assert(key != NULL && data != NULL && mac != NULL);
86
87         /* if key is longer     than 64 bytes reset     it to key =     MD5(key) */
88         if (key_len     > 64) {
89                 MD5_CTX ttcontext;
90
91                 MD5Init(&ttcontext);
92                 MD5Update(&ttcontext, key, key_len);
93                 MD5Final(tk, &ttcontext);
94                 //key=(PUCHAR)ttcontext.buf;
95                 key     = tk;
96                 key_len = 16;
97         }
98
99         /* the HMAC_MD5 transform looks like:
100          *
101          * MD5(K XOR opad, MD5(K XOR ipad, text))
102          *
103          * where K is an n byte key
104          * ipad is the byte     0x36 repeated 64 times
105          * opad is the byte     0x5c repeated 64 times
106          * and text     is the data     being protected */
107
108         /* start out by storing key     in pads */
109         NdisZeroMemory(k_ipad, sizeof(k_ipad));
110         NdisZeroMemory(k_opad,  sizeof(k_opad));
111         //assert(key_len < sizeof(k_ipad));
112         NdisMoveMemory(k_ipad, key,     key_len);
113         NdisMoveMemory(k_opad, key,     key_len);
114
115         /* XOR key with ipad and opad values */
116         for     (i = 0; i <     64;     i++) {
117                 k_ipad[i] ^= 0x36;
118                 k_opad[i] ^= 0x5c;
119         }
120
121         /* perform inner MD5 */
122         MD5Init(&context);                                       /*     init context for 1st pass */
123         MD5Update(&context,     k_ipad, 64);     /*     start with inner pad */
124         MD5Update(&context,     data, data_len); /*     then text of datagram */
125         MD5Final(mac, &context);                         /*     finish up 1st pass */
126
127         /* perform outer MD5 */
128         MD5Init(&context);                                       /*     init context for 2nd pass */
129         MD5Update(&context,     k_opad, 64);     /*     start with outer pad */
130         MD5Update(&context,     mac, 16);                /*     then results of 1st     hash */
131         MD5Final(mac, &context);                         /*     finish up 2nd pass */
132 }
133
134 #define byteReverse(buf, len)   /* Nothing */
135
136 /* ==========================  MD5 implementation =========================== */
137 // four base functions for MD5
138 #define MD5_F1(x, y, z) (((x) & (y)) | ((~x) & (z)))
139 #define MD5_F2(x, y, z) (((x) & (z)) | ((y) & (~z)))
140 #define MD5_F3(x, y, z) ((x) ^ (y) ^ (z))
141 #define MD5_F4(x, y, z) ((y) ^ ((x) | (~z)))
142 #define CYCLIC_LEFT_SHIFT(w, s) (((w) << (s)) | ((w) >> (32-(s))))
143
144 #define MD5Step(f, w, x, y,     z, data, t, s)  \
145         ( w     += f(x, y, z) + data + t,  w = (CYCLIC_LEFT_SHIFT(w, s)) & 0xffffffff, w +=     x )
146
147
148 /*
149  *  Function Description:
150  *      Initiate MD5 Context satisfied in RFC 1321
151  *
152  *  Arguments:
153  *      pCtx        Pointer     to MD5 context
154  *
155  *  Return Value:
156  *      None
157  */
158 VOID MD5Init(MD5_CTX *pCtx)
159 {
160     pCtx->Buf[0]=0x67452301;
161     pCtx->Buf[1]=0xefcdab89;
162     pCtx->Buf[2]=0x98badcfe;
163     pCtx->Buf[3]=0x10325476;
164
165     pCtx->LenInBitCount[0]=0;
166     pCtx->LenInBitCount[1]=0;
167 }
168
169
170 /*
171  *  Function Description:
172  *      Update MD5 Context, allow of an arrary of octets as the next portion
173  *      of the message
174  *
175  *  Arguments:
176  *      pCtx            Pointer to MD5 context
177  *          pData       Pointer to input data
178  *      LenInBytes  The length of input data (unit: byte)
179  *
180  *  Return Value:
181  *      None
182  *
183  *  Note:
184  *      Called after MD5Init or MD5Update(itself)
185  */
186 VOID MD5Update(MD5_CTX *pCtx, UCHAR *pData, UINT32 LenInBytes)
187 {
188
189     UINT32 TfTimes;
190     UINT32 temp;
191         unsigned int i;
192
193     temp = pCtx->LenInBitCount[0];
194
195     pCtx->LenInBitCount[0] = (UINT32) (pCtx->LenInBitCount[0] + (LenInBytes << 3));
196
197     if (pCtx->LenInBitCount[0] < temp)
198         pCtx->LenInBitCount[1]++;   //carry in
199
200     pCtx->LenInBitCount[1] += LenInBytes >> 29;
201
202     // mod 64 bytes
203     temp = (temp >> 3) & 0x3f;
204
205     // process lacks of 64-byte data
206     if (temp)
207     {
208         UCHAR *pAds = (UCHAR *) pCtx->Input + temp;
209
210         if ((temp+LenInBytes) < 64)
211         {
212             NdisMoveMemory(pAds, (UCHAR *)pData, LenInBytes);
213             return;
214         }
215
216         NdisMoveMemory(pAds, (UCHAR *)pData, 64-temp);
217         byteReverse(pCtx->Input, 16);
218         MD5Transform(pCtx->Buf, (UINT32 *)pCtx->Input);
219
220         pData += 64-temp;
221         LenInBytes -= 64-temp;
222     } // end of if (temp)
223
224
225     TfTimes = (LenInBytes >> 6);
226
227     for (i=TfTimes; i>0; i--)
228     {
229         NdisMoveMemory(pCtx->Input, (UCHAR *)pData, 64);
230         byteReverse(pCtx->Input, 16);
231         MD5Transform(pCtx->Buf, (UINT32 *)pCtx->Input);
232         pData += 64;
233         LenInBytes -= 64;
234     } // end of for
235
236     // buffering lacks of 64-byte data
237     if(LenInBytes)
238         NdisMoveMemory(pCtx->Input, (UCHAR *)pData, LenInBytes);
239
240 }
241
242
243 /*
244  *  Function Description:
245  *      Append padding bits and length of original message in the tail
246  *      The message digest has to be completed in the end
247  *
248  *  Arguments:
249  *      Digest          Output of Digest-Message for MD5
250  *      pCtx        Pointer     to MD5 context
251  *
252  *  Return Value:
253  *      None
254  *
255  *  Note:
256  *      Called after MD5Update
257  */
258 VOID MD5Final(UCHAR Digest[16], MD5_CTX *pCtx)
259 {
260     UCHAR Remainder;
261     UCHAR PadLenInBytes;
262     UCHAR *pAppend=0;
263     unsigned int i;
264
265     Remainder = (UCHAR)((pCtx->LenInBitCount[0] >> 3) & 0x3f);
266
267     PadLenInBytes = (Remainder < 56) ? (56-Remainder) : (120-Remainder);
268
269     pAppend = (UCHAR *)pCtx->Input + Remainder;
270
271     // padding bits without crossing block(64-byte based) boundary
272     if (Remainder < 56)
273     {
274         *pAppend = 0x80;
275         PadLenInBytes --;
276
277         NdisZeroMemory((UCHAR *)pCtx->Input + Remainder+1, PadLenInBytes);
278
279                 // add data-length field, from low to high
280         for (i=0; i<4; i++)
281         {
282                 pCtx->Input[56+i] = (UCHAR)((pCtx->LenInBitCount[0] >> (i << 3)) & 0xff);
283                 pCtx->Input[60+i] = (UCHAR)((pCtx->LenInBitCount[1] >> (i << 3)) & 0xff);
284         }
285
286         byteReverse(pCtx->Input, 16);
287         MD5Transform(pCtx->Buf, (UINT32 *)pCtx->Input);
288     } // end of if
289
290     // padding bits with crossing block(64-byte based) boundary
291     else
292     {
293         // the first block ===
294         *pAppend = 0x80;
295         PadLenInBytes --;
296
297         NdisZeroMemory((UCHAR *)pCtx->Input + Remainder+1, (64-Remainder-1));
298         PadLenInBytes -= (64 - Remainder - 1);
299
300         byteReverse(pCtx->Input, 16);
301         MD5Transform(pCtx->Buf, (UINT32 *)pCtx->Input);
302
303
304         // the second block ===
305         NdisZeroMemory((UCHAR *)pCtx->Input, PadLenInBytes);
306
307         // add data-length field
308         for (i=0; i<4; i++)
309         {
310                 pCtx->Input[56+i] = (UCHAR)((pCtx->LenInBitCount[0] >> (i << 3)) & 0xff);
311                 pCtx->Input[60+i] = (UCHAR)((pCtx->LenInBitCount[1] >> (i << 3)) & 0xff);
312         }
313
314         byteReverse(pCtx->Input, 16);
315         MD5Transform(pCtx->Buf, (UINT32 *)pCtx->Input);
316     } // end of else
317
318
319     NdisMoveMemory((UCHAR *)Digest, (UINT32 *)pCtx->Buf, 16); // output
320     byteReverse((UCHAR *)Digest, 4);
321     NdisZeroMemory(pCtx, sizeof(pCtx)); // memory free
322 }
323
324
325 /*
326  *  Function Description:
327  *      The central algorithm of MD5, consists of four rounds and sixteen
328  *      steps per round
329  *
330  *  Arguments:
331  *      Buf     Buffers of four states (output: 16 bytes)
332  *          Mes     Input data (input: 64 bytes)
333  *
334  *  Return Value:
335  *      None
336  *
337  *  Note:
338  *      Called by MD5Update or MD5Final
339  */
340 VOID MD5Transform(UINT32 Buf[4], UINT32 Mes[16])
341 {
342     UINT32 Reg[4], Temp;
343         unsigned int i;
344
345     static UCHAR LShiftVal[16] =
346     {
347         7, 12, 17, 22,
348                 5, 9 , 14, 20,
349                 4, 11, 16, 23,
350                 6, 10, 15, 21,
351         };
352
353
354         // [equal to 4294967296*abs(sin(index))]
355     static UINT32 MD5Table[64] =
356         {
357                 0xd76aa478,     0xe8c7b756,     0x242070db,     0xc1bdceee,
358                 0xf57c0faf,     0x4787c62a,     0xa8304613, 0xfd469501,
359                 0x698098d8,     0x8b44f7af,     0xffff5bb1,     0x895cd7be,
360         0x6b901122,     0xfd987193,     0xa679438e,     0x49b40821,
361
362         0xf61e2562,     0xc040b340,     0x265e5a51,     0xe9b6c7aa,
363         0xd62f105d,     0x02441453,     0xd8a1e681,     0xe7d3fbc8,
364         0x21e1cde6,     0xc33707d6,     0xf4d50d87,     0x455a14ed,
365         0xa9e3e905,     0xfcefa3f8,     0x676f02d9,     0x8d2a4c8a,
366
367         0xfffa3942,     0x8771f681,     0x6d9d6122,     0xfde5380c,
368         0xa4beea44,     0x4bdecfa9,     0xf6bb4b60,     0xbebfbc70,
369         0x289b7ec6,     0xeaa127fa,     0xd4ef3085,     0x04881d05,
370         0xd9d4d039,     0xe6db99e5,     0x1fa27cf8,     0xc4ac5665,
371
372         0xf4292244,     0x432aff97,     0xab9423a7,     0xfc93a039,
373                 0x655b59c3,     0x8f0ccc92,     0xffeff47d,     0x85845dd1,
374         0x6fa87e4f,     0xfe2ce6e0,     0xa3014314,     0x4e0811a1,
375         0xf7537e82,     0xbd3af235,     0x2ad7d2bb,     0xeb86d391
376         };
377
378
379     for (i=0; i<4; i++)
380         Reg[i]=Buf[i];
381
382
383     // 64 steps in MD5 algorithm
384     for (i=0; i<16; i++)
385     {
386         MD5Step(MD5_F1, Reg[0], Reg[1], Reg[2], Reg[3], Mes[i],
387                 MD5Table[i], LShiftVal[i & 0x3]);
388
389         // one-word right shift
390         Temp   = Reg[3];
391         Reg[3] = Reg[2];
392         Reg[2] = Reg[1];
393         Reg[1] = Reg[0];
394         Reg[0] = Temp;
395     }
396     for (i=16; i<32; i++)
397     {
398         MD5Step(MD5_F2, Reg[0], Reg[1], Reg[2], Reg[3], Mes[(5*(i & 0xf)+1) & 0xf],
399                 MD5Table[i], LShiftVal[(0x1 << 2)+(i & 0x3)]);
400
401         // one-word right shift
402         Temp   = Reg[3];
403         Reg[3] = Reg[2];
404         Reg[2] = Reg[1];
405         Reg[1] = Reg[0];
406         Reg[0] = Temp;
407     }
408     for (i=32; i<48; i++)
409     {
410         MD5Step(MD5_F3, Reg[0], Reg[1], Reg[2], Reg[3], Mes[(3*(i & 0xf)+5) & 0xf],
411                 MD5Table[i], LShiftVal[(0x1 << 3)+(i & 0x3)]);
412
413         // one-word right shift
414         Temp   = Reg[3];
415         Reg[3] = Reg[2];
416         Reg[2] = Reg[1];
417         Reg[1] = Reg[0];
418         Reg[0] = Temp;
419     }
420     for (i=48; i<64; i++)
421     {
422         MD5Step(MD5_F4, Reg[0], Reg[1], Reg[2], Reg[3], Mes[(7*(i & 0xf)) & 0xf],
423                 MD5Table[i], LShiftVal[(0x3 << 2)+(i & 0x3)]);
424
425         // one-word right shift
426         Temp   = Reg[3];
427         Reg[3] = Reg[2];
428         Reg[2] = Reg[1];
429         Reg[1] = Reg[0];
430         Reg[0] = Temp;
431     }
432
433
434     // (temporary)output
435     for (i=0; i<4; i++)
436         Buf[i] += Reg[i];
437
438 }
439
440
441
442 /* =========================  SHA-1 implementation ========================== */
443 // four base functions for SHA-1
444 #define SHA1_F1(b, c, d)    (((b) & (c)) | ((~b) & (d)))
445 #define SHA1_F2(b, c, d)    ((b) ^ (c) ^ (d))
446 #define SHA1_F3(b, c, d)    (((b) & (c)) | ((b) & (d)) | ((c) & (d)))
447
448
449 #define SHA1Step(f, a, b, c, d, e, w, k)    \
450     ( e += ( f(b, c, d) + w + k + CYCLIC_LEFT_SHIFT(a, 5)) & 0xffffffff, \
451       b = CYCLIC_LEFT_SHIFT(b, 30) )
452
453 //Initiate SHA-1 Context satisfied in RFC 3174
454 VOID SHAInit(SHA_CTX *pCtx)
455 {
456     pCtx->Buf[0]=0x67452301;
457     pCtx->Buf[1]=0xefcdab89;
458     pCtx->Buf[2]=0x98badcfe;
459     pCtx->Buf[3]=0x10325476;
460     pCtx->Buf[4]=0xc3d2e1f0;
461
462     pCtx->LenInBitCount[0]=0;
463     pCtx->LenInBitCount[1]=0;
464 }
465
466 /*
467  *  Function Description:
468  *      Update SHA-1 Context, allow of an arrary of octets as the next
469  *      portion of the message
470  *
471  *  Arguments:
472  *      pCtx            Pointer to SHA-1 context
473  *          pData       Pointer to input data
474  *      LenInBytes  The length of input data (unit: byte)
475  *
476  *  Return Value:
477  *      error       indicate more than pow(2,64) bits of data
478  *
479  *  Note:
480  *      Called after SHAInit or SHAUpdate(itself)
481  */
482 UCHAR SHAUpdate(SHA_CTX *pCtx, UCHAR *pData, UINT32 LenInBytes)
483 {
484     UINT32 TfTimes;
485     UINT32 temp1,temp2;
486         unsigned int i;
487         UCHAR err=1;
488
489     temp1 = pCtx->LenInBitCount[0];
490     temp2 = pCtx->LenInBitCount[1];
491
492     pCtx->LenInBitCount[0] = (UINT32) (pCtx->LenInBitCount[0] + (LenInBytes << 3));
493     if (pCtx->LenInBitCount[0] < temp1)
494         pCtx->LenInBitCount[1]++;   //carry in
495
496
497     pCtx->LenInBitCount[1] = (UINT32) (pCtx->LenInBitCount[1] +(LenInBytes >> 29));
498     if (pCtx->LenInBitCount[1] < temp2)
499         return (err);   //check total length of original data
500
501
502     // mod 64 bytes
503     temp1 = (temp1 >> 3) & 0x3f;
504
505     // process lacks of 64-byte data
506     if (temp1)
507     {
508         UCHAR *pAds = (UCHAR *) pCtx->Input + temp1;
509
510         if ((temp1+LenInBytes) < 64)
511         {
512             NdisMoveMemory(pAds, (UCHAR *)pData, LenInBytes);
513             return (0);
514         }
515
516         NdisMoveMemory(pAds, (UCHAR *)pData, 64-temp1);
517         byteReverse((UCHAR *)pCtx->Input, 16);
518
519         NdisZeroMemory((UCHAR *)pCtx->Input + 64, 16);
520         SHATransform(pCtx->Buf, (UINT32 *)pCtx->Input);
521
522         pData += 64-temp1;
523         LenInBytes -= 64-temp1;
524     } // end of if (temp1)
525
526
527     TfTimes = (LenInBytes >> 6);
528
529     for (i=TfTimes; i>0; i--)
530     {
531         NdisMoveMemory(pCtx->Input, (UCHAR *)pData, 64);
532         byteReverse((UCHAR *)pCtx->Input, 16);
533
534         NdisZeroMemory((UCHAR *)pCtx->Input + 64, 16);
535         SHATransform(pCtx->Buf, (UINT32 *)pCtx->Input);
536         pData += 64;
537         LenInBytes -= 64;
538     } // end of for
539
540     // buffering lacks of 64-byte data
541     if(LenInBytes)
542         NdisMoveMemory(pCtx->Input, (UCHAR *)pData, LenInBytes);
543
544         return (0);
545
546 }
547
548 // Append padding bits and length of original message in the tail
549 // The message digest has to be completed in the end
550 VOID SHAFinal(SHA_CTX *pCtx, UCHAR Digest[20])
551 {
552     UCHAR Remainder;
553     UCHAR PadLenInBytes;
554     UCHAR *pAppend=0;
555     unsigned int i;
556
557     Remainder = (UCHAR)((pCtx->LenInBitCount[0] >> 3) & 0x3f);
558
559     pAppend = (UCHAR *)pCtx->Input + Remainder;
560
561     PadLenInBytes = (Remainder < 56) ? (56-Remainder) : (120-Remainder);
562
563     // padding bits without crossing block(64-byte based) boundary
564     if (Remainder < 56)
565     {
566         *pAppend = 0x80;
567         PadLenInBytes --;
568
569         NdisZeroMemory((UCHAR *)pCtx->Input + Remainder+1, PadLenInBytes);
570
571                 // add data-length field, from high to low
572         for (i=0; i<4; i++)
573         {
574                 pCtx->Input[56+i] = (UCHAR)((pCtx->LenInBitCount[1] >> ((3-i) << 3)) & 0xff);
575                 pCtx->Input[60+i] = (UCHAR)((pCtx->LenInBitCount[0] >> ((3-i) << 3)) & 0xff);
576         }
577
578         byteReverse((UCHAR *)pCtx->Input, 16);
579         NdisZeroMemory((UCHAR *)pCtx->Input + 64, 14);
580         SHATransform(pCtx->Buf, (UINT32 *)pCtx->Input);
581     } // end of if
582
583     // padding bits with crossing block(64-byte based) boundary
584     else
585     {
586         // the first block ===
587         *pAppend = 0x80;
588         PadLenInBytes --;
589
590         NdisZeroMemory((UCHAR *)pCtx->Input + Remainder+1, (64-Remainder-1));
591         PadLenInBytes -= (64 - Remainder - 1);
592
593         byteReverse((UCHAR *)pCtx->Input, 16);
594         NdisZeroMemory((UCHAR *)pCtx->Input + 64, 16);
595         SHATransform(pCtx->Buf, (UINT32 *)pCtx->Input);
596
597
598         // the second block ===
599         NdisZeroMemory((UCHAR *)pCtx->Input, PadLenInBytes);
600
601                 // add data-length field
602                 for (i=0; i<4; i++)
603         {
604                 pCtx->Input[56+i] = (UCHAR)((pCtx->LenInBitCount[1] >> ((3-i) << 3)) & 0xff);
605                 pCtx->Input[60+i] = (UCHAR)((pCtx->LenInBitCount[0] >> ((3-i) << 3)) & 0xff);
606         }
607
608         byteReverse((UCHAR *)pCtx->Input, 16);
609         NdisZeroMemory((UCHAR *)pCtx->Input + 64, 16);
610         SHATransform(pCtx->Buf, (UINT32 *)pCtx->Input);
611     } // end of else
612
613
614     //Output, bytereverse
615     for (i=0; i<20; i++)
616     {
617         Digest [i] = (UCHAR)(pCtx->Buf[i>>2] >> 8*(3-(i & 0x3)));
618     }
619
620     NdisZeroMemory(pCtx, sizeof(pCtx)); // memory free
621 }
622
623
624 // The central algorithm of SHA-1, consists of four rounds and
625 // twenty steps per round
626 VOID SHATransform(UINT32 Buf[5], UINT32 Mes[20])
627 {
628     UINT32 Reg[5],Temp;
629         unsigned int i;
630     UINT32 W[80];
631
632     static UINT32 SHA1Table[4] = { 0x5a827999, 0x6ed9eba1,
633                                   0x8f1bbcdc, 0xca62c1d6 };
634
635     Reg[0]=Buf[0];
636         Reg[1]=Buf[1];
637         Reg[2]=Buf[2];
638         Reg[3]=Buf[3];
639         Reg[4]=Buf[4];
640
641     //the first octet of a word is stored in the 0th element, bytereverse
642         for(i = 0; i < 16; i++)
643     {
644         W[i]  = (Mes[i] >> 24) & 0xff;
645         W[i] |= (Mes[i] >> 8 ) & 0xff00;
646         W[i] |= (Mes[i] << 8 ) & 0xff0000;
647         W[i] |= (Mes[i] << 24) & 0xff000000;
648     }
649
650
651     for (i = 0; i < 64; i++)
652             W[16+i] = CYCLIC_LEFT_SHIFT(W[i] ^ W[2+i] ^ W[8+i] ^ W[13+i], 1);
653
654
655     // 80 steps in SHA-1 algorithm
656     for (i=0; i<80; i++)
657     {
658         if (i<20)
659             SHA1Step(SHA1_F1, Reg[0], Reg[1], Reg[2], Reg[3], Reg[4],
660                      W[i], SHA1Table[0]);
661
662         else if (i>=20 && i<40)
663             SHA1Step(SHA1_F2, Reg[0], Reg[1], Reg[2], Reg[3], Reg[4],
664                      W[i], SHA1Table[1]);
665
666                 else if (i>=40 && i<60)
667             SHA1Step(SHA1_F3, Reg[0], Reg[1], Reg[2], Reg[3], Reg[4],
668                       W[i], SHA1Table[2]);
669
670         else
671             SHA1Step(SHA1_F2, Reg[0], Reg[1], Reg[2], Reg[3], Reg[4],
672                      W[i], SHA1Table[3]);
673
674
675        // one-word right shift
676                 Temp   = Reg[4];
677         Reg[4] = Reg[3];
678         Reg[3] = Reg[2];
679         Reg[2] = Reg[1];
680         Reg[1] = Reg[0];
681         Reg[0] = Temp;
682
683     } // end of for-loop
684
685
686     // (temporary)output
687     for (i=0; i<5; i++)
688         Buf[i] += Reg[i];
689
690 }
691
692
693 /* =========================  AES En/Decryption ========================== */
694
695 /* forward S-box */
696 static uint32 FSb[256] =
697 {
698         0x63, 0x7C,     0x77, 0x7B,     0xF2, 0x6B,     0x6F, 0xC5,
699         0x30, 0x01,     0x67, 0x2B,     0xFE, 0xD7,     0xAB, 0x76,
700         0xCA, 0x82,     0xC9, 0x7D,     0xFA, 0x59,     0x47, 0xF0,
701         0xAD, 0xD4,     0xA2, 0xAF,     0x9C, 0xA4,     0x72, 0xC0,
702         0xB7, 0xFD,     0x93, 0x26,     0x36, 0x3F,     0xF7, 0xCC,
703         0x34, 0xA5,     0xE5, 0xF1,     0x71, 0xD8,     0x31, 0x15,
704         0x04, 0xC7,     0x23, 0xC3,     0x18, 0x96,     0x05, 0x9A,
705         0x07, 0x12,     0x80, 0xE2,     0xEB, 0x27,     0xB2, 0x75,
706         0x09, 0x83,     0x2C, 0x1A,     0x1B, 0x6E,     0x5A, 0xA0,
707         0x52, 0x3B,     0xD6, 0xB3,     0x29, 0xE3,     0x2F, 0x84,
708         0x53, 0xD1,     0x00, 0xED,     0x20, 0xFC,     0xB1, 0x5B,
709         0x6A, 0xCB,     0xBE, 0x39,     0x4A, 0x4C,     0x58, 0xCF,
710         0xD0, 0xEF,     0xAA, 0xFB,     0x43, 0x4D,     0x33, 0x85,
711         0x45, 0xF9,     0x02, 0x7F,     0x50, 0x3C,     0x9F, 0xA8,
712         0x51, 0xA3,     0x40, 0x8F,     0x92, 0x9D,     0x38, 0xF5,
713         0xBC, 0xB6,     0xDA, 0x21,     0x10, 0xFF,     0xF3, 0xD2,
714         0xCD, 0x0C,     0x13, 0xEC,     0x5F, 0x97,     0x44, 0x17,
715         0xC4, 0xA7,     0x7E, 0x3D,     0x64, 0x5D,     0x19, 0x73,
716         0x60, 0x81,     0x4F, 0xDC,     0x22, 0x2A,     0x90, 0x88,
717         0x46, 0xEE,     0xB8, 0x14,     0xDE, 0x5E,     0x0B, 0xDB,
718         0xE0, 0x32,     0x3A, 0x0A,     0x49, 0x06,     0x24, 0x5C,
719         0xC2, 0xD3,     0xAC, 0x62,     0x91, 0x95,     0xE4, 0x79,
720         0xE7, 0xC8,     0x37, 0x6D,     0x8D, 0xD5,     0x4E, 0xA9,
721         0x6C, 0x56,     0xF4, 0xEA,     0x65, 0x7A,     0xAE, 0x08,
722         0xBA, 0x78,     0x25, 0x2E,     0x1C, 0xA6,     0xB4, 0xC6,
723         0xE8, 0xDD,     0x74, 0x1F,     0x4B, 0xBD,     0x8B, 0x8A,
724         0x70, 0x3E,     0xB5, 0x66,     0x48, 0x03,     0xF6, 0x0E,
725         0x61, 0x35,     0x57, 0xB9,     0x86, 0xC1,     0x1D, 0x9E,
726         0xE1, 0xF8,     0x98, 0x11,     0x69, 0xD9,     0x8E, 0x94,
727         0x9B, 0x1E,     0x87, 0xE9,     0xCE, 0x55,     0x28, 0xDF,
728         0x8C, 0xA1,     0x89, 0x0D,     0xBF, 0xE6,     0x42, 0x68,
729         0x41, 0x99,     0x2D, 0x0F,     0xB0, 0x54,     0xBB, 0x16
730 };
731
732 /* forward table */
733 #define FT \
734 \
735         V(C6,63,63,A5), V(F8,7C,7C,84), V(EE,77,77,99), V(F6,7B,7B,8D), \
736         V(FF,F2,F2,0D), V(D6,6B,6B,BD), V(DE,6F,6F,B1), V(91,C5,C5,54), \
737         V(60,30,30,50), V(02,01,01,03), V(CE,67,67,A9), V(56,2B,2B,7D), \
738         V(E7,FE,FE,19), V(B5,D7,D7,62), V(4D,AB,AB,E6), V(EC,76,76,9A), \
739         V(8F,CA,CA,45), V(1F,82,82,9D), V(89,C9,C9,40), V(FA,7D,7D,87), \
740         V(EF,FA,FA,15), V(B2,59,59,EB), V(8E,47,47,C9), V(FB,F0,F0,0B), \
741         V(41,AD,AD,EC), V(B3,D4,D4,67), V(5F,A2,A2,FD), V(45,AF,AF,EA), \
742         V(23,9C,9C,BF), V(53,A4,A4,F7), V(E4,72,72,96), V(9B,C0,C0,5B), \
743         V(75,B7,B7,C2), V(E1,FD,FD,1C), V(3D,93,93,AE), V(4C,26,26,6A), \
744         V(6C,36,36,5A), V(7E,3F,3F,41), V(F5,F7,F7,02), V(83,CC,CC,4F), \
745         V(68,34,34,5C), V(51,A5,A5,F4), V(D1,E5,E5,34), V(F9,F1,F1,08), \
746         V(E2,71,71,93), V(AB,D8,D8,73), V(62,31,31,53), V(2A,15,15,3F), \
747         V(08,04,04,0C), V(95,C7,C7,52), V(46,23,23,65), V(9D,C3,C3,5E), \
748         V(30,18,18,28), V(37,96,96,A1), V(0A,05,05,0F), V(2F,9A,9A,B5), \
749         V(0E,07,07,09), V(24,12,12,36), V(1B,80,80,9B), V(DF,E2,E2,3D), \
750         V(CD,EB,EB,26), V(4E,27,27,69), V(7F,B2,B2,CD), V(EA,75,75,9F), \
751         V(12,09,09,1B), V(1D,83,83,9E), V(58,2C,2C,74), V(34,1A,1A,2E), \
752         V(36,1B,1B,2D), V(DC,6E,6E,B2), V(B4,5A,5A,EE), V(5B,A0,A0,FB), \
753         V(A4,52,52,F6), V(76,3B,3B,4D), V(B7,D6,D6,61), V(7D,B3,B3,CE), \
754         V(52,29,29,7B), V(DD,E3,E3,3E), V(5E,2F,2F,71), V(13,84,84,97), \
755         V(A6,53,53,F5), V(B9,D1,D1,68), V(00,00,00,00), V(C1,ED,ED,2C), \
756         V(40,20,20,60), V(E3,FC,FC,1F), V(79,B1,B1,C8), V(B6,5B,5B,ED), \
757         V(D4,6A,6A,BE), V(8D,CB,CB,46), V(67,BE,BE,D9), V(72,39,39,4B), \
758         V(94,4A,4A,DE), V(98,4C,4C,D4), V(B0,58,58,E8), V(85,CF,CF,4A), \
759         V(BB,D0,D0,6B), V(C5,EF,EF,2A), V(4F,AA,AA,E5), V(ED,FB,FB,16), \
760         V(86,43,43,C5), V(9A,4D,4D,D7), V(66,33,33,55), V(11,85,85,94), \
761         V(8A,45,45,CF), V(E9,F9,F9,10), V(04,02,02,06), V(FE,7F,7F,81), \
762         V(A0,50,50,F0), V(78,3C,3C,44), V(25,9F,9F,BA), V(4B,A8,A8,E3), \
763         V(A2,51,51,F3), V(5D,A3,A3,FE), V(80,40,40,C0), V(05,8F,8F,8A), \
764         V(3F,92,92,AD), V(21,9D,9D,BC), V(70,38,38,48), V(F1,F5,F5,04), \
765         V(63,BC,BC,DF), V(77,B6,B6,C1), V(AF,DA,DA,75), V(42,21,21,63), \
766         V(20,10,10,30), V(E5,FF,FF,1A), V(FD,F3,F3,0E), V(BF,D2,D2,6D), \
767         V(81,CD,CD,4C), V(18,0C,0C,14), V(26,13,13,35), V(C3,EC,EC,2F), \
768         V(BE,5F,5F,E1), V(35,97,97,A2), V(88,44,44,CC), V(2E,17,17,39), \
769         V(93,C4,C4,57), V(55,A7,A7,F2), V(FC,7E,7E,82), V(7A,3D,3D,47), \
770         V(C8,64,64,AC), V(BA,5D,5D,E7), V(32,19,19,2B), V(E6,73,73,95), \
771         V(C0,60,60,A0), V(19,81,81,98), V(9E,4F,4F,D1), V(A3,DC,DC,7F), \
772         V(44,22,22,66), V(54,2A,2A,7E), V(3B,90,90,AB), V(0B,88,88,83), \
773         V(8C,46,46,CA), V(C7,EE,EE,29), V(6B,B8,B8,D3), V(28,14,14,3C), \
774         V(A7,DE,DE,79), V(BC,5E,5E,E2), V(16,0B,0B,1D), V(AD,DB,DB,76), \
775         V(DB,E0,E0,3B), V(64,32,32,56), V(74,3A,3A,4E), V(14,0A,0A,1E), \
776         V(92,49,49,DB), V(0C,06,06,0A), V(48,24,24,6C), V(B8,5C,5C,E4), \
777         V(9F,C2,C2,5D), V(BD,D3,D3,6E), V(43,AC,AC,EF), V(C4,62,62,A6), \
778         V(39,91,91,A8), V(31,95,95,A4), V(D3,E4,E4,37), V(F2,79,79,8B), \
779         V(D5,E7,E7,32), V(8B,C8,C8,43), V(6E,37,37,59), V(DA,6D,6D,B7), \
780         V(01,8D,8D,8C), V(B1,D5,D5,64), V(9C,4E,4E,D2), V(49,A9,A9,E0), \
781         V(D8,6C,6C,B4), V(AC,56,56,FA), V(F3,F4,F4,07), V(CF,EA,EA,25), \
782         V(CA,65,65,AF), V(F4,7A,7A,8E), V(47,AE,AE,E9), V(10,08,08,18), \
783         V(6F,BA,BA,D5), V(F0,78,78,88), V(4A,25,25,6F), V(5C,2E,2E,72), \
784         V(38,1C,1C,24), V(57,A6,A6,F1), V(73,B4,B4,C7), V(97,C6,C6,51), \
785         V(CB,E8,E8,23), V(A1,DD,DD,7C), V(E8,74,74,9C), V(3E,1F,1F,21), \
786         V(96,4B,4B,DD), V(61,BD,BD,DC), V(0D,8B,8B,86), V(0F,8A,8A,85), \
787         V(E0,70,70,90), V(7C,3E,3E,42), V(71,B5,B5,C4), V(CC,66,66,AA), \
788         V(90,48,48,D8), V(06,03,03,05), V(F7,F6,F6,01), V(1C,0E,0E,12), \
789         V(C2,61,61,A3), V(6A,35,35,5F), V(AE,57,57,F9), V(69,B9,B9,D0), \
790         V(17,86,86,91), V(99,C1,C1,58), V(3A,1D,1D,27), V(27,9E,9E,B9), \
791         V(D9,E1,E1,38), V(EB,F8,F8,13), V(2B,98,98,B3), V(22,11,11,33), \
792         V(D2,69,69,BB), V(A9,D9,D9,70), V(07,8E,8E,89), V(33,94,94,A7), \
793         V(2D,9B,9B,B6), V(3C,1E,1E,22), V(15,87,87,92), V(C9,E9,E9,20), \
794         V(87,CE,CE,49), V(AA,55,55,FF), V(50,28,28,78), V(A5,DF,DF,7A), \
795         V(03,8C,8C,8F), V(59,A1,A1,F8), V(09,89,89,80), V(1A,0D,0D,17), \
796         V(65,BF,BF,DA), V(D7,E6,E6,31), V(84,42,42,C6), V(D0,68,68,B8), \
797         V(82,41,41,C3), V(29,99,99,B0), V(5A,2D,2D,77), V(1E,0F,0F,11), \
798         V(7B,B0,B0,CB), V(A8,54,54,FC), V(6D,BB,BB,D6), V(2C,16,16,3A)
799
800 #define V(a,b,c,d) 0x##a##b##c##d
801 static uint32 FT0[256] = { FT };
802 #undef V
803
804 #define V(a,b,c,d) 0x##d##a##b##c
805 static uint32 FT1[256] = { FT };
806 #undef V
807
808 #define V(a,b,c,d) 0x##c##d##a##b
809 static uint32 FT2[256] = { FT };
810 #undef V
811
812 #define V(a,b,c,d) 0x##b##c##d##a
813 static uint32 FT3[256] = { FT };
814 #undef V
815
816 #undef FT
817
818 /* reverse S-box */
819
820 static uint32 RSb[256] =
821 {
822         0x52, 0x09,     0x6A, 0xD5,     0x30, 0x36,     0xA5, 0x38,
823         0xBF, 0x40,     0xA3, 0x9E,     0x81, 0xF3,     0xD7, 0xFB,
824         0x7C, 0xE3,     0x39, 0x82,     0x9B, 0x2F,     0xFF, 0x87,
825         0x34, 0x8E,     0x43, 0x44,     0xC4, 0xDE,     0xE9, 0xCB,
826         0x54, 0x7B,     0x94, 0x32,     0xA6, 0xC2,     0x23, 0x3D,
827         0xEE, 0x4C,     0x95, 0x0B,     0x42, 0xFA,     0xC3, 0x4E,
828         0x08, 0x2E,     0xA1, 0x66,     0x28, 0xD9,     0x24, 0xB2,
829         0x76, 0x5B,     0xA2, 0x49,     0x6D, 0x8B,     0xD1, 0x25,
830         0x72, 0xF8,     0xF6, 0x64,     0x86, 0x68,     0x98, 0x16,
831         0xD4, 0xA4,     0x5C, 0xCC,     0x5D, 0x65,     0xB6, 0x92,
832         0x6C, 0x70,     0x48, 0x50,     0xFD, 0xED,     0xB9, 0xDA,
833         0x5E, 0x15,     0x46, 0x57,     0xA7, 0x8D,     0x9D, 0x84,
834         0x90, 0xD8,     0xAB, 0x00,     0x8C, 0xBC,     0xD3, 0x0A,
835         0xF7, 0xE4,     0x58, 0x05,     0xB8, 0xB3,     0x45, 0x06,
836         0xD0, 0x2C,     0x1E, 0x8F,     0xCA, 0x3F,     0x0F, 0x02,
837         0xC1, 0xAF,     0xBD, 0x03,     0x01, 0x13,     0x8A, 0x6B,
838         0x3A, 0x91,     0x11, 0x41,     0x4F, 0x67,     0xDC, 0xEA,
839         0x97, 0xF2,     0xCF, 0xCE,     0xF0, 0xB4,     0xE6, 0x73,
840         0x96, 0xAC,     0x74, 0x22,     0xE7, 0xAD,     0x35, 0x85,
841         0xE2, 0xF9,     0x37, 0xE8,     0x1C, 0x75,     0xDF, 0x6E,
842         0x47, 0xF1,     0x1A, 0x71,     0x1D, 0x29,     0xC5, 0x89,
843         0x6F, 0xB7,     0x62, 0x0E,     0xAA, 0x18,     0xBE, 0x1B,
844         0xFC, 0x56,     0x3E, 0x4B,     0xC6, 0xD2,     0x79, 0x20,
845         0x9A, 0xDB,     0xC0, 0xFE,     0x78, 0xCD,     0x5A, 0xF4,
846         0x1F, 0xDD,     0xA8, 0x33,     0x88, 0x07,     0xC7, 0x31,
847         0xB1, 0x12,     0x10, 0x59,     0x27, 0x80,     0xEC, 0x5F,
848         0x60, 0x51,     0x7F, 0xA9,     0x19, 0xB5,     0x4A, 0x0D,
849         0x2D, 0xE5,     0x7A, 0x9F,     0x93, 0xC9,     0x9C, 0xEF,
850         0xA0, 0xE0,     0x3B, 0x4D,     0xAE, 0x2A,     0xF5, 0xB0,
851         0xC8, 0xEB,     0xBB, 0x3C,     0x83, 0x53,     0x99, 0x61,
852         0x17, 0x2B,     0x04, 0x7E,     0xBA, 0x77,     0xD6, 0x26,
853         0xE1, 0x69,     0x14, 0x63,     0x55, 0x21,     0x0C, 0x7D
854 };
855
856 /* reverse table */
857
858 #define RT \
859 \
860         V(51,F4,A7,50), V(7E,41,65,53), V(1A,17,A4,C3), V(3A,27,5E,96), \
861         V(3B,AB,6B,CB), V(1F,9D,45,F1), V(AC,FA,58,AB), V(4B,E3,03,93), \
862         V(20,30,FA,55), V(AD,76,6D,F6), V(88,CC,76,91), V(F5,02,4C,25), \
863         V(4F,E5,D7,FC), V(C5,2A,CB,D7), V(26,35,44,80), V(B5,62,A3,8F), \
864         V(DE,B1,5A,49), V(25,BA,1B,67), V(45,EA,0E,98), V(5D,FE,C0,E1), \
865         V(C3,2F,75,02), V(81,4C,F0,12), V(8D,46,97,A3), V(6B,D3,F9,C6), \
866         V(03,8F,5F,E7), V(15,92,9C,95), V(BF,6D,7A,EB), V(95,52,59,DA), \
867         V(D4,BE,83,2D), V(58,74,21,D3), V(49,E0,69,29), V(8E,C9,C8,44), \
868         V(75,C2,89,6A), V(F4,8E,79,78), V(99,58,3E,6B), V(27,B9,71,DD), \
869         V(BE,E1,4F,B6), V(F0,88,AD,17), V(C9,20,AC,66), V(7D,CE,3A,B4), \
870         V(63,DF,4A,18), V(E5,1A,31,82), V(97,51,33,60), V(62,53,7F,45), \
871         V(B1,64,77,E0), V(BB,6B,AE,84), V(FE,81,A0,1C), V(F9,08,2B,94), \
872         V(70,48,68,58), V(8F,45,FD,19), V(94,DE,6C,87), V(52,7B,F8,B7), \
873         V(AB,73,D3,23), V(72,4B,02,E2), V(E3,1F,8F,57), V(66,55,AB,2A), \
874         V(B2,EB,28,07), V(2F,B5,C2,03), V(86,C5,7B,9A), V(D3,37,08,A5), \
875         V(30,28,87,F2), V(23,BF,A5,B2), V(02,03,6A,BA), V(ED,16,82,5C), \
876         V(8A,CF,1C,2B), V(A7,79,B4,92), V(F3,07,F2,F0), V(4E,69,E2,A1), \
877         V(65,DA,F4,CD), V(06,05,BE,D5), V(D1,34,62,1F), V(C4,A6,FE,8A), \
878         V(34,2E,53,9D), V(A2,F3,55,A0), V(05,8A,E1,32), V(A4,F6,EB,75), \
879         V(0B,83,EC,39), V(40,60,EF,AA), V(5E,71,9F,06), V(BD,6E,10,51), \
880         V(3E,21,8A,F9), V(96,DD,06,3D), V(DD,3E,05,AE), V(4D,E6,BD,46), \
881         V(91,54,8D,B5), V(71,C4,5D,05), V(04,06,D4,6F), V(60,50,15,FF), \
882         V(19,98,FB,24), V(D6,BD,E9,97), V(89,40,43,CC), V(67,D9,9E,77), \
883         V(B0,E8,42,BD), V(07,89,8B,88), V(E7,19,5B,38), V(79,C8,EE,DB), \
884         V(A1,7C,0A,47), V(7C,42,0F,E9), V(F8,84,1E,C9), V(00,00,00,00), \
885         V(09,80,86,83), V(32,2B,ED,48), V(1E,11,70,AC), V(6C,5A,72,4E), \
886         V(FD,0E,FF,FB), V(0F,85,38,56), V(3D,AE,D5,1E), V(36,2D,39,27), \
887         V(0A,0F,D9,64), V(68,5C,A6,21), V(9B,5B,54,D1), V(24,36,2E,3A), \
888         V(0C,0A,67,B1), V(93,57,E7,0F), V(B4,EE,96,D2), V(1B,9B,91,9E), \
889         V(80,C0,C5,4F), V(61,DC,20,A2), V(5A,77,4B,69), V(1C,12,1A,16), \
890         V(E2,93,BA,0A), V(C0,A0,2A,E5), V(3C,22,E0,43), V(12,1B,17,1D), \
891         V(0E,09,0D,0B), V(F2,8B,C7,AD), V(2D,B6,A8,B9), V(14,1E,A9,C8), \
892         V(57,F1,19,85), V(AF,75,07,4C), V(EE,99,DD,BB), V(A3,7F,60,FD), \
893         V(F7,01,26,9F), V(5C,72,F5,BC), V(44,66,3B,C5), V(5B,FB,7E,34), \
894         V(8B,43,29,76), V(CB,23,C6,DC), V(B6,ED,FC,68), V(B8,E4,F1,63), \
895         V(D7,31,DC,CA), V(42,63,85,10), V(13,97,22,40), V(84,C6,11,20), \
896         V(85,4A,24,7D), V(D2,BB,3D,F8), V(AE,F9,32,11), V(C7,29,A1,6D), \
897         V(1D,9E,2F,4B), V(DC,B2,30,F3), V(0D,86,52,EC), V(77,C1,E3,D0), \
898         V(2B,B3,16,6C), V(A9,70,B9,99), V(11,94,48,FA), V(47,E9,64,22), \
899         V(A8,FC,8C,C4), V(A0,F0,3F,1A), V(56,7D,2C,D8), V(22,33,90,EF), \
900         V(87,49,4E,C7), V(D9,38,D1,C1), V(8C,CA,A2,FE), V(98,D4,0B,36), \
901         V(A6,F5,81,CF), V(A5,7A,DE,28), V(DA,B7,8E,26), V(3F,AD,BF,A4), \
902         V(2C,3A,9D,E4), V(50,78,92,0D), V(6A,5F,CC,9B), V(54,7E,46,62), \
903         V(F6,8D,13,C2), V(90,D8,B8,E8), V(2E,39,F7,5E), V(82,C3,AF,F5), \
904         V(9F,5D,80,BE), V(69,D0,93,7C), V(6F,D5,2D,A9), V(CF,25,12,B3), \
905         V(C8,AC,99,3B), V(10,18,7D,A7), V(E8,9C,63,6E), V(DB,3B,BB,7B), \
906         V(CD,26,78,09), V(6E,59,18,F4), V(EC,9A,B7,01), V(83,4F,9A,A8), \
907         V(E6,95,6E,65), V(AA,FF,E6,7E), V(21,BC,CF,08), V(EF,15,E8,E6), \
908         V(BA,E7,9B,D9), V(4A,6F,36,CE), V(EA,9F,09,D4), V(29,B0,7C,D6), \
909         V(31,A4,B2,AF), V(2A,3F,23,31), V(C6,A5,94,30), V(35,A2,66,C0), \
910         V(74,4E,BC,37), V(FC,82,CA,A6), V(E0,90,D0,B0), V(33,A7,D8,15), \
911         V(F1,04,98,4A), V(41,EC,DA,F7), V(7F,CD,50,0E), V(17,91,F6,2F), \
912         V(76,4D,D6,8D), V(43,EF,B0,4D), V(CC,AA,4D,54), V(E4,96,04,DF), \
913         V(9E,D1,B5,E3), V(4C,6A,88,1B), V(C1,2C,1F,B8), V(46,65,51,7F), \
914         V(9D,5E,EA,04), V(01,8C,35,5D), V(FA,87,74,73), V(FB,0B,41,2E), \
915         V(B3,67,1D,5A), V(92,DB,D2,52), V(E9,10,56,33), V(6D,D6,47,13), \
916         V(9A,D7,61,8C), V(37,A1,0C,7A), V(59,F8,14,8E), V(EB,13,3C,89), \
917         V(CE,A9,27,EE), V(B7,61,C9,35), V(E1,1C,E5,ED), V(7A,47,B1,3C), \
918         V(9C,D2,DF,59), V(55,F2,73,3F), V(18,14,CE,79), V(73,C7,37,BF), \
919         V(53,F7,CD,EA), V(5F,FD,AA,5B), V(DF,3D,6F,14), V(78,44,DB,86), \
920         V(CA,AF,F3,81), V(B9,68,C4,3E), V(38,24,34,2C), V(C2,A3,40,5F), \
921         V(16,1D,C3,72), V(BC,E2,25,0C), V(28,3C,49,8B), V(FF,0D,95,41), \
922         V(39,A8,01,71), V(08,0C,B3,DE), V(D8,B4,E4,9C), V(64,56,C1,90), \
923         V(7B,CB,84,61), V(D5,32,B6,70), V(48,6C,5C,74), V(D0,B8,57,42)
924
925 #define V(a,b,c,d) 0x##a##b##c##d
926 static uint32 RT0[256] = { RT };
927 #undef V
928
929 #define V(a,b,c,d) 0x##d##a##b##c
930 static uint32 RT1[256] = { RT };
931 #undef V
932
933 #define V(a,b,c,d) 0x##c##d##a##b
934 static uint32 RT2[256] = { RT };
935 #undef V
936
937 #define V(a,b,c,d) 0x##b##c##d##a
938 static uint32 RT3[256] = { RT };
939 #undef V
940
941 #undef RT
942
943 /* round constants */
944
945 static uint32 RCON[10] =
946 {
947         0x01000000,     0x02000000,     0x04000000,     0x08000000,
948         0x10000000,     0x20000000,     0x40000000,     0x80000000,
949         0x1B000000,     0x36000000
950 };
951
952 /* key schedule tables */
953
954 static int KT_init = 1;
955
956 static uint32 KT0[256];
957 static uint32 KT1[256];
958 static uint32 KT2[256];
959 static uint32 KT3[256];
960
961 /* platform-independant 32-bit integer manipulation     macros */
962
963 #define GET_UINT32(n,b,i)                                               \
964 {                                                                                               \
965         (n)     = (     (uint32) (b)[(i)        ] << 24 )               \
966                 | (     (uint32) (b)[(i) + 1] << 16     )               \
967                 | (     (uint32) (b)[(i) + 2] <<  8     )               \
968                 | (     (uint32) (b)[(i) + 3]           );              \
969 }
970
971 #define PUT_UINT32(n,b,i)                                               \
972 {                                                                                               \
973         (b)[(i)    ] = (uint8) ( (n) >> 24 );           \
974         (b)[(i) + 1] = (uint8) ( (n) >> 16 );           \
975         (b)[(i) + 2] = (uint8) ( (n) >>  8 );           \
976         (b)[(i) + 3] = (uint8) ( (n)       );           \
977 }
978
979 /* AES key scheduling routine */
980
981 int     rtmp_aes_set_key( aes_context *ctx, uint8 *key, int nbits )
982 {
983         int     i;
984         uint32 *RK,     *SK;
985
986         switch( nbits )
987         {
988                 case 128: ctx->nr =     10;     break;
989                 case 192: ctx->nr =     12;     break;
990                 case 256: ctx->nr =     14;     break;
991                 default : return( 1     );
992         }
993
994         RK = ctx->erk;
995
996         for( i = 0;     i <     (nbits >> 5); i++ )
997         {
998                 GET_UINT32(     RK[i], key,     i *     4 );
999         }
1000
1001         /* setup encryption     round keys */
1002
1003         switch( nbits )
1004         {
1005         case 128:
1006
1007                 for( i = 0;     i <     10;     i++, RK += 4 )
1008                 {
1009                         RK[4]  = RK[0] ^ RCON[i] ^
1010                                                 ( FSb[ (uint8) ( RK[3] >> 16 ) ] <<     24 ) ^
1011                                                 ( FSb[ (uint8) ( RK[3] >>  8 ) ] <<     16 ) ^
1012                                                 ( FSb[ (uint8) ( RK[3]           ) ] <<  8 ) ^
1013                                                 ( FSb[ (uint8) ( RK[3] >> 24 ) ]           );
1014
1015                         RK[5]  = RK[1] ^ RK[4];
1016                         RK[6]  = RK[2] ^ RK[5];
1017                         RK[7]  = RK[3] ^ RK[6];
1018                 }
1019                 break;
1020
1021         case 192:
1022
1023                 for( i = 0;     i <     8; i++, RK += 6 )
1024                 {
1025                         RK[6]  = RK[0] ^ RCON[i] ^
1026                                                 ( FSb[ (uint8) ( RK[5] >> 16 ) ] <<     24 ) ^
1027                                                 ( FSb[ (uint8) ( RK[5] >>  8 ) ] <<     16 ) ^
1028                                                 ( FSb[ (uint8) ( RK[5]           ) ] <<  8 ) ^
1029                                                 ( FSb[ (uint8) ( RK[5] >> 24 ) ]           );
1030
1031                         RK[7]  = RK[1] ^ RK[6];
1032                         RK[8]  = RK[2] ^ RK[7];
1033                         RK[9]  = RK[3] ^ RK[8];
1034                         RK[10] = RK[4] ^ RK[9];
1035                         RK[11] = RK[5] ^ RK[10];
1036                 }
1037                 break;
1038
1039         case 256:
1040
1041                 for( i = 0;     i <     7; i++, RK += 8 )
1042                 {
1043                         RK[8]  = RK[0] ^ RCON[i] ^
1044                                                 ( FSb[ (uint8) ( RK[7] >> 16 ) ] <<     24 ) ^
1045                                                 ( FSb[ (uint8) ( RK[7] >>  8 ) ] <<     16 ) ^
1046                                                 ( FSb[ (uint8) ( RK[7]           ) ] <<  8 ) ^
1047                                                 ( FSb[ (uint8) ( RK[7] >> 24 ) ]           );
1048
1049                         RK[9]  = RK[1] ^ RK[8];
1050                         RK[10] = RK[2] ^ RK[9];
1051                         RK[11] = RK[3] ^ RK[10];
1052
1053                         RK[12] = RK[4] ^
1054                                                 ( FSb[ (uint8) ( RK[11] >> 24 ) ] << 24 ) ^
1055                                                 ( FSb[ (uint8) ( RK[11] >> 16 ) ] << 16 ) ^
1056                                                 ( FSb[ (uint8) ( RK[11] >>      8 )     ] <<  8 ) ^
1057                                                 ( FSb[ (uint8) ( RK[11]           )     ]               );
1058
1059                         RK[13] = RK[5] ^ RK[12];
1060                         RK[14] = RK[6] ^ RK[13];
1061                         RK[15] = RK[7] ^ RK[14];
1062                 }
1063                 break;
1064         }
1065
1066         /* setup decryption     round keys */
1067
1068         if(     KT_init )
1069         {
1070                 for( i = 0;     i <     256; i++ )
1071                 {
1072                         KT0[i] = RT0[ FSb[i] ];
1073                         KT1[i] = RT1[ FSb[i] ];
1074                         KT2[i] = RT2[ FSb[i] ];
1075                         KT3[i] = RT3[ FSb[i] ];
1076                 }
1077
1078                 KT_init = 0;
1079         }
1080
1081         SK = ctx->drk;
1082
1083         *SK++ = *RK++;
1084         *SK++ = *RK++;
1085         *SK++ = *RK++;
1086         *SK++ = *RK++;
1087
1088         for( i = 1;     i <     ctx->nr; i++ )
1089         {
1090                 RK -= 8;
1091
1092                 *SK++ = KT0[ (uint8) ( *RK >> 24 ) ] ^
1093                                 KT1[ (uint8) ( *RK >> 16 ) ] ^
1094                                 KT2[ (uint8) ( *RK >>  8 ) ] ^
1095                                 KT3[ (uint8) ( *RK               ) ]; RK++;
1096
1097                 *SK++ = KT0[ (uint8) ( *RK >> 24 ) ] ^
1098                                 KT1[ (uint8) ( *RK >> 16 ) ] ^
1099                                 KT2[ (uint8) ( *RK >>  8 ) ] ^
1100                                 KT3[ (uint8) ( *RK               ) ]; RK++;
1101
1102                 *SK++ = KT0[ (uint8) ( *RK >> 24 ) ] ^
1103                                 KT1[ (uint8) ( *RK >> 16 ) ] ^
1104                                 KT2[ (uint8) ( *RK >>  8 ) ] ^
1105                                 KT3[ (uint8) ( *RK               ) ]; RK++;
1106
1107                 *SK++ = KT0[ (uint8) ( *RK >> 24 ) ] ^
1108                                 KT1[ (uint8) ( *RK >> 16 ) ] ^
1109                                 KT2[ (uint8) ( *RK >>  8 ) ] ^
1110                                 KT3[ (uint8) ( *RK               ) ]; RK++;
1111         }
1112
1113         RK -= 8;
1114
1115         *SK++ = *RK++;
1116         *SK++ = *RK++;
1117         *SK++ = *RK++;
1118         *SK++ = *RK++;
1119
1120         return( 0 );
1121 }
1122
1123 /* AES 128-bit block encryption routine */
1124
1125 void rtmp_aes_encrypt(aes_context *ctx, uint8 input[16],        uint8 output[16] )
1126 {
1127         uint32 *RK,     X0,     X1,     X2,     X3,     Y0,     Y1,     Y2,     Y3;
1128
1129         RK = ctx->erk;
1130         GET_UINT32(     X0,     input,  0 ); X0 ^= RK[0];
1131         GET_UINT32(     X1,     input,  4 ); X1 ^= RK[1];
1132         GET_UINT32(     X2,     input,  8 ); X2 ^= RK[2];
1133         GET_UINT32(     X3,     input, 12 ); X3 ^= RK[3];
1134
1135 #define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3)             \
1136 {                                                                                               \
1137         RK += 4;                                                                        \
1138                                                                                                 \
1139         X0 = RK[0] ^ FT0[ (uint8) (     Y0 >> 24 ) ] ^  \
1140                                  FT1[ (uint8) ( Y1 >> 16 ) ] ^  \
1141                                  FT2[ (uint8) ( Y2 >>  8 ) ] ^  \
1142                                  FT3[ (uint8) ( Y3               ) ];   \
1143                                                                                                 \
1144         X1 = RK[1] ^ FT0[ (uint8) (     Y1 >> 24 ) ] ^  \
1145                                  FT1[ (uint8) ( Y2 >> 16 ) ] ^  \
1146                                  FT2[ (uint8) ( Y3 >>  8 ) ] ^  \
1147                                  FT3[ (uint8) ( Y0               ) ];   \
1148                                                                                                 \
1149         X2 = RK[2] ^ FT0[ (uint8) (     Y2 >> 24 ) ] ^  \
1150                                  FT1[ (uint8) ( Y3 >> 16 ) ] ^  \
1151                                  FT2[ (uint8) ( Y0 >>  8 ) ] ^  \
1152                                  FT3[ (uint8) ( Y1               ) ];   \
1153                                                                                                 \
1154         X3 = RK[3] ^ FT0[ (uint8) (     Y3 >> 24 ) ] ^  \
1155                                  FT1[ (uint8) ( Y0 >> 16 ) ] ^  \
1156                                  FT2[ (uint8) ( Y1 >>  8 ) ] ^  \
1157                                  FT3[ (uint8) ( Y2               ) ];   \
1158 }
1159
1160         AES_FROUND(     Y0,     Y1,     Y2,     Y3,     X0,     X1,     X2,     X3 );           /* round 1 */
1161         AES_FROUND(     X0,     X1,     X2,     X3,     Y0,     Y1,     Y2,     Y3 );           /* round 2 */
1162         AES_FROUND(     Y0,     Y1,     Y2,     Y3,     X0,     X1,     X2,     X3 );           /* round 3 */
1163         AES_FROUND(     X0,     X1,     X2,     X3,     Y0,     Y1,     Y2,     Y3 );           /* round 4 */
1164         AES_FROUND(     Y0,     Y1,     Y2,     Y3,     X0,     X1,     X2,     X3 );           /* round 5 */
1165         AES_FROUND(     X0,     X1,     X2,     X3,     Y0,     Y1,     Y2,     Y3 );           /* round 6 */
1166         AES_FROUND(     Y0,     Y1,     Y2,     Y3,     X0,     X1,     X2,     X3 );           /* round 7 */
1167         AES_FROUND(     X0,     X1,     X2,     X3,     Y0,     Y1,     Y2,     Y3 );           /* round 8 */
1168         AES_FROUND(     Y0,     Y1,     Y2,     Y3,     X0,     X1,     X2,     X3 );           /* round 9 */
1169
1170         if(     ctx->nr > 10 )
1171         {
1172                 AES_FROUND(     X0,     X1,     X2,     X3,     Y0,     Y1,     Y2,     Y3 );   /* round 10     */
1173                 AES_FROUND(     Y0,     Y1,     Y2,     Y3,     X0,     X1,     X2,     X3 );   /* round 11     */
1174         }
1175
1176         if(     ctx->nr > 12 )
1177         {
1178                 AES_FROUND(     X0,     X1,     X2,     X3,     Y0,     Y1,     Y2,     Y3 );   /* round 12     */
1179                 AES_FROUND(     Y0,     Y1,     Y2,     Y3,     X0,     X1,     X2,     X3 );   /* round 13     */
1180         }
1181
1182         /* last round */
1183
1184         RK += 4;
1185
1186         X0 = RK[0] ^ ( FSb[     (uint8) ( Y0 >> 24 ) ] << 24 ) ^
1187                                  ( FSb[ (uint8) ( Y1 >> 16 ) ] << 16 ) ^
1188                                  ( FSb[ (uint8) ( Y2 >>  8 ) ] <<  8 ) ^
1189                                  ( FSb[ (uint8) ( Y3       ) ]           );
1190
1191         X1 = RK[1] ^ ( FSb[     (uint8) ( Y1 >> 24 ) ] << 24 ) ^
1192                                  ( FSb[ (uint8) ( Y2 >> 16 ) ] << 16 ) ^
1193                                  ( FSb[ (uint8) ( Y3 >>  8 ) ] <<  8 ) ^
1194                                  ( FSb[ (uint8) ( Y0       ) ]           );
1195
1196         X2 = RK[2] ^ ( FSb[     (uint8) ( Y2 >> 24 ) ] << 24 ) ^
1197                                  ( FSb[ (uint8) ( Y3 >> 16 ) ] << 16 ) ^
1198                                  ( FSb[ (uint8) ( Y0 >>  8 ) ] <<  8 ) ^
1199                                  ( FSb[ (uint8) ( Y1       ) ]           );
1200
1201         X3 = RK[3] ^ ( FSb[     (uint8) ( Y3 >> 24 ) ] << 24 ) ^
1202                                  ( FSb[ (uint8) ( Y0 >> 16 ) ] << 16 ) ^
1203                                  ( FSb[ (uint8) ( Y1 >>  8 ) ] <<  8 ) ^
1204                                  ( FSb[ (uint8) ( Y2       ) ]           );
1205
1206         PUT_UINT32(     X0,     output,  0 );
1207         PUT_UINT32(     X1,     output,  4 );
1208         PUT_UINT32(     X2,     output,  8 );
1209         PUT_UINT32(     X3,     output, 12 );
1210 }
1211
1212 /* AES 128-bit block decryption routine */
1213
1214 void rtmp_aes_decrypt( aes_context *ctx,        uint8 input[16], uint8 output[16] )
1215 {
1216         uint32 *RK,     X0,     X1,     X2,     X3,     Y0,     Y1,     Y2,     Y3;
1217
1218         RK = ctx->drk;
1219
1220         GET_UINT32(     X0,     input,  0 ); X0 ^= RK[0];
1221         GET_UINT32(     X1,     input,  4 ); X1 ^= RK[1];
1222         GET_UINT32(     X2,     input,  8 ); X2 ^= RK[2];
1223         GET_UINT32(     X3,     input, 12 ); X3 ^= RK[3];
1224
1225 #define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3)             \
1226 {                                                                                               \
1227         RK += 4;                                                                        \
1228                                                                                                 \
1229         X0 = RK[0] ^ RT0[ (uint8) (     Y0 >> 24 ) ] ^  \
1230                                  RT1[ (uint8) ( Y3 >> 16 ) ] ^  \
1231                                  RT2[ (uint8) ( Y2 >>  8 ) ] ^  \
1232                                  RT3[ (uint8) ( Y1               ) ];   \
1233                                                                                                 \
1234         X1 = RK[1] ^ RT0[ (uint8) (     Y1 >> 24 ) ] ^  \
1235                                  RT1[ (uint8) ( Y0 >> 16 ) ] ^  \
1236                                  RT2[ (uint8) ( Y3 >>  8 ) ] ^  \
1237                                  RT3[ (uint8) ( Y2               ) ];   \
1238                                                                                                 \
1239         X2 = RK[2] ^ RT0[ (uint8) (     Y2 >> 24 ) ] ^  \
1240                                  RT1[ (uint8) ( Y1 >> 16 ) ] ^  \
1241                                  RT2[ (uint8) ( Y0 >>  8 ) ] ^  \
1242                                  RT3[ (uint8) ( Y3               ) ];   \
1243                                                                                                 \
1244         X3 = RK[3] ^ RT0[ (uint8) (     Y3 >> 24 ) ] ^  \
1245                                  RT1[ (uint8) ( Y2 >> 16 ) ] ^  \
1246                                  RT2[ (uint8) ( Y1 >>  8 ) ] ^  \
1247                                  RT3[ (uint8) ( Y0               ) ];   \
1248 }
1249
1250         AES_RROUND(     Y0,     Y1,     Y2,     Y3,     X0,     X1,     X2,     X3 );           /* round 1 */
1251         AES_RROUND(     X0,     X1,     X2,     X3,     Y0,     Y1,     Y2,     Y3 );           /* round 2 */
1252         AES_RROUND(     Y0,     Y1,     Y2,     Y3,     X0,     X1,     X2,     X3 );           /* round 3 */
1253         AES_RROUND(     X0,     X1,     X2,     X3,     Y0,     Y1,     Y2,     Y3 );           /* round 4 */
1254         AES_RROUND(     Y0,     Y1,     Y2,     Y3,     X0,     X1,     X2,     X3 );           /* round 5 */
1255         AES_RROUND(     X0,     X1,     X2,     X3,     Y0,     Y1,     Y2,     Y3 );           /* round 6 */
1256         AES_RROUND(     Y0,     Y1,     Y2,     Y3,     X0,     X1,     X2,     X3 );           /* round 7 */
1257         AES_RROUND(     X0,     X1,     X2,     X3,     Y0,     Y1,     Y2,     Y3 );           /* round 8 */
1258         AES_RROUND(     Y0,     Y1,     Y2,     Y3,     X0,     X1,     X2,     X3 );           /* round 9 */
1259
1260         if(     ctx->nr > 10 )
1261         {
1262                 AES_RROUND(     X0,     X1,     X2,     X3,     Y0,     Y1,     Y2,     Y3 );   /* round 10     */
1263                 AES_RROUND(     Y0,     Y1,     Y2,     Y3,     X0,     X1,     X2,     X3 );   /* round 11     */
1264         }
1265
1266         if(     ctx->nr > 12 )
1267         {
1268                 AES_RROUND(     X0,     X1,     X2,     X3,     Y0,     Y1,     Y2,     Y3 );   /* round 12     */
1269                 AES_RROUND(     Y0,     Y1,     Y2,     Y3,     X0,     X1,     X2,     X3 );   /* round 13     */
1270         }
1271
1272         /* last round */
1273
1274         RK += 4;
1275
1276         X0 = RK[0] ^ ( RSb[     (uint8) ( Y0 >> 24 ) ] << 24 ) ^
1277                                  ( RSb[ (uint8) ( Y3 >> 16 ) ] << 16 ) ^
1278                                  ( RSb[ (uint8) ( Y2 >>  8 ) ] <<  8 ) ^
1279                                  ( RSb[ (uint8) ( Y1       ) ]           );
1280
1281         X1 = RK[1] ^ ( RSb[     (uint8) ( Y1 >> 24 ) ] << 24 ) ^
1282                                  ( RSb[ (uint8) ( Y0 >> 16 ) ] << 16 ) ^
1283                                  ( RSb[ (uint8) ( Y3 >>  8 ) ] <<  8 ) ^
1284                                  ( RSb[ (uint8) ( Y2       ) ]           );
1285
1286         X2 = RK[2] ^ ( RSb[     (uint8) ( Y2 >> 24 ) ] << 24 ) ^
1287                                  ( RSb[ (uint8) ( Y1 >> 16 ) ] << 16 ) ^
1288                                  ( RSb[ (uint8) ( Y0 >>  8 ) ] <<  8 ) ^
1289                                  ( RSb[ (uint8) ( Y3       ) ]           );
1290
1291         X3 = RK[3] ^ ( RSb[     (uint8) ( Y3 >> 24 ) ] << 24 ) ^
1292                                  ( RSb[ (uint8) ( Y2 >> 16 ) ] << 16 ) ^
1293                                  ( RSb[ (uint8) ( Y1 >>  8 ) ] <<  8 ) ^
1294                                  ( RSb[ (uint8) ( Y0       ) ]           );
1295
1296         PUT_UINT32(     X0,     output,  0 );
1297         PUT_UINT32(     X1,     output,  4 );
1298         PUT_UINT32(     X2,     output,  8 );
1299         PUT_UINT32(     X3,     output, 12 );
1300 }
1301
1302 /*
1303         ========================================================================
1304
1305         Routine Description:
1306                 SHA1 function
1307
1308         Arguments:
1309
1310         Return Value:
1311
1312         Note:
1313
1314         ========================================================================
1315 */
1316 VOID    HMAC_SHA1(
1317         IN      UCHAR   *text,
1318         IN      UINT    text_len,
1319         IN      UCHAR   *key,
1320         IN      UINT    key_len,
1321         IN      UCHAR   *digest)
1322 {
1323         SHA_CTX context;
1324         UCHAR   k_ipad[65]; /* inner padding - key XORd with ipad       */
1325         UCHAR   k_opad[65]; /* outer padding - key XORd with opad       */
1326         INT             i;
1327
1328         // if key is longer     than 64 bytes reset     it to key=SHA1(key)
1329         if (key_len     > 64)
1330         {
1331                 SHA_CTX          tctx;
1332                 SHAInit(&tctx);
1333                 SHAUpdate(&tctx, key, key_len);
1334                 SHAFinal(&tctx, key);
1335                 key_len = 20;
1336         }
1337         NdisZeroMemory(k_ipad, sizeof(k_ipad));
1338         NdisZeroMemory(k_opad, sizeof(k_opad));
1339         NdisMoveMemory(k_ipad, key,     key_len);
1340         NdisMoveMemory(k_opad, key,     key_len);
1341
1342         // XOR key with ipad and opad values
1343         for     (i = 0; i <     64;     i++)
1344         {
1345                 k_ipad[i] ^= 0x36;
1346                 k_opad[i] ^= 0x5c;
1347         }
1348
1349         // perform inner SHA1
1350         SHAInit(&context);                                              /* init context for 1st pass */
1351         SHAUpdate(&context,     k_ipad, 64);            /*      start with inner pad */
1352         SHAUpdate(&context,     text, text_len);        /*      then text of datagram */
1353         SHAFinal(&context, digest);                             /* finish up 1st pass */
1354
1355         //perform outer SHA1
1356         SHAInit(&context);                                      /* init context for 2nd pass */
1357         SHAUpdate(&context,     k_opad, 64);    /*      start with outer pad */
1358         SHAUpdate(&context,     digest, 20);    /*      then results of 1st     hash */
1359         SHAFinal(&context, digest);                     /* finish up 2nd pass */
1360
1361 }
1362
1363 /*
1364 * F(P, S, c, i) = U1 xor U2 xor ... Uc
1365 * U1 = PRF(P, S || Int(i))
1366 * U2 = PRF(P, U1)
1367 * Uc = PRF(P, Uc-1)
1368 */
1369
1370 void F(char *password, unsigned char *ssid, int ssidlength, int iterations, int count, unsigned char *output)
1371 {
1372     unsigned char digest[36], digest1[SHA_DIGEST_LEN];
1373     int i, j;
1374
1375     /* U1 = PRF(P, S || int(i)) */
1376     memcpy(digest, ssid, ssidlength);
1377     digest[ssidlength] = (unsigned char)((count>>24) & 0xff);
1378     digest[ssidlength+1] = (unsigned char)((count>>16) & 0xff);
1379     digest[ssidlength+2] = (unsigned char)((count>>8) & 0xff);
1380     digest[ssidlength+3] = (unsigned char)(count & 0xff);
1381     HMAC_SHA1(digest, ssidlength+4, (unsigned char*) password, (int) strlen(password), digest1); // for WPA update
1382
1383     /* output = U1 */
1384     memcpy(output, digest1, SHA_DIGEST_LEN);
1385
1386     for (i = 1; i < iterations; i++)
1387     {
1388         /* Un = PRF(P, Un-1) */
1389         HMAC_SHA1(digest1, SHA_DIGEST_LEN, (unsigned char*) password, (int) strlen(password), digest); // for WPA update
1390         memcpy(digest1, digest, SHA_DIGEST_LEN);
1391
1392         /* output = output xor Un */
1393         for (j = 0; j < SHA_DIGEST_LEN; j++)
1394         {
1395             output[j] ^= digest[j];
1396         }
1397     }
1398 }
1399 /*
1400 * password - ascii string up to 63 characters in length
1401 * ssid - octet string up to 32 octets
1402 * ssidlength - length of ssid in octets
1403 * output must be 40 octets in length and outputs 256 bits of key
1404 */
1405 int PasswordHash(char *password, unsigned char *ssid, int ssidlength, unsigned char *output)
1406 {
1407     if ((strlen(password) > 63) || (ssidlength > 32))
1408         return 0;
1409
1410     F(password, ssid, ssidlength, 4096, 1, output);
1411     F(password, ssid, ssidlength, 4096, 2, &output[SHA_DIGEST_LEN]);
1412     return 1;
1413 }
1414
1415