blob: 92fcd4740534d1b26749a3b00f5edab4f6ba315f [file] [log] [blame]
Damien Millerd4a8b7e1999-10-27 13:42:43 +10001/*
Damien Miller95def091999-11-25 00:26:21 +11002 *
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 */
Damien Millerd4a8b7e1999-10-27 13:42:43 +100013
14#include "includes.h"
Damien Miller95def091999-11-25 00:26:21 +110015RCSID("$Id: cipher.c,v 1.7 1999/11/24 13:26:22 damien Exp $");
Damien Millerd4a8b7e1999-10-27 13:42:43 +100016
17#include "ssh.h"
18#include "cipher.h"
19
Damien Miller7f6ea021999-10-28 13:25:17 +100020#ifdef HAVE_OPENSSL
Damien Millerd4a8b7e1999-10-27 13:42:43 +100021#include <openssl/md5.h>
Damien Miller7f6ea021999-10-28 13:25:17 +100022#endif
23#ifdef HAVE_SSL
24#include <ssl/md5.h>
25#endif
Damien Millerd4a8b7e1999-10-27 13:42:43 +100026
27/*
28 * What kind of tripple DES are these 2 routines?
29 *
30 * Why is there a redundant initialization vector?
31 *
32 * If only iv3 was used, then, this would till effect have been
33 * outer-cbc. However, there is also a private iv1 == iv2 which
34 * perhaps makes differential analysis easier. On the other hand, the
35 * private iv1 probably makes the CRC-32 attack ineffective. This is a
36 * result of that there is no longer any known iv1 to use when
37 * choosing the X block.
38 */
39void
40SSH_3CBC_ENCRYPT(des_key_schedule ks1,
Damien Miller95def091999-11-25 00:26:21 +110041 des_key_schedule ks2, des_cblock * iv2,
42 des_key_schedule ks3, des_cblock * iv3,
Damien Millerd4a8b7e1999-10-27 13:42:43 +100043 void *dest, void *src,
44 unsigned int len)
45{
Damien Miller95def091999-11-25 00:26:21 +110046 des_cblock iv1;
Damien Millerd4a8b7e1999-10-27 13:42:43 +100047
Damien Miller95def091999-11-25 00:26:21 +110048 memcpy(&iv1, iv2, 8);
Damien Millerd4a8b7e1999-10-27 13:42:43 +100049
Damien Miller95def091999-11-25 00:26:21 +110050 des_cbc_encrypt(src, dest, len, ks1, &iv1, DES_ENCRYPT);
51 memcpy(&iv1, dest + len - 8, 8);
Damien Millerd4a8b7e1999-10-27 13:42:43 +100052
Damien Miller95def091999-11-25 00:26:21 +110053 des_cbc_encrypt(dest, dest, len, ks2, iv2, DES_DECRYPT);
54 memcpy(iv2, &iv1, 8); /* Note how iv1 == iv2 on entry and exit. */
Damien Millerd4a8b7e1999-10-27 13:42:43 +100055
Damien Miller95def091999-11-25 00:26:21 +110056 des_cbc_encrypt(dest, dest, len, ks3, iv3, DES_ENCRYPT);
57 memcpy(iv3, dest + len - 8, 8);
Damien Millerd4a8b7e1999-10-27 13:42:43 +100058}
59
60void
61SSH_3CBC_DECRYPT(des_key_schedule ks1,
Damien Miller95def091999-11-25 00:26:21 +110062 des_key_schedule ks2, des_cblock * iv2,
63 des_key_schedule ks3, des_cblock * iv3,
Damien Millerd4a8b7e1999-10-27 13:42:43 +100064 void *dest, void *src,
65 unsigned int len)
66{
Damien Miller95def091999-11-25 00:26:21 +110067 des_cblock iv1;
Damien Millerd4a8b7e1999-10-27 13:42:43 +100068
Damien Miller95def091999-11-25 00:26:21 +110069 memcpy(&iv1, iv2, 8);
Damien Millerd4a8b7e1999-10-27 13:42:43 +100070
Damien Miller95def091999-11-25 00:26:21 +110071 des_cbc_encrypt(src, dest, len, ks3, iv3, DES_DECRYPT);
72 memcpy(iv3, src + len - 8, 8);
Damien Millerd4a8b7e1999-10-27 13:42:43 +100073
Damien Miller95def091999-11-25 00:26:21 +110074 des_cbc_encrypt(dest, dest, len, ks2, iv2, DES_ENCRYPT);
75 memcpy(iv2, dest + len - 8, 8);
Damien Millerd4a8b7e1999-10-27 13:42:43 +100076
Damien Miller95def091999-11-25 00:26:21 +110077 des_cbc_encrypt(dest, dest, len, ks1, &iv1, DES_DECRYPT);
78 /* memcpy(&iv1, iv2, 8); */
79 /* Note how iv1 == iv2 on entry and exit. */
Damien Millerd4a8b7e1999-10-27 13:42:43 +100080}
81
82/*
83 * SSH uses a variation on Blowfish, all bytes must be swapped before
84 * and after encryption/decryption. Thus the swap_bytes stuff (yuk).
85 */
Damien Miller95def091999-11-25 00:26:21 +110086static void
Damien Millerd4a8b7e1999-10-27 13:42:43 +100087swap_bytes(const unsigned char *src, unsigned char *dst_, int n)
88{
Damien Miller95def091999-11-25 00:26:21 +110089 /* dst must be properly aligned. */
90 u_int32_t *dst = (u_int32_t *) dst_;
91 union {
92 u_int32_t i;
93 char c[4];
94 } t;
Damien Millerd4a8b7e1999-10-27 13:42:43 +100095
Damien Miller95def091999-11-25 00:26:21 +110096 /* Process 8 bytes every lap. */
97 for (n = n / 8; n > 0; n--) {
98 t.c[3] = *src++;
99 t.c[2] = *src++;
100 t.c[1] = *src++;
101 t.c[0] = *src++;
102 *dst++ = t.i;
103
104 t.c[3] = *src++;
105 t.c[2] = *src++;
106 t.c[1] = *src++;
107 t.c[0] = *src++;
108 *dst++ = t.i;
109 }
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000110}
111
Damien Miller95def091999-11-25 00:26:21 +1100112void (*cipher_attack_detected) (const char *fmt,...) = fatal;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000113
Damien Miller95def091999-11-25 00:26:21 +1100114static inline void
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000115detect_cbc_attack(const unsigned char *src,
116 unsigned int len)
117{
Damien Miller95def091999-11-25 00:26:21 +1100118 return;
119
120 log("CRC-32 CBC insertion attack detected");
121 cipher_attack_detected("CRC-32 CBC insertion attack detected");
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000122}
123
124/* Names of all encryption algorithms. These must match the numbers defined
125 int cipher.h. */
126static char *cipher_names[] =
127{
Damien Miller95def091999-11-25 00:26:21 +1100128 "none",
129 "idea",
130 "des",
131 "3des",
132 "tss",
133 "rc4",
134 "blowfish"
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000135};
136
137/* Returns a bit mask indicating which ciphers are supported by this
138 implementation. The bit mask has the corresponding bit set of each
139 supported cipher. */
140
Damien Miller95def091999-11-25 00:26:21 +1100141unsigned int
142cipher_mask()
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000143{
Damien Miller95def091999-11-25 00:26:21 +1100144 unsigned int mask = 0;
145 mask |= 1 << SSH_CIPHER_3DES; /* Mandatory */
146 mask |= 1 << SSH_CIPHER_BLOWFISH;
147 return mask;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000148}
149
150/* Returns the name of the cipher. */
151
Damien Miller95def091999-11-25 00:26:21 +1100152const char *
153cipher_name(int cipher)
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000154{
Damien Miller95def091999-11-25 00:26:21 +1100155 if (cipher < 0 || cipher >= sizeof(cipher_names) / sizeof(cipher_names[0]) ||
156 cipher_names[cipher] == NULL)
157 fatal("cipher_name: bad cipher number: %d", cipher);
158 return cipher_names[cipher];
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000159}
160
161/* Parses the name of the cipher. Returns the number of the corresponding
162 cipher, or -1 on error. */
163
164int
165cipher_number(const char *name)
166{
Damien Miller95def091999-11-25 00:26:21 +1100167 int i;
168 for (i = 0; i < sizeof(cipher_names) / sizeof(cipher_names[0]); i++)
169 if (strcmp(cipher_names[i], name) == 0 &&
170 (cipher_mask() & (1 << i)))
171 return i;
172 return -1;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000173}
174
175/* Selects the cipher, and keys if by computing the MD5 checksum of the
176 passphrase and using the resulting 16 bytes as the key. */
177
Damien Miller95def091999-11-25 00:26:21 +1100178void
179cipher_set_key_string(CipherContext *context, int cipher,
180 const char *passphrase, int for_encryption)
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000181{
Damien Miller95def091999-11-25 00:26:21 +1100182 MD5_CTX md;
183 unsigned char digest[16];
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000184
Damien Miller95def091999-11-25 00:26:21 +1100185 MD5_Init(&md);
186 MD5_Update(&md, (const unsigned char *) passphrase, strlen(passphrase));
187 MD5_Final(digest, &md);
188
189 cipher_set_key(context, cipher, digest, 16, for_encryption);
190
191 memset(digest, 0, sizeof(digest));
192 memset(&md, 0, sizeof(md));
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000193}
194
195/* Selects the cipher to use and sets the key. */
196
Damien Miller95def091999-11-25 00:26:21 +1100197void
198cipher_set_key(CipherContext *context, int cipher,
199 const unsigned char *key, int keylen, int for_encryption)
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000200{
Damien Miller95def091999-11-25 00:26:21 +1100201 unsigned char padded[32];
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000202
Damien Miller95def091999-11-25 00:26:21 +1100203 /* Set cipher type. */
204 context->type = cipher;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000205
Damien Miller95def091999-11-25 00:26:21 +1100206 /* Get 32 bytes of key data. Pad if necessary. (So that code
207 below does not need to worry about key size). */
208 memset(padded, 0, sizeof(padded));
209 memcpy(padded, key, keylen < sizeof(padded) ? keylen : sizeof(padded));
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000210
Damien Miller95def091999-11-25 00:26:21 +1100211 /* Initialize the initialization vector. */
212 switch (cipher) {
213 case SSH_CIPHER_NONE:
214 /* Has to stay for authfile saving of private key with
215 no passphrase */
216 break;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000217
Damien Miller95def091999-11-25 00:26:21 +1100218 case SSH_CIPHER_3DES:
219 /* Note: the least significant bit of each byte of key is
220 parity, and must be ignored by the implementation. 16
221 bytes of key are used (first and last keys are the
222 same). */
223 if (keylen < 16)
224 error("Key length %d is insufficient for 3DES.", keylen);
225 des_set_key((void *) padded, context->u.des3.key1);
226 des_set_key((void *) (padded + 8), context->u.des3.key2);
227 if (keylen <= 16)
228 des_set_key((void *) padded, context->u.des3.key3);
229 else
230 des_set_key((void *) (padded + 16), context->u.des3.key3);
231 memset(context->u.des3.iv2, 0, sizeof(context->u.des3.iv2));
232 memset(context->u.des3.iv3, 0, sizeof(context->u.des3.iv3));
233 break;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000234
Damien Miller95def091999-11-25 00:26:21 +1100235 case SSH_CIPHER_BLOWFISH:
236 BF_set_key(&context->u.bf.key, keylen, padded);
237 memset(context->u.bf.iv, 0, 8);
238 break;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000239
Damien Miller95def091999-11-25 00:26:21 +1100240 default:
241 fatal("cipher_set_key: unknown cipher: %s", cipher_name(cipher));
242 }
243 memset(padded, 0, sizeof(padded));
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000244}
245
246/* Encrypts data using the cipher. */
247
Damien Miller95def091999-11-25 00:26:21 +1100248void
249cipher_encrypt(CipherContext *context, unsigned char *dest,
250 const unsigned char *src, unsigned int len)
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000251{
Damien Miller95def091999-11-25 00:26:21 +1100252 if ((len & 7) != 0)
253 fatal("cipher_encrypt: bad plaintext length %d", len);
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000254
Damien Miller95def091999-11-25 00:26:21 +1100255 switch (context->type) {
256 case SSH_CIPHER_NONE:
257 memcpy(dest, src, len);
258 break;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000259
Damien Miller95def091999-11-25 00:26:21 +1100260 case SSH_CIPHER_3DES:
261 SSH_3CBC_ENCRYPT(context->u.des3.key1,
262 context->u.des3.key2, &context->u.des3.iv2,
263 context->u.des3.key3, &context->u.des3.iv3,
264 dest, (void *) src, len);
265 break;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000266
Damien Miller95def091999-11-25 00:26:21 +1100267 case SSH_CIPHER_BLOWFISH:
268 swap_bytes(src, dest, len);
269 BF_cbc_encrypt(dest, dest, len,
270 &context->u.bf.key, context->u.bf.iv,
271 BF_ENCRYPT);
272 swap_bytes(dest, dest, len);
273 break;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000274
Damien Miller95def091999-11-25 00:26:21 +1100275 default:
276 fatal("cipher_encrypt: unknown cipher: %s", cipher_name(context->type));
277 }
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000278}
Damien Miller95def091999-11-25 00:26:21 +1100279
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000280/* Decrypts data using the cipher. */
281
Damien Miller95def091999-11-25 00:26:21 +1100282void
283cipher_decrypt(CipherContext *context, unsigned char *dest,
284 const unsigned char *src, unsigned int len)
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000285{
Damien Miller95def091999-11-25 00:26:21 +1100286 if ((len & 7) != 0)
287 fatal("cipher_decrypt: bad ciphertext length %d", len);
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000288
Damien Miller95def091999-11-25 00:26:21 +1100289 switch (context->type) {
290 case SSH_CIPHER_NONE:
291 memcpy(dest, src, len);
292 break;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000293
Damien Miller95def091999-11-25 00:26:21 +1100294 case SSH_CIPHER_3DES:
295 /* CRC-32 attack? */
296 SSH_3CBC_DECRYPT(context->u.des3.key1,
297 context->u.des3.key2, &context->u.des3.iv2,
298 context->u.des3.key3, &context->u.des3.iv3,
299 dest, (void *) src, len);
300 break;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000301
Damien Miller95def091999-11-25 00:26:21 +1100302 case SSH_CIPHER_BLOWFISH:
303 detect_cbc_attack(src, len);
304 swap_bytes(src, dest, len);
305 BF_cbc_encrypt((void *) dest, dest, len,
306 &context->u.bf.key, context->u.bf.iv,
307 BF_DECRYPT);
308 swap_bytes(dest, dest, len);
309 break;
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000310
Damien Miller95def091999-11-25 00:26:21 +1100311 default:
312 fatal("cipher_decrypt: unknown cipher: %s", cipher_name(context->type));
313 }
Damien Millerd4a8b7e1999-10-27 13:42:43 +1000314}