ReactOS 0.4.15-dev-7674-gc0b4db1
util.c
Go to the documentation of this file.
1/*
2 * Copyright 2006 Kai Blin
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 *
18 * This file contains various helper functions needed for NTLM and maybe others
19 */
20#include "precomp.h"
21
22#include <wine/debug.h>
24
25/* The CRC32 code is copyright (C) 1986 Gary S. Brown and was placed in the
26 * public domain.
27 * CRC polynomial 0xedb88320
28 */
29static const ULONG CRC_table[256] =
30{
31 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
32 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
33 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
34 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
35 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
36 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
37 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
38 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
39 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
40 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
41 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
42 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
43 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
44 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
45 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
46 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
47 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
48 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
49 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
50 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
51 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
52 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
53 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
54 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
55 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
56 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
57 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
58 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
59 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
60 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
61 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
62 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
63 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
64 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
65 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
66 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
67 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
68 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
69 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
70 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
71 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
72 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
73 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
74};
75
76static const char client_to_server_sign_constant[] = "session key to client-to-server signing key magic constant";
77static const char client_to_server_seal_constant[] = "session key to client-to-server sealing key magic constant";
78static const char server_to_client_sign_constant[] = "session key to server-to-client signing key magic constant";
79static const char server_to_client_seal_constant[] = "session key to server-to-client sealing key magic constant";
80
81typedef struct
82{
83 unsigned int buf[4];
84 unsigned int i[2];
85 unsigned char in[64];
86 unsigned char digest[16];
87} MD4_CTX;
88
89#ifndef __REACTOS__ // See hmac_md5.h
90/* And now the same with a different memory layout. */
91typedef struct
92{
93 unsigned int i[2];
94 unsigned int buf[4];
95 unsigned char in[64];
96 unsigned char digest[16];
97} MD5_CTX;
98#endif
99
101VOID WINAPI MD4Update( MD4_CTX *ctx, const unsigned char *buf, unsigned int len );
103#ifndef __REACTOS__ // See hmac_md5.h
105VOID WINAPI MD5Update( MD5_CTX *ctx, const unsigned char *buf, unsigned int len );
107#endif
108
109ULONG ComputeCrc32(const BYTE *pData, INT iLen, ULONG initial_crc)
110{
111 ULONG crc = ~initial_crc;
112
113 while (iLen > 0)
114 {
115 crc = CRC_table[(crc ^ *pData) & 0xff] ^ (crc >> 8);
116 pData++;
117 iLen--;
118 }
119 return ~crc;
120}
121
123{
124 MD4_CTX ctx;
125 BYTE ntlm_hash[16];
126
127 TRACE("(%p, %p)\n", password, session_key);
128
129 MD4Init(&ctx);
131 MD4Final(&ctx);
132
133 memcpy(ntlm_hash, ctx.digest, 0x10);
134
135 MD4Init(&ctx);
136 MD4Update(&ctx, ntlm_hash, 0x10u);
137 MD4Final(&ctx);
138
139 memcpy(session_key, ctx.digest, 0x10);
140
141 return SEC_E_OK;
142}
143
144static void SECUR32_CalcNTLM2Subkey(const BYTE *session_key, const char *magic, PBYTE subkey)
145{
146 MD5_CTX ctx;
147
148 MD5Init(&ctx);
149 MD5Update(&ctx, session_key, 16);
150 MD5Update(&ctx, (const unsigned char*)magic, lstrlenA(magic)+1);
151 MD5Final(&ctx);
152 memcpy(subkey, ctx.digest, 16);
153}
154
155/* This assumes we do have a valid NTLM2 user session key */
157{
158 helper->crypt.ntlm2.send_sign_key = HeapAlloc(GetProcessHeap(), 0, 16);
159 helper->crypt.ntlm2.send_seal_key = HeapAlloc(GetProcessHeap(), 0, 16);
160 helper->crypt.ntlm2.recv_sign_key = HeapAlloc(GetProcessHeap(), 0, 16);
161 helper->crypt.ntlm2.recv_seal_key = HeapAlloc(GetProcessHeap(), 0, 16);
162
163 if(helper->mode == NTLM_CLIENT)
164 {
166 helper->crypt.ntlm2.send_sign_key);
168 helper->crypt.ntlm2.send_seal_key);
170 helper->crypt.ntlm2.recv_sign_key);
172 helper->crypt.ntlm2.recv_seal_key);
173 }
174 else
175 {
177 helper->crypt.ntlm2.send_sign_key);
179 helper->crypt.ntlm2.send_seal_key);
181 helper->crypt.ntlm2.recv_sign_key);
183 helper->crypt.ntlm2.recv_seal_key);
184 }
185
186 return SEC_E_OK;
187}
188
190{
191 arc4_info *a4i = HeapAlloc(GetProcessHeap(), 0, sizeof(arc4_info));
192 return a4i;
193}
194
195/*
196 * The arc4 code is based on dlls/advapi32/crypt_arc4.c by Mike McCormack,
197 * which in turn is based on public domain code by Wei Dai
198 */
199void SECUR32_arc4Init(arc4_info *a4i, const BYTE *key, unsigned int keyLen)
200{
201 unsigned int keyIndex = 0, stateIndex = 0;
202 unsigned int i, a;
203
204 TRACE("(%p, %p, %d)\n", a4i, key, keyLen);
205
206 a4i->x = a4i->y = 0;
207
208 for (i=0; i<256; i++)
209 a4i->state[i] = i;
210
211 for (i=0; i<256; i++)
212 {
213 a = a4i->state[i];
214 stateIndex += key[keyIndex] + a;
215 stateIndex &= 0xff;
216 a4i->state[i] = a4i->state[stateIndex];
217 a4i->state[stateIndex] = a;
218 if (++keyIndex >= keyLen)
219 keyIndex = 0;
220 }
221
222}
223
224void SECUR32_arc4Process(arc4_info *a4i, BYTE *inoutString, unsigned int length)
225{
226 BYTE *const s=a4i->state;
227 unsigned int x = a4i->x;
228 unsigned int y = a4i->y;
229 unsigned int a, b;
230
231 while(length--)
232 {
233 x = (x+1) & 0xff;
234 a = s[x];
235 y = (y+a) & 0xff;
236 b = s[y];
237 s[x] = b;
238 s[y] = a;
239 *inoutString++ ^= s[(a+b) & 0xff];
240 }
241
242 a4i->x = x;
243 a4i->y = y;
244}
245
247{
248 HeapFree(GetProcessHeap(), 0, a4i);
249}
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
static void SECUR32_CalcNTLM2Subkey(const BYTE *session_key, const char *magic, PBYTE subkey)
Definition: util.c:144
static const ULONG CRC_table[256]
Definition: util.c:29
static const char client_to_server_seal_constant[]
Definition: util.c:77
void SECUR32_arc4Cleanup(arc4_info *a4i)
Definition: util.c:246
void SECUR32_arc4Init(arc4_info *a4i, const BYTE *key, unsigned int keyLen)
Definition: util.c:199
static const char server_to_client_seal_constant[]
Definition: util.c:79
VOID WINAPI MD5Final(MD5_CTX *ctx)
Definition: md5.c:113
VOID WINAPI MD5Update(MD5_CTX *ctx, const unsigned char *buf, unsigned int len)
Definition: md5.c:59
ULONG ComputeCrc32(const BYTE *pData, INT iLen, ULONG initial_crc)
Definition: util.c:109
SECURITY_STATUS SECUR32_CreateNTLM1SessionKey(PBYTE password, int len, PBYTE session_key)
Definition: util.c:122
void SECUR32_arc4Process(arc4_info *a4i, BYTE *inoutString, unsigned int length)
Definition: util.c:224
VOID WINAPI MD5Init(MD5_CTX *ctx)
Definition: md5.c:45
static const char client_to_server_sign_constant[]
Definition: util.c:76
VOID WINAPI MD4Final(MD4_CTX *ctx)
Definition: md4.c:113
VOID WINAPI MD4Update(MD4_CTX *ctx, const unsigned char *buf, unsigned int len)
Definition: md4.c:59
SECURITY_STATUS SECUR32_CreateNTLM2SubKeys(PNegoHelper helper)
Definition: util.c:156
VOID WINAPI MD4Init(MD4_CTX *ctx)
Definition: md4.c:45
static const char server_to_client_sign_constant[]
Definition: util.c:78
arc4_info * SECUR32_arc4Alloc(void)
Definition: util.c:189
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLdouble s
Definition: gl.h:2039
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLuint in
Definition: glext.h:9616
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
GLenum GLsizei len
Definition: glext.h:6722
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define a
Definition: ke_i.h:78
#define b
Definition: ke_i.h:79
int WINAPI lstrlenA(LPCSTR lpString)
Definition: lstring.c:145
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define for
Definition: utility.h:88
static WCHAR password[]
Definition: url.c:33
u32_t magic(void)
@ NTLM_CLIENT
Definition: ntlm.h:12
BYTE * PBYTE
Definition: pedump.c:66
LONG SECURITY_STATUS
Definition: sspi.h:34
#define TRACE(s)
Definition: solgame.cpp:4
Definition: util.c:82
Definition: msi.c:4013
BYTE * session_key
Definition: ntlm.h:36
struct _NegoHelper::@550 crypt
HelperMode mode
Definition: ntlm.h:27
Definition: copy.c:22
unsigned char x
Definition: ntlm.h:17
unsigned char y
Definition: ntlm.h:17
unsigned char state[256]
Definition: ntlm.h:18
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG
Definition: typedefs.h:59
#define WINAPI
Definition: msvc.h:6
#define SEC_E_OK
Definition: winerror.h:2356
unsigned char BYTE
Definition: xxhash.c:193