xref: /openbsd/sbin/iked/ikev2_msg.c (revision eef6c82a)
1 /*	$OpenBSD: ikev2_msg.c,v 1.100 2023/08/04 19:06:25 claudio Exp $	*/
2 
3 /*
4  * Copyright (c) 2019 Tobias Heider <tobias.heider@stusta.de>
5  * Copyright (c) 2010-2013 Reyk Floeter <reyk@openbsd.org>
6  *
7  * Permission to use, copy, modify, and distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 #include <sys/types.h>
21 #include <sys/queue.h>
22 #include <sys/socket.h>
23 #include <sys/uio.h>
24 
25 #include <netinet/in.h>
26 #include <arpa/inet.h>
27 
28 #include <stdlib.h>
29 #include <stdio.h>
30 #include <syslog.h>
31 #include <unistd.h>
32 #include <string.h>
33 #include <signal.h>
34 #include <endian.h>
35 #include <errno.h>
36 #include <err.h>
37 #include <event.h>
38 
39 #include <openssl/sha.h>
40 #include <openssl/evp.h>
41 
42 #include "iked.h"
43 #include "ikev2.h"
44 #include "eap.h"
45 #include "dh.h"
46 
47 void	 ikev1_recv(struct iked *, struct iked_message *);
48 void	 ikev2_msg_response_timeout(struct iked *, void *);
49 void	 ikev2_msg_retransmit_timeout(struct iked *, void *);
50 int	 ikev2_check_frag_oversize(struct iked_sa *, struct ibuf *);
51 int	 ikev2_send_encrypted_fragments(struct iked *, struct iked_sa *,
52 	    struct ibuf *, uint8_t, uint8_t, int);
53 int	 ikev2_msg_encrypt_prepare(struct iked_sa *, struct ikev2_payload *,
54 	    struct ibuf*, struct ibuf *, struct ike_header *, uint8_t, int);
55 
56 void
57 ikev2_msg_cb(int fd, short event, void *arg)
58 {
59 	struct iked_socket	*sock = arg;
60 	struct iked		*env = sock->sock_env;
61 	struct iked_message	 msg;
62 	struct ike_header	 hdr;
63 	uint32_t		 natt = 0x00000000;
64 	uint8_t			 buf[IKED_MSGBUF_MAX];
65 	ssize_t			 len;
66 	off_t			 off;
67 
68 	bzero(&msg, sizeof(msg));
69 	bzero(buf, sizeof(buf));
70 
71 	msg.msg_peerlen = sizeof(msg.msg_peer);
72 	msg.msg_locallen = sizeof(msg.msg_local);
73 	msg.msg_parent = &msg;
74 	memcpy(&msg.msg_local, &sock->sock_addr, sizeof(sock->sock_addr));
75 
76 	if ((len = recvfromto(fd, buf, sizeof(buf), 0,
77 	    (struct sockaddr *)&msg.msg_peer, &msg.msg_peerlen,
78 	    (struct sockaddr *)&msg.msg_local, &msg.msg_locallen)) <
79 	    (ssize_t)sizeof(natt))
80 		return;
81 
82 	if (socket_getport((struct sockaddr *)&msg.msg_local) ==
83 	    env->sc_nattport) {
84 		if (memcmp(&natt, buf, sizeof(natt)) != 0)
85 			return;
86 		msg.msg_natt = 1;
87 		off = sizeof(natt);
88 	} else
89 		off = 0;
90 
91 	if ((size_t)(len - off) <= sizeof(hdr))
92 		return;
93 	memcpy(&hdr, buf + off, sizeof(hdr));
94 
95 	if ((msg.msg_data = ibuf_new(buf + off, len - off)) == NULL)
96 		return;
97 
98 	TAILQ_INIT(&msg.msg_proposals);
99 	SIMPLEQ_INIT(&msg.msg_certreqs);
100 	msg.msg_fd = fd;
101 
102 	if (hdr.ike_version == IKEV1_VERSION)
103 		ikev1_recv(env, &msg);
104 	else
105 		ikev2_recv(env, &msg);
106 
107 	ikev2_msg_cleanup(env, &msg);
108 }
109 
110 void
111 ikev1_recv(struct iked *env, struct iked_message *msg)
112 {
113 	struct ike_header	*hdr;
114 
115 	if (ibuf_size(msg->msg_data) <= sizeof(*hdr)) {
116 		log_debug("%s: short message", __func__);
117 		return;
118 	}
119 
120 	hdr = (struct ike_header *)ibuf_data(msg->msg_data);
121 
122 	log_debug("%s: header ispi %s rspi %s"
123 	    " nextpayload %u version 0x%02x exchange %u flags 0x%02x"
124 	    " msgid %u length %u", __func__,
125 	    print_spi(betoh64(hdr->ike_ispi), 8),
126 	    print_spi(betoh64(hdr->ike_rspi), 8),
127 	    hdr->ike_nextpayload,
128 	    hdr->ike_version,
129 	    hdr->ike_exchange,
130 	    hdr->ike_flags,
131 	    betoh32(hdr->ike_msgid),
132 	    betoh32(hdr->ike_length));
133 
134 	log_debug("%s: IKEv1 not supported", __func__);
135 }
136 
137 struct ibuf *
138 ikev2_msg_init(struct iked *env, struct iked_message *msg,
139     struct sockaddr_storage *peer, socklen_t peerlen,
140     struct sockaddr_storage *local, socklen_t locallen, int response)
141 {
142 	bzero(msg, sizeof(*msg));
143 	memcpy(&msg->msg_peer, peer, peerlen);
144 	msg->msg_peerlen = peerlen;
145 	memcpy(&msg->msg_local, local, locallen);
146 	msg->msg_locallen = locallen;
147 	msg->msg_response = response ? 1 : 0;
148 	msg->msg_fd = -1;
149 	msg->msg_data = ibuf_static();
150 	msg->msg_e = 0;
151 	msg->msg_parent = msg;	/* has to be set */
152 	TAILQ_INIT(&msg->msg_proposals);
153 
154 	return (msg->msg_data);
155 }
156 
157 struct iked_message *
158 ikev2_msg_copy(struct iked *env, struct iked_message *msg)
159 {
160 	struct iked_message		*m = NULL;
161 	struct ibuf			*buf;
162 	size_t				 len;
163 	void				*ptr;
164 
165 	if (ibuf_size(msg->msg_data) < msg->msg_offset)
166 		return (NULL);
167 	len = ibuf_size(msg->msg_data) - msg->msg_offset;
168 
169 	if ((m = malloc(sizeof(*m))) == NULL)
170 		return (NULL);
171 
172 	if ((ptr = ibuf_seek(msg->msg_data, msg->msg_offset, len)) == NULL ||
173 	    (buf = ikev2_msg_init(env, m, &msg->msg_peer, msg->msg_peerlen,
174 	     &msg->msg_local, msg->msg_locallen, msg->msg_response)) == NULL ||
175 	    ibuf_add(buf, ptr, len)) {
176 		free(m);
177 		return (NULL);
178 	}
179 
180 	m->msg_fd = msg->msg_fd;
181 	m->msg_msgid = msg->msg_msgid;
182 	m->msg_offset = msg->msg_offset;
183 	m->msg_sa = msg->msg_sa;
184 
185 	return (m);
186 }
187 
188 void
189 ikev2_msg_cleanup(struct iked *env, struct iked_message *msg)
190 {
191 	struct iked_certreq	*cr;
192 	int			 i;
193 
194 	if (msg == msg->msg_parent) {
195 		ibuf_free(msg->msg_nonce);
196 		ibuf_free(msg->msg_ke);
197 		ibuf_free(msg->msg_auth.id_buf);
198 		ibuf_free(msg->msg_peerid.id_buf);
199 		ibuf_free(msg->msg_localid.id_buf);
200 		ibuf_free(msg->msg_cert.id_buf);
201 		for (i = 0; i < IKED_SCERT_MAX; i++)
202 			ibuf_free(msg->msg_scert[i].id_buf);
203 		ibuf_free(msg->msg_cookie);
204 		ibuf_free(msg->msg_cookie2);
205 		ibuf_free(msg->msg_del_buf);
206 		free(msg->msg_eap.eam_user);
207 		free(msg->msg_cp_addr);
208 		free(msg->msg_cp_addr6);
209 		free(msg->msg_cp_dns);
210 
211 		msg->msg_nonce = NULL;
212 		msg->msg_ke = NULL;
213 		msg->msg_auth.id_buf = NULL;
214 		msg->msg_peerid.id_buf = NULL;
215 		msg->msg_localid.id_buf = NULL;
216 		msg->msg_cert.id_buf = NULL;
217 		for (i = 0; i < IKED_SCERT_MAX; i++)
218 			msg->msg_scert[i].id_buf = NULL;
219 		msg->msg_cookie = NULL;
220 		msg->msg_cookie2 = NULL;
221 		msg->msg_del_buf = NULL;
222 		msg->msg_eap.eam_user = NULL;
223 		msg->msg_cp_addr = NULL;
224 		msg->msg_cp_addr6 = NULL;
225 		msg->msg_cp_dns = NULL;
226 
227 		config_free_proposals(&msg->msg_proposals, 0);
228 		while ((cr = SIMPLEQ_FIRST(&msg->msg_certreqs))) {
229 			ibuf_free(cr->cr_data);
230 			SIMPLEQ_REMOVE_HEAD(&msg->msg_certreqs, cr_entry);
231 			free(cr);
232 		}
233 	}
234 
235 	if (msg->msg_data != NULL) {
236 		ibuf_free(msg->msg_data);
237 		msg->msg_data = NULL;
238 	}
239 }
240 
241 int
242 ikev2_msg_valid_ike_sa(struct iked *env, struct ike_header *oldhdr,
243     struct iked_message *msg)
244 {
245 	if (msg->msg_sa != NULL && msg->msg_policy != NULL) {
246 		if (msg->msg_sa->sa_state == IKEV2_STATE_CLOSED)
247 			return (-1);
248 		/*
249 		 * Only permit informational requests from initiator
250 		 * on closing SAs (for DELETE).
251 		 */
252 		if (msg->msg_sa->sa_state == IKEV2_STATE_CLOSING) {
253 			if (((oldhdr->ike_flags &
254 			    (IKEV2_FLAG_INITIATOR|IKEV2_FLAG_RESPONSE)) ==
255 			    IKEV2_FLAG_INITIATOR) &&
256 			    (oldhdr->ike_exchange ==
257 			    IKEV2_EXCHANGE_INFORMATIONAL))
258 				return (0);
259 			return (-1);
260 		}
261 		return (0);
262 	}
263 
264 	/* Always fail */
265 	return (-1);
266 }
267 
268 int
269 ikev2_msg_send(struct iked *env, struct iked_message *msg)
270 {
271 	struct iked_sa		*sa = msg->msg_sa;
272 	struct ibuf		*buf = msg->msg_data;
273 	uint32_t		 natt = 0x00000000;
274 	int			 isnatt = 0;
275 	uint8_t			 exchange, flags;
276 	struct ike_header	*hdr;
277 	struct iked_message	*m;
278 
279 	if (buf == NULL || (hdr = ibuf_seek(msg->msg_data,
280 	    msg->msg_offset, sizeof(*hdr))) == NULL)
281 		return (-1);
282 
283 	isnatt = (msg->msg_natt || (sa && sa->sa_natt));
284 
285 	exchange = hdr->ike_exchange;
286 	flags = hdr->ike_flags;
287 	logit(exchange == IKEV2_EXCHANGE_INFORMATIONAL ?  LOG_DEBUG : LOG_INFO,
288 	    "%ssend %s %s %u peer %s local %s, %zu bytes%s",
289 	    SPI_IH(hdr),
290 	    print_map(exchange, ikev2_exchange_map),
291 	    (flags & IKEV2_FLAG_RESPONSE) ? "res" : "req",
292 	    betoh32(hdr->ike_msgid),
293 	    print_addr(&msg->msg_peer),
294 	    print_addr(&msg->msg_local),
295 	    ibuf_size(buf), isnatt ? ", NAT-T" : "");
296 
297 	if (isnatt) {
298 		struct ibuf *new;
299 		if ((new = ibuf_new(&natt, sizeof(natt))) == NULL) {
300 			log_debug("%s: failed to set NAT-T", __func__);
301 			return (-1);
302 		}
303 		if (ibuf_add_buf(new, buf) == -1) {
304 			ibuf_free(new);
305 			log_debug("%s: failed to set NAT-T", __func__);
306 			return (-1);
307 		}
308 		ibuf_free(buf);
309 		buf = msg->msg_data = new;
310 	}
311 
312 	if (sendtofrom(msg->msg_fd, ibuf_data(buf), ibuf_size(buf), 0,
313 	    (struct sockaddr *)&msg->msg_peer, msg->msg_peerlen,
314 	    (struct sockaddr *)&msg->msg_local, msg->msg_locallen) == -1) {
315 		log_warn("%s: sendtofrom", __func__);
316 		if (sa != NULL && errno == EADDRNOTAVAIL) {
317 			sa_state(env, sa, IKEV2_STATE_CLOSING);
318 			timer_del(env, &sa->sa_timer);
319 			timer_set(env, &sa->sa_timer,
320 			    ikev2_ike_sa_timeout, sa);
321 			timer_add(env, &sa->sa_timer,
322 			    IKED_IKE_SA_DELETE_TIMEOUT);
323 		}
324 		ikestat_inc(env, ikes_msg_send_failures);
325 	} else
326 		ikestat_inc(env, ikes_msg_sent);
327 
328 	if (sa == NULL)
329 		return (0);
330 
331 	if ((m = ikev2_msg_copy(env, msg)) == NULL) {
332 		log_debug("%s: failed to copy a message", __func__);
333 		return (-1);
334 	}
335 	m->msg_exchange = exchange;
336 
337 	if (flags & IKEV2_FLAG_RESPONSE) {
338 		if (ikev2_msg_enqueue(env, &sa->sa_responses, m,
339 		    IKED_RESPONSE_TIMEOUT) != 0) {
340 			ikev2_msg_cleanup(env, m);
341 			free(m);
342 			return (-1);
343 		}
344 	} else {
345 		if (ikev2_msg_enqueue(env, &sa->sa_requests, m,
346 		    IKED_RETRANSMIT_TIMEOUT) != 0) {
347 			ikev2_msg_cleanup(env, m);
348 			free(m);
349 			return (-1);
350 		}
351 	}
352 
353 	return (0);
354 }
355 
356 uint32_t
357 ikev2_msg_id(struct iked *env, struct iked_sa *sa)
358 {
359 	uint32_t		id = sa->sa_reqid;
360 
361 	if (++sa->sa_reqid == UINT32_MAX) {
362 		/* XXX we should close and renegotiate the connection now */
363 		log_debug("%s: IKEv2 message sequence overflow", __func__);
364 	}
365 	return (id);
366 }
367 
368 /*
369  * Calculate the final sizes of the IKEv2 header and the encrypted payload
370  * header.  This must be done before encryption to make sure the correct
371  * headers are authenticated.
372  */
373 int
374 ikev2_msg_encrypt_prepare(struct iked_sa *sa, struct ikev2_payload *pld,
375     struct ibuf *buf, struct ibuf *e, struct ike_header *hdr,
376     uint8_t firstpayload, int fragmentation)
377 {
378 	size_t	 len, ivlen, encrlen, integrlen, blocklen, pldlen, outlen;
379 
380 	if (sa == NULL ||
381 	    sa->sa_encr == NULL ||
382 	    sa->sa_integr == NULL) {
383 		log_debug("%s: invalid SA", __func__);
384 		return (-1);
385 	}
386 
387 	len = ibuf_size(e);
388 	blocklen = cipher_length(sa->sa_encr);
389 	integrlen = hash_length(sa->sa_integr);
390 	ivlen = cipher_ivlength(sa->sa_encr);
391 	encrlen = roundup(len + 1, blocklen);
392 	outlen = cipher_outlength(sa->sa_encr, encrlen);
393 	pldlen = ivlen + outlen + integrlen;
394 
395 	if (ikev2_next_payload(pld,
396 	    pldlen + (fragmentation ? sizeof(struct ikev2_frag_payload) : 0),
397 	    firstpayload) == -1)
398 		return (-1);
399 	if (ikev2_set_header(hdr, ibuf_size(buf) + pldlen - sizeof(*hdr)) == -1)
400 		return (-1);
401 
402 	return (0);
403 }
404 
405 struct ibuf *
406 ikev2_msg_encrypt(struct iked *env, struct iked_sa *sa, struct ibuf *src,
407     struct ibuf *aad)
408 {
409 	size_t			 len, encrlen, integrlen, blocklen,
410 				    outlen;
411 	uint8_t			*buf, pad = 0, *ptr;
412 	struct ibuf		*encr, *dst = NULL, *out = NULL;
413 
414 	buf = ibuf_data(src);
415 	len = ibuf_size(src);
416 
417 	log_debug("%s: decrypted length %zu", __func__, len);
418 	print_hex(buf, 0, len);
419 
420 	if (sa == NULL ||
421 	    sa->sa_encr == NULL ||
422 	    sa->sa_integr == NULL) {
423 		log_debug("%s: invalid SA", __func__);
424 		goto done;
425 	}
426 
427 	if (sa->sa_hdr.sh_initiator)
428 		encr = sa->sa_key_iencr;
429 	else
430 		encr = sa->sa_key_rencr;
431 
432 	blocklen = cipher_length(sa->sa_encr);
433 	integrlen = hash_length(sa->sa_integr);
434 	encrlen = roundup(len + sizeof(pad), blocklen);
435 	pad = encrlen - (len + sizeof(pad));
436 
437 	/*
438 	 * Pad the payload and encrypt it
439 	 */
440 	if (pad) {
441 		if ((ptr = ibuf_reserve(src, pad)) == NULL)
442 			goto done;
443 		arc4random_buf(ptr, pad);
444 	}
445 	if (ibuf_add(src, &pad, sizeof(pad)) != 0)
446 		goto done;
447 
448 	log_debug("%s: padded length %zu", __func__, ibuf_size(src));
449 	print_hexbuf(src);
450 
451 	cipher_setkey(sa->sa_encr, ibuf_data(encr), ibuf_size(encr));
452 	cipher_setiv(sa->sa_encr, NULL, 0);	/* XXX ivlen */
453 	if (cipher_init_encrypt(sa->sa_encr) == -1) {
454 		log_info("%s: error initiating cipher.", __func__);
455 		goto done;
456 	}
457 
458 	if ((dst = ibuf_dup(sa->sa_encr->encr_iv)) == NULL)
459 		goto done;
460 
461 	if ((out = ibuf_new(NULL,
462 	    cipher_outlength(sa->sa_encr, encrlen))) == NULL)
463 		goto done;
464 
465 	outlen = ibuf_size(out);
466 
467 	/* Add AAD for AEAD ciphers */
468 	if (sa->sa_integr->hash_isaead)
469 		cipher_aad(sa->sa_encr, ibuf_data(aad), ibuf_size(aad),
470 		    &outlen);
471 
472 	if (cipher_update(sa->sa_encr, ibuf_data(src), encrlen,
473 	    ibuf_data(out), &outlen) == -1) {
474 		log_info("%s: error updating cipher.", __func__);
475 		goto done;
476 	}
477 
478 	if (cipher_final(sa->sa_encr) == -1) {
479 		log_info("%s: encryption failed.", __func__);
480 		goto done;
481 	}
482 
483 	if (outlen && ibuf_add(dst, ibuf_data(out), outlen) != 0)
484 		goto done;
485 
486 	if ((ptr = ibuf_reserve(dst, integrlen)) == NULL)
487 		goto done;
488 	explicit_bzero(ptr, integrlen);
489 
490 	log_debug("%s: length %zu, padding %d, output length %zu",
491 	    __func__, len + sizeof(pad), pad, ibuf_size(dst));
492 	print_hexbuf(dst);
493 
494 	ibuf_free(src);
495 	ibuf_free(out);
496 	return (dst);
497  done:
498 	ibuf_free(src);
499 	ibuf_free(out);
500 	ibuf_free(dst);
501 	return (NULL);
502 }
503 
504 int
505 ikev2_msg_integr(struct iked *env, struct iked_sa *sa, struct ibuf *src)
506 {
507 	int			 ret = -1;
508 	size_t			 integrlen, tmplen;
509 	struct ibuf		*integr, *tmp = NULL;
510 	uint8_t			*ptr;
511 
512 	log_debug("%s: message length %zu", __func__, ibuf_size(src));
513 	print_hexbuf(src);
514 
515 	if (sa == NULL ||
516 	    sa->sa_encr == NULL ||
517 	    sa->sa_integr == NULL) {
518 		log_debug("%s: invalid SA", __func__);
519 		return (-1);
520 	}
521 
522 	integrlen = hash_length(sa->sa_integr);
523 	log_debug("%s: integrity checksum length %zu", __func__,
524 	    integrlen);
525 
526 	/*
527 	 * Validate packet checksum
528 	 */
529 	if ((tmp = ibuf_new(NULL, hash_keylength(sa->sa_integr))) == NULL)
530 		goto done;
531 
532 	if (!sa->sa_integr->hash_isaead) {
533 		if (sa->sa_hdr.sh_initiator)
534 			integr = sa->sa_key_iauth;
535 		else
536 			integr = sa->sa_key_rauth;
537 
538 		hash_setkey(sa->sa_integr, ibuf_data(integr),
539 		    ibuf_size(integr));
540 		hash_init(sa->sa_integr);
541 		hash_update(sa->sa_integr, ibuf_data(src),
542 		    ibuf_size(src) - integrlen);
543 		hash_final(sa->sa_integr, ibuf_data(tmp), &tmplen);
544 
545 		if (tmplen != integrlen) {
546 			log_debug("%s: hash failure", __func__);
547 			goto done;
548 		}
549 	} else {
550 		/* Append AEAD tag */
551 		if (cipher_gettag(sa->sa_encr, ibuf_data(tmp), ibuf_size(tmp)))
552 			goto done;
553 	}
554 
555 	if ((ptr = ibuf_seek(src,
556 	    ibuf_size(src) - integrlen, integrlen)) == NULL)
557 		goto done;
558 	memcpy(ptr, ibuf_data(tmp), integrlen);
559 
560 	print_hexbuf(tmp);
561 
562 	ret = 0;
563  done:
564 	ibuf_free(tmp);
565 
566 	return (ret);
567 }
568 
569 struct ibuf *
570 ikev2_msg_decrypt(struct iked *env, struct iked_sa *sa,
571     struct ibuf *msg, struct ibuf *src)
572 {
573 	ssize_t			 ivlen, encrlen, integrlen, blocklen,
574 				    outlen, tmplen;
575 	uint8_t			 pad = 0, *ptr, *integrdata;
576 	struct ibuf		*integr, *encr, *tmp = NULL, *out = NULL;
577 	off_t			 ivoff, encroff, integroff;
578 
579 	if (sa == NULL ||
580 	    sa->sa_encr == NULL ||
581 	    sa->sa_integr == NULL) {
582 		log_debug("%s: invalid SA", __func__);
583 		print_hexbuf(src);
584 		goto done;
585 	}
586 
587 	if (!sa->sa_hdr.sh_initiator) {
588 		encr = sa->sa_key_iencr;
589 		integr = sa->sa_key_iauth;
590 	} else {
591 		encr = sa->sa_key_rencr;
592 		integr = sa->sa_key_rauth;
593 	}
594 
595 	blocklen = cipher_length(sa->sa_encr);
596 	ivlen = cipher_ivlength(sa->sa_encr);
597 	ivoff = 0;
598 	integrlen = hash_length(sa->sa_integr);
599 	integroff = ibuf_size(src) - integrlen;
600 	encroff = ivlen;
601 	encrlen = ibuf_size(src) - integrlen - ivlen;
602 
603 	if (encrlen < 0 || integroff < 0) {
604 		log_debug("%s: invalid integrity value", __func__);
605 		goto done;
606 	}
607 
608 	log_debug("%s: IV length %zd", __func__, ivlen);
609 	print_hex(ibuf_data(src), 0, ivlen);
610 	log_debug("%s: encrypted payload length %zd", __func__, encrlen);
611 	print_hex(ibuf_data(src), encroff, encrlen);
612 	log_debug("%s: integrity checksum length %zd", __func__, integrlen);
613 	print_hex(ibuf_data(src), integroff, integrlen);
614 
615 	/*
616 	 * Validate packet checksum
617 	 */
618 	if (!sa->sa_integr->hash_isaead) {
619 		if ((tmp = ibuf_new(NULL, hash_keylength(sa->sa_integr))) == NULL)
620 			goto done;
621 
622 		hash_setkey(sa->sa_integr, ibuf_data(integr),
623 		    ibuf_size(integr));
624 		hash_init(sa->sa_integr);
625 		hash_update(sa->sa_integr, ibuf_data(msg),
626 		    ibuf_size(msg) - integrlen);
627 		hash_final(sa->sa_integr, ibuf_data(tmp), &tmplen);
628 
629 		integrdata = ibuf_seek(src, integroff, integrlen);
630 		if (integrdata == NULL)
631 			goto done;
632 		if (memcmp(ibuf_data(tmp), integrdata, integrlen) != 0) {
633 			log_debug("%s: integrity check failed", __func__);
634 			goto done;
635 		}
636 
637 		log_debug("%s: integrity check succeeded", __func__);
638 		print_hex(ibuf_data(tmp), 0, tmplen);
639 
640 		ibuf_free(tmp);
641 		tmp = NULL;
642 	}
643 
644 	/*
645 	 * Decrypt the payload and strip any padding
646 	 */
647 	if ((encrlen % blocklen) != 0) {
648 		log_debug("%s: unaligned encrypted payload", __func__);
649 		goto done;
650 	}
651 
652 	cipher_setkey(sa->sa_encr, ibuf_data(encr), ibuf_size(encr));
653 	cipher_setiv(sa->sa_encr, ibuf_seek(src, ivoff, ivlen), ivlen);
654 	if (cipher_init_decrypt(sa->sa_encr) == -1) {
655 		log_info("%s: error initiating cipher.", __func__);
656 		goto done;
657 	}
658 
659 	/* Set AEAD tag */
660 	if (sa->sa_integr->hash_isaead) {
661 		integrdata = ibuf_seek(src, integroff, integrlen);
662 		if (integrdata == NULL)
663 			goto done;
664 		if (cipher_settag(sa->sa_encr, integrdata, integrlen)) {
665 			log_info("%s: failed to set tag.", __func__);
666 			goto done;
667 		}
668 	}
669 
670 	if ((out = ibuf_new(NULL, cipher_outlength(sa->sa_encr,
671 	    encrlen))) == NULL)
672 		goto done;
673 
674 	/*
675 	 * Add additional authenticated data for AEAD ciphers
676 	 */
677 	if (sa->sa_integr->hash_isaead) {
678 		log_debug("%s: AAD length %zu", __func__,
679 		    ibuf_size(msg) - ibuf_size(src));
680 		print_hex(ibuf_data(msg), 0, ibuf_size(msg) - ibuf_size(src));
681 		cipher_aad(sa->sa_encr, ibuf_data(msg),
682 		    ibuf_size(msg) - ibuf_size(src), &outlen);
683 	}
684 
685 	if ((outlen = ibuf_size(out)) != 0) {
686 		if (cipher_update(sa->sa_encr, ibuf_seek(src, encroff, encrlen),
687 		    encrlen, ibuf_data(out), &outlen) == -1) {
688 			log_info("%s: error updating cipher.", __func__);
689 			goto done;
690 		}
691 
692 		ptr = ibuf_seek(out, outlen - 1, 1);
693 		pad = *ptr;
694 	}
695 
696 	if (cipher_final(sa->sa_encr) == -1) {
697 		log_info("%s: decryption failed.", __func__);
698 		goto done;
699 	}
700 
701 	log_debug("%s: decrypted payload length %zd/%zd padding %d",
702 	    __func__, outlen, encrlen, pad);
703 	print_hexbuf(out);
704 
705 	/* Strip padding and padding length */
706 	if (ibuf_setsize(out, outlen - pad - 1) != 0)
707 		goto done;
708 
709 	ibuf_free(src);
710 	return (out);
711  done:
712 	ibuf_free(tmp);
713 	ibuf_free(out);
714 	ibuf_free(src);
715 	return (NULL);
716 }
717 
718 int
719 ikev2_check_frag_oversize(struct iked_sa *sa, struct ibuf *buf) {
720 	size_t		len = ibuf_length(buf);
721 	sa_family_t	sa_fam;
722 	size_t		max;
723 	size_t		ivlen, integrlen, blocklen;
724 
725 	if (sa == NULL ||
726 	    sa->sa_encr == NULL ||
727 	    sa->sa_integr == NULL) {
728 		log_debug("%s: invalid SA", __func__);
729 		return (-1);
730 	}
731 
732 	sa_fam = ((struct sockaddr *)&sa->sa_local.addr)->sa_family;
733 
734 	max = sa_fam == AF_INET ? IKEV2_MAXLEN_IPV4_FRAG
735 	    : IKEV2_MAXLEN_IPV6_FRAG;
736 
737 	blocklen = cipher_length(sa->sa_encr);
738 	ivlen = cipher_ivlength(sa->sa_encr);
739 	integrlen = hash_length(sa->sa_integr);
740 
741 	/* Estimated maximum packet size (with 0 < padding < blocklen) */
742 	return ((len + ivlen + blocklen + integrlen) >= max) && sa->sa_frag;
743 }
744 
745 int
746 ikev2_msg_send_encrypt(struct iked *env, struct iked_sa *sa, struct ibuf **ep,
747     uint8_t exchange, uint8_t firstpayload, int response)
748 {
749 	struct iked_message		 resp;
750 	struct ike_header		*hdr;
751 	struct ikev2_payload		*pld;
752 	struct ibuf			*buf, *e = *ep;
753 	int				 ret = -1;
754 
755 	/* Check if msg needs to be fragmented */
756 	if (ikev2_check_frag_oversize(sa, e)) {
757 		return ikev2_send_encrypted_fragments(env, sa, e, exchange,
758 		    firstpayload, response);
759 	}
760 
761 	if ((buf = ikev2_msg_init(env, &resp, &sa->sa_peer.addr,
762 	    sa->sa_peer.addr.ss_len, &sa->sa_local.addr,
763 	    sa->sa_local.addr.ss_len, response)) == NULL)
764 		goto done;
765 
766 	resp.msg_msgid = response ? sa->sa_msgid_current : ikev2_msg_id(env, sa);
767 
768 	/* IKE header */
769 	if ((hdr = ikev2_add_header(buf, sa, resp.msg_msgid, IKEV2_PAYLOAD_SK,
770 	    exchange, response ? IKEV2_FLAG_RESPONSE : 0)) == NULL)
771 		goto done;
772 
773 	if ((pld = ikev2_add_payload(buf)) == NULL)
774 		goto done;
775 
776 	if (ikev2_msg_encrypt_prepare(sa, pld, buf, e, hdr, firstpayload, 0) == -1)
777 		goto done;
778 
779 	/* Encrypt message and add as an E payload */
780 	if ((e = ikev2_msg_encrypt(env, sa, e, buf)) == NULL) {
781 		log_debug("%s: encryption failed", __func__);
782 		goto done;
783 	}
784 	if (ibuf_add_buf(buf, e) != 0)
785 		goto done;
786 
787 	/* Add integrity checksum (HMAC) */
788 	if (ikev2_msg_integr(env, sa, buf) != 0) {
789 		log_debug("%s: integrity checksum failed", __func__);
790 		goto done;
791 	}
792 
793 	resp.msg_data = buf;
794 	resp.msg_sa = sa;
795 	resp.msg_fd = sa->sa_fd;
796 	TAILQ_INIT(&resp.msg_proposals);
797 
798 	(void)ikev2_pld_parse(env, hdr, &resp, 0);
799 
800 	ret = ikev2_msg_send(env, &resp);
801 
802  done:
803 	/* e is cleaned up by the calling function */
804 	*ep = e;
805 	ikev2_msg_cleanup(env, &resp);
806 
807 	return (ret);
808 }
809 
810 int
811 ikev2_send_encrypted_fragments(struct iked *env, struct iked_sa *sa,
812     struct ibuf *in, uint8_t exchange, uint8_t firstpayload, int response) {
813 	struct iked_message		 resp;
814 	struct ibuf			*buf, *e = NULL;
815 	struct ike_header		*hdr;
816 	struct ikev2_payload		*pld;
817 	struct ikev2_frag_payload	*frag;
818 	sa_family_t			 sa_fam;
819 	size_t				 ivlen, integrlen, blocklen;
820 	size_t				 max_len, left,  offset=0;
821 	size_t				 frag_num = 1, frag_total;
822 	uint8_t				*data;
823 	uint32_t			 msgid;
824 	int				 ret = -1;
825 
826 	if (sa == NULL ||
827 	    sa->sa_encr == NULL ||
828 	    sa->sa_integr == NULL) {
829 		log_debug("%s: invalid SA", __func__);
830 		ikestat_inc(env, ikes_frag_send_failures);
831 		return ret;
832 	}
833 
834 	sa_fam = ((struct sockaddr *)&sa->sa_local.addr)->sa_family;
835 
836 	left = ibuf_length(in);
837 
838 	/* Calculate max allowed size of a fragments payload */
839 	blocklen = cipher_length(sa->sa_encr);
840 	ivlen = cipher_ivlength(sa->sa_encr);
841 	integrlen = hash_length(sa->sa_integr);
842 	max_len = (sa_fam == AF_INET ? IKEV2_MAXLEN_IPV4_FRAG
843 	    : IKEV2_MAXLEN_IPV6_FRAG)
844 	    - ivlen - blocklen - integrlen;
845 
846 	/* Total number of fragments to send */
847 	frag_total = (left / max_len) + 1;
848 
849 	msgid = response ? sa->sa_msgid_current : ikev2_msg_id(env, sa);
850 
851 	while (frag_num <= frag_total) {
852 		if ((buf = ikev2_msg_init(env, &resp, &sa->sa_peer.addr,
853 		    sa->sa_peer.addr.ss_len, &sa->sa_local.addr,
854 		    sa->sa_local.addr.ss_len, response)) == NULL)
855 			goto done;
856 
857 		resp.msg_msgid = msgid;
858 
859 		/* IKE header */
860 		if ((hdr = ikev2_add_header(buf, sa, resp.msg_msgid,
861 		    IKEV2_PAYLOAD_SKF, exchange, response ? IKEV2_FLAG_RESPONSE
862 		    : 0)) == NULL)
863 			goto done;
864 
865 		/* Payload header */
866 		if ((pld = ikev2_add_payload(buf)) == NULL)
867 			goto done;
868 
869 		/* Fragment header */
870 		if ((frag = ibuf_reserve(buf, sizeof(*frag))) == NULL) {
871 			log_debug("%s: failed to add SKF fragment header",
872 			    __func__);
873 			goto done;
874 		}
875 		frag->frag_num = htobe16(frag_num);
876 		frag->frag_total = htobe16(frag_total);
877 
878 		/* Encrypt message and add as an E payload */
879 		data = ibuf_seek(in, offset, 0);
880 		if ((e = ibuf_new(data, MINIMUM(left, max_len))) == NULL) {
881 			goto done;
882 		}
883 
884 		if (ikev2_msg_encrypt_prepare(sa, pld, buf, e, hdr,
885 		    firstpayload, 1) == -1)
886 			goto done;
887 
888 		if ((e = ikev2_msg_encrypt(env, sa, e, buf)) == NULL) {
889 			log_debug("%s: encryption failed", __func__);
890 			goto done;
891 		}
892 		if (ibuf_add_buf(buf, e) != 0)
893 			goto done;
894 
895 		/* Add integrity checksum (HMAC) */
896 		if (ikev2_msg_integr(env, sa, buf) != 0) {
897 			log_debug("%s: integrity checksum failed", __func__);
898 			goto done;
899 		}
900 
901 		log_debug("%s: Fragment %zu of %zu has size of %zu bytes.",
902 		    __func__, frag_num, frag_total,
903 		    ibuf_size(buf) - sizeof(*hdr));
904 		print_hexbuf(buf);
905 
906 		resp.msg_data = buf;
907 		resp.msg_sa = sa;
908 		resp.msg_fd = sa->sa_fd;
909 		TAILQ_INIT(&resp.msg_proposals);
910 
911 		if (ikev2_msg_send(env, &resp) == -1)
912 			goto done;
913 
914 		ikestat_inc(env, ikes_frag_sent);
915 
916 		offset += MINIMUM(left, max_len);
917 		left -= MINIMUM(left, max_len);
918 		frag_num++;
919 
920 		/* MUST be zero after first fragment */
921 		firstpayload = 0;
922 
923 		ikev2_msg_cleanup(env, &resp);
924 		ibuf_free(e);
925 		e = NULL;
926 	}
927 
928 	return 0;
929 done:
930 	ikev2_msg_cleanup(env, &resp);
931 	ibuf_free(e);
932 	ikestat_inc(env, ikes_frag_send_failures);
933 	return ret;
934 }
935 
936 struct ibuf *
937 ikev2_msg_auth(struct iked *env, struct iked_sa *sa, int response)
938 {
939 	struct ibuf		*authmsg = NULL, *nonce, *prfkey, *buf;
940 	uint8_t			*ptr;
941 	struct iked_id		*id;
942 	size_t			 tmplen;
943 
944 	/*
945 	 * Create the payload to be signed/MAC'ed for AUTH
946 	 */
947 
948 	if (!response) {
949 		if ((nonce = sa->sa_rnonce) == NULL ||
950 		    (sa->sa_iid.id_type == 0) ||
951 		    (prfkey = sa->sa_key_iprf) == NULL ||
952 		    (buf = sa->sa_1stmsg) == NULL)
953 			return (NULL);
954 		id = &sa->sa_iid;
955 	} else {
956 		if ((nonce = sa->sa_inonce) == NULL ||
957 		    (sa->sa_rid.id_type == 0) ||
958 		    (prfkey = sa->sa_key_rprf) == NULL ||
959 		    (buf = sa->sa_2ndmsg) == NULL)
960 			return (NULL);
961 		id = &sa->sa_rid;
962 	}
963 
964 	if ((authmsg = ibuf_dup(buf)) == NULL)
965 		return (NULL);
966 	if (ibuf_add_buf(authmsg, nonce) != 0)
967 		goto fail;
968 
969 	if ((hash_setkey(sa->sa_prf, ibuf_data(prfkey),
970 	    ibuf_size(prfkey))) == NULL)
971 		goto fail;
972 
973 	/* require non-truncating hash */
974 	if (hash_keylength(sa->sa_prf) != hash_length(sa->sa_prf))
975 		goto fail;
976 
977 	if ((ptr = ibuf_reserve(authmsg, hash_keylength(sa->sa_prf))) == NULL)
978 		goto fail;
979 
980 	hash_init(sa->sa_prf);
981 	hash_update(sa->sa_prf, ibuf_data(id->id_buf), ibuf_size(id->id_buf));
982 	hash_final(sa->sa_prf, ptr, &tmplen);
983 
984 	if (tmplen != hash_length(sa->sa_prf))
985 		goto fail;
986 
987 	log_debug("%s: %s auth data length %zu",
988 	    __func__, response ? "responder" : "initiator",
989 	    ibuf_size(authmsg));
990 	print_hexbuf(authmsg);
991 
992 	return (authmsg);
993 
994  fail:
995 	ibuf_free(authmsg);
996 	return (NULL);
997 }
998 
999 int
1000 ikev2_msg_authverify(struct iked *env, struct iked_sa *sa,
1001     struct iked_auth *auth, uint8_t *buf, size_t len, struct ibuf *authmsg)
1002 {
1003 	uint8_t				*key, *psk = NULL;
1004 	ssize_t				 keylen;
1005 	struct iked_id			*id;
1006 	struct iked_dsa			*dsa = NULL;
1007 	int				 ret = -1;
1008 	uint8_t				 keytype;
1009 
1010 	if (sa->sa_hdr.sh_initiator)
1011 		id = &sa->sa_rcert;
1012 	else
1013 		id = &sa->sa_icert;
1014 
1015 	if ((dsa = dsa_verify_new(auth->auth_method, sa->sa_prf)) == NULL) {
1016 		log_debug("%s: invalid auth method", __func__);
1017 		return (-1);
1018 	}
1019 
1020 	switch (auth->auth_method) {
1021 	case IKEV2_AUTH_SHARED_KEY_MIC:
1022 		if (!auth->auth_length) {
1023 			log_debug("%s: no pre-shared key found", __func__);
1024 			goto done;
1025 		}
1026 		if ((keylen = ikev2_psk(sa, auth->auth_data,
1027 		    auth->auth_length, &psk)) == -1) {
1028 			log_debug("%s: failed to get PSK", __func__);
1029 			goto done;
1030 		}
1031 		key = psk;
1032 		keytype = 0;
1033 		break;
1034 	default:
1035 		if (!id->id_type || !ibuf_length(id->id_buf)) {
1036 			log_debug("%s: no cert found", __func__);
1037 			goto done;
1038 		}
1039 		key = ibuf_data(id->id_buf);
1040 		keylen = ibuf_size(id->id_buf);
1041 		keytype = id->id_type;
1042 		break;
1043 	}
1044 
1045 	log_debug("%s: method %s keylen %zd type %s", __func__,
1046 	    print_map(auth->auth_method, ikev2_auth_map), keylen,
1047 	    print_map(id->id_type, ikev2_cert_map));
1048 
1049 	if (dsa_setkey(dsa, key, keylen, keytype) == NULL ||
1050 	    dsa_init(dsa, buf, len) != 0 ||
1051 	    dsa_update(dsa, ibuf_data(authmsg), ibuf_size(authmsg))) {
1052 		log_debug("%s: failed to compute digital signature", __func__);
1053 		goto done;
1054 	}
1055 
1056 	if ((ret = dsa_verify_final(dsa, buf, len)) == 0) {
1057 		log_debug("%s: authentication successful", __func__);
1058 		sa_state(env, sa, IKEV2_STATE_AUTH_SUCCESS);
1059 		sa_stateflags(sa, IKED_REQ_AUTHVALID);
1060 	} else {
1061 		log_debug("%s: authentication failed", __func__);
1062 		sa_state(env, sa, IKEV2_STATE_AUTH_REQUEST);
1063 	}
1064 
1065  done:
1066 	free(psk);
1067 	dsa_free(dsa);
1068 
1069 	return (ret);
1070 }
1071 
1072 int
1073 ikev2_msg_authsign(struct iked *env, struct iked_sa *sa,
1074     struct iked_auth *auth, struct ibuf *authmsg)
1075 {
1076 	uint8_t				*key, *psk = NULL;
1077 	ssize_t				 keylen, siglen;
1078 	struct iked_hash		*prf = sa->sa_prf;
1079 	struct iked_id			*id;
1080 	struct iked_dsa			*dsa = NULL;
1081 	struct ibuf			*buf;
1082 	int				 ret = -1;
1083 	uint8_t			 keytype;
1084 
1085 	if (sa->sa_hdr.sh_initiator)
1086 		id = &sa->sa_icert;
1087 	else
1088 		id = &sa->sa_rcert;
1089 
1090 	if ((dsa = dsa_sign_new(auth->auth_method, prf)) == NULL) {
1091 		log_debug("%s: invalid auth method", __func__);
1092 		return (-1);
1093 	}
1094 
1095 	switch (auth->auth_method) {
1096 	case IKEV2_AUTH_SHARED_KEY_MIC:
1097 		if (!auth->auth_length) {
1098 			log_debug("%s: no pre-shared key found", __func__);
1099 			goto done;
1100 		}
1101 		if ((keylen = ikev2_psk(sa, auth->auth_data,
1102 		    auth->auth_length, &psk)) == -1) {
1103 			log_debug("%s: failed to get PSK", __func__);
1104 			goto done;
1105 		}
1106 		key = psk;
1107 		keytype = 0;
1108 		break;
1109 	default:
1110 		if (id == NULL) {
1111 			log_debug("%s: no cert found", __func__);
1112 			goto done;
1113 		}
1114 		key = ibuf_data(id->id_buf);
1115 		keylen = ibuf_size(id->id_buf);
1116 		keytype = id->id_type;
1117 		break;
1118 	}
1119 
1120 	if (dsa_setkey(dsa, key, keylen, keytype) == NULL ||
1121 	    dsa_init(dsa, NULL, 0) != 0 ||
1122 	    dsa_update(dsa, ibuf_data(authmsg), ibuf_size(authmsg))) {
1123 		log_debug("%s: failed to compute digital signature", __func__);
1124 		goto done;
1125 	}
1126 
1127 	ibuf_free(sa->sa_localauth.id_buf);
1128 	sa->sa_localauth.id_buf = NULL;
1129 
1130 	if ((buf = ibuf_new(NULL, dsa_length(dsa))) == NULL) {
1131 		log_debug("%s: failed to get auth buffer", __func__);
1132 		goto done;
1133 	}
1134 
1135 	if ((siglen = dsa_sign_final(dsa,
1136 	    ibuf_data(buf), ibuf_size(buf))) < 0) {
1137 		log_debug("%s: failed to create auth signature", __func__);
1138 		ibuf_free(buf);
1139 		goto done;
1140 	}
1141 
1142 	if (ibuf_setsize(buf, siglen) < 0) {
1143 		log_debug("%s: failed to set auth signature size to %zd",
1144 		    __func__, siglen);
1145 		ibuf_free(buf);
1146 		goto done;
1147 	}
1148 
1149 	sa->sa_localauth.id_type = auth->auth_method;
1150 	sa->sa_localauth.id_buf = buf;
1151 
1152 	ret = 0;
1153  done:
1154 	free(psk);
1155 	dsa_free(dsa);
1156 
1157 	return (ret);
1158 }
1159 
1160 int
1161 ikev2_msg_frompeer(struct iked_message *msg)
1162 {
1163 	struct iked_sa		*sa = msg->msg_sa;
1164 	struct ike_header	*hdr;
1165 
1166 	msg = msg->msg_parent;
1167 
1168 	if (sa == NULL ||
1169 	    (hdr = ibuf_seek(msg->msg_data, 0, sizeof(*hdr))) == NULL)
1170 		return (0);
1171 
1172 	if (!sa->sa_hdr.sh_initiator &&
1173 	    (hdr->ike_flags & IKEV2_FLAG_INITIATOR))
1174 		return (1);
1175 	else if (sa->sa_hdr.sh_initiator &&
1176 	    (hdr->ike_flags & IKEV2_FLAG_INITIATOR) == 0)
1177 		return (1);
1178 
1179 	return (0);
1180 }
1181 
1182 struct iked_socket *
1183 ikev2_msg_getsocket(struct iked *env, int af, int natt)
1184 {
1185 	switch (af) {
1186 	case AF_INET:
1187 		return (env->sc_sock4[natt ? 1 : 0]);
1188 	case AF_INET6:
1189 		return (env->sc_sock6[natt ? 1 : 0]);
1190 	}
1191 
1192 	log_debug("%s: af socket %d not available", __func__, af);
1193 	return (NULL);
1194 }
1195 
1196 int
1197 ikev2_msg_enqueue(struct iked *env, struct iked_msgqueue *queue,
1198     struct iked_message *msg, int timeout)
1199 {
1200 	struct iked_msg_retransmit *mr;
1201 
1202 	if ((mr = ikev2_msg_lookup(env, queue, msg, msg->msg_exchange)) ==
1203 	    NULL) {
1204 		if ((mr = calloc(1, sizeof(*mr))) == NULL)
1205 			return (-1);
1206 		TAILQ_INIT(&mr->mrt_frags);
1207 		mr->mrt_tries = 0;
1208 
1209 		timer_set(env, &mr->mrt_timer, msg->msg_response ?
1210 		    ikev2_msg_response_timeout : ikev2_msg_retransmit_timeout,
1211 		    mr);
1212 		timer_add(env, &mr->mrt_timer, timeout);
1213 
1214 		TAILQ_INSERT_TAIL(queue, mr, mrt_entry);
1215 	}
1216 
1217 	TAILQ_INSERT_TAIL(&mr->mrt_frags, msg, msg_entry);
1218 
1219 	return 0;
1220 }
1221 
1222 void
1223 ikev2_msg_prevail(struct iked *env, struct iked_msgqueue *queue,
1224     struct iked_message *msg)
1225 {
1226 	struct iked_msg_retransmit	*mr, *mrtmp;
1227 
1228 	TAILQ_FOREACH_SAFE(mr, queue, mrt_entry, mrtmp) {
1229 		if (TAILQ_FIRST(&mr->mrt_frags)->msg_msgid < msg->msg_msgid)
1230 			ikev2_msg_dispose(env, queue, mr);
1231 	}
1232 }
1233 
1234 void
1235 ikev2_msg_dispose(struct iked *env, struct iked_msgqueue *queue,
1236     struct iked_msg_retransmit *mr)
1237 {
1238 	struct iked_message	*m;
1239 
1240 	while ((m = TAILQ_FIRST(&mr->mrt_frags)) != NULL) {
1241 		TAILQ_REMOVE(&mr->mrt_frags, m, msg_entry);
1242 		ikev2_msg_cleanup(env, m);
1243 		free(m);
1244 	}
1245 
1246 	timer_del(env, &mr->mrt_timer);
1247 	TAILQ_REMOVE(queue, mr, mrt_entry);
1248 	free(mr);
1249 }
1250 
1251 void
1252 ikev2_msg_flushqueue(struct iked *env, struct iked_msgqueue *queue)
1253 {
1254 	struct iked_msg_retransmit	*mr = NULL;
1255 
1256 	while ((mr = TAILQ_FIRST(queue)) != NULL)
1257 		ikev2_msg_dispose(env, queue, mr);
1258 }
1259 
1260 struct iked_msg_retransmit *
1261 ikev2_msg_lookup(struct iked *env, struct iked_msgqueue *queue,
1262     struct iked_message *msg, uint8_t exchange)
1263 {
1264 	struct iked_msg_retransmit	*mr = NULL;
1265 
1266 	TAILQ_FOREACH(mr, queue, mrt_entry) {
1267 		if (TAILQ_FIRST(&mr->mrt_frags)->msg_msgid ==
1268 		    msg->msg_msgid &&
1269 		    TAILQ_FIRST(&mr->mrt_frags)->msg_exchange == exchange)
1270 			break;
1271 	}
1272 
1273 	return (mr);
1274 }
1275 
1276 int
1277 ikev2_msg_retransmit_response(struct iked *env, struct iked_sa *sa,
1278     struct iked_message *msg, uint8_t exchange)
1279 {
1280 	struct iked_msg_retransmit	*mr = NULL;
1281 	struct iked_message	*m = NULL;
1282 
1283 	if ((mr = ikev2_msg_lookup(env, &sa->sa_responses, msg, exchange))
1284 	    == NULL)
1285 		return (-2);	/* not found */
1286 
1287 	TAILQ_FOREACH(m, &mr->mrt_frags, msg_entry) {
1288 		if (sendtofrom(m->msg_fd, ibuf_data(m->msg_data),
1289 		    ibuf_size(m->msg_data), 0,
1290 		    (struct sockaddr *)&m->msg_peer, m->msg_peerlen,
1291 		    (struct sockaddr *)&m->msg_local, m->msg_locallen) == -1) {
1292 			log_warn("%s: sendtofrom", __func__);
1293 			ikestat_inc(env, ikes_msg_send_failures);
1294 			return (-1);
1295 		}
1296 		log_info("%sretransmit %s res %u local %s peer %s",
1297 		    SPI_SA(sa, NULL),
1298 		    print_map(exchange, ikev2_exchange_map),
1299 		    m->msg_msgid,
1300 		    print_addr(&m->msg_local),
1301 		    print_addr(&m->msg_peer));
1302 	}
1303 
1304 	timer_add(env, &mr->mrt_timer, IKED_RESPONSE_TIMEOUT);
1305 	ikestat_inc(env, ikes_retransmit_response);
1306 	return (0);
1307 }
1308 
1309 void
1310 ikev2_msg_response_timeout(struct iked *env, void *arg)
1311 {
1312 	struct iked_msg_retransmit	*mr = arg;
1313 	struct iked_sa		*sa;
1314 
1315 	sa = TAILQ_FIRST(&mr->mrt_frags)->msg_sa;
1316 	ikev2_msg_dispose(env, &sa->sa_responses, mr);
1317 }
1318 
1319 void
1320 ikev2_msg_retransmit_timeout(struct iked *env, void *arg)
1321 {
1322 	struct iked_msg_retransmit *mr = arg;
1323 	struct iked_message	*msg = TAILQ_FIRST(&mr->mrt_frags);
1324 	struct iked_sa		*sa = msg->msg_sa;
1325 
1326 	if (mr->mrt_tries < IKED_RETRANSMIT_TRIES) {
1327 		TAILQ_FOREACH(msg, &mr->mrt_frags, msg_entry) {
1328 			if (sendtofrom(msg->msg_fd, ibuf_data(msg->msg_data),
1329 			    ibuf_size(msg->msg_data), 0,
1330 			    (struct sockaddr *)&msg->msg_peer, msg->msg_peerlen,
1331 			    (struct sockaddr *)&msg->msg_local,
1332 			    msg->msg_locallen) == -1) {
1333 				log_warn("%s: sendtofrom", __func__);
1334 				ikev2_ike_sa_setreason(sa, "retransmit failed");
1335 				sa_free(env, sa);
1336 				ikestat_inc(env, ikes_msg_send_failures);
1337 				return;
1338 			}
1339 			log_info("%sretransmit %d %s req %u peer %s "
1340 			    "local %s", SPI_SA(sa, NULL), mr->mrt_tries + 1,
1341 			    print_map(msg->msg_exchange, ikev2_exchange_map),
1342 			    msg->msg_msgid,
1343 			    print_addr(&msg->msg_peer),
1344 			    print_addr(&msg->msg_local));
1345 		}
1346 		/* Exponential timeout */
1347 		timer_add(env, &mr->mrt_timer,
1348 		    IKED_RETRANSMIT_TIMEOUT * (2 << (mr->mrt_tries++)));
1349 		ikestat_inc(env, ikes_retransmit_request);
1350 	} else {
1351 		log_debug("%s: retransmit limit reached for req %u",
1352 		    __func__, msg->msg_msgid);
1353 		ikev2_ike_sa_setreason(sa, "retransmit limit reached");
1354 		ikestat_inc(env, ikes_retransmit_limit);
1355 		sa_free(env, sa);
1356 	}
1357 }
1358