smb_crypt.c (139823) | smb_crypt.c (156326) |
---|---|
1/*- 2 * Copyright (c) 2000-2001, Boris Popov 3 * All rights reserved. 4 * 5 * Copyright (c) 2003, 2004 Tim J. Robbins. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 20 unchanged lines hidden (view full) --- 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 */ 35 36#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2000-2001, Boris Popov 3 * All rights reserved. 4 * 5 * Copyright (c) 2003, 2004 Tim J. Robbins. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 20 unchanged lines hidden (view full) --- 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 */ 35 36#include <sys/cdefs.h> |
37__FBSDID("$FreeBSD: head/sys/netsmb/smb_crypt.c 139823 2005-01-07 01:45:51Z imp $"); | 37__FBSDID("$FreeBSD: head/sys/netsmb/smb_crypt.c 156326 2006-03-05 22:52:17Z yar $"); |
38 39#include <sys/param.h> 40#include <sys/malloc.h> 41#include <sys/kernel.h> 42#include <sys/systm.h> 43#include <sys/conf.h> 44#include <sys/proc.h> 45#include <sys/fcntl.h> --- 8 unchanged lines hidden (view full) --- 54#include <sys/iconv.h> 55 56#include <netsmb/smb.h> 57#include <netsmb/smb_conn.h> 58#include <netsmb/smb_subr.h> 59#include <netsmb/smb_rq.h> 60#include <netsmb/smb_dev.h> 61 | 38 39#include <sys/param.h> 40#include <sys/malloc.h> 41#include <sys/kernel.h> 42#include <sys/systm.h> 43#include <sys/conf.h> 44#include <sys/proc.h> 45#include <sys/fcntl.h> --- 8 unchanged lines hidden (view full) --- 54#include <sys/iconv.h> 55 56#include <netsmb/smb.h> 57#include <netsmb/smb_conn.h> 58#include <netsmb/smb_subr.h> 59#include <netsmb/smb_rq.h> 60#include <netsmb/smb_dev.h> 61 |
62#include "opt_netsmb.h" 63 64#ifdef NETSMBCRYPTO 65 | |
66#include <crypto/des/des.h> 67 | 62#include <crypto/des/des.h> 63 |
64#include "opt_netsmb.h" 65 |
|
68static u_char N8[] = {0x4b, 0x47, 0x53, 0x21, 0x40, 0x23, 0x24, 0x25}; 69 70 71static void 72smb_E(const u_char *key, u_char *data, u_char *dest) 73{ 74 des_key_schedule *ksp; 75 u_char kk[8]; --- 6 unchanged lines hidden (view full) --- 82 kk[5] = key[4] << 3 | (key[5] >> 5 & 0xfe); 83 kk[6] = key[5] << 2 | (key[6] >> 6 & 0xfe); 84 kk[7] = key[6] << 1; 85 ksp = malloc(sizeof(des_key_schedule), M_SMBTEMP, M_WAITOK); 86 des_set_key((des_cblock *)kk, *ksp); 87 des_ecb_encrypt((des_cblock *)data, (des_cblock *)dest, *ksp, 1); 88 free(ksp, M_SMBTEMP); 89} | 66static u_char N8[] = {0x4b, 0x47, 0x53, 0x21, 0x40, 0x23, 0x24, 0x25}; 67 68 69static void 70smb_E(const u_char *key, u_char *data, u_char *dest) 71{ 72 des_key_schedule *ksp; 73 u_char kk[8]; --- 6 unchanged lines hidden (view full) --- 80 kk[5] = key[4] << 3 | (key[5] >> 5 & 0xfe); 81 kk[6] = key[5] << 2 | (key[6] >> 6 & 0xfe); 82 kk[7] = key[6] << 1; 83 ksp = malloc(sizeof(des_key_schedule), M_SMBTEMP, M_WAITOK); 84 des_set_key((des_cblock *)kk, *ksp); 85 des_ecb_encrypt((des_cblock *)data, (des_cblock *)dest, *ksp, 1); 86 free(ksp, M_SMBTEMP); 87} |
90#endif | |
91 92 93int 94smb_encrypt(const u_char *apwd, u_char *C8, u_char *RN) 95{ | 88 89 90int 91smb_encrypt(const u_char *apwd, u_char *C8, u_char *RN) 92{ |
96#ifdef NETSMBCRYPTO | |
97 u_char *p, *P14, *S21; 98 99 p = malloc(14 + 21, M_SMBTEMP, M_WAITOK); 100 bzero(p, 14 + 21); 101 P14 = p; 102 S21 = p + 14; 103 bcopy(apwd, P14, min(14, strlen(apwd))); 104 /* 105 * S21 = concat(Ex(P14, N8), zeros(5)); 106 */ 107 smb_E(P14, N8, S21); 108 smb_E(P14 + 7, N8, S21 + 8); 109 110 smb_E(S21, C8, RN); 111 smb_E(S21 + 7, C8, RN + 8); 112 smb_E(S21 + 14, C8, RN + 16); 113 free(p, M_SMBTEMP); 114 return 0; | 93 u_char *p, *P14, *S21; 94 95 p = malloc(14 + 21, M_SMBTEMP, M_WAITOK); 96 bzero(p, 14 + 21); 97 P14 = p; 98 S21 = p + 14; 99 bcopy(apwd, P14, min(14, strlen(apwd))); 100 /* 101 * S21 = concat(Ex(P14, N8), zeros(5)); 102 */ 103 smb_E(P14, N8, S21); 104 smb_E(P14 + 7, N8, S21 + 8); 105 106 smb_E(S21, C8, RN); 107 smb_E(S21 + 7, C8, RN + 8); 108 smb_E(S21 + 14, C8, RN + 16); 109 free(p, M_SMBTEMP); 110 return 0; |
115#else 116 SMBERROR("password encryption is not available\n"); 117 bzero(RN, 24); 118 return EAUTH; 119#endif | |
120} 121 122int 123smb_ntencrypt(const u_char *apwd, u_char *C8, u_char *RN) 124{ | 111} 112 113int 114smb_ntencrypt(const u_char *apwd, u_char *C8, u_char *RN) 115{ |
125#ifdef NETSMBCRYPTO | |
126 u_char S21[21]; 127 u_int16_t *unipwd; 128 MD4_CTX *ctxp; 129 int len; 130 131 len = strlen(apwd); 132 unipwd = malloc((len + 1) * sizeof(u_int16_t), M_SMBTEMP, M_WAITOK); 133 /* --- 7 unchanged lines hidden (view full) --- 141 bzero(S21, 21); 142 MD4Final(S21, ctxp); 143 free(ctxp, M_SMBTEMP); 144 145 smb_E(S21, C8, RN); 146 smb_E(S21 + 7, C8, RN + 8); 147 smb_E(S21 + 14, C8, RN + 16); 148 return 0; | 116 u_char S21[21]; 117 u_int16_t *unipwd; 118 MD4_CTX *ctxp; 119 int len; 120 121 len = strlen(apwd); 122 unipwd = malloc((len + 1) * sizeof(u_int16_t), M_SMBTEMP, M_WAITOK); 123 /* --- 7 unchanged lines hidden (view full) --- 131 bzero(S21, 21); 132 MD4Final(S21, ctxp); 133 free(ctxp, M_SMBTEMP); 134 135 smb_E(S21, C8, RN); 136 smb_E(S21 + 7, C8, RN + 8); 137 smb_E(S21 + 14, C8, RN + 16); 138 return 0; |
149#else 150 SMBERROR("password encryption is not available\n"); 151 bzero(RN, 24); 152 return EAUTH; 153#endif | |
154} 155 156/* 157 * Calculate message authentication code (MAC) key for virtual circuit. 158 */ 159int 160smb_calcmackey(struct smb_vc *vcp) 161{ | 139} 140 141/* 142 * Calculate message authentication code (MAC) key for virtual circuit. 143 */ 144int 145smb_calcmackey(struct smb_vc *vcp) 146{ |
162#ifdef NETSMBCRYPTO | |
163 const char *pwd; 164 u_int16_t *unipwd; 165 int len; 166 MD4_CTX md4; 167 u_char S16[16], S21[21]; 168 169 KASSERT(vcp->vc_hflags2 & SMB_FLAGS2_SECURITY_SIGNATURE, 170 ("signatures not enabled")); --- 34 unchanged lines hidden (view full) --- 205 */ 206 bzero(S21, 21); 207 bcopy(S16, S21, 16); 208 smb_E(S21, vcp->vc_ch, vcp->vc_mackey + 16); 209 smb_E(S21 + 7, vcp->vc_ch, vcp->vc_mackey + 24); 210 smb_E(S21 + 14, vcp->vc_ch, vcp->vc_mackey + 32); 211 212 return (0); | 147 const char *pwd; 148 u_int16_t *unipwd; 149 int len; 150 MD4_CTX md4; 151 u_char S16[16], S21[21]; 152 153 KASSERT(vcp->vc_hflags2 & SMB_FLAGS2_SECURITY_SIGNATURE, 154 ("signatures not enabled")); --- 34 unchanged lines hidden (view full) --- 189 */ 190 bzero(S21, 21); 191 bcopy(S16, S21, 16); 192 smb_E(S21, vcp->vc_ch, vcp->vc_mackey + 16); 193 smb_E(S21 + 7, vcp->vc_ch, vcp->vc_mackey + 24); 194 smb_E(S21 + 14, vcp->vc_ch, vcp->vc_mackey + 32); 195 196 return (0); |
213#else 214 panic("smb_calcmackey: encryption not available"); 215 return (0); 216#endif /* NETSMBCRYPTO */ | |
217} 218 219/* 220 * Sign request with MAC. 221 */ 222int 223smb_rq_sign(struct smb_rq *rqp) 224{ | 197} 198 199/* 200 * Sign request with MAC. 201 */ 202int 203smb_rq_sign(struct smb_rq *rqp) 204{ |
225#ifdef NETSMBCRYPTO | |
226 struct smb_vc *vcp = rqp->sr_vc; 227 struct mbchain *mbp; 228 struct mbuf *mb; 229 MD5_CTX md5; 230 u_char digest[16]; 231 232 KASSERT(vcp->vc_hflags2 & SMB_FLAGS2_SECURITY_SIGNATURE, 233 ("signatures not enabled")); --- 39 unchanged lines hidden (view full) --- 273 MD5Init(&md5); 274 MD5Update(&md5, vcp->vc_mackey, vcp->vc_mackeylen); 275 for (mb = mbp->mb_top; mb != NULL; mb = mb->m_next) 276 MD5Update(&md5, mtod(mb, void *), mb->m_len); 277 MD5Final(digest, &md5); 278 bcopy(digest, rqp->sr_rqsig, 8); 279 280 return (0); | 205 struct smb_vc *vcp = rqp->sr_vc; 206 struct mbchain *mbp; 207 struct mbuf *mb; 208 MD5_CTX md5; 209 u_char digest[16]; 210 211 KASSERT(vcp->vc_hflags2 & SMB_FLAGS2_SECURITY_SIGNATURE, 212 ("signatures not enabled")); --- 39 unchanged lines hidden (view full) --- 252 MD5Init(&md5); 253 MD5Update(&md5, vcp->vc_mackey, vcp->vc_mackeylen); 254 for (mb = mbp->mb_top; mb != NULL; mb = mb->m_next) 255 MD5Update(&md5, mtod(mb, void *), mb->m_len); 256 MD5Final(digest, &md5); 257 bcopy(digest, rqp->sr_rqsig, 8); 258 259 return (0); |
281#else 282 panic("smb_rq_sign: encryption not available"); 283 return (0); 284#endif /* NETSMBCRYPTO */ | |
285} 286 287/* 288 * Verify reply signature. 289 */ 290int 291smb_rq_verify(struct smb_rq *rqp) 292{ | 260} 261 262/* 263 * Verify reply signature. 264 */ 265int 266smb_rq_verify(struct smb_rq *rqp) 267{ |
293#ifdef NETSMBCRYPTO | |
294 struct smb_vc *vcp = rqp->sr_vc; 295 struct mdchain *mdp; 296 u_char sigbuf[8]; 297 MD5_CTX md5; 298 u_char digest[16]; 299 struct mbuf *mb; 300 301 KASSERT(vcp->vc_hflags2 & SMB_FLAGS2_SECURITY_SIGNATURE, --- 25 unchanged lines hidden (view full) --- 327 328 /* 329 * Now verify the signature. 330 */ 331 if (bcmp(mtod(mdp->md_top, u_char *) + 14, digest, 8) != 0) 332 return (EAUTH); 333 334 return (0); | 268 struct smb_vc *vcp = rqp->sr_vc; 269 struct mdchain *mdp; 270 u_char sigbuf[8]; 271 MD5_CTX md5; 272 u_char digest[16]; 273 struct mbuf *mb; 274 275 KASSERT(vcp->vc_hflags2 & SMB_FLAGS2_SECURITY_SIGNATURE, --- 25 unchanged lines hidden (view full) --- 301 302 /* 303 * Now verify the signature. 304 */ 305 if (bcmp(mtod(mdp->md_top, u_char *) + 14, digest, 8) != 0) 306 return (EAUTH); 307 308 return (0); |
335#else 336 panic("smb_rq_verify: encryption not available"); 337 return (0); 338#endif /* NETSMBCRYPTO */ | |
339} | 309} |