diff options
Diffstat (limited to 'fs/cifs/cifsencrypt.c')
-rw-r--r-- | fs/cifs/cifsencrypt.c | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/fs/cifs/cifsencrypt.c b/fs/cifs/cifsencrypt.c index a2c24858d40f..e7d63737e651 100644 --- a/fs/cifs/cifsencrypt.c +++ b/fs/cifs/cifsencrypt.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * fs/cifs/cifsencrypt.c | 2 | * fs/cifs/cifsencrypt.c |
3 | * | 3 | * |
4 | * Copyright (C) International Business Machines Corp., 2005 | 4 | * Copyright (C) International Business Machines Corp., 2005,2006 |
5 | * Author(s): Steve French (sfrench@us.ibm.com) | 5 | * Author(s): Steve French (sfrench@us.ibm.com) |
6 | * | 6 | * |
7 | * This library is free software; you can redistribute it and/or modify | 7 | * This library is free software; you can redistribute it and/or modify |
@@ -36,7 +36,8 @@ | |||
36 | extern void mdfour(unsigned char *out, unsigned char *in, int n); | 36 | extern void mdfour(unsigned char *out, unsigned char *in, int n); |
37 | extern void E_md4hash(const unsigned char *passwd, unsigned char *p16); | 37 | extern void E_md4hash(const unsigned char *passwd, unsigned char *p16); |
38 | 38 | ||
39 | static int cifs_calculate_signature(const struct smb_hdr * cifs_pdu, const char * key, char * signature) | 39 | static int cifs_calculate_signature(const struct smb_hdr * cifs_pdu, |
40 | const char * key, char * signature) | ||
40 | { | 41 | { |
41 | struct MD5Context context; | 42 | struct MD5Context context; |
42 | 43 | ||
@@ -56,9 +57,6 @@ int cifs_sign_smb(struct smb_hdr * cifs_pdu, struct TCP_Server_Info * server, | |||
56 | int rc = 0; | 57 | int rc = 0; |
57 | char smb_signature[20]; | 58 | char smb_signature[20]; |
58 | 59 | ||
59 | /* BB remember to initialize sequence number elsewhere and initialize mac_signing key elsewhere BB */ | ||
60 | /* BB remember to add code to save expected sequence number in midQ entry BB */ | ||
61 | |||
62 | if((cifs_pdu == NULL) || (server == NULL)) | 60 | if((cifs_pdu == NULL) || (server == NULL)) |
63 | return -EINVAL; | 61 | return -EINVAL; |
64 | 62 | ||
@@ -85,20 +83,33 @@ int cifs_sign_smb(struct smb_hdr * cifs_pdu, struct TCP_Server_Info * server, | |||
85 | static int cifs_calc_signature2(const struct kvec * iov, int n_vec, | 83 | static int cifs_calc_signature2(const struct kvec * iov, int n_vec, |
86 | const char * key, char * signature) | 84 | const char * key, char * signature) |
87 | { | 85 | { |
88 | struct MD5Context context; | 86 | struct MD5Context context; |
89 | 87 | int i; | |
90 | if((iov == NULL) || (signature == NULL)) | ||
91 | return -EINVAL; | ||
92 | 88 | ||
93 | MD5Init(&context); | 89 | if((iov == NULL) || (signature == NULL)) |
94 | MD5Update(&context,key,CIFS_SESSION_KEY_SIZE+16); | 90 | return -EINVAL; |
95 | 91 | ||
96 | /* MD5Update(&context,cifs_pdu->Protocol,cifs_pdu->smb_buf_length); */ /* BB FIXME BB */ | 92 | MD5Init(&context); |
93 | MD5Update(&context,key,CIFS_SESSION_KEY_SIZE+16); | ||
94 | for(i=0;i<n_vec;i++) { | ||
95 | if(iov[i].iov_base == NULL) { | ||
96 | cERROR(1,("null iovec entry")); | ||
97 | return -EIO; | ||
98 | } else if(iov[i].iov_len == 0) | ||
99 | break; /* bail out if we are sent nothing to sign */ | ||
100 | /* The first entry includes a length field (which does not get | ||
101 | signed that occupies the first 4 bytes before the header */ | ||
102 | if(i==0) { | ||
103 | if (iov[0].iov_len <= 8 ) /* cmd field at offset 9 */ | ||
104 | break; /* nothing to sign or corrupt header */ | ||
105 | MD5Update(&context,iov[0].iov_base+4, iov[0].iov_len-4); | ||
106 | } else | ||
107 | MD5Update(&context,iov[i].iov_base, iov[i].iov_len); | ||
108 | } | ||
97 | 109 | ||
98 | MD5Final(signature,&context); | 110 | MD5Final(signature,&context); |
99 | 111 | ||
100 | return -EOPNOTSUPP; | 112 | return 0; |
101 | /* return 0; */ | ||
102 | } | 113 | } |
103 | 114 | ||
104 | 115 | ||
@@ -259,4 +270,5 @@ void CalcNTLMv2_response(const struct cifsSesInfo * ses,char * v2_session_respon | |||
259 | /* hmac_md5_update(v2_session_response+16)client thing,8,&context); */ /* BB fix */ | 270 | /* hmac_md5_update(v2_session_response+16)client thing,8,&context); */ /* BB fix */ |
260 | 271 | ||
261 | hmac_md5_final(v2_session_response,&context); | 272 | hmac_md5_final(v2_session_response,&context); |
273 | cifs_dump_mem("v2_sess_rsp: ", v2_session_response, 32); /* BB removeme BB */ | ||
262 | } | 274 | } |