26 #define uint32 uint32_t 38 return (X&Y) | ((~X)&Z);
43 return (X&Y) | (X&Z) | (Y&Z);
54 return ((x<<s)&0xFFFFFFFF) | (x>>(32-s));
57 #define ROUND1(a,b,c,d,k,s) a = lshift(a + F(b,c,d) + X[k], s) 58 #define ROUND2(a,b,c,d,k,s) a = lshift(a + G(b,c,d) + X[k] + (uint32)0x5A827999,s) 59 #define ROUND3(a,b,c,d,k,s) a = lshift(a + H(b,c,d) + X[k] + (uint32)0x6ED9EBA1,s) 62 static void mdfour64_ntlmssp(
uint32 *M)
71 AA =
A; BB = B; CC =
C; DD = D;
73 ROUND1(
A,B,
C,D, 0, 3);
ROUND1(D,
A,B,
C, 1, 7);
74 ROUND1(
C,D,
A,B, 2, 11);
ROUND1(B,
C,D,
A, 3, 19);
75 ROUND1(
A,B,
C,D, 4, 3);
ROUND1(D,
A,B,
C, 5, 7);
76 ROUND1(
C,D,
A,B, 6, 11);
ROUND1(B,
C,D,
A, 7, 19);
77 ROUND1(
A,B,
C,D, 8, 3);
ROUND1(D,
A,B,
C, 9, 7);
78 ROUND1(
C,D,
A,B, 10, 11);
ROUND1(B,
C,D,
A, 11, 19);
79 ROUND1(
A,B,
C,D, 12, 3);
ROUND1(D,
A,B,
C, 13, 7);
80 ROUND1(
C,D,
A,B, 14, 11);
ROUND1(B,
C,D,
A, 15, 19);
82 ROUND2(
A,B,
C,D, 0, 3);
ROUND2(D,
A,B,
C, 4, 5);
83 ROUND2(
C,D,
A,B, 8, 9);
ROUND2(B,
C,D,
A, 12, 13);
84 ROUND2(
A,B,
C,D, 1, 3);
ROUND2(D,
A,B,
C, 5, 5);
85 ROUND2(
C,D,
A,B, 9, 9);
ROUND2(B,
C,D,
A, 13, 13);
86 ROUND2(
A,B,
C,D, 2, 3);
ROUND2(D,
A,B,
C, 6, 5);
87 ROUND2(
C,D,
A,B, 10, 9);
ROUND2(B,
C,D,
A, 14, 13);
88 ROUND2(
A,B,
C,D, 3, 3);
ROUND2(D,
A,B,
C, 7, 5);
89 ROUND2(
C,D,
A,B, 11, 9);
ROUND2(B,
C,D,
A, 15, 13);
91 ROUND3(
A,B,
C,D, 0, 3);
ROUND3(D,
A,B,
C, 8, 9);
92 ROUND3(
C,D,
A,B, 4, 11);
ROUND3(B,
C,D,
A, 12, 15);
93 ROUND3(
A,B,
C,D, 2, 3);
ROUND3(D,
A,B,
C, 10, 9);
94 ROUND3(
C,D,
A,B, 6, 11);
ROUND3(B,
C,D,
A, 14, 15);
95 ROUND3(
A,B,
C,D, 1, 3);
ROUND3(D,
A,B,
C, 9, 9);
96 ROUND3(
C,D,
A,B, 5, 11);
ROUND3(B,
C,D,
A, 13, 15);
97 ROUND3(
A,B,
C,D, 3, 3);
ROUND3(D,
A,B,
C, 11, 9);
98 ROUND3(
C,D,
A,B, 7, 11);
ROUND3(B,
C,D,
A, 15, 15);
100 A += AA; B += BB;
C += CC; D += DD;
102 A &= 0xFFFFFFFF; B &= 0xFFFFFFFF;
103 C &= 0xFFFFFFFF; D &= 0xFFFFFFFF;
104 memset (X,
'\0',
sizeof (X));
107 static void copy64_ntlmssp(
uint32 *M,
const unsigned char *in)
112 M[i] = (in[i*4+3]<<24) | (in[i*4+2]<<16) |
113 (in[i*4+1]<<8) | (in[i*4+0]<<0);
116 static void copy4_ntlmssp(
unsigned char *out,
uint32 x)
119 out[1] = (x>>8)&0xFF;
120 out[2] = (x>>16)&0xFF;
121 out[3] = (x>>24)&0xFF;
127 unsigned char buf[128];
138 copy64_ntlmssp(M, in);
150 copy4_ntlmssp(buf+56, b);
151 copy64_ntlmssp(M, buf);
154 copy4_ntlmssp(buf+120, b);
155 copy64_ntlmssp(M, buf);
157 copy64_ntlmssp(M, buf+64);
163 copy64_ntlmssp(M, buf);
165 copy4_ntlmssp(out,
A);
166 copy4_ntlmssp(out+4, B);
167 copy4_ntlmssp(out+8,
C);
168 copy4_ntlmssp(out+12, D);
#define ROUND2(a, b, c, d, k, s)
void mdfour_ntlmssp(unsigned char *out, const unsigned char *in, int n)
#define ROUND1(a, b, c, d, k, s)
#define ROUND3(a, b, c, d, k, s)