341
344
/* It is unfortunate that C does not provide an operator for
342
cyclic rotation. Hope the C compiler is smart enough. */
345
cyclic rotation. Hope the C compiler is smart enough. */
343
346
#define CYCLIC(w, s) (w = (w << s) | (w >> (32 - s)))
345
348
/* Before we start, one word to the strange constants.
346
They are defined in RFC 1321 as
348
T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64
350
Here is an equivalent invocation using Perl:
352
perl -e 'foreach(1..64){printf "0x%08x\n", int (4294967296 * abs (sin $_))}'
349
They are defined in RFC 1321 as
351
T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64
353
Here is an equivalent invocation using Perl:
355
perl -e 'foreach(1..64){printf "0x%08x\n", int (4294967296 * abs (sin $_))}'
356
OP (A, B, C, D, 7, 0xd76aa478);
359
OP (A, B, C, D, 7, 0xd76aa478);
357
360
OP (D, A, B, C, 12, 0xe8c7b756);
358
361
OP (C, D, A, B, 17, 0x242070db);
359
362
OP (B, C, D, A, 22, 0xc1bdceee);
360
OP (A, B, C, D, 7, 0xf57c0faf);
363
OP (A, B, C, D, 7, 0xf57c0faf);
361
364
OP (D, A, B, C, 12, 0x4787c62a);
362
365
OP (C, D, A, B, 17, 0xa8304613);
363
366
OP (B, C, D, A, 22, 0xfd469501);
364
OP (A, B, C, D, 7, 0x698098d8);
367
OP (A, B, C, D, 7, 0x698098d8);
365
368
OP (D, A, B, C, 12, 0x8b44f7af);
366
369
OP (C, D, A, B, 17, 0xffff5bb1);
367
370
OP (B, C, D, A, 22, 0x895cd7be);
368
OP (A, B, C, D, 7, 0x6b901122);
371
OP (A, B, C, D, 7, 0x6b901122);
369
372
OP (D, A, B, C, 12, 0xfd987193);
370
373
OP (C, D, A, B, 17, 0xa679438e);
371
374
OP (B, C, D, A, 22, 0x49b40821);
373
376
/* For the second to fourth round we have the possibly swapped words
374
in CORRECT_WORDS. Redefine the macro to take an additional first
375
argument specifying the function to use. */
377
in CORRECT_WORDS. Redefine the macro to take an additional first
378
argument specifying the function to use. */
377
380
#define OP(f, a, b, c, d, k, s, T) \
387
OP (FG, A, B, C, D, 1, 5, 0xf61e2562);
388
OP (FG, D, A, B, C, 6, 9, 0xc040b340);
390
OP (FG, A, B, C, D, 1, 5, 0xf61e2562);
391
OP (FG, D, A, B, C, 6, 9, 0xc040b340);
389
392
OP (FG, C, D, A, B, 11, 14, 0x265e5a51);
390
OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa);
391
OP (FG, A, B, C, D, 5, 5, 0xd62f105d);
392
OP (FG, D, A, B, C, 10, 9, 0x02441453);
393
OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa);
394
OP (FG, A, B, C, D, 5, 5, 0xd62f105d);
395
OP (FG, D, A, B, C, 10, 9, 0x02441453);
393
396
OP (FG, C, D, A, B, 15, 14, 0xd8a1e681);
394
OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8);
395
OP (FG, A, B, C, D, 9, 5, 0x21e1cde6);
396
OP (FG, D, A, B, C, 14, 9, 0xc33707d6);
397
OP (FG, C, D, A, B, 3, 14, 0xf4d50d87);
398
OP (FG, B, C, D, A, 8, 20, 0x455a14ed);
399
OP (FG, A, B, C, D, 13, 5, 0xa9e3e905);
400
OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8);
401
OP (FG, C, D, A, B, 7, 14, 0x676f02d9);
397
OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8);
398
OP (FG, A, B, C, D, 9, 5, 0x21e1cde6);
399
OP (FG, D, A, B, C, 14, 9, 0xc33707d6);
400
OP (FG, C, D, A, B, 3, 14, 0xf4d50d87);
401
OP (FG, B, C, D, A, 8, 20, 0x455a14ed);
402
OP (FG, A, B, C, D, 13, 5, 0xa9e3e905);
403
OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8);
404
OP (FG, C, D, A, B, 7, 14, 0x676f02d9);
402
405
OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a);
405
OP (FH, A, B, C, D, 5, 4, 0xfffa3942);
406
OP (FH, D, A, B, C, 8, 11, 0x8771f681);
408
OP (FH, A, B, C, D, 5, 4, 0xfffa3942);
409
OP (FH, D, A, B, C, 8, 11, 0x8771f681);
407
410
OP (FH, C, D, A, B, 11, 16, 0x6d9d6122);
408
411
OP (FH, B, C, D, A, 14, 23, 0xfde5380c);
409
OP (FH, A, B, C, D, 1, 4, 0xa4beea44);
410
OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9);
411
OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60);
412
OP (FH, A, B, C, D, 1, 4, 0xa4beea44);
413
OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9);
414
OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60);
412
415
OP (FH, B, C, D, A, 10, 23, 0xbebfbc70);
413
OP (FH, A, B, C, D, 13, 4, 0x289b7ec6);
414
OP (FH, D, A, B, C, 0, 11, 0xeaa127fa);
415
OP (FH, C, D, A, B, 3, 16, 0xd4ef3085);
416
OP (FH, B, C, D, A, 6, 23, 0x04881d05);
417
OP (FH, A, B, C, D, 9, 4, 0xd9d4d039);
416
OP (FH, A, B, C, D, 13, 4, 0x289b7ec6);
417
OP (FH, D, A, B, C, 0, 11, 0xeaa127fa);
418
OP (FH, C, D, A, B, 3, 16, 0xd4ef3085);
419
OP (FH, B, C, D, A, 6, 23, 0x04881d05);
420
OP (FH, A, B, C, D, 9, 4, 0xd9d4d039);
418
421
OP (FH, D, A, B, C, 12, 11, 0xe6db99e5);
419
422
OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8);
420
OP (FH, B, C, D, A, 2, 23, 0xc4ac5665);
423
OP (FH, B, C, D, A, 2, 23, 0xc4ac5665);
423
OP (FI, A, B, C, D, 0, 6, 0xf4292244);
424
OP (FI, D, A, B, C, 7, 10, 0x432aff97);
426
OP (FI, A, B, C, D, 0, 6, 0xf4292244);
427
OP (FI, D, A, B, C, 7, 10, 0x432aff97);
425
428
OP (FI, C, D, A, B, 14, 15, 0xab9423a7);
426
OP (FI, B, C, D, A, 5, 21, 0xfc93a039);
427
OP (FI, A, B, C, D, 12, 6, 0x655b59c3);
428
OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92);
429
OP (FI, B, C, D, A, 5, 21, 0xfc93a039);
430
OP (FI, A, B, C, D, 12, 6, 0x655b59c3);
431
OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92);
429
432
OP (FI, C, D, A, B, 10, 15, 0xffeff47d);
430
OP (FI, B, C, D, A, 1, 21, 0x85845dd1);
431
OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f);
433
OP (FI, B, C, D, A, 1, 21, 0x85845dd1);
434
OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f);
432
435
OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0);
433
OP (FI, C, D, A, B, 6, 15, 0xa3014314);
436
OP (FI, C, D, A, B, 6, 15, 0xa3014314);
434
437
OP (FI, B, C, D, A, 13, 21, 0x4e0811a1);
435
OP (FI, A, B, C, D, 4, 6, 0xf7537e82);
438
OP (FI, A, B, C, D, 4, 6, 0xf7537e82);
436
439
OP (FI, D, A, B, C, 11, 10, 0xbd3af235);
437
OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb);
438
OP (FI, B, C, D, A, 9, 21, 0xeb86d391);
440
OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb);
441
OP (FI, B, C, D, A, 9, 21, 0xeb86d391);
440
443
/* Add the starting values of the context. */