根据王小云教授的算法写的MD5碰撞的程序(c源代码)
文章作者:[email protected]
根据王小云教授的算法写的MD5碰撞的程序
自从王教授对MD5的剑走偏锋的理解,造成了密码学界的大地震。
这篇文章转载自其他坛子,有兴趣的朋友看看吧:)
/* MD5 Collision Generator by Patrick Stach <[email protected]>
* Implementation of paper by Xiaoyun Wang, et all.
*
* A few optimizations to make the solving method a bit more deterministic
*
* Usage:
* ./md5coll or ./md5coll IV0 IV1 IV2 IV3
*
* Requires being built as 32 bit (unsigned int as 32 bit)
*
* Any derivative works or references must cite the authors.
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#define F(x, y, z) (z ^ (x & (y ^ z)))
#define G(x, y, z) F(z, x, y)
#define H(x, y, z) (x ^ y ^ z)
#define I(x, y, z) (y ^ (x | ~z))
#define RL(x, y) (((x) << (y)) | ((x) >> (32 - (y))))
#define RR(x, y) (((x) >> (y)) | ((x) << (32 - (y))))
unsigned int A0, B0, C0, D0;
unsigned int A1, B1, C1, D1;
unsigned int IV = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 };
unsigned int Q0, Q1;
unsigned int X0, X1;
void block1(void)
{
size_t i, max;
block1_again:
for(;;)
{
/* C1 */
Q0[ 3] = random() & ~0x00800040;
Q1[ 3] = Q0[ 3];
/* B1 */
Q0[ 4] = (random() | 0x80080800) & ~(0x00800040 | 0x0077f780);
Q0[ 4] |= (Q0[ 3] & 0x0077f780);
Q1[ 4] = Q0[ 4];
/* A2 */
Q0[ 5] = (random() | 0x88400025) & ~0x02bfffc0;
Q1[ 5] = Q0[ 5] - 0x00000040;
/* D2 */
Q0[ 6] = (random() | 0x027fbc41) & ~(0x888043a4 | 0x7500001a);
Q0[ 6] |= (Q0[ 5] & 0x7500001a);
Q1[ 6] = Q0[ 6] - 0x7f800040;
/* C2 */
Q0[ 7] = (random() | 0x03fef820) & ~0xfc0107df;
Q1[ 7] = Q0[ 7] - 0x07800041;
X0[ 6] = RR(Q0[ 7] - Q0[ 6], 17) - F(Q0[ 6], Q0[ 5], Q0[ 4])
- Q0[ 3] - 0xa8304613;
X1[ 6] = RR(Q1[ 7] - Q1[ 6], 17) - F(Q1[ 6], Q1[ 5], Q1[ 4])
- Q1[ 3] - 0xa8304613;
if(X0[ 6] != X1[ 6])
continue;
/* B2 */
Q0[ 8] = (random() | 0x01910540) & ~0xfe0eaabf;
Q1[ 8] = Q0[ 8] - 0x00827fff;
X0[ 7] = RR(Q0[ 8] - Q0[ 7], 22) - F(Q0[ 7], Q0[ 6], Q0[ 5])
- Q0[ 4] - 0xfd469501;
X1[ 7] = RR(Q1[ 8] - Q1[ 7], 22) - F(Q1[ 7], Q1[ 6], Q1[ 5])
- Q1[ 4] - 0xfd469501;
if(X0[ 7] != X1[ 7])
continue;
/* A3 */
Q0[ 9] = (random() | 0xfb102f3d) & ~(0x040f80c2 | 0x00001000);
Q0[ 9] |= (Q0[ 8] & 0x00001000);
Q1[ 9] = Q0[ 9] - 0x8000003f;
X0[ 8] = RR(Q0[ 9] - Q0[ 8], 7) - F(Q0[ 8], Q0[ 7], Q0[ 6])
- Q0[ 5] - 0x698098d8;
X1[ 8] = RR(Q1[ 9] - Q1[ 8], 7) - F(Q1[ 8], Q1[ 7], Q1[ 6])
- Q1[ 5] - 0x698098d8;
if(X0[ 8] != X1[ 8])
continue;
/* D3 */
Q0 = (random() | 0x401f9040) & ~0x80802183;
Q1 = Q0 - 0x7ffff000;
X0[ 9] = RR(Q0 - Q0[ 9], 12) - F(Q0[ 9], Q0[ 8], Q0[ 7])
- Q0[ 6] - 0x8b44f7af;
X1[ 9] = RR(Q1 - Q1[ 9], 12) - F(Q1[ 9], Q1[ 8], Q1[ 7])
- Q1[ 6] - 0x8b44f7af;
if(X0[ 9] != X1[ 9])
continue;
/* C3 */
Q0 = (random() | 0x000180c2) & ~(0xc00e3101 | 0x00004000);
Q0 |= (Q0 & 0x00004000);
Q1 = Q0 - 0x40000000;
X0 = RR(Q0 - Q0, 17) - F(Q0, Q0[ 9], Q0[ 8])
- Q0[ 7] - 0xffff5bb1;
X1 = RR(Q1 - Q1, 17) - F(Q1, Q1[ 9], Q1[ 8])
- Q1[ 7] - 0xffff5bb1;
if(X0 != X1)
continue;
/* B3 */
Q0 = (random() | 0x00081100) & ~(0xc007e080 | 0x03000000);
Q0 |= (Q0 & 0x03000000);
Q1 = Q0 - 0x80002080;
X0 = RR(Q0 - Q0, 22) - F(Q0, Q0, Q0[ 9])
- Q0[ 8] - 0x895cd7be;
X1 = RR(Q1 - Q1, 22) - F(Q1, Q1, Q1[ 9])
- Q1[ 8] - 0x895cd7be;
if((X0 ^ X1) != 0x00008000)
continue;
/* A4 */
Q0 = (random() | 0x410fe008) & ~0x82000180;
Q1 = Q0 - 0x7f000000;
X0 = RR(Q0 - Q0, 7) - F(Q0, Q0, Q0)
- Q0[ 9] - 0x6b901122;
X1 = RR(Q1 - Q1, 7) - F(Q1, Q1, Q1)
- Q1[ 9] - 0x6b901122;
if(X0 != X1)
continue;
/* D4 */
Q0 = (random() | 0x000be188) & ~0xa3040000;
Q1 = Q0 - 0x80000000;
X0 = RR(Q0 - Q0, 12) - F(Q0, Q0, Q0)
- Q0 - 0xfd987193;
X1 = RR(Q1 - Q1, 12) - F(Q1, Q1, Q1)
- Q1 - 0xfd987193;
if(X0 != X1)
continue;
/* C4 */
Q0 = (random() | 0x21008000) & ~0x82000008;
Q1 = Q0 - 0x80007ff8;
X0 = RR(Q0 - Q0, 17) - F(Q0, Q0, Q0)
- Q0 - 0xa679438e;
X1 = RR(Q1 - Q1, 17) - F(Q1, Q1, Q1)
- Q1 - 0xa679438e;
if((X0 ^ X1) != 0x80000000)
continue;
/* B4 */
Q0 = (random() | 0x20000000) & ~0x80000000;
Q1 = Q0 - 0xa0000000;
X0 = RR(Q0 - Q0, 22) - F(Q0, Q0, Q0)
- Q0 - 0x49b40821;
X1 = RR(Q1 - Q1, 22) - F(Q1, Q1, Q1)
- Q1 - 0x49b40821;
if(X0 != X1)
continue;
break;
}
#define LOOP_11 300
for(i = 0; i < LOOP_11; i++)
{
/* A5 */
Q0 = random() & ~(0x80020000 | 0x00008008);
Q0 |= (Q0 & 0x00008008);
Q1 = Q0 - 0x80000000;
X0[ 1] = RR(Q0 - Q0, 5) - G(Q0, Q0, Q0)
- Q0 - 0xf61e2562;
X1[ 1] = RR(Q1 - Q1, 5) - G(Q1, Q1, Q1)
- Q1 - 0xf61e2562;
if(X0[ 1] != X1[ 1])
continue;
/* D5 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0[ 6] + 0xc040b340, 9) + Q0;
if((Q0 & 0xa0020000)
!= (0x00020000 | (Q0 & 0x20000000)))
{
continue;
}
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1[ 6] + 0xc040b340, 9) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* C5 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0 + 0x265e5a51, 14) + Q0;
if(Q0 & 0x80020000)
continue;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1 + 0x265e5a51, 14) + Q1;
if(Q0 - Q1 != 0x7ffe0000)
continue;
/* B5 */
Q0 = random() & ~0x80000000;
Q1 = Q0 - 0x80000000;
X0[ 0] = RR(Q0 - Q0, 20) - G(Q0, Q0, Q0)
- Q0 - 0xe9b6c7aa;
X1[ 0] = RR(Q1 - Q1, 20) - G(Q1, Q1, Q1)
- Q1 - 0xe9b6c7aa;
if(X0[ 0] != X1[ 0])
continue;
Q0[ 1] = RL(F(IV, IV, IV) + IV
+ X0[ 0] + 0xd76aa478, 7) + IV;
Q1[ 1] = Q0[ 1];
Q0[ 2] = RL(F(Q0[ 1], IV, IV) + IV
+ X0[ 1] + 0xe8c7b756, 12) + Q0[ 1];
Q1[ 2] = Q0[ 2];
X0[ 2] = RR(Q0[ 3] - Q0[ 2], 17) - F(Q0[ 2], Q0[ 1], IV)
- IV - 0x242070db;
X1[ 2] = X0[ 2];
X0[ 3] = RR(Q0[ 4] - Q0[ 3], 22) - F(Q0[ 3], Q0[ 2], Q0[ 1])
- IV - 0xc1bdceee;
X1[ 3] = X0[ 3];
X0[ 4] = RR(Q0[ 5] - Q0[ 4], 7) - F(Q0[ 4], Q0[ 3], Q0[ 2])
- Q0[ 1] - 0xf57c0faf;
X1[ 4] = RR(Q1[ 5] - Q1[ 4], 7) - F(Q1[ 4], Q1[ 3], Q1[ 2])
- Q1[ 1] - 0xf57c0faf;
if((X0[ 4] ^ X1[ 4]) != 0x80000000)
continue;
X0[ 5] = RR(Q0[ 6] - Q0[ 5], 12) - F(Q0[ 5], Q0[ 4], Q0[ 3])
- Q0[ 2] - 0x4787c62a;
X1[ 5] = RR(Q1[ 6] - Q1[ 5], 12) - F(Q1[ 5], Q1[ 4], Q1[ 3])
- Q1[ 2] - 0x4787c62a;
if(X0[ 5] != X1[ 5])
continue;
/* A6 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0[ 5] + 0xd62f105d, 5) + Q0;
if((Q0 & 0x80020000) != (Q0 & 0x00020000))
continue;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1[ 5] + 0xd62f105d, 5) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* D6 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0 + 0x02441453, 9) + Q0;
if(Q0 & 0x80000000)
continue;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1 + 0x02441453, 9) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* C6 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0 + 0xd8a1e681, 14) + Q0;
if(Q0 & 0x80000000)
continue;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1 + 0xd8a1e681, 14) + Q1;
if(Q0 != Q1)
continue;
/* B6 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0[ 4] + 0xe7d3fbc8, 20) + Q0;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1[ 4] + 0xe7d3fbc8, 20) + Q1;
if(Q0 != Q1)
continue;
/* A7 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0[ 9] + 0x21e1cde6, 5) + Q0;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1[ 9] + 0x21e1cde6, 5) + Q1;
if(Q0 != Q1)
continue;
/* D7 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0 + 0xc33707d6, 9) + Q0;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1 + 0xc33707d6, 9) + Q1;
if(Q0 != Q1)
continue;
/* C7 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0[ 3] + 0xf4d50d87, 14) + Q0;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1[ 3] + 0xf4d50d87, 14) + Q1;
if(Q0 != Q1)
continue;
break;
}
if(i >= LOOP_11)
goto block1_again;
#define LOOP_12 0x20000000
for(i = 0; i < LOOP_12; i++)
{
/* B5 */
Q0 ^= (1 << (random() % 31));
Q1 = Q0 - 0x80000000;
X0[ 0] = RR(Q0 - Q0, 20) - G(Q0, Q0, Q0)
- Q0 - 0xe9b6c7aa;
X1[ 0] = RR(Q1 - Q1, 20) - G(Q1, Q1, Q1)
- Q1 - 0xe9b6c7aa;
if(X0[ 0] != X1[ 0])
continue;
Q0[ 1] = RL(F(IV, IV, IV) + IV
+ X0[ 0] + 0xd76aa478, 7) + IV;
Q1[ 1] = Q0[ 1];
Q0[ 2] = RL(F(Q0[ 1], IV, IV) + IV
+ X0[ 1] + 0xe8c7b756, 12) + Q0[ 1];
Q1[ 2] = Q0[ 2];
X0[ 2] = RR(Q0[ 3] - Q0[ 2], 17) - F(Q0[ 2], Q0[ 1], IV)
- IV - 0x242070db;
X1[ 2] = X0[ 2];
X0[ 3] = RR(Q0[ 4] - Q0[ 3], 22) - F(Q0[ 3], Q0[ 2], Q0[ 1])
- IV - 0xc1bdceee;
X1[ 3] = X0[ 3];
X0[ 4] = RR(Q0[ 5] - Q0[ 4], 7) - F(Q0[ 4], Q0[ 3], Q0[ 2])
- Q0[ 1] - 0xf57c0faf;
X1[ 4] = RR(Q1[ 5] - Q1[ 4], 7) - F(Q1[ 4], Q1[ 3], Q1[ 2])
- Q1[ 1] - 0xf57c0faf;
if((X0[ 4] ^ X1[ 4]) != 0x80000000)
continue;
X0[ 5] = RR(Q0[ 6] - Q0[ 5], 12) - F(Q0[ 5], Q0[ 4], Q0[ 3])
- Q0[ 2] - 0x4787c62a;
X1[ 5] = RR(Q1[ 6] - Q1[ 5], 12) - F(Q1[ 5], Q1[ 4], Q1[ 3])
- Q1[ 2] - 0x4787c62a;
if(X0[ 5] != X1[ 5])
continue;
/* A6 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0[ 5] + 0xd62f105d, 5) + Q0;
if((Q0 & 0x80020000) != (Q0 & 0x00020000))
continue;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1[ 5] + 0xd62f105d, 5) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* D6 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0 + 0x02441453, 9) + Q0;
if(Q0 & 0x80000000)
continue;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1 + 0x02441453, 9) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* C6 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0 + 0xd8a1e681, 14) + Q0;
if(Q0 & 0x80000000)
continue;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1 + 0xd8a1e681, 14) + Q1;
if(Q0 != Q1)
continue;
/* B6 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0[ 4] + 0xe7d3fbc8, 20) + Q0;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1[ 4] + 0xe7d3fbc8, 20) + Q1;
if(Q0 != Q1)
continue;
/* A7 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0[ 9] + 0x21e1cde6, 5) + Q0;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1[ 9] + 0x21e1cde6, 5) + Q1;
if(Q0 != Q1)
continue;
/* D7 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0 + 0xc33707d6, 9) + Q0;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1 + 0xc33707d6, 9) + Q1;
if(Q0 != Q1)
continue;
/* C7 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0[ 3] + 0xf4d50d87, 14) + Q0;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1[ 3] + 0xf4d50d87, 14) + Q1;
if(Q0 != Q1)
continue;
/* B7 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0[ 8] + 0x455a14ed, 20) + Q0;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1[ 8] + 0x455a14ed, 20) + Q1;
if(Q0 != Q1)
continue;
/* A8 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0 + 0xa9e3e905, 5) + Q0;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1 + 0xa9e3e905, 5) + Q1;
if(Q0 != Q1)
continue;
/* D8 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0[ 2] + 0xfcefa3f8, 9) + Q0;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1[ 2] + 0xfcefa3f8, 9) + Q1;
if(Q0 != Q1)
continue;
/* C8 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0[ 7] + 0x676f02d9, 14) + Q0;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1[ 7] + 0x676f02d9, 14) + Q1;
if(Q0 != Q1)
continue;
/* B8 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0 + 0x8d2a4c8a, 20) + Q0;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1 + 0x8d2a4c8a, 20) + Q1;
if(Q0 != Q1)
continue;
/* A9 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0[ 5] + 0xfffa3942, 4) + Q0;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1[ 5] + 0xfffa3942, 4) + Q1;
if(Q0 != Q1)
continue;
/* D9 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0[ 8] + 0x8771f681, 11) + Q0;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1[ 8] + 0x8771f681, 11) + Q1;
if(Q0 != Q1)
continue;
/* C9 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0 + 0x6d9d6122, 16) + Q0;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1 + 0x6d9d6122, 16) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* B9 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0 + 0xfde5380c, 23) + Q0;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1 + 0xfde5380c, 23) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* A10 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0[ 1] + 0xa4beea44, 4) + Q0;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1[ 1] + 0xa4beea44, 4) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* D10 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0[ 4] + 0x4bdecfa9, 11) + Q0;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1[ 4] + 0x4bdecfa9, 11) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* C10 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0[ 7] + 0xf6bb4b60, 16) + Q0;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1[ 7] + 0xf6bb4b60, 16) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* B10 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0 + 0xbebfbc70, 23) + Q0;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1 + 0xbebfbc70, 23) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* A11 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0 + 0x289b7ec6, 4) + Q0;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1 + 0x289b7ec6, 4) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* D11 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0[ 0] + 0xeaa127fa, 11) + Q0;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1[ 0] + 0xeaa127fa, 11) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* C11 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0[ 3] + 0xd4ef3085, 16) + Q0;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1[ 3] + 0xd4ef3085, 16) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* B11 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0[ 6] + 0x04881d05, 23) + Q0;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1[ 6] + 0x04881d05, 23) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* A12 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0[ 9] + 0xd9d4d039, 4) + Q0;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1[ 9] + 0xd9d4d039, 4) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* D12 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0 + 0xe6db99e5, 11) + Q0;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1 + 0xe6db99e5, 11) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* C12 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0 + 0x1fa27cf8, 16) + Q0;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1 + 0x1fa27cf8, 16) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* B12 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0[ 2] + 0xc4ac5665, 23) + Q0;
if((Q0 ^ Q0) & 0x80000000)
continue;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1[ 2] + 0xc4ac5665, 23) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* A13 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0[ 0] + 0xf4292244, 6) + Q0;
if((Q0 ^ Q0) & 0x80000000)
continue;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1[ 0] + 0xf4292244, 6) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* D13 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0[ 7] + 0x432aff97, 10) + Q0;
if(!((Q0 ^ Q0) & 0x80000000))
continue;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1[ 7] + 0x432aff97, 10) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* C13 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0 + 0xab9423a7, 15) + Q0;
if((Q0 ^ Q0) & 0x80000000)
continue;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1 + 0xab9423a7, 15) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* B13 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0[ 5] + 0xfc93a039, 21) + Q0;
if((Q0 ^ Q0) & 0x80000000)
continue;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1[ 5] + 0xfc93a039, 21) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* A14 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0 + 0x655b59c3, 6) + Q0;
if((Q0 ^ Q0) & 0x80000000)
continue;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1 + 0x655b59c3, 6) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* D14 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0[ 3] + 0x8f0ccc92, 10) + Q0;
if((Q0 ^ Q0) & 0x80000000)
continue;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1[ 3] + 0x8f0ccc92, 10) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* C14 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0 + 0xffeff47d, 15) + Q0;
if((Q0 ^ Q0) & 0x80000000)
continue;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1 + 0xffeff47d, 15) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* B14 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0[ 1] + 0x85845dd1, 21) + Q0;
if((Q0 ^ Q0) & 0x80000000)
continue;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1[ 1] + 0x85845dd1, 21) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* A15 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0[ 8] + 0x6fa87e4f, 6) + Q0;
if((Q0 ^ Q0) & 0x80000000)
continue;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1[ 8] + 0x6fa87e4f, 6) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* D15 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0 + 0xfe2ce6e0, 10) + Q0;
if((Q0 ^ Q0) & 0x80000000)
continue;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1 + 0xfe2ce6e0, 10) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* C15 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0[ 6] + 0xa3014314, 15) + Q0;
if((Q0 ^ Q0) & 0x80000000)
continue;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1[ 6] + 0xa3014314, 15) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* B15 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0 + 0x4e0811a1, 21) + Q0;
if(Q0 & 0x02000000)
continue;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1 + 0x4e0811a1, 21) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* A16 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0[ 4] + 0xf7537e82, 6) + Q0;
A0 = IV + Q0;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1[ 4] + 0xf7537e82, 6) + Q1;
A1 = IV + Q1;
if((A0 ^ A1) != 0x80000000)
continue;
/* D16 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0 + 0xbd3af235, 10) + Q0;
D0 = IV + Q0;
if(D0 & 0x02000000)
continue;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1 + 0xbd3af235, 10) + Q1;
D1 = IV + Q1;
if((D0 - D1) != 0x7e000000)
continue;
/* C16 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0[ 2] + 0x2ad7d2bb, 15) + Q0;
C0 = IV + Q0;
if((C0 & 0x86000000) != ((D0 & 0x80000000) | 0x02000000))
continue;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1[ 2] + 0x2ad7d2bb, 15) + Q1;
C1 = IV + Q1;
if((C0 - C1) != 0x7e000000)
continue;
/* B16 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0[ 9] + 0xeb86d391, 21) + Q0;
B0 = IV + Q0;
if((B0 & 0x86000020) != (C0 & 0x80000000))
continue;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1[ 9] + 0xeb86d391, 21) + Q1;
B1 = IV + Q1;
if((B0 - B1) != 0x7e000000)
continue;
break;
}
if(i >= LOOP_12)
goto block1_again;
return;
}
const unsigned int mask22 = {
0x00000001, 0x00000002, 0x00000004, 0x00000008,
0x00000010, 0x00000020, 0x00000040, 0x00000080,
0x00000100, 0x00000200, 0x00000400, 0x00000800,
0x00001000, 0x00002000, 0x00004000, 0x00008000,
0x00010000, 0x00020000, 0x00040000, 0x00080000,
0x00100000, 0x00200000, 0x00400000, 0x00800000,
0x01000000, 0x02000000, 0x04000000, 0x08000000,
0x10000000, 0x40000000
};
void block2(void)
{
size_t i;
block2_again:
for(;;)
{
/* A1 */
Q0[ 1] = (random() | 0x84200000) & ~0x0a000820;
Q1[ 1] = Q0[ 1] - 0x7e000000;
X0 = RR(Q0[ 1] - B0, 7) - F(B0, C0, D0)
- A0 - 0xd76aa478;
X1 = RR(Q1[ 1] - B1, 7) - F(B1, C1, D1)
- A1 - 0xd76aa478;
if(X0 != X1)
continue;
break;
}
for(i = 0; i < 10; i++)
{
/* D1 */
Q0[ 2] = (random() | 0x8c000800) & ~(0x02208026 | 0x701f10c0);
Q0[ 2] |= (Q0[ 1] & 0x701f10c0);
Q1[ 2] = Q0[ 2] - 0x7dffffe0;
X0 = RR(Q0[ 2] - Q0[ 1], 12) - F(Q0[ 1], B0, C0)
- D0 - 0xe8c7b756;
X1 = RR(Q1[ 2] - Q1[ 1], 12) - F(Q1[ 1], B1, C1)
- D1 - 0xe8c7b756;
if(X0 != X1)
continue;
break;
}
if(i >= 10)
goto block2_again;
for(i = 0; i < 10; i++)
{
/* C1 */
Q0[ 3] = (random() | 0xbe1f0966) & ~(0x40201080 | 0x00000018);
Q0[ 3] |= (Q0[ 2] & 0x00000018);
Q1[ 3] = Q0[ 3] - 0x7dfef7e0;
X0 = RR(Q0[ 3] - Q0[ 2], 17) - F(Q0[ 2], Q0[ 1], B0)
- C0 - 0x242070db;
X1 = RR(Q1[ 3] - Q1[ 2], 17) - F(Q1[ 2], Q1[ 1], B1)
- C1 - 0x242070db;
if(X0 != X1)
continue;
break;
}
if(i >= 10)
goto block2_again;
for(i = 0; i < 10; i++)
{
/* B1 */
Q0[ 4] = (random() | 0xba040010) & ~(0x443b19ee | 0x00000601);
Q0[ 4] |= (Q0[ 3] & 0x00000601);
Q1[ 4] = Q0[ 4] - 0x7dffffe2;
X0 = RR(Q0[ 4] - Q0[ 3], 22) - F(Q0[ 3], Q0[ 2], Q0[ 1])
- B0 - 0xc1bdceee;
X1 = RR(Q1[ 4] - Q1[ 3], 22) - F(Q1[ 3], Q1[ 2], Q1[ 1])
- B1 - 0xc1bdceee;
if(X0 != X1)
continue;
break;
}
if(i >= 10)
goto block2_again;
for(i = 0; i < 10; i++)
{
/* A2 */
Q0[ 5] = (random() | 0x482f0e50) & ~0xb41011af;
Q1[ 5] = Q0[ 5] - 0x7ffffcbf;
X0 = RR(Q0[ 5] - Q0[ 4], 7) - F(Q0[ 4], Q0[ 3], Q0[ 2])
- Q0[ 1] - 0xf57c0faf;
X1 = RR(Q1[ 5] - Q1[ 4], 7) - F(Q1[ 4], Q1[ 3], Q1[ 2])
- Q1[ 1] - 0xf57c0faf;
if((X0 ^ X1) != 0x80000000)
continue;
break;
}
if(i >= 10)
goto block2_again;
for(i = 0; i < 10; i++)
{
/* D2 */
Q0[ 6] = (random() | 0x04220c56) & ~0x9a1113a9;
Q1[ 6] = Q0[ 6] - 0x80110000;
X0 = RR(Q0[ 6] - Q0[ 5], 12) - F(Q0[ 5], Q0[ 4], Q0[ 3])
- Q0[ 2] - 0x4787c62a;
X1 = RR(Q1[ 6] - Q1[ 5], 12) - F(Q1[ 5], Q1[ 4], Q1[ 3])
- Q1[ 2] - 0x4787c62a;
if(X0 != X1)
continue;
break;
}
if(i >= 10)
goto block2_again;
for(i = 0; i < 10; i++)
{
/* C2 */
Q0[ 7] = (random() | 0x96011e01) & ~(0x083201c0 | 0x01808000);
Q0[ 7] |= (Q0[ 6] & 0x01808000);
Q1[ 7] = Q0[ 7] - 0x88000040;
X0 = RR(Q0[ 7] - Q0[ 6], 17) - F(Q0[ 6], Q0[ 5], Q0[ 4])
- Q0[ 3] - 0xa8304613;
X1 = RR(Q1[ 7] - Q1[ 6], 17) - F(Q1[ 6], Q1[ 5], Q1[ 4])
- Q1[ 3] - 0xa8304613;
if(X0 != X1)
continue;
break;
}
if(i >= 10)
goto block2_again;
for(i = 0; i < 10; i++)
{
/* B2 */
Q0[ 8] = (random() | 0x843283c0) & ~(0x1b810001 | 0x00000002);
Q0[ 8] |= (Q0[ 7] & 0x00000002);
Q1[ 8] = Q0[ 8] - 0x80818000;
X0 = RR(Q0[ 8] - Q0[ 7], 22) - F(Q0[ 7], Q0[ 6], Q0[ 5])
- Q0[ 4] - 0xfd469501;
X1 = RR(Q1[ 8] - Q1[ 7], 22) - F(Q1[ 7], Q1[ 6], Q1[ 5])
- Q1[ 4] - 0xfd469501;
if(X0 != X1)
continue;
break;
}
if(i >= 10)
goto block2_again;
for(i = 0; i < 10; i++)
{
/* A3 */
Q0[ 9] = (random() | 0x9c0101c1) & ~(0x03828202 | 0x00001000);
Q0[ 9] |= (Q0[ 8] & 0x00001000);
Q1[ 9] = Q0[ 9] - 0x7fffffbf;
X0 = RR(Q0[ 9] - Q0[ 8], 7) - F(Q0[ 8], Q0[ 7], Q0[ 6])
- Q0[ 5] - 0x698098d8;
X1 = RR(Q1[ 9] - Q1[ 8], 7) - F(Q1[ 8], Q1[ 7], Q1[ 6])
- Q1[ 5] - 0x698098d8;
if(X0 != X1)
continue;
break;
}
if(i >= 10)
goto block2_again;
for(i = 0; i < 10; i++)
{
/* D3 */
Q0 = (random() | 0x878383c0) & ~0x00041003;
Q1 = Q0 - 0x7ffff000;
X0 = RR(Q0 - Q0[ 9], 12) - F(Q0[ 9], Q0[ 8], Q0[ 7])
- Q0[ 6] - 0x8b44f7af;
X1 = RR(Q1 - Q1[ 9], 12) - F(Q1[ 9], Q1[ 8], Q1[ 7])
- Q1[ 6] - 0x8b44f7af;
if(X0 != X1)
continue;
break;
}
if(i >= 10)
goto block2_again;
for(i = 0; i < 10; i++)
{
/* C3 */
Q0 = (random() | 0x800583c3) & ~(0x00021000 | 0x00086000);
Q0 |= (Q0 & 0x00086000);
Q1 = Q0 - 0x80000000;
X0 = RR(Q0 - Q0, 17) - F(Q0, Q0[ 9], Q0[ 8])
- Q0[ 7] - 0xffff5bb1;
X1 = RR(Q1 - Q1, 17) - F(Q1, Q1[ 9], Q1[ 8])
- Q1[ 7] - 0xffff5bb1;
if(X0 != X1)
continue;
break;
}
if(i >= 10)
goto block2_again;
for(i = 0; i < 10; i++)
{
/* B3 */
Q0 = (random() | 0x80081080) & ~(0x0007e000 | 0x7f000000);
Q0 |= (Q0 & 0x7f000000);
Q1 = Q0 - 0x80002080;
X0 = RR(Q0 - Q0, 22) - F(Q0, Q0, Q0[ 9])
- Q0[ 8] - 0x895cd7be;
X1 = RR(Q1 - Q1, 22) - F(Q1, Q1, Q1[ 9])
- Q1[ 8] - 0x895cd7be;
if((X0 ^ X1) != 0x00008000)
continue;
break;
}
if(i >= 10)
goto block2_again;
for(i = 0; i < 10; i++)
{
/* A4 */
Q0 = (random() | 0x3f0fe008) & ~0x80000080;
Q1 = Q0 - 0x7f000000;
X0 = RR(Q0 - Q0, 7) - F(Q0, Q0, Q0)
- Q0[ 9] - 0x6b901122;
X1 = RR(Q1 - Q1, 7) - F(Q1, Q1, Q1)
- Q1[ 9] - 0x6b901122;
if(X0 != X1)
continue;
break;
}
if(i >= 10)
goto block2_again;
for(i = 0; i < 10; i++)
{
/* D4 */
Q0 = (random() | 0x400be088) & ~0xbf040000;
Q1 = Q0 - 0x80000000;
X0 = RR(Q0 - Q0, 12) - F(Q0, Q0, Q0)
- Q0 - 0xfd987193;
X1 = RR(Q1 - Q1, 12) - F(Q1, Q1, Q1)
- Q1 - 0xfd987193;
if(X0 != X1)
continue;
break;
}
if(i >= 10)
goto block2_again;
for(i = 0; i < 10; i++)
{
/* C4 */
Q0 = (random() | 0x7d000000) & ~0x82008008;
Q1 = Q0 - 0x7fff7ff8;
X0 = RR(Q0 - Q0, 17) - F(Q0, Q0, Q0)
- Q0 - 0xa679438e;
X1 = RR(Q1 - Q1, 17) - F(Q1, Q1, Q1)
- Q1 - 0xa679438e;
if((X0 ^ X1) != 0x80000000)
continue;
break;
}
if(i >= 10)
goto block2_again;
#define LOOP_21 1000
for(i = 0; i < LOOP_21; i++)
{
/* B4 */
Q0 = (random() | 0x20000000) & ~0x80000000;
Q1 = Q0 - 0xa0000000;
X0 = RR(Q0 - Q0, 22) - F(Q0, Q0, Q0)
- Q0 - 0x49b40821;
X1 = RR(Q1 - Q1, 22) - F(Q1, Q1, Q1)
- Q1 - 0x49b40821;
if(X0 != X1)
continue;
/* A5 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0 + 0xf61e2562, 5) + Q0;
if((Q0 & 0x80028008) != (Q0 & 0x00008008))
continue;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1 + 0xf61e2562, 5) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* D5 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0 + 0xc040b340, 9) + Q0;
if((Q0 & 0xa0020000)
!= ((Q0 & 0x20000000) | 0x00020000))
{
continue;
}
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1 + 0xc040b340, 9) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* C5 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0 + 0x265e5a51, 14) + Q0;
if(Q0 & 0x80020000)
continue;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1 + 0x265e5a51, 14) + Q1;
if((Q0 - Q1) != 0x7ffe0000)
continue;
/* B5 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0 + 0xe9b6c7aa, 20) + Q0;
if(Q0 & 0x80000000)
continue;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1 + 0xe9b6c7aa, 20) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* A6 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0 + 0xd62f105d, 5) + Q0;
if((Q0 & 0x80020000) != (Q0 & 0x00020000))
continue;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1 + 0xd62f105d, 5) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
break;
}
if(i >= LOOP_21)
goto block2_again;
#define LOOP_22 0x4000000
for(i = 0; i < LOOP_22; i++)
{
/* B4 */
Q0 ^= mask22;
Q1 = Q0 - 0xa0000000;
X0 = RR(Q0 - Q0, 22) - F(Q0, Q0, Q0)
- Q0 - 0x49b40821;
X1 = RR(Q1 - Q1, 22) - F(Q1, Q1, Q1)
- Q1 - 0x49b40821;
if(X0 != X1)
continue;
/* A5 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0 + 0xf61e2562, 5) + Q0;
if((Q0 & 0x80028008) != (Q0 & 0x00008008))
continue;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1 + 0xf61e2562, 5) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* D5 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0 + 0xc040b340, 9) + Q0;
if((Q0 & 0xa0020000)
!= ((Q0 & 0x20000000) | 0x00020000))
{
continue;
}
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1 + 0xc040b340, 9) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* C5 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0 + 0x265e5a51, 14) + Q0;
if(Q0 & 0x80020000)
continue;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1 + 0x265e5a51, 14) + Q1;
if((Q0 - Q1) != 0x7ffe0000)
continue;
/* B5 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0 + 0xe9b6c7aa, 20) + Q0;
if(Q0 & 0x80000000)
continue;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1 + 0xe9b6c7aa, 20) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* A6 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0 + 0xd62f105d, 5) + Q0;
if((Q0 & 0x80020000) != (Q0 & 0x00020000))
continue;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1 + 0xd62f105d, 5) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* D6 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0 + 0x02441453, 9) + Q0;
if(Q0 & 0x80000000)
continue;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1 + 0x02441453, 9) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* C6 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0 + 0xd8a1e681, 14) + Q0;
if(Q0 & 0x80000000)
continue;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1 + 0xd8a1e681, 14) + Q1;
if(Q0 != Q1)
continue;
/* B6 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0 + 0xe7d3fbc8, 20) + Q0;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1 + 0xe7d3fbc8, 20) + Q1;
if(Q0 != Q1)
continue;
/* A7 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0 + 0x21e1cde6, 5) + Q0;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1 + 0x21e1cde6, 5) + Q1;
if(Q0 != Q1)
continue;
/* D7 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0 + 0xc33707d6, 9) + Q0;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1 + 0xc33707d6, 9) + Q1;
if(Q0 != Q1)
continue;
/* C7 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0 + 0xf4d50d87, 14) + Q0;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1 + 0xf4d50d87, 14) + Q1;
if(Q0 != Q1)
continue;
/* B7 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0 + 0x455a14ed, 20) + Q0;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1 + 0x455a14ed, 20) + Q1;
if(Q0 != Q1)
continue;
/* A8 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0 + 0xa9e3e905, 5) + Q0;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1 + 0xa9e3e905, 5) + Q1;
if(Q0 != Q1)
continue;
/* D8 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0 + 0xfcefa3f8, 9) + Q0;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1 + 0xfcefa3f8, 9) + Q1;
if(Q0 != Q1)
continue;
/* C8 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0 + 0x676f02d9, 14) + Q0;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1 + 0x676f02d9, 14) + Q1;
if(Q0 != Q1)
continue;
/* B8 */
Q0 = RL(G(Q0, Q0, Q0) + Q0
+ X0 + 0x8d2a4c8a, 20) + Q0;
Q1 = RL(G(Q1, Q1, Q1) + Q1
+ X1 + 0x8d2a4c8a, 20) + Q1;
if(Q0 != Q1)
continue;
/* A9 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0 + 0xfffa3942, 4) + Q0;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1 + 0xfffa3942, 4) + Q1;
if(Q0 != Q1)
continue;
/* D9 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0 + 0x8771f681, 11) + Q0;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1 + 0x8771f681, 11) + Q1;
if(Q0 != Q1)
continue;
/* C9 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0 + 0x6d9d6122, 16) + Q0;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1 + 0x6d9d6122, 16) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* B9 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0 + 0xfde5380c, 23) + Q0;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1 + 0xfde5380c, 23) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* A10 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0 + 0xa4beea44, 4) + Q0;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1 + 0xa4beea44, 4) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* D10 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0 + 0x4bdecfa9, 11) + Q0;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1 + 0x4bdecfa9, 11) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* C10 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0 + 0xf6bb4b60, 16) + Q0;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1 + 0xf6bb4b60, 16) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* B10 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0 + 0xbebfbc70, 23) + Q0;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1 + 0xbebfbc70, 23) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* A11 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0 + 0x289b7ec6, 4) + Q0;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1 + 0x289b7ec6, 4) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* D11 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0 + 0xeaa127fa, 11) + Q0;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1 + 0xeaa127fa, 11) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* C11 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0 + 0xd4ef3085, 16) + Q0;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1 + 0xd4ef3085, 16) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* B11 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0 + 0x04881d05, 23) + Q0;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1 + 0x04881d05, 23) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* A12 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0 + 0xd9d4d039, 4) + Q0;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1 + 0xd9d4d039, 4) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* D12 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0 + 0xe6db99e5, 11) + Q0;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1 + 0xe6db99e5, 11) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* C12 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0 + 0x1fa27cf8, 16) + Q0;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1 + 0x1fa27cf8, 16) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* B12 */
Q0 = RL(H(Q0, Q0, Q0) + Q0
+ X0 + 0xc4ac5665, 23) + Q0;
if((Q0 & 0x80000000) != (Q0 & 0x80000000))
continue;
Q1 = RL(H(Q1, Q1, Q1) + Q1
+ X1 + 0xc4ac5665, 23) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* A13 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0 + 0xf4292244, 6) + Q0;
if((Q0 & 0x80000000) != (Q0 & 0x80000000))
continue;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1 + 0xf4292244, 6) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* D13 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0 + 0x432aff97, 10) + Q0;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1 + 0x432aff97, 10) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* C13 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0 + 0xab9423a7, 15) + Q0;
if((Q0 & 0x80000000) != (Q0 & 0x80000000))
continue;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1 + 0xab9423a7, 15) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* B13 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0 + 0xfc93a039, 21) + Q0;
if((Q0 & 0x80000000) != (Q0 & 0x80000000))
continue;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1 + 0xfc93a039, 21) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* A14 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0 + 0x655b59c3, 6) + Q0;
if((Q0 & 0x80000000) != (Q0 & 0x80000000))
continue;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1 + 0x655b59c3, 6) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* D14 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0 + 0x8f0ccc92, 10) + Q0;
if((Q0 & 0x80000000) != (Q0 & 0x80000000))
continue;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1 + 0x8f0ccc92, 10) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* C14 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0 + 0xffeff47d, 15) + Q0;
if((Q0 & 0x80000000) != (Q0 & 0x80000000))
continue;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1 + 0xffeff47d, 15) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* B14 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0 + 0x85845dd1, 21) + Q0;
if((Q0 & 0x80000000) != (Q0 & 0x80000000))
continue;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1 + 0x85845dd1, 21) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* A15 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0 + 0x6fa87e4f, 6) + Q0;
if((Q0 & 0x80000000) != (Q0 & 0x80000000))
continue;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1 + 0x6fa87e4f, 6) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* D15 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0 + 0xfe2ce6e0, 10) + Q0;
if((Q0 & 0x80000000) != (Q0 & 0x80000000))
continue;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1 + 0xfe2ce6e0, 10) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* C15 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0 + 0xa3014314, 15) + Q0;
if((Q0 & 0x80000000) != (Q0 & 0x80000000))
continue;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1 + 0xa3014314, 15) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* B15 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0 + 0x4e0811a1, 21) + Q0;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1 + 0x4e0811a1, 21) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
/* A16 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0 + 0xf7537e82, 6) + Q0;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1 + 0xf7537e82, 6) + Q1;
if((Q0 ^ Q1) != 0x80000000)
continue;
if((A0 + Q0) != (A1 + Q1))
continue;
/* D16 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0 + 0xbd3af235, 10) + Q0;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1 + 0xbd3af235, 10) + Q1;
if((D0 + Q0) != (D1 + Q1))
continue;
/* C16 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0 + 0x2ad7d2bb, 15) + Q0;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1 + 0x2ad7d2bb, 15) + Q1;
if((C0 + Q0) != (C1 + Q1))
continue;
/* B16 */
Q0 = RL(I(Q0, Q0, Q0) + Q0
+ X0 + 0xeb86d391, 21) + Q0;
Q1 = RL(I(Q1, Q1, Q1) + Q1
+ X1 + 0xeb86d391, 21) + Q1;
if((B0 + Q0) != (B1 + Q1))
continue;
break;
}
if(i >= LOOP_22)
goto block2_again;
return;
}
int main(int argc, char *argv[])
{
size_t i;
if(argc == 5)
{
IV = strtoul(argv, NULL, 0);
IV = strtoul(argv, NULL, 0);
IV = strtoul(argv, NULL, 0);
IV = strtoul(argv, NULL, 0);
}
srandom(time(NULL) ^ (getpid() << 16));
block1();
printf("block #1 done\n");
block2();
printf("block #2 done\n");
printf("unsigned int m0 = {\n");
for(i = 0; i < 32; i++)
{
printf("0x%08x, ", X0[ i]);
if((i & 3) == 3)
printf("\n");
}
printf("};\n\n");
printf("unsigned int m1 = {\n");
for(i = 0; i < 32; i++)
{
printf("0x%08x, ", X1[ i]);
if((i & 3) == 3)
printf("\n");
}
printf("};\n\n");
return 0;
}
收藏下来慢慢学习
页:
[1]