-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmd5.h
127 lines (127 loc) · 2.82 KB
/
md5.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// Example software for this functions at: https://github.com/BaseMax/cMD5
#ifndef _MD5_H_
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
typedef union uwb {
unsigned w;
unsigned char b[4];
} md5Data;
typedef unsigned numbers[4];
unsigned f0(unsigned abcd[]){
return (abcd[1] & abcd[2]) | (~abcd[1] & abcd[3]);
}
unsigned f1(unsigned abcd[]){
return (abcd[3] & abcd[1]) | (~abcd[3] & abcd[2]);
}
unsigned f2(unsigned abcd[]){
return abcd[1] ^ abcd[2] ^ abcd[3];
}
unsigned f3(unsigned abcd[]){
return abcd[2] ^ (abcd[1] |~ abcd[3]);
}
typedef unsigned (*DgstFctn)(unsigned a[]);
unsigned *calcKs(unsigned *k)
{
double s, pwr;
int i;
pwr = pow(2, 32);
for(i=0; i<64; i++) {
s = fabs(sin(1+i));
k[i] = (unsigned)(s * pwr);
}
return k;
}
unsigned rol(unsigned v, short amt) {
unsigned msk1 = (1<<amt) -1;
return((v>>(32-amt)) & msk1) | ((v<<amt) & ~msk1);
}
unsigned *md5_encode(const char *msg, int mlen) {
static numbers h0 = { 0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476 };
static DgstFctn ff[] = { &f0, &f1, &f2, &f3 };
static short M[] = { 1, 5, 3, 7 };
static short O[] = { 0, 1, 5, 0 };
static short rot0[] = { 7,12,17,22};
static short rot1[] = { 5, 9,14,20};
static short rot2[] = { 4,11,16,23};
static short rot3[] = { 6,10,15,21};
static short *rots[] = {rot0, rot1, rot2, rot3 };
static unsigned kspace[64];
static unsigned *k;
static numbers h;
numbers abcd;
DgstFctn fctn;
short m, o, g;
unsigned f;
short *rotn;
union {
unsigned w[16];
char b[64];
} mm;
int os = 0;
int grp, grps, q, p;
unsigned char *msg2;
if(k==NULL) k= calcKs(kspace);
for(q=0; q<4; q++)
h[q] = h0[q];
{
grps = 1 + (mlen+8)/64;
msg2 = malloc(64*grps);
memcpy(msg2, msg, mlen);
msg2[mlen] = (unsigned char)0x80;
q = mlen + 1;
while(q < 64*grps){
msg2[q] = 0;
q++;
}
{
md5Data u;
u.w = 8*mlen;
// unsigned char t;
// t = u.b[0]; u.b[0] = u.b[3]; u.b[3] = t;
// t = u.b[1]; u.b[1] = u.b[2]; u.b[2] = t;
q -= 8;
memcpy(msg2+q, &u.w, 4 );
}
}
for(grp=0; grp<grps; grp++)
{
memcpy(mm.b, msg2+os, 64);
for(q=0;q<4;q++) abcd[q] = h[q];
for(p = 0; p<4; p++) {
fctn = ff[p];
rotn = rots[p];
m = M[p]; o= O[p];
for(q=0; q<16; q++) {
g = (m*q + o) % 16;
f = abcd[1] + rol(abcd[0]+ fctn(abcd) + k[q+16*p] + mm.w[g], rotn[q%4]);
abcd[0] = abcd[3];
abcd[3] = abcd[2];
abcd[2] = abcd[1];
abcd[1] = f;
}
}
for(p=0; p<4; p++)
h[p] += abcd[p];
os+=64;
}
if(msg2)
free(msg2);
return h;
}
char* md5(const char *msg, int mlen) {
char *result=malloc(sizeof(char)*33);
strcpy(result, "");
unsigned *d = md5_encode(msg, strlen(msg));
md5Data u;
for(int i = 0; i<4; i++) {
u.w = d[i];
char temp[8];
sprintf(temp, "%02x%02x%02x%02x", u.b[0], u.b[1], u.b[2], u.b[3]);
strcat(result, temp);
}
return result;
}
#define _MD5_H_
#endif