>> 1 // SPDX-License-Identifier: GPL-2.0-or-later 1 /* 2 /* 2 Unix SMB/Netbios implementation. 3 Unix SMB/Netbios implementation. 3 Version 1.9. 4 Version 1.9. 4 SMB parameters and setup 5 SMB parameters and setup 5 Copyright (C) Andrew Tridgell 1992-2000 6 Copyright (C) Andrew Tridgell 1992-2000 6 Copyright (C) Luke Kenneth Casson Leighton 7 Copyright (C) Luke Kenneth Casson Leighton 1996-2000 7 Modified by Jeremy Allison 1995. 8 Modified by Jeremy Allison 1995. 8 Copyright (C) Andrew Bartlett <abartlet@sam 9 Copyright (C) Andrew Bartlett <abartlet@samba.org> 2002-2003 9 Modified by Steve French (sfrench@us.ibm.co 10 Modified by Steve French (sfrench@us.ibm.com) 2002-2003 10 11 11 This program is free software; you can redi << 12 it under the terms of the GNU General Publi << 13 the Free Software Foundation; either versio << 14 (at your option) any later version. << 15 << 16 This program is distributed in the hope tha << 17 but WITHOUT ANY WARRANTY; without even the << 18 MERCHANTABILITY or FITNESS FOR A PARTICULAR << 19 GNU General Public License for more details << 20 << 21 You should have received a copy of the GNU << 22 along with this program; if not, write to t << 23 Foundation, Inc., 675 Mass Ave, Cambridge, << 24 */ 12 */ 25 13 >> 14 #include <linux/crypto.h> 26 #include <linux/module.h> 15 #include <linux/module.h> 27 #include <linux/slab.h> 16 #include <linux/slab.h> 28 #include <linux/fs.h> 17 #include <linux/fs.h> 29 #include <linux/string.h> 18 #include <linux/string.h> 30 #include <linux/kernel.h> 19 #include <linux/kernel.h> 31 #include <linux/random.h> 20 #include <linux/random.h> >> 21 #include "cifs_fs_sb.h" 32 #include "cifs_unicode.h" 22 #include "cifs_unicode.h" 33 #include "cifspdu.h" 23 #include "cifspdu.h" 34 #include "cifsglob.h" 24 #include "cifsglob.h" 35 #include "cifs_debug.h" 25 #include "cifs_debug.h" 36 #include "cifsproto.h" 26 #include "cifsproto.h" 37 27 38 #ifndef false 28 #ifndef false 39 #define false 0 29 #define false 0 40 #endif 30 #endif 41 #ifndef true 31 #ifndef true 42 #define true 1 32 #define true 1 43 #endif 33 #endif 44 34 45 /* following came from the other byteorder.h t 35 /* following came from the other byteorder.h to avoid include conflicts */ 46 #define CVAL(buf,pos) (((unsigned char *)(buf) 36 #define CVAL(buf,pos) (((unsigned char *)(buf))[pos]) 47 #define SSVALX(buf,pos,val) (CVAL(buf,pos)=(va 37 #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), 38 #define SSVAL(buf,pos,val) SSVALX((buf),(pos),((__u16)(val))) 49 39 50 static void 40 static void 51 str_to_key(unsigned char *str, unsigned char * 41 str_to_key(unsigned char *str, unsigned char *key) 52 { 42 { 53 int i; 43 int i; 54 44 55 key[0] = str[0] >> 1; 45 key[0] = str[0] >> 1; 56 key[1] = ((str[0] & 0x01) << 6) | (str 46 key[1] = ((str[0] & 0x01) << 6) | (str[1] >> 2); 57 key[2] = ((str[1] & 0x03) << 5) | (str 47 key[2] = ((str[1] & 0x03) << 5) | (str[2] >> 3); 58 key[3] = ((str[2] & 0x07) << 4) | (str 48 key[3] = ((str[2] & 0x07) << 4) | (str[3] >> 4); 59 key[4] = ((str[3] & 0x0F) << 3) | (str 49 key[4] = ((str[3] & 0x0F) << 3) | (str[4] >> 5); 60 key[5] = ((str[4] & 0x1F) << 2) | (str 50 key[5] = ((str[4] & 0x1F) << 2) | (str[5] >> 6); 61 key[6] = ((str[5] & 0x3F) << 1) | (str 51 key[6] = ((str[5] & 0x3F) << 1) | (str[6] >> 7); 62 key[7] = str[6] & 0x7F; 52 key[7] = str[6] & 0x7F; 63 for (i = 0; i < 8; i++) 53 for (i = 0; i < 8; i++) 64 key[i] = (key[i] << 1); 54 key[i] = (key[i] << 1); 65 } 55 } 66 56 67 static int 57 static int 68 smbhash(unsigned char *out, const unsigned cha 58 smbhash(unsigned char *out, const unsigned char *in, unsigned char *key) 69 { 59 { 70 int rc; << 71 unsigned char key2[8]; 60 unsigned char key2[8]; 72 struct crypto_blkcipher *tfm_des; !! 61 struct crypto_cipher *tfm_des; 73 struct scatterlist sgin, sgout; << 74 struct blkcipher_desc desc; << 75 62 76 str_to_key(key, key2); 63 str_to_key(key, key2); 77 64 78 tfm_des = crypto_alloc_blkcipher("ecb( !! 65 tfm_des = crypto_alloc_cipher("des", 0, 0); 79 if (IS_ERR(tfm_des)) { 66 if (IS_ERR(tfm_des)) { 80 rc = PTR_ERR(tfm_des); << 81 cifs_dbg(VFS, "could not alloc 67 cifs_dbg(VFS, "could not allocate des crypto API\n"); 82 goto smbhash_err; !! 68 return PTR_ERR(tfm_des); 83 } 69 } 84 70 85 desc.tfm = tfm_des; !! 71 crypto_cipher_setkey(tfm_des, key2, 8); 86 !! 72 crypto_cipher_encrypt_one(tfm_des, out, in); 87 crypto_blkcipher_setkey(tfm_des, key2, !! 73 crypto_free_cipher(tfm_des); 88 << 89 sg_init_one(&sgin, in, 8); << 90 sg_init_one(&sgout, out, 8); << 91 74 92 rc = crypto_blkcipher_encrypt(&desc, & !! 75 return 0; 93 if (rc) << 94 cifs_dbg(VFS, "could not encry << 95 << 96 crypto_free_blkcipher(tfm_des); << 97 smbhash_err: << 98 return rc; << 99 } 76 } 100 77 101 static int 78 static int 102 E_P16(unsigned char *p14, unsigned char *p16) 79 E_P16(unsigned char *p14, unsigned char *p16) 103 { 80 { 104 int rc; 81 int rc; 105 unsigned char sp8[8] = 82 unsigned char sp8[8] = 106 { 0x4b, 0x47, 0x53, 0x21, 0x40, 0x 83 { 0x4b, 0x47, 0x53, 0x21, 0x40, 0x23, 0x24, 0x25 }; 107 84 108 rc = smbhash(p16, sp8, p14); 85 rc = smbhash(p16, sp8, p14); 109 if (rc) 86 if (rc) 110 return rc; 87 return rc; 111 rc = smbhash(p16 + 8, sp8, p14 + 7); 88 rc = smbhash(p16 + 8, sp8, p14 + 7); 112 return rc; 89 return rc; 113 } 90 } 114 91 115 static int 92 static int 116 E_P24(unsigned char *p21, const unsigned char 93 E_P24(unsigned char *p21, const unsigned char *c8, unsigned char *p24) 117 { 94 { 118 int rc; 95 int rc; 119 96 120 rc = smbhash(p24, c8, p21); 97 rc = smbhash(p24, c8, p21); 121 if (rc) 98 if (rc) 122 return rc; 99 return rc; 123 rc = smbhash(p24 + 8, c8, p21 + 7); 100 rc = smbhash(p24 + 8, c8, p21 + 7); 124 if (rc) 101 if (rc) 125 return rc; 102 return rc; 126 rc = smbhash(p24 + 16, c8, p21 + 14); 103 rc = smbhash(p24 + 16, c8, p21 + 14); 127 return rc; 104 return rc; 128 } 105 } 129 106 130 /* produce a md4 message digest from data of l 107 /* produce a md4 message digest from data of length n bytes */ 131 int 108 int 132 mdfour(unsigned char *md4_hash, unsigned char 109 mdfour(unsigned char *md4_hash, unsigned char *link_str, int link_len) 133 { 110 { 134 int rc; 111 int rc; 135 unsigned int size; !! 112 struct crypto_shash *md4 = NULL; 136 struct crypto_shash *md4; !! 113 struct sdesc *sdescmd4 = NULL; 137 struct sdesc *sdescmd4; !! 114 138 !! 115 rc = cifs_alloc_hash("md4", &md4, &sdescmd4); 139 md4 = crypto_alloc_shash("md4", 0, 0); !! 116 if (rc) 140 if (IS_ERR(md4)) { << 141 rc = PTR_ERR(md4); << 142 cifs_dbg(VFS, "%s: Crypto md4 << 143 __func__, rc); << 144 return rc; << 145 } << 146 size = sizeof(struct shash_desc) + cry << 147 sdescmd4 = kmalloc(size, GFP_KERNEL); << 148 if (!sdescmd4) { << 149 rc = -ENOMEM; << 150 goto mdfour_err; 117 goto mdfour_err; 151 } << 152 sdescmd4->shash.tfm = md4; << 153 sdescmd4->shash.flags = 0x0; << 154 118 155 rc = crypto_shash_init(&sdescmd4->shas 119 rc = crypto_shash_init(&sdescmd4->shash); 156 if (rc) { 120 if (rc) { 157 cifs_dbg(VFS, "%s: Could not i 121 cifs_dbg(VFS, "%s: Could not init md4 shash\n", __func__); 158 goto mdfour_err; 122 goto mdfour_err; 159 } 123 } 160 rc = crypto_shash_update(&sdescmd4->sh 124 rc = crypto_shash_update(&sdescmd4->shash, link_str, link_len); 161 if (rc) { 125 if (rc) { 162 cifs_dbg(VFS, "%s: Could not u 126 cifs_dbg(VFS, "%s: Could not update with link_str\n", __func__); 163 goto mdfour_err; 127 goto mdfour_err; 164 } 128 } 165 rc = crypto_shash_final(&sdescmd4->sha 129 rc = crypto_shash_final(&sdescmd4->shash, md4_hash); 166 if (rc) 130 if (rc) 167 cifs_dbg(VFS, "%s: Could not g 131 cifs_dbg(VFS, "%s: Could not generate md4 hash\n", __func__); 168 132 169 mdfour_err: 133 mdfour_err: 170 crypto_free_shash(md4); !! 134 cifs_free_hash(&md4, &sdescmd4); 171 kfree(sdescmd4); << 172 << 173 return rc; 135 return rc; 174 } 136 } 175 137 176 /* 138 /* 177 This implements the X/Open SMB password enc 139 This implements the X/Open SMB password encryption 178 It takes a password, a 8 byte "crypt key" a 140 It takes a password, a 8 byte "crypt key" and puts 24 bytes of 179 encrypted password into p24 */ 141 encrypted password into p24 */ 180 /* Note that password must be uppercased and n 142 /* Note that password must be uppercased and null terminated */ 181 int 143 int 182 SMBencrypt(unsigned char *passwd, const unsign 144 SMBencrypt(unsigned char *passwd, const unsigned char *c8, unsigned char *p24) 183 { 145 { 184 int rc; 146 int rc; 185 unsigned char p14[14], p16[16], p21[21 147 unsigned char p14[14], p16[16], p21[21]; 186 148 187 memset(p14, '\0', 14); 149 memset(p14, '\0', 14); 188 memset(p16, '\0', 16); 150 memset(p16, '\0', 16); 189 memset(p21, '\0', 21); 151 memset(p21, '\0', 21); 190 152 191 memcpy(p14, passwd, 14); 153 memcpy(p14, passwd, 14); 192 rc = E_P16(p14, p16); 154 rc = E_P16(p14, p16); 193 if (rc) 155 if (rc) 194 return rc; 156 return rc; 195 157 196 memcpy(p21, p16, 16); 158 memcpy(p21, p16, 16); 197 rc = E_P24(p21, c8, p24); 159 rc = E_P24(p21, c8, p24); 198 160 199 return rc; 161 return rc; 200 } 162 } 201 163 202 /* 164 /* 203 * Creates the MD4 Hash of the users password 165 * Creates the MD4 Hash of the users password in NT UNICODE. 204 */ 166 */ 205 167 206 int 168 int 207 E_md4hash(const unsigned char *passwd, unsigne 169 E_md4hash(const unsigned char *passwd, unsigned char *p16, 208 const struct nls_table *codepage) 170 const struct nls_table *codepage) 209 { 171 { 210 int rc; 172 int rc; 211 int len; 173 int len; 212 __le16 wpwd[129]; 174 __le16 wpwd[129]; 213 175 214 /* Password cannot be longer than 128 176 /* Password cannot be longer than 128 characters */ 215 if (passwd) /* Password must be conver 177 if (passwd) /* Password must be converted to NT unicode */ 216 len = cifs_strtoUTF16(wpwd, pa 178 len = cifs_strtoUTF16(wpwd, passwd, 128, codepage); 217 else { 179 else { 218 len = 0; 180 len = 0; 219 *wpwd = 0; /* Ensure string is 181 *wpwd = 0; /* Ensure string is null terminated */ 220 } 182 } 221 183 222 rc = mdfour(p16, (unsigned char *) wpw 184 rc = mdfour(p16, (unsigned char *) wpwd, len * sizeof(__le16)); 223 memset(wpwd, 0, 129 * sizeof(__le16)); !! 185 memzero_explicit(wpwd, sizeof(wpwd)); 224 186 225 return rc; 187 return rc; 226 } 188 } 227 189 228 /* Does the NT MD4 hash then des encryption. * 190 /* Does the NT MD4 hash then des encryption. */ 229 int 191 int 230 SMBNTencrypt(unsigned char *passwd, unsigned c 192 SMBNTencrypt(unsigned char *passwd, unsigned char *c8, unsigned char *p24, 231 const struct nls_table *codepa 193 const struct nls_table *codepage) 232 { 194 { 233 int rc; 195 int rc; 234 unsigned char p16[16], p21[21]; 196 unsigned char p16[16], p21[21]; 235 197 236 memset(p16, '\0', 16); 198 memset(p16, '\0', 16); 237 memset(p21, '\0', 21); 199 memset(p21, '\0', 21); 238 200 239 rc = E_md4hash(passwd, p16, codepage); 201 rc = E_md4hash(passwd, p16, codepage); 240 if (rc) { 202 if (rc) { 241 cifs_dbg(FYI, "%s Can't genera 203 cifs_dbg(FYI, "%s Can't generate NT hash, error: %d\n", 242 __func__, rc); 204 __func__, rc); 243 return rc; 205 return rc; 244 } 206 } 245 memcpy(p21, p16, 16); 207 memcpy(p21, p16, 16); 246 rc = E_P24(p21, c8, p24); 208 rc = E_P24(p21, c8, p24); 247 return rc; 209 return rc; 248 } 210 } 249 211
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.