1 /* 2 * 3 * cipher.c 4 * 5 * Author: Tatu Ylonen <ylo@cs.hut.fi> 6 * 7 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland 8 * All rights reserved 9 * 10 * Created: Wed Apr 19 17:41:39 1995 ylo 11 * 12 * $FreeBSD$ 13 */ 14 15 #include "includes.h" 16 RCSID("$Id: cipher.c,v 1.27 2000/05/22 18:42:00 markus Exp $"); 17 18 #include "ssh.h" 19 #include "cipher.h" 20 #include "xmalloc.h" 21 22 #include <openssl/md5.h> 23 24 /* 25 * This is used by SSH1: 26 * 27 * What kind of triple DES are these 2 routines? 28 * 29 * Why is there a redundant initialization vector? 30 * 31 * If only iv3 was used, then, this would till effect have been 32 * outer-cbc. However, there is also a private iv1 == iv2 which 33 * perhaps makes differential analysis easier. On the other hand, the 34 * private iv1 probably makes the CRC-32 attack ineffective. This is a 35 * result of that there is no longer any known iv1 to use when 36 * choosing the X block. 37 */ 38 void 39 SSH_3CBC_ENCRYPT(des_key_schedule ks1, 40 des_key_schedule ks2, des_cblock * iv2, 41 des_key_schedule ks3, des_cblock * iv3, 42 unsigned char *dest, unsigned char *src, 43 unsigned int len) 44 { 45 des_cblock iv1; 46 47 memcpy(&iv1, iv2, 8); 48 49 des_cbc_encrypt(src, dest, len, ks1, &iv1, DES_ENCRYPT); 50 memcpy(&iv1, dest + len - 8, 8); 51 52 des_cbc_encrypt(dest, dest, len, ks2, iv2, DES_DECRYPT); 53 memcpy(iv2, &iv1, 8); /* Note how iv1 == iv2 on entry and exit. */ 54 55 des_cbc_encrypt(dest, dest, len, ks3, iv3, DES_ENCRYPT); 56 memcpy(iv3, dest + len - 8, 8); 57 } 58 59 void 60 SSH_3CBC_DECRYPT(des_key_schedule ks1, 61 des_key_schedule ks2, des_cblock * iv2, 62 des_key_schedule ks3, des_cblock * iv3, 63 unsigned char *dest, unsigned char *src, 64 unsigned int len) 65 { 66 des_cblock iv1; 67 68 memcpy(&iv1, iv2, 8); 69 70 des_cbc_encrypt(src, dest, len, ks3, iv3, DES_DECRYPT); 71 memcpy(iv3, src + len - 8, 8); 72 73 des_cbc_encrypt(dest, dest, len, ks2, iv2, DES_ENCRYPT); 74 memcpy(iv2, dest + len - 8, 8); 75 76 des_cbc_encrypt(dest, dest, len, ks1, &iv1, DES_DECRYPT); 77 /* memcpy(&iv1, iv2, 8); */ 78 /* Note how iv1 == iv2 on entry and exit. */ 79 } 80 81 /* 82 * SSH1 uses a variation on Blowfish, all bytes must be swapped before 83 * and after encryption/decryption. Thus the swap_bytes stuff (yuk). 84 */ 85 static void 86 swap_bytes(const unsigned char *src, unsigned char *dst_, int n) 87 { 88 /* dst must be properly aligned. */ 89 u_int32_t *dst = (u_int32_t *) dst_; 90 union { 91 u_int32_t i; 92 char c[4]; 93 } t; 94 95 /* Process 8 bytes every lap. */ 96 for (n = n / 8; n > 0; n--) { 97 t.c[3] = *src++; 98 t.c[2] = *src++; 99 t.c[1] = *src++; 100 t.c[0] = *src++; 101 *dst++ = t.i; 102 103 t.c[3] = *src++; 104 t.c[2] = *src++; 105 t.c[1] = *src++; 106 t.c[0] = *src++; 107 *dst++ = t.i; 108 } 109 } 110 111 /* 112 * Names of all encryption algorithms. 113 * These must match the numbers defined in cipher.h. 114 */ 115 static char *cipher_names[] = 116 { 117 "none", 118 "idea", 119 "des", 120 "3des", 121 "tss", 122 "rc4", 123 "blowfish", 124 "reserved", 125 "blowfish-cbc", 126 "3des-cbc", 127 "arcfour", 128 "cast128-cbc" 129 }; 130 131 /* 132 * Returns a bit mask indicating which ciphers are supported by this 133 * implementation. The bit mask has the corresponding bit set of each 134 * supported cipher. 135 */ 136 137 unsigned int 138 cipher_mask1() 139 { 140 unsigned int mask = 0; 141 mask |= 1 << SSH_CIPHER_3DES; /* Mandatory */ 142 mask |= 1 << SSH_CIPHER_BLOWFISH; 143 return mask; 144 } 145 unsigned int 146 cipher_mask2() 147 { 148 unsigned int mask = 0; 149 mask |= 1 << SSH_CIPHER_BLOWFISH_CBC; 150 mask |= 1 << SSH_CIPHER_3DES_CBC; 151 mask |= 1 << SSH_CIPHER_ARCFOUR; 152 mask |= 1 << SSH_CIPHER_CAST128_CBC; 153 return mask; 154 } 155 unsigned int 156 cipher_mask() 157 { 158 return cipher_mask1() | cipher_mask2(); 159 } 160 161 /* Returns the name of the cipher. */ 162 163 const char * 164 cipher_name(int cipher) 165 { 166 if (cipher < 0 || cipher >= sizeof(cipher_names) / sizeof(cipher_names[0]) || 167 cipher_names[cipher] == NULL) 168 fatal("cipher_name: bad cipher name: %d", cipher); 169 return cipher_names[cipher]; 170 } 171 172 /* Returns 1 if the name of the ciphers are valid. */ 173 174 #define CIPHER_SEP "," 175 int 176 ciphers_valid(const char *names) 177 { 178 char *ciphers; 179 char *p; 180 int i; 181 182 if (names == NULL || strcmp(names, "") == 0) 183 return 0; 184 ciphers = xstrdup(names); 185 for ((p = strtok(ciphers, CIPHER_SEP)); p; (p = strtok(NULL, CIPHER_SEP))) { 186 i = cipher_number(p); 187 if (i == -1 || !(cipher_mask2() & (1 << i))) { 188 xfree(ciphers); 189 return 0; 190 } 191 } 192 xfree(ciphers); 193 return 1; 194 } 195 196 /* 197 * Parses the name of the cipher. Returns the number of the corresponding 198 * cipher, or -1 on error. 199 */ 200 201 int 202 cipher_number(const char *name) 203 { 204 int i; 205 if (name == NULL) 206 return -1; 207 for (i = 0; i < sizeof(cipher_names) / sizeof(cipher_names[0]); i++) 208 if (strcmp(cipher_names[i], name) == 0 && 209 (cipher_mask() & (1 << i))) 210 return i; 211 return -1; 212 } 213 214 /* 215 * Selects the cipher, and keys if by computing the MD5 checksum of the 216 * passphrase and using the resulting 16 bytes as the key. 217 */ 218 219 void 220 cipher_set_key_string(CipherContext *context, int cipher, const char *passphrase) 221 { 222 MD5_CTX md; 223 unsigned char digest[16]; 224 225 MD5_Init(&md); 226 MD5_Update(&md, (const unsigned char *) passphrase, strlen(passphrase)); 227 MD5_Final(digest, &md); 228 229 cipher_set_key(context, cipher, digest, 16); 230 231 memset(digest, 0, sizeof(digest)); 232 memset(&md, 0, sizeof(md)); 233 } 234 235 /* Selects the cipher to use and sets the key. */ 236 237 void 238 cipher_set_key(CipherContext *context, int cipher, const unsigned char *key, 239 int keylen) 240 { 241 unsigned char padded[32]; 242 243 /* Set cipher type. */ 244 context->type = cipher; 245 246 /* Get 32 bytes of key data. Pad if necessary. (So that code 247 below does not need to worry about key size). */ 248 memset(padded, 0, sizeof(padded)); 249 memcpy(padded, key, keylen < sizeof(padded) ? keylen : sizeof(padded)); 250 251 /* Initialize the initialization vector. */ 252 switch (cipher) { 253 case SSH_CIPHER_NONE: 254 /* 255 * Has to stay for authfile saving of private key with no 256 * passphrase 257 */ 258 break; 259 260 case SSH_CIPHER_3DES: 261 /* 262 * Note: the least significant bit of each byte of key is 263 * parity, and must be ignored by the implementation. 16 264 * bytes of key are used (first and last keys are the same). 265 */ 266 if (keylen < 16) 267 error("Key length %d is insufficient for 3DES.", keylen); 268 des_set_key((void *) padded, context->u.des3.key1); 269 des_set_key((void *) (padded + 8), context->u.des3.key2); 270 if (keylen <= 16) 271 des_set_key((void *) padded, context->u.des3.key3); 272 else 273 des_set_key((void *) (padded + 16), context->u.des3.key3); 274 memset(context->u.des3.iv2, 0, sizeof(context->u.des3.iv2)); 275 memset(context->u.des3.iv3, 0, sizeof(context->u.des3.iv3)); 276 break; 277 278 case SSH_CIPHER_BLOWFISH: 279 if (keylen < 16) 280 error("Key length %d is insufficient for blowfish.", keylen); 281 BF_set_key(&context->u.bf.key, keylen, padded); 282 memset(context->u.bf.iv, 0, 8); 283 break; 284 285 case SSH_CIPHER_3DES_CBC: 286 case SSH_CIPHER_BLOWFISH_CBC: 287 case SSH_CIPHER_ARCFOUR: 288 case SSH_CIPHER_CAST128_CBC: 289 fatal("cipher_set_key: illegal cipher: %s", cipher_name(cipher)); 290 break; 291 292 default: 293 fatal("cipher_set_key: unknown cipher: %s", cipher_name(cipher)); 294 } 295 memset(padded, 0, sizeof(padded)); 296 } 297 298 void 299 cipher_set_key_iv(CipherContext * context, int cipher, 300 const unsigned char *key, int keylen, 301 const unsigned char *iv, int ivlen) 302 { 303 /* Set cipher type. */ 304 context->type = cipher; 305 306 /* Initialize the initialization vector. */ 307 switch (cipher) { 308 case SSH_CIPHER_NONE: 309 break; 310 311 case SSH_CIPHER_3DES: 312 case SSH_CIPHER_BLOWFISH: 313 fatal("cipher_set_key_iv: illegal cipher: %s", cipher_name(cipher)); 314 break; 315 316 case SSH_CIPHER_3DES_CBC: 317 if (keylen < 24) 318 error("Key length %d is insufficient for 3des-cbc.", keylen); 319 des_set_key((void *) key, context->u.des3.key1); 320 des_set_key((void *) (key+8), context->u.des3.key2); 321 des_set_key((void *) (key+16), context->u.des3.key3); 322 if (ivlen < 8) 323 error("IV length %d is insufficient for 3des-cbc.", ivlen); 324 memcpy(context->u.des3.iv3, (char *)iv, 8); 325 break; 326 327 case SSH_CIPHER_BLOWFISH_CBC: 328 if (keylen < 16) 329 error("Key length %d is insufficient for blowfish.", keylen); 330 if (ivlen < 8) 331 error("IV length %d is insufficient for blowfish.", ivlen); 332 BF_set_key(&context->u.bf.key, keylen, (unsigned char *)key); 333 memcpy(context->u.bf.iv, (char *)iv, 8); 334 break; 335 336 case SSH_CIPHER_ARCFOUR: 337 if (keylen < 16) 338 error("Key length %d is insufficient for arcfour.", keylen); 339 RC4_set_key(&context->u.rc4, keylen, (unsigned char *)key); 340 break; 341 342 case SSH_CIPHER_CAST128_CBC: 343 if (keylen < 16) 344 error("Key length %d is insufficient for cast128.", keylen); 345 if (ivlen < 8) 346 error("IV length %d is insufficient for cast128.", ivlen); 347 CAST_set_key(&context->u.cast.key, keylen, (unsigned char *) key); 348 memcpy(context->u.cast.iv, (char *)iv, 8); 349 break; 350 351 default: 352 fatal("cipher_set_key: unknown cipher: %s", cipher_name(cipher)); 353 } 354 } 355 356 /* Encrypts data using the cipher. */ 357 358 void 359 cipher_encrypt(CipherContext *context, unsigned char *dest, 360 const unsigned char *src, unsigned int len) 361 { 362 if ((len & 7) != 0) 363 fatal("cipher_encrypt: bad plaintext length %d", len); 364 365 switch (context->type) { 366 case SSH_CIPHER_NONE: 367 memcpy(dest, src, len); 368 break; 369 370 case SSH_CIPHER_3DES: 371 SSH_3CBC_ENCRYPT(context->u.des3.key1, 372 context->u.des3.key2, &context->u.des3.iv2, 373 context->u.des3.key3, &context->u.des3.iv3, 374 dest, (unsigned char *) src, len); 375 break; 376 377 case SSH_CIPHER_BLOWFISH: 378 swap_bytes(src, dest, len); 379 BF_cbc_encrypt(dest, dest, len, 380 &context->u.bf.key, context->u.bf.iv, 381 BF_ENCRYPT); 382 swap_bytes(dest, dest, len); 383 break; 384 385 case SSH_CIPHER_BLOWFISH_CBC: 386 BF_cbc_encrypt((void *)src, dest, len, 387 &context->u.bf.key, context->u.bf.iv, 388 BF_ENCRYPT); 389 break; 390 391 case SSH_CIPHER_3DES_CBC: 392 des_ede3_cbc_encrypt(src, dest, len, 393 context->u.des3.key1, context->u.des3.key2, 394 context->u.des3.key3, &context->u.des3.iv3, DES_ENCRYPT); 395 break; 396 397 case SSH_CIPHER_ARCFOUR: 398 RC4(&context->u.rc4, len, (unsigned char *)src, dest); 399 break; 400 401 case SSH_CIPHER_CAST128_CBC: 402 CAST_cbc_encrypt(src, dest, len, 403 &context->u.cast.key, context->u.cast.iv, CAST_ENCRYPT); 404 break; 405 406 default: 407 fatal("cipher_encrypt: unknown cipher: %s", cipher_name(context->type)); 408 } 409 } 410 411 /* Decrypts data using the cipher. */ 412 413 void 414 cipher_decrypt(CipherContext *context, unsigned char *dest, 415 const unsigned char *src, unsigned int len) 416 { 417 if ((len & 7) != 0) 418 fatal("cipher_decrypt: bad ciphertext length %d", len); 419 420 switch (context->type) { 421 case SSH_CIPHER_NONE: 422 memcpy(dest, src, len); 423 break; 424 425 case SSH_CIPHER_3DES: 426 SSH_3CBC_DECRYPT(context->u.des3.key1, 427 context->u.des3.key2, &context->u.des3.iv2, 428 context->u.des3.key3, &context->u.des3.iv3, 429 dest, (unsigned char *) src, len); 430 break; 431 432 case SSH_CIPHER_BLOWFISH: 433 swap_bytes(src, dest, len); 434 BF_cbc_encrypt((void *) dest, dest, len, 435 &context->u.bf.key, context->u.bf.iv, 436 BF_DECRYPT); 437 swap_bytes(dest, dest, len); 438 break; 439 440 case SSH_CIPHER_BLOWFISH_CBC: 441 BF_cbc_encrypt((void *) src, dest, len, 442 &context->u.bf.key, context->u.bf.iv, 443 BF_DECRYPT); 444 break; 445 446 case SSH_CIPHER_3DES_CBC: 447 des_ede3_cbc_encrypt(src, dest, len, 448 context->u.des3.key1, context->u.des3.key2, 449 context->u.des3.key3, &context->u.des3.iv3, DES_DECRYPT); 450 break; 451 452 case SSH_CIPHER_ARCFOUR: 453 RC4(&context->u.rc4, len, (unsigned char *)src, dest); 454 break; 455 456 case SSH_CIPHER_CAST128_CBC: 457 CAST_cbc_encrypt(src, dest, len, 458 &context->u.cast.key, context->u.cast.iv, CAST_DECRYPT); 459 break; 460 461 default: 462 fatal("cipher_decrypt: unknown cipher: %s", cipher_name(context->type)); 463 } 464 } 465