diff options
author | Shirish Pargaonkar <shirishpargaonkar@gmail.com> | 2011-01-27 10:58:04 -0500 |
---|---|---|
committer | Steve French <sfrench@us.ibm.com> | 2011-01-27 14:58:13 -0500 |
commit | ee2c9258501f83d3ed0fd09ce5df1cec53312cf0 (patch) | |
tree | 2690ab3e75343be23a4969846a0c71f0df842dc7 /fs/cifs/smbencrypt.c | |
parent | d39454ffe4a3c85428483b8a8a8e5e797b6363d5 (diff) |
cifs: More crypto cleanup (try #2)
Replaced md4 hashing function local to cifs module with kernel crypto APIs.
As a result, md4 hashing function and its supporting functions in
file md4.c are not needed anymore.
Cleaned up function declarations, removed forward function declarations,
and removed a header file that is being deleted from being included.
Verified that sec=ntlm/i, sec=ntlmv2/i, and sec=ntlmssp/i work correctly.
Signed-off-by: Shirish Pargaonkar <shirishpargaonkar@gmail.com>
Reviewed-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Steve French <sfrench@us.ibm.com>
Diffstat (limited to 'fs/cifs/smbencrypt.c')
-rw-r--r-- | fs/cifs/smbencrypt.c | 90 |
1 files changed, 64 insertions, 26 deletions
diff --git a/fs/cifs/smbencrypt.c b/fs/cifs/smbencrypt.c index 30135005e4f3..b5450e9f40c0 100644 --- a/fs/cifs/smbencrypt.c +++ b/fs/cifs/smbencrypt.c | |||
@@ -33,7 +33,7 @@ | |||
33 | #include "cifspdu.h" | 33 | #include "cifspdu.h" |
34 | #include "cifsglob.h" | 34 | #include "cifsglob.h" |
35 | #include "cifs_debug.h" | 35 | #include "cifs_debug.h" |
36 | #include "cifsencrypt.h" | 36 | #include "cifsproto.h" |
37 | 37 | ||
38 | #ifndef false | 38 | #ifndef false |
39 | #define false 0 | 39 | #define false 0 |
@@ -47,14 +47,57 @@ | |||
47 | #define SSVALX(buf,pos,val) (CVAL(buf,pos)=(val)&0xFF,CVAL(buf,pos+1)=(val)>>8) | 47 | #define SSVALX(buf,pos,val) (CVAL(buf,pos)=(val)&0xFF,CVAL(buf,pos+1)=(val)>>8) |
48 | #define SSVAL(buf,pos,val) SSVALX((buf),(pos),((__u16)(val))) | 48 | #define SSVAL(buf,pos,val) SSVALX((buf),(pos),((__u16)(val))) |
49 | 49 | ||
50 | /*The following definitions come from libsmb/smbencrypt.c */ | 50 | /* produce a md4 message digest from data of length n bytes */ |
51 | int | ||
52 | mdfour(unsigned char *md4_hash, unsigned char *link_str, int link_len) | ||
53 | { | ||
54 | int rc; | ||
55 | unsigned int size; | ||
56 | struct crypto_shash *md4; | ||
57 | struct sdesc *sdescmd4; | ||
58 | |||
59 | md4 = crypto_alloc_shash("md4", 0, 0); | ||
60 | if (IS_ERR(md4)) { | ||
61 | cERROR(1, "%s: Crypto md4 allocation error %d\n", __func__, rc); | ||
62 | return PTR_ERR(md4); | ||
63 | } | ||
64 | size = sizeof(struct shash_desc) + crypto_shash_descsize(md4); | ||
65 | sdescmd4 = kmalloc(size, GFP_KERNEL); | ||
66 | if (!sdescmd4) { | ||
67 | rc = -ENOMEM; | ||
68 | cERROR(1, "%s: Memory allocation failure\n", __func__); | ||
69 | goto mdfour_err; | ||
70 | } | ||
71 | sdescmd4->shash.tfm = md4; | ||
72 | sdescmd4->shash.flags = 0x0; | ||
73 | |||
74 | rc = crypto_shash_init(&sdescmd4->shash); | ||
75 | if (rc) { | ||
76 | cERROR(1, "%s: Could not init md4 shash\n", __func__); | ||
77 | goto mdfour_err; | ||
78 | } | ||
79 | crypto_shash_update(&sdescmd4->shash, link_str, link_len); | ||
80 | rc = crypto_shash_final(&sdescmd4->shash, md4_hash); | ||
51 | 81 | ||
52 | void SMBencrypt(unsigned char *passwd, const unsigned char *c8, | 82 | mdfour_err: |
53 | unsigned char *p24); | 83 | crypto_free_shash(md4); |
54 | void E_md4hash(const unsigned char *passwd, unsigned char *p16); | 84 | kfree(sdescmd4); |
55 | static void SMBOWFencrypt(unsigned char passwd[16], const unsigned char *c8, | 85 | |
56 | unsigned char p24[24]); | 86 | return rc; |
57 | void SMBNTencrypt(unsigned char *passwd, unsigned char *c8, unsigned char *p24); | 87 | } |
88 | |||
89 | /* Does the des encryption from the NT or LM MD4 hash. */ | ||
90 | static void | ||
91 | SMBOWFencrypt(unsigned char passwd[16], const unsigned char *c8, | ||
92 | unsigned char p24[24]) | ||
93 | { | ||
94 | unsigned char p21[21]; | ||
95 | |||
96 | memset(p21, '\0', 21); | ||
97 | |||
98 | memcpy(p21, passwd, 16); | ||
99 | E_P24(p21, c8, p24); | ||
100 | } | ||
58 | 101 | ||
59 | /* | 102 | /* |
60 | This implements the X/Open SMB password encryption | 103 | This implements the X/Open SMB password encryption |
@@ -117,9 +160,10 @@ _my_mbstowcs(__u16 *dst, const unsigned char *src, int len) | |||
117 | * Creates the MD4 Hash of the users password in NT UNICODE. | 160 | * Creates the MD4 Hash of the users password in NT UNICODE. |
118 | */ | 161 | */ |
119 | 162 | ||
120 | void | 163 | int |
121 | E_md4hash(const unsigned char *passwd, unsigned char *p16) | 164 | E_md4hash(const unsigned char *passwd, unsigned char *p16) |
122 | { | 165 | { |
166 | int rc; | ||
123 | int len; | 167 | int len; |
124 | __u16 wpwd[129]; | 168 | __u16 wpwd[129]; |
125 | 169 | ||
@@ -138,8 +182,10 @@ E_md4hash(const unsigned char *passwd, unsigned char *p16) | |||
138 | /* Calculate length in bytes */ | 182 | /* Calculate length in bytes */ |
139 | len = _my_wcslen(wpwd) * sizeof(__u16); | 183 | len = _my_wcslen(wpwd) * sizeof(__u16); |
140 | 184 | ||
141 | mdfour(p16, (unsigned char *) wpwd, len); | 185 | rc = mdfour(p16, (unsigned char *) wpwd, len); |
142 | memset(wpwd, 0, 129 * 2); | 186 | memset(wpwd, 0, 129 * 2); |
187 | |||
188 | return rc; | ||
143 | } | 189 | } |
144 | 190 | ||
145 | #if 0 /* currently unused */ | 191 | #if 0 /* currently unused */ |
@@ -211,19 +257,6 @@ ntv2_owf_gen(const unsigned char owf[16], const char *user_n, | |||
211 | } | 257 | } |
212 | #endif | 258 | #endif |
213 | 259 | ||
214 | /* Does the des encryption from the NT or LM MD4 hash. */ | ||
215 | static void | ||
216 | SMBOWFencrypt(unsigned char passwd[16], const unsigned char *c8, | ||
217 | unsigned char p24[24]) | ||
218 | { | ||
219 | unsigned char p21[21]; | ||
220 | |||
221 | memset(p21, '\0', 21); | ||
222 | |||
223 | memcpy(p21, passwd, 16); | ||
224 | E_P24(p21, c8, p24); | ||
225 | } | ||
226 | |||
227 | /* Does the des encryption from the FIRST 8 BYTES of the NT or LM MD4 hash. */ | 260 | /* Does the des encryption from the FIRST 8 BYTES of the NT or LM MD4 hash. */ |
228 | #if 0 /* currently unused */ | 261 | #if 0 /* currently unused */ |
229 | static void | 262 | static void |
@@ -241,16 +274,21 @@ NTLMSSPOWFencrypt(unsigned char passwd[8], | |||
241 | #endif | 274 | #endif |
242 | 275 | ||
243 | /* Does the NT MD4 hash then des encryption. */ | 276 | /* Does the NT MD4 hash then des encryption. */ |
244 | 277 | int | |
245 | void | ||
246 | SMBNTencrypt(unsigned char *passwd, unsigned char *c8, unsigned char *p24) | 278 | SMBNTencrypt(unsigned char *passwd, unsigned char *c8, unsigned char *p24) |
247 | { | 279 | { |
280 | int rc; | ||
248 | unsigned char p21[21]; | 281 | unsigned char p21[21]; |
249 | 282 | ||
250 | memset(p21, '\0', 21); | 283 | memset(p21, '\0', 21); |
251 | 284 | ||
252 | E_md4hash(passwd, p21); | 285 | rc = E_md4hash(passwd, p21); |
286 | if (rc) { | ||
287 | cFYI(1, "%s Can't generate NT hash, error: %d", __func__, rc); | ||
288 | return rc; | ||
289 | } | ||
253 | SMBOWFencrypt(p21, c8, p24); | 290 | SMBOWFencrypt(p21, c8, p24); |
291 | return rc; | ||
254 | } | 292 | } |
255 | 293 | ||
256 | 294 | ||