1 /*
2  *   fs/cifs/sess.c
3  *
4  *   SMB/CIFS session setup handling routines
5  *
6  *   Copyright (c) International Business Machines  Corp., 2006, 2009
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"
31 #include <linux/utsname.h>
32 #include <linux/slab.h>
33 #include "cifs_spnego.h"
34 
cifs_ssetup_hdr(struct cifs_ses * ses,SESSION_SETUP_ANDX * pSMB)35 static __u32 cifs_ssetup_hdr(struct cifs_ses *ses, SESSION_SETUP_ANDX *pSMB)
36 {
37 	__u32 capabilities = 0;
38 
39 	/* init fields common to all four types of SessSetup */
40 	/* Note that offsets for first seven fields in req struct are same  */
41 	/*	in CIFS Specs so does not matter which of 3 forms of struct */
42 	/*	that we use in next few lines                               */
43 	/* Note that header is initialized to zero in header_assemble */
44 	pSMB->req.AndXCommand = 0xFF;
45 	pSMB->req.MaxBufferSize = cpu_to_le16(min_t(u32,
46 					CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4,
47 					USHRT_MAX));
48 	pSMB->req.MaxMpxCount = cpu_to_le16(ses->server->maxReq);
49 	pSMB->req.VcNumber = cpu_to_le16(1);
50 
51 	/* Now no need to set SMBFLG_CASELESS or obsolete CANONICAL PATH */
52 
53 	/* BB verify whether signing required on neg or just on auth frame
54 	   (and NTLM case) */
55 
56 	capabilities = CAP_LARGE_FILES | CAP_NT_SMBS | CAP_LEVEL_II_OPLOCKS |
57 			CAP_LARGE_WRITE_X | CAP_LARGE_READ_X;
58 
59 	if (ses->server->sign)
60 		pSMB->req.hdr.Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
61 
62 	if (ses->capabilities & CAP_UNICODE) {
63 		pSMB->req.hdr.Flags2 |= SMBFLG2_UNICODE;
64 		capabilities |= CAP_UNICODE;
65 	}
66 	if (ses->capabilities & CAP_STATUS32) {
67 		pSMB->req.hdr.Flags2 |= SMBFLG2_ERR_STATUS;
68 		capabilities |= CAP_STATUS32;
69 	}
70 	if (ses->capabilities & CAP_DFS) {
71 		pSMB->req.hdr.Flags2 |= SMBFLG2_DFS;
72 		capabilities |= CAP_DFS;
73 	}
74 	if (ses->capabilities & CAP_UNIX)
75 		capabilities |= CAP_UNIX;
76 
77 	return capabilities;
78 }
79 
80 static void
unicode_oslm_strings(char ** pbcc_area,const struct nls_table * nls_cp)81 unicode_oslm_strings(char **pbcc_area, const struct nls_table *nls_cp)
82 {
83 	char *bcc_ptr = *pbcc_area;
84 	int bytes_ret = 0;
85 
86 	/* Copy OS version */
87 	bytes_ret = cifs_strtoUTF16((__le16 *)bcc_ptr, "Linux version ", 32,
88 				    nls_cp);
89 	bcc_ptr += 2 * bytes_ret;
90 	bytes_ret = cifs_strtoUTF16((__le16 *) bcc_ptr, init_utsname()->release,
91 				    32, nls_cp);
92 	bcc_ptr += 2 * bytes_ret;
93 	bcc_ptr += 2; /* trailing null */
94 
95 	bytes_ret = cifs_strtoUTF16((__le16 *) bcc_ptr, CIFS_NETWORK_OPSYS,
96 				    32, nls_cp);
97 	bcc_ptr += 2 * bytes_ret;
98 	bcc_ptr += 2; /* trailing null */
99 
100 	*pbcc_area = bcc_ptr;
101 }
102 
unicode_domain_string(char ** pbcc_area,struct cifs_ses * ses,const struct nls_table * nls_cp)103 static void unicode_domain_string(char **pbcc_area, struct cifs_ses *ses,
104 				   const struct nls_table *nls_cp)
105 {
106 	char *bcc_ptr = *pbcc_area;
107 	int bytes_ret = 0;
108 
109 	/* copy domain */
110 	if (ses->domainName == NULL) {
111 		/* Sending null domain better than using a bogus domain name (as
112 		we did briefly in 2.6.18) since server will use its default */
113 		*bcc_ptr = 0;
114 		*(bcc_ptr+1) = 0;
115 		bytes_ret = 0;
116 	} else
117 		bytes_ret = cifs_strtoUTF16((__le16 *) bcc_ptr, ses->domainName,
118 					    CIFS_MAX_DOMAINNAME_LEN, nls_cp);
119 	bcc_ptr += 2 * bytes_ret;
120 	bcc_ptr += 2;  /* account for null terminator */
121 
122 	*pbcc_area = bcc_ptr;
123 }
124 
125 
unicode_ssetup_strings(char ** pbcc_area,struct cifs_ses * ses,const struct nls_table * nls_cp)126 static void unicode_ssetup_strings(char **pbcc_area, struct cifs_ses *ses,
127 				   const struct nls_table *nls_cp)
128 {
129 	char *bcc_ptr = *pbcc_area;
130 	int bytes_ret = 0;
131 
132 	/* BB FIXME add check that strings total less
133 	than 335 or will need to send them as arrays */
134 
135 	/* unicode strings, must be word aligned before the call */
136 /*	if ((long) bcc_ptr % 2)	{
137 		*bcc_ptr = 0;
138 		bcc_ptr++;
139 	} */
140 	/* copy user */
141 	if (ses->user_name == NULL) {
142 		/* null user mount */
143 		*bcc_ptr = 0;
144 		*(bcc_ptr+1) = 0;
145 	} else {
146 		bytes_ret = cifs_strtoUTF16((__le16 *) bcc_ptr, ses->user_name,
147 					    CIFS_MAX_USERNAME_LEN, nls_cp);
148 	}
149 	bcc_ptr += 2 * bytes_ret;
150 	bcc_ptr += 2; /* account for null termination */
151 
152 	unicode_domain_string(&bcc_ptr, ses, nls_cp);
153 	unicode_oslm_strings(&bcc_ptr, nls_cp);
154 
155 	*pbcc_area = bcc_ptr;
156 }
157 
ascii_ssetup_strings(char ** pbcc_area,struct cifs_ses * ses,const struct nls_table * nls_cp)158 static void ascii_ssetup_strings(char **pbcc_area, struct cifs_ses *ses,
159 				 const struct nls_table *nls_cp)
160 {
161 	char *bcc_ptr = *pbcc_area;
162 
163 	/* copy user */
164 	/* BB what about null user mounts - check that we do this BB */
165 	/* copy user */
166 	if (ses->user_name != NULL) {
167 		strncpy(bcc_ptr, ses->user_name, CIFS_MAX_USERNAME_LEN);
168 		bcc_ptr += strnlen(ses->user_name, CIFS_MAX_USERNAME_LEN);
169 	}
170 	/* else null user mount */
171 	*bcc_ptr = 0;
172 	bcc_ptr++; /* account for null termination */
173 
174 	/* copy domain */
175 	if (ses->domainName != NULL) {
176 		strncpy(bcc_ptr, ses->domainName, CIFS_MAX_DOMAINNAME_LEN);
177 		bcc_ptr += strnlen(ses->domainName, CIFS_MAX_DOMAINNAME_LEN);
178 	} /* else we will send a null domain name
179 	     so the server will default to its own domain */
180 	*bcc_ptr = 0;
181 	bcc_ptr++;
182 
183 	/* BB check for overflow here */
184 
185 	strcpy(bcc_ptr, "Linux version ");
186 	bcc_ptr += strlen("Linux version ");
187 	strcpy(bcc_ptr, init_utsname()->release);
188 	bcc_ptr += strlen(init_utsname()->release) + 1;
189 
190 	strcpy(bcc_ptr, CIFS_NETWORK_OPSYS);
191 	bcc_ptr += strlen(CIFS_NETWORK_OPSYS) + 1;
192 
193 	*pbcc_area = bcc_ptr;
194 }
195 
196 static void
decode_unicode_ssetup(char ** pbcc_area,int bleft,struct cifs_ses * ses,const struct nls_table * nls_cp)197 decode_unicode_ssetup(char **pbcc_area, int bleft, struct cifs_ses *ses,
198 		      const struct nls_table *nls_cp)
199 {
200 	int len;
201 	char *data = *pbcc_area;
202 
203 	cifs_dbg(FYI, "bleft %d\n", bleft);
204 
205 	kfree(ses->serverOS);
206 	ses->serverOS = cifs_strndup_from_utf16(data, bleft, true, nls_cp);
207 	cifs_dbg(FYI, "serverOS=%s\n", ses->serverOS);
208 	len = (UniStrnlen((wchar_t *) data, bleft / 2) * 2) + 2;
209 	data += len;
210 	bleft -= len;
211 	if (bleft <= 0)
212 		return;
213 
214 	kfree(ses->serverNOS);
215 	ses->serverNOS = cifs_strndup_from_utf16(data, bleft, true, nls_cp);
216 	cifs_dbg(FYI, "serverNOS=%s\n", ses->serverNOS);
217 	len = (UniStrnlen((wchar_t *) data, bleft / 2) * 2) + 2;
218 	data += len;
219 	bleft -= len;
220 	if (bleft <= 0)
221 		return;
222 
223 	kfree(ses->serverDomain);
224 	ses->serverDomain = cifs_strndup_from_utf16(data, bleft, true, nls_cp);
225 	cifs_dbg(FYI, "serverDomain=%s\n", ses->serverDomain);
226 
227 	return;
228 }
229 
decode_ascii_ssetup(char ** pbcc_area,__u16 bleft,struct cifs_ses * ses,const struct nls_table * nls_cp)230 static void decode_ascii_ssetup(char **pbcc_area, __u16 bleft,
231 				struct cifs_ses *ses,
232 				const struct nls_table *nls_cp)
233 {
234 	int len;
235 	char *bcc_ptr = *pbcc_area;
236 
237 	cifs_dbg(FYI, "decode sessetup ascii. bleft %d\n", bleft);
238 
239 	len = strnlen(bcc_ptr, bleft);
240 	if (len >= bleft)
241 		return;
242 
243 	kfree(ses->serverOS);
244 
245 	ses->serverOS = kzalloc(len + 1, GFP_KERNEL);
246 	if (ses->serverOS) {
247 		strncpy(ses->serverOS, bcc_ptr, len);
248 		if (strncmp(ses->serverOS, "OS/2", 4) == 0)
249 			cifs_dbg(FYI, "OS/2 server\n");
250 	}
251 
252 	bcc_ptr += len + 1;
253 	bleft -= len + 1;
254 
255 	len = strnlen(bcc_ptr, bleft);
256 	if (len >= bleft)
257 		return;
258 
259 	kfree(ses->serverNOS);
260 
261 	ses->serverNOS = kzalloc(len + 1, GFP_KERNEL);
262 	if (ses->serverNOS)
263 		strncpy(ses->serverNOS, bcc_ptr, len);
264 
265 	bcc_ptr += len + 1;
266 	bleft -= len + 1;
267 
268 	len = strnlen(bcc_ptr, bleft);
269 	if (len > bleft)
270 		return;
271 
272 	/* No domain field in LANMAN case. Domain is
273 	   returned by old servers in the SMB negprot response */
274 	/* BB For newer servers which do not support Unicode,
275 	   but thus do return domain here we could add parsing
276 	   for it later, but it is not very important */
277 	cifs_dbg(FYI, "ascii: bytes left %d\n", bleft);
278 }
279 
decode_ntlmssp_challenge(char * bcc_ptr,int blob_len,struct cifs_ses * ses)280 int decode_ntlmssp_challenge(char *bcc_ptr, int blob_len,
281 				    struct cifs_ses *ses)
282 {
283 	unsigned int tioffset; /* challenge message target info area */
284 	unsigned int tilen; /* challenge message target info area length  */
285 
286 	CHALLENGE_MESSAGE *pblob = (CHALLENGE_MESSAGE *)bcc_ptr;
287 
288 	if (blob_len < sizeof(CHALLENGE_MESSAGE)) {
289 		cifs_dbg(VFS, "challenge blob len %d too small\n", blob_len);
290 		return -EINVAL;
291 	}
292 
293 	if (memcmp(pblob->Signature, "NTLMSSP", 8)) {
294 		cifs_dbg(VFS, "blob signature incorrect %s\n",
295 			 pblob->Signature);
296 		return -EINVAL;
297 	}
298 	if (pblob->MessageType != NtLmChallenge) {
299 		cifs_dbg(VFS, "Incorrect message type %d\n",
300 			 pblob->MessageType);
301 		return -EINVAL;
302 	}
303 
304 	memcpy(ses->ntlmssp->cryptkey, pblob->Challenge, CIFS_CRYPTO_KEY_SIZE);
305 	/* BB we could decode pblob->NegotiateFlags; some may be useful */
306 	/* In particular we can examine sign flags */
307 	/* BB spec says that if AvId field of MsvAvTimestamp is populated then
308 		we must set the MIC field of the AUTHENTICATE_MESSAGE */
309 	ses->ntlmssp->server_flags = le32_to_cpu(pblob->NegotiateFlags);
310 	tioffset = le32_to_cpu(pblob->TargetInfoArray.BufferOffset);
311 	tilen = le16_to_cpu(pblob->TargetInfoArray.Length);
312 	if (tioffset > blob_len || tioffset + tilen > blob_len) {
313 		cifs_dbg(VFS, "tioffset + tilen too high %u + %u",
314 			tioffset, tilen);
315 		return -EINVAL;
316 	}
317 	if (tilen) {
318 		ses->auth_key.response = kmemdup(bcc_ptr + tioffset, tilen,
319 						 GFP_KERNEL);
320 		if (!ses->auth_key.response) {
321 			cifs_dbg(VFS, "Challenge target info alloc failure");
322 			return -ENOMEM;
323 		}
324 		ses->auth_key.len = tilen;
325 	}
326 
327 	return 0;
328 }
329 
330 /* BB Move to ntlmssp.c eventually */
331 
332 /* We do not malloc the blob, it is passed in pbuffer, because
333    it is fixed size, and small, making this approach cleaner */
build_ntlmssp_negotiate_blob(unsigned char * pbuffer,struct cifs_ses * ses)334 void build_ntlmssp_negotiate_blob(unsigned char *pbuffer,
335 					 struct cifs_ses *ses)
336 {
337 	NEGOTIATE_MESSAGE *sec_blob = (NEGOTIATE_MESSAGE *)pbuffer;
338 	__u32 flags;
339 
340 	memset(pbuffer, 0, sizeof(NEGOTIATE_MESSAGE));
341 	memcpy(sec_blob->Signature, NTLMSSP_SIGNATURE, 8);
342 	sec_blob->MessageType = NtLmNegotiate;
343 
344 	/* BB is NTLMV2 session security format easier to use here? */
345 	flags = NTLMSSP_NEGOTIATE_56 |	NTLMSSP_REQUEST_TARGET |
346 		NTLMSSP_NEGOTIATE_128 | NTLMSSP_NEGOTIATE_UNICODE |
347 		NTLMSSP_NEGOTIATE_NTLM | NTLMSSP_NEGOTIATE_EXTENDED_SEC;
348 	if (ses->server->sign) {
349 		flags |= NTLMSSP_NEGOTIATE_SIGN;
350 		if (!ses->server->session_estab ||
351 				ses->ntlmssp->sesskey_per_smbsess)
352 			flags |= NTLMSSP_NEGOTIATE_KEY_XCH;
353 	}
354 
355 	sec_blob->NegotiateFlags = cpu_to_le32(flags);
356 
357 	sec_blob->WorkstationName.BufferOffset = 0;
358 	sec_blob->WorkstationName.Length = 0;
359 	sec_blob->WorkstationName.MaximumLength = 0;
360 
361 	/* Domain name is sent on the Challenge not Negotiate NTLMSSP request */
362 	sec_blob->DomainName.BufferOffset = 0;
363 	sec_blob->DomainName.Length = 0;
364 	sec_blob->DomainName.MaximumLength = 0;
365 }
366 
367 /* We do not malloc the blob, it is passed in pbuffer, because its
368    maximum possible size is fixed and small, making this approach cleaner.
369    This function returns the length of the data in the blob */
build_ntlmssp_auth_blob(unsigned char * pbuffer,u16 * buflen,struct cifs_ses * ses,const struct nls_table * nls_cp)370 int build_ntlmssp_auth_blob(unsigned char *pbuffer,
371 					u16 *buflen,
372 				   struct cifs_ses *ses,
373 				   const struct nls_table *nls_cp)
374 {
375 	int rc;
376 	AUTHENTICATE_MESSAGE *sec_blob = (AUTHENTICATE_MESSAGE *)pbuffer;
377 	__u32 flags;
378 	unsigned char *tmp;
379 
380 	memcpy(sec_blob->Signature, NTLMSSP_SIGNATURE, 8);
381 	sec_blob->MessageType = NtLmAuthenticate;
382 
383 	flags = NTLMSSP_NEGOTIATE_56 |
384 		NTLMSSP_REQUEST_TARGET | NTLMSSP_NEGOTIATE_TARGET_INFO |
385 		NTLMSSP_NEGOTIATE_128 | NTLMSSP_NEGOTIATE_UNICODE |
386 		NTLMSSP_NEGOTIATE_NTLM | NTLMSSP_NEGOTIATE_EXTENDED_SEC;
387 	if (ses->server->sign) {
388 		flags |= NTLMSSP_NEGOTIATE_SIGN;
389 		if (!ses->server->session_estab ||
390 				ses->ntlmssp->sesskey_per_smbsess)
391 			flags |= NTLMSSP_NEGOTIATE_KEY_XCH;
392 	}
393 
394 	tmp = pbuffer + sizeof(AUTHENTICATE_MESSAGE);
395 	sec_blob->NegotiateFlags = cpu_to_le32(flags);
396 
397 	sec_blob->LmChallengeResponse.BufferOffset =
398 				cpu_to_le32(sizeof(AUTHENTICATE_MESSAGE));
399 	sec_blob->LmChallengeResponse.Length = 0;
400 	sec_blob->LmChallengeResponse.MaximumLength = 0;
401 
402 	sec_blob->NtChallengeResponse.BufferOffset = cpu_to_le32(tmp - pbuffer);
403 	if (ses->user_name != NULL) {
404 		rc = setup_ntlmv2_rsp(ses, nls_cp);
405 		if (rc) {
406 			cifs_dbg(VFS, "Error %d during NTLMSSP authentication\n", rc);
407 			goto setup_ntlmv2_ret;
408 		}
409 		memcpy(tmp, ses->auth_key.response + CIFS_SESS_KEY_SIZE,
410 				ses->auth_key.len - CIFS_SESS_KEY_SIZE);
411 		tmp += ses->auth_key.len - CIFS_SESS_KEY_SIZE;
412 
413 		sec_blob->NtChallengeResponse.Length =
414 				cpu_to_le16(ses->auth_key.len - CIFS_SESS_KEY_SIZE);
415 		sec_blob->NtChallengeResponse.MaximumLength =
416 				cpu_to_le16(ses->auth_key.len - CIFS_SESS_KEY_SIZE);
417 	} else {
418 		/*
419 		 * don't send an NT Response for anonymous access
420 		 */
421 		sec_blob->NtChallengeResponse.Length = 0;
422 		sec_blob->NtChallengeResponse.MaximumLength = 0;
423 	}
424 
425 	if (ses->domainName == NULL) {
426 		sec_blob->DomainName.BufferOffset = cpu_to_le32(tmp - pbuffer);
427 		sec_blob->DomainName.Length = 0;
428 		sec_blob->DomainName.MaximumLength = 0;
429 		tmp += 2;
430 	} else {
431 		int len;
432 		len = cifs_strtoUTF16((__le16 *)tmp, ses->domainName,
433 				      CIFS_MAX_USERNAME_LEN, nls_cp);
434 		len *= 2; /* unicode is 2 bytes each */
435 		sec_blob->DomainName.BufferOffset = cpu_to_le32(tmp - pbuffer);
436 		sec_blob->DomainName.Length = cpu_to_le16(len);
437 		sec_blob->DomainName.MaximumLength = cpu_to_le16(len);
438 		tmp += len;
439 	}
440 
441 	if (ses->user_name == NULL) {
442 		sec_blob->UserName.BufferOffset = cpu_to_le32(tmp - pbuffer);
443 		sec_blob->UserName.Length = 0;
444 		sec_blob->UserName.MaximumLength = 0;
445 		tmp += 2;
446 	} else {
447 		int len;
448 		len = cifs_strtoUTF16((__le16 *)tmp, ses->user_name,
449 				      CIFS_MAX_USERNAME_LEN, nls_cp);
450 		len *= 2; /* unicode is 2 bytes each */
451 		sec_blob->UserName.BufferOffset = cpu_to_le32(tmp - pbuffer);
452 		sec_blob->UserName.Length = cpu_to_le16(len);
453 		sec_blob->UserName.MaximumLength = cpu_to_le16(len);
454 		tmp += len;
455 	}
456 
457 	sec_blob->WorkstationName.BufferOffset = cpu_to_le32(tmp - pbuffer);
458 	sec_blob->WorkstationName.Length = 0;
459 	sec_blob->WorkstationName.MaximumLength = 0;
460 	tmp += 2;
461 
462 	if (((ses->ntlmssp->server_flags & NTLMSSP_NEGOTIATE_KEY_XCH) ||
463 		(ses->ntlmssp->server_flags & NTLMSSP_NEGOTIATE_EXTENDED_SEC))
464 			&& !calc_seckey(ses)) {
465 		memcpy(tmp, ses->ntlmssp->ciphertext, CIFS_CPHTXT_SIZE);
466 		sec_blob->SessionKey.BufferOffset = cpu_to_le32(tmp - pbuffer);
467 		sec_blob->SessionKey.Length = cpu_to_le16(CIFS_CPHTXT_SIZE);
468 		sec_blob->SessionKey.MaximumLength =
469 				cpu_to_le16(CIFS_CPHTXT_SIZE);
470 		tmp += CIFS_CPHTXT_SIZE;
471 	} else {
472 		sec_blob->SessionKey.BufferOffset = cpu_to_le32(tmp - pbuffer);
473 		sec_blob->SessionKey.Length = 0;
474 		sec_blob->SessionKey.MaximumLength = 0;
475 	}
476 
477 setup_ntlmv2_ret:
478 	*buflen = tmp - pbuffer;
479 	return rc;
480 }
481 
482 enum securityEnum
select_sectype(struct TCP_Server_Info * server,enum securityEnum requested)483 select_sectype(struct TCP_Server_Info *server, enum securityEnum requested)
484 {
485 	switch (server->negflavor) {
486 	case CIFS_NEGFLAVOR_EXTENDED:
487 		switch (requested) {
488 		case Kerberos:
489 		case RawNTLMSSP:
490 			return requested;
491 		case Unspecified:
492 			if (server->sec_ntlmssp &&
493 			    (global_secflags & CIFSSEC_MAY_NTLMSSP))
494 				return RawNTLMSSP;
495 			if ((server->sec_kerberos || server->sec_mskerberos) &&
496 			    (global_secflags & CIFSSEC_MAY_KRB5))
497 				return Kerberos;
498 			/* Fallthrough */
499 		default:
500 			return Unspecified;
501 		}
502 	case CIFS_NEGFLAVOR_UNENCAP:
503 		switch (requested) {
504 		case NTLM:
505 		case NTLMv2:
506 			return requested;
507 		case Unspecified:
508 			if (global_secflags & CIFSSEC_MAY_NTLMV2)
509 				return NTLMv2;
510 			if (global_secflags & CIFSSEC_MAY_NTLM)
511 				return NTLM;
512 		default:
513 			/* Fallthrough to attempt LANMAN authentication next */
514 			break;
515 		}
516 	case CIFS_NEGFLAVOR_LANMAN:
517 		switch (requested) {
518 		case LANMAN:
519 			return requested;
520 		case Unspecified:
521 			if (global_secflags & CIFSSEC_MAY_LANMAN)
522 				return LANMAN;
523 			/* Fallthrough */
524 		default:
525 			return Unspecified;
526 		}
527 	default:
528 		return Unspecified;
529 	}
530 }
531 
532 struct sess_data {
533 	unsigned int xid;
534 	struct cifs_ses *ses;
535 	struct nls_table *nls_cp;
536 	void (*func)(struct sess_data *);
537 	int result;
538 
539 	/* we will send the SMB in three pieces:
540 	 * a fixed length beginning part, an optional
541 	 * SPNEGO blob (which can be zero length), and a
542 	 * last part which will include the strings
543 	 * and rest of bcc area. This allows us to avoid
544 	 * a large buffer 17K allocation
545 	 */
546 	int buf0_type;
547 	struct kvec iov[3];
548 };
549 
550 static int
sess_alloc_buffer(struct sess_data * sess_data,int wct)551 sess_alloc_buffer(struct sess_data *sess_data, int wct)
552 {
553 	int rc;
554 	struct cifs_ses *ses = sess_data->ses;
555 	struct smb_hdr *smb_buf;
556 
557 	rc = small_smb_init_no_tc(SMB_COM_SESSION_SETUP_ANDX, wct, ses,
558 				  (void **)&smb_buf);
559 
560 	if (rc)
561 		return rc;
562 
563 	sess_data->iov[0].iov_base = (char *)smb_buf;
564 	sess_data->iov[0].iov_len = be32_to_cpu(smb_buf->smb_buf_length) + 4;
565 	/*
566 	 * This variable will be used to clear the buffer
567 	 * allocated above in case of any error in the calling function.
568 	 */
569 	sess_data->buf0_type = CIFS_SMALL_BUFFER;
570 
571 	/* 2000 big enough to fit max user, domain, NOS name etc. */
572 	sess_data->iov[2].iov_base = kmalloc(2000, GFP_KERNEL);
573 	if (!sess_data->iov[2].iov_base) {
574 		rc = -ENOMEM;
575 		goto out_free_smb_buf;
576 	}
577 
578 	return 0;
579 
580 out_free_smb_buf:
581 	kfree(smb_buf);
582 	sess_data->iov[0].iov_base = NULL;
583 	sess_data->iov[0].iov_len = 0;
584 	sess_data->buf0_type = CIFS_NO_BUFFER;
585 	return rc;
586 }
587 
588 static void
sess_free_buffer(struct sess_data * sess_data)589 sess_free_buffer(struct sess_data *sess_data)
590 {
591 
592 	free_rsp_buf(sess_data->buf0_type, sess_data->iov[0].iov_base);
593 	sess_data->buf0_type = CIFS_NO_BUFFER;
594 	kfree(sess_data->iov[2].iov_base);
595 }
596 
597 static int
sess_establish_session(struct sess_data * sess_data)598 sess_establish_session(struct sess_data *sess_data)
599 {
600 	struct cifs_ses *ses = sess_data->ses;
601 
602 	mutex_lock(&ses->server->srv_mutex);
603 	if (!ses->server->session_estab) {
604 		if (ses->server->sign) {
605 			ses->server->session_key.response =
606 				kmemdup(ses->auth_key.response,
607 				ses->auth_key.len, GFP_KERNEL);
608 			if (!ses->server->session_key.response) {
609 				mutex_unlock(&ses->server->srv_mutex);
610 				return -ENOMEM;
611 			}
612 			ses->server->session_key.len =
613 						ses->auth_key.len;
614 		}
615 		ses->server->sequence_number = 0x2;
616 		ses->server->session_estab = true;
617 	}
618 	mutex_unlock(&ses->server->srv_mutex);
619 
620 	cifs_dbg(FYI, "CIFS session established successfully\n");
621 	spin_lock(&GlobalMid_Lock);
622 	ses->status = CifsGood;
623 	ses->need_reconnect = false;
624 	spin_unlock(&GlobalMid_Lock);
625 
626 	return 0;
627 }
628 
629 static int
sess_sendreceive(struct sess_data * sess_data)630 sess_sendreceive(struct sess_data *sess_data)
631 {
632 	int rc;
633 	struct smb_hdr *smb_buf = (struct smb_hdr *) sess_data->iov[0].iov_base;
634 	__u16 count;
635 
636 	count = sess_data->iov[1].iov_len + sess_data->iov[2].iov_len;
637 	smb_buf->smb_buf_length =
638 		cpu_to_be32(be32_to_cpu(smb_buf->smb_buf_length) + count);
639 	put_bcc(count, smb_buf);
640 
641 	rc = SendReceive2(sess_data->xid, sess_data->ses,
642 			  sess_data->iov, 3 /* num_iovecs */,
643 			  &sess_data->buf0_type,
644 			  CIFS_LOG_ERROR);
645 
646 	return rc;
647 }
648 
649 /*
650  * LANMAN and plaintext are less secure and off by default.
651  * So we make this explicitly be turned on in kconfig (in the
652  * build) and turned on at runtime (changed from the default)
653  * in proc/fs/cifs or via mount parm.  Unfortunately this is
654  * needed for old Win (e.g. Win95), some obscure NAS and OS/2
655  */
656 #ifdef CONFIG_CIFS_WEAK_PW_HASH
657 static void
sess_auth_lanman(struct sess_data * sess_data)658 sess_auth_lanman(struct sess_data *sess_data)
659 {
660 	int rc = 0;
661 	struct smb_hdr *smb_buf;
662 	SESSION_SETUP_ANDX *pSMB;
663 	char *bcc_ptr;
664 	struct cifs_ses *ses = sess_data->ses;
665 	char lnm_session_key[CIFS_AUTH_RESP_SIZE];
666 	__u32 capabilities;
667 	__u16 bytes_remaining;
668 
669 	/* lanman 2 style sessionsetup */
670 	/* wct = 10 */
671 	rc = sess_alloc_buffer(sess_data, 10);
672 	if (rc)
673 		goto out;
674 
675 	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
676 	bcc_ptr = sess_data->iov[2].iov_base;
677 	capabilities = cifs_ssetup_hdr(ses, pSMB);
678 
679 	pSMB->req.hdr.Flags2 &= ~SMBFLG2_UNICODE;
680 
681 	if (ses->user_name != NULL) {
682 		/* no capabilities flags in old lanman negotiation */
683 		pSMB->old_req.PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
684 
685 		/* Calculate hash with password and copy into bcc_ptr.
686 		 * Encryption Key (stored as in cryptkey) gets used if the
687 		 * security mode bit in Negottiate Protocol response states
688 		 * to use challenge/response method (i.e. Password bit is 1).
689 		 */
690 		rc = calc_lanman_hash(ses->password, ses->server->cryptkey,
691 				      ses->server->sec_mode & SECMODE_PW_ENCRYPT ?
692 				      true : false, lnm_session_key);
693 
694 		memcpy(bcc_ptr, (char *)lnm_session_key, CIFS_AUTH_RESP_SIZE);
695 		bcc_ptr += CIFS_AUTH_RESP_SIZE;
696 	} else {
697 		pSMB->old_req.PasswordLength = 0;
698 	}
699 
700 	/*
701 	 * can not sign if LANMAN negotiated so no need
702 	 * to calculate signing key? but what if server
703 	 * changed to do higher than lanman dialect and
704 	 * we reconnected would we ever calc signing_key?
705 	 */
706 
707 	cifs_dbg(FYI, "Negotiating LANMAN setting up strings\n");
708 	/* Unicode not allowed for LANMAN dialects */
709 	ascii_ssetup_strings(&bcc_ptr, ses, sess_data->nls_cp);
710 
711 	sess_data->iov[2].iov_len = (long) bcc_ptr -
712 			(long) sess_data->iov[2].iov_base;
713 
714 	rc = sess_sendreceive(sess_data);
715 	if (rc)
716 		goto out;
717 
718 	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
719 	smb_buf = (struct smb_hdr *)sess_data->iov[0].iov_base;
720 
721 	/* lanman response has a word count of 3 */
722 	if (smb_buf->WordCount != 3) {
723 		rc = -EIO;
724 		cifs_dbg(VFS, "bad word count %d\n", smb_buf->WordCount);
725 		goto out;
726 	}
727 
728 	if (le16_to_cpu(pSMB->resp.Action) & GUEST_LOGIN)
729 		cifs_dbg(FYI, "Guest login\n"); /* BB mark SesInfo struct? */
730 
731 	ses->Suid = smb_buf->Uid;   /* UID left in wire format (le) */
732 	cifs_dbg(FYI, "UID = %llu\n", ses->Suid);
733 
734 	bytes_remaining = get_bcc(smb_buf);
735 	bcc_ptr = pByteArea(smb_buf);
736 
737 	/* BB check if Unicode and decode strings */
738 	if (bytes_remaining == 0) {
739 		/* no string area to decode, do nothing */
740 	} else if (smb_buf->Flags2 & SMBFLG2_UNICODE) {
741 		/* unicode string area must be word-aligned */
742 		if (((unsigned long) bcc_ptr - (unsigned long) smb_buf) % 2) {
743 			++bcc_ptr;
744 			--bytes_remaining;
745 		}
746 		decode_unicode_ssetup(&bcc_ptr, bytes_remaining, ses,
747 				      sess_data->nls_cp);
748 	} else {
749 		decode_ascii_ssetup(&bcc_ptr, bytes_remaining, ses,
750 				    sess_data->nls_cp);
751 	}
752 
753 	rc = sess_establish_session(sess_data);
754 out:
755 	sess_data->result = rc;
756 	sess_data->func = NULL;
757 	sess_free_buffer(sess_data);
758 }
759 
760 #endif
761 
762 static void
sess_auth_ntlm(struct sess_data * sess_data)763 sess_auth_ntlm(struct sess_data *sess_data)
764 {
765 	int rc = 0;
766 	struct smb_hdr *smb_buf;
767 	SESSION_SETUP_ANDX *pSMB;
768 	char *bcc_ptr;
769 	struct cifs_ses *ses = sess_data->ses;
770 	__u32 capabilities;
771 	__u16 bytes_remaining;
772 
773 	/* old style NTLM sessionsetup */
774 	/* wct = 13 */
775 	rc = sess_alloc_buffer(sess_data, 13);
776 	if (rc)
777 		goto out;
778 
779 	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
780 	bcc_ptr = sess_data->iov[2].iov_base;
781 	capabilities = cifs_ssetup_hdr(ses, pSMB);
782 
783 	pSMB->req_no_secext.Capabilities = cpu_to_le32(capabilities);
784 	if (ses->user_name != NULL) {
785 		pSMB->req_no_secext.CaseInsensitivePasswordLength =
786 				cpu_to_le16(CIFS_AUTH_RESP_SIZE);
787 		pSMB->req_no_secext.CaseSensitivePasswordLength =
788 				cpu_to_le16(CIFS_AUTH_RESP_SIZE);
789 
790 		/* calculate ntlm response and session key */
791 		rc = setup_ntlm_response(ses, sess_data->nls_cp);
792 		if (rc) {
793 			cifs_dbg(VFS, "Error %d during NTLM authentication\n",
794 					 rc);
795 			goto out;
796 		}
797 
798 		/* copy ntlm response */
799 		memcpy(bcc_ptr, ses->auth_key.response + CIFS_SESS_KEY_SIZE,
800 				CIFS_AUTH_RESP_SIZE);
801 		bcc_ptr += CIFS_AUTH_RESP_SIZE;
802 		memcpy(bcc_ptr, ses->auth_key.response + CIFS_SESS_KEY_SIZE,
803 				CIFS_AUTH_RESP_SIZE);
804 		bcc_ptr += CIFS_AUTH_RESP_SIZE;
805 	} else {
806 		pSMB->req_no_secext.CaseInsensitivePasswordLength = 0;
807 		pSMB->req_no_secext.CaseSensitivePasswordLength = 0;
808 	}
809 
810 	if (ses->capabilities & CAP_UNICODE) {
811 		/* unicode strings must be word aligned */
812 		if (sess_data->iov[0].iov_len % 2) {
813 			*bcc_ptr = 0;
814 			bcc_ptr++;
815 		}
816 		unicode_ssetup_strings(&bcc_ptr, ses, sess_data->nls_cp);
817 	} else {
818 		ascii_ssetup_strings(&bcc_ptr, ses, sess_data->nls_cp);
819 	}
820 
821 
822 	sess_data->iov[2].iov_len = (long) bcc_ptr -
823 			(long) sess_data->iov[2].iov_base;
824 
825 	rc = sess_sendreceive(sess_data);
826 	if (rc)
827 		goto out;
828 
829 	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
830 	smb_buf = (struct smb_hdr *)sess_data->iov[0].iov_base;
831 
832 	if (smb_buf->WordCount != 3) {
833 		rc = -EIO;
834 		cifs_dbg(VFS, "bad word count %d\n", smb_buf->WordCount);
835 		goto out;
836 	}
837 
838 	if (le16_to_cpu(pSMB->resp.Action) & GUEST_LOGIN)
839 		cifs_dbg(FYI, "Guest login\n"); /* BB mark SesInfo struct? */
840 
841 	ses->Suid = smb_buf->Uid;   /* UID left in wire format (le) */
842 	cifs_dbg(FYI, "UID = %llu\n", ses->Suid);
843 
844 	bytes_remaining = get_bcc(smb_buf);
845 	bcc_ptr = pByteArea(smb_buf);
846 
847 	/* BB check if Unicode and decode strings */
848 	if (bytes_remaining == 0) {
849 		/* no string area to decode, do nothing */
850 	} else if (smb_buf->Flags2 & SMBFLG2_UNICODE) {
851 		/* unicode string area must be word-aligned */
852 		if (((unsigned long) bcc_ptr - (unsigned long) smb_buf) % 2) {
853 			++bcc_ptr;
854 			--bytes_remaining;
855 		}
856 		decode_unicode_ssetup(&bcc_ptr, bytes_remaining, ses,
857 				      sess_data->nls_cp);
858 	} else {
859 		decode_ascii_ssetup(&bcc_ptr, bytes_remaining, ses,
860 				    sess_data->nls_cp);
861 	}
862 
863 	rc = sess_establish_session(sess_data);
864 out:
865 	sess_data->result = rc;
866 	sess_data->func = NULL;
867 	sess_free_buffer(sess_data);
868 	kfree(ses->auth_key.response);
869 	ses->auth_key.response = NULL;
870 }
871 
872 static void
sess_auth_ntlmv2(struct sess_data * sess_data)873 sess_auth_ntlmv2(struct sess_data *sess_data)
874 {
875 	int rc = 0;
876 	struct smb_hdr *smb_buf;
877 	SESSION_SETUP_ANDX *pSMB;
878 	char *bcc_ptr;
879 	struct cifs_ses *ses = sess_data->ses;
880 	__u32 capabilities;
881 	__u16 bytes_remaining;
882 
883 	/* old style NTLM sessionsetup */
884 	/* wct = 13 */
885 	rc = sess_alloc_buffer(sess_data, 13);
886 	if (rc)
887 		goto out;
888 
889 	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
890 	bcc_ptr = sess_data->iov[2].iov_base;
891 	capabilities = cifs_ssetup_hdr(ses, pSMB);
892 
893 	pSMB->req_no_secext.Capabilities = cpu_to_le32(capabilities);
894 
895 	/* LM2 password would be here if we supported it */
896 	pSMB->req_no_secext.CaseInsensitivePasswordLength = 0;
897 
898 	if (ses->user_name != NULL) {
899 		/* calculate nlmv2 response and session key */
900 		rc = setup_ntlmv2_rsp(ses, sess_data->nls_cp);
901 		if (rc) {
902 			cifs_dbg(VFS, "Error %d during NTLMv2 authentication\n", rc);
903 			goto out;
904 		}
905 
906 		memcpy(bcc_ptr, ses->auth_key.response + CIFS_SESS_KEY_SIZE,
907 				ses->auth_key.len - CIFS_SESS_KEY_SIZE);
908 		bcc_ptr += ses->auth_key.len - CIFS_SESS_KEY_SIZE;
909 
910 		/* set case sensitive password length after tilen may get
911 		 * assigned, tilen is 0 otherwise.
912 		 */
913 		pSMB->req_no_secext.CaseSensitivePasswordLength =
914 			cpu_to_le16(ses->auth_key.len - CIFS_SESS_KEY_SIZE);
915 	} else {
916 		pSMB->req_no_secext.CaseSensitivePasswordLength = 0;
917 	}
918 
919 	if (ses->capabilities & CAP_UNICODE) {
920 		if (sess_data->iov[0].iov_len % 2) {
921 			*bcc_ptr = 0;
922 			bcc_ptr++;
923 		}
924 		unicode_ssetup_strings(&bcc_ptr, ses, sess_data->nls_cp);
925 	} else {
926 		ascii_ssetup_strings(&bcc_ptr, ses, sess_data->nls_cp);
927 	}
928 
929 
930 	sess_data->iov[2].iov_len = (long) bcc_ptr -
931 			(long) sess_data->iov[2].iov_base;
932 
933 	rc = sess_sendreceive(sess_data);
934 	if (rc)
935 		goto out;
936 
937 	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
938 	smb_buf = (struct smb_hdr *)sess_data->iov[0].iov_base;
939 
940 	if (smb_buf->WordCount != 3) {
941 		rc = -EIO;
942 		cifs_dbg(VFS, "bad word count %d\n", smb_buf->WordCount);
943 		goto out;
944 	}
945 
946 	if (le16_to_cpu(pSMB->resp.Action) & GUEST_LOGIN)
947 		cifs_dbg(FYI, "Guest login\n"); /* BB mark SesInfo struct? */
948 
949 	ses->Suid = smb_buf->Uid;   /* UID left in wire format (le) */
950 	cifs_dbg(FYI, "UID = %llu\n", ses->Suid);
951 
952 	bytes_remaining = get_bcc(smb_buf);
953 	bcc_ptr = pByteArea(smb_buf);
954 
955 	/* BB check if Unicode and decode strings */
956 	if (bytes_remaining == 0) {
957 		/* no string area to decode, do nothing */
958 	} else if (smb_buf->Flags2 & SMBFLG2_UNICODE) {
959 		/* unicode string area must be word-aligned */
960 		if (((unsigned long) bcc_ptr - (unsigned long) smb_buf) % 2) {
961 			++bcc_ptr;
962 			--bytes_remaining;
963 		}
964 		decode_unicode_ssetup(&bcc_ptr, bytes_remaining, ses,
965 				      sess_data->nls_cp);
966 	} else {
967 		decode_ascii_ssetup(&bcc_ptr, bytes_remaining, ses,
968 				    sess_data->nls_cp);
969 	}
970 
971 	rc = sess_establish_session(sess_data);
972 out:
973 	sess_data->result = rc;
974 	sess_data->func = NULL;
975 	sess_free_buffer(sess_data);
976 	kfree(ses->auth_key.response);
977 	ses->auth_key.response = NULL;
978 }
979 
980 #ifdef CONFIG_CIFS_UPCALL
981 static void
sess_auth_kerberos(struct sess_data * sess_data)982 sess_auth_kerberos(struct sess_data *sess_data)
983 {
984 	int rc = 0;
985 	struct smb_hdr *smb_buf;
986 	SESSION_SETUP_ANDX *pSMB;
987 	char *bcc_ptr;
988 	struct cifs_ses *ses = sess_data->ses;
989 	__u32 capabilities;
990 	__u16 bytes_remaining;
991 	struct key *spnego_key = NULL;
992 	struct cifs_spnego_msg *msg;
993 	u16 blob_len;
994 
995 	/* extended security */
996 	/* wct = 12 */
997 	rc = sess_alloc_buffer(sess_data, 12);
998 	if (rc)
999 		goto out;
1000 
1001 	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1002 	bcc_ptr = sess_data->iov[2].iov_base;
1003 	capabilities = cifs_ssetup_hdr(ses, pSMB);
1004 
1005 	spnego_key = cifs_get_spnego_key(ses);
1006 	if (IS_ERR(spnego_key)) {
1007 		rc = PTR_ERR(spnego_key);
1008 		spnego_key = NULL;
1009 		goto out;
1010 	}
1011 
1012 	msg = spnego_key->payload.data[0];
1013 	/*
1014 	 * check version field to make sure that cifs.upcall is
1015 	 * sending us a response in an expected form
1016 	 */
1017 	if (msg->version != CIFS_SPNEGO_UPCALL_VERSION) {
1018 		cifs_dbg(VFS,
1019 		  "incorrect version of cifs.upcall (expected %d but got %d)",
1020 			      CIFS_SPNEGO_UPCALL_VERSION, msg->version);
1021 		rc = -EKEYREJECTED;
1022 		goto out_put_spnego_key;
1023 	}
1024 
1025 	ses->auth_key.response = kmemdup(msg->data, msg->sesskey_len,
1026 					 GFP_KERNEL);
1027 	if (!ses->auth_key.response) {
1028 		cifs_dbg(VFS, "Kerberos can't allocate (%u bytes) memory",
1029 				msg->sesskey_len);
1030 		rc = -ENOMEM;
1031 		goto out_put_spnego_key;
1032 	}
1033 	ses->auth_key.len = msg->sesskey_len;
1034 
1035 	pSMB->req.hdr.Flags2 |= SMBFLG2_EXT_SEC;
1036 	capabilities |= CAP_EXTENDED_SECURITY;
1037 	pSMB->req.Capabilities = cpu_to_le32(capabilities);
1038 	sess_data->iov[1].iov_base = msg->data + msg->sesskey_len;
1039 	sess_data->iov[1].iov_len = msg->secblob_len;
1040 	pSMB->req.SecurityBlobLength = cpu_to_le16(sess_data->iov[1].iov_len);
1041 
1042 	if (ses->capabilities & CAP_UNICODE) {
1043 		/* unicode strings must be word aligned */
1044 		if ((sess_data->iov[0].iov_len
1045 			+ sess_data->iov[1].iov_len) % 2) {
1046 			*bcc_ptr = 0;
1047 			bcc_ptr++;
1048 		}
1049 		unicode_oslm_strings(&bcc_ptr, sess_data->nls_cp);
1050 		unicode_domain_string(&bcc_ptr, ses, sess_data->nls_cp);
1051 	} else {
1052 		/* BB: is this right? */
1053 		ascii_ssetup_strings(&bcc_ptr, ses, sess_data->nls_cp);
1054 	}
1055 
1056 	sess_data->iov[2].iov_len = (long) bcc_ptr -
1057 			(long) sess_data->iov[2].iov_base;
1058 
1059 	rc = sess_sendreceive(sess_data);
1060 	if (rc)
1061 		goto out_put_spnego_key;
1062 
1063 	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1064 	smb_buf = (struct smb_hdr *)sess_data->iov[0].iov_base;
1065 
1066 	if (smb_buf->WordCount != 4) {
1067 		rc = -EIO;
1068 		cifs_dbg(VFS, "bad word count %d\n", smb_buf->WordCount);
1069 		goto out_put_spnego_key;
1070 	}
1071 
1072 	if (le16_to_cpu(pSMB->resp.Action) & GUEST_LOGIN)
1073 		cifs_dbg(FYI, "Guest login\n"); /* BB mark SesInfo struct? */
1074 
1075 	ses->Suid = smb_buf->Uid;   /* UID left in wire format (le) */
1076 	cifs_dbg(FYI, "UID = %llu\n", ses->Suid);
1077 
1078 	bytes_remaining = get_bcc(smb_buf);
1079 	bcc_ptr = pByteArea(smb_buf);
1080 
1081 	blob_len = le16_to_cpu(pSMB->resp.SecurityBlobLength);
1082 	if (blob_len > bytes_remaining) {
1083 		cifs_dbg(VFS, "bad security blob length %d\n",
1084 				blob_len);
1085 		rc = -EINVAL;
1086 		goto out_put_spnego_key;
1087 	}
1088 	bcc_ptr += blob_len;
1089 	bytes_remaining -= blob_len;
1090 
1091 	/* BB check if Unicode and decode strings */
1092 	if (bytes_remaining == 0) {
1093 		/* no string area to decode, do nothing */
1094 	} else if (smb_buf->Flags2 & SMBFLG2_UNICODE) {
1095 		/* unicode string area must be word-aligned */
1096 		if (((unsigned long) bcc_ptr - (unsigned long) smb_buf) % 2) {
1097 			++bcc_ptr;
1098 			--bytes_remaining;
1099 		}
1100 		decode_unicode_ssetup(&bcc_ptr, bytes_remaining, ses,
1101 				      sess_data->nls_cp);
1102 	} else {
1103 		decode_ascii_ssetup(&bcc_ptr, bytes_remaining, ses,
1104 				    sess_data->nls_cp);
1105 	}
1106 
1107 	rc = sess_establish_session(sess_data);
1108 out_put_spnego_key:
1109 	key_invalidate(spnego_key);
1110 	key_put(spnego_key);
1111 out:
1112 	sess_data->result = rc;
1113 	sess_data->func = NULL;
1114 	sess_free_buffer(sess_data);
1115 	kfree(ses->auth_key.response);
1116 	ses->auth_key.response = NULL;
1117 }
1118 
1119 #endif /* ! CONFIG_CIFS_UPCALL */
1120 
1121 /*
1122  * The required kvec buffers have to be allocated before calling this
1123  * function.
1124  */
1125 static int
_sess_auth_rawntlmssp_assemble_req(struct sess_data * sess_data)1126 _sess_auth_rawntlmssp_assemble_req(struct sess_data *sess_data)
1127 {
1128 	struct smb_hdr *smb_buf;
1129 	SESSION_SETUP_ANDX *pSMB;
1130 	struct cifs_ses *ses = sess_data->ses;
1131 	__u32 capabilities;
1132 	char *bcc_ptr;
1133 
1134 	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1135 	smb_buf = (struct smb_hdr *)pSMB;
1136 
1137 	capabilities = cifs_ssetup_hdr(ses, pSMB);
1138 	if ((pSMB->req.hdr.Flags2 & SMBFLG2_UNICODE) == 0) {
1139 		cifs_dbg(VFS, "NTLMSSP requires Unicode support\n");
1140 		return -ENOSYS;
1141 	}
1142 
1143 	pSMB->req.hdr.Flags2 |= SMBFLG2_EXT_SEC;
1144 	capabilities |= CAP_EXTENDED_SECURITY;
1145 	pSMB->req.Capabilities |= cpu_to_le32(capabilities);
1146 
1147 	bcc_ptr = sess_data->iov[2].iov_base;
1148 	/* unicode strings must be word aligned */
1149 	if ((sess_data->iov[0].iov_len + sess_data->iov[1].iov_len) % 2) {
1150 		*bcc_ptr = 0;
1151 		bcc_ptr++;
1152 	}
1153 	unicode_oslm_strings(&bcc_ptr, sess_data->nls_cp);
1154 
1155 	sess_data->iov[2].iov_len = (long) bcc_ptr -
1156 					(long) sess_data->iov[2].iov_base;
1157 
1158 	return 0;
1159 }
1160 
1161 static void
1162 sess_auth_rawntlmssp_authenticate(struct sess_data *sess_data);
1163 
1164 static void
sess_auth_rawntlmssp_negotiate(struct sess_data * sess_data)1165 sess_auth_rawntlmssp_negotiate(struct sess_data *sess_data)
1166 {
1167 	int rc;
1168 	struct smb_hdr *smb_buf;
1169 	SESSION_SETUP_ANDX *pSMB;
1170 	struct cifs_ses *ses = sess_data->ses;
1171 	__u16 bytes_remaining;
1172 	char *bcc_ptr;
1173 	u16 blob_len;
1174 
1175 	cifs_dbg(FYI, "rawntlmssp session setup negotiate phase\n");
1176 
1177 	/*
1178 	 * if memory allocation is successful, caller of this function
1179 	 * frees it.
1180 	 */
1181 	ses->ntlmssp = kmalloc(sizeof(struct ntlmssp_auth), GFP_KERNEL);
1182 	if (!ses->ntlmssp) {
1183 		rc = -ENOMEM;
1184 		goto out;
1185 	}
1186 	ses->ntlmssp->sesskey_per_smbsess = false;
1187 
1188 	/* wct = 12 */
1189 	rc = sess_alloc_buffer(sess_data, 12);
1190 	if (rc)
1191 		goto out;
1192 
1193 	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1194 
1195 	/* Build security blob before we assemble the request */
1196 	build_ntlmssp_negotiate_blob(pSMB->req.SecurityBlob, ses);
1197 	sess_data->iov[1].iov_len = sizeof(NEGOTIATE_MESSAGE);
1198 	sess_data->iov[1].iov_base = pSMB->req.SecurityBlob;
1199 	pSMB->req.SecurityBlobLength = cpu_to_le16(sizeof(NEGOTIATE_MESSAGE));
1200 
1201 	rc = _sess_auth_rawntlmssp_assemble_req(sess_data);
1202 	if (rc)
1203 		goto out;
1204 
1205 	rc = sess_sendreceive(sess_data);
1206 
1207 	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1208 	smb_buf = (struct smb_hdr *)sess_data->iov[0].iov_base;
1209 
1210 	/* If true, rc here is expected and not an error */
1211 	if (sess_data->buf0_type != CIFS_NO_BUFFER &&
1212 	    smb_buf->Status.CifsError ==
1213 			cpu_to_le32(NT_STATUS_MORE_PROCESSING_REQUIRED))
1214 		rc = 0;
1215 
1216 	if (rc)
1217 		goto out;
1218 
1219 	cifs_dbg(FYI, "rawntlmssp session setup challenge phase\n");
1220 
1221 	if (smb_buf->WordCount != 4) {
1222 		rc = -EIO;
1223 		cifs_dbg(VFS, "bad word count %d\n", smb_buf->WordCount);
1224 		goto out;
1225 	}
1226 
1227 	ses->Suid = smb_buf->Uid;   /* UID left in wire format (le) */
1228 	cifs_dbg(FYI, "UID = %llu\n", ses->Suid);
1229 
1230 	bytes_remaining = get_bcc(smb_buf);
1231 	bcc_ptr = pByteArea(smb_buf);
1232 
1233 	blob_len = le16_to_cpu(pSMB->resp.SecurityBlobLength);
1234 	if (blob_len > bytes_remaining) {
1235 		cifs_dbg(VFS, "bad security blob length %d\n",
1236 				blob_len);
1237 		rc = -EINVAL;
1238 		goto out;
1239 	}
1240 
1241 	rc = decode_ntlmssp_challenge(bcc_ptr, blob_len, ses);
1242 out:
1243 	sess_free_buffer(sess_data);
1244 
1245 	if (!rc) {
1246 		sess_data->func = sess_auth_rawntlmssp_authenticate;
1247 		return;
1248 	}
1249 
1250 	/* Else error. Cleanup */
1251 	kfree(ses->auth_key.response);
1252 	ses->auth_key.response = NULL;
1253 	kfree(ses->ntlmssp);
1254 	ses->ntlmssp = NULL;
1255 
1256 	sess_data->func = NULL;
1257 	sess_data->result = rc;
1258 }
1259 
1260 static void
sess_auth_rawntlmssp_authenticate(struct sess_data * sess_data)1261 sess_auth_rawntlmssp_authenticate(struct sess_data *sess_data)
1262 {
1263 	int rc;
1264 	struct smb_hdr *smb_buf;
1265 	SESSION_SETUP_ANDX *pSMB;
1266 	struct cifs_ses *ses = sess_data->ses;
1267 	__u16 bytes_remaining;
1268 	char *bcc_ptr;
1269 	char *ntlmsspblob = NULL;
1270 	u16 blob_len;
1271 
1272 	cifs_dbg(FYI, "rawntlmssp session setup authenticate phase\n");
1273 
1274 	/* wct = 12 */
1275 	rc = sess_alloc_buffer(sess_data, 12);
1276 	if (rc)
1277 		goto out;
1278 
1279 	/* Build security blob before we assemble the request */
1280 	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1281 	smb_buf = (struct smb_hdr *)pSMB;
1282 	/*
1283 	 * 5 is an empirical value, large enough to hold
1284 	 * authenticate message plus max 10 of av paris,
1285 	 * domain, user, workstation names, flags, etc.
1286 	 */
1287 	ntlmsspblob = kzalloc(5*sizeof(struct _AUTHENTICATE_MESSAGE),
1288 				GFP_KERNEL);
1289 	if (!ntlmsspblob) {
1290 		rc = -ENOMEM;
1291 		goto out;
1292 	}
1293 
1294 	rc = build_ntlmssp_auth_blob(ntlmsspblob,
1295 					&blob_len, ses, sess_data->nls_cp);
1296 	if (rc)
1297 		goto out_free_ntlmsspblob;
1298 	sess_data->iov[1].iov_len = blob_len;
1299 	sess_data->iov[1].iov_base = ntlmsspblob;
1300 	pSMB->req.SecurityBlobLength = cpu_to_le16(blob_len);
1301 	/*
1302 	 * Make sure that we tell the server that we are using
1303 	 * the uid that it just gave us back on the response
1304 	 * (challenge)
1305 	 */
1306 	smb_buf->Uid = ses->Suid;
1307 
1308 	rc = _sess_auth_rawntlmssp_assemble_req(sess_data);
1309 	if (rc)
1310 		goto out_free_ntlmsspblob;
1311 
1312 	rc = sess_sendreceive(sess_data);
1313 	if (rc)
1314 		goto out_free_ntlmsspblob;
1315 
1316 	pSMB = (SESSION_SETUP_ANDX *)sess_data->iov[0].iov_base;
1317 	smb_buf = (struct smb_hdr *)sess_data->iov[0].iov_base;
1318 	if (smb_buf->WordCount != 4) {
1319 		rc = -EIO;
1320 		cifs_dbg(VFS, "bad word count %d\n", smb_buf->WordCount);
1321 		goto out_free_ntlmsspblob;
1322 	}
1323 
1324 	if (le16_to_cpu(pSMB->resp.Action) & GUEST_LOGIN)
1325 		cifs_dbg(FYI, "Guest login\n"); /* BB mark SesInfo struct? */
1326 
1327 	if (ses->Suid != smb_buf->Uid) {
1328 		ses->Suid = smb_buf->Uid;
1329 		cifs_dbg(FYI, "UID changed! new UID = %llu\n", ses->Suid);
1330 	}
1331 
1332 	bytes_remaining = get_bcc(smb_buf);
1333 	bcc_ptr = pByteArea(smb_buf);
1334 	blob_len = le16_to_cpu(pSMB->resp.SecurityBlobLength);
1335 	if (blob_len > bytes_remaining) {
1336 		cifs_dbg(VFS, "bad security blob length %d\n",
1337 				blob_len);
1338 		rc = -EINVAL;
1339 		goto out_free_ntlmsspblob;
1340 	}
1341 	bcc_ptr += blob_len;
1342 	bytes_remaining -= blob_len;
1343 
1344 
1345 	/* BB check if Unicode and decode strings */
1346 	if (bytes_remaining == 0) {
1347 		/* no string area to decode, do nothing */
1348 	} else if (smb_buf->Flags2 & SMBFLG2_UNICODE) {
1349 		/* unicode string area must be word-aligned */
1350 		if (((unsigned long) bcc_ptr - (unsigned long) smb_buf) % 2) {
1351 			++bcc_ptr;
1352 			--bytes_remaining;
1353 		}
1354 		decode_unicode_ssetup(&bcc_ptr, bytes_remaining, ses,
1355 				      sess_data->nls_cp);
1356 	} else {
1357 		decode_ascii_ssetup(&bcc_ptr, bytes_remaining, ses,
1358 				    sess_data->nls_cp);
1359 	}
1360 
1361 out_free_ntlmsspblob:
1362 	kfree(ntlmsspblob);
1363 out:
1364 	sess_free_buffer(sess_data);
1365 
1366 	 if (!rc)
1367 		rc = sess_establish_session(sess_data);
1368 
1369 	/* Cleanup */
1370 	kfree(ses->auth_key.response);
1371 	ses->auth_key.response = NULL;
1372 	kfree(ses->ntlmssp);
1373 	ses->ntlmssp = NULL;
1374 
1375 	sess_data->func = NULL;
1376 	sess_data->result = rc;
1377 }
1378 
select_sec(struct cifs_ses * ses,struct sess_data * sess_data)1379 static int select_sec(struct cifs_ses *ses, struct sess_data *sess_data)
1380 {
1381 	int type;
1382 
1383 	type = select_sectype(ses->server, ses->sectype);
1384 	cifs_dbg(FYI, "sess setup type %d\n", type);
1385 	if (type == Unspecified) {
1386 		cifs_dbg(VFS,
1387 			"Unable to select appropriate authentication method!");
1388 		return -EINVAL;
1389 	}
1390 
1391 	switch (type) {
1392 	case LANMAN:
1393 		/* LANMAN and plaintext are less secure and off by default.
1394 		 * So we make this explicitly be turned on in kconfig (in the
1395 		 * build) and turned on at runtime (changed from the default)
1396 		 * in proc/fs/cifs or via mount parm.  Unfortunately this is
1397 		 * needed for old Win (e.g. Win95), some obscure NAS and OS/2 */
1398 #ifdef CONFIG_CIFS_WEAK_PW_HASH
1399 		sess_data->func = sess_auth_lanman;
1400 		break;
1401 #else
1402 		return -EOPNOTSUPP;
1403 #endif
1404 	case NTLM:
1405 		sess_data->func = sess_auth_ntlm;
1406 		break;
1407 	case NTLMv2:
1408 		sess_data->func = sess_auth_ntlmv2;
1409 		break;
1410 	case Kerberos:
1411 #ifdef CONFIG_CIFS_UPCALL
1412 		sess_data->func = sess_auth_kerberos;
1413 		break;
1414 #else
1415 		cifs_dbg(VFS, "Kerberos negotiated but upcall support disabled!\n");
1416 		return -ENOSYS;
1417 		break;
1418 #endif /* CONFIG_CIFS_UPCALL */
1419 	case RawNTLMSSP:
1420 		sess_data->func = sess_auth_rawntlmssp_negotiate;
1421 		break;
1422 	default:
1423 		cifs_dbg(VFS, "secType %d not supported!\n", type);
1424 		return -ENOSYS;
1425 	}
1426 
1427 	return 0;
1428 }
1429 
CIFS_SessSetup(const unsigned int xid,struct cifs_ses * ses,const struct nls_table * nls_cp)1430 int CIFS_SessSetup(const unsigned int xid, struct cifs_ses *ses,
1431 		    const struct nls_table *nls_cp)
1432 {
1433 	int rc = 0;
1434 	struct sess_data *sess_data;
1435 
1436 	if (ses == NULL) {
1437 		WARN(1, "%s: ses == NULL!", __func__);
1438 		return -EINVAL;
1439 	}
1440 
1441 	sess_data = kzalloc(sizeof(struct sess_data), GFP_KERNEL);
1442 	if (!sess_data)
1443 		return -ENOMEM;
1444 
1445 	rc = select_sec(ses, sess_data);
1446 	if (rc)
1447 		goto out;
1448 
1449 	sess_data->xid = xid;
1450 	sess_data->ses = ses;
1451 	sess_data->buf0_type = CIFS_NO_BUFFER;
1452 	sess_data->nls_cp = (struct nls_table *) nls_cp;
1453 
1454 	while (sess_data->func)
1455 		sess_data->func(sess_data);
1456 
1457 	/* Store result before we free sess_data */
1458 	rc = sess_data->result;
1459 
1460 out:
1461 	kfree(sess_data);
1462 	return rc;
1463 }
1464