Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "md5.h"
- #include <byte_def.h>
- #include <stdlib.h>
- #define BITS_PER_BLOCK 512
- #define MODULO_BITS 448
- #define BITS_PER_BYTE 8
- #define BYTES_PER_BLOCK (BITS_PER_BLOCK/BITS_PER_BYTE)
- #define MODULO_BYTES (MODULO_BITS/BITS_PER_BYTE)
- #define WORD_SIZE 4
- #define WORDS_PER_BLOCK (BYTES_PER_BLOCK/WORD_SIZE)
- #define NUM_ROUNDS 4
- #define OPS_PER_ROUND 16
- #define TOTAL_OPS (NUM_ROUNDS*OPS_PER_ROUND)
- #define PADDING_LEAD 128
- #define PADDING_TAIL 0
- #define A_INIT 0x67452301
- #define B_INIT 0xEFCDAB89
- #define C_INIT 0x98BADCFE
- #define D_INIT 0x10325476
- #define CIRCULAR_LEFT_SHIFT(x,s) (((x)<<(s))|((x)>>((WORD_SIZE*BITS_PER_BYTE)-(s))))
- 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};
- 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};
- Hash::MD5Result::MD5Result () {
- High=D_INIT;
- HighMid=C_INIT;
- LowMid=B_INIT;
- Low=A_INIT;
- }
- void Hash::MD5Block (const void * p, MD5Result * state) {
- unsigned int a=state->Low;
- unsigned int b=state->LowMid;
- unsigned int c=state->HighMid;
- unsigned int d=state->High;
- for (int i=0;i<TOTAL_OPS;++i) {
- unsigned int f;
- unsigned int g;
- switch (i/OPS_PER_ROUND) {
- case 0:
- f=(b&c)|((~b)&d);
- g=i;
- break;
- case 1:
- f=(d&b)|((~d)&c);
- g=((5*i)+1)%16;
- break;
- case 2:
- f=b^c^d;
- g=((3*i)+5)%16;
- break;
- default: // 3
- f=c^(b|(~d));
- g=(7*i)%16;
- break;
- }
- unsigned int letter_shift_temp=d;
- d=c;
- c=b;
- unsigned int circ_shift=a+f+sine_table[i]+((unsigned int *)p)[g];
- b+=CIRCULAR_LEFT_SHIFT(circ_shift,per_round_shift[i]);
- a=letter_shift_temp;
- }
- state->Low+=a;
- state->LowMid+=b;
- state->HighMid+=c;
- state->High+=d;
- }
- Hash::MD5Result Hash::MD5 (const void * p, int byte_len) {
- MD5Result returnthis;
- int bytes_remaining=byte_len;
- Byte * q=(Byte *)const_cast<void *>(p);
- for (
- ;
- bytes_remaining>=BYTES_PER_BLOCK;
- q+=BYTES_PER_BLOCK,bytes_remaining-=BYTES_PER_BLOCK
- ) MD5Block(q,&returnthis);
- int size_r=(
- (bytes_remaining>=MODULO_BYTES)
- ? (BYTES_PER_BLOCK*2)
- : BYTES_PER_BLOCK
- );
- Byte * r=(Byte *)malloc(sizeof(Byte)*size_r);
- int i=0;
- for (
- ;
- bytes_remaining>0;
- --bytes_remaining,++i
- ) r[i]=q[i];
- for (
- int padding_start=i;
- i<(size_r-sizeof(unsigned long long));
- ++i
- ) r[i]=(
- (i==padding_start)
- ? PADDING_LEAD
- : PADDING_TAIL
- );
- unsigned long long append_len=
- ((unsigned long long)byte_len)*
- ((unsigned long long)BITS_PER_BYTE);
- for (
- int n=0;
- i<size_r;
- ++i,++n
- ) r[i]=((Byte *)&append_len)[n];
- for (
- int n=0;
- n<(size_r/BYTES_PER_BLOCK);
- ++n
- ) MD5Block(
- r+(BYTES_PER_BLOCK*n),
- &returnthis
- );
- free(r);
- return returnthis;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement