aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve French <sfrench@us.ibm.com>2006-06-05 16:26:05 +0000
committerSteve French <sfrench@us.ibm.com>2006-06-05 16:26:05 +0000
commit6d027cfdb19c26df3151a519ed55acfe2c4cb7c3 (patch)
treec40004c2518013409bd0f701eca868fd14c74e7f
parentf64b23ae4aef9f69d71ea41529a188acd5ab4930 (diff)
downloadlinux-6d027cfdb19c26df3151a519ed55acfe2c4cb7c3.tar.gz
[CIFS] NTLMv2 support part 3
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>
-rw-r--r--fs/cifs/cifsencrypt.c17
-rw-r--r--fs/cifs/cifspdu.h2
-rw-r--r--fs/cifs/cifsproto.h1
-rw-r--r--fs/cifs/sess.c6
4 files changed, 20 insertions, 6 deletions
diff --git a/fs/cifs/cifsencrypt.c b/fs/cifs/cifsencrypt.c
index 24ab770f60dc01..09f94617e53472 100644
--- a/fs/cifs/cifsencrypt.c
+++ b/fs/cifs/cifsencrypt.c
@@ -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); */
diff --git a/fs/cifs/cifspdu.h b/fs/cifs/cifspdu.h
index 503b7e32ede35e..5250b93d30987a 100644
--- a/fs/cifs/cifspdu.h
+++ b/fs/cifs/cifspdu.h
@@ -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 */
diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
index 59b037f1451131..824afb937a6f80 100644
--- a/fs/cifs/cifsproto.h
+++ b/fs/cifs/cifsproto.h
@@ -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 */
diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c
index 9ce628df29b420..c6fd01f55e90a6 100644
--- a/fs/cifs/sess.c
+++ b/fs/cifs/sess.c
@@ -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,