Sha.cpp
上传用户:lds876
上传日期:2013-05-25
资源大小:567k
文件大小:7k
源码类别:

P2P编程

开发平台:

Visual C++

  1. // Sha.cpp: implementation of the CSha class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "Sha.h"
  6. #include <string.h>
  7. //#include "sha1.h"
  8. //////////////////////////////////////////////////////////////////////
  9. // Construction/Destruction
  10. //////////////////////////////////////////////////////////////////////
  11. #define GET_UINT32(n,b,i)                       
  12. {                                               
  13.     (n) = ( (uint32) (b)[(i)    ] << 24 )       
  14.         | ( (uint32) (b)[(i) + 1] << 16 )       
  15.         | ( (uint32) (b)[(i) + 2] <<  8 )       
  16.         | ( (uint32) (b)[(i) + 3]       );      
  17. }
  18. #define PUT_UINT32(n,b,i)                       
  19. {                                               
  20.     (b)[(i)    ] = (uint8) ( (n) >> 24 );       
  21.     (b)[(i) + 1] = (uint8) ( (n) >> 16 );       
  22.     (b)[(i) + 2] = (uint8) ( (n) >>  8 );       
  23.     (b)[(i) + 3] = (uint8) ( (n)       );       
  24. }
  25. void sha1_starts( struct sha1_context *ctx )
  26. {
  27.     ctx->total[0] = 0;
  28.     ctx->total[1] = 0;
  29.     ctx->state[0] = 0x67452301;
  30.     ctx->state[1] = 0xEFCDAB89;
  31.     ctx->state[2] = 0x98BADCFE;
  32.     ctx->state[3] = 0x10325476;
  33.     ctx->state[4] = 0xC3D2E1F0;
  34. }
  35. void sha1_process( struct sha1_context *ctx, uint8 data[64] )
  36. {
  37.     uint32 temp, A, B, C, D, E, W[16];
  38.     GET_UINT32( W[0],  data,  0 );
  39.     GET_UINT32( W[1],  data,  4 );
  40.     GET_UINT32( W[2],  data,  8 );
  41.     GET_UINT32( W[3],  data, 12 );
  42.     GET_UINT32( W[4],  data, 16 );
  43.     GET_UINT32( W[5],  data, 20 );
  44.     GET_UINT32( W[6],  data, 24 );
  45.     GET_UINT32( W[7],  data, 28 );
  46.     GET_UINT32( W[8],  data, 32 );
  47.     GET_UINT32( W[9],  data, 36 );
  48.     GET_UINT32( W[10], data, 40 );
  49.     GET_UINT32( W[11], data, 44 );
  50.     GET_UINT32( W[12], data, 48 );
  51.     GET_UINT32( W[13], data, 52 );
  52.     GET_UINT32( W[14], data, 56 );
  53.     GET_UINT32( W[15], data, 60 );
  54. #define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
  55. #define R(t)                                            
  56. (                                                       
  57.     temp = W[(t -  3) & 0x0F] ^ W[(t - 8) & 0x0F] ^     
  58.            W[(t - 14) & 0x0F] ^ W[ t      & 0x0F],      
  59.     ( W[t & 0x0F] = S(temp,1) )                         
  60. )
  61. #define P(a,b,c,d,e,x)                                  
  62. {                                                       
  63.     e += S(a,5) + F(b,c,d) + K + x; b = S(b,30);        
  64. }
  65.     A = ctx->state[0];
  66.     B = ctx->state[1];
  67.     C = ctx->state[2];
  68.     D = ctx->state[3];
  69.     E = ctx->state[4];
  70. #define F(x,y,z) (z ^ (x & (y ^ z)))
  71. #define K 0x5A827999
  72.     P( A, B, C, D, E, W[0]  );
  73.     P( E, A, B, C, D, W[1]  );
  74.     P( D, E, A, B, C, W[2]  );
  75.     P( C, D, E, A, B, W[3]  );
  76.     P( B, C, D, E, A, W[4]  );
  77.     P( A, B, C, D, E, W[5]  );
  78.     P( E, A, B, C, D, W[6]  );
  79.     P( D, E, A, B, C, W[7]  );
  80.     P( C, D, E, A, B, W[8]  );
  81.     P( B, C, D, E, A, W[9]  );
  82.     P( A, B, C, D, E, W[10] );
  83.     P( E, A, B, C, D, W[11] );
  84.     P( D, E, A, B, C, W[12] );
  85.     P( C, D, E, A, B, W[13] );
  86.     P( B, C, D, E, A, W[14] );
  87.     P( A, B, C, D, E, W[15] );
  88.     P( E, A, B, C, D, R(16) );
  89.     P( D, E, A, B, C, R(17) );
  90.     P( C, D, E, A, B, R(18) );
  91.     P( B, C, D, E, A, R(19) );
  92. #undef K
  93. #undef F
  94. #define F(x,y,z) (x ^ y ^ z)
  95. #define K 0x6ED9EBA1
  96.     P( A, B, C, D, E, R(20) );
  97.     P( E, A, B, C, D, R(21) );
  98.     P( D, E, A, B, C, R(22) );
  99.     P( C, D, E, A, B, R(23) );
  100.     P( B, C, D, E, A, R(24) );
  101.     P( A, B, C, D, E, R(25) );
  102.     P( E, A, B, C, D, R(26) );
  103.     P( D, E, A, B, C, R(27) );
  104.     P( C, D, E, A, B, R(28) );
  105.     P( B, C, D, E, A, R(29) );
  106.     P( A, B, C, D, E, R(30) );
  107.     P( E, A, B, C, D, R(31) );
  108.     P( D, E, A, B, C, R(32) );
  109.     P( C, D, E, A, B, R(33) );
  110.     P( B, C, D, E, A, R(34) );
  111.     P( A, B, C, D, E, R(35) );
  112.     P( E, A, B, C, D, R(36) );
  113.     P( D, E, A, B, C, R(37) );
  114.     P( C, D, E, A, B, R(38) );
  115.     P( B, C, D, E, A, R(39) );
  116. #undef K
  117. #undef F
  118. #define F(x,y,z) ((x & y) | (z & (x | y)))
  119. #define K 0x8F1BBCDC
  120.     P( A, B, C, D, E, R(40) );
  121.     P( E, A, B, C, D, R(41) );
  122.     P( D, E, A, B, C, R(42) );
  123.     P( C, D, E, A, B, R(43) );
  124.     P( B, C, D, E, A, R(44) );
  125.     P( A, B, C, D, E, R(45) );
  126.     P( E, A, B, C, D, R(46) );
  127.     P( D, E, A, B, C, R(47) );
  128.     P( C, D, E, A, B, R(48) );
  129.     P( B, C, D, E, A, R(49) );
  130.     P( A, B, C, D, E, R(50) );
  131.     P( E, A, B, C, D, R(51) );
  132.     P( D, E, A, B, C, R(52) );
  133.     P( C, D, E, A, B, R(53) );
  134.     P( B, C, D, E, A, R(54) );
  135.     P( A, B, C, D, E, R(55) );
  136.     P( E, A, B, C, D, R(56) );
  137.     P( D, E, A, B, C, R(57) );
  138.     P( C, D, E, A, B, R(58) );
  139.     P( B, C, D, E, A, R(59) );
  140. #undef K
  141. #undef F
  142. #define F(x,y,z) (x ^ y ^ z)
  143. #define K 0xCA62C1D6
  144.     P( A, B, C, D, E, R(60) );
  145.     P( E, A, B, C, D, R(61) );
  146.     P( D, E, A, B, C, R(62) );
  147.     P( C, D, E, A, B, R(63) );
  148.     P( B, C, D, E, A, R(64) );
  149.     P( A, B, C, D, E, R(65) );
  150.     P( E, A, B, C, D, R(66) );
  151.     P( D, E, A, B, C, R(67) );
  152.     P( C, D, E, A, B, R(68) );
  153.     P( B, C, D, E, A, R(69) );
  154.     P( A, B, C, D, E, R(70) );
  155.     P( E, A, B, C, D, R(71) );
  156.     P( D, E, A, B, C, R(72) );
  157.     P( C, D, E, A, B, R(73) );
  158.     P( B, C, D, E, A, R(74) );
  159.     P( A, B, C, D, E, R(75) );
  160.     P( E, A, B, C, D, R(76) );
  161.     P( D, E, A, B, C, R(77) );
  162.     P( C, D, E, A, B, R(78) );
  163.     P( B, C, D, E, A, R(79) );
  164. #undef K
  165. #undef F
  166.     ctx->state[0] += A;
  167.     ctx->state[1] += B;
  168.     ctx->state[2] += C;
  169.     ctx->state[3] += D;
  170.     ctx->state[4] += E;
  171. }
  172. void sha1_update( struct sha1_context *ctx, uint8 *input, uint32 length )
  173. {
  174.     uint32 left, fill;
  175.     if( ! length ) return;
  176.     left = ( ctx->total[0] >> 3 ) & 0x3F;
  177.     fill = 64 - left;
  178.     ctx->total[0] += length <<  3;
  179.     ctx->total[1] += length >> 29;
  180.     ctx->total[0] &= 0xFFFFFFFF;
  181.     ctx->total[1] += ctx->total[0] < ( length << 3 );
  182.     if( left && length >= fill )
  183.     {
  184.         memcpy( (void *) (ctx->buffer + left), (void *) input, fill );
  185.         sha1_process( ctx, ctx->buffer );
  186.         length -= fill;
  187.         input  += fill;
  188.         left = 0;
  189.     }
  190.     while( length >= 64 )
  191.     {
  192.         sha1_process( ctx, input );
  193.         length -= 64;
  194.         input  += 64;
  195.     }
  196.     if( length )
  197.     {
  198.         memcpy( (void *) (ctx->buffer + left), (void *) input, length );
  199.     }
  200. }
  201. static uint8 sha1_padding[64] =
  202. {
  203.  0x80, 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.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  206.     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  207. };
  208. void sha1_finish( struct sha1_context *ctx, uint8 digest[20] )
  209. {
  210.     uint32 last, padn;
  211.     uint8 msglen[8];
  212.     PUT_UINT32( ctx->total[1], msglen, 0 );
  213.     PUT_UINT32( ctx->total[0], msglen, 4 );
  214.     last = ( ctx->total[0] >> 3 ) & 0x3F;
  215.     padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
  216.     sha1_update( ctx, sha1_padding, padn );
  217.     sha1_update( ctx, msglen, 8 );
  218.     PUT_UINT32( ctx->state[0], digest,  0 );
  219.     PUT_UINT32( ctx->state[1], digest,  4 );
  220.     PUT_UINT32( ctx->state[2], digest,  8 );
  221.     PUT_UINT32( ctx->state[3], digest, 12 );
  222.     PUT_UINT32( ctx->state[4], digest, 16 );
  223. }
  224. void CSHA::start()
  225. {
  226. sha1_starts(&m_ctx);
  227. }
  228. void CSHA::update(uint8 *input, uint32 length )
  229. {
  230. sha1_update(&m_ctx, input, length);
  231. }
  232. void CSHA::finish(uint8 digest[])
  233. {
  234. sha1_finish(&m_ctx, digest);
  235. }