提交 26efa0ba 编写于 作者: J Jeff Layton 提交者: Steve French

cifs: have decode_negTokenInit set flags in server struct

...rather than the secType. This allows us to get rid of the MSKerberos
securityEnum. The client just makes a decision at upcall time.
Signed-off-by: NJeff Layton <jlayton@redhat.com>
Signed-off-by: NSteve French <sfrench@us.ibm.com>
上级 198b5682
...@@ -492,17 +492,13 @@ compare_oid(unsigned long *oid1, unsigned int oid1len, ...@@ -492,17 +492,13 @@ compare_oid(unsigned long *oid1, unsigned int oid1len,
int int
decode_negTokenInit(unsigned char *security_blob, int length, decode_negTokenInit(unsigned char *security_blob, int length,
enum securityEnum *secType) struct TCP_Server_Info *server)
{ {
struct asn1_ctx ctx; struct asn1_ctx ctx;
unsigned char *end; unsigned char *end;
unsigned char *sequence_end; unsigned char *sequence_end;
unsigned long *oid = NULL; unsigned long *oid = NULL;
unsigned int cls, con, tag, oidlen, rc; unsigned int cls, con, tag, oidlen, rc;
bool use_ntlmssp = false;
bool use_kerberos = false;
bool use_kerberosu2u = false;
bool use_mskerberos = false;
/* cifs_dump_mem(" Received SecBlob ", security_blob, length); */ /* cifs_dump_mem(" Received SecBlob ", security_blob, length); */
...@@ -599,20 +595,17 @@ decode_negTokenInit(unsigned char *security_blob, int length, ...@@ -599,20 +595,17 @@ decode_negTokenInit(unsigned char *security_blob, int length,
*(oid + 1), *(oid + 2), *(oid + 3)); *(oid + 1), *(oid + 2), *(oid + 3));
if (compare_oid(oid, oidlen, MSKRB5_OID, if (compare_oid(oid, oidlen, MSKRB5_OID,
MSKRB5_OID_LEN) && MSKRB5_OID_LEN))
!use_mskerberos) server->sec_mskerberos = true;
use_mskerberos = true;
else if (compare_oid(oid, oidlen, KRB5U2U_OID, else if (compare_oid(oid, oidlen, KRB5U2U_OID,
KRB5U2U_OID_LEN) && KRB5U2U_OID_LEN))
!use_kerberosu2u) server->sec_kerberosu2u = true;
use_kerberosu2u = true;
else if (compare_oid(oid, oidlen, KRB5_OID, else if (compare_oid(oid, oidlen, KRB5_OID,
KRB5_OID_LEN) && KRB5_OID_LEN))
!use_kerberos) server->sec_kerberos = true;
use_kerberos = true;
else if (compare_oid(oid, oidlen, NTLMSSP_OID, else if (compare_oid(oid, oidlen, NTLMSSP_OID,
NTLMSSP_OID_LEN)) NTLMSSP_OID_LEN))
use_ntlmssp = true; server->sec_ntlmssp = true;
kfree(oid); kfree(oid);
} }
...@@ -669,12 +662,5 @@ decode_negTokenInit(unsigned char *security_blob, int length, ...@@ -669,12 +662,5 @@ decode_negTokenInit(unsigned char *security_blob, int length,
cFYI(1, "Need to call asn1_octets_decode() function for %s", cFYI(1, "Need to call asn1_octets_decode() function for %s",
ctx.pointer); /* is this UTF-8 or ASCII? */ ctx.pointer); /* is this UTF-8 or ASCII? */
decode_negtoken_exit: decode_negtoken_exit:
if (use_kerberos)
*secType = Kerberos;
else if (use_mskerberos)
*secType = MSKerberos;
else if (use_ntlmssp)
*secType = RawNTLMSSP;
return 1; return 1;
} }
...@@ -133,9 +133,9 @@ cifs_get_spnego_key(struct cifsSesInfo *sesInfo) ...@@ -133,9 +133,9 @@ cifs_get_spnego_key(struct cifsSesInfo *sesInfo)
dp = description + strlen(description); dp = description + strlen(description);
/* for now, only sec=krb5 and sec=mskrb5 are valid */ /* for now, only sec=krb5 and sec=mskrb5 are valid */
if (server->secType == Kerberos) if (server->sec_kerberos)
sprintf(dp, ";sec=krb5"); sprintf(dp, ";sec=krb5");
else if (server->secType == MSKerberos) else if (server->sec_mskerberos)
sprintf(dp, ";sec=mskrb5"); sprintf(dp, ";sec=mskrb5");
else else
goto out; goto out;
......
...@@ -87,7 +87,6 @@ enum securityEnum { ...@@ -87,7 +87,6 @@ enum securityEnum {
RawNTLMSSP, /* NTLMSSP without SPNEGO, NTLMv2 hash */ RawNTLMSSP, /* NTLMSSP without SPNEGO, NTLMv2 hash */
/* NTLMSSP, */ /* can use rawNTLMSSP instead of NTLMSSP via SPNEGO */ /* NTLMSSP, */ /* can use rawNTLMSSP instead of NTLMSSP via SPNEGO */
Kerberos, /* Kerberos via SPNEGO */ Kerberos, /* Kerberos via SPNEGO */
MSKerberos, /* MS Kerberos via SPNEGO */
}; };
enum protocolEnum { enum protocolEnum {
...@@ -186,6 +185,11 @@ struct TCP_Server_Info { ...@@ -186,6 +185,11 @@ struct TCP_Server_Info {
char ntlmv2_hash[16]; char ntlmv2_hash[16];
unsigned long lstrp; /* when we got last response from this server */ unsigned long lstrp; /* when we got last response from this server */
u16 dialect; /* dialect index that server chose */ u16 dialect; /* dialect index that server chose */
/* extended security flavors that server supports */
bool sec_kerberos; /* supports plain Kerberos */
bool sec_mskerberos; /* supports legacy MS Kerberos */
bool sec_kerberosu2u; /* supports U2U Kerberos */
bool sec_ntlmssp; /* supports NTLMSSP */
}; };
/* /*
......
...@@ -85,7 +85,7 @@ extern struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *); ...@@ -85,7 +85,7 @@ extern struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *);
extern unsigned int smbCalcSize(struct smb_hdr *ptr); extern unsigned int smbCalcSize(struct smb_hdr *ptr);
extern unsigned int smbCalcSize_LE(struct smb_hdr *ptr); extern unsigned int smbCalcSize_LE(struct smb_hdr *ptr);
extern int decode_negTokenInit(unsigned char *security_blob, int length, extern int decode_negTokenInit(unsigned char *security_blob, int length,
enum securityEnum *secType); struct TCP_Server_Info *server);
extern int cifs_convert_address(char *src, void *dst); extern int cifs_convert_address(char *src, void *dst);
extern int map_smb_to_linux_error(struct smb_hdr *smb, int logErr); extern int map_smb_to_linux_error(struct smb_hdr *smb, int logErr);
extern void header_assemble(struct smb_hdr *, char /* command */ , extern void header_assemble(struct smb_hdr *, char /* command */ ,
......
...@@ -597,13 +597,19 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) ...@@ -597,13 +597,19 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses)
server->secType = RawNTLMSSP; server->secType = RawNTLMSSP;
} else { } else {
rc = decode_negTokenInit(pSMBr->u.extended_response. rc = decode_negTokenInit(pSMBr->u.extended_response.
SecurityBlob, SecurityBlob, count - 16,
count - 16, server);
&server->secType);
if (rc == 1) if (rc == 1)
rc = 0; rc = 0;
else else
rc = -EINVAL; rc = -EINVAL;
if (server->sec_kerberos || server->sec_mskerberos)
server->secType = Kerberos;
else if (server->sec_ntlmssp)
server->secType = RawNTLMSSP;
else
rc = -EOPNOTSUPP;
} }
} else } else
server->capabilities &= ~CAP_EXTENDED_SECURITY; server->capabilities &= ~CAP_EXTENDED_SECURITY;
......
...@@ -751,7 +751,7 @@ CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, ...@@ -751,7 +751,7 @@ CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses,
unicode_ssetup_strings(&bcc_ptr, ses, nls_cp); unicode_ssetup_strings(&bcc_ptr, ses, nls_cp);
} else } else
ascii_ssetup_strings(&bcc_ptr, ses, nls_cp); ascii_ssetup_strings(&bcc_ptr, ses, nls_cp);
} else if (type == Kerberos || type == MSKerberos) { } else if (type == Kerberos) {
#ifdef CONFIG_CIFS_UPCALL #ifdef CONFIG_CIFS_UPCALL
struct cifs_spnego_msg *msg; struct cifs_spnego_msg *msg;
spnego_key = cifs_get_spnego_key(ses); spnego_key = cifs_get_spnego_key(ses);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册