diff options
Diffstat (limited to 'fs/cifs/smbencrypt.c')
-rw-r--r-- | fs/cifs/smbencrypt.c | 63 |
1 files changed, 12 insertions, 51 deletions
diff --git a/fs/cifs/smbencrypt.c b/fs/cifs/smbencrypt.c index ac1221d969d6..7cacba12b8f1 100644 --- a/fs/cifs/smbencrypt.c +++ b/fs/cifs/smbencrypt.c | |||
@@ -199,75 +199,36 @@ SMBencrypt(unsigned char *passwd, const unsigned char *c8, unsigned char *p24) | |||
199 | return rc; | 199 | return rc; |
200 | } | 200 | } |
201 | 201 | ||
202 | /* Routines for Windows NT MD4 Hash functions. */ | ||
203 | static int | ||
204 | _my_wcslen(__u16 *str) | ||
205 | { | ||
206 | int len = 0; | ||
207 | while (*str++ != 0) | ||
208 | len++; | ||
209 | return len; | ||
210 | } | ||
211 | |||
212 | /* | ||
213 | * Convert a string into an NT UNICODE string. | ||
214 | * Note that regardless of processor type | ||
215 | * this must be in intel (little-endian) | ||
216 | * format. | ||
217 | */ | ||
218 | |||
219 | static int | ||
220 | _my_mbstowcs(__u16 *dst, const unsigned char *src, int len) | ||
221 | { /* BB not a very good conversion routine - change/fix */ | ||
222 | int i; | ||
223 | __u16 val; | ||
224 | |||
225 | for (i = 0; i < len; i++) { | ||
226 | val = *src; | ||
227 | SSVAL(dst, 0, val); | ||
228 | dst++; | ||
229 | src++; | ||
230 | if (val == 0) | ||
231 | break; | ||
232 | } | ||
233 | return i; | ||
234 | } | ||
235 | |||
236 | /* | 202 | /* |
237 | * Creates the MD4 Hash of the users password in NT UNICODE. | 203 | * Creates the MD4 Hash of the users password in NT UNICODE. |
238 | */ | 204 | */ |
239 | 205 | ||
240 | int | 206 | int |
241 | E_md4hash(const unsigned char *passwd, unsigned char *p16) | 207 | E_md4hash(const unsigned char *passwd, unsigned char *p16, |
208 | const struct nls_table *codepage) | ||
242 | { | 209 | { |
243 | int rc; | 210 | int rc; |
244 | int len; | 211 | int len; |
245 | __u16 wpwd[129]; | 212 | __u16 wpwd[129]; |
246 | 213 | ||
247 | /* Password cannot be longer than 128 characters */ | 214 | /* Password cannot be longer than 128 characters */ |
248 | if (passwd) { | 215 | if (passwd) /* Password must be converted to NT unicode */ |
249 | len = strlen((char *) passwd); | 216 | len = cifs_strtoUCS(wpwd, passwd, 128, codepage); |
250 | if (len > 128) | 217 | else { |
251 | len = 128; | ||
252 | |||
253 | /* Password must be converted to NT unicode */ | ||
254 | _my_mbstowcs(wpwd, passwd, len); | ||
255 | } else | ||
256 | len = 0; | 218 | len = 0; |
219 | *wpwd = 0; /* Ensure string is null terminated */ | ||
220 | } | ||
257 | 221 | ||
258 | wpwd[len] = 0; /* Ensure string is null terminated */ | 222 | rc = mdfour(p16, (unsigned char *) wpwd, len * sizeof(__u16)); |
259 | /* Calculate length in bytes */ | 223 | memset(wpwd, 0, 129 * sizeof(__u16)); |
260 | len = _my_wcslen(wpwd) * sizeof(__u16); | ||
261 | |||
262 | rc = mdfour(p16, (unsigned char *) wpwd, len); | ||
263 | memset(wpwd, 0, 129 * 2); | ||
264 | 224 | ||
265 | return rc; | 225 | return rc; |
266 | } | 226 | } |
267 | 227 | ||
268 | /* Does the NT MD4 hash then des encryption. */ | 228 | /* Does the NT MD4 hash then des encryption. */ |
269 | int | 229 | int |
270 | SMBNTencrypt(unsigned char *passwd, unsigned char *c8, unsigned char *p24) | 230 | SMBNTencrypt(unsigned char *passwd, unsigned char *c8, unsigned char *p24, |
231 | const struct nls_table *codepage) | ||
271 | { | 232 | { |
272 | int rc; | 233 | int rc; |
273 | unsigned char p16[16], p21[21]; | 234 | unsigned char p16[16], p21[21]; |
@@ -275,7 +236,7 @@ SMBNTencrypt(unsigned char *passwd, unsigned char *c8, unsigned char *p24) | |||
275 | memset(p16, '\0', 16); | 236 | memset(p16, '\0', 16); |
276 | memset(p21, '\0', 21); | 237 | memset(p21, '\0', 21); |
277 | 238 | ||
278 | rc = E_md4hash(passwd, p16); | 239 | rc = E_md4hash(passwd, p16, codepage); |
279 | if (rc) { | 240 | if (rc) { |
280 | cFYI(1, "%s Can't generate NT hash, error: %d", __func__, rc); | 241 | cFYI(1, "%s Can't generate NT hash, error: %d", __func__, rc); |
281 | return rc; | 242 | return rc; |