|
@@ -400,19 +400,27 @@ int build_ntlmssp_auth_blob(unsigned char *pbuffer,
|
|
sec_blob->LmChallengeResponse.MaximumLength = 0;
|
|
sec_blob->LmChallengeResponse.MaximumLength = 0;
|
|
|
|
|
|
sec_blob->NtChallengeResponse.BufferOffset = cpu_to_le32(tmp - pbuffer);
|
|
sec_blob->NtChallengeResponse.BufferOffset = cpu_to_le32(tmp - pbuffer);
|
|
- rc = setup_ntlmv2_rsp(ses, nls_cp);
|
|
|
|
- if (rc) {
|
|
|
|
- cifs_dbg(VFS, "Error %d during NTLMSSP authentication\n", rc);
|
|
|
|
- goto setup_ntlmv2_ret;
|
|
|
|
|
|
+ if (ses->user_name != NULL) {
|
|
|
|
+ rc = setup_ntlmv2_rsp(ses, nls_cp);
|
|
|
|
+ if (rc) {
|
|
|
|
+ cifs_dbg(VFS, "Error %d during NTLMSSP authentication\n", rc);
|
|
|
|
+ goto setup_ntlmv2_ret;
|
|
|
|
+ }
|
|
|
|
+ memcpy(tmp, ses->auth_key.response + CIFS_SESS_KEY_SIZE,
|
|
|
|
+ ses->auth_key.len - CIFS_SESS_KEY_SIZE);
|
|
|
|
+ tmp += ses->auth_key.len - CIFS_SESS_KEY_SIZE;
|
|
|
|
+
|
|
|
|
+ sec_blob->NtChallengeResponse.Length =
|
|
|
|
+ cpu_to_le16(ses->auth_key.len - CIFS_SESS_KEY_SIZE);
|
|
|
|
+ sec_blob->NtChallengeResponse.MaximumLength =
|
|
|
|
+ cpu_to_le16(ses->auth_key.len - CIFS_SESS_KEY_SIZE);
|
|
|
|
+ } else {
|
|
|
|
+ /*
|
|
|
|
+ * don't send an NT Response for anonymous access
|
|
|
|
+ */
|
|
|
|
+ sec_blob->NtChallengeResponse.Length = 0;
|
|
|
|
+ sec_blob->NtChallengeResponse.MaximumLength = 0;
|
|
}
|
|
}
|
|
- memcpy(tmp, ses->auth_key.response + CIFS_SESS_KEY_SIZE,
|
|
|
|
- ses->auth_key.len - CIFS_SESS_KEY_SIZE);
|
|
|
|
- tmp += ses->auth_key.len - CIFS_SESS_KEY_SIZE;
|
|
|
|
-
|
|
|
|
- sec_blob->NtChallengeResponse.Length =
|
|
|
|
- cpu_to_le16(ses->auth_key.len - CIFS_SESS_KEY_SIZE);
|
|
|
|
- sec_blob->NtChallengeResponse.MaximumLength =
|
|
|
|
- cpu_to_le16(ses->auth_key.len - CIFS_SESS_KEY_SIZE);
|
|
|
|
|
|
|
|
if (ses->domainName == NULL) {
|
|
if (ses->domainName == NULL) {
|
|
sec_blob->DomainName.BufferOffset = cpu_to_le32(tmp - pbuffer);
|
|
sec_blob->DomainName.BufferOffset = cpu_to_le32(tmp - pbuffer);
|
|
@@ -670,20 +678,24 @@ sess_auth_lanman(struct sess_data *sess_data)
|
|
|
|
|
|
pSMB->req.hdr.Flags2 &= ~SMBFLG2_UNICODE;
|
|
pSMB->req.hdr.Flags2 &= ~SMBFLG2_UNICODE;
|
|
|
|
|
|
- /* no capabilities flags in old lanman negotiation */
|
|
|
|
- pSMB->old_req.PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
|
|
|
|
-
|
|
|
|
- /* Calculate hash with password and copy into bcc_ptr.
|
|
|
|
- * Encryption Key (stored as in cryptkey) gets used if the
|
|
|
|
- * security mode bit in Negottiate Protocol response states
|
|
|
|
- * to use challenge/response method (i.e. Password bit is 1).
|
|
|
|
- */
|
|
|
|
- rc = calc_lanman_hash(ses->password, ses->server->cryptkey,
|
|
|
|
- ses->server->sec_mode & SECMODE_PW_ENCRYPT ?
|
|
|
|
- true : false, lnm_session_key);
|
|
|
|
-
|
|
|
|
- memcpy(bcc_ptr, (char *)lnm_session_key, CIFS_AUTH_RESP_SIZE);
|
|
|
|
- bcc_ptr += CIFS_AUTH_RESP_SIZE;
|
|
|
|
|
|
+ if (ses->user_name != NULL) {
|
|
|
|
+ /* no capabilities flags in old lanman negotiation */
|
|
|
|
+ pSMB->old_req.PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE);
|
|
|
|
+
|
|
|
|
+ /* Calculate hash with password and copy into bcc_ptr.
|
|
|
|
+ * Encryption Key (stored as in cryptkey) gets used if the
|
|
|
|
+ * security mode bit in Negottiate Protocol response states
|
|
|
|
+ * to use challenge/response method (i.e. Password bit is 1).
|
|
|
|
+ */
|
|
|
|
+ rc = calc_lanman_hash(ses->password, ses->server->cryptkey,
|
|
|
|
+ ses->server->sec_mode & SECMODE_PW_ENCRYPT ?
|
|
|
|
+ true : false, lnm_session_key);
|
|
|
|
+
|
|
|
|
+ memcpy(bcc_ptr, (char *)lnm_session_key, CIFS_AUTH_RESP_SIZE);
|
|
|
|
+ bcc_ptr += CIFS_AUTH_RESP_SIZE;
|
|
|
|
+ } else {
|
|
|
|
+ pSMB->old_req.PasswordLength = 0;
|
|
|
|
+ }
|
|
|
|
|
|
/*
|
|
/*
|
|
* can not sign if LANMAN negotiated so no need
|
|
* can not sign if LANMAN negotiated so no need
|
|
@@ -769,26 +781,31 @@ sess_auth_ntlm(struct sess_data *sess_data)
|
|
capabilities = cifs_ssetup_hdr(ses, pSMB);
|
|
capabilities = cifs_ssetup_hdr(ses, pSMB);
|
|
|
|
|
|
pSMB->req_no_secext.Capabilities = cpu_to_le32(capabilities);
|
|
pSMB->req_no_secext.Capabilities = cpu_to_le32(capabilities);
|
|
- pSMB->req_no_secext.CaseInsensitivePasswordLength =
|
|
|
|
- cpu_to_le16(CIFS_AUTH_RESP_SIZE);
|
|
|
|
- pSMB->req_no_secext.CaseSensitivePasswordLength =
|
|
|
|
- cpu_to_le16(CIFS_AUTH_RESP_SIZE);
|
|
|
|
-
|
|
|
|
- /* calculate ntlm response and session key */
|
|
|
|
- rc = setup_ntlm_response(ses, sess_data->nls_cp);
|
|
|
|
- if (rc) {
|
|
|
|
- cifs_dbg(VFS, "Error %d during NTLM authentication\n",
|
|
|
|
- rc);
|
|
|
|
- goto out;
|
|
|
|
- }
|
|
|
|
|
|
+ if (ses->user_name != NULL) {
|
|
|
|
+ pSMB->req_no_secext.CaseInsensitivePasswordLength =
|
|
|
|
+ cpu_to_le16(CIFS_AUTH_RESP_SIZE);
|
|
|
|
+ pSMB->req_no_secext.CaseSensitivePasswordLength =
|
|
|
|
+ cpu_to_le16(CIFS_AUTH_RESP_SIZE);
|
|
|
|
+
|
|
|
|
+ /* calculate ntlm response and session key */
|
|
|
|
+ rc = setup_ntlm_response(ses, sess_data->nls_cp);
|
|
|
|
+ if (rc) {
|
|
|
|
+ cifs_dbg(VFS, "Error %d during NTLM authentication\n",
|
|
|
|
+ rc);
|
|
|
|
+ goto out;
|
|
|
|
+ }
|
|
|
|
|
|
- /* copy ntlm response */
|
|
|
|
- memcpy(bcc_ptr, ses->auth_key.response + CIFS_SESS_KEY_SIZE,
|
|
|
|
- CIFS_AUTH_RESP_SIZE);
|
|
|
|
- bcc_ptr += CIFS_AUTH_RESP_SIZE;
|
|
|
|
- memcpy(bcc_ptr, ses->auth_key.response + CIFS_SESS_KEY_SIZE,
|
|
|
|
- CIFS_AUTH_RESP_SIZE);
|
|
|
|
- bcc_ptr += CIFS_AUTH_RESP_SIZE;
|
|
|
|
|
|
+ /* copy ntlm response */
|
|
|
|
+ memcpy(bcc_ptr, ses->auth_key.response + CIFS_SESS_KEY_SIZE,
|
|
|
|
+ CIFS_AUTH_RESP_SIZE);
|
|
|
|
+ bcc_ptr += CIFS_AUTH_RESP_SIZE;
|
|
|
|
+ memcpy(bcc_ptr, ses->auth_key.response + CIFS_SESS_KEY_SIZE,
|
|
|
|
+ CIFS_AUTH_RESP_SIZE);
|
|
|
|
+ bcc_ptr += CIFS_AUTH_RESP_SIZE;
|
|
|
|
+ } else {
|
|
|
|
+ pSMB->req_no_secext.CaseInsensitivePasswordLength = 0;
|
|
|
|
+ pSMB->req_no_secext.CaseSensitivePasswordLength = 0;
|
|
|
|
+ }
|
|
|
|
|
|
if (ses->capabilities & CAP_UNICODE) {
|
|
if (ses->capabilities & CAP_UNICODE) {
|
|
/* unicode strings must be word aligned */
|
|
/* unicode strings must be word aligned */
|
|
@@ -878,22 +895,26 @@ sess_auth_ntlmv2(struct sess_data *sess_data)
|
|
/* LM2 password would be here if we supported it */
|
|
/* LM2 password would be here if we supported it */
|
|
pSMB->req_no_secext.CaseInsensitivePasswordLength = 0;
|
|
pSMB->req_no_secext.CaseInsensitivePasswordLength = 0;
|
|
|
|
|
|
- /* calculate nlmv2 response and session key */
|
|
|
|
- rc = setup_ntlmv2_rsp(ses, sess_data->nls_cp);
|
|
|
|
- if (rc) {
|
|
|
|
- cifs_dbg(VFS, "Error %d during NTLMv2 authentication\n", rc);
|
|
|
|
- goto out;
|
|
|
|
- }
|
|
|
|
|
|
+ if (ses->user_name != NULL) {
|
|
|
|
+ /* calculate nlmv2 response and session key */
|
|
|
|
+ rc = setup_ntlmv2_rsp(ses, sess_data->nls_cp);
|
|
|
|
+ if (rc) {
|
|
|
|
+ cifs_dbg(VFS, "Error %d during NTLMv2 authentication\n", rc);
|
|
|
|
+ goto out;
|
|
|
|
+ }
|
|
|
|
|
|
- memcpy(bcc_ptr, ses->auth_key.response + CIFS_SESS_KEY_SIZE,
|
|
|
|
- ses->auth_key.len - CIFS_SESS_KEY_SIZE);
|
|
|
|
- bcc_ptr += ses->auth_key.len - CIFS_SESS_KEY_SIZE;
|
|
|
|
|
|
+ memcpy(bcc_ptr, ses->auth_key.response + CIFS_SESS_KEY_SIZE,
|
|
|
|
+ ses->auth_key.len - CIFS_SESS_KEY_SIZE);
|
|
|
|
+ bcc_ptr += ses->auth_key.len - CIFS_SESS_KEY_SIZE;
|
|
|
|
|
|
- /* set case sensitive password length after tilen may get
|
|
|
|
- * assigned, tilen is 0 otherwise.
|
|
|
|
- */
|
|
|
|
- pSMB->req_no_secext.CaseSensitivePasswordLength =
|
|
|
|
- cpu_to_le16(ses->auth_key.len - CIFS_SESS_KEY_SIZE);
|
|
|
|
|
|
+ /* set case sensitive password length after tilen may get
|
|
|
|
+ * assigned, tilen is 0 otherwise.
|
|
|
|
+ */
|
|
|
|
+ pSMB->req_no_secext.CaseSensitivePasswordLength =
|
|
|
|
+ cpu_to_le16(ses->auth_key.len - CIFS_SESS_KEY_SIZE);
|
|
|
|
+ } else {
|
|
|
|
+ pSMB->req_no_secext.CaseSensitivePasswordLength = 0;
|
|
|
|
+ }
|
|
|
|
|
|
if (ses->capabilities & CAP_UNICODE) {
|
|
if (ses->capabilities & CAP_UNICODE) {
|
|
if (sess_data->iov[0].iov_len % 2) {
|
|
if (sess_data->iov[0].iov_len % 2) {
|