Mercurial > hg > xmms-sid
comparison src/xs_md5.c @ 359:b1a858b8cb1a
Re-indentation all (non-generated) code.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Mon, 07 Nov 2005 09:50:04 +0000 |
parents | 70ab1c28d4b2 |
children | a3fdd2d6c056 |
comparison
equal
deleted
inserted
replaced
358:4f247b19c9ea | 359:b1a858b8cb1a |
---|---|
117 #define T64 0xeb86d391 | 117 #define T64 0xeb86d391 |
118 | 118 |
119 | 119 |
120 static void xs_md5_process(t_xs_md5state * pms, const guint8 * data) | 120 static void xs_md5_process(t_xs_md5state * pms, const guint8 * data) |
121 { | 121 { |
122 guint32 a = pms->abcd[0], b = pms->abcd[1], c = pms->abcd[2], d = pms->abcd[3]; | 122 guint32 a = pms->abcd[0], b = pms->abcd[1], c = pms->abcd[2], d = pms->abcd[3]; |
123 guint32 t; | 123 guint32 t; |
124 guint32 X[16]; | 124 guint32 X[16]; |
125 const guint8 *xp = data; | 125 const guint8 *xp = data; |
126 gint i; | 126 gint i; |
127 | 127 |
128 for (i = 0; i < 16; ++i, xp += 4) | 128 for (i = 0; i < 16; ++i, xp += 4) |
129 X[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24); | 129 X[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24); |
130 | 130 |
131 | 131 |
132 /* | 132 /* |
133 * Round 1. Let [abcd k s i] denote the operation | 133 * Round 1. Let [abcd k s i] denote the operation |
134 * a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). | 134 * a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). |
135 */ | 135 */ |
136 #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) | 136 #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) |
137 #define F(x, y, z) (((x) & (y)) | (~(x) & (z))) | 137 #define F(x, y, z) (((x) & (y)) | (~(x) & (z))) |
138 #define SET(a, b, c, d, k, s, Ti)\ | 138 #define SET(a, b, c, d, k, s, Ti)\ |
139 t = a + F(b,c,d) + X[k] + Ti;\ | 139 t = a + F(b,c,d) + X[k] + Ti;\ |
140 a = ROTATE_LEFT(t, s) + b | 140 a = ROTATE_LEFT(t, s) + b |
141 | 141 |
142 /* Do the following 16 operations. */ | 142 /* Do the following 16 operations. */ |
143 SET(a, b, c, d, 0, 7, T1); | 143 SET(a, b, c, d, 0, 7, T1); |
144 SET(d, a, b, c, 1, 12, T2); | 144 SET(d, a, b, c, 1, 12, T2); |
145 SET(c, d, a, b, 2, 17, T3); | 145 SET(c, d, a, b, 2, 17, T3); |
146 SET(b, c, d, a, 3, 22, T4); | 146 SET(b, c, d, a, 3, 22, T4); |
147 SET(a, b, c, d, 4, 7, T5); | 147 SET(a, b, c, d, 4, 7, T5); |
148 SET(d, a, b, c, 5, 12, T6); | 148 SET(d, a, b, c, 5, 12, T6); |
149 SET(c, d, a, b, 6, 17, T7); | 149 SET(c, d, a, b, 6, 17, T7); |
150 SET(b, c, d, a, 7, 22, T8); | 150 SET(b, c, d, a, 7, 22, T8); |
151 SET(a, b, c, d, 8, 7, T9); | 151 SET(a, b, c, d, 8, 7, T9); |
152 SET(d, a, b, c, 9, 12, T10); | 152 SET(d, a, b, c, 9, 12, T10); |
153 SET(c, d, a, b, 10, 17, T11); | 153 SET(c, d, a, b, 10, 17, T11); |
154 SET(b, c, d, a, 11, 22, T12); | 154 SET(b, c, d, a, 11, 22, T12); |
155 SET(a, b, c, d, 12, 7, T13); | 155 SET(a, b, c, d, 12, 7, T13); |
156 SET(d, a, b, c, 13, 12, T14); | 156 SET(d, a, b, c, 13, 12, T14); |
157 SET(c, d, a, b, 14, 17, T15); | 157 SET(c, d, a, b, 14, 17, T15); |
158 SET(b, c, d, a, 15, 22, T16); | 158 SET(b, c, d, a, 15, 22, T16); |
159 | 159 |
160 #undef SET | 160 #undef SET |
161 | 161 |
162 /* | 162 /* |
163 * Round 2. Let [abcd k s i] denote the operation | 163 * Round 2. Let [abcd k s i] denote the operation |
164 * a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). | 164 * a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). |
165 */ | 165 */ |
166 #define G(x, y, z) (((x) & (z)) | ((y) & ~(z))) | 166 #define G(x, y, z) (((x) & (z)) | ((y) & ~(z))) |
167 #define SET(a, b, c, d, k, s, Ti)\ | 167 #define SET(a, b, c, d, k, s, Ti)\ |
168 t = a + G(b,c,d) + X[k] + Ti;\ | 168 t = a + G(b,c,d) + X[k] + Ti;\ |
169 a = ROTATE_LEFT(t, s) + b | 169 a = ROTATE_LEFT(t, s) + b |
170 | 170 |
171 /* Do the following 16 operations. */ | 171 /* Do the following 16 operations. */ |
172 SET(a, b, c, d, 1, 5, T17); | 172 SET(a, b, c, d, 1, 5, T17); |
173 SET(d, a, b, c, 6, 9, T18); | 173 SET(d, a, b, c, 6, 9, T18); |
174 SET(c, d, a, b, 11, 14, T19); | 174 SET(c, d, a, b, 11, 14, T19); |
175 SET(b, c, d, a, 0, 20, T20); | 175 SET(b, c, d, a, 0, 20, T20); |
176 SET(a, b, c, d, 5, 5, T21); | 176 SET(a, b, c, d, 5, 5, T21); |
177 SET(d, a, b, c, 10, 9, T22); | 177 SET(d, a, b, c, 10, 9, T22); |
178 SET(c, d, a, b, 15, 14, T23); | 178 SET(c, d, a, b, 15, 14, T23); |
179 SET(b, c, d, a, 4, 20, T24); | 179 SET(b, c, d, a, 4, 20, T24); |
180 SET(a, b, c, d, 9, 5, T25); | 180 SET(a, b, c, d, 9, 5, T25); |
181 SET(d, a, b, c, 14, 9, T26); | 181 SET(d, a, b, c, 14, 9, T26); |
182 SET(c, d, a, b, 3, 14, T27); | 182 SET(c, d, a, b, 3, 14, T27); |
183 SET(b, c, d, a, 8, 20, T28); | 183 SET(b, c, d, a, 8, 20, T28); |
184 SET(a, b, c, d, 13, 5, T29); | 184 SET(a, b, c, d, 13, 5, T29); |
185 SET(d, a, b, c, 2, 9, T30); | 185 SET(d, a, b, c, 2, 9, T30); |
186 SET(c, d, a, b, 7, 14, T31); | 186 SET(c, d, a, b, 7, 14, T31); |
187 SET(b, c, d, a, 12, 20, T32); | 187 SET(b, c, d, a, 12, 20, T32); |
188 | 188 |
189 #undef SET | 189 #undef SET |
190 | 190 |
191 /* | 191 /* |
192 * Round 3. Let [abcd k s t] denote the operation | 192 * Round 3. Let [abcd k s t] denote the operation |
193 * a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). | 193 * a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). |
194 */ | 194 */ |
195 #define H(x, y, z) ((x) ^ (y) ^ (z)) | 195 #define H(x, y, z) ((x) ^ (y) ^ (z)) |
196 #define SET(a, b, c, d, k, s, Ti)\ | 196 #define SET(a, b, c, d, k, s, Ti)\ |
197 t = a + H(b,c,d) + X[k] + Ti;\ | 197 t = a + H(b,c,d) + X[k] + Ti;\ |
198 a = ROTATE_LEFT(t, s) + b | 198 a = ROTATE_LEFT(t, s) + b |
199 | 199 |
200 /* Do the following 16 operations. */ | 200 /* Do the following 16 operations. */ |
201 SET(a, b, c, d, 5, 4, T33); | 201 SET(a, b, c, d, 5, 4, T33); |
202 SET(d, a, b, c, 8, 11, T34); | 202 SET(d, a, b, c, 8, 11, T34); |
203 SET(c, d, a, b, 11, 16, T35); | 203 SET(c, d, a, b, 11, 16, T35); |
204 SET(b, c, d, a, 14, 23, T36); | 204 SET(b, c, d, a, 14, 23, T36); |
205 SET(a, b, c, d, 1, 4, T37); | 205 SET(a, b, c, d, 1, 4, T37); |
206 SET(d, a, b, c, 4, 11, T38); | 206 SET(d, a, b, c, 4, 11, T38); |
207 SET(c, d, a, b, 7, 16, T39); | 207 SET(c, d, a, b, 7, 16, T39); |
208 SET(b, c, d, a, 10, 23, T40); | 208 SET(b, c, d, a, 10, 23, T40); |
209 SET(a, b, c, d, 13, 4, T41); | 209 SET(a, b, c, d, 13, 4, T41); |
210 SET(d, a, b, c, 0, 11, T42); | 210 SET(d, a, b, c, 0, 11, T42); |
211 SET(c, d, a, b, 3, 16, T43); | 211 SET(c, d, a, b, 3, 16, T43); |
212 SET(b, c, d, a, 6, 23, T44); | 212 SET(b, c, d, a, 6, 23, T44); |
213 SET(a, b, c, d, 9, 4, T45); | 213 SET(a, b, c, d, 9, 4, T45); |
214 SET(d, a, b, c, 12, 11, T46); | 214 SET(d, a, b, c, 12, 11, T46); |
215 SET(c, d, a, b, 15, 16, T47); | 215 SET(c, d, a, b, 15, 16, T47); |
216 SET(b, c, d, a, 2, 23, T48); | 216 SET(b, c, d, a, 2, 23, T48); |
217 | 217 |
218 #undef SET | 218 #undef SET |
219 | 219 |
220 /* | 220 /* |
221 * Round 4. Let [abcd k s t] denote the operation | 221 * Round 4. Let [abcd k s t] denote the operation |
222 * a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). | 222 * a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). |
223 */ | 223 */ |
224 #define I(x, y, z) ((y) ^ ((x) | ~(z))) | 224 #define I(x, y, z) ((y) ^ ((x) | ~(z))) |
225 #define SET(a, b, c, d, k, s, Ti)\ | 225 #define SET(a, b, c, d, k, s, Ti)\ |
226 t = a + I(b,c,d) + X[k] + Ti;\ | 226 t = a + I(b,c,d) + X[k] + Ti;\ |
227 a = ROTATE_LEFT(t, s) + b | 227 a = ROTATE_LEFT(t, s) + b |
228 | 228 |
229 /* Do the following 16 operations. */ | 229 /* Do the following 16 operations. */ |
230 SET(a, b, c, d, 0, 6, T49); | 230 SET(a, b, c, d, 0, 6, T49); |
231 SET(d, a, b, c, 7, 10, T50); | 231 SET(d, a, b, c, 7, 10, T50); |
232 SET(c, d, a, b, 14, 15, T51); | 232 SET(c, d, a, b, 14, 15, T51); |
233 SET(b, c, d, a, 5, 21, T52); | 233 SET(b, c, d, a, 5, 21, T52); |
234 SET(a, b, c, d, 12, 6, T53); | 234 SET(a, b, c, d, 12, 6, T53); |
235 SET(d, a, b, c, 3, 10, T54); | 235 SET(d, a, b, c, 3, 10, T54); |
236 SET(c, d, a, b, 10, 15, T55); | 236 SET(c, d, a, b, 10, 15, T55); |
237 SET(b, c, d, a, 1, 21, T56); | 237 SET(b, c, d, a, 1, 21, T56); |
238 SET(a, b, c, d, 8, 6, T57); | 238 SET(a, b, c, d, 8, 6, T57); |
239 SET(d, a, b, c, 15, 10, T58); | 239 SET(d, a, b, c, 15, 10, T58); |
240 SET(c, d, a, b, 6, 15, T59); | 240 SET(c, d, a, b, 6, 15, T59); |
241 SET(b, c, d, a, 13, 21, T60); | 241 SET(b, c, d, a, 13, 21, T60); |
242 SET(a, b, c, d, 4, 6, T61); | 242 SET(a, b, c, d, 4, 6, T61); |
243 SET(d, a, b, c, 11, 10, T62); | 243 SET(d, a, b, c, 11, 10, T62); |
244 SET(c, d, a, b, 2, 15, T63); | 244 SET(c, d, a, b, 2, 15, T63); |
245 SET(b, c, d, a, 9, 21, T64); | 245 SET(b, c, d, a, 9, 21, T64); |
246 | 246 |
247 #undef SET | 247 #undef SET |
248 | 248 |
249 /* | 249 /* |
250 * Then perform the following additions. (That is increment each | 250 * Then perform the following additions. (That is increment each |
251 * of the four registers by the value it had before this block was started.) | 251 * of the four registers by the value it had before this block was started.) |
252 */ | 252 */ |
253 pms->abcd[0] += a; | 253 pms->abcd[0] += a; |
254 pms->abcd[1] += b; | 254 pms->abcd[1] += b; |
255 pms->abcd[2] += c; | 255 pms->abcd[2] += c; |
256 pms->abcd[3] += d; | 256 pms->abcd[3] += d; |
257 } | 257 } |
258 | 258 |
259 | 259 |
260 void xs_md5_init(t_xs_md5state * pms) | 260 void xs_md5_init(t_xs_md5state * pms) |
261 { | 261 { |
262 pms->count[0] = pms->count[1] = 0; | 262 pms->count[0] = pms->count[1] = 0; |
263 pms->abcd[0] = 0x67452301; | 263 pms->abcd[0] = 0x67452301; |
264 pms->abcd[1] = 0xefcdab89; | 264 pms->abcd[1] = 0xefcdab89; |
265 pms->abcd[2] = 0x98badcfe; | 265 pms->abcd[2] = 0x98badcfe; |
266 pms->abcd[3] = 0x10325476; | 266 pms->abcd[3] = 0x10325476; |
267 } | 267 } |
268 | 268 |
269 | 269 |
270 void xs_md5_append(t_xs_md5state * pms, const guint8 * data, int nbytes) | 270 void xs_md5_append(t_xs_md5state * pms, const guint8 * data, int nbytes) |
271 { | 271 { |
272 const guint8 *p = data; | 272 const guint8 *p = data; |
273 gint left = nbytes; | 273 gint left = nbytes; |
274 gint offset = (pms->count[0] >> 3) & 63; | 274 gint offset = (pms->count[0] >> 3) & 63; |
275 guint32 nbits = (guint32) (nbytes << 3); | 275 guint32 nbits = (guint32) (nbytes << 3); |
276 | 276 |
277 if (nbytes <= 0) | 277 if (nbytes <= 0) |
278 return; | |
279 | |
280 /* Update the message length. */ | |
281 pms->count[1] += nbytes >> 29; | |
282 pms->count[0] += nbits; | |
283 if (pms->count[0] < nbits) | |
284 pms->count[1]++; | |
285 | |
286 /* Process an initial partial block. */ | |
287 if (offset) | |
288 { | |
289 int copy = (offset + nbytes > 64 ? 64 - offset : nbytes); | |
290 | |
291 memcpy(pms->buf + offset, p, copy); | |
292 | |
293 if (offset + copy < 64) | |
294 return; | 278 return; |
295 | 279 |
296 p += copy; | 280 /* Update the message length. */ |
297 left -= copy; | 281 pms->count[1] += nbytes >> 29; |
298 xs_md5_process(pms, pms->buf); | 282 pms->count[0] += nbits; |
283 if (pms->count[0] < nbits) | |
284 pms->count[1]++; | |
285 | |
286 /* Process an initial partial block. */ | |
287 if (offset) { | |
288 int copy = (offset + nbytes > 64 ? 64 - offset : nbytes); | |
289 | |
290 memcpy(pms->buf + offset, p, copy); | |
291 | |
292 if (offset + copy < 64) | |
293 return; | |
294 | |
295 p += copy; | |
296 left -= copy; | |
297 xs_md5_process(pms, pms->buf); | |
299 } | 298 } |
300 | 299 |
301 /* Process full blocks. */ | 300 /* Process full blocks. */ |
302 for (; left >= 64; p += 64, left -= 64) | 301 for (; left >= 64; p += 64, left -= 64) |
303 xs_md5_process(pms, p); | 302 xs_md5_process(pms, p); |
304 | 303 |
305 /* Process a final partial block. */ | 304 /* Process a final partial block. */ |
306 if (left) | 305 if (left) |
307 memcpy(pms->buf, p, left); | 306 memcpy(pms->buf, p, left); |
308 } | 307 } |
309 | 308 |
310 | 309 |
311 void xs_md5_finish(t_xs_md5state * pms, t_xs_md5hash digest) | 310 void xs_md5_finish(t_xs_md5state * pms, t_xs_md5hash digest) |
312 { | 311 { |
313 static const guint8 pad[64] = { | 312 static const guint8 pad[64] = { |
314 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 313 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
315 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 314 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
316 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 315 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
317 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | 316 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
318 }; | 317 }; |
319 | 318 |
320 guint8 data[8]; | 319 guint8 data[8]; |
321 gint i; | 320 gint i; |
322 | 321 |
323 /* Save the length before padding. */ | 322 /* Save the length before padding. */ |
324 for (i = 0; i < 8; ++i) | 323 for (i = 0; i < 8; ++i) |
325 data[i] = (guint8) (pms->count[i >> 2] >> ((i & 3) << 3)); | 324 data[i] = (guint8) (pms->count[i >> 2] >> ((i & 3) << 3)); |
326 | 325 |
327 /* Pad to 56 bytes mod 64. */ | 326 /* Pad to 56 bytes mod 64. */ |
328 xs_md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1); | 327 xs_md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1); |
329 | 328 |
330 /* Append the length. */ | 329 /* Append the length. */ |
331 xs_md5_append(pms, data, 8); | 330 xs_md5_append(pms, data, 8); |
332 for (i = 0; i < XS_MD5HASH_LENGTH; ++i) | 331 for (i = 0; i < XS_MD5HASH_LENGTH; ++i) |
333 digest[i] = (guint8) (pms->abcd[i >> 2] >> ((i & 3) << 3)); | 332 digest[i] = (guint8) (pms->abcd[i >> 2] >> ((i & 3) << 3)); |
334 } | 333 } |
335 |