]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - fs/cifs/cifsencrypt.c
Fix the conflict between rwpidforward and rw mount options
[mirror_ubuntu-artful-kernel.git] / fs / cifs / cifsencrypt.c
CommitLineData
1da177e4
LT
1/*
2 * fs/cifs/cifsencrypt.c
3 *
12b3b8ff 4 * Copyright (C) International Business Machines Corp., 2005,2006
1da177e4
LT
5 * Author(s): Steve French (sfrench@us.ibm.com)
6 *
7 * This library is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU Lesser General Public License as published
9 * by the Free Software Foundation; either version 2.1 of the License, or
10 * (at your option) any later version.
11 *
12 * This library 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
15 * the GNU Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21
22#include <linux/fs.h>
5a0e3ad6 23#include <linux/slab.h>
1da177e4 24#include "cifspdu.h"
ffdd6e4d 25#include "cifsglob.h"
1da177e4 26#include "cifs_debug.h"
1da177e4
LT
27#include "cifs_unicode.h"
28#include "cifsproto.h"
2b149f11 29#include "ntlmssp.h"
7c7b25bc 30#include <linux/ctype.h>
6d027cfd 31#include <linux/random.h>
1da177e4 32
157c2491
JL
33/*
34 * Calculate and return the CIFS signature based on the mac key and SMB PDU.
35 * The 16 byte signature must be allocated by the caller. Note we only use the
36 * 1st eight bytes and that the smb header signature field on input contains
37 * the sequence number before this function is called. Also, this function
38 * should be called with the server->srv_mutex held.
39 */
ffdd6e4d 40static int cifs_calculate_signature(const struct smb_hdr *cifs_pdu,
21e73393 41 struct TCP_Server_Info *server, char *signature)
1da177e4 42{
307fbd31 43 int rc;
1da177e4 44
21e73393 45 if (cifs_pdu == NULL || signature == NULL || server == NULL)
1da177e4
LT
46 return -EINVAL;
47
307fbd31
SP
48 if (!server->secmech.sdescmd5) {
49 cERROR(1, "%s: Can't generate signature\n", __func__);
50 return -1;
51 }
52
53 rc = crypto_shash_init(&server->secmech.sdescmd5->shash);
54 if (rc) {
14cae324 55 cERROR(1, "%s: Could not init md5\n", __func__);
307fbd31
SP
56 return rc;
57 }
58
14cae324 59 rc = crypto_shash_update(&server->secmech.sdescmd5->shash,
307fbd31 60 server->session_key.response, server->session_key.len);
14cae324
SP
61 if (rc) {
62 cERROR(1, "%s: Could not update with response\n", __func__);
63 return rc;
64 }
307fbd31 65
14cae324 66 rc = crypto_shash_update(&server->secmech.sdescmd5->shash,
be8e3b00 67 cifs_pdu->Protocol, be32_to_cpu(cifs_pdu->smb_buf_length));
14cae324
SP
68 if (rc) {
69 cERROR(1, "%s: Could not update with payload\n", __func__);
70 return rc;
71 }
307fbd31
SP
72
73 rc = crypto_shash_final(&server->secmech.sdescmd5->shash, signature);
14cae324
SP
74 if (rc)
75 cERROR(1, "%s: Could not generate md5 hash\n", __func__);
b609f06a 76
14cae324 77 return rc;
1da177e4
LT
78}
79
a0f8b4fb 80/* must be called with server->srv_mutex held */
ffdd6e4d
SF
81int cifs_sign_smb(struct smb_hdr *cifs_pdu, struct TCP_Server_Info *server,
82 __u32 *pexpected_response_sequence_number)
1da177e4
LT
83{
84 int rc = 0;
85 char smb_signature[20];
86
ffdd6e4d 87 if ((cifs_pdu == NULL) || (server == NULL))
1da177e4
LT
88 return -EINVAL;
89
998d6fcb
JL
90 if (!(cifs_pdu->Flags2 & SMBFLG2_SECURITY_SIGNATURE) ||
91 server->tcpStatus == CifsNeedNegotiate)
1da177e4
LT
92 return rc;
93
998d6fcb
JL
94 if (!server->session_estab) {
95 strncpy(cifs_pdu->Signature.SecuritySignature, "BSRSPYL", 8);
96 return rc;
97 }
98
50c2f753
SF
99 cifs_pdu->Signature.Sequence.SequenceNumber =
100 cpu_to_le32(server->sequence_number);
1da177e4 101 cifs_pdu->Signature.Sequence.Reserved = 0;
50c2f753 102
ad009ac9
SF
103 *pexpected_response_sequence_number = server->sequence_number++;
104 server->sequence_number++;
1da177e4 105
21e73393 106 rc = cifs_calculate_signature(cifs_pdu, server, smb_signature);
ffdd6e4d 107 if (rc)
1da177e4
LT
108 memset(cifs_pdu->Signature.SecuritySignature, 0, 8);
109 else
110 memcpy(cifs_pdu->Signature.SecuritySignature, smb_signature, 8);
111
112 return rc;
113}
114
ffdd6e4d 115static int cifs_calc_signature2(const struct kvec *iov, int n_vec,
21e73393 116 struct TCP_Server_Info *server, char *signature)
84afc29b 117{
e9917a00 118 int i;
307fbd31 119 int rc;
84afc29b 120
21e73393 121 if (iov == NULL || signature == NULL || server == NULL)
e9917a00 122 return -EINVAL;
84afc29b 123
307fbd31
SP
124 if (!server->secmech.sdescmd5) {
125 cERROR(1, "%s: Can't generate signature\n", __func__);
126 return -1;
127 }
128
129 rc = crypto_shash_init(&server->secmech.sdescmd5->shash);
130 if (rc) {
14cae324 131 cERROR(1, "%s: Could not init md5\n", __func__);
307fbd31
SP
132 return rc;
133 }
134
14cae324 135 rc = crypto_shash_update(&server->secmech.sdescmd5->shash,
307fbd31 136 server->session_key.response, server->session_key.len);
14cae324
SP
137 if (rc) {
138 cERROR(1, "%s: Could not update with response\n", __func__);
139 return rc;
140 }
307fbd31 141
50c2f753 142 for (i = 0; i < n_vec; i++) {
745542e2
JL
143 if (iov[i].iov_len == 0)
144 continue;
ffdd6e4d 145 if (iov[i].iov_base == NULL) {
56234e27 146 cERROR(1, "null iovec entry");
e9917a00 147 return -EIO;
745542e2 148 }
ffdd6e4d 149 /* The first entry includes a length field (which does not get
e9917a00 150 signed that occupies the first 4 bytes before the header */
ffdd6e4d 151 if (i == 0) {
63d2583f 152 if (iov[0].iov_len <= 8) /* cmd field at offset 9 */
e9917a00 153 break; /* nothing to sign or corrupt header */
14cae324 154 rc =
307fbd31
SP
155 crypto_shash_update(&server->secmech.sdescmd5->shash,
156 iov[i].iov_base + 4, iov[i].iov_len - 4);
14cae324
SP
157 } else {
158 rc =
307fbd31
SP
159 crypto_shash_update(&server->secmech.sdescmd5->shash,
160 iov[i].iov_base, iov[i].iov_len);
14cae324
SP
161 }
162 if (rc) {
163 cERROR(1, "%s: Could not update with payload\n",
164 __func__);
165 return rc;
166 }
e9917a00 167 }
84afc29b 168
307fbd31 169 rc = crypto_shash_final(&server->secmech.sdescmd5->shash, signature);
14cae324
SP
170 if (rc)
171 cERROR(1, "%s: Could not generate md5 hash\n", __func__);
84afc29b 172
307fbd31 173 return rc;
84afc29b
SF
174}
175
a0f8b4fb 176/* must be called with server->srv_mutex held */
ffdd6e4d 177int cifs_sign_smb2(struct kvec *iov, int n_vec, struct TCP_Server_Info *server,
63d2583f 178 __u32 *pexpected_response_sequence_number)
84afc29b
SF
179{
180 int rc = 0;
181 char smb_signature[20];
ffdd6e4d 182 struct smb_hdr *cifs_pdu = iov[0].iov_base;
84afc29b 183
ffdd6e4d 184 if ((cifs_pdu == NULL) || (server == NULL))
84afc29b
SF
185 return -EINVAL;
186
998d6fcb
JL
187 if (!(cifs_pdu->Flags2 & SMBFLG2_SECURITY_SIGNATURE) ||
188 server->tcpStatus == CifsNeedNegotiate)
84afc29b
SF
189 return rc;
190
998d6fcb
JL
191 if (!server->session_estab) {
192 strncpy(cifs_pdu->Signature.SecuritySignature, "BSRSPYL", 8);
193 return rc;
194 }
195
ffdd6e4d 196 cifs_pdu->Signature.Sequence.SequenceNumber =
84afc29b 197 cpu_to_le32(server->sequence_number);
ffdd6e4d 198 cifs_pdu->Signature.Sequence.Reserved = 0;
84afc29b 199
ffdd6e4d
SF
200 *pexpected_response_sequence_number = server->sequence_number++;
201 server->sequence_number++;
84afc29b 202
21e73393 203 rc = cifs_calc_signature2(iov, n_vec, server, smb_signature);
ffdd6e4d
SF
204 if (rc)
205 memset(cifs_pdu->Signature.SecuritySignature, 0, 8);
206 else
207 memcpy(cifs_pdu->Signature.SecuritySignature, smb_signature, 8);
84afc29b 208
ffdd6e4d 209 return rc;
84afc29b
SF
210}
211
b609f06a 212int cifs_verify_signature(struct smb_hdr *cifs_pdu,
21e73393 213 struct TCP_Server_Info *server,
ffdd6e4d 214 __u32 expected_sequence_number)
1da177e4 215{
c8e56f1f 216 unsigned int rc;
1da177e4
LT
217 char server_response_sig[8];
218 char what_we_think_sig_should_be[20];
219
21e73393 220 if (cifs_pdu == NULL || server == NULL)
1da177e4
LT
221 return -EINVAL;
222
9c4843ea 223 if (!server->session_estab)
1da177e4
LT
224 return 0;
225
226 if (cifs_pdu->Command == SMB_COM_LOCKING_ANDX) {
50c2f753 227 struct smb_com_lock_req *pSMB =
ffdd6e4d
SF
228 (struct smb_com_lock_req *)cifs_pdu;
229 if (pSMB->LockType & LOCKING_ANDX_OPLOCK_RELEASE)
1da177e4
LT
230 return 0;
231 }
232
50c2f753
SF
233 /* BB what if signatures are supposed to be on for session but
234 server does not send one? BB */
235
1da177e4 236 /* Do not need to verify session setups with signature "BSRSPYL " */
50c2f753 237 if (memcmp(cifs_pdu->Signature.SecuritySignature, "BSRSPYL ", 8) == 0)
b6b38f70
JP
238 cFYI(1, "dummy signature received for smb command 0x%x",
239 cifs_pdu->Command);
1da177e4
LT
240
241 /* save off the origiginal signature so we can modify the smb and check
242 its signature against what the server sent */
50c2f753 243 memcpy(server_response_sig, cifs_pdu->Signature.SecuritySignature, 8);
1da177e4 244
50c2f753
SF
245 cifs_pdu->Signature.Sequence.SequenceNumber =
246 cpu_to_le32(expected_sequence_number);
1da177e4
LT
247 cifs_pdu->Signature.Sequence.Reserved = 0;
248
157c2491 249 mutex_lock(&server->srv_mutex);
21e73393 250 rc = cifs_calculate_signature(cifs_pdu, server,
1da177e4 251 what_we_think_sig_should_be);
157c2491 252 mutex_unlock(&server->srv_mutex);
1da177e4 253
50c2f753 254 if (rc)
1da177e4
LT
255 return rc;
256
50c2f753
SF
257/* cifs_dump_mem("what we think it should be: ",
258 what_we_think_sig_should_be, 16); */
1da177e4 259
50c2f753 260 if (memcmp(server_response_sig, what_we_think_sig_should_be, 8))
1da177e4
LT
261 return -EACCES;
262 else
263 return 0;
264
265}
266
21e73393 267/* first calculate 24 bytes ntlm response and then 16 byte session key */
96daf2b0 268int setup_ntlm_response(struct cifs_ses *ses)
1da177e4 269{
ee2c9258 270 int rc = 0;
21e73393
SP
271 unsigned int temp_len = CIFS_SESS_KEY_SIZE + CIFS_AUTH_RESP_SIZE;
272 char temp_key[CIFS_SESS_KEY_SIZE];
273
274 if (!ses)
1da177e4
LT
275 return -EINVAL;
276
21e73393
SP
277 ses->auth_key.response = kmalloc(temp_len, GFP_KERNEL);
278 if (!ses->auth_key.response) {
279 cERROR(1, "NTLM can't allocate (%u bytes) memory", temp_len);
280 return -ENOMEM;
281 }
282 ses->auth_key.len = temp_len;
283
ee2c9258 284 rc = SMBNTencrypt(ses->password, ses->server->cryptkey,
21e73393 285 ses->auth_key.response + CIFS_SESS_KEY_SIZE);
ee2c9258
SP
286 if (rc) {
287 cFYI(1, "%s Can't generate NTLM response, error: %d",
288 __func__, rc);
289 return rc;
290 }
291
292 rc = E_md4hash(ses->password, temp_key);
293 if (rc) {
294 cFYI(1, "%s Can't generate NT hash, error: %d", __func__, rc);
295 return rc;
296 }
21e73393 297
ee2c9258
SP
298 rc = mdfour(ses->auth_key.response, temp_key, CIFS_SESS_KEY_SIZE);
299 if (rc)
300 cFYI(1, "%s Can't generate NTLM session key, error: %d",
301 __func__, rc);
21e73393 302
ee2c9258 303 return rc;
1da177e4
LT
304}
305
7c7b25bc 306#ifdef CONFIG_CIFS_WEAK_PW_HASH
43988d76 307int calc_lanman_hash(const char *password, const char *cryptkey, bool encrypt,
4e53a3fb 308 char *lnm_session_key)
7c7b25bc
SF
309{
310 int i;
43988d76 311 int rc;
7c7b25bc
SF
312 char password_with_pad[CIFS_ENCPWD_SIZE];
313
314 memset(password_with_pad, 0, CIFS_ENCPWD_SIZE);
4e53a3fb
JL
315 if (password)
316 strncpy(password_with_pad, password, CIFS_ENCPWD_SIZE);
317
04912d6a 318 if (!encrypt && global_secflags & CIFSSEC_MAY_PLNTXT) {
4e53a3fb
JL
319 memset(lnm_session_key, 0, CIFS_SESS_KEY_SIZE);
320 memcpy(lnm_session_key, password_with_pad,
321 CIFS_ENCPWD_SIZE);
43988d76 322 return 0;
4e53a3fb 323 }
bdc4bf6e 324
7c7b25bc
SF
325 /* calculate old style session key */
326 /* calling toupper is less broken than repeatedly
327 calling nls_toupper would be since that will never
328 work for UTF8, but neither handles multibyte code pages
329 but the only alternative would be converting to UCS-16 (Unicode)
330 (using a routine something like UniStrupr) then
331 uppercasing and then converting back from Unicode - which
332 would only worth doing it if we knew it were utf8. Basically
333 utf8 and other multibyte codepages each need their own strupper
334 function since a byte at a time will ont work. */
335
ef571cad 336 for (i = 0; i < CIFS_ENCPWD_SIZE; i++)
7c7b25bc 337 password_with_pad[i] = toupper(password_with_pad[i]);
7c7b25bc 338
43988d76 339 rc = SMBencrypt(password_with_pad, cryptkey, lnm_session_key);
4e53a3fb 340
43988d76 341 return rc;
7c7b25bc
SF
342}
343#endif /* CIFS_WEAK_PW_HASH */
344
9daa42e2
SP
345/* Build a proper attribute value/target info pairs blob.
346 * Fill in netbios and dns domain name and workstation name
347 * and client time (total five av pairs and + one end of fields indicator.
348 * Allocate domain name which gets freed when session struct is deallocated.
2b149f11
SP
349 */
350static int
96daf2b0 351build_avpair_blob(struct cifs_ses *ses, const struct nls_table *nls_cp)
2b149f11 352{
9daa42e2
SP
353 unsigned int dlen;
354 unsigned int wlen;
355 unsigned int size = 6 * sizeof(struct ntlmssp2_name);
356 __le64 curtime;
357 char *defdmname = "WORKGROUP";
358 unsigned char *blobptr;
2b149f11
SP
359 struct ntlmssp2_name *attrptr;
360
9daa42e2
SP
361 if (!ses->domainName) {
362 ses->domainName = kstrdup(defdmname, GFP_KERNEL);
363 if (!ses->domainName)
364 return -ENOMEM;
365 }
366
367 dlen = strlen(ses->domainName);
368 wlen = strlen(ses->server->hostname);
369
370 /* The length of this blob is a size which is
371 * six times the size of a structure which holds name/size +
372 * two times the unicode length of a domain name +
373 * two times the unicode length of a server name +
374 * size of a timestamp (which is 8 bytes).
375 */
d3686d54
SP
376 ses->auth_key.len = size + 2 * (2 * dlen) + 2 * (2 * wlen) + 8;
377 ses->auth_key.response = kzalloc(ses->auth_key.len, GFP_KERNEL);
378 if (!ses->auth_key.response) {
379 ses->auth_key.len = 0;
2b149f11
SP
380 cERROR(1, "Challenge target info allocation failure");
381 return -ENOMEM;
382 }
9daa42e2 383
d3686d54 384 blobptr = ses->auth_key.response;
9daa42e2
SP
385 attrptr = (struct ntlmssp2_name *) blobptr;
386
387 attrptr->type = cpu_to_le16(NTLMSSP_AV_NB_DOMAIN_NAME);
388 attrptr->length = cpu_to_le16(2 * dlen);
389 blobptr = (unsigned char *)attrptr + sizeof(struct ntlmssp2_name);
390 cifs_strtoUCS((__le16 *)blobptr, ses->domainName, dlen, nls_cp);
391
392 blobptr += 2 * dlen;
393 attrptr = (struct ntlmssp2_name *) blobptr;
394
395 attrptr->type = cpu_to_le16(NTLMSSP_AV_NB_COMPUTER_NAME);
396 attrptr->length = cpu_to_le16(2 * wlen);
397 blobptr = (unsigned char *)attrptr + sizeof(struct ntlmssp2_name);
398 cifs_strtoUCS((__le16 *)blobptr, ses->server->hostname, wlen, nls_cp);
399
400 blobptr += 2 * wlen;
401 attrptr = (struct ntlmssp2_name *) blobptr;
402
403 attrptr->type = cpu_to_le16(NTLMSSP_AV_DNS_DOMAIN_NAME);
404 attrptr->length = cpu_to_le16(2 * dlen);
405 blobptr = (unsigned char *)attrptr + sizeof(struct ntlmssp2_name);
406 cifs_strtoUCS((__le16 *)blobptr, ses->domainName, dlen, nls_cp);
407
408 blobptr += 2 * dlen;
409 attrptr = (struct ntlmssp2_name *) blobptr;
410
411 attrptr->type = cpu_to_le16(NTLMSSP_AV_DNS_COMPUTER_NAME);
412 attrptr->length = cpu_to_le16(2 * wlen);
413 blobptr = (unsigned char *)attrptr + sizeof(struct ntlmssp2_name);
414 cifs_strtoUCS((__le16 *)blobptr, ses->server->hostname, wlen, nls_cp);
415
416 blobptr += 2 * wlen;
417 attrptr = (struct ntlmssp2_name *) blobptr;
418
419 attrptr->type = cpu_to_le16(NTLMSSP_AV_TIMESTAMP);
420 attrptr->length = cpu_to_le16(sizeof(__le64));
421 blobptr = (unsigned char *)attrptr + sizeof(struct ntlmssp2_name);
422 curtime = cpu_to_le64(cifs_UnixTimeToNT(CURRENT_TIME));
423 memcpy(blobptr, &curtime, sizeof(__le64));
2b149f11
SP
424
425 return 0;
426}
427
428/* Server has provided av pairs/target info in the type 2 challenge
429 * packet and we have plucked it and stored within smb session.
430 * We parse that blob here to find netbios domain name to be used
431 * as part of ntlmv2 authentication (in Target String), if not already
432 * specified on the command line.
433 * If this function returns without any error but without fetching
434 * domain name, authentication may fail against some server but
435 * may not fail against other (those who are not very particular
436 * about target string i.e. for some, just user name might suffice.
437 */
438static int
96daf2b0 439find_domain_name(struct cifs_ses *ses, const struct nls_table *nls_cp)
2b149f11
SP
440{
441 unsigned int attrsize;
442 unsigned int type;
443 unsigned int onesize = sizeof(struct ntlmssp2_name);
444 unsigned char *blobptr;
445 unsigned char *blobend;
446 struct ntlmssp2_name *attrptr;
447
d3686d54 448 if (!ses->auth_key.len || !ses->auth_key.response)
2b149f11
SP
449 return 0;
450
d3686d54
SP
451 blobptr = ses->auth_key.response;
452 blobend = blobptr + ses->auth_key.len;
2b149f11
SP
453
454 while (blobptr + onesize < blobend) {
455 attrptr = (struct ntlmssp2_name *) blobptr;
456 type = le16_to_cpu(attrptr->type);
457 if (type == NTLMSSP_AV_EOL)
458 break;
459 blobptr += 2; /* advance attr type */
460 attrsize = le16_to_cpu(attrptr->length);
461 blobptr += 2; /* advance attr size */
462 if (blobptr + attrsize > blobend)
463 break;
464 if (type == NTLMSSP_AV_NB_DOMAIN_NAME) {
465 if (!attrsize)
466 break;
467 if (!ses->domainName) {
468 ses->domainName =
469 kmalloc(attrsize + 1, GFP_KERNEL);
470 if (!ses->domainName)
471 return -ENOMEM;
472 cifs_from_ucs2(ses->domainName,
473 (__le16 *)blobptr, attrsize, attrsize,
f7c5445a 474 nls_cp, false);
2b149f11
SP
475 break;
476 }
477 }
478 blobptr += attrsize; /* advance attr value */
479 }
480
481 return 0;
482}
483
96daf2b0 484static int calc_ntlmv2_hash(struct cifs_ses *ses, char *ntlmv2_hash,
50c2f753 485 const struct nls_table *nls_cp)
a8ee0344
SF
486{
487 int rc = 0;
488 int len;
307fbd31 489 char nt_hash[CIFS_NTHASH_SIZE];
50c2f753
SF
490 wchar_t *user;
491 wchar_t *domain;
307fbd31 492 wchar_t *server;
a8ee0344 493
307fbd31
SP
494 if (!ses->server->secmech.sdeschmacmd5) {
495 cERROR(1, "calc_ntlmv2_hash: can't generate ntlmv2 hash\n");
496 return -1;
497 }
56234e27 498
c8e56f1f
SF
499 /* calculate md4 hash of password */
500 E_md4hash(ses->password, nt_hash);
9fbc5908 501
14cae324 502 rc = crypto_shash_setkey(ses->server->secmech.hmacmd5, nt_hash,
307fbd31 503 CIFS_NTHASH_SIZE);
14cae324
SP
504 if (rc) {
505 cERROR(1, "%s: Could not set NT Hash as a key", __func__);
506 return rc;
507 }
307fbd31
SP
508
509 rc = crypto_shash_init(&ses->server->secmech.sdeschmacmd5->shash);
510 if (rc) {
511 cERROR(1, "calc_ntlmv2_hash: could not init hmacmd5\n");
512 return rc;
513 }
a8ee0344 514
8727c8a8
SF
515 /* convert ses->user_name to unicode and uppercase */
516 len = strlen(ses->user_name);
1717ffc5 517 user = kmalloc(2 + (len * 2), GFP_KERNEL);
307fbd31
SP
518 if (user == NULL) {
519 cERROR(1, "calc_ntlmv2_hash: user mem alloc failure\n");
520 rc = -ENOMEM;
14cae324 521 return rc;
307fbd31 522 }
8727c8a8 523 len = cifs_strtoUCS((__le16 *)user, ses->user_name, len, nls_cp);
1717ffc5 524 UniStrupr(user);
307fbd31 525
14cae324 526 rc = crypto_shash_update(&ses->server->secmech.sdeschmacmd5->shash,
307fbd31 527 (char *)user, 2 * len);
14cae324
SP
528 kfree(user);
529 if (rc) {
530 cERROR(1, "%s: Could not update with user\n", __func__);
531 return rc;
532 }
a8ee0344
SF
533
534 /* convert ses->domainName to unicode and uppercase */
50c2f753 535 if (ses->domainName) {
1717ffc5 536 len = strlen(ses->domainName);
a8ee0344 537
50c2f753 538 domain = kmalloc(2 + (len * 2), GFP_KERNEL);
307fbd31
SP
539 if (domain == NULL) {
540 cERROR(1, "calc_ntlmv2_hash: domain mem alloc failure");
541 rc = -ENOMEM;
14cae324 542 return rc;
307fbd31 543 }
8f2376ad
CG
544 len = cifs_strtoUCS((__le16 *)domain, ses->domainName, len,
545 nls_cp);
14cae324 546 rc =
307fbd31
SP
547 crypto_shash_update(&ses->server->secmech.sdeschmacmd5->shash,
548 (char *)domain, 2 * len);
1717ffc5 549 kfree(domain);
14cae324
SP
550 if (rc) {
551 cERROR(1, "%s: Could not update with domain\n",
552 __func__);
553 return rc;
554 }
307fbd31
SP
555 } else if (ses->serverName) {
556 len = strlen(ses->serverName);
557
558 server = kmalloc(2 + (len * 2), GFP_KERNEL);
559 if (server == NULL) {
560 cERROR(1, "calc_ntlmv2_hash: server mem alloc failure");
561 rc = -ENOMEM;
14cae324 562 return rc;
307fbd31
SP
563 }
564 len = cifs_strtoUCS((__le16 *)server, ses->serverName, len,
565 nls_cp);
14cae324 566 rc =
307fbd31
SP
567 crypto_shash_update(&ses->server->secmech.sdeschmacmd5->shash,
568 (char *)server, 2 * len);
569 kfree(server);
14cae324
SP
570 if (rc) {
571 cERROR(1, "%s: Could not update with server\n",
572 __func__);
573 return rc;
574 }
1717ffc5 575 }
307fbd31
SP
576
577 rc = crypto_shash_final(&ses->server->secmech.sdeschmacmd5->shash,
d3686d54 578 ntlmv2_hash);
14cae324
SP
579 if (rc)
580 cERROR(1, "%s: Could not generate md5 hash\n", __func__);
307fbd31 581
307fbd31
SP
582 return rc;
583}
584
585static int
96daf2b0 586CalcNTLMv2_response(const struct cifs_ses *ses, char *ntlmv2_hash)
307fbd31
SP
587{
588 int rc;
589 unsigned int offset = CIFS_SESS_KEY_SIZE + 8;
590
591 if (!ses->server->secmech.sdeschmacmd5) {
592 cERROR(1, "calc_ntlmv2_hash: can't generate ntlmv2 hash\n");
593 return -1;
594 }
595
14cae324 596 rc = crypto_shash_setkey(ses->server->secmech.hmacmd5,
d3686d54 597 ntlmv2_hash, CIFS_HMAC_MD5_HASH_SIZE);
14cae324
SP
598 if (rc) {
599 cERROR(1, "%s: Could not set NTLMV2 Hash as a key", __func__);
600 return rc;
601 }
307fbd31
SP
602
603 rc = crypto_shash_init(&ses->server->secmech.sdeschmacmd5->shash);
604 if (rc) {
605 cERROR(1, "CalcNTLMv2_response: could not init hmacmd5");
606 return rc;
607 }
608
d3ba50b1
SP
609 if (ses->server->secType == RawNTLMSSP)
610 memcpy(ses->auth_key.response + offset,
d3686d54 611 ses->ntlmssp->cryptkey, CIFS_SERVER_CHALLENGE_SIZE);
d3ba50b1
SP
612 else
613 memcpy(ses->auth_key.response + offset,
614 ses->server->cryptkey, CIFS_SERVER_CHALLENGE_SIZE);
14cae324 615 rc = crypto_shash_update(&ses->server->secmech.sdeschmacmd5->shash,
307fbd31 616 ses->auth_key.response + offset, ses->auth_key.len - offset);
14cae324
SP
617 if (rc) {
618 cERROR(1, "%s: Could not update with response\n", __func__);
619 return rc;
620 }
307fbd31
SP
621
622 rc = crypto_shash_final(&ses->server->secmech.sdeschmacmd5->shash,
623 ses->auth_key.response + CIFS_SESS_KEY_SIZE);
14cae324
SP
624 if (rc)
625 cERROR(1, "%s: Could not generate md5 hash\n", __func__);
9fbc5908
SF
626
627 return rc;
628}
629
307fbd31 630
2b149f11 631int
96daf2b0 632setup_ntlmv2_rsp(struct cifs_ses *ses, const struct nls_table *nls_cp)
9fbc5908 633{
c8e56f1f 634 int rc;
21e73393 635 int baselen;
d3686d54 636 unsigned int tilen;
21e73393 637 struct ntlmv2_resp *buf;
d3686d54
SP
638 char ntlmv2_hash[16];
639 unsigned char *tiblob = NULL; /* target info blob */
6d027cfd 640
2b149f11
SP
641 if (ses->server->secType == RawNTLMSSP) {
642 if (!ses->domainName) {
f7c5445a 643 rc = find_domain_name(ses, nls_cp);
2b149f11
SP
644 if (rc) {
645 cERROR(1, "error %d finding domain name", rc);
646 goto setup_ntlmv2_rsp_ret;
647 }
648 }
649 } else {
9daa42e2 650 rc = build_avpair_blob(ses, nls_cp);
2b149f11
SP
651 if (rc) {
652 cERROR(1, "error %d building av pair blob", rc);
d3686d54 653 goto setup_ntlmv2_rsp_ret;
2b149f11
SP
654 }
655 }
a8ee0344 656
21e73393 657 baselen = CIFS_SESS_KEY_SIZE + sizeof(struct ntlmv2_resp);
d3686d54
SP
658 tilen = ses->auth_key.len;
659 tiblob = ses->auth_key.response;
660
661 ses->auth_key.response = kmalloc(baselen + tilen, GFP_KERNEL);
21e73393
SP
662 if (!ses->auth_key.response) {
663 rc = ENOMEM;
d3686d54 664 ses->auth_key.len = 0;
21e73393
SP
665 cERROR(1, "%s: Can't allocate auth blob", __func__);
666 goto setup_ntlmv2_rsp_ret;
667 }
d3686d54 668 ses->auth_key.len += baselen;
21e73393
SP
669
670 buf = (struct ntlmv2_resp *)
671 (ses->auth_key.response + CIFS_SESS_KEY_SIZE);
672 buf->blob_signature = cpu_to_le32(0x00000101);
673 buf->reserved = 0;
674 buf->time = cpu_to_le64(cifs_UnixTimeToNT(CURRENT_TIME));
675 get_random_bytes(&buf->client_chal, sizeof(buf->client_chal));
676 buf->reserved2 = 0;
677
d3686d54 678 memcpy(ses->auth_key.response + baselen, tiblob, tilen);
21e73393 679
f7c5445a 680 /* calculate ntlmv2_hash */
d3686d54 681 rc = calc_ntlmv2_hash(ses, ntlmv2_hash, nls_cp);
2b149f11 682 if (rc) {
b6b38f70 683 cERROR(1, "could not get v2 hash rc %d", rc);
2b149f11
SP
684 goto setup_ntlmv2_rsp_ret;
685 }
f7c5445a
SP
686
687 /* calculate first part of the client response (CR1) */
d3686d54 688 rc = CalcNTLMv2_response(ses, ntlmv2_hash);
307fbd31
SP
689 if (rc) {
690 cERROR(1, "Could not calculate CR1 rc: %d", rc);
691 goto setup_ntlmv2_rsp_ret;
692 }
b609f06a 693
5d0d2882 694 /* now calculate the session key for NTLMv2 */
14cae324 695 rc = crypto_shash_setkey(ses->server->secmech.hmacmd5,
d3686d54 696 ntlmv2_hash, CIFS_HMAC_MD5_HASH_SIZE);
14cae324
SP
697 if (rc) {
698 cERROR(1, "%s: Could not set NTLMV2 Hash as a key", __func__);
699 goto setup_ntlmv2_rsp_ret;
700 }
307fbd31
SP
701
702 rc = crypto_shash_init(&ses->server->secmech.sdeschmacmd5->shash);
703 if (rc) {
704 cERROR(1, "%s: Could not init hmacmd5\n", __func__);
705 goto setup_ntlmv2_rsp_ret;
706 }
707
14cae324 708 rc = crypto_shash_update(&ses->server->secmech.sdeschmacmd5->shash,
307fbd31
SP
709 ses->auth_key.response + CIFS_SESS_KEY_SIZE,
710 CIFS_HMAC_MD5_HASH_SIZE);
14cae324
SP
711 if (rc) {
712 cERROR(1, "%s: Could not update with response\n", __func__);
713 goto setup_ntlmv2_rsp_ret;
714 }
307fbd31
SP
715
716 rc = crypto_shash_final(&ses->server->secmech.sdeschmacmd5->shash,
717 ses->auth_key.response);
14cae324
SP
718 if (rc)
719 cERROR(1, "%s: Could not generate md5 hash\n", __func__);
2b149f11 720
2b149f11 721setup_ntlmv2_rsp_ret:
d3686d54 722 kfree(tiblob);
2b149f11
SP
723
724 return rc;
6d027cfd
SF
725}
726
d2b91521 727int
96daf2b0 728calc_seckey(struct cifs_ses *ses)
d2b91521
SP
729{
730 int rc;
731 struct crypto_blkcipher *tfm_arc4;
732 struct scatterlist sgin, sgout;
733 struct blkcipher_desc desc;
734 unsigned char sec_key[CIFS_SESS_KEY_SIZE]; /* a nonce */
735
736 get_random_bytes(sec_key, CIFS_SESS_KEY_SIZE);
737
738 tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC);
7a8587e7
SP
739 if (IS_ERR(tfm_arc4)) {
740 rc = PTR_ERR(tfm_arc4);
d2b91521 741 cERROR(1, "could not allocate crypto API arc4\n");
7a8587e7 742 return rc;
d2b91521
SP
743 }
744
745 desc.tfm = tfm_arc4;
746
14cae324 747 rc = crypto_blkcipher_setkey(tfm_arc4, ses->auth_key.response,
d2b91521 748 CIFS_SESS_KEY_SIZE);
14cae324
SP
749 if (rc) {
750 cERROR(1, "%s: Could not set response as a key", __func__);
751 return rc;
752 }
d2b91521
SP
753
754 sg_init_one(&sgin, sec_key, CIFS_SESS_KEY_SIZE);
d3686d54 755 sg_init_one(&sgout, ses->ntlmssp->ciphertext, CIFS_CPHTXT_SIZE);
d2b91521
SP
756
757 rc = crypto_blkcipher_encrypt(&desc, &sgout, &sgin, CIFS_CPHTXT_SIZE);
758 if (rc) {
759 cERROR(1, "could not encrypt session key rc: %d\n", rc);
760 crypto_free_blkcipher(tfm_arc4);
761 return rc;
762 }
763
764 /* make secondary_key/nonce as session key */
765 memcpy(ses->auth_key.response, sec_key, CIFS_SESS_KEY_SIZE);
766 /* and make len as that of session key only */
767 ses->auth_key.len = CIFS_SESS_KEY_SIZE;
768
769 crypto_free_blkcipher(tfm_arc4);
770
14cae324 771 return rc;
d2b91521
SP
772}
773
774void
775cifs_crypto_shash_release(struct TCP_Server_Info *server)
776{
777 if (server->secmech.md5)
778 crypto_free_shash(server->secmech.md5);
779
780 if (server->secmech.hmacmd5)
781 crypto_free_shash(server->secmech.hmacmd5);
782
783 kfree(server->secmech.sdeschmacmd5);
784
785 kfree(server->secmech.sdescmd5);
786}
787
788int
789cifs_crypto_shash_allocate(struct TCP_Server_Info *server)
790{
791 int rc;
792 unsigned int size;
793
794 server->secmech.hmacmd5 = crypto_alloc_shash("hmac(md5)", 0, 0);
ee2c9258 795 if (IS_ERR(server->secmech.hmacmd5)) {
d2b91521
SP
796 cERROR(1, "could not allocate crypto hmacmd5\n");
797 return PTR_ERR(server->secmech.hmacmd5);
798 }
799
800 server->secmech.md5 = crypto_alloc_shash("md5", 0, 0);
ee2c9258 801 if (IS_ERR(server->secmech.md5)) {
d2b91521
SP
802 cERROR(1, "could not allocate crypto md5\n");
803 rc = PTR_ERR(server->secmech.md5);
804 goto crypto_allocate_md5_fail;
805 }
806
807 size = sizeof(struct shash_desc) +
808 crypto_shash_descsize(server->secmech.hmacmd5);
809 server->secmech.sdeschmacmd5 = kmalloc(size, GFP_KERNEL);
810 if (!server->secmech.sdeschmacmd5) {
811 cERROR(1, "cifs_crypto_shash_allocate: can't alloc hmacmd5\n");
812 rc = -ENOMEM;
813 goto crypto_allocate_hmacmd5_sdesc_fail;
814 }
815 server->secmech.sdeschmacmd5->shash.tfm = server->secmech.hmacmd5;
816 server->secmech.sdeschmacmd5->shash.flags = 0x0;
817
818
819 size = sizeof(struct shash_desc) +
820 crypto_shash_descsize(server->secmech.md5);
821 server->secmech.sdescmd5 = kmalloc(size, GFP_KERNEL);
822 if (!server->secmech.sdescmd5) {
823 cERROR(1, "cifs_crypto_shash_allocate: can't alloc md5\n");
824 rc = -ENOMEM;
825 goto crypto_allocate_md5_sdesc_fail;
826 }
827 server->secmech.sdescmd5->shash.tfm = server->secmech.md5;
828 server->secmech.sdescmd5->shash.flags = 0x0;
829
830 return 0;
831
832crypto_allocate_md5_sdesc_fail:
833 kfree(server->secmech.sdeschmacmd5);
834
835crypto_allocate_hmacmd5_sdesc_fail:
836 crypto_free_shash(server->secmech.md5);
837
838crypto_allocate_md5_fail:
839 crypto_free_shash(server->secmech.hmacmd5);
840
841 return rc;
842}