2
* Unix SMB/Netbios implementation.
4
* a implementation of MD4 designed for use in the SMB authentication protocol
5
* Copyright (C) Andrew Tridgell 1997
7
* This program is free software; you can redistribute it and/or modify
8
* it under the terms of the GNU General Public License as published by
9
* the Free Software Foundation; either version 2 of the License, or
10
* (at your option) any later version.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
17
* You should have received a copy of the GNU General Public License
18
* along with this program; if not, write to the Free Software
19
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23
/* NOTE: This code makes no attempt to be fast!
25
* It assumes that a int is at least 32 bits long
28
#include "std-defines.h" /* for the types */
31
static uint32 A, B, C, D;
34
F(uint32 X, uint32 Y, uint32 Z)
36
return (X & Y) | ((~X) & Z);
40
G(uint32 X, uint32 Y, uint32 Z)
42
return (X & Y) | (X & Z) | (Y & Z);
46
H(uint32 X, uint32 Y, uint32 Z)
52
lshift(uint32 x, int s)
55
return ((x << s) & 0xFFFFFFFF) | (x >> (32 - s));
58
#define ROUND1(a,b,c,d,k,s) a = lshift(a + F(b,c,d) + X[k], s)
59
#define ROUND2(a,b,c,d,k,s) a = lshift(a + G(b,c,d) + X[k] + (uint32)0x5A827999,s)
60
#define ROUND3(a,b,c,d,k,s) a = lshift(a + H(b,c,d) + X[k] + (uint32)0x6ED9EBA1,s)
62
/* this applies md4 to 64 byte chunks */
67
uint32 AA, BB, CC, DD;
70
for (j = 0; j < 16; j++)
78
ROUND1(A, B, C, D, 0, 3);
79
ROUND1(D, A, B, C, 1, 7);
80
ROUND1(C, D, A, B, 2, 11);
81
ROUND1(B, C, D, A, 3, 19);
82
ROUND1(A, B, C, D, 4, 3);
83
ROUND1(D, A, B, C, 5, 7);
84
ROUND1(C, D, A, B, 6, 11);
85
ROUND1(B, C, D, A, 7, 19);
86
ROUND1(A, B, C, D, 8, 3);
87
ROUND1(D, A, B, C, 9, 7);
88
ROUND1(C, D, A, B, 10, 11);
89
ROUND1(B, C, D, A, 11, 19);
90
ROUND1(A, B, C, D, 12, 3);
91
ROUND1(D, A, B, C, 13, 7);
92
ROUND1(C, D, A, B, 14, 11);
93
ROUND1(B, C, D, A, 15, 19);
95
ROUND2(A, B, C, D, 0, 3);
96
ROUND2(D, A, B, C, 4, 5);
97
ROUND2(C, D, A, B, 8, 9);
98
ROUND2(B, C, D, A, 12, 13);
99
ROUND2(A, B, C, D, 1, 3);
100
ROUND2(D, A, B, C, 5, 5);
101
ROUND2(C, D, A, B, 9, 9);
102
ROUND2(B, C, D, A, 13, 13);
103
ROUND2(A, B, C, D, 2, 3);
104
ROUND2(D, A, B, C, 6, 5);
105
ROUND2(C, D, A, B, 10, 9);
106
ROUND2(B, C, D, A, 14, 13);
107
ROUND2(A, B, C, D, 3, 3);
108
ROUND2(D, A, B, C, 7, 5);
109
ROUND2(C, D, A, B, 11, 9);
110
ROUND2(B, C, D, A, 15, 13);
112
ROUND3(A, B, C, D, 0, 3);
113
ROUND3(D, A, B, C, 8, 9);
114
ROUND3(C, D, A, B, 4, 11);
115
ROUND3(B, C, D, A, 12, 15);
116
ROUND3(A, B, C, D, 2, 3);
117
ROUND3(D, A, B, C, 10, 9);
118
ROUND3(C, D, A, B, 6, 11);
119
ROUND3(B, C, D, A, 14, 15);
120
ROUND3(A, B, C, D, 1, 3);
121
ROUND3(D, A, B, C, 9, 9);
122
ROUND3(C, D, A, B, 5, 11);
123
ROUND3(B, C, D, A, 13, 15);
124
ROUND3(A, B, C, D, 3, 3);
125
ROUND3(D, A, B, C, 11, 9);
126
ROUND3(C, D, A, B, 7, 11);
127
ROUND3(B, C, D, A, 15, 15);
139
for (j = 0; j < 16; j++)
144
copy64(uint32 * M, unsigned char *in)
148
for (i = 0; i < 16; i++)
149
M[i] = (in[i * 4 + 3] << 24) | (in[i * 4 + 2] << 16) |
150
(in[i * 4 + 1] << 8) | (in[i * 4 + 0] << 0);
154
copy4(unsigned char *out, uint32 x)
157
out[1] = (x >> 8) & 0xFF;
158
out[2] = (x >> 16) & 0xFF;
159
out[3] = (x >> 24) & 0xFF;
162
/* produce a md4 message digest from data of length n bytes */
164
mdfour(unsigned char *out, unsigned char *in, int n)
166
unsigned char buf[128];
183
for (i = 0; i < 128; i++)
200
for (i = 0; i < 128; i++)