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