sess.c revision 89f150f401c32b0a587dcb98d3bcfafe0b9c1c70
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 35extern void SMBNTencrypt(unsigned char *passwd, unsigned char *c8, 36 unsigned char *p24); 37 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 */ 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 117 return cpu_to_le16(vcnum); 118} 119 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 */ 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 */ 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); 132 pSMB->req.VcNumber = get_next_vcnum(ses); 133 134 /* Now no need to set SMBFLG_CASELESS or obsolete CANONICAL PATH */ 135 136 /* BB verify whether signing required on neg or just on auth frame 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 142 if (ses->server->secMode & 143 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) 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 } 158 if (ses->capabilities & CAP_UNIX) 159 capabilities |= CAP_UNIX; 160 161 return capabilities; 162} 163 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 210static void unicode_ssetup_strings(char **pbcc_area, struct cifsSesInfo *ses, 211 const struct nls_table *nls_cp) 212{ 213 char *bcc_ptr = *pbcc_area; 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 219 /* unicode strings, must be word aligned before the call */ 220/* if ((long) bcc_ptr % 2) { 221 *bcc_ptr = 0; 222 bcc_ptr++; 223 } */ 224 /* copy user */ 225 if (ses->userName == NULL) { 226 /* null user mount */ 227 *bcc_ptr = 0; 228 *(bcc_ptr+1) = 0; 229 } else { 230 bytes_ret = cifs_strtoUCS((__le16 *) bcc_ptr, ses->userName, 231 MAX_USERNAME_SIZE, nls_cp); 232 } 233 bcc_ptr += 2 * bytes_ret; 234 bcc_ptr += 2; /* account for null termination */ 235 236 unicode_domain_string(&bcc_ptr, ses, nls_cp); 237 unicode_oslm_strings(&bcc_ptr, nls_cp); 238 239 *pbcc_area = bcc_ptr; 240} 241 242static void ascii_ssetup_strings(char **pbcc_area, struct cifsSesInfo *ses, 243 const struct nls_table *nls_cp) 244{ 245 char *bcc_ptr = *pbcc_area; 246 247 /* copy user */ 248 /* BB what about null user mounts - check that we do this BB */ 249 /* copy user */ 250 if (ses->userName == NULL) { 251 /* BB what about null user mounts - check that we do this BB */ 252 } else { 253 strncpy(bcc_ptr, ses->userName, MAX_USERNAME_SIZE); 254 } 255 bcc_ptr += strnlen(ses->userName, MAX_USERNAME_SIZE); 256 *bcc_ptr = 0; 257 bcc_ptr++; /* account for null termination */ 258 259 /* copy domain */ 260 261 if (ses->domainName != NULL) { 262 strncpy(bcc_ptr, ses->domainName, 256); 263 bcc_ptr += strnlen(ses->domainName, 256); 264 } /* else we will send a null domain name 265 so the server will default to its own domain */ 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 "); 273 strcpy(bcc_ptr, init_utsname()->release); 274 bcc_ptr += strlen(init_utsname()->release) + 1; 275 276 strcpy(bcc_ptr, CIFS_NETWORK_OPSYS); 277 bcc_ptr += strlen(CIFS_NETWORK_OPSYS) + 1; 278 279 *pbcc_area = bcc_ptr; 280} 281 282static void 283decode_unicode_ssetup(char **pbcc_area, int bleft, struct cifsSesInfo *ses, 284 const struct nls_table *nls_cp) 285{ 286 int len; 287 char *data = *pbcc_area; 288 289 cFYI(1, "bleft %d", bleft); 290 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 } 303 304 kfree(ses->serverOS); 305 ses->serverOS = cifs_strndup_from_ucs(data, bleft, true, nls_cp); 306 cFYI(1, "serverOS=%s", ses->serverOS); 307 len = (UniStrnlen((wchar_t *) data, bleft / 2) * 2) + 2; 308 data += len; 309 bleft -= len; 310 if (bleft <= 0) 311 return; 312 313 kfree(ses->serverNOS); 314 ses->serverNOS = cifs_strndup_from_ucs(data, bleft, true, nls_cp); 315 cFYI(1, "serverNOS=%s", ses->serverNOS); 316 len = (UniStrnlen((wchar_t *) data, bleft / 2) * 2) + 2; 317 data += len; 318 bleft -= len; 319 if (bleft <= 0) 320 return; 321 322 kfree(ses->serverDomain); 323 ses->serverDomain = cifs_strndup_from_ucs(data, bleft, true, nls_cp); 324 cFYI(1, "serverDomain=%s", ses->serverDomain); 325 326 return; 327} 328 329static int decode_ascii_ssetup(char **pbcc_area, int bleft, 330 struct cifsSesInfo *ses, 331 const struct nls_table *nls_cp) 332{ 333 int rc = 0; 334 int len; 335 char *bcc_ptr = *pbcc_area; 336 337 cFYI(1, "decode sessetup ascii. bleft %d", bleft); 338 339 len = strnlen(bcc_ptr, bleft); 340 if (len >= bleft) 341 return rc; 342 343 kfree(ses->serverOS); 344 345 ses->serverOS = kzalloc(len + 1, GFP_KERNEL); 346 if (ses->serverOS) 347 strncpy(ses->serverOS, bcc_ptr, len); 348 if (strncmp(ses->serverOS, "OS/2", 4) == 0) { 349 cFYI(1, "OS/2 server"); 350 ses->flags |= CIFS_SES_OS2; 351 } 352 353 bcc_ptr += len + 1; 354 bleft -= len + 1; 355 356 len = strnlen(bcc_ptr, bleft); 357 if (len >= bleft) 358 return rc; 359 360 kfree(ses->serverNOS); 361 362 ses->serverNOS = kzalloc(len + 1, GFP_KERNEL); 363 if (ses->serverNOS) 364 strncpy(ses->serverNOS, bcc_ptr, len); 365 366 bcc_ptr += len + 1; 367 bleft -= len + 1; 368 369 len = strnlen(bcc_ptr, bleft); 370 if (len > bleft) 371 return rc; 372 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 */ 378 cFYI(1, "ascii: bytes left %d", bleft); 379 380 return rc; 381} 382 383static int decode_ntlmssp_challenge(char *bcc_ptr, int blob_len, 384 struct cifsSesInfo *ses) 385{ 386 unsigned int tioffset; /* challenge message target info area */ 387 unsigned int tilen; /* challenge message target info area length */ 388 389 CHALLENGE_MESSAGE *pblob = (CHALLENGE_MESSAGE *)bcc_ptr; 390 391 if (blob_len < sizeof(CHALLENGE_MESSAGE)) { 392 cERROR(1, "challenge blob len %d too small", blob_len); 393 return -EINVAL; 394 } 395 396 if (memcmp(pblob->Signature, "NTLMSSP", 8)) { 397 cERROR(1, "blob signature incorrect %s", pblob->Signature); 398 return -EINVAL; 399 } 400 if (pblob->MessageType != NtLmChallenge) { 401 cERROR(1, "Incorrect message type %d", pblob->MessageType); 402 return -EINVAL; 403 } 404 405 memcpy(ses->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 411 tioffset = cpu_to_le16(pblob->TargetInfoArray.BufferOffset); 412 tilen = cpu_to_le16(pblob->TargetInfoArray.Length); 413 ses->tilen = tilen; 414 if (ses->tilen) { 415 ses->tiblob = kmalloc(tilen, GFP_KERNEL); 416 if (!ses->tiblob) { 417 cERROR(1, "Challenge target info allocation failure"); 418 ses->tilen = 0; 419 return -ENOMEM; 420 } 421 memcpy(ses->tiblob, bcc_ptr + tioffset, ses->tilen); 422 } 423 424 return 0; 425} 426 427#ifdef CONFIG_CIFS_EXPERIMENTAL 428/* BB Move to ntlmssp.c eventually */ 429 430/* We do not malloc the blob, it is passed in pbuffer, because 431 it is fixed size, and small, making this approach cleaner */ 432static void build_ntlmssp_negotiate_blob(unsigned char *pbuffer, 433 struct cifsSesInfo *ses) 434{ 435 NEGOTIATE_MESSAGE *sec_blob = (NEGOTIATE_MESSAGE *)pbuffer; 436 __u32 flags; 437 438 memcpy(sec_blob->Signature, NTLMSSP_SIGNATURE, 8); 439 sec_blob->MessageType = NtLmNegotiate; 440 441 /* BB is NTLMV2 session security format easier to use here? */ 442 flags = NTLMSSP_NEGOTIATE_56 | NTLMSSP_REQUEST_TARGET | 443 NTLMSSP_NEGOTIATE_128 | NTLMSSP_NEGOTIATE_UNICODE | 444 NTLMSSP_NEGOTIATE_NTLM; 445 if (ses->server->secMode & 446 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) 447 flags |= NTLMSSP_NEGOTIATE_SIGN; 448 if (ses->server->secMode & SECMODE_SIGN_REQUIRED) 449 flags |= NTLMSSP_NEGOTIATE_ALWAYS_SIGN; 450 451 sec_blob->NegotiateFlags |= cpu_to_le32(flags); 452 453 sec_blob->WorkstationName.BufferOffset = 0; 454 sec_blob->WorkstationName.Length = 0; 455 sec_blob->WorkstationName.MaximumLength = 0; 456 457 /* Domain name is sent on the Challenge not Negotiate NTLMSSP request */ 458 sec_blob->DomainName.BufferOffset = 0; 459 sec_blob->DomainName.Length = 0; 460 sec_blob->DomainName.MaximumLength = 0; 461} 462 463/* We do not malloc the blob, it is passed in pbuffer, because its 464 maximum possible size is fixed and small, making this approach cleaner. 465 This function returns the length of the data in the blob */ 466static int build_ntlmssp_auth_blob(unsigned char *pbuffer, 467 u16 *buflen, 468 struct cifsSesInfo *ses, 469 const struct nls_table *nls_cp) 470{ 471 int rc; 472 unsigned int size; 473 AUTHENTICATE_MESSAGE *sec_blob = (AUTHENTICATE_MESSAGE *)pbuffer; 474 __u32 flags; 475 unsigned char *tmp; 476 struct ntlmv2_resp ntlmv2_response = {}; 477 478 memcpy(sec_blob->Signature, NTLMSSP_SIGNATURE, 8); 479 sec_blob->MessageType = NtLmAuthenticate; 480 481 flags = NTLMSSP_NEGOTIATE_56 | 482 NTLMSSP_REQUEST_TARGET | NTLMSSP_NEGOTIATE_TARGET_INFO | 483 NTLMSSP_NEGOTIATE_128 | NTLMSSP_NEGOTIATE_UNICODE | 484 NTLMSSP_NEGOTIATE_NTLM; 485 if (ses->server->secMode & 486 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) 487 flags |= NTLMSSP_NEGOTIATE_SIGN; 488 if (ses->server->secMode & SECMODE_SIGN_REQUIRED) 489 flags |= NTLMSSP_NEGOTIATE_ALWAYS_SIGN; 490 491 tmp = pbuffer + sizeof(AUTHENTICATE_MESSAGE); 492 sec_blob->NegotiateFlags |= cpu_to_le32(flags); 493 494 sec_blob->LmChallengeResponse.BufferOffset = 495 cpu_to_le32(sizeof(AUTHENTICATE_MESSAGE)); 496 sec_blob->LmChallengeResponse.Length = 0; 497 sec_blob->LmChallengeResponse.MaximumLength = 0; 498 499 sec_blob->NtChallengeResponse.BufferOffset = cpu_to_le32(tmp - pbuffer); 500 rc = setup_ntlmv2_rsp(ses, (char *)&ntlmv2_response, nls_cp); 501 if (rc) { 502 cERROR(1, "Error %d during NTLMSSP authentication", rc); 503 goto setup_ntlmv2_ret; 504 } 505 size = sizeof(struct ntlmv2_resp); 506 memcpy(tmp, (char *)&ntlmv2_response, size); 507 tmp += size; 508 if (ses->tilen > 0) { 509 memcpy(tmp, ses->tiblob, ses->tilen); 510 tmp += ses->tilen; 511 } 512 513 sec_blob->NtChallengeResponse.Length = cpu_to_le16(size + ses->tilen); 514 sec_blob->NtChallengeResponse.MaximumLength = 515 cpu_to_le16(size + ses->tilen); 516 kfree(ses->tiblob); 517 ses->tiblob = NULL; 518 ses->tilen = 0; 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 */ 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 */ 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 557 sec_blob->SessionKey.BufferOffset = cpu_to_le32(tmp - pbuffer); 558 sec_blob->SessionKey.Length = 0; 559 sec_blob->SessionKey.MaximumLength = 0; 560 561setup_ntlmv2_ret: 562 *buflen = tmp - pbuffer; 563 return rc; 564} 565 566 567static void setup_ntlmssp_neg_req(SESSION_SETUP_ANDX *pSMB, 568 struct cifsSesInfo *ses) 569{ 570 build_ntlmssp_negotiate_blob(&pSMB->req.SecurityBlob[0], ses); 571 pSMB->req.SecurityBlobLength = cpu_to_le16(sizeof(NEGOTIATE_MESSAGE)); 572 573 return; 574} 575#endif 576 577int 578CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, 579 const struct nls_table *nls_cp) 580{ 581 int rc = 0; 582 int wct; 583 struct smb_hdr *smb_buf; 584 char *bcc_ptr; 585 char *str_area; 586 SESSION_SETUP_ANDX *pSMB; 587 __u32 capabilities; 588 int count; 589 int resp_buf_type; 590 struct kvec iov[3]; 591 enum securityEnum type; 592 __u16 action; 593 int bytes_remaining; 594 struct key *spnego_key = NULL; 595 __le32 phase = NtLmNegotiate; /* NTLMSSP, if needed, is multistage */ 596 u16 blob_len; 597 char *ntlmsspblob = NULL; 598 599 if (ses == NULL) 600 return -EINVAL; 601 602 type = ses->server->secType; 603 604 cFYI(1, "sess setup type %d", type); 605ssetup_ntlmssp_authenticate: 606 if (phase == NtLmChallenge) 607 phase = NtLmAuthenticate; /* if ntlmssp, now final phase */ 608 609 if (type == LANMAN) { 610#ifndef CONFIG_CIFS_WEAK_PW_HASH 611 /* LANMAN and plaintext are less secure and off by default. 612 So we make this explicitly be turned on in kconfig (in the 613 build) and turned on at runtime (changed from the default) 614 in proc/fs/cifs or via mount parm. Unfortunately this is 615 needed for old Win (e.g. Win95), some obscure NAS and OS/2 */ 616 return -EOPNOTSUPP; 617#endif 618 wct = 10; /* lanman 2 style sessionsetup */ 619 } else if ((type == NTLM) || (type == NTLMv2)) { 620 /* For NTLMv2 failures eventually may need to retry NTLM */ 621 wct = 13; /* old style NTLM sessionsetup */ 622 } else /* same size: negotiate or auth, NTLMSSP or extended security */ 623 wct = 12; 624 625 rc = small_smb_init_no_tc(SMB_COM_SESSION_SETUP_ANDX, wct, ses, 626 (void **)&smb_buf); 627 if (rc) 628 return rc; 629 630 pSMB = (SESSION_SETUP_ANDX *)smb_buf; 631 632 capabilities = cifs_ssetup_hdr(ses, pSMB); 633 634 /* we will send the SMB in three pieces: 635 a fixed length beginning part, an optional 636 SPNEGO blob (which can be zero length), and a 637 last part which will include the strings 638 and rest of bcc area. This allows us to avoid 639 a large buffer 17K allocation */ 640 iov[0].iov_base = (char *)pSMB; 641 iov[0].iov_len = smb_buf->smb_buf_length + 4; 642 643 /* setting this here allows the code at the end of the function 644 to free the request buffer if there's an error */ 645 resp_buf_type = CIFS_SMALL_BUFFER; 646 647 /* 2000 big enough to fit max user, domain, NOS name etc. */ 648 str_area = kmalloc(2000, GFP_KERNEL); 649 if (str_area == NULL) { 650 rc = -ENOMEM; 651 goto ssetup_exit; 652 } 653 bcc_ptr = str_area; 654 655 ses->flags &= ~CIFS_SES_LANMAN; 656 657 iov[1].iov_base = NULL; 658 iov[1].iov_len = 0; 659 660 if (type == LANMAN) { 661#ifdef CONFIG_CIFS_WEAK_PW_HASH 662 char lnm_session_key[CIFS_SESS_KEY_SIZE]; 663 664 pSMB->req.hdr.Flags2 &= ~SMBFLG2_UNICODE; 665 666 /* no capabilities flags in old lanman negotiation */ 667 668 pSMB->old_req.PasswordLength = cpu_to_le16(CIFS_SESS_KEY_SIZE); 669 /* BB calculate hash with password */ 670 /* and copy into bcc */ 671 672 calc_lanman_hash(ses->password, ses->cryptKey, 673 ses->server->secMode & SECMODE_PW_ENCRYPT ? 674 true : false, lnm_session_key); 675 676 ses->flags |= CIFS_SES_LANMAN; 677 memcpy(bcc_ptr, (char *)lnm_session_key, CIFS_SESS_KEY_SIZE); 678 bcc_ptr += CIFS_SESS_KEY_SIZE; 679 680 /* can not sign if LANMAN negotiated so no need 681 to calculate signing key? but what if server 682 changed to do higher than lanman dialect and 683 we reconnected would we ever calc signing_key? */ 684 685 cFYI(1, "Negotiating LANMAN setting up strings"); 686 /* Unicode not allowed for LANMAN dialects */ 687 ascii_ssetup_strings(&bcc_ptr, ses, nls_cp); 688#endif 689 } else if (type == NTLM) { 690 char ntlm_session_key[CIFS_SESS_KEY_SIZE]; 691 692 pSMB->req_no_secext.Capabilities = cpu_to_le32(capabilities); 693 pSMB->req_no_secext.CaseInsensitivePasswordLength = 694 cpu_to_le16(CIFS_SESS_KEY_SIZE); 695 pSMB->req_no_secext.CaseSensitivePasswordLength = 696 cpu_to_le16(CIFS_SESS_KEY_SIZE); 697 698 /* calculate session key */ 699 SMBNTencrypt(ses->password, ses->cryptKey, ntlm_session_key); 700 701 cifs_calculate_session_key(&ses->auth_key, 702 ntlm_session_key, ses->password); 703 /* copy session key */ 704 memcpy(bcc_ptr, (char *)ntlm_session_key, CIFS_SESS_KEY_SIZE); 705 bcc_ptr += CIFS_SESS_KEY_SIZE; 706 memcpy(bcc_ptr, (char *)ntlm_session_key, CIFS_SESS_KEY_SIZE); 707 bcc_ptr += CIFS_SESS_KEY_SIZE; 708 if (ses->capabilities & CAP_UNICODE) { 709 /* unicode strings must be word aligned */ 710 if (iov[0].iov_len % 2) { 711 *bcc_ptr = 0; 712 bcc_ptr++; 713 } 714 unicode_ssetup_strings(&bcc_ptr, ses, nls_cp); 715 } else 716 ascii_ssetup_strings(&bcc_ptr, ses, nls_cp); 717 } else if (type == NTLMv2) { 718 char *v2_sess_key = 719 kmalloc(sizeof(struct ntlmv2_resp), GFP_KERNEL); 720 721 /* BB FIXME change all users of v2_sess_key to 722 struct ntlmv2_resp */ 723 724 if (v2_sess_key == NULL) { 725 rc = -ENOMEM; 726 goto ssetup_exit; 727 } 728 729 pSMB->req_no_secext.Capabilities = cpu_to_le32(capabilities); 730 731 /* LM2 password would be here if we supported it */ 732 pSMB->req_no_secext.CaseInsensitivePasswordLength = 0; 733 /* cpu_to_le16(LM2_SESS_KEY_SIZE); */ 734 735 /* calculate session key */ 736 rc = setup_ntlmv2_rsp(ses, v2_sess_key, nls_cp); 737 if (rc) { 738 cERROR(1, "Error %d during NTLMv2 authentication", rc); 739 kfree(v2_sess_key); 740 goto ssetup_exit; 741 } 742 memcpy(bcc_ptr, (char *)v2_sess_key, 743 sizeof(struct ntlmv2_resp)); 744 bcc_ptr += sizeof(struct ntlmv2_resp); 745 kfree(v2_sess_key); 746 /* set case sensitive password length after tilen may get 747 * assigned, tilen is 0 otherwise. 748 */ 749 pSMB->req_no_secext.CaseSensitivePasswordLength = 750 cpu_to_le16(sizeof(struct ntlmv2_resp) + ses->tilen); 751 if (ses->tilen > 0) { 752 memcpy(bcc_ptr, ses->tiblob, ses->tilen); 753 bcc_ptr += ses->tilen; 754 /* we never did allocate ses->domainName to free */ 755 kfree(ses->tiblob); 756 ses->tiblob = NULL; 757 ses->tilen = 0; 758 } 759 760 if (ses->capabilities & CAP_UNICODE) { 761 if (iov[0].iov_len % 2) { 762 *bcc_ptr = 0; 763 bcc_ptr++; 764 } 765 unicode_ssetup_strings(&bcc_ptr, ses, nls_cp); 766 } else 767 ascii_ssetup_strings(&bcc_ptr, ses, nls_cp); 768 } else if (type == Kerberos) { 769#ifdef CONFIG_CIFS_UPCALL 770 struct cifs_spnego_msg *msg; 771 spnego_key = cifs_get_spnego_key(ses); 772 if (IS_ERR(spnego_key)) { 773 rc = PTR_ERR(spnego_key); 774 spnego_key = NULL; 775 goto ssetup_exit; 776 } 777 778 msg = spnego_key->payload.data; 779 /* check version field to make sure that cifs.upcall is 780 sending us a response in an expected form */ 781 if (msg->version != CIFS_SPNEGO_UPCALL_VERSION) { 782 cERROR(1, "incorrect version of cifs.upcall (expected" 783 " %d but got %d)", 784 CIFS_SPNEGO_UPCALL_VERSION, msg->version); 785 rc = -EKEYREJECTED; 786 goto ssetup_exit; 787 } 788 /* bail out if key is too long */ 789 if (msg->sesskey_len > 790 sizeof(ses->auth_key.data.krb5)) { 791 cERROR(1, "Kerberos signing key too long (%u bytes)", 792 msg->sesskey_len); 793 rc = -EOVERFLOW; 794 goto ssetup_exit; 795 } 796 ses->auth_key.len = msg->sesskey_len; 797 memcpy(ses->auth_key.data.krb5, msg->data, msg->sesskey_len); 798 pSMB->req.hdr.Flags2 |= SMBFLG2_EXT_SEC; 799 capabilities |= CAP_EXTENDED_SECURITY; 800 pSMB->req.Capabilities = cpu_to_le32(capabilities); 801 iov[1].iov_base = msg->data + msg->sesskey_len; 802 iov[1].iov_len = msg->secblob_len; 803 pSMB->req.SecurityBlobLength = cpu_to_le16(iov[1].iov_len); 804 805 if (ses->capabilities & CAP_UNICODE) { 806 /* unicode strings must be word aligned */ 807 if ((iov[0].iov_len + iov[1].iov_len) % 2) { 808 *bcc_ptr = 0; 809 bcc_ptr++; 810 } 811 unicode_oslm_strings(&bcc_ptr, nls_cp); 812 unicode_domain_string(&bcc_ptr, ses, nls_cp); 813 } else 814 /* BB: is this right? */ 815 ascii_ssetup_strings(&bcc_ptr, ses, nls_cp); 816#else /* ! CONFIG_CIFS_UPCALL */ 817 cERROR(1, "Kerberos negotiated but upcall support disabled!"); 818 rc = -ENOSYS; 819 goto ssetup_exit; 820#endif /* CONFIG_CIFS_UPCALL */ 821 } else { 822#ifdef CONFIG_CIFS_EXPERIMENTAL 823 if (type == RawNTLMSSP) { 824 if ((pSMB->req.hdr.Flags2 & SMBFLG2_UNICODE) == 0) { 825 cERROR(1, "NTLMSSP requires Unicode support"); 826 rc = -ENOSYS; 827 goto ssetup_exit; 828 } 829 830 cFYI(1, "ntlmssp session setup phase %d", phase); 831 pSMB->req.hdr.Flags2 |= SMBFLG2_EXT_SEC; 832 capabilities |= CAP_EXTENDED_SECURITY; 833 pSMB->req.Capabilities |= cpu_to_le32(capabilities); 834 if (phase == NtLmNegotiate) { 835 setup_ntlmssp_neg_req(pSMB, ses); 836 iov[1].iov_len = sizeof(NEGOTIATE_MESSAGE); 837 iov[1].iov_base = &pSMB->req.SecurityBlob[0]; 838 } else if (phase == NtLmAuthenticate) { 839 /* 5 is an empirical value, large enought to 840 * hold authenticate message, max 10 of 841 * av paris, doamin,user,workstation mames, 842 * flags etc.. 843 */ 844 ntlmsspblob = kmalloc( 845 5*sizeof(struct _AUTHENTICATE_MESSAGE), 846 GFP_KERNEL); 847 if (!ntlmsspblob) { 848 cERROR(1, "Can't allocate NTLMSSP"); 849 rc = -ENOMEM; 850 goto ssetup_exit; 851 } 852 853 rc = build_ntlmssp_auth_blob(ntlmsspblob, 854 &blob_len, ses, nls_cp); 855 if (rc) 856 goto ssetup_exit; 857 iov[1].iov_len = blob_len; 858 iov[1].iov_base = ntlmsspblob; 859 pSMB->req.SecurityBlobLength = 860 cpu_to_le16(blob_len); 861 /* Make sure that we tell the server that we 862 are using the uid that it just gave us back 863 on the response (challenge) */ 864 smb_buf->Uid = ses->Suid; 865 } else { 866 cERROR(1, "invalid phase %d", phase); 867 rc = -ENOSYS; 868 goto ssetup_exit; 869 } 870 /* unicode strings must be word aligned */ 871 if ((iov[0].iov_len + iov[1].iov_len) % 2) { 872 *bcc_ptr = 0; 873 bcc_ptr++; 874 } 875 unicode_oslm_strings(&bcc_ptr, nls_cp); 876 } else { 877 cERROR(1, "secType %d not supported!", type); 878 rc = -ENOSYS; 879 goto ssetup_exit; 880 } 881#else 882 cERROR(1, "secType %d not supported!", type); 883 rc = -ENOSYS; 884 goto ssetup_exit; 885#endif 886 } 887 888 iov[2].iov_base = str_area; 889 iov[2].iov_len = (long) bcc_ptr - (long) str_area; 890 891 count = iov[1].iov_len + iov[2].iov_len; 892 smb_buf->smb_buf_length += count; 893 894 BCC_LE(smb_buf) = cpu_to_le16(count); 895 896 rc = SendReceive2(xid, ses, iov, 3 /* num_iovecs */, &resp_buf_type, 897 CIFS_STD_OP /* not long */ | CIFS_LOG_ERROR); 898 /* SMB request buf freed in SendReceive2 */ 899 900 cFYI(1, "ssetup rc from sendrecv2 is %d", rc); 901 902 pSMB = (SESSION_SETUP_ANDX *)iov[0].iov_base; 903 smb_buf = (struct smb_hdr *)iov[0].iov_base; 904 905 if ((type == RawNTLMSSP) && (smb_buf->Status.CifsError == 906 cpu_to_le32(NT_STATUS_MORE_PROCESSING_REQUIRED))) { 907 if (phase != NtLmNegotiate) { 908 cERROR(1, "Unexpected more processing error"); 909 goto ssetup_exit; 910 } 911 /* NTLMSSP Negotiate sent now processing challenge (response) */ 912 phase = NtLmChallenge; /* process ntlmssp challenge */ 913 rc = 0; /* MORE_PROC rc is not an error here, but expected */ 914 } 915 if (rc) 916 goto ssetup_exit; 917 918 if ((smb_buf->WordCount != 3) && (smb_buf->WordCount != 4)) { 919 rc = -EIO; 920 cERROR(1, "bad word count %d", smb_buf->WordCount); 921 goto ssetup_exit; 922 } 923 action = le16_to_cpu(pSMB->resp.Action); 924 if (action & GUEST_LOGIN) 925 cFYI(1, "Guest login"); /* BB mark SesInfo struct? */ 926 ses->Suid = smb_buf->Uid; /* UID left in wire format (le) */ 927 cFYI(1, "UID = %d ", ses->Suid); 928 /* response can have either 3 or 4 word count - Samba sends 3 */ 929 /* and lanman response is 3 */ 930 bytes_remaining = BCC(smb_buf); 931 bcc_ptr = pByteArea(smb_buf); 932 933 if (smb_buf->WordCount == 4) { 934 blob_len = le16_to_cpu(pSMB->resp.SecurityBlobLength); 935 if (blob_len > bytes_remaining) { 936 cERROR(1, "bad security blob length %d", blob_len); 937 rc = -EINVAL; 938 goto ssetup_exit; 939 } 940 if (phase == NtLmChallenge) { 941 rc = decode_ntlmssp_challenge(bcc_ptr, blob_len, ses); 942 /* now goto beginning for ntlmssp authenticate phase */ 943 if (rc) 944 goto ssetup_exit; 945 } 946 bcc_ptr += blob_len; 947 bytes_remaining -= blob_len; 948 } 949 950 /* BB check if Unicode and decode strings */ 951 if (smb_buf->Flags2 & SMBFLG2_UNICODE) { 952 /* unicode string area must be word-aligned */ 953 if (((unsigned long) bcc_ptr - (unsigned long) smb_buf) % 2) { 954 ++bcc_ptr; 955 --bytes_remaining; 956 } 957 decode_unicode_ssetup(&bcc_ptr, bytes_remaining, ses, nls_cp); 958 } else { 959 rc = decode_ascii_ssetup(&bcc_ptr, bytes_remaining, 960 ses, nls_cp); 961 } 962 963ssetup_exit: 964 if (spnego_key) { 965 key_revoke(spnego_key); 966 key_put(spnego_key); 967 } 968 kfree(str_area); 969 kfree(ntlmsspblob); 970 ntlmsspblob = NULL; 971 if (resp_buf_type == CIFS_SMALL_BUFFER) { 972 cFYI(1, "ssetup freeing small buf %p", iov[0].iov_base); 973 cifs_small_buf_release(iov[0].iov_base); 974 } else if (resp_buf_type == CIFS_LARGE_BUFFER) 975 cifs_buf_release(iov[0].iov_base); 976 977 /* if ntlmssp, and negotiate succeeded, proceed to authenticate phase */ 978 if ((phase == NtLmChallenge) && (rc == 0)) 979 goto ssetup_ntlmssp_authenticate; 980 981 return rc; 982} 983