]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blame - fs/cifs/sess.c
Revert "Eliminate sparse warning - bad constant expression"
[mirror_ubuntu-zesty-kernel.git] / fs / cifs / sess.c
CommitLineData
3979877e
SF
1/*
2 * fs/cifs/sess.c
3 *
4 * SMB/CIFS session setup handling routines
5 *
d185cda7 6 * Copyright (c) International Business Machines Corp., 2006, 2009
3979877e
SF
7 * Author(s): Steve French (sfrench@us.ibm.com)
8 *
9 * This library is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU Lesser General Public License as published
11 * by the Free Software Foundation; either version 2.1 of the License, or
12 * (at your option) any later version.
13 *
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
17 * the GNU Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public License
20 * along with this library; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 */
23
24#include "cifspdu.h"
25#include "cifsglob.h"
26#include "cifsproto.h"
27#include "cifs_unicode.h"
28#include "cifs_debug.h"
29#include "ntlmssp.h"
30#include "nterr.h"
9c53588e 31#include <linux/utsname.h>
5a0e3ad6 32#include <linux/slab.h>
2442421b 33#include "cifs_spnego.h"
3979877e 34
3979877e 35extern void SMBNTencrypt(unsigned char *passwd, unsigned char *c8,
790fe579 36 unsigned char *p24);
3979877e 37
ebe6aa5a
JL
38/*
39 * Checks if this is the first smb session to be reconnected after
40 * the socket has been reestablished (so we know whether to use vc 0).
41 * Called while holding the cifs_tcp_ses_lock, so do not block
42 */
eca6acf9
SF
43static bool is_first_ses_reconnect(struct cifsSesInfo *ses)
44{
45 struct list_head *tmp;
46 struct cifsSesInfo *tmp_ses;
47
48 list_for_each(tmp, &ses->server->smb_ses_list) {
49 tmp_ses = list_entry(tmp, struct cifsSesInfo,
50 smb_ses_list);
51 if (tmp_ses->need_reconnect == false)
52 return false;
53 }
54 /* could not find a session that was already connected,
55 this must be the first one we are reconnecting */
56 return true;
57}
58
59/*
60 * vc number 0 is treated specially by some servers, and should be the
61 * first one we request. After that we can use vcnumbers up to maxvcs,
62 * one for each smb session (some Windows versions set maxvcs incorrectly
63 * so maxvc=1 can be ignored). If we have too many vcs, we can reuse
64 * any vc but zero (some servers reset the connection on vcnum zero)
65 *
66 */
67static __le16 get_next_vcnum(struct cifsSesInfo *ses)
68{
69 __u16 vcnum = 0;
70 struct list_head *tmp;
71 struct cifsSesInfo *tmp_ses;
72 __u16 max_vcs = ses->server->max_vcs;
73 __u16 i;
74 int free_vc_found = 0;
75
76 /* Quoting the MS-SMB specification: "Windows-based SMB servers set this
77 field to one but do not enforce this limit, which allows an SMB client
78 to establish more virtual circuits than allowed by this value ... but
79 other server implementations can enforce this limit." */
80 if (max_vcs < 2)
81 max_vcs = 0xFFFF;
82
83 write_lock(&cifs_tcp_ses_lock);
84 if ((ses->need_reconnect) && is_first_ses_reconnect(ses))
85 goto get_vc_num_exit; /* vcnum will be zero */
86 for (i = ses->server->srv_count - 1; i < max_vcs; i++) {
87 if (i == 0) /* this is the only connection, use vc 0 */
88 break;
89
90 free_vc_found = 1;
91
92 list_for_each(tmp, &ses->server->smb_ses_list) {
93 tmp_ses = list_entry(tmp, struct cifsSesInfo,
94 smb_ses_list);
95 if (tmp_ses->vcnum == i) {
96 free_vc_found = 0;
97 break; /* found duplicate, try next vcnum */
98 }
99 }
100 if (free_vc_found)
101 break; /* we found a vcnumber that will work - use it */
102 }
103
104 if (i == 0)
105 vcnum = 0; /* for most common case, ie if one smb session, use
106 vc zero. Also for case when no free vcnum, zero
107 is safest to send (some clients only send zero) */
108 else if (free_vc_found == 0)
109 vcnum = 1; /* we can not reuse vc=0 safely, since some servers
110 reset all uids on that, but 1 is ok. */
111 else
112 vcnum = i;
113 ses->vcnum = vcnum;
114get_vc_num_exit:
115 write_unlock(&cifs_tcp_ses_lock);
116
051a2a0d 117 return cpu_to_le16(vcnum);
eca6acf9
SF
118}
119
3979877e
SF
120static __u32 cifs_ssetup_hdr(struct cifsSesInfo *ses, SESSION_SETUP_ANDX *pSMB)
121{
122 __u32 capabilities = 0;
123
124 /* init fields common to all four types of SessSetup */
eca6acf9
SF
125 /* Note that offsets for first seven fields in req struct are same */
126 /* in CIFS Specs so does not matter which of 3 forms of struct */
127 /* that we use in next few lines */
128 /* Note that header is initialized to zero in header_assemble */
3979877e
SF
129 pSMB->req.AndXCommand = 0xFF;
130 pSMB->req.MaxBufferSize = cpu_to_le16(ses->server->maxBuf);
131 pSMB->req.MaxMpxCount = cpu_to_le16(ses->server->maxReq);
eca6acf9 132 pSMB->req.VcNumber = get_next_vcnum(ses);
3979877e
SF
133
134 /* Now no need to set SMBFLG_CASELESS or obsolete CANONICAL PATH */
135
790fe579 136 /* BB verify whether signing required on neg or just on auth frame
3979877e
SF
137 (and NTLM case) */
138
139 capabilities = CAP_LARGE_FILES | CAP_NT_SMBS | CAP_LEVEL_II_OPLOCKS |
140 CAP_LARGE_WRITE_X | CAP_LARGE_READ_X;
141
790fe579
SF
142 if (ses->server->secMode &
143 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
3979877e
SF
144 pSMB->req.hdr.Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
145
146 if (ses->capabilities & CAP_UNICODE) {
147 pSMB->req.hdr.Flags2 |= SMBFLG2_UNICODE;
148 capabilities |= CAP_UNICODE;
149 }
150 if (ses->capabilities & CAP_STATUS32) {
151 pSMB->req.hdr.Flags2 |= SMBFLG2_ERR_STATUS;
152 capabilities |= CAP_STATUS32;
153 }
154 if (ses->capabilities & CAP_DFS) {
155 pSMB->req.hdr.Flags2 |= SMBFLG2_DFS;
156 capabilities |= CAP_DFS;
157 }
26f57364 158 if (ses->capabilities & CAP_UNIX)
3979877e 159 capabilities |= CAP_UNIX;
3979877e 160
3979877e
SF
161 return capabilities;
162}
163
0d3a01fa
JL
164static void
165unicode_oslm_strings(char **pbcc_area, const struct nls_table *nls_cp)
166{
167 char *bcc_ptr = *pbcc_area;
168 int bytes_ret = 0;
169
170 /* Copy OS version */
171 bytes_ret = cifs_strtoUCS((__le16 *)bcc_ptr, "Linux version ", 32,
172 nls_cp);
173 bcc_ptr += 2 * bytes_ret;
174 bytes_ret = cifs_strtoUCS((__le16 *) bcc_ptr, init_utsname()->release,
175 32, nls_cp);
176 bcc_ptr += 2 * bytes_ret;
177 bcc_ptr += 2; /* trailing null */
178
179 bytes_ret = cifs_strtoUCS((__le16 *) bcc_ptr, CIFS_NETWORK_OPSYS,
180 32, nls_cp);
181 bcc_ptr += 2 * bytes_ret;
182 bcc_ptr += 2; /* trailing null */
183
184 *pbcc_area = bcc_ptr;
185}
186
187static void unicode_domain_string(char **pbcc_area, struct cifsSesInfo *ses,
188 const struct nls_table *nls_cp)
189{
190 char *bcc_ptr = *pbcc_area;
191 int bytes_ret = 0;
192
193 /* copy domain */
194 if (ses->domainName == NULL) {
195 /* Sending null domain better than using a bogus domain name (as
196 we did briefly in 2.6.18) since server will use its default */
197 *bcc_ptr = 0;
198 *(bcc_ptr+1) = 0;
199 bytes_ret = 0;
200 } else
201 bytes_ret = cifs_strtoUCS((__le16 *) bcc_ptr, ses->domainName,
202 256, nls_cp);
203 bcc_ptr += 2 * bytes_ret;
204 bcc_ptr += 2; /* account for null terminator */
205
206 *pbcc_area = bcc_ptr;
207}
208
209
3870253e 210static void unicode_ssetup_strings(char **pbcc_area, struct cifsSesInfo *ses,
790fe579 211 const struct nls_table *nls_cp)
3979877e 212{
790fe579 213 char *bcc_ptr = *pbcc_area;
3979877e
SF
214 int bytes_ret = 0;
215
216 /* BB FIXME add check that strings total less
217 than 335 or will need to send them as arrays */
218
0223cf0b
SF
219 /* unicode strings, must be word aligned before the call */
220/* if ((long) bcc_ptr % 2) {
3979877e
SF
221 *bcc_ptr = 0;
222 bcc_ptr++;
0223cf0b 223 } */
3979877e 224 /* copy user */
790fe579 225 if (ses->userName == NULL) {
6e659c63
SF
226 /* null user mount */
227 *bcc_ptr = 0;
228 *(bcc_ptr+1) = 0;
301a6a31 229 } else {
3979877e 230 bytes_ret = cifs_strtoUCS((__le16 *) bcc_ptr, ses->userName,
301a6a31 231 MAX_USERNAME_SIZE, nls_cp);
3979877e
SF
232 }
233 bcc_ptr += 2 * bytes_ret;
234 bcc_ptr += 2; /* account for null termination */
3979877e 235
0d3a01fa
JL
236 unicode_domain_string(&bcc_ptr, ses, nls_cp);
237 unicode_oslm_strings(&bcc_ptr, nls_cp);
3979877e
SF
238
239 *pbcc_area = bcc_ptr;
240}
241
3870253e 242static void ascii_ssetup_strings(char **pbcc_area, struct cifsSesInfo *ses,
790fe579 243 const struct nls_table *nls_cp)
3979877e 244{
790fe579 245 char *bcc_ptr = *pbcc_area;
3979877e
SF
246
247 /* copy user */
248 /* BB what about null user mounts - check that we do this BB */
790fe579
SF
249 /* copy user */
250 if (ses->userName == NULL) {
251 /* BB what about null user mounts - check that we do this BB */
301a6a31
SF
252 } else {
253 strncpy(bcc_ptr, ses->userName, MAX_USERNAME_SIZE);
790fe579 254 }
301a6a31 255 bcc_ptr += strnlen(ses->userName, MAX_USERNAME_SIZE);
3979877e 256 *bcc_ptr = 0;
790fe579 257 bcc_ptr++; /* account for null termination */
3979877e 258
790fe579
SF
259 /* copy domain */
260
261 if (ses->domainName != NULL) {
262 strncpy(bcc_ptr, ses->domainName, 256);
3979877e 263 bcc_ptr += strnlen(ses->domainName, 256);
790fe579 264 } /* else we will send a null domain name
6e659c63 265 so the server will default to its own domain */
3979877e
SF
266 *bcc_ptr = 0;
267 bcc_ptr++;
268
269 /* BB check for overflow here */
270
271 strcpy(bcc_ptr, "Linux version ");
272 bcc_ptr += strlen("Linux version ");
96b644bd
SH
273 strcpy(bcc_ptr, init_utsname()->release);
274 bcc_ptr += strlen(init_utsname()->release) + 1;
3979877e
SF
275
276 strcpy(bcc_ptr, CIFS_NETWORK_OPSYS);
277 bcc_ptr += strlen(CIFS_NETWORK_OPSYS) + 1;
278
790fe579 279 *pbcc_area = bcc_ptr;
3979877e
SF
280}
281
59140797
JL
282static void
283decode_unicode_ssetup(char **pbcc_area, int bleft, struct cifsSesInfo *ses,
284 const struct nls_table *nls_cp)
3979877e 285{
59140797 286 int len;
790fe579 287 char *data = *pbcc_area;
3979877e 288
b6b38f70 289 cFYI(1, "bleft %d", bleft);
3979877e 290
27b87fe5
JL
291 /*
292 * Windows servers do not always double null terminate their final
293 * Unicode string. Check to see if there are an uneven number of bytes
294 * left. If so, then add an extra NULL pad byte to the end of the
295 * response.
296 *
297 * See section 2.7.2 in "Implementing CIFS" for details
298 */
299 if (bleft % 2) {
300 data[bleft] = 0;
301 ++bleft;
302 }
50c2f753 303
26f57364 304 kfree(ses->serverOS);
d185cda7 305 ses->serverOS = cifs_strndup_from_ucs(data, bleft, true, nls_cp);
b6b38f70 306 cFYI(1, "serverOS=%s", ses->serverOS);
59140797
JL
307 len = (UniStrnlen((wchar_t *) data, bleft / 2) * 2) + 2;
308 data += len;
309 bleft -= len;
310 if (bleft <= 0)
311 return;
3979877e 312
26f57364 313 kfree(ses->serverNOS);
d185cda7 314 ses->serverNOS = cifs_strndup_from_ucs(data, bleft, true, nls_cp);
b6b38f70 315 cFYI(1, "serverNOS=%s", ses->serverNOS);
59140797
JL
316 len = (UniStrnlen((wchar_t *) data, bleft / 2) * 2) + 2;
317 data += len;
318 bleft -= len;
319 if (bleft <= 0)
320 return;
790fe579 321
26f57364 322 kfree(ses->serverDomain);
d185cda7 323 ses->serverDomain = cifs_strndup_from_ucs(data, bleft, true, nls_cp);
b6b38f70 324 cFYI(1, "serverDomain=%s", ses->serverDomain);
790fe579 325
59140797 326 return;
3979877e
SF
327}
328
790fe579
SF
329static int decode_ascii_ssetup(char **pbcc_area, int bleft,
330 struct cifsSesInfo *ses,
331 const struct nls_table *nls_cp)
3979877e
SF
332{
333 int rc = 0;
334 int len;
790fe579 335 char *bcc_ptr = *pbcc_area;
3979877e 336
b6b38f70 337 cFYI(1, "decode sessetup ascii. bleft %d", bleft);
50c2f753 338
3979877e 339 len = strnlen(bcc_ptr, bleft);
790fe579 340 if (len >= bleft)
3979877e 341 return rc;
50c2f753 342
26f57364 343 kfree(ses->serverOS);
3979877e
SF
344
345 ses->serverOS = kzalloc(len + 1, GFP_KERNEL);
790fe579 346 if (ses->serverOS)
3979877e 347 strncpy(ses->serverOS, bcc_ptr, len);
790fe579 348 if (strncmp(ses->serverOS, "OS/2", 4) == 0) {
b6b38f70 349 cFYI(1, "OS/2 server");
9ac00b7d
SF
350 ses->flags |= CIFS_SES_OS2;
351 }
3979877e
SF
352
353 bcc_ptr += len + 1;
354 bleft -= len + 1;
355
356 len = strnlen(bcc_ptr, bleft);
790fe579 357 if (len >= bleft)
3979877e
SF
358 return rc;
359
26f57364 360 kfree(ses->serverNOS);
3979877e
SF
361
362 ses->serverNOS = kzalloc(len + 1, GFP_KERNEL);
790fe579 363 if (ses->serverNOS)
3979877e
SF
364 strncpy(ses->serverNOS, bcc_ptr, len);
365
366 bcc_ptr += len + 1;
367 bleft -= len + 1;
368
790fe579
SF
369 len = strnlen(bcc_ptr, bleft);
370 if (len > bleft)
371 return rc;
3979877e 372
9ac00b7d
SF
373 /* No domain field in LANMAN case. Domain is
374 returned by old servers in the SMB negprot response */
375 /* BB For newer servers which do not support Unicode,
376 but thus do return domain here we could add parsing
377 for it later, but it is not very important */
b6b38f70 378 cFYI(1, "ascii: bytes left %d", bleft);
3979877e
SF
379
380 return rc;
381}
382
0b3cc858
SF
383static int decode_ntlmssp_challenge(char *bcc_ptr, int blob_len,
384 struct cifsSesInfo *ses)
385{
9fbc5908
SF
386 unsigned int tioffset; /* challeng message target info area */
387 unsigned int tilen; /* challeng message target info area length */
388
0b3cc858
SF
389 CHALLENGE_MESSAGE *pblob = (CHALLENGE_MESSAGE *)bcc_ptr;
390
391 if (blob_len < sizeof(CHALLENGE_MESSAGE)) {
b6b38f70 392 cERROR(1, "challenge blob len %d too small", blob_len);
0b3cc858
SF
393 return -EINVAL;
394 }
395
396 if (memcmp(pblob->Signature, "NTLMSSP", 8)) {
b6b38f70 397 cERROR(1, "blob signature incorrect %s", pblob->Signature);
0b3cc858
SF
398 return -EINVAL;
399 }
400 if (pblob->MessageType != NtLmChallenge) {
b6b38f70 401 cERROR(1, "Incorrect message type %d", pblob->MessageType);
0b3cc858
SF
402 return -EINVAL;
403 }
404
405 memcpy(ses->server->cryptKey, pblob->Challenge, CIFS_CRYPTO_KEY_SIZE);
406 /* BB we could decode pblob->NegotiateFlags; some may be useful */
407 /* In particular we can examine sign flags */
408 /* BB spec says that if AvId field of MsvAvTimestamp is populated then
409 we must set the MIC field of the AUTHENTICATE_MESSAGE */
410
3ec6bbcd
SP
411 ses->server->ntlmssp.server_flags = le32_to_cpu(pblob->NegotiateFlags);
412
9fbc5908
SF
413 tioffset = cpu_to_le16(pblob->TargetInfoArray.BufferOffset);
414 tilen = cpu_to_le16(pblob->TargetInfoArray.Length);
415 ses->server->tilen = tilen;
416 if (tilen) {
417 ses->server->tiblob = kmalloc(tilen, GFP_KERNEL);
418 if (!ses->server->tiblob) {
419 cERROR(1, "Challenge target info allocation failure");
420 return -ENOMEM;
421 }
422 memcpy(ses->server->tiblob, bcc_ptr + tioffset, tilen);
423 }
424
0b3cc858
SF
425 return 0;
426}
427
428#ifdef CONFIG_CIFS_EXPERIMENTAL
429/* BB Move to ntlmssp.c eventually */
430
431/* We do not malloc the blob, it is passed in pbuffer, because
432 it is fixed size, and small, making this approach cleaner */
433static void build_ntlmssp_negotiate_blob(unsigned char *pbuffer,
434 struct cifsSesInfo *ses)
435{
436 NEGOTIATE_MESSAGE *sec_blob = (NEGOTIATE_MESSAGE *)pbuffer;
437 __u32 flags;
438
439 memcpy(sec_blob->Signature, NTLMSSP_SIGNATURE, 8);
440 sec_blob->MessageType = NtLmNegotiate;
441
442 /* BB is NTLMV2 session security format easier to use here? */
443 flags = NTLMSSP_NEGOTIATE_56 | NTLMSSP_REQUEST_TARGET |
444 NTLMSSP_NEGOTIATE_128 | NTLMSSP_NEGOTIATE_UNICODE |
3ec6bbcd 445 NTLMSSP_NEGOTIATE_NTLM;
0b3cc858 446 if (ses->server->secMode &
3ec6bbcd
SP
447 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) {
448 flags |= NTLMSSP_NEGOTIATE_SIGN |
449 NTLMSSP_NEGOTIATE_KEY_XCH |
450 NTLMSSP_NEGOTIATE_EXTENDED_SEC;
451 }
0b3cc858
SF
452
453 sec_blob->NegotiateFlags |= cpu_to_le32(flags);
454
455 sec_blob->WorkstationName.BufferOffset = 0;
456 sec_blob->WorkstationName.Length = 0;
457 sec_blob->WorkstationName.MaximumLength = 0;
458
459 /* Domain name is sent on the Challenge not Negotiate NTLMSSP request */
460 sec_blob->DomainName.BufferOffset = 0;
461 sec_blob->DomainName.Length = 0;
462 sec_blob->DomainName.MaximumLength = 0;
463}
464
465/* We do not malloc the blob, it is passed in pbuffer, because its
466 maximum possible size is fixed and small, making this approach cleaner.
467 This function returns the length of the data in the blob */
468static int build_ntlmssp_auth_blob(unsigned char *pbuffer,
469 struct cifsSesInfo *ses,
ebe6aa5a 470 const struct nls_table *nls_cp, bool first)
0b3cc858 471{
9fbc5908
SF
472 int rc;
473 unsigned int size;
0b3cc858
SF
474 AUTHENTICATE_MESSAGE *sec_blob = (AUTHENTICATE_MESSAGE *)pbuffer;
475 __u32 flags;
476 unsigned char *tmp;
9fbc5908 477 struct ntlmv2_resp ntlmv2_response = {};
0b3cc858
SF
478
479 memcpy(sec_blob->Signature, NTLMSSP_SIGNATURE, 8);
480 sec_blob->MessageType = NtLmAuthenticate;
481
482 flags = NTLMSSP_NEGOTIATE_56 |
483 NTLMSSP_REQUEST_TARGET | NTLMSSP_NEGOTIATE_TARGET_INFO |
484 NTLMSSP_NEGOTIATE_128 | NTLMSSP_NEGOTIATE_UNICODE |
485 NTLMSSP_NEGOTIATE_NT_ONLY | NTLMSSP_NEGOTIATE_NTLM;
486 if (ses->server->secMode &
487 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
488 flags |= NTLMSSP_NEGOTIATE_SIGN;
489 if (ses->server->secMode & SECMODE_SIGN_REQUIRED)
490 flags |= NTLMSSP_NEGOTIATE_ALWAYS_SIGN;
491
492 tmp = pbuffer + sizeof(AUTHENTICATE_MESSAGE);
493 sec_blob->NegotiateFlags |= cpu_to_le32(flags);
494
495 sec_blob->LmChallengeResponse.BufferOffset =
496 cpu_to_le32(sizeof(AUTHENTICATE_MESSAGE));
497 sec_blob->LmChallengeResponse.Length = 0;
498 sec_blob->LmChallengeResponse.MaximumLength = 0;
499
0b3cc858 500 sec_blob->NtChallengeResponse.BufferOffset = cpu_to_le32(tmp - pbuffer);
9fbc5908
SF
501 rc = setup_ntlmv2_rsp(ses, (char *)&ntlmv2_response, nls_cp);
502 if (rc) {
503 cERROR(1, "error rc: %d during ntlmssp ntlmv2 setup", rc);
504 goto setup_ntlmv2_ret;
505 }
506 size = sizeof(struct ntlmv2_resp);
507 memcpy(tmp, (char *)&ntlmv2_response, size);
508 tmp += size;
509 if (ses->server->tilen > 0) {
510 memcpy(tmp, ses->server->tiblob, ses->server->tilen);
511 tmp += ses->server->tilen;
512 } else
513 ses->server->tilen = 0;
0b3cc858 514
9fbc5908
SF
515 sec_blob->NtChallengeResponse.Length = cpu_to_le16(size +
516 ses->server->tilen);
517 sec_blob->NtChallengeResponse.MaximumLength =
518 cpu_to_le16(size + ses->server->tilen);
0b3cc858
SF
519
520 if (ses->domainName == NULL) {
521 sec_blob->DomainName.BufferOffset = cpu_to_le32(tmp - pbuffer);
522 sec_blob->DomainName.Length = 0;
523 sec_blob->DomainName.MaximumLength = 0;
524 tmp += 2;
525 } else {
526 int len;
527 len = cifs_strtoUCS((__le16 *)tmp, ses->domainName,
528 MAX_USERNAME_SIZE, nls_cp);
529 len *= 2; /* unicode is 2 bytes each */
0b3cc858
SF
530 sec_blob->DomainName.BufferOffset = cpu_to_le32(tmp - pbuffer);
531 sec_blob->DomainName.Length = cpu_to_le16(len);
532 sec_blob->DomainName.MaximumLength = cpu_to_le16(len);
533 tmp += len;
534 }
535
536 if (ses->userName == NULL) {
537 sec_blob->UserName.BufferOffset = cpu_to_le32(tmp - pbuffer);
538 sec_blob->UserName.Length = 0;
539 sec_blob->UserName.MaximumLength = 0;
540 tmp += 2;
541 } else {
542 int len;
543 len = cifs_strtoUCS((__le16 *)tmp, ses->userName,
544 MAX_USERNAME_SIZE, nls_cp);
545 len *= 2; /* unicode is 2 bytes each */
0b3cc858
SF
546 sec_blob->UserName.BufferOffset = cpu_to_le32(tmp - pbuffer);
547 sec_blob->UserName.Length = cpu_to_le16(len);
548 sec_blob->UserName.MaximumLength = cpu_to_le16(len);
549 tmp += len;
550 }
551
552 sec_blob->WorkstationName.BufferOffset = cpu_to_le32(tmp - pbuffer);
553 sec_blob->WorkstationName.Length = 0;
554 sec_blob->WorkstationName.MaximumLength = 0;
555 tmp += 2;
556
9fbc5908
SF
557 if ((ses->server->ntlmssp.server_flags & NTLMSSP_NEGOTIATE_KEY_XCH) &&
558 !calc_seckey(ses->server)) {
559 memcpy(tmp, ses->server->ntlmssp.ciphertext, CIFS_CPHTXT_SIZE);
560 sec_blob->SessionKey.BufferOffset = cpu_to_le32(tmp - pbuffer);
561 sec_blob->SessionKey.Length = cpu_to_le16(CIFS_CPHTXT_SIZE);
562 sec_blob->SessionKey.MaximumLength =
563 cpu_to_le16(CIFS_CPHTXT_SIZE);
564 tmp += CIFS_CPHTXT_SIZE;
565 } else {
566 sec_blob->SessionKey.BufferOffset = cpu_to_le32(tmp - pbuffer);
567 sec_blob->SessionKey.Length = 0;
568 sec_blob->SessionKey.MaximumLength = 0;
569 }
570
571 ses->server->sequence_number = 0;
572
573setup_ntlmv2_ret:
574 if (ses->server->tilen > 0)
575 kfree(ses->server->tiblob);
576
0b3cc858
SF
577 return tmp - pbuffer;
578}
579
580
581static void setup_ntlmssp_neg_req(SESSION_SETUP_ANDX *pSMB,
582 struct cifsSesInfo *ses)
583{
584 build_ntlmssp_negotiate_blob(&pSMB->req.SecurityBlob[0], ses);
585 pSMB->req.SecurityBlobLength = cpu_to_le16(sizeof(NEGOTIATE_MESSAGE));
586
587 return;
588}
589
9fbc5908 590static int setup_ntlmssp_auth_req(char *ntlmsspblob,
0b3cc858 591 struct cifsSesInfo *ses,
ebe6aa5a 592 const struct nls_table *nls, bool first_time)
0b3cc858
SF
593{
594 int bloblen;
595
9fbc5908 596 bloblen = build_ntlmssp_auth_blob(ntlmsspblob, ses, nls,
0b3cc858 597 first_time);
0b3cc858
SF
598
599 return bloblen;
600}
601#endif
602
790fe579 603int
ebe6aa5a
JL
604CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses,
605 const struct nls_table *nls_cp)
3979877e
SF
606{
607 int rc = 0;
608 int wct;
3979877e
SF
609 struct smb_hdr *smb_buf;
610 char *bcc_ptr;
750d1151 611 char *str_area;
3979877e
SF
612 SESSION_SETUP_ANDX *pSMB;
613 __u32 capabilities;
614 int count;
2442421b
SF
615 int resp_buf_type;
616 struct kvec iov[3];
3979877e
SF
617 enum securityEnum type;
618 __u16 action;
619 int bytes_remaining;
2442421b 620 struct key *spnego_key = NULL;
0b3cc858 621 __le32 phase = NtLmNegotiate; /* NTLMSSP, if needed, is multistage */
ebe6aa5a 622 bool first_time;
7100ae97 623 char *ntlmsspblob;
254e55ed 624
790fe579 625 if (ses == NULL)
3979877e
SF
626 return -EINVAL;
627
ebe6aa5a
JL
628 read_lock(&cifs_tcp_ses_lock);
629 first_time = is_first_ses_reconnect(ses);
630 read_unlock(&cifs_tcp_ses_lock);
631
3979877e 632 type = ses->server->secType;
f40c5628 633
b6b38f70 634 cFYI(1, "sess setup type %d", type);
0b3cc858
SF
635ssetup_ntlmssp_authenticate:
636 if (phase == NtLmChallenge)
637 phase = NtLmAuthenticate; /* if ntlmssp, now final phase */
638
790fe579 639 if (type == LANMAN) {
3979877e
SF
640#ifndef CONFIG_CIFS_WEAK_PW_HASH
641 /* LANMAN and plaintext are less secure and off by default.
642 So we make this explicitly be turned on in kconfig (in the
643 build) and turned on at runtime (changed from the default)
644 in proc/fs/cifs or via mount parm. Unfortunately this is
645 needed for old Win (e.g. Win95), some obscure NAS and OS/2 */
646 return -EOPNOTSUPP;
647#endif
648 wct = 10; /* lanman 2 style sessionsetup */
790fe579 649 } else if ((type == NTLM) || (type == NTLMv2)) {
9312f675 650 /* For NTLMv2 failures eventually may need to retry NTLM */
3979877e 651 wct = 13; /* old style NTLM sessionsetup */
790fe579 652 } else /* same size: negotiate or auth, NTLMSSP or extended security */
3979877e
SF
653 wct = 12;
654
655 rc = small_smb_init_no_tc(SMB_COM_SESSION_SETUP_ANDX, wct, ses,
656 (void **)&smb_buf);
790fe579 657 if (rc)
3979877e
SF
658 return rc;
659
660 pSMB = (SESSION_SETUP_ANDX *)smb_buf;
661
662 capabilities = cifs_ssetup_hdr(ses, pSMB);
750d1151 663
2442421b
SF
664 /* we will send the SMB in three pieces:
665 a fixed length beginning part, an optional
666 SPNEGO blob (which can be zero length), and a
667 last part which will include the strings
668 and rest of bcc area. This allows us to avoid
669 a large buffer 17K allocation */
790fe579
SF
670 iov[0].iov_base = (char *)pSMB;
671 iov[0].iov_len = smb_buf->smb_buf_length + 4;
750d1151 672
2442421b
SF
673 /* setting this here allows the code at the end of the function
674 to free the request buffer if there's an error */
675 resp_buf_type = CIFS_SMALL_BUFFER;
676
750d1151
SF
677 /* 2000 big enough to fit max user, domain, NOS name etc. */
678 str_area = kmalloc(2000, GFP_KERNEL);
5e6e6232 679 if (str_area == NULL) {
2442421b
SF
680 rc = -ENOMEM;
681 goto ssetup_exit;
5e6e6232 682 }
750d1151 683 bcc_ptr = str_area;
3979877e 684
9ac00b7d
SF
685 ses->flags &= ~CIFS_SES_LANMAN;
686
2442421b
SF
687 iov[1].iov_base = NULL;
688 iov[1].iov_len = 0;
689
790fe579 690 if (type == LANMAN) {
3979877e 691#ifdef CONFIG_CIFS_WEAK_PW_HASH
7c7b25bc 692 char lnm_session_key[CIFS_SESS_KEY_SIZE];
3979877e 693
c76da9da
SF
694 pSMB->req.hdr.Flags2 &= ~SMBFLG2_UNICODE;
695
3979877e
SF
696 /* no capabilities flags in old lanman negotiation */
697
790fe579 698 pSMB->old_req.PasswordLength = cpu_to_le16(CIFS_SESS_KEY_SIZE);
3979877e
SF
699 /* BB calculate hash with password */
700 /* and copy into bcc */
701
4e53a3fb
JL
702 calc_lanman_hash(ses->password, ses->server->cryptKey,
703 ses->server->secMode & SECMODE_PW_ENCRYPT ?
704 true : false, lnm_session_key);
705
790fe579 706 ses->flags |= CIFS_SES_LANMAN;
7c7b25bc
SF
707 memcpy(bcc_ptr, (char *)lnm_session_key, CIFS_SESS_KEY_SIZE);
708 bcc_ptr += CIFS_SESS_KEY_SIZE;
3979877e
SF
709
710 /* can not sign if LANMAN negotiated so no need
711 to calculate signing key? but what if server
712 changed to do higher than lanman dialect and
713 we reconnected would we ever calc signing_key? */
714
b6b38f70 715 cFYI(1, "Negotiating LANMAN setting up strings");
3979877e
SF
716 /* Unicode not allowed for LANMAN dialects */
717 ascii_ssetup_strings(&bcc_ptr, ses, nls_cp);
790fe579 718#endif
3979877e 719 } else if (type == NTLM) {
7c7b25bc 720 char ntlm_session_key[CIFS_SESS_KEY_SIZE];
3979877e
SF
721
722 pSMB->req_no_secext.Capabilities = cpu_to_le32(capabilities);
723 pSMB->req_no_secext.CaseInsensitivePasswordLength =
7c7b25bc 724 cpu_to_le16(CIFS_SESS_KEY_SIZE);
3979877e 725 pSMB->req_no_secext.CaseSensitivePasswordLength =
7c7b25bc 726 cpu_to_le16(CIFS_SESS_KEY_SIZE);
50c2f753 727
3979877e
SF
728 /* calculate session key */
729 SMBNTencrypt(ses->password, ses->server->cryptKey,
730 ntlm_session_key);
731
790fe579 732 if (first_time) /* should this be moved into common code
3979877e 733 with similar ntlmv2 path? */
9fbc5908 734 cifs_calculate_session_key(&ses->server->session_key,
3979877e
SF
735 ntlm_session_key, ses->password);
736 /* copy session key */
737
790fe579 738 memcpy(bcc_ptr, (char *)ntlm_session_key, CIFS_SESS_KEY_SIZE);
7c7b25bc 739 bcc_ptr += CIFS_SESS_KEY_SIZE;
790fe579 740 memcpy(bcc_ptr, (char *)ntlm_session_key, CIFS_SESS_KEY_SIZE);
7c7b25bc 741 bcc_ptr += CIFS_SESS_KEY_SIZE;
790fe579 742 if (ses->capabilities & CAP_UNICODE) {
0223cf0b
SF
743 /* unicode strings must be word aligned */
744 if (iov[0].iov_len % 2) {
745 *bcc_ptr = 0;
790fe579
SF
746 bcc_ptr++;
747 }
7c7b25bc 748 unicode_ssetup_strings(&bcc_ptr, ses, nls_cp);
0223cf0b 749 } else
7c7b25bc
SF
750 ascii_ssetup_strings(&bcc_ptr, ses, nls_cp);
751 } else if (type == NTLMv2) {
790fe579 752 char *v2_sess_key =
6d027cfd 753 kmalloc(sizeof(struct ntlmv2_resp), GFP_KERNEL);
f64b23ae
SF
754
755 /* BB FIXME change all users of v2_sess_key to
756 struct ntlmv2_resp */
7c7b25bc 757
790fe579 758 if (v2_sess_key == NULL) {
2442421b
SF
759 rc = -ENOMEM;
760 goto ssetup_exit;
7c7b25bc
SF
761 }
762
763 pSMB->req_no_secext.Capabilities = cpu_to_le32(capabilities);
764
765 /* LM2 password would be here if we supported it */
766 pSMB->req_no_secext.CaseInsensitivePasswordLength = 0;
767 /* cpu_to_le16(LM2_SESS_KEY_SIZE); */
768
769 pSMB->req_no_secext.CaseSensitivePasswordLength =
f64b23ae 770 cpu_to_le16(sizeof(struct ntlmv2_resp));
7c7b25bc
SF
771
772 /* calculate session key */
9fbc5908
SF
773 rc = setup_ntlmv2_rsp(ses, v2_sess_key, nls_cp);
774 if (rc) {
775 kfree(v2_sess_key);
776 goto ssetup_exit;
777 }
8a224d48 778 /* FIXME: calculate MAC key */
3870253e
SF
779 memcpy(bcc_ptr, (char *)v2_sess_key,
780 sizeof(struct ntlmv2_resp));
f64b23ae
SF
781 bcc_ptr += sizeof(struct ntlmv2_resp);
782 kfree(v2_sess_key);
9fbc5908
SF
783 if (ses->server->tilen > 0) {
784 memcpy(bcc_ptr, ses->server->tiblob,
785 ses->server->tilen);
786 bcc_ptr += ses->server->tilen;
787 }
790fe579
SF
788 if (ses->capabilities & CAP_UNICODE) {
789 if (iov[0].iov_len % 2) {
0223cf0b 790 *bcc_ptr = 0;
26f57364
SF
791 bcc_ptr++;
792 }
3979877e 793 unicode_ssetup_strings(&bcc_ptr, ses, nls_cp);
0223cf0b 794 } else
3979877e 795 ascii_ssetup_strings(&bcc_ptr, ses, nls_cp);
26efa0ba 796 } else if (type == Kerberos) {
2442421b
SF
797#ifdef CONFIG_CIFS_UPCALL
798 struct cifs_spnego_msg *msg;
799 spnego_key = cifs_get_spnego_key(ses);
800 if (IS_ERR(spnego_key)) {
801 rc = PTR_ERR(spnego_key);
802 spnego_key = NULL;
803 goto ssetup_exit;
804 }
805
806 msg = spnego_key->payload.data;
6ce5eecb
SF
807 /* check version field to make sure that cifs.upcall is
808 sending us a response in an expected form */
809 if (msg->version != CIFS_SPNEGO_UPCALL_VERSION) {
b6b38f70 810 cERROR(1, "incorrect version of cifs.upcall (expected"
6ce5eecb 811 " %d but got %d)",
b6b38f70 812 CIFS_SPNEGO_UPCALL_VERSION, msg->version);
6ce5eecb
SF
813 rc = -EKEYREJECTED;
814 goto ssetup_exit;
815 }
2442421b
SF
816 /* bail out if key is too long */
817 if (msg->sesskey_len >
9fbc5908 818 sizeof(ses->server->session_key.data.krb5)) {
b6b38f70
JP
819 cERROR(1, "Kerberos signing key too long (%u bytes)",
820 msg->sesskey_len);
2442421b
SF
821 rc = -EOVERFLOW;
822 goto ssetup_exit;
823 }
1a67570c 824 if (first_time) {
9fbc5908
SF
825 ses->server->session_key.len = msg->sesskey_len;
826 memcpy(ses->server->session_key.data.krb5,
1a67570c
JL
827 msg->data, msg->sesskey_len);
828 }
3979877e
SF
829 pSMB->req.hdr.Flags2 |= SMBFLG2_EXT_SEC;
830 capabilities |= CAP_EXTENDED_SECURITY;
831 pSMB->req.Capabilities = cpu_to_le32(capabilities);
2442421b
SF
832 iov[1].iov_base = msg->data + msg->sesskey_len;
833 iov[1].iov_len = msg->secblob_len;
834 pSMB->req.SecurityBlobLength = cpu_to_le16(iov[1].iov_len);
835
836 if (ses->capabilities & CAP_UNICODE) {
837 /* unicode strings must be word aligned */
28c5a02a 838 if ((iov[0].iov_len + iov[1].iov_len) % 2) {
2442421b
SF
839 *bcc_ptr = 0;
840 bcc_ptr++;
841 }
842 unicode_oslm_strings(&bcc_ptr, nls_cp);
843 unicode_domain_string(&bcc_ptr, ses, nls_cp);
844 } else
845 /* BB: is this right? */
846 ascii_ssetup_strings(&bcc_ptr, ses, nls_cp);
847#else /* ! CONFIG_CIFS_UPCALL */
b6b38f70 848 cERROR(1, "Kerberos negotiated but upcall support disabled!");
2442421b
SF
849 rc = -ENOSYS;
850 goto ssetup_exit;
851#endif /* CONFIG_CIFS_UPCALL */
852 } else {
0b3cc858 853#ifdef CONFIG_CIFS_EXPERIMENTAL
f46c7234 854 if (type == RawNTLMSSP) {
0b3cc858 855 if ((pSMB->req.hdr.Flags2 & SMBFLG2_UNICODE) == 0) {
b6b38f70 856 cERROR(1, "NTLMSSP requires Unicode support");
0b3cc858
SF
857 rc = -ENOSYS;
858 goto ssetup_exit;
859 }
860
b6b38f70 861 cFYI(1, "ntlmssp session setup phase %d", phase);
0b3cc858
SF
862 pSMB->req.hdr.Flags2 |= SMBFLG2_EXT_SEC;
863 capabilities |= CAP_EXTENDED_SECURITY;
864 pSMB->req.Capabilities |= cpu_to_le32(capabilities);
865 if (phase == NtLmNegotiate) {
866 setup_ntlmssp_neg_req(pSMB, ses);
867 iov[1].iov_len = sizeof(NEGOTIATE_MESSAGE);
9fbc5908 868 iov[1].iov_base = &pSMB->req.SecurityBlob[0];
0b3cc858
SF
869 } else if (phase == NtLmAuthenticate) {
870 int blob_len;
9fbc5908
SF
871 ntlmsspblob = kmalloc(5 *
872 sizeof(struct _AUTHENTICATE_MESSAGE),
873 GFP_KERNEL);
874 if (!ntlmsspblob) {
875 cERROR(1, "Can't allocate NTLMSSP");
876 rc = -ENOMEM;
877 goto ssetup_exit;
878 }
879
880 blob_len = setup_ntlmssp_auth_req(ntlmsspblob,
881 ses,
882 nls_cp,
883 first_time);
0b3cc858 884 iov[1].iov_len = blob_len;
9fbc5908
SF
885 iov[1].iov_base = ntlmsspblob;
886 pSMB->req.SecurityBlobLength =
887 cpu_to_le16(blob_len);
844823cb
SF
888 /* Make sure that we tell the server that we
889 are using the uid that it just gave us back
890 on the response (challenge) */
891 smb_buf->Uid = ses->Suid;
0b3cc858 892 } else {
b6b38f70 893 cERROR(1, "invalid phase %d", phase);
0b3cc858
SF
894 rc = -ENOSYS;
895 goto ssetup_exit;
896 }
0b3cc858
SF
897 /* unicode strings must be word aligned */
898 if ((iov[0].iov_len + iov[1].iov_len) % 2) {
899 *bcc_ptr = 0;
900 bcc_ptr++;
901 }
902 unicode_oslm_strings(&bcc_ptr, nls_cp);
903 } else {
b6b38f70 904 cERROR(1, "secType %d not supported!", type);
0b3cc858
SF
905 rc = -ENOSYS;
906 goto ssetup_exit;
907 }
908#else
b6b38f70 909 cERROR(1, "secType %d not supported!", type);
2442421b
SF
910 rc = -ENOSYS;
911 goto ssetup_exit;
0b3cc858 912#endif
3979877e
SF
913 }
914
2442421b
SF
915 iov[2].iov_base = str_area;
916 iov[2].iov_len = (long) bcc_ptr - (long) str_area;
917
918 count = iov[1].iov_len + iov[2].iov_len;
3979877e
SF
919 smb_buf->smb_buf_length += count;
920
3979877e
SF
921 BCC_LE(smb_buf) = cpu_to_le16(count);
922
2442421b 923 rc = SendReceive2(xid, ses, iov, 3 /* num_iovecs */, &resp_buf_type,
133672ef 924 CIFS_STD_OP /* not long */ | CIFS_LOG_ERROR);
3979877e
SF
925 /* SMB request buf freed in SendReceive2 */
926
b6b38f70 927 cFYI(1, "ssetup rc from sendrecv2 is %d", rc);
3979877e
SF
928
929 pSMB = (SESSION_SETUP_ANDX *)iov[0].iov_base;
930 smb_buf = (struct smb_hdr *)iov[0].iov_base;
931
0b3cc858
SF
932 if ((type == RawNTLMSSP) && (smb_buf->Status.CifsError ==
933 cpu_to_le32(NT_STATUS_MORE_PROCESSING_REQUIRED))) {
934 if (phase != NtLmNegotiate) {
b6b38f70 935 cERROR(1, "Unexpected more processing error");
0b3cc858
SF
936 goto ssetup_exit;
937 }
938 /* NTLMSSP Negotiate sent now processing challenge (response) */
939 phase = NtLmChallenge; /* process ntlmssp challenge */
940 rc = 0; /* MORE_PROC rc is not an error here, but expected */
941 }
942 if (rc)
943 goto ssetup_exit;
944
790fe579 945 if ((smb_buf->WordCount != 3) && (smb_buf->WordCount != 4)) {
3979877e 946 rc = -EIO;
b6b38f70 947 cERROR(1, "bad word count %d", smb_buf->WordCount);
3979877e
SF
948 goto ssetup_exit;
949 }
950 action = le16_to_cpu(pSMB->resp.Action);
951 if (action & GUEST_LOGIN)
b6b38f70 952 cFYI(1, "Guest login"); /* BB mark SesInfo struct? */
3979877e 953 ses->Suid = smb_buf->Uid; /* UID left in wire format (le) */
b6b38f70 954 cFYI(1, "UID = %d ", ses->Suid);
3979877e
SF
955 /* response can have either 3 or 4 word count - Samba sends 3 */
956 /* and lanman response is 3 */
957 bytes_remaining = BCC(smb_buf);
958 bcc_ptr = pByteArea(smb_buf);
959
790fe579 960 if (smb_buf->WordCount == 4) {
3979877e
SF
961 __u16 blob_len;
962 blob_len = le16_to_cpu(pSMB->resp.SecurityBlobLength);
790fe579 963 if (blob_len > bytes_remaining) {
b6b38f70 964 cERROR(1, "bad security blob length %d", blob_len);
3979877e
SF
965 rc = -EINVAL;
966 goto ssetup_exit;
967 }
0b3cc858
SF
968 if (phase == NtLmChallenge) {
969 rc = decode_ntlmssp_challenge(bcc_ptr, blob_len, ses);
970 /* now goto beginning for ntlmssp authenticate phase */
971 if (rc)
972 goto ssetup_exit;
973 }
974 bcc_ptr += blob_len;
3979877e 975 bytes_remaining -= blob_len;
790fe579 976 }
3979877e
SF
977
978 /* BB check if Unicode and decode strings */
27b87fe5
JL
979 if (smb_buf->Flags2 & SMBFLG2_UNICODE) {
980 /* unicode string area must be word-aligned */
981 if (((unsigned long) bcc_ptr - (unsigned long) smb_buf) % 2) {
982 ++bcc_ptr;
983 --bytes_remaining;
984 }
59140797 985 decode_unicode_ssetup(&bcc_ptr, bytes_remaining, ses, nls_cp);
27b87fe5 986 } else {
63135e08
SF
987 rc = decode_ascii_ssetup(&bcc_ptr, bytes_remaining,
988 ses, nls_cp);
27b87fe5 989 }
50c2f753 990
3979877e 991ssetup_exit:
dfd15c46
JL
992 if (spnego_key) {
993 key_revoke(spnego_key);
2442421b 994 key_put(spnego_key);
dfd15c46 995 }
750d1151 996 kfree(str_area);
790fe579 997 if (resp_buf_type == CIFS_SMALL_BUFFER) {
b6b38f70 998 cFYI(1, "ssetup freeing small buf %p", iov[0].iov_base);
3979877e 999 cifs_small_buf_release(iov[0].iov_base);
790fe579 1000 } else if (resp_buf_type == CIFS_LARGE_BUFFER)
3979877e
SF
1001 cifs_buf_release(iov[0].iov_base);
1002
0b3cc858
SF
1003 /* if ntlmssp, and negotiate succeeded, proceed to authenticate phase */
1004 if ((phase == NtLmChallenge) && (rc == 0))
1005 goto ssetup_ntlmssp_authenticate;
1006
3979877e
SF
1007 return rc;
1008}