38 #ifndef __INCLUDE_MD5__
39 #define __INCLUDE_MD5__
43 #ifndef __INCLUDE_MIST_CONF_H__
47 #ifndef __INCLUDE_MIST_ENDIAN__
51 #ifndef __INCLUDE_HASH_ALGORITHM__
80 virtual void compute_hash(
const void *bytes,
uint64 length )
85 const uint8 *data =
reinterpret_cast< const uint8 *
>( bytes );
89 uint8 P[ 32 ], *C = P + 16;
90 uint8 S[ 256 ] = { 41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6,
91 19, 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188, 76,
92 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24, 138,
93 23, 229, 18, 190, 78, 196, 214, 218, 158, 222, 73, 160, 251, 245, 142,
94 187, 47, 238, 122, 169, 104, 121, 145, 21, 178, 7, 63, 148, 194, 16,
95 137, 11, 34, 95, 33, 128, 127, 93, 154, 90, 144, 50, 39, 53, 62,
96 204, 231, 191, 247, 151, 3, 255, 25, 48, 179, 72, 165, 181, 209, 215,
97 94, 146, 42, 172, 86, 170, 198, 79, 184, 56, 210, 150, 164, 125, 182,
98 118, 252, 107, 226, 156, 116, 4, 241, 69, 157, 112, 89, 100, 113, 135,
99 32, 134, 91, 207, 101, 230, 45, 168, 2, 27, 96, 37, 173, 174, 176,
100 185, 246, 28, 70, 97, 105, 52, 64, 126, 15, 85, 71, 163, 35, 221,
101 81, 175, 58, 195, 92, 249, 206, 186, 197, 234, 38, 44, 83, 13, 110,
102 133, 40, 132, 9, 211, 223, 205, 244, 65, 129, 77, 82, 106, 220, 55,
103 200, 108, 193, 171, 250, 36, 225, 123, 8, 12, 189, 177, 74, 120, 136,
104 149, 139, 227, 99, 232, 109, 233, 203, 213, 254, 59, 0, 29, 57, 242,
105 239, 183, 14, 102, 88, 208, 228, 166, 119, 114, 248, 235, 117, 75, 10,
106 49, 68, 80, 180, 143, 237, 31, 26, 219, 153, 141, 51, 159, 17, 131, 20
110 memset( P, 0,
sizeof(
uint8 ) * 32 );
111 for( i = 0 ; i < R ; i++ )
113 P[ i ] = data[ len - R + i ];
115 for( ; i < 16 ; i++ )
123 for( i = 0 ; i < N16 ; i++ )
125 for( j = 0 ; j < 16 ; j++ )
127 uint8 c = data[ i * 16 + j ];
130 L = C[ j ] ^= S[ c ^ L ];
133 for( j = 0 ; j < 16 ; j++ )
138 L = C[ j ] ^= S[ c ^ L ];
143 memset( X, 0,
sizeof(
uint8 ) * 48 );
145 for( i = 0 ; i < N16 ; i++ )
147 for( j = 0 ; j < 16 ; j++ )
149 X[ 16 + j ] = data[ i * 16 + j ];
150 X[ 32 + j ] = X[ 16 + j ] ^ X[ j ];
155 for( j = 0 ; j < 18 ; j++ )
159 t = X[ k ] ^= S[ t ];
162 t = ( t + j ) & 0xff;
166 for( i = 0 ; i < 2 ; i++ )
168 for( j = 0 ; j < 16 ; j++ )
170 X[ 16 + j ] = P[ i * 16 + j ];
171 X[ 32 + j ] = X[ 16 + j ] ^ X[ j ];
176 for( j = 0 ; j < 18 ; j++ )
180 t = X[ k ] ^= S[ t ];
183 t = ( t + j ) & 0xff;
187 memcpy( digest, X,
sizeof(
uint8 ) * 16 );
192 virtual const std::string
name( )
const{
return(
"MD2" ); }
196 md2( ) :
base(
"8350e5a3e24c153df2275c9f80692773" ){ }
199 md2(
const std::string &str ) :
base( 16 ) { base::compute_hash( str ); }
202 md2(
const void *data,
uint64 len ) :
base( 16 ){ compute_hash( data, len ); }
224 void FF( uint32 &a, uint32 b, uint32 c, uint32 d, uint32 xk, uint32 s )
226 a = R( a + ( ( b & c ) | ( ~b & d ) ) + xk, s );
229 void GG( uint32 &a, uint32 b, uint32 c, uint32 d, uint32 xk, uint32 s )
231 a = R( a + ( ( b & c ) | ( b & d ) | ( d & c ) ) + xk + 0x5a827999, s );
234 void HH( uint32 &a, uint32 b, uint32 c, uint32 d, uint32 xk, uint32 s )
236 a = R( a + ( b ^ c ^ d ) + xk + 0x6ed9eba1, s );
239 void ToCurrentEndian( uint32 *x, size_type len )
241 for( size_type i = 0 ; i < len ; i++ )
247 void FromCurrentEndian( uint32 *x, size_type len )
249 for( size_type i = 0 ; i < len ; i++ )
256 void Round( uint32 &a, uint32 &b, uint32 &c, uint32 &d, uint32 x[ 16 ] )
264 FF( A, B, C, D, x[ 0 ], 3 ); FF( D, A, B, C, x[ 1 ], 7 ); FF( C, D, A, B, x[ 2 ], 11 ); FF( B, C, D, A, x[ 3 ], 19 );
265 FF( A, B, C, D, x[ 4 ], 3 ); FF( D, A, B, C, x[ 5 ], 7 ); FF( C, D, A, B, x[ 6 ], 11 ); FF( B, C, D, A, x[ 7 ], 19 );
266 FF( A, B, C, D, x[ 8 ], 3 ); FF( D, A, B, C, x[ 9 ], 7 ); FF( C, D, A, B, x[ 10 ], 11 ); FF( B, C, D, A, x[ 11 ], 19 );
267 FF( A, B, C, D, x[ 12 ], 3 ); FF( D, A, B, C, x[ 13 ], 7 ); FF( C, D, A, B, x[ 14 ], 11 ); FF( B, C, D, A, x[ 15 ], 19 );
269 GG( A, B, C, D, x[ 0 ], 3 ); GG( D, A, B, C, x[ 4 ], 5 ); GG( C, D, A, B, x[ 8 ], 9 ); GG( B, C, D, A, x[ 12 ], 13 );
270 GG( A, B, C, D, x[ 1 ], 3 ); GG( D, A, B, C, x[ 5 ], 5 ); GG( C, D, A, B, x[ 9 ], 9 ); GG( B, C, D, A, x[ 13 ], 13 );
271 GG( A, B, C, D, x[ 2 ], 3 ); GG( D, A, B, C, x[ 6 ], 5 ); GG( C, D, A, B, x[ 10 ], 9 ); GG( B, C, D, A, x[ 14 ], 13 );
272 GG( A, B, C, D, x[ 3 ], 3 ); GG( D, A, B, C, x[ 7 ], 5 ); GG( C, D, A, B, x[ 11 ], 9 ); GG( B, C, D, A, x[ 15 ], 13 );
274 HH( A, B, C, D, x[ 0 ], 3 ); HH( D, A, B, C, x[ 8 ], 9 ); HH( C, D, A, B, x[ 4 ], 11 ); HH( B, C, D, A, x[ 12 ], 15 );
275 HH( A, B, C, D, x[ 2 ], 3 ); HH( D, A, B, C, x[ 10 ], 9 ); HH( C, D, A, B, x[ 6 ], 11 ); HH( B, C, D, A, x[ 14 ], 15 );
276 HH( A, B, C, D, x[ 1 ], 3 ); HH( D, A, B, C, x[ 9 ], 9 ); HH( C, D, A, B, x[ 5 ], 11 ); HH( B, C, D, A, x[ 13 ], 15 );
277 HH( A, B, C, D, x[ 3 ], 3 ); HH( D, A, B, C, x[ 11 ], 9 ); HH( C, D, A, B, x[ 7 ], 11 ); HH( B, C, D, A, x[ 15 ], 15 );
287 virtual void compute_hash(
const void *bytes,
uint64 length )
294 uint32 &B = *
reinterpret_cast< uint32 *
>( digest + 4 );
295 uint32 &C = *
reinterpret_cast< uint32 *
>( digest + 8 );
296 uint32 &D = *
reinterpret_cast< uint32 *
>( digest + 12 );
307 const uint8 *data =
reinterpret_cast< const uint8 *
>( bytes );
310 for( i = 0 ; i + 64 < len ; i += 64 )
312 memcpy( xx, data + i,
sizeof(
uint8 ) * 64 );
313 ToCurrentEndian( x, 16 );
314 Round( A, B, C, D, x );
322 memcpy( xx, data + i,
sizeof(
uint8 ) * rest );
323 memset( xx + rest, 0,
sizeof(
uint8 ) * ( 64 - rest ) );
328 ToCurrentEndian( x, 16 );
329 Round( A, B, C, D, x );
332 memset( xx, 0,
sizeof(
uint8 ) * 64 );
333 x[ 14 ] =
static_cast< uint32 >( length );
334 x[ 15 ] =
static_cast< uint32 >( length >> 32 );
337 Round( A, B, C, D, x );
341 memcpy( xx, data + i,
sizeof(
uint8 ) * rest );
342 memset( xx + rest, 0,
sizeof(
uint8 ) * ( 64 - rest ) );
346 ToCurrentEndian( x, 16 );
349 x[ 14 ] =
static_cast< uint32 >( length );
350 x[ 15 ] =
static_cast< uint32 >( length >> 32 );
353 Round( A, B, C, D, x );
356 FromCurrentEndian( reinterpret_cast< uint32 * >( digest ), 4 );
361 virtual const std::string
name( )
const{
return(
"MD4" ); }
365 md4( ) :
base(
"31d6cfe0d16ae931b73c59d7e0c089c0" ){ }
368 md4(
const std::string &str ) :
base( 16 ) { base::compute_hash( str ); }
371 md4(
const void *data,
uint64 len ) :
base( 16 ){ compute_hash( data, len ); }
396 void FF( uint32 &a, uint32 b, uint32 c, uint32 d, uint32 xk, uint32 s, uint32 ti )
398 a = b + R( a + ( ( b & c ) | ( ~b & d ) ) + xk + ti, s );
401 void GG( uint32 &a, uint32 b, uint32 c, uint32 d, uint32 xk, uint32 s, uint32 ti )
403 a = b + R( a + ( ( b & d ) | ( ~d & c ) ) + xk + ti, s );
406 void HH( uint32 &a, uint32 b, uint32 c, uint32 d, uint32 xk, uint32 s, uint32 ti )
408 a = b + R( a + ( b ^ c ^ d ) + xk + ti, s );
411 void II( uint32 &a, uint32 b, uint32 c, uint32 d, uint32 xk, uint32 s, uint32 ti )
413 a = b + R( a + ( c ^ ( b | ~d ) ) + xk + ti, s );
416 void ToCurrentEndian( uint32 *x, size_type len )
418 for( size_type i = 0 ; i < len ; i++ )
424 void FromCurrentEndian( uint32 *x, size_type len )
426 for( size_type i = 0 ; i < len ; i++ )
433 void Round( uint32 &a, uint32 &b, uint32 &c, uint32 &d, uint32 x[ 16 ] )
441 FF( A, B, C, D, x[ 0 ], 7, 0xd76aa478 );
442 FF( D, A, B, C, x[ 1 ], 12, 0xe8c7b756 );
443 FF( C, D, A, B, x[ 2 ], 17, 0x242070db );
444 FF( B, C, D, A, x[ 3 ], 22, 0xc1bdceee );
445 FF( A, B, C, D, x[ 4 ], 7, 0xf57c0faf );
446 FF( D, A, B, C, x[ 5 ], 12, 0x4787c62a );
447 FF( C, D, A, B, x[ 6 ], 17, 0xa8304613 );
448 FF( B, C, D, A, x[ 7 ], 22, 0xfd469501 );
449 FF( A, B, C, D, x[ 8 ], 7, 0x698098d8 );
450 FF( D, A, B, C, x[ 9 ], 12, 0x8b44f7af );
451 FF( C, D, A, B, x[ 10 ], 17, 0xffff5bb1 );
452 FF( B, C, D, A, x[ 11 ], 22, 0x895cd7be );
453 FF( A, B, C, D, x[ 12 ], 7, 0x6b901122 );
454 FF( D, A, B, C, x[ 13 ], 12, 0xfd987193 );
455 FF( C, D, A, B, x[ 14 ], 17, 0xa679438e );
456 FF( B, C, D, A, x[ 15 ], 22, 0x49b40821 );
458 GG( A, B, C, D, x[ 1 ], 5, 0xf61e2562 );
459 GG( D, A, B, C, x[ 6 ], 9, 0xc040b340 );
460 GG( C, D, A, B, x[ 11 ], 14, 0x265e5a51 );
461 GG( B, C, D, A, x[ 0 ], 20, 0xe9b6c7aa );
462 GG( A, B, C, D, x[ 5 ], 5, 0xd62f105d );
463 GG( D, A, B, C, x[ 10 ], 9, 0x02441453 );
464 GG( C, D, A, B, x[ 15 ], 14, 0xd8a1e681 );
465 GG( B, C, D, A, x[ 4 ], 20, 0xe7d3fbc8 );
466 GG( A, B, C, D, x[ 9 ], 5, 0x21e1cde6 );
467 GG( D, A, B, C, x[ 14 ], 9, 0xc33707d6 );
468 GG( C, D, A, B, x[ 3 ], 14, 0xf4d50d87 );
469 GG( B, C, D, A, x[ 8 ], 20, 0x455a14ed );
470 GG( A, B, C, D, x[ 13 ], 5, 0xa9e3e905 );
471 GG( D, A, B, C, x[ 2 ], 9, 0xfcefa3f8 );
472 GG( C, D, A, B, x[ 7 ], 14, 0x676f02d9 );
473 GG( B, C, D, A, x[ 12 ], 20, 0x8d2a4c8a );
475 HH( A, B, C, D, x[ 5 ], 4, 0xfffa3942 );
476 HH( D, A, B, C, x[ 8 ], 11, 0x8771f681 );
477 HH( C, D, A, B, x[ 11 ], 16, 0x6d9d6122 );
478 HH( B, C, D, A, x[ 14 ], 23, 0xfde5380c );
479 HH( A, B, C, D, x[ 1 ], 4, 0xa4beea44 );
480 HH( D, A, B, C, x[ 4 ], 11, 0x4bdecfa9 );
481 HH( C, D, A, B, x[ 7 ], 16, 0xf6bb4b60 );
482 HH( B, C, D, A, x[ 10 ], 23, 0xbebfbc70 );
483 HH( A, B, C, D, x[ 13 ], 4, 0x289b7ec6 );
484 HH( D, A, B, C, x[ 0 ], 11, 0xeaa127fa );
485 HH( C, D, A, B, x[ 3 ], 16, 0xd4ef3085 );
486 HH( B, C, D, A, x[ 6 ], 23, 0x04881d05 );
487 HH( A, B, C, D, x[ 9 ], 4, 0xd9d4d039 );
488 HH( D, A, B, C, x[ 12 ], 11, 0xe6db99e5 );
489 HH( C, D, A, B, x[ 15 ], 16, 0x1fa27cf8 );
490 HH( B, C, D, A, x[ 2 ], 23, 0xc4ac5665 );
492 II( A, B, C, D, x[ 0 ], 6, 0xf4292244 );
493 II( D, A, B, C, x[ 7 ], 10, 0x432aff97 );
494 II( C, D, A, B, x[ 14 ], 15, 0xab9423a7 );
495 II( B, C, D, A, x[ 5 ], 21, 0xfc93a039 );
496 II( A, B, C, D, x[ 12 ], 6, 0x655b59c3 );
497 II( D, A, B, C, x[ 3 ], 10, 0x8f0ccc92 );
498 II( C, D, A, B, x[ 10 ], 15, 0xffeff47d );
499 II( B, C, D, A, x[ 1 ], 21, 0x85845dd1 );
500 II( A, B, C, D, x[ 8 ], 6, 0x6fa87e4f );
501 II( D, A, B, C, x[ 15 ], 10, 0xfe2ce6e0 );
502 II( C, D, A, B, x[ 6 ], 15, 0xa3014314 );
503 II( B, C, D, A, x[ 13 ], 21, 0x4e0811a1 );
504 II( A, B, C, D, x[ 4 ], 6, 0xf7537e82 );
505 II( D, A, B, C, x[ 11 ], 10, 0xbd3af235 );
506 II( C, D, A, B, x[ 2 ], 15, 0x2ad7d2bb );
507 II( B, C, D, A, x[ 9 ], 21, 0xeb86d391 );
517 virtual void compute_hash(
const void *bytes,
uint64 length )
524 uint32 &B = *
reinterpret_cast< uint32 *
>( digest + 4 );
525 uint32 &C = *
reinterpret_cast< uint32 *
>( digest + 8 );
526 uint32 &D = *
reinterpret_cast< uint32 *
>( digest + 12 );
537 const uint8 *data =
reinterpret_cast< const uint8 *
>( bytes );
540 for( i = 0 ; i + 64 < len ; i += 64 )
542 memcpy( xx, data + i,
sizeof(
uint8 ) * 64 );
543 ToCurrentEndian( x, 16 );
544 Round( A, B, C, D, x );
552 memcpy( xx, data + i,
sizeof(
uint8 ) * rest );
553 memset( xx + rest, 0,
sizeof(
uint8 ) * ( 64 - rest ) );
558 ToCurrentEndian( x, 16 );
559 Round( A, B, C, D, x );
562 memset( xx, 0,
sizeof(
uint8 ) * 64 );
563 x[ 14 ] =
static_cast< uint32 >( length );
564 x[ 15 ] =
static_cast< uint32 >( length >> 32 );
567 Round( A, B, C, D, x );
571 memcpy( xx, data + i,
sizeof(
uint8 ) * rest );
572 memset( xx + rest, 0,
sizeof(
uint8 ) * ( 64 - rest ) );
576 ToCurrentEndian( x, 16 );
579 x[ 14 ] =
static_cast< uint32 >( length );
580 x[ 15 ] =
static_cast< uint32 >( length >> 32 );
583 Round( A, B, C, D, x );
586 FromCurrentEndian( reinterpret_cast< uint32 * >( digest ), 4 );
591 virtual const std::string
name( )
const{
return(
"MD5" ); }
595 md5( ) :
base(
"d41d8cd98f00b204e9800998ecf8427e" ){ }
598 md5(
const std::string &str ) :
base( 16 ) { base::compute_hash( str ); }
601 md5(
const void *data,
uint64 len ) :
base( 16 ){ compute_hash( data, len ); }
614 #endif // __INCLUDE_MD5__