crypto.c
上传用户:fubang
上传日期:2009-06-18
资源大小:2071k
文件大小:30k
源码类别:

其他

开发平台:

Unix_Linux

  1. /*
  2.  *  MD5, SHA-1, RC4 and AES implementations
  3.  *
  4.  *  Copyright (C) 2001-2004  Christophe Devine
  5.  *
  6.  *  This program is free software; you can redistribute it and/or modify
  7.  *  it under the terms of the GNU General Public License as published by
  8.  *  the Free Software Foundation; either version 2 of the License, or
  9.  *  (at your option) any later version.
  10.  *
  11.  *  This program is distributed in the hope that it will be useful,
  12.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  *  GNU General Public License for more details.
  15.  *
  16.  *  You should have received a copy of the GNU General Public License
  17.  *  along with this program; if not, write to the Free Software
  18.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  19.  */
  20. #include <string.h>
  21. #include "crypto.h"
  22. #define GET_UINT32_LE(n,b,i)                    
  23. {                                               
  24.     (n) = ( (uint32) (b)[(i)    ]       )       
  25.         | ( (uint32) (b)[(i) + 1] <<  8 )       
  26.         | ( (uint32) (b)[(i) + 2] << 16 )       
  27.         | ( (uint32) (b)[(i) + 3] << 24 );      
  28. }
  29. #define PUT_UINT32_LE(n,b,i)                    
  30. {                                               
  31.     (b)[(i)    ] = (uint8) ( (n)       );       
  32.     (b)[(i) + 1] = (uint8) ( (n) >>  8 );       
  33.     (b)[(i) + 2] = (uint8) ( (n) >> 16 );       
  34.     (b)[(i) + 3] = (uint8) ( (n) >> 24 );       
  35. }
  36. #define GET_UINT32_BE(n,b,i)                    
  37. {                                               
  38.     (n) = ( (uint32) (b)[(i)    ] << 24 )       
  39.         | ( (uint32) (b)[(i) + 1] << 16 )       
  40.         | ( (uint32) (b)[(i) + 2] <<  8 )       
  41.         | ( (uint32) (b)[(i) + 3]       );      
  42. }
  43. #define PUT_UINT32_BE(n,b,i)                    
  44. {                                               
  45.     (b)[(i)    ] = (uint8) ( (n) >> 24 );       
  46.     (b)[(i) + 1] = (uint8) ( (n) >> 16 );       
  47.     (b)[(i) + 2] = (uint8) ( (n) >>  8 );       
  48.     (b)[(i) + 3] = (uint8) ( (n)       );       
  49. }
  50. /* RFC 1321 compliant MD5 implementation */
  51. void md5_starts( md5_context *ctx )
  52. {
  53.     ctx->total[0] = 0;
  54.     ctx->total[1] = 0;
  55.     ctx->state[0] = 0x67452301;
  56.     ctx->state[1] = 0xEFCDAB89;
  57.     ctx->state[2] = 0x98BADCFE;
  58.     ctx->state[3] = 0x10325476;
  59. }
  60. void md5_process( md5_context *ctx, uint8 data[64] )
  61. {
  62.     uint32 X[16], A, B, C, D;
  63.     GET_UINT32_LE( X[0],  data,  0 );
  64.     GET_UINT32_LE( X[1],  data,  4 );
  65.     GET_UINT32_LE( X[2],  data,  8 );
  66.     GET_UINT32_LE( X[3],  data, 12 );
  67.     GET_UINT32_LE( X[4],  data, 16 );
  68.     GET_UINT32_LE( X[5],  data, 20 );
  69.     GET_UINT32_LE( X[6],  data, 24 );
  70.     GET_UINT32_LE( X[7],  data, 28 );
  71.     GET_UINT32_LE( X[8],  data, 32 );
  72.     GET_UINT32_LE( X[9],  data, 36 );
  73.     GET_UINT32_LE( X[10], data, 40 );
  74.     GET_UINT32_LE( X[11], data, 44 );
  75.     GET_UINT32_LE( X[12], data, 48 );
  76.     GET_UINT32_LE( X[13], data, 52 );
  77.     GET_UINT32_LE( X[14], data, 56 );
  78.     GET_UINT32_LE( X[15], data, 60 );
  79. #define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
  80. #define P(a,b,c,d,k,s,t)                                
  81. {                                                       
  82.     a += F(b,c,d) + X[k] + t; a = S(a,s) + b;           
  83. }
  84.     A = ctx->state[0];
  85.     B = ctx->state[1];
  86.     C = ctx->state[2];
  87.     D = ctx->state[3];
  88. #define F(x,y,z) (z ^ (x & (y ^ z)))
  89.     P( A, B, C, D,  0,  7, 0xD76AA478 );
  90.     P( D, A, B, C,  1, 12, 0xE8C7B756 );
  91.     P( C, D, A, B,  2, 17, 0x242070DB );
  92.     P( B, C, D, A,  3, 22, 0xC1BDCEEE );
  93.     P( A, B, C, D,  4,  7, 0xF57C0FAF );
  94.     P( D, A, B, C,  5, 12, 0x4787C62A );
  95.     P( C, D, A, B,  6, 17, 0xA8304613 );
  96.     P( B, C, D, A,  7, 22, 0xFD469501 );
  97.     P( A, B, C, D,  8,  7, 0x698098D8 );
  98.     P( D, A, B, C,  9, 12, 0x8B44F7AF );
  99.     P( C, D, A, B, 10, 17, 0xFFFF5BB1 );
  100.     P( B, C, D, A, 11, 22, 0x895CD7BE );
  101.     P( A, B, C, D, 12,  7, 0x6B901122 );
  102.     P( D, A, B, C, 13, 12, 0xFD987193 );
  103.     P( C, D, A, B, 14, 17, 0xA679438E );
  104.     P( B, C, D, A, 15, 22, 0x49B40821 );
  105. #undef F
  106. #define F(x,y,z) (y ^ (z & (x ^ y)))
  107.     P( A, B, C, D,  1,  5, 0xF61E2562 );
  108.     P( D, A, B, C,  6,  9, 0xC040B340 );
  109.     P( C, D, A, B, 11, 14, 0x265E5A51 );
  110.     P( B, C, D, A,  0, 20, 0xE9B6C7AA );
  111.     P( A, B, C, D,  5,  5, 0xD62F105D );
  112.     P( D, A, B, C, 10,  9, 0x02441453 );
  113.     P( C, D, A, B, 15, 14, 0xD8A1E681 );
  114.     P( B, C, D, A,  4, 20, 0xE7D3FBC8 );
  115.     P( A, B, C, D,  9,  5, 0x21E1CDE6 );
  116.     P( D, A, B, C, 14,  9, 0xC33707D6 );
  117.     P( C, D, A, B,  3, 14, 0xF4D50D87 );
  118.     P( B, C, D, A,  8, 20, 0x455A14ED );
  119.     P( A, B, C, D, 13,  5, 0xA9E3E905 );
  120.     P( D, A, B, C,  2,  9, 0xFCEFA3F8 );
  121.     P( C, D, A, B,  7, 14, 0x676F02D9 );
  122.     P( B, C, D, A, 12, 20, 0x8D2A4C8A );
  123. #undef F
  124.     
  125. #define F(x,y,z) (x ^ y ^ z)
  126.     P( A, B, C, D,  5,  4, 0xFFFA3942 );
  127.     P( D, A, B, C,  8, 11, 0x8771F681 );
  128.     P( C, D, A, B, 11, 16, 0x6D9D6122 );
  129.     P( B, C, D, A, 14, 23, 0xFDE5380C );
  130.     P( A, B, C, D,  1,  4, 0xA4BEEA44 );
  131.     P( D, A, B, C,  4, 11, 0x4BDECFA9 );
  132.     P( C, D, A, B,  7, 16, 0xF6BB4B60 );
  133.     P( B, C, D, A, 10, 23, 0xBEBFBC70 );
  134.     P( A, B, C, D, 13,  4, 0x289B7EC6 );
  135.     P( D, A, B, C,  0, 11, 0xEAA127FA );
  136.     P( C, D, A, B,  3, 16, 0xD4EF3085 );
  137.     P( B, C, D, A,  6, 23, 0x04881D05 );
  138.     P( A, B, C, D,  9,  4, 0xD9D4D039 );
  139.     P( D, A, B, C, 12, 11, 0xE6DB99E5 );
  140.     P( C, D, A, B, 15, 16, 0x1FA27CF8 );
  141.     P( B, C, D, A,  2, 23, 0xC4AC5665 );
  142. #undef F
  143. #define F(x,y,z) (y ^ (x | ~z))
  144.     P( A, B, C, D,  0,  6, 0xF4292244 );
  145.     P( D, A, B, C,  7, 10, 0x432AFF97 );
  146.     P( C, D, A, B, 14, 15, 0xAB9423A7 );
  147.     P( B, C, D, A,  5, 21, 0xFC93A039 );
  148.     P( A, B, C, D, 12,  6, 0x655B59C3 );
  149.     P( D, A, B, C,  3, 10, 0x8F0CCC92 );
  150.     P( C, D, A, B, 10, 15, 0xFFEFF47D );
  151.     P( B, C, D, A,  1, 21, 0x85845DD1 );
  152.     P( A, B, C, D,  8,  6, 0x6FA87E4F );
  153.     P( D, A, B, C, 15, 10, 0xFE2CE6E0 );
  154.     P( C, D, A, B,  6, 15, 0xA3014314 );
  155.     P( B, C, D, A, 13, 21, 0x4E0811A1 );
  156.     P( A, B, C, D,  4,  6, 0xF7537E82 );
  157.     P( D, A, B, C, 11, 10, 0xBD3AF235 );
  158.     P( C, D, A, B,  2, 15, 0x2AD7D2BB );
  159.     P( B, C, D, A,  9, 21, 0xEB86D391 );
  160. #undef F
  161.     ctx->state[0] += A;
  162.     ctx->state[1] += B;
  163.     ctx->state[2] += C;
  164.     ctx->state[3] += D;
  165. }
  166. #undef P
  167. #undef S
  168. void md5_update( md5_context *ctx, uint8 *input, uint32 length )
  169. {
  170.     uint32 left, fill;
  171.     if( ! length ) return;
  172.     left = ctx->total[0] & 0x3F;
  173.     fill = 64 - left;
  174.     ctx->total[0] += length;
  175.     ctx->total[0] &= 0xFFFFFFFF;
  176.     if( ctx->total[0] < length )
  177.         ctx->total[1]++;
  178.     if( left && length >= fill )
  179.     {
  180.         memcpy( (void *) (ctx->buffer + left),
  181.                 (void *) input, fill );
  182.         md5_process( ctx, ctx->buffer );
  183.         length -= fill;
  184.         input  += fill;
  185.         left = 0;
  186.     }
  187.     while( length >= 64 )
  188.     {
  189.         md5_process( ctx, input );
  190.         length -= 64;
  191.         input  += 64;
  192.     }
  193.     if( length )
  194.     {
  195.         memcpy( (void *) (ctx->buffer + left),
  196.                 (void *) input, length );
  197.     }
  198. }
  199. static uint8 md5_padding[64] =
  200. {
  201.  0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  202.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  203.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  204.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  205. };
  206. void md5_finish( md5_context *ctx, uint8 digest[16] )
  207. {
  208.     uint32 last, padn;
  209.     uint32 high, low;
  210.     uint8 msglen[8];
  211.     high = ( ctx->total[0] >> 29 )
  212.          | ( ctx->total[1] <<  3 );
  213.     low  = ( ctx->total[0] <<  3 );
  214.     PUT_UINT32_LE( low,  msglen, 0 );
  215.     PUT_UINT32_LE( high, msglen, 4 );
  216.     last = ctx->total[0] & 0x3F;
  217.     padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
  218.     md5_update( ctx, md5_padding, padn );
  219.     md5_update( ctx, msglen, 8 );
  220.     PUT_UINT32_LE( ctx->state[0], digest,  0 );
  221.     PUT_UINT32_LE( ctx->state[1], digest,  4 );
  222.     PUT_UINT32_LE( ctx->state[2], digest,  8 );
  223.     PUT_UINT32_LE( ctx->state[3], digest, 12 );
  224. }
  225. void hmac_md5( uint8 *key, int keylen, uint8 *buffer, int length,
  226.                uint8 digest[16] )
  227. {
  228.     int i;
  229.     md5_context ctx;
  230.     uint8 k_ipad[64];
  231.     uint8 k_opad[64];
  232.     uint8 tmpbuf[16];
  233.     memset( k_ipad, 0, sizeof( k_ipad ) );
  234.     memset( k_opad, 0, sizeof( k_opad ) );
  235.     memcpy( k_ipad, key, keylen );
  236.     memcpy( k_opad, key, keylen );
  237.     for( i = 0; i < 64; i++ )
  238.     {
  239.         k_ipad[i] ^= 0x36;
  240.         k_opad[i] ^= 0x5C;
  241.     }
  242.     md5_starts( &ctx );
  243.     md5_update( &ctx, k_ipad, 64 );
  244.     md5_update( &ctx, buffer, length );
  245.     md5_finish( &ctx, tmpbuf );
  246.     md5_starts( &ctx );
  247.     md5_update( &ctx, k_opad, 64 );
  248.     md5_update( &ctx, tmpbuf, 16 );
  249.     md5_finish( &ctx, digest );
  250. }
  251. /* FIPS-180-1 compliant SHA-1 implementation */
  252. void sha1_starts( sha1_context *ctx )
  253. {
  254.     ctx->total[0] = 0;
  255.     ctx->total[1] = 0;
  256.     ctx->state[0] = 0x67452301;
  257.     ctx->state[1] = 0xEFCDAB89;
  258.     ctx->state[2] = 0x98BADCFE;
  259.     ctx->state[3] = 0x10325476;
  260.     ctx->state[4] = 0xC3D2E1F0;
  261. }
  262. void sha1_process( sha1_context *ctx, uint8 data[64] )
  263. {
  264.     uint32 temp, W[16], A, B, C, D, E;
  265.     GET_UINT32_BE( W[0],  data,  0 );
  266.     GET_UINT32_BE( W[1],  data,  4 );
  267.     GET_UINT32_BE( W[2],  data,  8 );
  268.     GET_UINT32_BE( W[3],  data, 12 );
  269.     GET_UINT32_BE( W[4],  data, 16 );
  270.     GET_UINT32_BE( W[5],  data, 20 );
  271.     GET_UINT32_BE( W[6],  data, 24 );
  272.     GET_UINT32_BE( W[7],  data, 28 );
  273.     GET_UINT32_BE( W[8],  data, 32 );
  274.     GET_UINT32_BE( W[9],  data, 36 );
  275.     GET_UINT32_BE( W[10], data, 40 );
  276.     GET_UINT32_BE( W[11], data, 44 );
  277.     GET_UINT32_BE( W[12], data, 48 );
  278.     GET_UINT32_BE( W[13], data, 52 );
  279.     GET_UINT32_BE( W[14], data, 56 );
  280.     GET_UINT32_BE( W[15], data, 60 );
  281. #define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
  282. #define R(t)                                            
  283. (                                                       
  284.     temp = W[(t -  3) & 0x0F] ^ W[(t - 8) & 0x0F] ^     
  285.            W[(t - 14) & 0x0F] ^ W[ t      & 0x0F],      
  286.     ( W[t & 0x0F] = S(temp,1) )                         
  287. )
  288. #define P(a,b,c,d,e,x)                                  
  289. {                                                       
  290.     e += S(a,5) + F(b,c,d) + K + x; b = S(b,30);        
  291. }
  292.     A = ctx->state[0];
  293.     B = ctx->state[1];
  294.     C = ctx->state[2];
  295.     D = ctx->state[3];
  296.     E = ctx->state[4];
  297. #define F(x,y,z) (z ^ (x & (y ^ z)))
  298. #define K 0x5A827999
  299.     P( A, B, C, D, E, W[0]  );
  300.     P( E, A, B, C, D, W[1]  );
  301.     P( D, E, A, B, C, W[2]  );
  302.     P( C, D, E, A, B, W[3]  );
  303.     P( B, C, D, E, A, W[4]  );
  304.     P( A, B, C, D, E, W[5]  );
  305.     P( E, A, B, C, D, W[6]  );
  306.     P( D, E, A, B, C, W[7]  );
  307.     P( C, D, E, A, B, W[8]  );
  308.     P( B, C, D, E, A, W[9]  );
  309.     P( A, B, C, D, E, W[10] );
  310.     P( E, A, B, C, D, W[11] );
  311.     P( D, E, A, B, C, W[12] );
  312.     P( C, D, E, A, B, W[13] );
  313.     P( B, C, D, E, A, W[14] );
  314.     P( A, B, C, D, E, W[15] );
  315.     P( E, A, B, C, D, R(16) );
  316.     P( D, E, A, B, C, R(17) );
  317.     P( C, D, E, A, B, R(18) );
  318.     P( B, C, D, E, A, R(19) );
  319. #undef K
  320. #undef F
  321. #define F(x,y,z) (x ^ y ^ z)
  322. #define K 0x6ED9EBA1
  323.     P( A, B, C, D, E, R(20) );
  324.     P( E, A, B, C, D, R(21) );
  325.     P( D, E, A, B, C, R(22) );
  326.     P( C, D, E, A, B, R(23) );
  327.     P( B, C, D, E, A, R(24) );
  328.     P( A, B, C, D, E, R(25) );
  329.     P( E, A, B, C, D, R(26) );
  330.     P( D, E, A, B, C, R(27) );
  331.     P( C, D, E, A, B, R(28) );
  332.     P( B, C, D, E, A, R(29) );
  333.     P( A, B, C, D, E, R(30) );
  334.     P( E, A, B, C, D, R(31) );
  335.     P( D, E, A, B, C, R(32) );
  336.     P( C, D, E, A, B, R(33) );
  337.     P( B, C, D, E, A, R(34) );
  338.     P( A, B, C, D, E, R(35) );
  339.     P( E, A, B, C, D, R(36) );
  340.     P( D, E, A, B, C, R(37) );
  341.     P( C, D, E, A, B, R(38) );
  342.     P( B, C, D, E, A, R(39) );
  343. #undef K
  344. #undef F
  345. #define F(x,y,z) ((x & y) | (z & (x | y)))
  346. #define K 0x8F1BBCDC
  347.     P( A, B, C, D, E, R(40) );
  348.     P( E, A, B, C, D, R(41) );
  349.     P( D, E, A, B, C, R(42) );
  350.     P( C, D, E, A, B, R(43) );
  351.     P( B, C, D, E, A, R(44) );
  352.     P( A, B, C, D, E, R(45) );
  353.     P( E, A, B, C, D, R(46) );
  354.     P( D, E, A, B, C, R(47) );
  355.     P( C, D, E, A, B, R(48) );
  356.     P( B, C, D, E, A, R(49) );
  357.     P( A, B, C, D, E, R(50) );
  358.     P( E, A, B, C, D, R(51) );
  359.     P( D, E, A, B, C, R(52) );
  360.     P( C, D, E, A, B, R(53) );
  361.     P( B, C, D, E, A, R(54) );
  362.     P( A, B, C, D, E, R(55) );
  363.     P( E, A, B, C, D, R(56) );
  364.     P( D, E, A, B, C, R(57) );
  365.     P( C, D, E, A, B, R(58) );
  366.     P( B, C, D, E, A, R(59) );
  367. #undef K
  368. #undef F
  369. #define F(x,y,z) (x ^ y ^ z)
  370. #define K 0xCA62C1D6
  371.     P( A, B, C, D, E, R(60) );
  372.     P( E, A, B, C, D, R(61) );
  373.     P( D, E, A, B, C, R(62) );
  374.     P( C, D, E, A, B, R(63) );
  375.     P( B, C, D, E, A, R(64) );
  376.     P( A, B, C, D, E, R(65) );
  377.     P( E, A, B, C, D, R(66) );
  378.     P( D, E, A, B, C, R(67) );
  379.     P( C, D, E, A, B, R(68) );
  380.     P( B, C, D, E, A, R(69) );
  381.     P( A, B, C, D, E, R(70) );
  382.     P( E, A, B, C, D, R(71) );
  383.     P( D, E, A, B, C, R(72) );
  384.     P( C, D, E, A, B, R(73) );
  385.     P( B, C, D, E, A, R(74) );
  386.     P( A, B, C, D, E, R(75) );
  387.     P( E, A, B, C, D, R(76) );
  388.     P( D, E, A, B, C, R(77) );
  389.     P( C, D, E, A, B, R(78) );
  390.     P( B, C, D, E, A, R(79) );
  391. #undef K
  392. #undef F
  393.     ctx->state[0] += A;
  394.     ctx->state[1] += B;
  395.     ctx->state[2] += C;
  396.     ctx->state[3] += D;
  397.     ctx->state[4] += E;
  398. }
  399. #undef P
  400. #undef R
  401. #undef S
  402. void sha1_update( sha1_context *ctx, uint8 *input, uint32 length )
  403. {
  404.     uint32 left, fill;
  405.     if( ! length ) return;
  406.     left = ctx->total[0] & 0x3F;
  407.     fill = 64 - left;
  408.     ctx->total[0] += length;
  409.     ctx->total[0] &= 0xFFFFFFFF;
  410.     if( ctx->total[0] < length )
  411.         ctx->total[1]++;
  412.     if( left && length >= fill )
  413.     {
  414.         memcpy( (void *) (ctx->buffer + left),
  415.                 (void *) input, fill );
  416.         sha1_process( ctx, ctx->buffer );
  417.         length -= fill;
  418.         input  += fill;
  419.         left = 0;
  420.     }
  421.     while( length >= 64 )
  422.     {
  423.         sha1_process( ctx, input );
  424.         length -= 64;
  425.         input  += 64;
  426.     }
  427.     if( length )
  428.     {
  429.         memcpy( (void *) (ctx->buffer + left),
  430.                 (void *) input, length );
  431.     }
  432. }
  433. static uint8 sha1_padding[64] =
  434. {
  435.  0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  436.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  437.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  438.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  439. };
  440. void sha1_finish( sha1_context *ctx, uint8 digest[20] )
  441. {
  442.     uint32 last, padn;
  443.     uint32 high, low;
  444.     uint8 msglen[8];
  445.     high = ( ctx->total[0] >> 29 )
  446.          | ( ctx->total[1] <<  3 );
  447.     low  = ( ctx->total[0] <<  3 );
  448.     PUT_UINT32_BE( high, msglen, 0 );
  449.     PUT_UINT32_BE( low,  msglen, 4 );
  450.     last = ctx->total[0] & 0x3F;
  451.     padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
  452.     sha1_update( ctx, sha1_padding, padn );
  453.     sha1_update( ctx, msglen, 8 );
  454.     PUT_UINT32_BE( ctx->state[0], digest,  0 );
  455.     PUT_UINT32_BE( ctx->state[1], digest,  4 );
  456.     PUT_UINT32_BE( ctx->state[2], digest,  8 );
  457.     PUT_UINT32_BE( ctx->state[3], digest, 12 );
  458.     PUT_UINT32_BE( ctx->state[4], digest, 16 );
  459. }
  460. void hmac_sha1( uint8 *key, int keylen, uint8 *buffer, int length,
  461.                 uint8 digest[20] )
  462. {
  463.     int i;
  464.     sha1_context ctx;
  465.     uint8 k_ipad[64];
  466.     uint8 k_opad[64];
  467.     uint8 tmpbuf[20];
  468.     memset( k_ipad, 0, sizeof( k_ipad ) );
  469.     memset( k_opad, 0, sizeof( k_opad ) );
  470.     memcpy( k_ipad, key, keylen );
  471.     memcpy( k_opad, key, keylen );
  472.     for( i = 0; i < 64; i++ )
  473.     {
  474.         k_ipad[i] ^= 0x36;
  475.         k_opad[i] ^= 0x5C;
  476.     }
  477.     sha1_starts( &ctx );
  478.     sha1_update( &ctx, k_ipad, 64 );
  479.     sha1_update( &ctx, buffer, length );
  480.     sha1_finish( &ctx, tmpbuf );
  481.     sha1_starts( &ctx );
  482.     sha1_update( &ctx, k_opad, 64 );
  483.     sha1_update( &ctx, tmpbuf, 20 );
  484.     sha1_finish( &ctx, digest );
  485. }
  486. /* An implementation of the ARC4 algorithm */
  487. void rc4_setup( struct rc4_state *s, unsigned char *key,  int length )
  488. {
  489.     int i, j, k, *m, a;
  490.     s->x = 0;
  491.     s->y = 0;
  492.     m = s->m;
  493.     for( i = 0; i < 256; i++ )
  494.     {
  495.         m[i] = i;
  496.     }
  497.     j = k = 0;
  498.     for( i = 0; i < 256; i++ )
  499.     {
  500.         a = m[i];
  501.         j = (unsigned char) ( j + a + key[k] );
  502.         m[i] = m[j]; m[j] = a;
  503.         if( ++k >= length ) k = 0;
  504.     }
  505. }
  506. void rc4_crypt( struct rc4_state *s, unsigned char *data, int length )
  507.     int i, x, y, *m, a, b;
  508.     x = s->x;
  509.     y = s->y;
  510.     m = s->m;
  511.     for( i = 0; i < length; i++ )
  512.     {
  513.         x = (unsigned char) ( x + 1 ); a = m[x];
  514.         y = (unsigned char) ( y + a );
  515.         m[x] = b = m[y];
  516.         m[y] = a;
  517.         data[i] ^= m[(unsigned char) ( a + b )];
  518.     }
  519.     s->x = x;
  520.     s->y = y;
  521. }
  522. /* FIPS-197 compliant AES implementation */
  523. /* forward S-box & tables */
  524. uint32 FSb[256];
  525. uint32 FT0[256]; 
  526. uint32 FT1[256]; 
  527. uint32 FT2[256]; 
  528. uint32 FT3[256]; 
  529. /* reverse S-box & tables */
  530. uint32 RSb[256];
  531. uint32 RT0[256];
  532. uint32 RT1[256];
  533. uint32 RT2[256];
  534. uint32 RT3[256];
  535. /* round constants */
  536. uint32 RCON[10];
  537. /* tables generation flag */
  538. int do_init = 1;
  539. /* tables generation routine */
  540. #define ROTR8(x) ( ( ( x << 24 ) & 0xFFFFFFFF ) | 
  541.                    ( ( x & 0xFFFFFFFF ) >>  8 ) )
  542. #define XTIME(x) ( ( x <<  1 ) ^ ( ( x & 0x80 ) ? 0x1B : 0x00 ) )
  543. #define MUL(x,y) ( ( x &&  y ) ? pow[(log[x] + log[y]) % 255] : 0 )
  544. void aes_gen_tables( void )
  545. {
  546.     int i;
  547.     uint8 x, y;
  548.     uint8 pow[256];
  549.     uint8 log[256];
  550.     /* compute pow and log tables over GF(2^8) */
  551.     for( i = 0, x = 1; i < 256; i++, x ^= XTIME( x ) )
  552.     {
  553.         pow[i] = x;
  554.         log[x] = i;
  555.     }
  556.     /* calculate the round constants */
  557.     for( i = 0, x = 1; i < 10; i++, x = XTIME( x ) )
  558.     {
  559.         RCON[i] = (uint32) x << 24;
  560.     }
  561.     /* generate the forward and reverse S-boxes */
  562.     FSb[0x00] = 0x63;
  563.     RSb[0x63] = 0x00;
  564.     for( i = 1; i < 256; i++ )
  565.     {
  566.         x = pow[255 - log[i]];
  567.         y = x;  y = ( y << 1 ) | ( y >> 7 );
  568.         x ^= y; y = ( y << 1 ) | ( y >> 7 );
  569.         x ^= y; y = ( y << 1 ) | ( y >> 7 );
  570.         x ^= y; y = ( y << 1 ) | ( y >> 7 );
  571.         x ^= y ^ 0x63;
  572.         FSb[i] = x;
  573.         RSb[x] = i;
  574.     }
  575.     /* generate the forward and reverse tables */
  576.     for( i = 0; i < 256; i++ )
  577.     {
  578.         x = (unsigned char) FSb[i]; y = XTIME( x );
  579.         FT0[i] =   (uint32) ( x ^ y ) ^
  580.                  ( (uint32) x <<  8 ) ^
  581.                  ( (uint32) x << 16 ) ^
  582.                  ( (uint32) y << 24 );
  583.         FT0[i] &= 0xFFFFFFFF;
  584.         FT1[i] = ROTR8( FT0[i] );
  585.         FT2[i] = ROTR8( FT1[i] );
  586.         FT3[i] = ROTR8( FT2[i] );
  587.         y = (unsigned char) RSb[i];
  588.         RT0[i] = ( (uint32) MUL( 0x0B, y )       ) ^
  589.                  ( (uint32) MUL( 0x0D, y ) <<  8 ) ^
  590.                  ( (uint32) MUL( 0x09, y ) << 16 ) ^
  591.                  ( (uint32) MUL( 0x0E, y ) << 24 );
  592.         RT0[i] &= 0xFFFFFFFF;
  593.         RT1[i] = ROTR8( RT0[i] );
  594.         RT2[i] = ROTR8( RT1[i] );
  595.         RT3[i] = ROTR8( RT2[i] );
  596.     }
  597. }
  598. /* decryption key schedule tables */
  599. int KT_init = 1;
  600. uint32 KT0[256];
  601. uint32 KT1[256];
  602. uint32 KT2[256];
  603. uint32 KT3[256];
  604. /* AES key scheduling routine */
  605. int aes_set_key( aes_context *ctx, uint8 *key, int nbits )
  606. {
  607.     int i;
  608.     uint32 *RK, *SK;
  609.     if( do_init )
  610.     {
  611.         aes_gen_tables();
  612.         do_init = 0;
  613.     }
  614.     switch( nbits )
  615.     {
  616.         case 128: ctx->nr = 10; break;
  617.         case 192: ctx->nr = 12; break;
  618.         case 256: ctx->nr = 14; break;
  619.         default : return( 1 );
  620.     }
  621.     RK = ctx->erk;
  622.     for( i = 0; i < (nbits >> 5); i++ )
  623.     {
  624.         GET_UINT32_BE( RK[i], key, i * 4 );
  625.     }
  626.     /* setup encryption round keys */
  627.     switch( nbits )
  628.     {
  629.     case 128:
  630.         for( i = 0; i < 10; i++, RK += 4 )
  631.         {
  632.             RK[4]  = RK[0] ^ RCON[i] ^
  633.                         ( FSb[ (uint8) ( RK[3] >> 16 ) ] << 24 ) ^
  634.                         ( FSb[ (uint8) ( RK[3] >>  8 ) ] << 16 ) ^
  635.                         ( FSb[ (uint8) ( RK[3]       ) ] <<  8 ) ^
  636.                         ( FSb[ (uint8) ( RK[3] >> 24 ) ]       );
  637.             RK[5]  = RK[1] ^ RK[4];
  638.             RK[6]  = RK[2] ^ RK[5];
  639.             RK[7]  = RK[3] ^ RK[6];
  640.         }
  641.         break;
  642.     case 192:
  643.         for( i = 0; i < 8; i++, RK += 6 )
  644.         {
  645.             RK[6]  = RK[0] ^ RCON[i] ^
  646.                         ( FSb[ (uint8) ( RK[5] >> 16 ) ] << 24 ) ^
  647.                         ( FSb[ (uint8) ( RK[5] >>  8 ) ] << 16 ) ^
  648.                         ( FSb[ (uint8) ( RK[5]       ) ] <<  8 ) ^
  649.                         ( FSb[ (uint8) ( RK[5] >> 24 ) ]       );
  650.             RK[7]  = RK[1] ^ RK[6];
  651.             RK[8]  = RK[2] ^ RK[7];
  652.             RK[9]  = RK[3] ^ RK[8];
  653.             RK[10] = RK[4] ^ RK[9];
  654.             RK[11] = RK[5] ^ RK[10];
  655.         }
  656.         break;
  657.     case 256:
  658.         for( i = 0; i < 7; i++, RK += 8 )
  659.         {
  660.             RK[8]  = RK[0] ^ RCON[i] ^
  661.                         ( FSb[ (uint8) ( RK[7] >> 16 ) ] << 24 ) ^
  662.                         ( FSb[ (uint8) ( RK[7] >>  8 ) ] << 16 ) ^
  663.                         ( FSb[ (uint8) ( RK[7]       ) ] <<  8 ) ^
  664.                         ( FSb[ (uint8) ( RK[7] >> 24 ) ]       );
  665.             RK[9]  = RK[1] ^ RK[8];
  666.             RK[10] = RK[2] ^ RK[9];
  667.             RK[11] = RK[3] ^ RK[10];
  668.             RK[12] = RK[4] ^
  669.                         ( FSb[ (uint8) ( RK[11] >> 24 ) ] << 24 ) ^
  670.                         ( FSb[ (uint8) ( RK[11] >> 16 ) ] << 16 ) ^
  671.                         ( FSb[ (uint8) ( RK[11] >>  8 ) ] <<  8 ) ^
  672.                         ( FSb[ (uint8) ( RK[11]       ) ]       );
  673.             RK[13] = RK[5] ^ RK[12];
  674.             RK[14] = RK[6] ^ RK[13];
  675.             RK[15] = RK[7] ^ RK[14];
  676.         }
  677.         break;
  678.     }
  679.     /* setup decryption round keys */
  680.     if( KT_init )
  681.     {
  682.         for( i = 0; i < 256; i++ )
  683.         {
  684.             KT0[i] = RT0[ FSb[i] ];
  685.             KT1[i] = RT1[ FSb[i] ];
  686.             KT2[i] = RT2[ FSb[i] ];
  687.             KT3[i] = RT3[ FSb[i] ];
  688.         }
  689.         KT_init = 0;
  690.     }
  691.     SK = ctx->drk;
  692.     *SK++ = *RK++;
  693.     *SK++ = *RK++;
  694.     *SK++ = *RK++;
  695.     *SK++ = *RK++;
  696.     for( i = 1; i < ctx->nr; i++ )
  697.     {
  698.         RK -= 8;
  699.         *SK++ = KT0[ (uint8) ( *RK >> 24 ) ] ^
  700.                 KT1[ (uint8) ( *RK >> 16 ) ] ^
  701.                 KT2[ (uint8) ( *RK >>  8 ) ] ^
  702.                 KT3[ (uint8) ( *RK       ) ]; RK++;
  703.         *SK++ = KT0[ (uint8) ( *RK >> 24 ) ] ^
  704.                 KT1[ (uint8) ( *RK >> 16 ) ] ^
  705.                 KT2[ (uint8) ( *RK >>  8 ) ] ^
  706.                 KT3[ (uint8) ( *RK       ) ]; RK++;
  707.         *SK++ = KT0[ (uint8) ( *RK >> 24 ) ] ^
  708.                 KT1[ (uint8) ( *RK >> 16 ) ] ^
  709.                 KT2[ (uint8) ( *RK >>  8 ) ] ^
  710.                 KT3[ (uint8) ( *RK       ) ]; RK++;
  711.         *SK++ = KT0[ (uint8) ( *RK >> 24 ) ] ^
  712.                 KT1[ (uint8) ( *RK >> 16 ) ] ^
  713.                 KT2[ (uint8) ( *RK >>  8 ) ] ^
  714.                 KT3[ (uint8) ( *RK       ) ]; RK++;
  715.     }
  716.     RK -= 8;
  717.     *SK++ = *RK++;
  718.     *SK++ = *RK++;
  719.     *SK++ = *RK++;
  720.     *SK++ = *RK++;
  721.     return( 0 );
  722. }
  723. /* AES 128-bit block encryption routine */
  724. void aes_encrypt( aes_context *ctx, uint8 input[16], uint8 output[16] )
  725. {
  726.     uint32 *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
  727.     RK = ctx->erk;
  728.     GET_UINT32_BE( X0, input,  0 ); X0 ^= RK[0];
  729.     GET_UINT32_BE( X1, input,  4 ); X1 ^= RK[1];
  730.     GET_UINT32_BE( X2, input,  8 ); X2 ^= RK[2];
  731.     GET_UINT32_BE( X3, input, 12 ); X3 ^= RK[3];
  732. #define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3)     
  733. {                                               
  734.     RK += 4;                                    
  735.                                                 
  736.     X0 = RK[0] ^ FT0[ (uint8) ( Y0 >> 24 ) ] ^  
  737.                  FT1[ (uint8) ( Y1 >> 16 ) ] ^  
  738.                  FT2[ (uint8) ( Y2 >>  8 ) ] ^  
  739.                  FT3[ (uint8) ( Y3       ) ];   
  740.                                                 
  741.     X1 = RK[1] ^ FT0[ (uint8) ( Y1 >> 24 ) ] ^  
  742.                  FT1[ (uint8) ( Y2 >> 16 ) ] ^  
  743.                  FT2[ (uint8) ( Y3 >>  8 ) ] ^  
  744.                  FT3[ (uint8) ( Y0       ) ];   
  745.                                                 
  746.     X2 = RK[2] ^ FT0[ (uint8) ( Y2 >> 24 ) ] ^  
  747.                  FT1[ (uint8) ( Y3 >> 16 ) ] ^  
  748.                  FT2[ (uint8) ( Y0 >>  8 ) ] ^  
  749.                  FT3[ (uint8) ( Y1       ) ];   
  750.                                                 
  751.     X3 = RK[3] ^ FT0[ (uint8) ( Y3 >> 24 ) ] ^  
  752.                  FT1[ (uint8) ( Y0 >> 16 ) ] ^  
  753.                  FT2[ (uint8) ( Y1 >>  8 ) ] ^  
  754.                  FT3[ (uint8) ( Y2       ) ];   
  755. }
  756.     AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );       /* round 1 */
  757.     AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );       /* round 2 */
  758.     AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );       /* round 3 */
  759.     AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );       /* round 4 */
  760.     AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );       /* round 5 */
  761.     AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );       /* round 6 */
  762.     AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );       /* round 7 */
  763.     AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );       /* round 8 */
  764.     AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );       /* round 9 */
  765.     if( ctx->nr > 10 )
  766.     {
  767.         AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );   /* round 10 */
  768.         AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );   /* round 11 */
  769.     }
  770.     if( ctx->nr > 12 )
  771.     {
  772.         AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );   /* round 12 */
  773.         AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );   /* round 13 */
  774.     }
  775.     /* last round */
  776.     RK += 4;
  777.     X0 = RK[0] ^ ( FSb[ (uint8) ( Y0 >> 24 ) ] << 24 ) ^
  778.                  ( FSb[ (uint8) ( Y1 >> 16 ) ] << 16 ) ^
  779.                  ( FSb[ (uint8) ( Y2 >>  8 ) ] <<  8 ) ^
  780.                  ( FSb[ (uint8) ( Y3       ) ]       );
  781.     X1 = RK[1] ^ ( FSb[ (uint8) ( Y1 >> 24 ) ] << 24 ) ^
  782.                  ( FSb[ (uint8) ( Y2 >> 16 ) ] << 16 ) ^
  783.                  ( FSb[ (uint8) ( Y3 >>  8 ) ] <<  8 ) ^
  784.                  ( FSb[ (uint8) ( Y0       ) ]       );
  785.     X2 = RK[2] ^ ( FSb[ (uint8) ( Y2 >> 24 ) ] << 24 ) ^
  786.                  ( FSb[ (uint8) ( Y3 >> 16 ) ] << 16 ) ^
  787.                  ( FSb[ (uint8) ( Y0 >>  8 ) ] <<  8 ) ^
  788.                  ( FSb[ (uint8) ( Y1       ) ]       );
  789.     X3 = RK[3] ^ ( FSb[ (uint8) ( Y3 >> 24 ) ] << 24 ) ^
  790.                  ( FSb[ (uint8) ( Y0 >> 16 ) ] << 16 ) ^
  791.                  ( FSb[ (uint8) ( Y1 >>  8 ) ] <<  8 ) ^
  792.                  ( FSb[ (uint8) ( Y2       ) ]       );
  793.     PUT_UINT32_BE( X0, output,  0 );
  794.     PUT_UINT32_BE( X1, output,  4 );
  795.     PUT_UINT32_BE( X2, output,  8 );
  796.     PUT_UINT32_BE( X3, output, 12 );
  797. }
  798. /* AES 128-bit block decryption routine */
  799. void aes_decrypt( aes_context *ctx, uint8 input[16], uint8 output[16] )
  800. {
  801.     uint32 *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
  802.     RK = ctx->drk;
  803.     GET_UINT32_BE( X0, input,  0 ); X0 ^= RK[0];
  804.     GET_UINT32_BE( X1, input,  4 ); X1 ^= RK[1];
  805.     GET_UINT32_BE( X2, input,  8 ); X2 ^= RK[2];
  806.     GET_UINT32_BE( X3, input, 12 ); X3 ^= RK[3];
  807. #define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3)     
  808. {                                               
  809.     RK += 4;                                    
  810.                                                 
  811.     X0 = RK[0] ^ RT0[ (uint8) ( Y0 >> 24 ) ] ^  
  812.                  RT1[ (uint8) ( Y3 >> 16 ) ] ^  
  813.                  RT2[ (uint8) ( Y2 >>  8 ) ] ^  
  814.                  RT3[ (uint8) ( Y1       ) ];   
  815.                                                 
  816.     X1 = RK[1] ^ RT0[ (uint8) ( Y1 >> 24 ) ] ^  
  817.                  RT1[ (uint8) ( Y0 >> 16 ) ] ^  
  818.                  RT2[ (uint8) ( Y3 >>  8 ) ] ^  
  819.                  RT3[ (uint8) ( Y2       ) ];   
  820.                                                 
  821.     X2 = RK[2] ^ RT0[ (uint8) ( Y2 >> 24 ) ] ^  
  822.                  RT1[ (uint8) ( Y1 >> 16 ) ] ^  
  823.                  RT2[ (uint8) ( Y0 >>  8 ) ] ^  
  824.                  RT3[ (uint8) ( Y3       ) ];   
  825.                                                 
  826.     X3 = RK[3] ^ RT0[ (uint8) ( Y3 >> 24 ) ] ^  
  827.                  RT1[ (uint8) ( Y2 >> 16 ) ] ^  
  828.                  RT2[ (uint8) ( Y1 >>  8 ) ] ^  
  829.                  RT3[ (uint8) ( Y0       ) ];   
  830. }
  831.     AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );       /* round 1 */
  832.     AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );       /* round 2 */
  833.     AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );       /* round 3 */
  834.     AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );       /* round 4 */
  835.     AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );       /* round 5 */
  836.     AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );       /* round 6 */
  837.     AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );       /* round 7 */
  838.     AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );       /* round 8 */
  839.     AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );       /* round 9 */
  840.     if( ctx->nr > 10 )
  841.     {
  842.         AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );   /* round 10 */
  843.         AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );   /* round 11 */
  844.     }
  845.     if( ctx->nr > 12 )
  846.     {
  847.         AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );   /* round 12 */
  848.         AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );   /* round 13 */
  849.     }
  850.     /* last round */
  851.     RK += 4;
  852.     X0 = RK[0] ^ ( RSb[ (uint8) ( Y0 >> 24 ) ] << 24 ) ^
  853.                  ( RSb[ (uint8) ( Y3 >> 16 ) ] << 16 ) ^
  854.                  ( RSb[ (uint8) ( Y2 >>  8 ) ] <<  8 ) ^
  855.                  ( RSb[ (uint8) ( Y1       ) ]       );
  856.     X1 = RK[1] ^ ( RSb[ (uint8) ( Y1 >> 24 ) ] << 24 ) ^
  857.                  ( RSb[ (uint8) ( Y0 >> 16 ) ] << 16 ) ^
  858.                  ( RSb[ (uint8) ( Y3 >>  8 ) ] <<  8 ) ^
  859.                  ( RSb[ (uint8) ( Y2       ) ]       );
  860.     X2 = RK[2] ^ ( RSb[ (uint8) ( Y2 >> 24 ) ] << 24 ) ^
  861.                  ( RSb[ (uint8) ( Y1 >> 16 ) ] << 16 ) ^
  862.                  ( RSb[ (uint8) ( Y0 >>  8 ) ] <<  8 ) ^
  863.                  ( RSb[ (uint8) ( Y3       ) ]       );
  864.     X3 = RK[3] ^ ( RSb[ (uint8) ( Y3 >> 24 ) ] << 24 ) ^
  865.                  ( RSb[ (uint8) ( Y2 >> 16 ) ] << 16 ) ^
  866.                  ( RSb[ (uint8) ( Y1 >>  8 ) ] <<  8 ) ^
  867.                  ( RSb[ (uint8) ( Y0       ) ]       );
  868.     PUT_UINT32_BE( X0, output,  0 );
  869.     PUT_UINT32_BE( X1, output,  4 );
  870.     PUT_UINT32_BE( X2, output,  8 );
  871.     PUT_UINT32_BE( X3, output, 12 );
  872. }