Advertisement
Drainedsoul

md5.cpp

Jan 24th, 2012
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.73 KB | None | 0 0
  1. #include "md5.h"
  2. #include <byte_def.h>
  3. #include <stdlib.h>
  4.  
  5.  
  6. #define BITS_PER_BLOCK 512
  7. #define MODULO_BITS 448
  8. #define BITS_PER_BYTE 8
  9. #define BYTES_PER_BLOCK (BITS_PER_BLOCK/BITS_PER_BYTE)
  10. #define MODULO_BYTES (MODULO_BITS/BITS_PER_BYTE)
  11. #define WORD_SIZE 4
  12. #define WORDS_PER_BLOCK (BYTES_PER_BLOCK/WORD_SIZE)
  13. #define NUM_ROUNDS 4
  14. #define OPS_PER_ROUND 16
  15. #define TOTAL_OPS (NUM_ROUNDS*OPS_PER_ROUND)
  16. #define PADDING_LEAD 128
  17. #define PADDING_TAIL 0
  18. #define A_INIT 0x67452301
  19. #define B_INIT 0xEFCDAB89
  20. #define C_INIT 0x98BADCFE
  21. #define D_INIT 0x10325476
  22. #define CIRCULAR_LEFT_SHIFT(x,s) (((x)<<(s))|((x)>>((WORD_SIZE*BITS_PER_BYTE)-(s))))
  23.  
  24.  
  25. int per_round_shift []={7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5,  9, 14, 20, 5,  9, 14, 20, 5,  9, 14, 20, 5,  9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21};
  26. int sine_table []={0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391};
  27.  
  28.  
  29. Hash::MD5Result::MD5Result () {
  30.  
  31.     High=D_INIT;
  32.     HighMid=C_INIT;
  33.     LowMid=B_INIT;
  34.     Low=A_INIT;
  35.  
  36. }
  37.  
  38.  
  39. void Hash::MD5Block (const void * p, MD5Result * state) {
  40.  
  41.     unsigned int a=state->Low;
  42.     unsigned int b=state->LowMid;
  43.     unsigned int c=state->HighMid;
  44.     unsigned int d=state->High;
  45.    
  46.     for (int i=0;i<TOTAL_OPS;++i) {
  47.    
  48.         unsigned int f;
  49.         unsigned int g;
  50.    
  51.         switch (i/OPS_PER_ROUND) {
  52.        
  53.             case 0:
  54.            
  55.                 f=(b&c)|((~b)&d);
  56.                 g=i;
  57.                
  58.                 break;
  59.            
  60.             case 1:
  61.            
  62.                 f=(d&b)|((~d)&c);
  63.                 g=((5*i)+1)%16;
  64.            
  65.                 break;
  66.            
  67.             case 2:
  68.            
  69.                 f=b^c^d;
  70.                 g=((3*i)+5)%16;
  71.            
  72.                 break;
  73.            
  74.             default:    //  3
  75.            
  76.                 f=c^(b|(~d));
  77.                 g=(7*i)%16;
  78.            
  79.                 break;
  80.        
  81.         }
  82.        
  83.         unsigned int letter_shift_temp=d;
  84.         d=c;
  85.         c=b;
  86.         unsigned int circ_shift=a+f+sine_table[i]+((unsigned int *)p)[g];
  87.         b+=CIRCULAR_LEFT_SHIFT(circ_shift,per_round_shift[i]);
  88.         a=letter_shift_temp;
  89.    
  90.     }
  91.    
  92.     state->Low+=a;
  93.     state->LowMid+=b;
  94.     state->HighMid+=c;
  95.     state->High+=d;
  96.    
  97. }
  98.  
  99.  
  100. Hash::MD5Result Hash::MD5 (const void * p, int byte_len) {
  101.  
  102.     MD5Result returnthis;
  103.    
  104.     int bytes_remaining=byte_len;
  105.     Byte * q=(Byte *)const_cast<void *>(p);
  106.    
  107.     for (
  108.         ;
  109.         bytes_remaining>=BYTES_PER_BLOCK;
  110.         q+=BYTES_PER_BLOCK,bytes_remaining-=BYTES_PER_BLOCK
  111.     ) MD5Block(q,&returnthis);
  112.    
  113.     int size_r=(
  114.         (bytes_remaining>=MODULO_BYTES)
  115.             ?   (BYTES_PER_BLOCK*2)
  116.             :   BYTES_PER_BLOCK
  117.     );
  118.    
  119.     Byte * r=(Byte *)malloc(sizeof(Byte)*size_r);
  120.    
  121.     int i=0;
  122.    
  123.     for (
  124.         ;
  125.         bytes_remaining>0;
  126.         --bytes_remaining,++i
  127.     ) r[i]=q[i];
  128.    
  129.     for (
  130.         int padding_start=i;
  131.         i<(size_r-sizeof(unsigned long long));
  132.         ++i
  133.     ) r[i]=(
  134.         (i==padding_start)
  135.             ?   PADDING_LEAD
  136.             :   PADDING_TAIL
  137.     );
  138.    
  139.     unsigned long long append_len=
  140.         ((unsigned long long)byte_len)*
  141.         ((unsigned long long)BITS_PER_BYTE);
  142.  
  143.     for (
  144.         int n=0;
  145.         i<size_r;
  146.         ++i,++n
  147.     ) r[i]=((Byte *)&append_len)[n];
  148.    
  149.     for (
  150.         int n=0;
  151.         n<(size_r/BYTES_PER_BLOCK);
  152.         ++n
  153.     ) MD5Block(
  154.         r+(BYTES_PER_BLOCK*n),
  155.         &returnthis
  156.     );
  157.    
  158.     free(r);
  159.    
  160.     return returnthis;
  161.    
  162. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement