xref: /openbsd/sbin/isakmpd/crypto.c (revision cca36db2)
1 /* $OpenBSD: crypto.c,v 1.31 2010/10/19 07:47:34 mikeb Exp $	 */
2 /* $EOM: crypto.c,v 1.32 2000/03/07 20:08:51 niklas Exp $	 */
3 
4 /*
5  * Copyright (c) 1998 Niels Provos.  All rights reserved.
6  * Copyright (c) 1999, 2000 Niklas Hallqvist.  All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 /*
30  * This code was written under funding by Ericsson Radio Systems.
31  */
32 
33 #include <sys/param.h>
34 #include <stdlib.h>
35 #include <string.h>
36 
37 #include "crypto.h"
38 #include "log.h"
39 
40 enum cryptoerr  des1_init(struct keystate *, u_int8_t *, u_int16_t);
41 enum cryptoerr  des3_init(struct keystate *, u_int8_t *, u_int16_t);
42 enum cryptoerr  blf_init(struct keystate *, u_int8_t *, u_int16_t);
43 enum cryptoerr  cast_init(struct keystate *, u_int8_t *, u_int16_t);
44 enum cryptoerr  aes_init(struct keystate *, u_int8_t *, u_int16_t);
45 void            des1_encrypt(struct keystate *, u_int8_t *, u_int16_t);
46 void            des1_decrypt(struct keystate *, u_int8_t *, u_int16_t);
47 void            des3_encrypt(struct keystate *, u_int8_t *, u_int16_t);
48 void            des3_decrypt(struct keystate *, u_int8_t *, u_int16_t);
49 void            blf_encrypt(struct keystate *, u_int8_t *, u_int16_t);
50 void            blf_decrypt(struct keystate *, u_int8_t *, u_int16_t);
51 void            cast1_encrypt(struct keystate *, u_int8_t *, u_int16_t);
52 void            cast1_decrypt(struct keystate *, u_int8_t *, u_int16_t);
53 void            aes_encrypt(struct keystate *, u_int8_t *, u_int16_t);
54 void            aes_decrypt(struct keystate *, u_int8_t *, u_int16_t);
55 
56 struct crypto_xf transforms[] = {
57 	{
58 		DES_CBC, "Data Encryption Standard (CBC-Mode)", 8, 8,
59 		BLOCKSIZE, 0,
60 		des1_init,
61 		des1_encrypt, des1_decrypt
62 	},
63 	{
64 		TRIPLEDES_CBC, "Triple-DES (CBC-Mode)", 24, 24,
65 		BLOCKSIZE, 0,
66 		des3_init,
67 		des3_encrypt, des3_decrypt
68 	},
69 	{
70 		BLOWFISH_CBC, "Blowfish (CBC-Mode)", 12, 56,
71 		BLOCKSIZE, 0,
72 		blf_init,
73 		blf_encrypt, blf_decrypt
74 	},
75 	{
76 		CAST_CBC, "CAST (CBC-Mode)", 12, 16,
77 		BLOCKSIZE, 0,
78 		cast_init,
79 		cast1_encrypt, cast1_decrypt
80 	},
81 	{
82 		AES_CBC, "AES (CBC-Mode)", 16, 32,
83 		AES_BLOCK_SIZE, 0,
84 		aes_init,
85 		aes_encrypt, aes_decrypt
86 	},
87 };
88 
89 enum cryptoerr
90 des1_init(struct keystate *ks, u_int8_t *key, u_int16_t len)
91 {
92 	/* DES_set_key returns -1 for parity problems, and -2 for weak keys */
93 	DES_set_odd_parity((void *)key);
94 	switch (DES_set_key((void *)key, &ks->ks_des[0])) {
95 	case -2:
96 		return EWEAKKEY;
97 	default:
98 		return EOKAY;
99 	}
100 }
101 
102 void
103 des1_encrypt(struct keystate *ks, u_int8_t *d, u_int16_t len)
104 {
105 	DES_cbc_encrypt((void *)d, (void *)d, len, &ks->ks_des[0], (void *)ks->riv,
106 	    DES_ENCRYPT);
107 }
108 
109 void
110 des1_decrypt(struct keystate *ks, u_int8_t *d, u_int16_t len)
111 {
112 	DES_cbc_encrypt((void *)d, (void *)d, len, &ks->ks_des[0], (void *)ks->riv,
113 	    DES_DECRYPT);
114 }
115 
116 enum cryptoerr
117 des3_init(struct keystate *ks, u_int8_t *key, u_int16_t len)
118 {
119 	DES_set_odd_parity((void *)key);
120 	DES_set_odd_parity((void *)(key + 8));
121 	DES_set_odd_parity((void *)(key + 16));
122 
123 	/* As of the draft Tripe-DES does not check for weak keys */
124 	DES_set_key((void *)key, &ks->ks_des[0]);
125 	DES_set_key((void *)(key + 8), &ks->ks_des[1]);
126 	DES_set_key((void *)(key + 16), &ks->ks_des[2]);
127 
128 	return EOKAY;
129 }
130 
131 void
132 des3_encrypt(struct keystate *ks, u_int8_t *data, u_int16_t len)
133 {
134 	u_int8_t        iv[MAXBLK];
135 
136 	memcpy(iv, ks->riv, ks->xf->blocksize);
137 	DES_ede3_cbc_encrypt((void *)data, (void *)data, len, &ks->ks_des[0],
138 	    &ks->ks_des[1], &ks->ks_des[2], (void *)iv, DES_ENCRYPT);
139 }
140 
141 void
142 des3_decrypt(struct keystate *ks, u_int8_t *data, u_int16_t len)
143 {
144 	u_int8_t        iv[MAXBLK];
145 
146 	memcpy(iv, ks->riv, ks->xf->blocksize);
147 	DES_ede3_cbc_encrypt((void *)data, (void *)data, len, &ks->ks_des[0],
148 	    &ks->ks_des[1], &ks->ks_des[2], (void *)iv, DES_DECRYPT);
149 }
150 
151 enum cryptoerr
152 blf_init(struct keystate *ks, u_int8_t *key, u_int16_t len)
153 {
154 	blf_key(&ks->ks_blf, key, len);
155 
156 	return EOKAY;
157 }
158 
159 void
160 blf_encrypt(struct keystate *ks, u_int8_t *data, u_int16_t len)
161 {
162 	u_int16_t       i, blocksize = ks->xf->blocksize;
163 	u_int8_t       *iv = ks->liv;
164 	u_int32_t       xl, xr;
165 
166 	memcpy(iv, ks->riv, blocksize);
167 
168 	for (i = 0; i < len; data += blocksize, i += blocksize) {
169 		XOR64(data, iv);
170 		xl = GET_32BIT_BIG(data);
171 		xr = GET_32BIT_BIG(data + 4);
172 		Blowfish_encipher(&ks->ks_blf, &xl, &xr);
173 		SET_32BIT_BIG(data, xl);
174 		SET_32BIT_BIG(data + 4, xr);
175 		SET64(iv, data);
176 	}
177 }
178 
179 void
180 blf_decrypt(struct keystate *ks, u_int8_t *data, u_int16_t len)
181 {
182 	u_int16_t       i, blocksize = ks->xf->blocksize;
183 	u_int32_t       xl, xr;
184 
185 	data += len - blocksize;
186 	for (i = len - blocksize; i >= blocksize; data -= blocksize,
187 	    i -= blocksize) {
188 		xl = GET_32BIT_BIG(data);
189 		xr = GET_32BIT_BIG(data + 4);
190 		Blowfish_decipher(&ks->ks_blf, &xl, &xr);
191 		SET_32BIT_BIG(data, xl);
192 		SET_32BIT_BIG(data + 4, xr);
193 		XOR64(data, data - blocksize);
194 
195 	}
196 	xl = GET_32BIT_BIG(data);
197 	xr = GET_32BIT_BIG(data + 4);
198 	Blowfish_decipher(&ks->ks_blf, &xl, &xr);
199 	SET_32BIT_BIG(data, xl);
200 	SET_32BIT_BIG(data + 4, xr);
201 	XOR64(data, ks->riv);
202 }
203 
204 enum cryptoerr
205 cast_init(struct keystate *ks, u_int8_t *key, u_int16_t len)
206 {
207 	CAST_set_key(&ks->ks_cast, len, key);
208 	return EOKAY;
209 }
210 
211 void
212 cast1_encrypt(struct keystate *ks, u_int8_t *data, u_int16_t len)
213 {
214 	memcpy(ks->liv, ks->riv, ks->xf->blocksize);
215 	CAST_cbc_encrypt(data, data, len, &ks->ks_cast, ks->liv, 1);
216 }
217 
218 void
219 cast1_decrypt(struct keystate *ks, u_int8_t *data, u_int16_t len)
220 {
221 	CAST_cbc_encrypt(data, data, len, &ks->ks_cast, ks->riv, 0);
222 }
223 
224 enum cryptoerr
225 aes_init(struct keystate *ks, u_int8_t *key, u_int16_t len)
226 {
227 	AES_set_encrypt_key(key, len << 3, &ks->ks_aes[0]);
228 	AES_set_decrypt_key(key, len << 3, &ks->ks_aes[1]);
229 	return EOKAY;
230 }
231 
232 void
233 aes_encrypt(struct keystate *ks, u_int8_t *data, u_int16_t len)
234 {
235 	u_int8_t        iv[MAXBLK];
236 
237 	memcpy(iv, ks->riv, ks->xf->blocksize);
238 	AES_cbc_encrypt(data, data, len, &ks->ks_aes[0], iv, AES_ENCRYPT);
239 }
240 
241 void
242 aes_decrypt(struct keystate *ks, u_int8_t *data, u_int16_t len)
243 {
244 	u_int8_t        iv[MAXBLK];
245 
246 	memcpy(iv, ks->riv, ks->xf->blocksize);
247 	AES_cbc_encrypt(data, data, len, &ks->ks_aes[1], iv, AES_DECRYPT);
248 }
249 
250 struct crypto_xf *
251 crypto_get(enum transform id)
252 {
253 	size_t          i;
254 
255 	for (i = 0; i < sizeof transforms / sizeof transforms[0]; i++)
256 		if (id == transforms[i].id)
257 			return &transforms[i];
258 
259 	return 0;
260 }
261 
262 struct keystate *
263 crypto_init(struct crypto_xf *xf, u_int8_t *key, u_int16_t len,
264     enum cryptoerr *err)
265 {
266 	struct keystate *ks;
267 
268 	if (len < xf->keymin || len > xf->keymax) {
269 		LOG_DBG((LOG_CRYPTO, 10, "crypto_init: invalid key length %d",
270 		    len));
271 		*err = EKEYLEN;
272 		return 0;
273 	}
274 	ks = calloc(1, sizeof *ks);
275 	if (!ks) {
276 		log_error("crypto_init: calloc (1, %lu) failed",
277 		    (unsigned long)sizeof *ks);
278 		*err = ENOCRYPTO;
279 		return 0;
280 	}
281 	ks->xf = xf;
282 
283 	/* Setup the IV.  */
284 	ks->riv = ks->iv;
285 	ks->liv = ks->iv2;
286 
287 	LOG_DBG_BUF((LOG_CRYPTO, 40, "crypto_init: key", key, len));
288 
289 	*err = xf->init(ks, key, len);
290 	if (*err != EOKAY) {
291 		LOG_DBG((LOG_CRYPTO, 30, "crypto_init: weak key found for %s",
292 		    xf->name));
293 		free(ks);
294 		return 0;
295 	}
296 	return ks;
297 }
298 
299 void
300 crypto_update_iv(struct keystate *ks)
301 {
302 	u_int8_t       *tmp;
303 
304 	tmp = ks->riv;
305 	ks->riv = ks->liv;
306 	ks->liv = tmp;
307 
308 	LOG_DBG_BUF((LOG_CRYPTO, 50, "crypto_update_iv: updated IV", ks->riv,
309 	    ks->xf->blocksize));
310 }
311 
312 void
313 crypto_init_iv(struct keystate *ks, u_int8_t *buf, size_t len)
314 {
315 	memcpy(ks->riv, buf, len);
316 
317 	LOG_DBG_BUF((LOG_CRYPTO, 50, "crypto_init_iv: initialized IV", ks->riv,
318 	    len));
319 }
320 
321 void
322 crypto_encrypt(struct keystate *ks, u_int8_t *buf, u_int16_t len)
323 {
324 	LOG_DBG_BUF((LOG_CRYPTO, 70, "crypto_encrypt: before encryption", buf,
325 	    len));
326 	ks->xf->encrypt(ks, buf, len);
327 	memcpy(ks->liv, buf + len - ks->xf->blocksize, ks->xf->blocksize);
328 	LOG_DBG_BUF((LOG_CRYPTO, 70, "crypto_encrypt: after encryption", buf,
329 	    len));
330 }
331 
332 void
333 crypto_decrypt(struct keystate *ks, u_int8_t *buf, u_int16_t len)
334 {
335 	LOG_DBG_BUF((LOG_CRYPTO, 70, "crypto_decrypt: before decryption", buf,
336 	    len));
337 	/*
338 	 * XXX There is controversy about the correctness of updating the IV
339 	 * like this.
340          */
341 	memcpy(ks->liv, buf + len - ks->xf->blocksize, ks->xf->blocksize);
342 	ks->xf->decrypt(ks, buf, len);
343 	LOG_DBG_BUF((LOG_CRYPTO, 70, "crypto_decrypt: after decryption", buf,
344 	    len));
345 }
346 
347 /* Make a copy of the keystate pointed to by OKS.  */
348 struct keystate *
349 crypto_clone_keystate(struct keystate *oks)
350 {
351 	struct keystate *ks;
352 
353 	ks = malloc(sizeof *ks);
354 	if (!ks) {
355 		log_error("crypto_clone_keystate: malloc (%lu) failed",
356 		    (unsigned long)sizeof *ks);
357 		return 0;
358 	}
359 	memcpy(ks, oks, sizeof *ks);
360 	if (oks->riv == oks->iv) {
361 		ks->riv = ks->iv;
362 		ks->liv = ks->iv2;
363 	} else {
364 		ks->riv = ks->iv2;
365 		ks->liv = ks->iv;
366 	}
367 	return ks;
368 }
369