[CIFS] NTLMv2 support part 3
authorSteve French <sfrench@us.ibm.com>
Mon, 5 Jun 2006 16:26:05 +0000 (16:26 +0000)
committerSteve French <sfrench@us.ibm.com>
Mon, 5 Jun 2006 16:26:05 +0000 (16:26 +0000)
Response struct filled in exacty for 16 byte hash which we need to check
more to make sure it works.

Signed-off-by: Steve French <sfrench@us.ibm.com>
fs/cifs/cifsencrypt.c
fs/cifs/cifspdu.h
fs/cifs/cifsproto.h
fs/cifs/sess.c

index 24ab770..09f9461 100644 (file)
@@ -27,6 +27,7 @@
 #include "cifs_unicode.h"
 #include "cifsproto.h"
 #include <linux/ctype.h>
+#include <linux/random.h>
 
 /* Calculate and return the CIFS signature based on the mac key and the smb pdu */
 /* the 16 byte signature must be allocated by the caller  */
@@ -304,10 +305,22 @@ void calc_lanman_hash(struct cifsSesInfo * ses, char * lnm_session_key)
 }
 #endif /* CIFS_WEAK_PW_HASH */
 
+void setup_ntlmv2_rsp(const struct cifsSesInfo * ses, char * resp_buf)
+{
+       struct ntlmv2_resp * buf = (struct ntlmv2_resp *)resp_buf;
+
+       buf->blob_signature = cpu_to_le32(0x00000101);
+       buf->reserved = 0;
+       buf->time = cpu_to_le64(cifs_UnixTimeToNT(CURRENT_TIME));
+       get_random_bytes(&buf->client_chal, sizeof(buf->client_chal)); 
+       buf->reserved2 = 0;
+       buf->names[0].type = 0;
+       buf->names[0].length = 0;
+       /* calculate buf->ntlmv2_hash */
+}
+
 void CalcNTLMv2_response(const struct cifsSesInfo * ses,char * v2_session_response)
 {
-       /* BB FIXME  -  update struct ntlmv2_response and change calling convention
-          of this function */ 
        struct HMACMD5Context context;
        memcpy(v2_session_response + 8, ses->server->cryptKey,8);
        /* gen_blob(v2_session_response + 16); */
index 503b7e3..5250b93 100644 (file)
@@ -582,7 +582,7 @@ struct ntlmssp2_name {
 
 struct ntlmv2_resp {
        char ntlmv2_hash[CIFS_ENCPWD_SIZE];
-       __le32 blob_sign;
+       __le32 blob_signature;
        __u32  reserved;
        __le64  time;
        __u64  client_chal; /* random */
index 59b037f..824afb9 100644 (file)
@@ -287,6 +287,7 @@ extern int cifs_verify_signature(struct smb_hdr *, const char * mac_key,
 extern int cifs_calculate_mac_key(char * key,const char * rn,const char * pass);
 extern int CalcNTLMv2_partial_mac_key(struct cifsSesInfo *, struct nls_table *);
 extern void CalcNTLMv2_response(const struct cifsSesInfo *,char * );
+extern void setup_ntlmv2_rsp(const struct cifsSesInfo *, char *);
 #ifdef CONFIG_CIFS_WEAK_PW_HASH
 extern void calc_lanman_hash(struct cifsSesInfo * ses, char * lnm_session_key);
 #endif /* CIFS_WEAK_PW_HASH */
index 9ce628d..c6fd01f 100644 (file)
@@ -411,8 +411,8 @@ CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, int first_time,
                else
                        ascii_ssetup_strings(&bcc_ptr, ses, nls_cp);
        } else if (type == NTLMv2) {
-               char * v2_sess_key = kmalloc(sizeof(struct ntlmv2_resp),
-                                               GFP_KERNEL);
+               char * v2_sess_key = 
+                       kmalloc(sizeof(struct ntlmv2_resp), GFP_KERNEL);
 
                /* BB FIXME change all users of v2_sess_key to
                   struct ntlmv2_resp */
@@ -432,7 +432,7 @@ CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, int first_time,
                        cpu_to_le16(sizeof(struct ntlmv2_resp));
 
                /* calculate session key */
-               CalcNTLMv2_response(ses, v2_sess_key);
+               setup_ntlmv2_rsp(ses, v2_sess_key);
                if(first_time) /* should this be moved into common code
                                  with similar ntlmv2 path? */
                /*   cifs_calculate_ntlmv2_mac_key(ses->server->mac_signing_key,