ReactOS  0.4.13-dev-479-gec9c8fd
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  */
29 static 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 
76 static const char client_to_server_sign_constant[] = "session key to client-to-server signing key magic constant";
77 static const char client_to_server_seal_constant[] = "session key to client-to-server sealing key magic constant";
78 static const char server_to_client_sign_constant[] = "session key to server-to-client signing key magic constant";
79 static const char server_to_client_seal_constant[] = "session key to server-to-client sealing key magic constant";
80 
81 typedef 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. */
91 typedef 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 
100 VOID WINAPI MD4Init( MD4_CTX *ctx );
101 VOID WINAPI MD4Update( MD4_CTX *ctx, const unsigned char *buf, unsigned int len );
102 VOID WINAPI MD4Final( MD4_CTX *ctx );
103 #ifndef __REACTOS__ // See hmac_md5.h
104 VOID WINAPI MD5Init( MD5_CTX *ctx );
105 VOID WINAPI MD5Update( MD5_CTX *ctx, const unsigned char *buf, unsigned int len );
106 VOID WINAPI MD5Final( MD5_CTX *ctx );
107 #endif
108 
109 ULONG 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);
130  MD4Update(&ctx, password, len);
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 
144 static 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  */
199 void 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 
224 void 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 }
SECURITY_STATUS SECUR32_CreateNTLM2SubKeys(PNegoHelper helper)
Definition: util.c:156
unsigned char x
Definition: ntlm.h:17
unsigned char digest[16]
Definition: util.c:86
WINE_DEFAULT_DEBUG_CHANNEL(d3dx)
arc4_info * SECUR32_arc4Alloc(void)
Definition: util.c:189
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
HelperMode mode
Definition: ntlm.h:27
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
u32_t magic(void)
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
struct tagMD5_CTX MD5_CTX
ULONG ComputeCrc32(const BYTE *pData, INT iLen, ULONG initial_crc)
Definition: util.c:109
int32_t INT
Definition: typedefs.h:56
static const ULONG CRC_table[256]
Definition: util.c:29
unsigned char state[256]
Definition: ntlm.h:18
SECURITY_STATUS SECUR32_CreateNTLM1SessionKey(PBYTE password, int len, PBYTE session_key)
Definition: util.c:122
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
VOID WINAPI MD4Final(MD4_CTX *ctx)
Definition: md4.c:113
#define b
Definition: ke_i.h:79
LONG SECURITY_STATUS
Definition: sspi.h:34
static const char server_to_client_sign_constant[]
Definition: util.c:78
VOID WINAPI MD4Init(MD4_CTX *ctx)
Definition: md4.c:45
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:395
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
unsigned char digest[16]
Definition: msi.c:4083
GLenum GLuint GLenum GLsizei length
Definition: glext.h:5579
#define WINAPI
Definition: msvc.h:8
#define for
Definition: utility.h:88
void SECUR32_arc4Process(arc4_info *a4i, BYTE *inoutString, unsigned int length)
Definition: util.c:224
static void SECUR32_CalcNTLM2Subkey(const BYTE *session_key, const char *magic, PBYTE subkey)
Definition: util.c:144
T1_FIELD_DICT_PRIVATE password
Definition: t1tokens.h:64
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
GLenum GLsizei len
Definition: glext.h:6722
unsigned char BYTE
Definition: mem.h:68
GLdouble s
Definition: gl.h:2039
#define SEC_E_OK
Definition: winerror.h:2356
BYTE * session_key
Definition: ntlm.h:36
int WINAPI lstrlenA(LPCSTR lpString)
Definition: lstring.c:145
Definition: util.c:81
GLuint in
Definition: glext.h:9616
void SECUR32_arc4Cleanup(arc4_info *a4i)
Definition: util.c:246
VOID WINAPI MD5Init(MD5_CTX *ctx)
Definition: md5.c:45
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
static const char client_to_server_seal_constant[]
Definition: util.c:77
static const char server_to_client_seal_constant[]
Definition: util.c:79
unsigned char y
Definition: ntlm.h:17
unsigned int ULONG
Definition: retypes.h:1
static const char client_to_server_sign_constant[]
Definition: util.c:76
void SECUR32_arc4Init(arc4_info *a4i, const BYTE *key, unsigned int keyLen)
Definition: util.c:199
Definition: msi.c:4078
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
struct tagMD4_CTX MD4_CTX
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1827
struct _NegoHelper::@519 crypt
BYTE * PBYTE
Definition: pedump.c:66
#define HeapFree(x, y, z)
Definition: compat.h:394
VOID WINAPI MD4Update(MD4_CTX *ctx, const unsigned char *buf, unsigned int len)
Definition: md4.c:59
Definition: path.c:42