diff options
author | Mike Buland <eichlan@xagasoft.com> | 2006-05-01 17:11:04 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2006-05-01 17:11:04 +0000 |
commit | f7a9549bd6ad83f2e0bceec9cddacfa5e3f84a54 (patch) | |
tree | 53cec4864776e07950e3c72f2a990a1017d08045 /src/md5.cpp | |
download | libbu++-f7a9549bd6ad83f2e0bceec9cddacfa5e3f84a54.tar.gz libbu++-f7a9549bd6ad83f2e0bceec9cddacfa5e3f84a54.tar.bz2 libbu++-f7a9549bd6ad83f2e0bceec9cddacfa5e3f84a54.tar.xz libbu++-f7a9549bd6ad83f2e0bceec9cddacfa5e3f84a54.zip |
libbu++ is finally laid out the way it should be, trunk, branches, and tags.
Diffstat (limited to '')
-rw-r--r-- | src/md5.cpp | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/src/md5.cpp b/src/md5.cpp new file mode 100644 index 0000000..ed7e4ac --- /dev/null +++ b/src/md5.cpp | |||
@@ -0,0 +1,190 @@ | |||
1 | #include <stdio.h> | ||
2 | #include <stdlib.h> | ||
3 | #include <string.h> | ||
4 | #include "md5.h" | ||
5 | |||
6 | // This is a fun macro that tells us where the length char goes after the data | ||
7 | // section in the padded data segment. It's short for OBfuscation LOCaction. | ||
8 | #define OBLOC(len) ((((len + 64) >> 9) << 4) + 14) | ||
9 | // This performs a wrapping bitwise shift, kinda' fun! | ||
10 | |||
11 | #define bit_roll( num, cnt ) \ | ||
12 | (((num) << (cnt)) | (((num) >> (32 - (cnt))) & ~(-1<<(cnt)))) | ||
13 | |||
14 | //#define md5_cmn( q, a, b, x, s, t ) (bit_roll((a + q + x + t), s) + b) | ||
15 | |||
16 | // The following are handy wrappers for the cmn function | ||
17 | #define md5_ff( a, b, c, d, x, s, t ) \ | ||
18 | (md5_cmn((b & c) | ((~b) & d), a, b, x, s, t)) | ||
19 | |||
20 | #define md5_gg( a, b, c, d, x, s, t ) \ | ||
21 | (md5_cmn((b & d) | (c & (~d)), a, b, x, s, t)) | ||
22 | |||
23 | #define md5_hh( a, b, c, d, x, s, t ) \ | ||
24 | (md5_cmn(b ^ c ^ d, a, b, x, s, t)) | ||
25 | |||
26 | #define md5_ii( a, b, c, d, x, s, t ) \ | ||
27 | (md5_cmn(c ^ (b | (~d)), a, b, x, s, t)) | ||
28 | |||
29 | inline long md5_cmn( long q, long a, long b, long x, long s, long t ) | ||
30 | { | ||
31 | return bit_roll((a + q + x + t), s) + b; | ||
32 | } | ||
33 | |||
34 | md5::md5() | ||
35 | { | ||
36 | } | ||
37 | |||
38 | md5::~md5() | ||
39 | { | ||
40 | } | ||
41 | |||
42 | /* | ||
43 | * Calculate the MD5 of an array of little-endian words, and a bit length | ||
44 | */ | ||
45 | void md5::core_md5( long *x, long len, md5sum *output ) | ||
46 | { | ||
47 | long a = 1732584193, olda; | ||
48 | long b = -271733879, oldb; | ||
49 | long c = -1732584194, oldc; | ||
50 | long d = 271733878, oldd; | ||
51 | |||
52 | for( long i = 0; i < len; i += 16 ) | ||
53 | { | ||
54 | olda = a; | ||
55 | oldb = b; | ||
56 | oldc = c; | ||
57 | oldd = d; | ||
58 | |||
59 | a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936); | ||
60 | d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586); | ||
61 | c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819); | ||
62 | b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330); | ||
63 | a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897); | ||
64 | d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426); | ||
65 | c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341); | ||
66 | b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983); | ||
67 | a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416); | ||
68 | d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417); | ||
69 | c = md5_ff(c, d, a, b, x[i+10], 17, -42063); | ||
70 | b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162); | ||
71 | a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682); | ||
72 | d = md5_ff(d, a, b, c, x[i+13], 12, -40341101); | ||
73 | c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290); | ||
74 | b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329); | ||
75 | |||
76 | a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510); | ||
77 | d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632); | ||
78 | c = md5_gg(c, d, a, b, x[i+11], 14, 643717713); | ||
79 | b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302); | ||
80 | a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691); | ||
81 | d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083); | ||
82 | c = md5_gg(c, d, a, b, x[i+15], 14, -660478335); | ||
83 | b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848); | ||
84 | a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438); | ||
85 | d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690); | ||
86 | c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961); | ||
87 | b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501); | ||
88 | a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467); | ||
89 | d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784); | ||
90 | c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473); | ||
91 | b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734); | ||
92 | |||
93 | a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558); | ||
94 | d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463); | ||
95 | c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562); | ||
96 | b = md5_hh(b, c, d, a, x[i+14], 23, -35309556); | ||
97 | a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060); | ||
98 | d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353); | ||
99 | c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632); | ||
100 | b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640); | ||
101 | a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174); | ||
102 | d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222); | ||
103 | c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979); | ||
104 | b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189); | ||
105 | a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487); | ||
106 | d = md5_hh(d, a, b, c, x[i+12], 11, -421815835); | ||
107 | c = md5_hh(c, d, a, b, x[i+15], 16, 530742520); | ||
108 | b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651); | ||
109 | |||
110 | a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844); | ||
111 | d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415); | ||
112 | c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905); | ||
113 | b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055); | ||
114 | a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571); | ||
115 | d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606); | ||
116 | c = md5_ii(c, d, a, b, x[i+10], 15, -1051523); | ||
117 | b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799); | ||
118 | a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359); | ||
119 | d = md5_ii(d, a, b, c, x[i+15], 10, -30611744); | ||
120 | c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380); | ||
121 | b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649); | ||
122 | a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070); | ||
123 | d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379); | ||
124 | c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259); | ||
125 | b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551); | ||
126 | |||
127 | a = a + olda; | ||
128 | b = b + oldb; | ||
129 | c = c + oldc; | ||
130 | d = d + oldd; | ||
131 | } | ||
132 | |||
133 | output->data[0] = a; | ||
134 | output->data[1] = b; | ||
135 | output->data[2] = c; | ||
136 | output->data[3] = d; | ||
137 | delete[] x; | ||
138 | } | ||
139 | |||
140 | long *md5::c2l( const char *str, long len, long *nNewLen ) | ||
141 | { | ||
142 | long len8 = len*8; | ||
143 | long mlen = OBLOC( len8 ); | ||
144 | long flen = (((mlen/16)+((mlen%16)?(1):(0))))*16; | ||
145 | long *aBin = new long[flen]; | ||
146 | memset( aBin, 0, flen ); | ||
147 | |||
148 | for( long i = 0; i < len8; i+=8 ) | ||
149 | { | ||
150 | aBin[i>>5] |= ((long)str[i/8]) << (i%32); | ||
151 | } | ||
152 | |||
153 | aBin[len8 >> 5] |= 0x80 << ((len8) % 32); | ||
154 | aBin[OBLOC( len8 )] = len8; | ||
155 | |||
156 | (*nNewLen) = flen; | ||
157 | |||
158 | return aBin; | ||
159 | } | ||
160 | |||
161 | void md5::l2hexstr( long *binarray, char *str ) | ||
162 | { | ||
163 | static const char hex_tab[] = {"0123456789abcdef"}; | ||
164 | //static char str[33]; | ||
165 | |||
166 | int k = 0; | ||
167 | for( int i = 0; i < 16; i++) | ||
168 | { | ||
169 | str[k++] = hex_tab[(binarray[i>>2] >> ((i%4)*8+4)) & 0xF]; | ||
170 | str[k++] = hex_tab[(binarray[i>>2] >> ((i%4)*8 )) & 0xF]; | ||
171 | } | ||
172 | } | ||
173 | |||
174 | void md5::sumString( md5sum *pSum, const char *sStr ) | ||
175 | { | ||
176 | sumData( pSum, sStr, strlen( sStr ) ); | ||
177 | } | ||
178 | |||
179 | void md5::sumData( md5sum *pSum, const char *aData, long nLen ) | ||
180 | { | ||
181 | long nNewLen; | ||
182 | long *aOb = c2l( aData, nLen, &nNewLen ); | ||
183 | core_md5( aOb, nNewLen, pSum ); | ||
184 | } | ||
185 | |||
186 | void md5::sumToHex( md5sum *pSum, char *sHex ) | ||
187 | { | ||
188 | l2hexstr( pSum->data, sHex ); | ||
189 | } | ||
190 | |||