diff options
author | Mike Buland <eichlan@xagasoft.com> | 2009-02-19 23:44:57 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2009-02-19 23:44:57 +0000 |
commit | 4309066dff46f52690998bbd1f60ec8b1631f142 (patch) | |
tree | 07b6092622c909351f20590e7ee96d07f5b2d010 /src/md5.cpp | |
parent | 3f958097632256329cdbaf2219e2ba15325e9c52 (diff) | |
download | libbu++-4309066dff46f52690998bbd1f60ec8b1631f142.tar.gz libbu++-4309066dff46f52690998bbd1f60ec8b1631f142.tar.bz2 libbu++-4309066dff46f52690998bbd1f60ec8b1631f142.tar.xz libbu++-4309066dff46f52690998bbd1f60ec8b1631f142.zip |
We have the new Bu::CryptoHash base class and Bu::Md5 is here and ready
to rock. sha1 is still only a shell, I dunno if/when I'm going to implement
that one.
So far Bu::Md5 is 100% compatible with md5sum in all tests performed so far, in
fact the test program's output is compatible with md5sum in every way (and it's
so cute and little too!)
Oh, minor update for stdstream and the formatter, they can handle more handy
types now.
Diffstat (limited to '')
-rw-r--r-- | src/md5.cpp | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/src/md5.cpp b/src/md5.cpp new file mode 100644 index 0000000..aa965ed --- /dev/null +++ b/src/md5.cpp | |||
@@ -0,0 +1,191 @@ | |||
1 | #include <stdio.h> | ||
2 | #include <stdlib.h> | ||
3 | #include <string.h> | ||
4 | #include "md5.h" | ||
5 | |||
6 | // This performs a wrapping bitwise shift, kinda' fun! | ||
7 | |||
8 | #define bit_roll( num, cnt ) \ | ||
9 | (((num) << (cnt)) | (((num) >> (32 - (cnt))) & ~(-1<<(cnt)))) | ||
10 | |||
11 | //#define md5_cmn( q, a, b, x, s, t ) (bit_roll((a + q + x + t), s) + b) | ||
12 | |||
13 | // The following are handy wrappers for the cmn function | ||
14 | #define md5_ff( a, b, c, d, x, s, t ) \ | ||
15 | (md5_cmn((b & c) | ((~b) & d), a, b, x, s, t)) | ||
16 | |||
17 | #define md5_gg( a, b, c, d, x, s, t ) \ | ||
18 | (md5_cmn((b & d) | (c & (~d)), a, b, x, s, t)) | ||
19 | |||
20 | #define md5_hh( a, b, c, d, x, s, t ) \ | ||
21 | (md5_cmn(b ^ c ^ d, a, b, x, s, t)) | ||
22 | |||
23 | #define md5_ii( a, b, c, d, x, s, t ) \ | ||
24 | (md5_cmn(c ^ (b | (~d)), a, b, x, s, t)) | ||
25 | |||
26 | inline long md5_cmn( long q, long a, long b, long x, long s, long t ) | ||
27 | { | ||
28 | return bit_roll((a + q + x + t), s) + b; | ||
29 | } | ||
30 | |||
31 | Bu::Md5::Md5() | ||
32 | { | ||
33 | reset(); | ||
34 | } | ||
35 | |||
36 | Bu::Md5::~Md5() | ||
37 | { | ||
38 | } | ||
39 | |||
40 | void Bu::Md5::reset() | ||
41 | { | ||
42 | // These are the magic seed numbers... | ||
43 | |||
44 | sum[0] = 1732584193; | ||
45 | sum[1] = -271733879; | ||
46 | sum[2] = -1732584194; | ||
47 | sum[3] = 271733878; | ||
48 | |||
49 | iBytes = 0; | ||
50 | memset( inbuf, 0, 4*16 ); | ||
51 | iFill = 0; | ||
52 | } | ||
53 | |||
54 | void Bu::Md5::setSalt( const Bu::FString & /*sSalt*/ ) | ||
55 | { | ||
56 | } | ||
57 | |||
58 | void Bu::Md5::addData( const char *sData, int iSize ) | ||
59 | { | ||
60 | int iInPos = 0; | ||
61 | for(;;) | ||
62 | { | ||
63 | for( ; iFill < 16*4 && iInPos < iSize; iFill++, iInPos++ ) | ||
64 | { | ||
65 | inbuf[iFill>>2] |= ((long)sData[iInPos]) << ((iFill*8)%32); | ||
66 | } | ||
67 | if( iFill < 16*4 ) | ||
68 | break; | ||
69 | compBlock( inbuf, sum ); | ||
70 | memset( inbuf, 0, 4*16 ); | ||
71 | iFill = 0; | ||
72 | } | ||
73 | iBytes += iSize; | ||
74 | } | ||
75 | |||
76 | Bu::FString Bu::Md5::getResult() | ||
77 | { | ||
78 | static const char hex_tab[] = {"0123456789abcdef"}; | ||
79 | char str[33]; | ||
80 | |||
81 | long lsum[4]; | ||
82 | memcpy( lsum, sum, 4*4 ); | ||
83 | long lbuf[16]; | ||
84 | memcpy( lbuf, inbuf, 4*16 ); | ||
85 | |||
86 | lbuf[iFill>>2] |= 0x80 << ((iFill*8)%32); | ||
87 | uint64_t iBits = iBytes*8; | ||
88 | if( iBytes > 0 && iFill>>2 >= 14 ) | ||
89 | { | ||
90 | compBlock( lbuf, lsum ); | ||
91 | memset( lbuf, 0, 4*16 ); | ||
92 | memcpy( lbuf+14, &iBits, 8 ); | ||
93 | compBlock( lbuf, lsum ); | ||
94 | } | ||
95 | else | ||
96 | { | ||
97 | memcpy( lbuf+14, &iBits, 8 ); | ||
98 | compBlock( lbuf, lsum ); | ||
99 | } | ||
100 | |||
101 | int k = 0; | ||
102 | for( int i = 0; i < 16; i++ ) | ||
103 | { | ||
104 | str[k++] = hex_tab[(lsum[i>>2] >> ((i%4)*8+4)) & 0xF]; | ||
105 | str[k++] = hex_tab[(lsum[i>>2] >> ((i%4)*8 )) & 0xF]; | ||
106 | } | ||
107 | |||
108 | return Bu::FString( str, 32 ); | ||
109 | } | ||
110 | |||
111 | void Bu::Md5::compBlock( long *x, long *lsum ) | ||
112 | { | ||
113 | long a = lsum[0]; | ||
114 | long b = lsum[1]; | ||
115 | long c = lsum[2]; | ||
116 | long d = lsum[3]; | ||
117 | |||
118 | a = md5_ff(a, b, c, d, x[ 0], 7 , -680876936); | ||
119 | d = md5_ff(d, a, b, c, x[ 1], 12, -389564586); | ||
120 | c = md5_ff(c, d, a, b, x[ 2], 17, 606105819); | ||
121 | b = md5_ff(b, c, d, a, x[ 3], 22, -1044525330); | ||
122 | a = md5_ff(a, b, c, d, x[ 4], 7 , -176418897); | ||
123 | d = md5_ff(d, a, b, c, x[ 5], 12, 1200080426); | ||
124 | c = md5_ff(c, d, a, b, x[ 6], 17, -1473231341); | ||
125 | b = md5_ff(b, c, d, a, x[ 7], 22, -45705983); | ||
126 | a = md5_ff(a, b, c, d, x[ 8], 7 , 1770035416); | ||
127 | d = md5_ff(d, a, b, c, x[ 9], 12, -1958414417); | ||
128 | c = md5_ff(c, d, a, b, x[10], 17, -42063); | ||
129 | b = md5_ff(b, c, d, a, x[11], 22, -1990404162); | ||
130 | a = md5_ff(a, b, c, d, x[12], 7 , 1804603682); | ||
131 | d = md5_ff(d, a, b, c, x[13], 12, -40341101); | ||
132 | c = md5_ff(c, d, a, b, x[14], 17, -1502002290); | ||
133 | b = md5_ff(b, c, d, a, x[15], 22, 1236535329); | ||
134 | |||
135 | a = md5_gg(a, b, c, d, x[ 1], 5 , -165796510); | ||
136 | d = md5_gg(d, a, b, c, x[ 6], 9 , -1069501632); | ||
137 | c = md5_gg(c, d, a, b, x[11], 14, 643717713); | ||
138 | b = md5_gg(b, c, d, a, x[ 0], 20, -373897302); | ||
139 | a = md5_gg(a, b, c, d, x[ 5], 5 , -701558691); | ||
140 | d = md5_gg(d, a, b, c, x[10], 9 , 38016083); | ||
141 | c = md5_gg(c, d, a, b, x[15], 14, -660478335); | ||
142 | b = md5_gg(b, c, d, a, x[ 4], 20, -405537848); | ||
143 | a = md5_gg(a, b, c, d, x[ 9], 5 , 568446438); | ||
144 | d = md5_gg(d, a, b, c, x[14], 9 , -1019803690); | ||
145 | c = md5_gg(c, d, a, b, x[ 3], 14, -187363961); | ||
146 | b = md5_gg(b, c, d, a, x[ 8], 20, 1163531501); | ||
147 | a = md5_gg(a, b, c, d, x[13], 5 , -1444681467); | ||
148 | d = md5_gg(d, a, b, c, x[ 2], 9 , -51403784); | ||
149 | c = md5_gg(c, d, a, b, x[ 7], 14, 1735328473); | ||
150 | b = md5_gg(b, c, d, a, x[12], 20, -1926607734); | ||
151 | |||
152 | a = md5_hh(a, b, c, d, x[ 5], 4 , -378558); | ||
153 | d = md5_hh(d, a, b, c, x[ 8], 11, -2022574463); | ||
154 | c = md5_hh(c, d, a, b, x[11], 16, 1839030562); | ||
155 | b = md5_hh(b, c, d, a, x[14], 23, -35309556); | ||
156 | a = md5_hh(a, b, c, d, x[ 1], 4 , -1530992060); | ||
157 | d = md5_hh(d, a, b, c, x[ 4], 11, 1272893353); | ||
158 | c = md5_hh(c, d, a, b, x[ 7], 16, -155497632); | ||
159 | b = md5_hh(b, c, d, a, x[10], 23, -1094730640); | ||
160 | a = md5_hh(a, b, c, d, x[13], 4 , 681279174); | ||
161 | d = md5_hh(d, a, b, c, x[ 0], 11, -358537222); | ||
162 | c = md5_hh(c, d, a, b, x[ 3], 16, -722521979); | ||
163 | b = md5_hh(b, c, d, a, x[ 6], 23, 76029189); | ||
164 | a = md5_hh(a, b, c, d, x[ 9], 4 , -640364487); | ||
165 | d = md5_hh(d, a, b, c, x[12], 11, -421815835); | ||
166 | c = md5_hh(c, d, a, b, x[15], 16, 530742520); | ||
167 | b = md5_hh(b, c, d, a, x[ 2], 23, -995338651); | ||
168 | |||
169 | a = md5_ii(a, b, c, d, x[ 0], 6 , -198630844); | ||
170 | d = md5_ii(d, a, b, c, x[ 7], 10, 1126891415); | ||
171 | c = md5_ii(c, d, a, b, x[14], 15, -1416354905); | ||
172 | b = md5_ii(b, c, d, a, x[ 5], 21, -57434055); | ||
173 | a = md5_ii(a, b, c, d, x[12], 6 , 1700485571); | ||
174 | d = md5_ii(d, a, b, c, x[ 3], 10, -1894986606); | ||
175 | c = md5_ii(c, d, a, b, x[10], 15, -1051523); | ||
176 | b = md5_ii(b, c, d, a, x[ 1], 21, -2054922799); | ||
177 | a = md5_ii(a, b, c, d, x[ 8], 6 , 1873313359); | ||
178 | d = md5_ii(d, a, b, c, x[15], 10, -30611744); | ||
179 | c = md5_ii(c, d, a, b, x[ 6], 15, -1560198380); | ||
180 | b = md5_ii(b, c, d, a, x[13], 21, 1309151649); | ||
181 | a = md5_ii(a, b, c, d, x[ 4], 6 , -145523070); | ||
182 | d = md5_ii(d, a, b, c, x[11], 10, -1120210379); | ||
183 | c = md5_ii(c, d, a, b, x[ 2], 15, 718787259); | ||
184 | b = md5_ii(b, c, d, a, x[ 9], 21, -343485551); | ||
185 | |||
186 | lsum[0] = a + lsum[0]; | ||
187 | lsum[1] = b + lsum[1]; | ||
188 | lsum[2] = c + lsum[2]; | ||
189 | lsum[3] = d + lsum[3]; | ||
190 | } | ||
191 | |||