xref: /openbsd-src/sbin/iked/iked.h (revision 9a83655441e776baff3ae381ac5f7fdec785fe21)
1*9a836554Sdlg /*	$OpenBSD: iked.h,v 1.233 2024/11/04 02:44:28 dlg Exp $	*/
245ae9d61Sreyk 
345ae9d61Sreyk /*
465c540d0Spatrick  * Copyright (c) 2019 Tobias Heider <tobias.heider@stusta.de>
5fcebd35dSreyk  * Copyright (c) 2010-2013 Reyk Floeter <reyk@openbsd.org>
645ae9d61Sreyk  *
745ae9d61Sreyk  * Permission to use, copy, modify, and distribute this software for any
845ae9d61Sreyk  * purpose with or without fee is hereby granted, provided that the above
945ae9d61Sreyk  * copyright notice and this permission notice appear in all copies.
1045ae9d61Sreyk  *
1145ae9d61Sreyk  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1245ae9d61Sreyk  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1345ae9d61Sreyk  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1445ae9d61Sreyk  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1545ae9d61Sreyk  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1645ae9d61Sreyk  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1745ae9d61Sreyk  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1845ae9d61Sreyk  */
1945ae9d61Sreyk 
2045ae9d61Sreyk #include <sys/types.h>
2145ae9d61Sreyk #include <sys/tree.h>
2245ae9d61Sreyk #include <sys/queue.h>
23f36db9c4Syasuoka #include <netinet/in.h>
2412e5c931Sguenther #include <arpa/inet.h>
25b9fc9a72Sderaadt #include <limits.h>
2645ae9d61Sreyk #include <imsg.h>
2745ae9d61Sreyk 
28e8b444cdSreyk #include <openssl/evp.h>
29e8b444cdSreyk 
3045ae9d61Sreyk #include "types.h"
3145ae9d61Sreyk #include "dh.h"
3245ae9d61Sreyk 
33d8ea035bSderaadt #define MAXIMUM(a,b) (((a)>(b))?(a):(b))
34d8ea035bSderaadt #define MINIMUM(a,b) (((a)<(b))?(a):(b))
35d8ea035bSderaadt #define roundup(x, y)   ((((x)+((y)-1))/(y))*(y))
36d8ea035bSderaadt 
37a3e464c5Sreyk #ifndef IKED_H
38a3e464c5Sreyk #define IKED_H
3945ae9d61Sreyk 
4045ae9d61Sreyk /*
41fde46d6eSreyk  * Common IKEv1/IKEv2 header
42fde46d6eSreyk  */
43fde46d6eSreyk 
44fde46d6eSreyk struct ike_header {
45d09d3a7dSreyk 	uint64_t	 ike_ispi;		/* Initiator cookie */
46d09d3a7dSreyk 	uint64_t	 ike_rspi;		/* Responder cookie */
47d09d3a7dSreyk 	uint8_t		 ike_nextpayload;	/* Next payload type */
48d09d3a7dSreyk 	uint8_t		 ike_version;		/* Major/Minor version number */
49d09d3a7dSreyk 	uint8_t		 ike_exchange;		/* Exchange type */
50d09d3a7dSreyk 	uint8_t		 ike_flags;		/* Message options */
51d09d3a7dSreyk 	uint32_t	 ike_msgid;		/* Message identifier */
52d09d3a7dSreyk 	uint32_t	 ike_length;		/* Total message length */
53fde46d6eSreyk } __packed;
54fde46d6eSreyk 
55fde46d6eSreyk /*
5645ae9d61Sreyk  * Common daemon infrastructure, local imsg etc.
5745ae9d61Sreyk  */
5845ae9d61Sreyk 
5945ae9d61Sreyk struct imsgev {
6045ae9d61Sreyk 	struct imsgbuf		 ibuf;
6145ae9d61Sreyk 	void			(*handler)(int, short, void *);
6245ae9d61Sreyk 	struct event		 ev;
63bf556abcSreyk 	struct privsep_proc	*proc;
6445ae9d61Sreyk 	void			*data;
6545ae9d61Sreyk 	short			 events;
6645ae9d61Sreyk 	const char		*name;
6745ae9d61Sreyk };
6845ae9d61Sreyk 
6945ae9d61Sreyk #define IMSG_SIZE_CHECK(imsg, p) do {				\
7045ae9d61Sreyk 	if (IMSG_DATA_SIZE(imsg) < sizeof(*p))			\
7145ae9d61Sreyk 		fatalx("bad length imsg received");		\
7245ae9d61Sreyk } while (0)
7345ae9d61Sreyk #define IMSG_DATA_SIZE(imsg)	((imsg)->hdr.len - IMSG_HEADER_SIZE)
7445ae9d61Sreyk 
758404f604Sreyk #define IKED_ADDR_EQ(_a, _b)						\
768404f604Sreyk 	((_a)->addr_mask == (_b)->addr_mask &&				\
778404f604Sreyk 	sockaddr_cmp((struct sockaddr *)&(_a)->addr,			\
788404f604Sreyk 	(struct sockaddr *)&(_b)->addr, (_a)->addr_mask) == 0)
798404f604Sreyk 
80e2015428Sreyk #define IKED_ADDR_NEQ(_a, _b)						\
81e2015428Sreyk 	((_a)->addr_mask != (_b)->addr_mask ||				\
82e2015428Sreyk 	sockaddr_cmp((struct sockaddr *)&(_a)->addr,			\
83e2015428Sreyk 	(struct sockaddr *)&(_b)->addr, (_a)->addr_mask) != 0)
84e2015428Sreyk 
8545ae9d61Sreyk /* initially control.h */
8645ae9d61Sreyk struct control_sock {
8745ae9d61Sreyk 	const char	*cs_name;
8845ae9d61Sreyk 	struct event	 cs_ev;
8982d0a036Sderaadt 	struct event	 cs_evt;
9045ae9d61Sreyk 	int		 cs_fd;
9145ae9d61Sreyk 	int		 cs_restricted;
9245ae9d61Sreyk 	void		*cs_env;
9345ae9d61Sreyk };
9445ae9d61Sreyk 
9545ae9d61Sreyk struct ctl_conn {
9645ae9d61Sreyk 	TAILQ_ENTRY(ctl_conn)	 entry;
97d09d3a7dSreyk 	uint8_t			 flags;
9845ae9d61Sreyk #define CTL_CONN_NOTIFY		 0x01
9945ae9d61Sreyk 	struct imsgev		 iev;
1000fbd6532Stobhe 	uint32_t		 peerid;
10145ae9d61Sreyk };
10245ae9d61Sreyk TAILQ_HEAD(ctl_connlist, ctl_conn);
10345ae9d61Sreyk 
104f4602b7cSmortimer extern enum privsep_procid privsep_process;
10545ae9d61Sreyk 
10645ae9d61Sreyk /*
10745ae9d61Sreyk  * Runtime structures
10845ae9d61Sreyk  */
10945ae9d61Sreyk 
110e487e0e8Smikeb struct iked_timer {
111e487e0e8Smikeb 	struct event	 tmr_ev;
112e487e0e8Smikeb 	struct iked	*tmr_env;
113e487e0e8Smikeb 	void		(*tmr_cb)(struct iked *, void *);
114e487e0e8Smikeb 	void		*tmr_cbarg;
115e487e0e8Smikeb };
116e487e0e8Smikeb 
11745ae9d61Sreyk struct iked_spi {
118d09d3a7dSreyk 	uint64_t	 spi;
119d09d3a7dSreyk 	uint8_t		 spi_size;
120d09d3a7dSreyk 	uint8_t		 spi_protoid;
12145ae9d61Sreyk };
12245ae9d61Sreyk 
12345ae9d61Sreyk struct iked_proposal {
124d09d3a7dSreyk 	uint8_t				 prop_id;
125d09d3a7dSreyk 	uint8_t				 prop_protoid;
12645ae9d61Sreyk 
12745ae9d61Sreyk 	struct iked_spi			 prop_localspi;
12845ae9d61Sreyk 	struct iked_spi			 prop_peerspi;
12945ae9d61Sreyk 
13045ae9d61Sreyk 	struct iked_transform		*prop_xforms;
131d09d3a7dSreyk 	unsigned int			 prop_nxforms;
13245ae9d61Sreyk 
13345ae9d61Sreyk 	TAILQ_ENTRY(iked_proposal)	 prop_entry;
13445ae9d61Sreyk };
13545ae9d61Sreyk TAILQ_HEAD(iked_proposals, iked_proposal);
13645ae9d61Sreyk 
13745ae9d61Sreyk struct iked_addr {
13845ae9d61Sreyk 	int				 addr_af;
13945ae9d61Sreyk 	struct sockaddr_storage		 addr;
140d09d3a7dSreyk 	uint8_t				 addr_mask;
14145ae9d61Sreyk 	int				 addr_net;
14245ae9d61Sreyk 	in_port_t			 addr_port;
14345ae9d61Sreyk };
14445ae9d61Sreyk 
1451f864a9aStobhe struct iked_ts {
1461f864a9aStobhe 	struct iked_addr		 ts_addr;
1471f864a9aStobhe 	uint8_t				 ts_ipproto;
1481f864a9aStobhe 	TAILQ_ENTRY(iked_ts)		 ts_entry;
1491f864a9aStobhe };
1501f864a9aStobhe TAILQ_HEAD(iked_tss, iked_ts);
1511f864a9aStobhe 
15245ae9d61Sreyk struct iked_flow {
15345ae9d61Sreyk 	struct iked_addr		 flow_src;
15445ae9d61Sreyk 	struct iked_addr		 flow_dst;
155d09d3a7dSreyk 	unsigned int			 flow_dir;	/* in/out */
1560347364bStobhe 	int				 flow_rdomain;
1577cd0af1dSvgross 	struct iked_addr		 flow_prenat;
158264f8b22Stobhe 	int				 flow_fixed;
15945ae9d61Sreyk 
160d09d3a7dSreyk 	unsigned int			 flow_loaded;	/* pfkey done */
16145ae9d61Sreyk 
162d09d3a7dSreyk 	uint8_t				 flow_saproto;
163d09d3a7dSreyk 	uint8_t				 flow_ipproto;
16445ae9d61Sreyk 
16545ae9d61Sreyk 	struct iked_addr		*flow_local;	/* outer source */
16645ae9d61Sreyk 	struct iked_addr		*flow_peer;	/* outer dest */
16745ae9d61Sreyk 	struct iked_sa			*flow_ikesa;	/* parent SA */
16845ae9d61Sreyk 
169856dba1dSmikeb 	RB_ENTRY(iked_flow)		 flow_node;
17045ae9d61Sreyk 	TAILQ_ENTRY(iked_flow)		 flow_entry;
17145ae9d61Sreyk };
1729dbd37b8Sreyk RB_HEAD(iked_flows, iked_flow);
1739dbd37b8Sreyk TAILQ_HEAD(iked_saflows, iked_flow);
17445ae9d61Sreyk 
17545ae9d61Sreyk struct iked_childsa {
17644c85a19Smpi 	uint8_t				 csa_saproto;	/* IPsec protocol */
177d09d3a7dSreyk 	unsigned int			 csa_dir;	/* in/out */
17845ae9d61Sreyk 
179d09d3a7dSreyk 	uint64_t			 csa_peerspi;	/* peer relation */
180d09d3a7dSreyk 	uint8_t				 csa_loaded;	/* pfkey done */
181d09d3a7dSreyk 	uint8_t				 csa_rekey;	/* will be deleted */
182d09d3a7dSreyk 	uint8_t				 csa_allocated;	/* from the kernel */
183d09d3a7dSreyk 	uint8_t				 csa_persistent;/* do not rekey */
184d09d3a7dSreyk 	uint8_t				 csa_esn;	/* use ESN */
185d09d3a7dSreyk 	uint8_t				 csa_transport;	/* transport mode */
18645ae9d61Sreyk 
18745ae9d61Sreyk 	struct iked_spi			 csa_spi;
18845ae9d61Sreyk 
18945ae9d61Sreyk 	struct ibuf			*csa_encrkey;	/* encryption key */
190d09d3a7dSreyk 	uint16_t			 csa_encrid;	/* encryption xform id */
19145ae9d61Sreyk 
19245ae9d61Sreyk 	struct ibuf			*csa_integrkey;	/* auth key */
193d09d3a7dSreyk 	uint16_t			 csa_integrid;	/* auth xform id */
19445ae9d61Sreyk 
19545ae9d61Sreyk 	struct iked_addr		*csa_local;	/* outer source */
19645ae9d61Sreyk 	struct iked_addr		*csa_peer;	/* outer dest */
19745ae9d61Sreyk 	struct iked_sa			*csa_ikesa;	/* parent SA */
19845ae9d61Sreyk 
199b0eeedd0Smikeb 	struct iked_childsa		*csa_peersa;	/* peer */
200b0eeedd0Smikeb 
201e7fee6f8Stobhe 	struct iked_childsa		*csa_bundled;	/* IPCOMP */
202bb108424Smarkus 
203c0379d99Stobhe 	uint16_t			 csa_pfsgrpid;	/* pfs group id */
204c0379d99Stobhe 
205856dba1dSmikeb 	RB_ENTRY(iked_childsa)		 csa_node;
20645ae9d61Sreyk 	TAILQ_ENTRY(iked_childsa)	 csa_entry;
20745ae9d61Sreyk };
208856dba1dSmikeb RB_HEAD(iked_activesas, iked_childsa);
20945ae9d61Sreyk TAILQ_HEAD(iked_childsas, iked_childsa);
21045ae9d61Sreyk 
21145ae9d61Sreyk 
21245ae9d61Sreyk struct iked_static_id {
213d09d3a7dSreyk 	uint8_t		id_type;
214d09d3a7dSreyk 	uint8_t		id_length;
215d09d3a7dSreyk 	uint8_t		id_offset;
216d09d3a7dSreyk 	uint8_t		id_data[IKED_ID_SIZE];
21745ae9d61Sreyk };
21845ae9d61Sreyk 
21945ae9d61Sreyk struct iked_auth {
220d09d3a7dSreyk 	uint8_t		auth_method;
221d09d3a7dSreyk 	uint8_t		auth_length;			/* zero if EAP */
222f36db9c4Syasuoka 	uint16_t	auth_eap;			/* optional EAP */
223d09d3a7dSreyk 	uint8_t		auth_data[IKED_PSK_SIZE];
22445ae9d61Sreyk };
22545ae9d61Sreyk 
22645ae9d61Sreyk struct iked_cfg {
227d09d3a7dSreyk 	uint8_t				 cfg_action;
228d09d3a7dSreyk 	uint16_t			 cfg_type;
22945ae9d61Sreyk 	union {
23045ae9d61Sreyk 		struct iked_addr	 address;
23145ae9d61Sreyk 	} cfg;
23245ae9d61Sreyk };
23345ae9d61Sreyk 
23432b6fc39Smarkus TAILQ_HEAD(iked_sapeers, iked_sa);
235b3ef9220Sreyk 
236b0eeedd0Smikeb struct iked_lifetime {
237d09d3a7dSreyk 	uint64_t			 lt_bytes;
238d09d3a7dSreyk 	uint64_t			 lt_seconds;
239b0eeedd0Smikeb };
240b0eeedd0Smikeb 
24145ae9d61Sreyk struct iked_policy {
242d09d3a7dSreyk 	unsigned int			 pol_id;
24345ae9d61Sreyk 	char				 pol_name[IKED_ID_SIZE];
244264f8b22Stobhe 	unsigned int			 pol_iface;
24545ae9d61Sreyk 
246e2015428Sreyk #define IKED_SKIP_FLAGS			 0
247e2015428Sreyk #define IKED_SKIP_AF			 1
248fc3e0ec8Stobhe #define IKED_SKIP_SRC_ADDR		 2
249fc3e0ec8Stobhe #define IKED_SKIP_DST_ADDR		 3
250fc3e0ec8Stobhe #define IKED_SKIP_COUNT			 4
251e2015428Sreyk 	struct iked_policy		*pol_skip[IKED_SKIP_COUNT];
252e2015428Sreyk 
253*9a836554Sdlg 	unsigned int			 pol_flags;
254*9a836554Sdlg #define IKED_POLICY_PASSIVE		 0x000
255*9a836554Sdlg #define IKED_POLICY_DEFAULT		 0x001
256*9a836554Sdlg #define IKED_POLICY_ACTIVE		 0x002
257*9a836554Sdlg #define IKED_POLICY_REFCNT		 0x004
258*9a836554Sdlg #define IKED_POLICY_QUICK		 0x008
259*9a836554Sdlg #define IKED_POLICY_SKIP		 0x010
260*9a836554Sdlg #define IKED_POLICY_IPCOMP		 0x020
261*9a836554Sdlg #define IKED_POLICY_TRANSPORT		 0x040
262*9a836554Sdlg #define IKED_POLICY_ROUTING		 0x080
263*9a836554Sdlg #define IKED_POLICY_NATT_FORCE		 0x100
26445ae9d61Sreyk 
26545ae9d61Sreyk 	int				 pol_refcnt;
26645ae9d61Sreyk 
267d09d3a7dSreyk 	uint8_t				 pol_certreqtype;
268a77120eaSmarkus 
269e2015428Sreyk 	int				 pol_af;
2700347364bStobhe 	int				 pol_rdomain;
271d09d3a7dSreyk 	uint8_t				 pol_saproto;
272fc3e0ec8Stobhe 	unsigned int			 pol_ipproto[IKED_IPPROTO_MAX];
273fc3e0ec8Stobhe 	unsigned int			 pol_nipproto;
27445ae9d61Sreyk 
275e2015428Sreyk 	struct iked_addr		 pol_peer;
27645ae9d61Sreyk 	struct iked_static_id		 pol_peerid;
277e254d6eaSmikeb 	uint32_t			 pol_peerdh;
278e2015428Sreyk 
279e2015428Sreyk 	struct iked_addr		 pol_local;
28045ae9d61Sreyk 	struct iked_static_id		 pol_localid;
28145ae9d61Sreyk 
28245ae9d61Sreyk 	struct iked_auth		 pol_auth;
28345ae9d61Sreyk 
28445ae9d61Sreyk 	char				 pol_tag[IKED_TAG_SIZE];
285d09d3a7dSreyk 	unsigned int			 pol_tap;
28645ae9d61Sreyk 
28745ae9d61Sreyk 	struct iked_proposals		 pol_proposals;
28845ae9d61Sreyk 	size_t				 pol_nproposals;
28945ae9d61Sreyk 
29045ae9d61Sreyk 	struct iked_flows		 pol_flows;
29145ae9d61Sreyk 	size_t				 pol_nflows;
2921f864a9aStobhe 	struct iked_tss			 pol_tssrc;	/* Traffic Selectors Initiator*/
2931f864a9aStobhe 	size_t				 pol_tssrc_count;
2941f864a9aStobhe 	struct iked_tss			 pol_tsdst;	/* Traffic Selectors Responder*/
2951f864a9aStobhe 	size_t				 pol_tsdst_count;
29645ae9d61Sreyk 
29745ae9d61Sreyk 	struct iked_cfg			 pol_cfg[IKED_CFG_MAX];
298d09d3a7dSreyk 	unsigned int			 pol_ncfg;
29945ae9d61Sreyk 
300d09d3a7dSreyk 	uint32_t			 pol_rekey;	/* ike SA lifetime */
3016e1880a3Smarkus 	struct iked_lifetime		 pol_lifetime;	/* child SA lifetime */
302b0eeedd0Smikeb 
303b3ef9220Sreyk 	struct iked_sapeers		 pol_sapeers;
304b3ef9220Sreyk 
305e2015428Sreyk 	TAILQ_ENTRY(iked_policy)	 pol_entry;
30645ae9d61Sreyk };
307e2015428Sreyk TAILQ_HEAD(iked_policies, iked_policy);
30845ae9d61Sreyk 
30945ae9d61Sreyk struct iked_hash {
310d09d3a7dSreyk 	uint8_t		 hash_type;	/* PRF or INTEGR */
311d09d3a7dSreyk 	uint16_t	 hash_id;	/* IKE PRF/INTEGR hash id */
31245ae9d61Sreyk 	const void	*hash_priv;	/* Identifying the hash alg */
31345ae9d61Sreyk 	void		*hash_ctx;	/* Context of the current invocation */
31445ae9d61Sreyk 	int		 hash_fixedkey;	/* Requires fixed key length */
31545ae9d61Sreyk 	struct ibuf	*hash_key;	/* MAC key derived from key seed */
31645ae9d61Sreyk 	size_t		 hash_length;	/* Output length */
31745ae9d61Sreyk 	size_t		 hash_trunc;	/* Truncate the output length */
31845ae9d61Sreyk 	struct iked_hash *hash_prf;	/* PRF pointer */
31915863c3aStobhe 	int		 hash_isaead;
32045ae9d61Sreyk };
32145ae9d61Sreyk 
32245ae9d61Sreyk struct iked_cipher {
323d09d3a7dSreyk 	uint8_t		 encr_type;	/* ENCR */
324d09d3a7dSreyk 	uint16_t	 encr_id;	/* IKE ENCR hash id */
32545ae9d61Sreyk 	const void	*encr_priv;	/* Identifying the hash alg */
32645ae9d61Sreyk 	void		*encr_ctx;	/* Context of the current invocation */
32745ae9d61Sreyk 	int		 encr_fixedkey;	/* Requires fixed key length */
32845ae9d61Sreyk 	struct ibuf	*encr_key;	/* MAC key derived from key seed */
32945ae9d61Sreyk 	struct ibuf	*encr_iv;	/* Initialization Vector */
330c4530a33Stobhe 	uint64_t	 encr_civ;	/* Counter IV for GCM */
33145ae9d61Sreyk 	size_t		 encr_ivlength;	/* IV length */
33245ae9d61Sreyk 	size_t		 encr_length;	/* Block length */
33315863c3aStobhe 	size_t		 encr_saltlength;	/* IV salt length */
33415863c3aStobhe 	uint16_t	 encr_authid;	/* ID of associated authentication */
33545ae9d61Sreyk };
33645ae9d61Sreyk 
33745ae9d61Sreyk struct iked_dsa {
338d09d3a7dSreyk 	uint8_t		 dsa_method;	/* AUTH method */
33945ae9d61Sreyk 	const void	*dsa_priv;	/* PRF or signature hash function */
34045ae9d61Sreyk 	void		*dsa_ctx;	/* PRF or signature hash ctx */
34145ae9d61Sreyk 	struct ibuf	*dsa_keydata;	/* public, private or shared key */
34245ae9d61Sreyk 	void		*dsa_key;	/* parsed public or private key */
34345ae9d61Sreyk 	int		 dsa_hmac;	/* HMAC or public/private key */
34445ae9d61Sreyk 	int		 dsa_sign;	/* Sign or verify operation */
345466d2dbaStobhe 	uint32_t	 dsa_flags;	/* State flags */
34645ae9d61Sreyk };
34745ae9d61Sreyk 
34845ae9d61Sreyk struct iked_id {
349d09d3a7dSreyk 	uint8_t		 id_type;
350d09d3a7dSreyk 	uint8_t		 id_offset;
35145ae9d61Sreyk 	struct ibuf	*id_buf;
35245ae9d61Sreyk };
35345ae9d61Sreyk 
354a2749d89Sreyk #define IKED_REQ_CERT		0x0001	/* get local certificate (if required) */
355a2749d89Sreyk #define IKED_REQ_CERTVALID	0x0002	/* validated the peer cert */
356a2749d89Sreyk #define IKED_REQ_CERTREQ	0x0004	/* CERTREQ has been received */
357a2749d89Sreyk #define IKED_REQ_AUTH		0x0008	/* AUTH payload */
358a2749d89Sreyk #define IKED_REQ_AUTHVALID	0x0010	/* AUTH payload has been verified */
359a2749d89Sreyk #define IKED_REQ_SA		0x0020	/* SA available */
360a2749d89Sreyk #define IKED_REQ_EAPVALID	0x0040	/* EAP payload has been verified */
361a2749d89Sreyk #define IKED_REQ_CHILDSA	0x0080	/* Child SA initiated */
362a2749d89Sreyk #define IKED_REQ_INF		0x0100	/* Informational exchange initiated */
36345ae9d61Sreyk 
36445ae9d61Sreyk #define IKED_REQ_BITS	\
365a2749d89Sreyk     "\20\01CERT\02CERTVALID\03CERTREQ\04AUTH\05AUTHVALID\06SA\07EAPVALID" \
366a2749d89Sreyk     "\10CHILDSA\11INF"
36745ae9d61Sreyk 
3686e264ad0Stobhe TAILQ_HEAD(iked_msgqueue, iked_msg_retransmit);
3696e264ad0Stobhe TAILQ_HEAD(iked_msg_fragqueue, iked_message);
370c45fd413Smikeb 
37145ae9d61Sreyk struct iked_sahdr {
372d09d3a7dSreyk 	uint64_t			 sh_ispi;	/* Initiator SPI */
373d09d3a7dSreyk 	uint64_t			 sh_rspi;	/* Responder SPI */
374d09d3a7dSreyk 	unsigned int			 sh_initiator;	/* Is initiator? */
37545ae9d61Sreyk } __packed;
37645ae9d61Sreyk 
3770cdab560Smarkus struct iked_kex {
3780cdab560Smarkus 	struct ibuf			*kex_inonce;	/* Ni */
3790cdab560Smarkus 	struct ibuf			*kex_rnonce;	/* Nr */
3800cdab560Smarkus 
3810e1bb3dcStobhe 	struct dh_group			*kex_dhgroup;	/* DH group */
3820cdab560Smarkus 	struct ibuf			*kex_dhiexchange;
3830cdab560Smarkus 	struct ibuf			*kex_dhrexchange;
3840cdab560Smarkus 	struct ibuf			*kex_dhpeer;	/* pointer to i or r */
3850cdab560Smarkus };
3860cdab560Smarkus 
38765c540d0Spatrick struct iked_frag_entry {
38865c540d0Spatrick 	uint8_t	*frag_data;
38965c540d0Spatrick 	size_t	 frag_size;
39065c540d0Spatrick };
39165c540d0Spatrick 
39265c540d0Spatrick struct iked_frag {
39365c540d0Spatrick 	struct iked_frag_entry	**frag_arr;	/* list of fragment buffers */
39465c540d0Spatrick 	size_t			  frag_count;	/* number of fragments received */
39565c540d0Spatrick #define IKED_FRAG_TOTAL_MAX	  111		/* upper limit (64kB / 576B) */
39665c540d0Spatrick 	size_t			  frag_total;	/* total numbe of fragments */
39765c540d0Spatrick 	size_t			  frag_total_size;
39865c540d0Spatrick 	uint8_t			  frag_nextpayload;
39965c540d0Spatrick 
40065c540d0Spatrick };
40165c540d0Spatrick 
402e7fee6f8Stobhe struct iked_ipcomp {
403e7fee6f8Stobhe 	uint16_t			 ic_cpi_out;	/* outgoing CPI */
404e7fee6f8Stobhe 	uint16_t			 ic_cpi_in;	/* incoming CPI */
405e7fee6f8Stobhe 	uint8_t				 ic_transform;	/* transform */
406e7fee6f8Stobhe };
407e7fee6f8Stobhe 
408f36db9c4Syasuoka struct iked_sastats {
409f36db9c4Syasuoka 	uint64_t			 sas_ipackets;
410f36db9c4Syasuoka 	uint64_t			 sas_opackets;
411f36db9c4Syasuoka 	uint64_t			 sas_ibytes;
412f36db9c4Syasuoka 	uint64_t			 sas_obytes;
413f36db9c4Syasuoka 	uint64_t			 sas_idrops;
414f36db9c4Syasuoka 	uint64_t			 sas_odrops;
415f36db9c4Syasuoka };
416f36db9c4Syasuoka 
41745ae9d61Sreyk struct iked_sa {
41845ae9d61Sreyk 	struct iked_sahdr		 sa_hdr;
419d09d3a7dSreyk 	uint32_t			 sa_msgid;	/* Last request rcvd */
4205dd59b3cSmarkus 	int				 sa_msgid_set;	/* msgid initialized */
42130904802Spatrick 	uint32_t			 sa_msgid_current;	/* Current requested rcvd */
422d09d3a7dSreyk 	uint32_t			 sa_reqid;	/* Next request sent */
42345ae9d61Sreyk 
424ae494144Sreyk 	int				 sa_type;
425ae494144Sreyk #define IKED_SATYPE_LOOKUP		 0		/* Used for lookup */
426ae494144Sreyk #define IKED_SATYPE_LOCAL		 1		/* Local SA */
427ae494144Sreyk 
42845ae9d61Sreyk 	struct iked_addr		 sa_peer;
429c0b327e6Spatrick 	struct iked_addr		 sa_peer_loaded;/* MOBIKE */
43045ae9d61Sreyk 	struct iked_addr		 sa_local;
43145ae9d61Sreyk 	int				 sa_fd;
43245ae9d61Sreyk 
43365c540d0Spatrick 	struct iked_frag		 sa_fragments;
43465c540d0Spatrick 
43545ae9d61Sreyk 	int				 sa_natt;	/* for IKE messages */
43645ae9d61Sreyk 	int				 sa_udpencap;	/* for pfkey */
437d52b1aceSpatrick 	int				 sa_usekeepalive;/* NAT-T keepalive */
43845ae9d61Sreyk 
43945ae9d61Sreyk 	int				 sa_state;
440d09d3a7dSreyk 	unsigned int			 sa_stateflags;
441d09d3a7dSreyk 	unsigned int			 sa_stateinit;	/* SA_INIT */
442d09d3a7dSreyk 	unsigned int			 sa_statevalid;	/* IKE_AUTH */
44345ae9d61Sreyk 
44445ae9d61Sreyk 	int				 sa_cp;		/* XXX */
44552b3354cStobhe 	struct iked_addr		*sa_cp_addr;	/* requested address */
44652b3354cStobhe 	struct iked_addr		*sa_cp_addr6;	/* requested address */
4479ef39cf4Stobhe 	struct iked_addr		*sa_cp_dns;	/* requested dns */
44845ae9d61Sreyk 
44945ae9d61Sreyk 	struct iked_policy		*sa_policy;
45045ae9d61Sreyk 	struct timeval			 sa_timecreated;
45145ae9d61Sreyk 	struct timeval			 sa_timeused;
45245ae9d61Sreyk 
45345ae9d61Sreyk 	char				*sa_tag;
45484a9a21bStobhe 	const char			*sa_reason;	/* reason for close */
45545ae9d61Sreyk 
4560cdab560Smarkus 	struct iked_kex			 sa_kex;
4570cdab560Smarkus /* XXX compat defines until everything is converted */
4580cdab560Smarkus #define sa_inonce		sa_kex.kex_inonce
4590cdab560Smarkus #define sa_rnonce		sa_kex.kex_rnonce
4600cdab560Smarkus #define sa_dhgroup		sa_kex.kex_dhgroup
4610cdab560Smarkus #define sa_dhiexchange		sa_kex.kex_dhiexchange
4620cdab560Smarkus #define sa_dhrexchange		sa_kex.kex_dhrexchange
4630cdab560Smarkus #define sa_dhpeer		sa_kex.kex_dhpeer
46445ae9d61Sreyk 
46545ae9d61Sreyk 	struct iked_hash		*sa_prf;	/* PRF alg */
46645ae9d61Sreyk 	struct iked_hash		*sa_integr;	/* integrity alg */
46745ae9d61Sreyk 	struct iked_cipher		*sa_encr;	/* encryption alg */
46845ae9d61Sreyk 
46945ae9d61Sreyk 	struct ibuf			*sa_key_d;	/* SK_d */
47045ae9d61Sreyk 	struct ibuf			*sa_key_iauth;	/* SK_ai */
47145ae9d61Sreyk 	struct ibuf			*sa_key_rauth;	/* SK_ar */
47245ae9d61Sreyk 	struct ibuf			*sa_key_iencr;	/* SK_ei */
47345ae9d61Sreyk 	struct ibuf			*sa_key_rencr;	/* SK_er */
47445ae9d61Sreyk 	struct ibuf			*sa_key_iprf;	/* SK_pi */
47545ae9d61Sreyk 	struct ibuf			*sa_key_rprf;	/* SK_pr */
47645ae9d61Sreyk 
47745ae9d61Sreyk 	struct ibuf			*sa_1stmsg;	/* for initiator AUTH */
47845ae9d61Sreyk 	struct ibuf			*sa_2ndmsg;	/* for responder AUTH */
47945ae9d61Sreyk 	struct iked_id			 sa_localauth;	/* local AUTH message */
480adb74705Stobhe 	struct iked_id			 sa_peerauth;	/* peer AUTH message */
48148b975e3Smarkus 	int				 sa_sigsha2;	/* use SHA2 for signatures */
482055943a1Stobhe #define IKED_SCERT_MAX	3 /* max # of supplemental cert payloads */
48345ae9d61Sreyk 
48445ae9d61Sreyk 	struct iked_id			 sa_iid;	/* initiator id */
48545ae9d61Sreyk 	struct iked_id			 sa_rid;	/* responder id */
48645ae9d61Sreyk 	struct iked_id			 sa_icert;	/* initiator cert */
48745ae9d61Sreyk 	struct iked_id			 sa_rcert;	/* responder cert */
488055943a1Stobhe 	struct iked_id			 sa_scert[IKED_SCERT_MAX]; /* supplemental certs */
489834f9deeSmarkus #define IKESA_SRCID(x) ((x)->sa_hdr.sh_initiator ? &(x)->sa_iid : &(x)->sa_rid)
490834f9deeSmarkus #define IKESA_DSTID(x) ((x)->sa_hdr.sh_initiator ? &(x)->sa_rid : &(x)->sa_iid)
49145ae9d61Sreyk 
49245ae9d61Sreyk 	char				*sa_eapid;	/* EAP identity */
49345ae9d61Sreyk 	struct iked_id			 sa_eap;	/* EAP challenge */
49445ae9d61Sreyk 	struct ibuf			*sa_eapmsk;	/* EAK session key */
4959ca241fcSyasuoka 	struct ibuf			*sa_eapclass;	/* EAP/RADIUS class */
49645ae9d61Sreyk 
49745ae9d61Sreyk 	struct iked_proposals		 sa_proposals;	/* SA proposals */
49844c85a19Smpi 	struct iked_childsas		 sa_childsas;	/* IPsec Child SAs */
49944c85a19Smpi 	struct iked_saflows		 sa_flows;	/* IPsec flows */
500f36db9c4Syasuoka 	struct iked_sastats		 sa_stats;
50145ae9d61Sreyk 
50293415f65Smikeb 	struct iked_sa			*sa_nexti;	/* initiated IKE SA */
503ca2fa981Stobhe 	struct iked_sa			*sa_previ;	/* matching back pointer */
50493415f65Smikeb 	struct iked_sa			*sa_nextr;	/* simultaneous rekey */
505ca2fa981Stobhe 	struct iked_sa			*sa_prevr;	/* matching back pointer */
50683e6846fSmikeb 	uint64_t			 sa_rekeyspi;	/* peerspi CSA rekey */
50783e6846fSmikeb 	struct ibuf			*sa_simult;	/* simultaneous rekey */
5089be30034Smarkus 
509e7fee6f8Stobhe 	struct iked_ipcomp		 sa_ipcompi;	/* IPcomp initator */
510e7fee6f8Stobhe 	struct iked_ipcomp		 sa_ipcompr;	/* IPcomp responder */
51103f6ad09Smarkus 
512c0b327e6Spatrick 	int				 sa_mobike;	/* MOBIKE */
51365c540d0Spatrick 	int				 sa_frag;	/* fragmentation */
514c0b327e6Spatrick 
5151565ef62Stobhe 	int				 sa_use_transport_mode;	/* peer requested */
5161565ef62Stobhe 	int				 sa_used_transport_mode; /* we enabled */
5171565ef62Stobhe 
51881bdcbc1Smikeb 	struct iked_timer		 sa_timer;	/* SA timeouts */
5195aade85cSreyk #define IKED_IKE_SA_EXCHANGE_TIMEOUT	 300		/* 5 minutes */
5205aade85cSreyk #define IKED_IKE_SA_REKEY_TIMEOUT	 120		/* 2 minutes */
5215aade85cSreyk #define IKED_IKE_SA_DELETE_TIMEOUT	 120		/* 2 minutes */
522131966b1Smarkus #define IKED_IKE_SA_ALIVE_TIMEOUT	 60		/* 1 minute */
52381bdcbc1Smikeb 
524d52b1aceSpatrick 	struct iked_timer		 sa_keepalive;	/* keepalive timer */
525d52b1aceSpatrick #define IKED_IKE_SA_KEEPALIVE_TIMEOUT	 20
526d52b1aceSpatrick 
5276e1880a3Smarkus 	struct iked_timer		 sa_rekey;	/* rekey timeout */
52838194102Stobhe 	int				 sa_tmpfail;
5296e1880a3Smarkus 
530c45fd413Smikeb 	struct iked_msgqueue		 sa_requests;	/* request queue */
531c45fd413Smikeb #define IKED_RETRANSMIT_TIMEOUT		 2		/* 2 seconds */
532c45fd413Smikeb 
533c45fd413Smikeb 	struct iked_msgqueue		 sa_responses;	/* response queue */
534c45fd413Smikeb #define IKED_RESPONSE_TIMEOUT		 120		/* 2 minutes */
535c45fd413Smikeb 
53632b6fc39Smarkus 	TAILQ_ENTRY(iked_sa)		 sa_peer_entry;
537729f601bStobhe 	RB_ENTRY(iked_sa)		 sa_entry;	/* all SAs */
538729f601bStobhe 
539729f601bStobhe 	RB_ENTRY(iked_sa)		 sa_dstid_entry;	/* SAs by DSTID */
540729f601bStobhe 	int				 sa_dstid_entry_valid;		/* sa_dstid_entry valid */
54143be1c05Smarkus 
54243be1c05Smarkus 	struct iked_addr		*sa_addrpool;	/* address from pool */
54343be1c05Smarkus 	RB_ENTRY(iked_sa)		 sa_addrpool_entry;	/* pool entries */
54419dc8638Spatrick 
54519dc8638Spatrick 	struct iked_addr		*sa_addrpool6;	/* address from pool */
54619dc8638Spatrick 	RB_ENTRY(iked_sa)		 sa_addrpool6_entry;	/* pool entries */
54773192dbaStobhe 	time_t				 sa_last_recvd;
54873192dbaStobhe #define IKED_IKE_SA_LAST_RECVD_TIMEOUT	 300		/* 5 minutes */
549f36db9c4Syasuoka 	struct timespec			 sa_starttime;
550f36db9c4Syasuoka 
551f36db9c4Syasuoka 	struct iked_radserver_req	*sa_radreq;
552f36db9c4Syasuoka 	struct iked_addr		*sa_rad_addr;	/* requested address */
553f36db9c4Syasuoka 	struct iked_addr		*sa_rad_addr6;	/* requested address */
55445ae9d61Sreyk };
55545ae9d61Sreyk RB_HEAD(iked_sas, iked_sa);
556729f601bStobhe RB_HEAD(iked_dstid_sas, iked_sa);
55743be1c05Smarkus RB_HEAD(iked_addrpool, iked_sa);
55819dc8638Spatrick RB_HEAD(iked_addrpool6, iked_sa);
55945ae9d61Sreyk 
560b41cc0c8Stobhe /* stats */
561b41cc0c8Stobhe 
562b41cc0c8Stobhe struct iked_stats {
563b41cc0c8Stobhe 	uint64_t	ikes_sa_created;
564b41cc0c8Stobhe 	uint64_t	ikes_sa_established_total;
565b41cc0c8Stobhe 	uint64_t	ikes_sa_established_current;	/* gauge */
566b41cc0c8Stobhe 	uint64_t	ikes_sa_established_failures;
567b41cc0c8Stobhe 	uint64_t	ikes_sa_proposals_negotiate_failures;
568b41cc0c8Stobhe 	uint64_t	ikes_sa_rekeyed;
569b41cc0c8Stobhe 	uint64_t	ikes_sa_removed;
570b41cc0c8Stobhe 	uint64_t	ikes_csa_created;
571b41cc0c8Stobhe 	uint64_t	ikes_csa_removed;
572b41cc0c8Stobhe 	uint64_t	ikes_msg_sent;
573b41cc0c8Stobhe 	uint64_t	ikes_msg_send_failures;
574b41cc0c8Stobhe 	uint64_t	ikes_msg_rcvd;
575b41cc0c8Stobhe 	uint64_t	ikes_msg_rcvd_busy;
576b41cc0c8Stobhe 	uint64_t	ikes_msg_rcvd_dropped;
577b41cc0c8Stobhe 	uint64_t	ikes_retransmit_request;
578b41cc0c8Stobhe 	uint64_t	ikes_retransmit_response;
579b41cc0c8Stobhe 	uint64_t	ikes_retransmit_limit;
580b41cc0c8Stobhe 	uint64_t	ikes_frag_sent;
581b41cc0c8Stobhe 	uint64_t	ikes_frag_send_failures;
582b41cc0c8Stobhe 	uint64_t	ikes_frag_rcvd;
583b41cc0c8Stobhe 	uint64_t	ikes_frag_rcvd_drop;
584b41cc0c8Stobhe 	uint64_t	ikes_frag_reass_ok;
585b41cc0c8Stobhe 	uint64_t	ikes_frag_reass_drop;
586b41cc0c8Stobhe 	uint64_t	ikes_update_addresses_sent;
587b41cc0c8Stobhe 	uint64_t	ikes_dpd_sent;
588b41cc0c8Stobhe 	uint64_t	ikes_keepalive_sent;
589b41cc0c8Stobhe };
590b41cc0c8Stobhe 
591b41cc0c8Stobhe #define ikestat_add(env, c, n)	do { env->sc_stats.c += (n); } while(0)
592b41cc0c8Stobhe #define ikestat_inc(env, c)	ikestat_add(env, c, 1)
593b41cc0c8Stobhe #define ikestat_dec(env, c)	ikestat_add(env, c, -1)
594b41cc0c8Stobhe 
595eb2389caStobhe struct iked_certreq {
596eb2389caStobhe 	struct ibuf			*cr_data;
597eb2389caStobhe 	uint8_t				 cr_type;
5983e395450Stobhe 	SIMPLEQ_ENTRY(iked_certreq)	 cr_entry;
599eb2389caStobhe };
6003e395450Stobhe SIMPLEQ_HEAD(iked_certreqs, iked_certreq);
601eb2389caStobhe 
602ac57c459Stobhe #define EAP_STATE_IDENTITY		(1)
603ac57c459Stobhe #define EAP_STATE_MSCHAPV2_CHALLENGE	(2)
604ac57c459Stobhe #define EAP_STATE_MSCHAPV2_SUCCESS	(3)
605ac57c459Stobhe #define EAP_STATE_SUCCESS		(4)
606ac57c459Stobhe 
607ac57c459Stobhe struct eap_msg {
608ac57c459Stobhe 	char		*eam_identity;
609ac57c459Stobhe 	char		*eam_user;
610ac57c459Stobhe 	int		 eam_type;
611ac57c459Stobhe 	uint8_t		 eam_id;
612ac57c459Stobhe 	uint8_t		 eam_msrid;
613ac57c459Stobhe 	int		 eam_success;
614ac57c459Stobhe 	int		 eam_found;
615ac57c459Stobhe 	int		 eam_response;
616ac57c459Stobhe 	uint8_t		 eam_challenge[16];
617ac57c459Stobhe 	uint8_t		 eam_ntresponse[24];
618ac57c459Stobhe 	uint32_t	 eam_state;
619ac57c459Stobhe };
620ac57c459Stobhe 
62145ae9d61Sreyk struct iked_message {
62245ae9d61Sreyk 	struct ibuf		*msg_data;
623d39d09feSreyk 	size_t			 msg_offset;
62445ae9d61Sreyk 
62545ae9d61Sreyk 	struct sockaddr_storage	 msg_local;
62645ae9d61Sreyk 	socklen_t		 msg_locallen;
62745ae9d61Sreyk 
62845ae9d61Sreyk 	struct sockaddr_storage	 msg_peer;
62945ae9d61Sreyk 	socklen_t		 msg_peerlen;
63045ae9d61Sreyk 
631d4614e98Sreyk 	struct iked_socket	*msg_sock;
632d4614e98Sreyk 
63345ae9d61Sreyk 	int			 msg_fd;
63445ae9d61Sreyk 	int			 msg_response;
635131966b1Smarkus 	int			 msg_responded;
63630904802Spatrick 	int			 msg_valid;
63745ae9d61Sreyk 	int			 msg_natt;
638c0b327e6Spatrick 	int			 msg_natt_rcvd;
639e3943314Stobhe 	int			 msg_nat_detected;
64045ae9d61Sreyk 	int			 msg_error;
64126d7dba1Sreyk 	int			 msg_e;
64226d7dba1Sreyk 	struct iked_message	*msg_parent;
64345ae9d61Sreyk 
64445ae9d61Sreyk 	/* Associated policy and SA */
64545ae9d61Sreyk 	struct iked_policy	*msg_policy;
64645ae9d61Sreyk 	struct iked_sa		*msg_sa;
64745ae9d61Sreyk 
648d09d3a7dSreyk 	uint32_t		 msg_msgid;
649d09d3a7dSreyk 	uint8_t			 msg_exchange;
650c45fd413Smikeb 
65145ae9d61Sreyk 	/* Parsed information */
65245ae9d61Sreyk 	struct iked_proposals	 msg_proposals;
653eb2389caStobhe 	struct iked_certreqs	 msg_certreqs;
65445ae9d61Sreyk 	struct iked_spi		 msg_rekey;
6551b0d4946Sreyk 	struct ibuf		*msg_nonce;	/* dh NONCE */
6569e48f23eSpatrick 	uint16_t		 msg_dhgroup;	/* dh group */
6571b0d4946Sreyk 	struct ibuf		*msg_ke;	/* dh key exchange */
65826d7dba1Sreyk 	struct iked_id		 msg_auth;	/* AUTH payload */
6599ce164edStobhe 	struct iked_id		 msg_peerid;
660e3f5cf2eSpatrick 	struct iked_id		 msg_localid;
66126d7dba1Sreyk 	struct iked_id		 msg_cert;
662a30a01d6Stobhe 	struct iked_id		 msg_scert[IKED_SCERT_MAX]; /* supplemental certs */
663d4bcf9ebSreyk 	struct ibuf		*msg_cookie;
664eb2389caStobhe 	uint16_t		 msg_group;
665eb2389caStobhe 	uint16_t		 msg_cpi;
666eb2389caStobhe 	uint8_t			 msg_transform;
667eb2389caStobhe 	uint16_t		 msg_flags;
668ac57c459Stobhe 	struct eap_msg		 msg_eap;
669f36db9c4Syasuoka 	struct ibuf		*msg_eapmsg;
670da56c325Stobhe 	size_t			 msg_del_spisize;
671da56c325Stobhe 	size_t			 msg_del_cnt;
672da56c325Stobhe 	struct ibuf		*msg_del_buf;
673da56c325Stobhe 	int			 msg_del_protoid;
674046db3fbStobhe 	int			 msg_cp;
67552b3354cStobhe 	struct iked_addr	*msg_cp_addr;	/* requested address */
67652b3354cStobhe 	struct iked_addr	*msg_cp_addr6;	/* requested address */
6779ef39cf4Stobhe 	struct iked_addr	*msg_cp_dns;	/* requested dns */
6782117af45Stobhe 	uint16_t		 msg_frag_num;
67945ae9d61Sreyk 
680c0b327e6Spatrick 	/* MOBIKE */
681c0b327e6Spatrick 	int			 msg_update_sa_addresses;
682c0b327e6Spatrick 	struct ibuf		*msg_cookie2;
683c0b327e6Spatrick 
68445ae9d61Sreyk 	/* Parse stack */
68545ae9d61Sreyk 	struct iked_proposal	*msg_prop;
686d09d3a7dSreyk 	uint16_t		 msg_attrlength;
687c45fd413Smikeb 
688c45fd413Smikeb 	/* Retransmit queue */
689c45fd413Smikeb 	TAILQ_ENTRY(iked_message)
690c45fd413Smikeb 				 msg_entry;
6916e264ad0Stobhe };
6926e264ad0Stobhe 
6936e264ad0Stobhe struct iked_msg_retransmit {
6946e264ad0Stobhe 	struct iked_msg_fragqueue	      mrt_frags;
6956e264ad0Stobhe 	TAILQ_ENTRY(iked_msg_retransmit)      mrt_entry;
6966e264ad0Stobhe 	struct iked_timer		      mrt_timer;
6976e264ad0Stobhe 	int				      mrt_tries;
698c45fd413Smikeb #define IKED_RETRANSMIT_TRIES	 5		/* try 5 times */
69945ae9d61Sreyk };
70045ae9d61Sreyk 
701eb2389caStobhe #define IKED_MSG_NAT_SRC_IP				0x01
702eb2389caStobhe #define IKED_MSG_NAT_DST_IP				0x02
703eb2389caStobhe 
704eb2389caStobhe #define IKED_MSG_FLAGS_FRAGMENTATION			0x0001
705eb2389caStobhe #define IKED_MSG_FLAGS_MOBIKE				0x0002
706eb2389caStobhe #define IKED_MSG_FLAGS_SIGSHA2				0x0004
707eb2389caStobhe #define IKED_MSG_FLAGS_CHILD_SA_NOT_FOUND		0x0008
708eb2389caStobhe #define IKED_MSG_FLAGS_NO_ADDITIONAL_SAS		0x0010
709eb2389caStobhe #define IKED_MSG_FLAGS_AUTHENTICATION_FAILED		0x0020
710eb2389caStobhe #define IKED_MSG_FLAGS_INVALID_KE			0x0040
711eb2389caStobhe #define IKED_MSG_FLAGS_IPCOMP_SUPPORTED			0x0080
712a1e428a3Stobhe #define IKED_MSG_FLAGS_USE_TRANSPORT			0x0100
71338194102Stobhe #define IKED_MSG_FLAGS_TEMPORARY_FAILURE		0x0200
7149362e1a5Stobhe #define IKED_MSG_FLAGS_NO_PROPOSAL_CHOSEN		0x0400
715eb2389caStobhe 
716eb2389caStobhe 
71745ae9d61Sreyk struct iked_user {
718b9fc9a72Sderaadt 	char			 usr_name[LOGIN_NAME_MAX];
71945ae9d61Sreyk 	char			 usr_pass[IKED_PASSWORD_SIZE];
72045ae9d61Sreyk 	RB_ENTRY(iked_user)	 usr_entry;
72145ae9d61Sreyk };
72245ae9d61Sreyk RB_HEAD(iked_users, iked_user);
72345ae9d61Sreyk 
724f36db9c4Syasuoka struct iked_radserver_req;
725f36db9c4Syasuoka 
726f36db9c4Syasuoka struct iked_radserver {
727f36db9c4Syasuoka 	int				 rs_sock;
728f36db9c4Syasuoka 	int				 rs_accounting;
729f36db9c4Syasuoka 	struct event			 rs_ev;
730f36db9c4Syasuoka 	struct iked			*rs_env;
731f36db9c4Syasuoka 	struct sockaddr_storage		 rs_sockaddr;
732f36db9c4Syasuoka 	TAILQ_ENTRY(iked_radserver)	 rs_entry;
733f36db9c4Syasuoka 	struct in_addr			 rs_nas_ipv4;
734f36db9c4Syasuoka 	struct in6_addr			 rs_nas_ipv6;
735f36db9c4Syasuoka 	unsigned int			 rs_reqseq;
736f36db9c4Syasuoka 	TAILQ_HEAD(, iked_radserver_req) rs_reqs;
737f36db9c4Syasuoka 	char				 rs_secret[];
738f36db9c4Syasuoka };
739f36db9c4Syasuoka TAILQ_HEAD(iked_radservers, iked_radserver);
740f36db9c4Syasuoka 
741f36db9c4Syasuoka struct iked_raddae {
742f36db9c4Syasuoka 	int				 rd_sock;
743f36db9c4Syasuoka 	struct event			 rd_ev;
744f36db9c4Syasuoka 	struct iked			*rd_env;
745f36db9c4Syasuoka 	struct sockaddr_storage		 rd_sockaddr;
746f36db9c4Syasuoka 	TAILQ_ENTRY(iked_raddae)	 rd_entry;
747f36db9c4Syasuoka };
748f36db9c4Syasuoka TAILQ_HEAD(iked_raddaes, iked_raddae);
749f36db9c4Syasuoka 
750f36db9c4Syasuoka struct iked_radclient {
751f36db9c4Syasuoka 	struct iked			*rc_env;
752f36db9c4Syasuoka 	struct sockaddr_storage		 rc_sockaddr;
753f36db9c4Syasuoka 	TAILQ_ENTRY(iked_radclient)	 rc_entry;
754f36db9c4Syasuoka 	char				 rc_secret[];
755f36db9c4Syasuoka };
756f36db9c4Syasuoka TAILQ_HEAD(iked_radclients , iked_radclient);
757f36db9c4Syasuoka 
758f36db9c4Syasuoka struct iked_radopts {
759f36db9c4Syasuoka 	int				 max_tries;
760f36db9c4Syasuoka 	int				 max_failovers;
761f36db9c4Syasuoka };
762f36db9c4Syasuoka 
763f36db9c4Syasuoka struct iked_radcfgmap {
764f36db9c4Syasuoka 	uint16_t			 cfg_type;
765f36db9c4Syasuoka 	uint32_t			 vendor_id;
766f36db9c4Syasuoka 	uint8_t				 attr_type;
767f36db9c4Syasuoka 	TAILQ_ENTRY(iked_radcfgmap)	 entry;
768f36db9c4Syasuoka };
769f36db9c4Syasuoka TAILQ_HEAD(iked_radcfgmaps, iked_radcfgmap);
770f36db9c4Syasuoka 
771f36db9c4Syasuoka extern const struct iked_radcfgmap radius_cfgmaps[];
772f36db9c4Syasuoka 
773f36db9c4Syasuoka struct iked_radserver_req {
774f36db9c4Syasuoka 	struct iked_radserver		*rr_server;
775f36db9c4Syasuoka 	struct iked_sa			*rr_sa;
776f36db9c4Syasuoka 	struct iked_timer		 rr_timer;
777f36db9c4Syasuoka 	int				 rr_reqid;
778f36db9c4Syasuoka 	int				 rr_accounting;
779f36db9c4Syasuoka 	struct timespec			 rr_accttime;
780f36db9c4Syasuoka 	void				*rr_reqpkt;
781f36db9c4Syasuoka 	struct ibuf			*rr_state;
782f36db9c4Syasuoka 	char				*rr_user;
783f36db9c4Syasuoka 	int				 rr_ntry;
784f36db9c4Syasuoka 	int				 rr_nfailover;
785f36db9c4Syasuoka 	struct iked_cfg			 rr_cfg[IKED_CFG_MAX];
786f36db9c4Syasuoka 	unsigned int			 rr_ncfg;
787f36db9c4Syasuoka 	TAILQ_ENTRY(iked_radserver_req)	 rr_entry;
788f36db9c4Syasuoka };
789f36db9c4Syasuoka 
790bf556abcSreyk struct privsep_pipes {
791bf556abcSreyk 	int				*pp_pipes[PROC_MAX];
792bf556abcSreyk };
793bf556abcSreyk 
794701048fbSreyk struct privsep {
795bf556abcSreyk 	struct privsep_pipes		*ps_pipes[PROC_MAX];
796bf556abcSreyk 	struct privsep_pipes		*ps_pp;
797bf556abcSreyk 
798bf556abcSreyk 	struct imsgev			*ps_ievs[PROC_MAX];
799701048fbSreyk 	const char			*ps_title[PROC_MAX];
800701048fbSreyk 	pid_t				 ps_pid[PROC_MAX];
801701048fbSreyk 	struct passwd			*ps_pw;
802bf556abcSreyk 	int				 ps_noaction;
803701048fbSreyk 
804701048fbSreyk 	struct control_sock		 ps_csock;
805701048fbSreyk 
806d09d3a7dSreyk 	unsigned int			 ps_instances[PROC_MAX];
807d09d3a7dSreyk 	unsigned int			 ps_ninstances;
808d09d3a7dSreyk 	unsigned int			 ps_instance;
809bf556abcSreyk 
810701048fbSreyk 	/* Event and signal handlers */
811701048fbSreyk 	struct event			 ps_evsigint;
812701048fbSreyk 	struct event			 ps_evsigterm;
813701048fbSreyk 	struct event			 ps_evsigchld;
814701048fbSreyk 	struct event			 ps_evsighup;
815701048fbSreyk 	struct event			 ps_evsigpipe;
816d5fd2e4bSreyk 	struct event			 ps_evsigusr1;
817701048fbSreyk 
818701048fbSreyk 	struct iked			*ps_env;
8198e8f56e9Stobhe 	unsigned int			 ps_connecting;
8208e8f56e9Stobhe 	void				(*ps_connected)(struct privsep *);
821701048fbSreyk };
822701048fbSreyk 
823701048fbSreyk struct privsep_proc {
824701048fbSreyk 	const char		*p_title;
825701048fbSreyk 	enum privsep_procid	 p_id;
826701048fbSreyk 	int			(*p_cb)(int, struct privsep_proc *,
827701048fbSreyk 				    struct imsg *);
828a7dbf4aeStobhe 	void			(*p_init)(struct privsep *,
829701048fbSreyk 				    struct privsep_proc *);
830701048fbSreyk 	const char		*p_chroot;
831a7dbf4aeStobhe 	struct passwd		*p_pw;
832701048fbSreyk 	struct privsep		*p_ps;
833e8e9d77fStobhe 	void			(*p_shutdown)(void);
834701048fbSreyk };
835701048fbSreyk 
836a7dbf4aeStobhe struct privsep_fd {
837a7dbf4aeStobhe 	enum privsep_procid		 pf_procid;
838a7dbf4aeStobhe 	unsigned int			 pf_instance;
839a7dbf4aeStobhe };
840a7dbf4aeStobhe 
841a7dbf4aeStobhe #define PROC_PARENT_SOCK_FILENO 3
842a7dbf4aeStobhe #define PROC_MAX_INSTANCES      32
843a7dbf4aeStobhe 
8446d3b905bSmarkus struct iked_ocsp_entry {
8456d3b905bSmarkus 	TAILQ_ENTRY(iked_ocsp_entry) ioe_entry;	/* next request */
8466d3b905bSmarkus 	void			*ioe_ocsp;	/* private ocsp request data */
8476d3b905bSmarkus };
8486d3b905bSmarkus TAILQ_HEAD(iked_ocsp_requests, iked_ocsp_entry);
8496d3b905bSmarkus 
85045ae9d61Sreyk /*
85145ae9d61Sreyk  * Daemon configuration
85245ae9d61Sreyk  */
85345ae9d61Sreyk 
8541ae9ce49Stobhe enum natt_mode {
8551ae9ce49Stobhe 	NATT_DEFAULT,	/* send/recv with both :500 and NAT-T port */
8561ae9ce49Stobhe 	NATT_DISABLE,	/* send/recv with only :500 */
8571ae9ce49Stobhe 	NATT_FORCE,	/* send/recv with only NAT-T port */
8581ae9ce49Stobhe };
8591ae9ce49Stobhe 
860421819b6Stobhe struct iked_static {
86143d162a4Stobhe 	uint64_t		 st_alive_timeout;
86273cd769dStobhe 	int			 st_cert_partial_chain;
863421819b6Stobhe 	int			 st_enforcesingleikesa;
864421819b6Stobhe 	uint8_t			 st_frag;	/* fragmentation */
865421819b6Stobhe 	uint8_t			 st_mobike;	/* MOBIKE */
866421819b6Stobhe 	in_port_t		 st_nattport;
867e3244f00Stobhe 	int			 st_stickyaddress; /* addr per DSTID  */
86887148674Stobhe 	int			 st_vendorid;
869421819b6Stobhe };
870421819b6Stobhe 
87145ae9d61Sreyk struct iked {
872b9fc9a72Sderaadt 	char				 sc_conffile[PATH_MAX];
87345ae9d61Sreyk 
874d09d3a7dSreyk 	uint32_t			 sc_opts;
8757e57f0c1Stobhe 	enum natt_mode			 sc_nattmode;
876d09d3a7dSreyk 	uint8_t				 sc_passive;
877d09d3a7dSreyk 	uint8_t				 sc_decoupled;
87845ae9d61Sreyk 
879421819b6Stobhe 	struct iked_static		 sc_static;
880421819b6Stobhe 
88143d162a4Stobhe #define sc_alive_timeout	sc_static.st_alive_timeout
88273cd769dStobhe #define sc_cert_partial_chain	sc_static.st_cert_partial_chain
883421819b6Stobhe #define sc_enforcesingleikesa	sc_static.st_enforcesingleikesa
884421819b6Stobhe #define sc_frag			sc_static.st_frag
885421819b6Stobhe #define sc_mobike		sc_static.st_mobike
886421819b6Stobhe #define sc_nattport		sc_static.st_nattport
887e3244f00Stobhe #define sc_stickyaddress	sc_static.st_stickyaddress
88887148674Stobhe #define sc_vendorid		sc_static.st_vendorid
889c0b327e6Spatrick 
89045ae9d61Sreyk 	struct iked_policies		 sc_policies;
89145ae9d61Sreyk 	struct iked_policy		*sc_defaultcon;
89245ae9d61Sreyk 
89345ae9d61Sreyk 	struct iked_sas			 sc_sas;
894729f601bStobhe 	struct iked_dstid_sas		 sc_dstid_sas;
895856dba1dSmikeb 	struct iked_activesas		 sc_activesas;
8969dbd37b8Sreyk 	struct iked_flows		 sc_activeflows;
89745ae9d61Sreyk 	struct iked_users		 sc_users;
898f36db9c4Syasuoka 	struct iked_radopts		 sc_radauth;
899f36db9c4Syasuoka 	struct iked_radopts		 sc_radacct;
900f36db9c4Syasuoka 	int				 sc_radaccton;
901f36db9c4Syasuoka 	struct iked_radservers		 sc_radauthservers;
902f36db9c4Syasuoka 	struct iked_radservers		 sc_radacctservers;
903f36db9c4Syasuoka 	struct iked_radcfgmaps		 sc_radcfgmaps;
904f36db9c4Syasuoka 	struct iked_raddaes		 sc_raddaes;
905f36db9c4Syasuoka 	struct iked_radclients		 sc_raddaeclients;
90645ae9d61Sreyk 
907b41cc0c8Stobhe 	struct iked_stats		 sc_stats;
908b41cc0c8Stobhe 
90945ae9d61Sreyk 	void				*sc_priv;	/* per-process */
91045ae9d61Sreyk 
91145ae9d61Sreyk 	int				 sc_pfkey;	/* ike process */
912b0eeedd0Smikeb 	struct event			 sc_pfkeyev;
9139ef39cf4Stobhe 	struct event			 sc_routeev;
914d09d3a7dSreyk 	uint8_t				 sc_certreqtype;
91545ae9d61Sreyk 	struct ibuf			*sc_certreq;
916264f8b22Stobhe 	void				*sc_vroute;
91745ae9d61Sreyk 
91812c9fd31Sreyk 	struct iked_socket		*sc_sock4[2];
91912c9fd31Sreyk 	struct iked_socket		*sc_sock6[2];
920ae494144Sreyk 
921e487e0e8Smikeb 	struct iked_timer		 sc_inittmr;
922e487e0e8Smikeb #define IKED_INITIATOR_INITIAL		 2
923e487e0e8Smikeb #define IKED_INITIATOR_INTERVAL		 60
924e487e0e8Smikeb 
925701048fbSreyk 	struct privsep			 sc_ps;
9266d3b905bSmarkus 
9276d3b905bSmarkus 	struct iked_ocsp_requests	 sc_ocsp;
9286d3b905bSmarkus 	char				*sc_ocsp_url;
929c973c574Stobhe 	long				 sc_ocsp_tolerate;
930c973c574Stobhe 	long				 sc_ocsp_maxage;
93143be1c05Smarkus 
93243be1c05Smarkus 	struct iked_addrpool		 sc_addrpool;
93319dc8638Spatrick 	struct iked_addrpool6		 sc_addrpool6;
93445ae9d61Sreyk };
93545ae9d61Sreyk 
93645ae9d61Sreyk struct iked_socket {
93745ae9d61Sreyk 	int			 sock_fd;
93845ae9d61Sreyk 	struct event		 sock_ev;
93945ae9d61Sreyk 	struct iked		*sock_env;
94045ae9d61Sreyk 	struct sockaddr_storage	 sock_addr;
94145ae9d61Sreyk };
94245ae9d61Sreyk 
94397ca1c62Stobhe struct ipsec_xf {
94497ca1c62Stobhe 	const char	*name;
94597ca1c62Stobhe 	unsigned int	 id;
94697ca1c62Stobhe 	unsigned int	 length;
94797ca1c62Stobhe 	unsigned int	 keylength;
94897ca1c62Stobhe 	unsigned int	 nonce;
94997ca1c62Stobhe 	unsigned int	 noauth;
95097ca1c62Stobhe };
95197ca1c62Stobhe 
95297ca1c62Stobhe struct ipsec_transforms {
95397ca1c62Stobhe 	const struct ipsec_xf	**authxf;
95497ca1c62Stobhe 	unsigned int		  nauthxf;
95597ca1c62Stobhe 	const struct ipsec_xf	**prfxf;
95697ca1c62Stobhe 	unsigned int		  nprfxf;
95797ca1c62Stobhe 	const struct ipsec_xf	**encxf;
95897ca1c62Stobhe 	unsigned int		  nencxf;
95997ca1c62Stobhe 	const struct ipsec_xf	**groupxf;
96097ca1c62Stobhe 	unsigned int		  ngroupxf;
96197ca1c62Stobhe 	const struct ipsec_xf	**esnxf;
96297ca1c62Stobhe 	unsigned int		  nesnxf;
96397ca1c62Stobhe };
96497ca1c62Stobhe 
96597ca1c62Stobhe struct ipsec_mode {
96697ca1c62Stobhe 	struct ipsec_transforms	**xfs;
96797ca1c62Stobhe 	unsigned int		  nxfs;
96897ca1c62Stobhe };
96997ca1c62Stobhe 
97045ae9d61Sreyk /* iked.c */
97145ae9d61Sreyk void	 parent_reload(struct iked *, int, const char *);
97245ae9d61Sreyk 
973e8e9d77fStobhe extern struct iked	*iked_env;
974e8e9d77fStobhe 
97545ae9d61Sreyk /* control.c */
976a7dbf4aeStobhe void	 control(struct privsep *, struct privsep_proc *);
977701048fbSreyk int	 control_init(struct privsep *, struct control_sock *);
97845ae9d61Sreyk int	 control_listen(struct control_sock *);
97945ae9d61Sreyk 
98045ae9d61Sreyk /* config.c */
98145ae9d61Sreyk struct iked_policy *
98245ae9d61Sreyk 	 config_new_policy(struct iked *);
9830cdab560Smarkus void	 config_free_kex(struct iked_kex *);
98465c540d0Spatrick void	 config_free_fragments(struct iked_frag *);
98545ae9d61Sreyk void	 config_free_sa(struct iked *, struct iked_sa *);
98645ae9d61Sreyk struct iked_sa *
98745ae9d61Sreyk 	 config_new_sa(struct iked *, int);
98845ae9d61Sreyk struct iked_user *
98945ae9d61Sreyk 	 config_new_user(struct iked *, struct iked_user *);
990d09d3a7dSreyk uint64_t
99145ae9d61Sreyk 	 config_getspi(void);
99245ae9d61Sreyk struct iked_transform *
993d09d3a7dSreyk 	 config_findtransform(struct iked_proposals *, uint8_t, unsigned int);
994975f0a0eStobhe struct iked_transform *
995975f0a0eStobhe 	 config_findtransform_ext(struct iked_proposals *, uint8_t,int, unsigned int);
99645ae9d61Sreyk void	 config_free_policy(struct iked *, struct iked_policy *);
99745ae9d61Sreyk struct iked_proposal *
998d09d3a7dSreyk 	 config_add_proposal(struct iked_proposals *, unsigned int,
999d09d3a7dSreyk 	    unsigned int);
1000822b336dStobhe void	 config_free_proposal(struct iked_proposals *, struct iked_proposal *);
1001d09d3a7dSreyk void	 config_free_proposals(struct iked_proposals *, unsigned int);
1002b0eeedd0Smikeb void	 config_free_flows(struct iked *, struct iked_flows *);
100345ae9d61Sreyk void	 config_free_childsas(struct iked *, struct iked_childsas *,
100445ae9d61Sreyk 	    struct iked_spi *, struct iked_spi *);
1005822b336dStobhe int	 config_add_transform(struct iked_proposal *,
1006d09d3a7dSreyk 	    unsigned int, unsigned int, unsigned int, unsigned int);
1007d09d3a7dSreyk int	 config_setcoupled(struct iked *, unsigned int);
1008d09d3a7dSreyk int	 config_getcoupled(struct iked *, unsigned int);
1009d09d3a7dSreyk int	 config_setmode(struct iked *, unsigned int);
1010d09d3a7dSreyk int	 config_getmode(struct iked *, unsigned int);
1011d09d3a7dSreyk int	 config_setreset(struct iked *, unsigned int, enum privsep_procid);
101245ae9d61Sreyk int	 config_getreset(struct iked *, struct imsg *);
101391e971e4Stobhe int	 config_doreset(struct iked *, unsigned int);
101445ae9d61Sreyk int	 config_setpolicy(struct iked *, struct iked_policy *,
1015f2f2a684Sreyk 	    enum privsep_procid);
101645ae9d61Sreyk int	 config_getpolicy(struct iked *, struct imsg *);
1017fb5e93d4Smikeb int	 config_setflow(struct iked *, struct iked_policy *,
1018fb5e93d4Smikeb 	    enum privsep_procid);
1019fb5e93d4Smikeb int	 config_getflow(struct iked *, struct imsg *);
102045ae9d61Sreyk int	 config_setsocket(struct iked *, struct sockaddr_storage *, in_port_t,
1021f2f2a684Sreyk 	    enum privsep_procid);
102245ae9d61Sreyk int	 config_getsocket(struct iked *env, struct imsg *,
102345ae9d61Sreyk 	    void (*cb)(int, short, void *));
1024ac16f2e6Stobhe void	 config_enablesocket(struct iked *env);
1025ba38eea7Stobhe int	 config_setpfkey(struct iked *);
10266417b90fSreyk int	 config_getpfkey(struct iked *, struct imsg *);
1027f2f2a684Sreyk int	 config_setuser(struct iked *, struct iked_user *, enum privsep_procid);
102845ae9d61Sreyk int	 config_getuser(struct iked *, struct imsg *);
1029f2f2a684Sreyk int	 config_setcompile(struct iked *, enum privsep_procid);
103058afaaa2Stobhe int	 config_getcompile(struct iked *);
10316d3b905bSmarkus int	 config_setocsp(struct iked *);
10326d3b905bSmarkus int	 config_getocsp(struct iked *, struct imsg *);
1033e8b444cdSreyk int	 config_setkeys(struct iked *);
1034e8b444cdSreyk int	 config_getkey(struct iked *, struct imsg *);
1035421819b6Stobhe int	 config_setstatic(struct iked *);
1036421819b6Stobhe int	 config_getstatic(struct iked *, struct imsg *);
1037f36db9c4Syasuoka int	 config_setradauth(struct iked *);
1038f36db9c4Syasuoka int	 config_getradauth(struct iked *, struct imsg *);
1039f36db9c4Syasuoka int	 config_setradacct(struct iked *);
1040f36db9c4Syasuoka int	 config_getradacct(struct iked *, struct imsg *);
1041f36db9c4Syasuoka int	 config_setradserver(struct iked *, struct sockaddr *, socklen_t,
1042f36db9c4Syasuoka 	    char *, int);
1043f36db9c4Syasuoka int	 config_getradserver(struct iked *, struct imsg *);
1044f36db9c4Syasuoka int	 config_setradcfgmap(struct iked *, int, uint32_t, uint8_t);
1045f36db9c4Syasuoka int	 config_getradcfgmap(struct iked *, struct imsg *);
1046f36db9c4Syasuoka int	 config_setraddae(struct iked *, struct sockaddr *, socklen_t);
1047f36db9c4Syasuoka int	 config_getraddae(struct iked *, struct imsg *);
1048f36db9c4Syasuoka int	 config_setradclient(struct iked *, struct sockaddr *, socklen_t,
1049f36db9c4Syasuoka 	    char *);
1050f36db9c4Syasuoka int	 config_getradclient(struct iked *, struct imsg *);
105145ae9d61Sreyk 
105245ae9d61Sreyk /* policy.c */
105345ae9d61Sreyk void	 policy_init(struct iked *);
10541b12ffc9Stobhe int	 policy_lookup(struct iked *, struct iked_message *,
1055a5265846Stobhe 	    struct iked_proposals *, struct iked_flows *, int);
105686ddd613Stobhe int	 policy_lookup_sa(struct iked *, struct iked_sa *);
1057e2015428Sreyk struct iked_policy *
1058e2015428Sreyk 	 policy_test(struct iked *, struct iked_policy *);
10591f864a9aStobhe int	 policy_generate_ts(struct iked_policy *);
1060e2015428Sreyk void	 policy_calc_skip_steps(struct iked_policies *);
106145ae9d61Sreyk void	 policy_ref(struct iked *, struct iked_policy *);
106245ae9d61Sreyk void	 policy_unref(struct iked *, struct iked_policy *);
106345ae9d61Sreyk void	 sa_state(struct iked *, struct iked_sa *, int);
1064d09d3a7dSreyk void	 sa_stateflags(struct iked_sa *, unsigned int);
1065d571373cStobhe int	 sa_stateok(const struct iked_sa *, int);
106645ae9d61Sreyk struct iked_sa *
1067d09d3a7dSreyk 	 sa_new(struct iked *, uint64_t, uint64_t, unsigned int,
106845ae9d61Sreyk 	    struct iked_policy *);
106945ae9d61Sreyk void	 sa_free(struct iked *, struct iked_sa *);
10709dbd37b8Sreyk void	 sa_free_flows(struct iked *, struct iked_saflows *);
1071264f8b22Stobhe int	 sa_configure_iface(struct iked *, struct iked_sa *, int);
10722f3a6dc6Stobhe int	 sa_address(struct iked_sa *, struct iked_addr *, struct sockaddr *);
107345ae9d61Sreyk void	 childsa_free(struct iked_childsa *);
1074b0eeedd0Smikeb struct iked_childsa *
1075d09d3a7dSreyk 	 childsa_lookup(struct iked_sa *, uint64_t, uint8_t);
107645ae9d61Sreyk void	 flow_free(struct iked_flow *);
10772d5ff022Spatrick int	 flow_equal(struct iked_flow *, struct iked_flow *);
107845ae9d61Sreyk struct iked_sa *
1079d09d3a7dSreyk 	 sa_lookup(struct iked *, uint64_t, uint64_t, unsigned int);
108045ae9d61Sreyk struct iked_user *
108145ae9d61Sreyk 	 user_lookup(struct iked *, const char *);
1082729f601bStobhe struct iked_sa *
1083729f601bStobhe 	 sa_dstid_lookup(struct iked *, struct iked_sa *);
1084729f601bStobhe struct iked_sa *
1085729f601bStobhe 	 sa_dstid_insert(struct iked *, struct iked_sa *);
1086729f601bStobhe void	 sa_dstid_remove(struct iked *, struct iked_sa *);
1087b0435d4dStobhe int	 proposals_negotiate(struct iked_proposals *, struct iked_proposals *,
10884ad5fa93Stobhe 	    struct iked_proposals *, int, int);
108945ae9d61Sreyk RB_PROTOTYPE(iked_sas, iked_sa, sa_entry, sa_cmp);
1090729f601bStobhe RB_PROTOTYPE(iked_dstid_sas, iked_sa, sa_dstid_entry, sa_dstid_cmp);
109143be1c05Smarkus RB_PROTOTYPE(iked_addrpool, iked_sa, sa_addrpool_entry, sa_addrpool_cmp);
109219dc8638Spatrick RB_PROTOTYPE(iked_addrpool6, iked_sa, sa_addrpool6_entry, sa_addrpool6_cmp);
109345ae9d61Sreyk RB_PROTOTYPE(iked_users, iked_user, user_entry, user_cmp);
1094856dba1dSmikeb RB_PROTOTYPE(iked_activesas, iked_childsa, csa_node, childsa_cmp);
10959dbd37b8Sreyk RB_PROTOTYPE(iked_flows, iked_flow, flow_node, flow_cmp);
109645ae9d61Sreyk 
109745ae9d61Sreyk /* crypto.c */
109845ae9d61Sreyk struct iked_hash *
1099d09d3a7dSreyk 	 hash_new(uint8_t, uint16_t);
110045ae9d61Sreyk struct ibuf *
110145ae9d61Sreyk 	 hash_setkey(struct iked_hash *, void *, size_t);
110245ae9d61Sreyk void	 hash_free(struct iked_hash *);
110345ae9d61Sreyk void	 hash_init(struct iked_hash *);
110445ae9d61Sreyk void	 hash_update(struct iked_hash *, void *, size_t);
110545ae9d61Sreyk void	 hash_final(struct iked_hash *, void *, size_t *);
110645ae9d61Sreyk size_t	 hash_keylength(struct iked_hash *);
110745ae9d61Sreyk size_t	 hash_length(struct iked_hash *);
110845ae9d61Sreyk 
110945ae9d61Sreyk struct iked_cipher *
1110d09d3a7dSreyk 	 cipher_new(uint8_t, uint16_t, uint16_t);
111145ae9d61Sreyk struct ibuf *
1112a9a2a639Stobhe 	 cipher_setkey(struct iked_cipher *, const void *, size_t);
111345ae9d61Sreyk struct ibuf *
1114a9a2a639Stobhe 	 cipher_setiv(struct iked_cipher *, const void *, size_t);
111515863c3aStobhe int	 cipher_settag(struct iked_cipher *, uint8_t *, size_t);
111615863c3aStobhe int	 cipher_gettag(struct iked_cipher *, uint8_t *, size_t);
111745ae9d61Sreyk void	 cipher_free(struct iked_cipher *);
111881b8fecaStobhe int	 cipher_init(struct iked_cipher *, int);
111981b8fecaStobhe int	 cipher_init_encrypt(struct iked_cipher *);
112081b8fecaStobhe int	 cipher_init_decrypt(struct iked_cipher *);
1121a9a2a639Stobhe void	 cipher_aad(struct iked_cipher *, const void *, size_t, size_t *);
1122a9a2a639Stobhe int	 cipher_update(struct iked_cipher *, const void *, size_t, void *, size_t *);
112381b8fecaStobhe int	 cipher_final(struct iked_cipher *);
112445ae9d61Sreyk size_t	 cipher_length(struct iked_cipher *);
112545ae9d61Sreyk size_t	 cipher_keylength(struct iked_cipher *);
112645ae9d61Sreyk size_t	 cipher_ivlength(struct iked_cipher *);
112745ae9d61Sreyk size_t	 cipher_outlength(struct iked_cipher *, size_t);
112845ae9d61Sreyk 
112945ae9d61Sreyk struct iked_dsa *
11306368155eStobhe 	 dsa_new(uint8_t, struct iked_hash *, int);
113145ae9d61Sreyk struct iked_dsa *
11326368155eStobhe 	 dsa_sign_new(uint8_t, struct iked_hash *);
113345ae9d61Sreyk struct iked_dsa *
11346368155eStobhe 	 dsa_verify_new(uint8_t, struct iked_hash *);
113545ae9d61Sreyk struct ibuf *
1136d09d3a7dSreyk 	 dsa_setkey(struct iked_dsa *, void *, size_t, uint8_t);
113745ae9d61Sreyk void	 dsa_free(struct iked_dsa *);
113848b975e3Smarkus int	 dsa_init(struct iked_dsa *, const void *, size_t);
11395e4d3a37Sreyk size_t	 dsa_prefix(struct iked_dsa *);
114045ae9d61Sreyk size_t	 dsa_length(struct iked_dsa *);
114145ae9d61Sreyk int	 dsa_update(struct iked_dsa *, const void *, size_t);
114245ae9d61Sreyk ssize_t	 dsa_sign_final(struct iked_dsa *, void *, size_t);
114345ae9d61Sreyk ssize_t	 dsa_verify_final(struct iked_dsa *, void *, size_t);
114445ae9d61Sreyk 
1145264f8b22Stobhe /* vroute.c */
1146264f8b22Stobhe void vroute_init(struct iked *);
114775f6dc0aStobhe int vroute_setaddr(struct iked *, int, struct sockaddr *, int, unsigned int);
114891e971e4Stobhe void vroute_cleanup(struct iked *);
1149264f8b22Stobhe int vroute_getaddr(struct iked *, struct imsg *);
11509ef39cf4Stobhe int vroute_setdns(struct iked *, int, struct sockaddr *, unsigned int);
11519ef39cf4Stobhe int vroute_getdns(struct iked *, struct imsg *);
1152264f8b22Stobhe int vroute_setaddroute(struct iked *, uint8_t, struct sockaddr *,
1153264f8b22Stobhe     uint8_t, struct sockaddr *);
1154264f8b22Stobhe int vroute_setcloneroute(struct iked *, uint8_t, struct sockaddr *,
1155264f8b22Stobhe     uint8_t, struct sockaddr *);
1156264f8b22Stobhe int vroute_setdelroute(struct iked *, uint8_t, struct sockaddr *,
1157264f8b22Stobhe     uint8_t, struct sockaddr *);
1158264f8b22Stobhe int vroute_getroute(struct iked *, struct imsg *);
1159264f8b22Stobhe int vroute_getcloneroute(struct iked *, struct imsg *);
1160264f8b22Stobhe 
116145ae9d61Sreyk /* ikev2.c */
1162a7dbf4aeStobhe void	 ikev2(struct privsep *, struct privsep_proc *);
1163fde46d6eSreyk void	 ikev2_recv(struct iked *, struct iked_message *);
1164e487e0e8Smikeb void	 ikev2_init_ike_sa(struct iked *, void *);
11651b0d4946Sreyk int	 ikev2_policy2id(struct iked_static_id *, struct iked_id *, int);
1166b0eeedd0Smikeb int	 ikev2_childsa_enable(struct iked *, struct iked_sa *);
1167fde46d6eSreyk int	 ikev2_childsa_delete(struct iked *, struct iked_sa *,
1168d09d3a7dSreyk 	    uint8_t, uint64_t, uint64_t *, int);
116993415f65Smikeb void	 ikev2_ikesa_recv_delete(struct iked *, struct iked_sa *);
1170a6fc7f59Shenning void	 ikev2_ike_sa_timeout(struct iked *env, void *);
117184a9a21bStobhe void	 ikev2_ike_sa_setreason(struct iked_sa *, char *);
117212ba51d6Stobhe void	 ikev2_reset_alive_timer(struct iked *);
1173ea5b9487Stobhe int	 ikev2_ike_sa_delete(struct iked *, struct iked_sa *);
1174072c2ff7Smikeb 
117545ae9d61Sreyk struct ibuf *
117645ae9d61Sreyk 	 ikev2_prfplus(struct iked_hash *, struct ibuf *, struct ibuf *,
117745ae9d61Sreyk 	    size_t);
1178d09d3a7dSreyk ssize_t	 ikev2_psk(struct iked_sa *, uint8_t *, size_t, uint8_t **);
117912c9fd31Sreyk ssize_t	 ikev2_nat_detection(struct iked *, struct iked_message *,
1180242deeeeStobhe 	    void *, size_t, unsigned int, int);
11810d564477Stobhe void	 ikev2_enable_natt(struct iked *, struct iked_sa *,
11820e145d89Stobhe 	    struct iked_message *, int);
1183fde46d6eSreyk int	 ikev2_send_informational(struct iked *, struct iked_message *);
1184fde46d6eSreyk int	 ikev2_send_ike_e(struct iked *, struct iked_sa *, struct ibuf *,
1185d09d3a7dSreyk 	    uint8_t, uint8_t, int);
1186fde46d6eSreyk struct ike_header *
1187fde46d6eSreyk 	 ikev2_add_header(struct ibuf *, struct iked_sa *,
1188d09d3a7dSreyk 	    uint32_t, uint8_t, uint8_t, uint8_t);
1189fde46d6eSreyk int	 ikev2_set_header(struct ike_header *, size_t);
1190fde46d6eSreyk struct ikev2_payload *
1191fde46d6eSreyk 	 ikev2_add_payload(struct ibuf *);
1192fde46d6eSreyk int	 ikev2_next_payload(struct ikev2_payload *, size_t,
1193d09d3a7dSreyk 	    uint8_t);
1194ff6390f7Stobhe int	 ikev2_child_sa_acquire(struct iked *, struct iked_flow *);
1195ff6390f7Stobhe int	 ikev2_child_sa_drop(struct iked *, struct iked_spi *);
1196ff6390f7Stobhe int	 ikev2_child_sa_rekey(struct iked *, struct iked_spi *);
1197b0eeedd0Smikeb void	 ikev2_disable_rekeying(struct iked *, struct iked_sa *);
119808246d98Sreyk int	 ikev2_print_id(struct iked_id *, char *, size_t);
11997e28019fStobhe int	 ikev2_print_static_id(struct iked_static_id *, char *, size_t);
1200fde46d6eSreyk 
1201ecea226bStobhe const char	*ikev2_ikesa_info(uint64_t, const char *msg);
1202ecea226bStobhe #define SPI_IH(hdr)      ikev2_ikesa_info(betoh64((hdr)->ike_ispi), NULL)
1203ecea226bStobhe #define SPI_SH(sh, f)    ikev2_ikesa_info((sh)->sh_ispi, (f))
1204ecea226bStobhe #define SPI_SA(sa, f)    SPI_SH(&(sa)->sa_hdr, (f))
1205ecea226bStobhe 
1206fde46d6eSreyk /* ikev2_msg.c */
1207fde46d6eSreyk void	 ikev2_msg_cb(int, short, void *);
1208fde46d6eSreyk struct ibuf *
1209fde46d6eSreyk 	 ikev2_msg_init(struct iked *, struct iked_message *,
1210fde46d6eSreyk 	    struct sockaddr_storage *, socklen_t,
1211fde46d6eSreyk 	    struct sockaddr_storage *, socklen_t, int);
1212c45fd413Smikeb struct iked_message *
1213c45fd413Smikeb 	 ikev2_msg_copy(struct iked *, struct iked_message *);
1214763023d6Sreyk void	 ikev2_msg_cleanup(struct iked *, struct iked_message *);
1215d09d3a7dSreyk uint32_t
1216c45fd413Smikeb 	 ikev2_msg_id(struct iked *, struct iked_sa *);
1217fde46d6eSreyk struct ibuf
1218fde46d6eSreyk 	*ikev2_msg_auth(struct iked *, struct iked_sa *, int);
1219fde46d6eSreyk int	 ikev2_msg_authsign(struct iked *, struct iked_sa *,
1220fde46d6eSreyk 	    struct iked_auth *, struct ibuf *);
1221fde46d6eSreyk int	 ikev2_msg_authverify(struct iked *, struct iked_sa *,
1222d09d3a7dSreyk 	    struct iked_auth *, uint8_t *, size_t, struct ibuf *);
1223fde46d6eSreyk int	 ikev2_msg_valid_ike_sa(struct iked *, struct ike_header *,
1224fde46d6eSreyk 	    struct iked_message *);
1225d9c13a0aSmikeb int	 ikev2_msg_send(struct iked *, struct iked_message *);
1226fde46d6eSreyk int	 ikev2_msg_send_encrypt(struct iked *, struct iked_sa *,
1227d09d3a7dSreyk 	    struct ibuf **, uint8_t, uint8_t, int);
1228fde46d6eSreyk struct ibuf
122915863c3aStobhe 	*ikev2_msg_encrypt(struct iked *, struct iked_sa *, struct ibuf *,
123015863c3aStobhe 	    struct ibuf *);
1231fde46d6eSreyk struct ibuf *
1232fde46d6eSreyk 	 ikev2_msg_decrypt(struct iked *, struct iked_sa *,
1233fde46d6eSreyk 	    struct ibuf *, struct ibuf *);
1234fde46d6eSreyk int	 ikev2_msg_integr(struct iked *, struct iked_sa *, struct ibuf *);
1235ae494144Sreyk int	 ikev2_msg_frompeer(struct iked_message *);
1236ae494144Sreyk struct iked_socket *
123712c9fd31Sreyk 	 ikev2_msg_getsocket(struct iked *, int, int);
12386e264ad0Stobhe int	 ikev2_msg_enqueue(struct iked *, struct iked_msgqueue *,
12396e264ad0Stobhe 	    struct iked_message *, int);
1240c45fd413Smikeb int	 ikev2_msg_retransmit_response(struct iked *, struct iked_sa *,
12412117af45Stobhe 	    struct iked_message *, struct ike_header *);
1242c45fd413Smikeb void	 ikev2_msg_prevail(struct iked *, struct iked_msgqueue *,
1243c45fd413Smikeb 	    struct iked_message *);
1244c45fd413Smikeb void	 ikev2_msg_dispose(struct iked *, struct iked_msgqueue *,
12456e264ad0Stobhe 	    struct iked_msg_retransmit *);
1246c45fd413Smikeb void	 ikev2_msg_flushqueue(struct iked *, struct iked_msgqueue *);
12476e264ad0Stobhe struct iked_msg_retransmit *
1248c45fd413Smikeb 	 ikev2_msg_lookup(struct iked *, struct iked_msgqueue *,
12496e264ad0Stobhe 	    struct iked_message *, uint8_t);
1250fde46d6eSreyk 
1251fde46d6eSreyk /* ikev2_pld.c */
1252fde46d6eSreyk int	 ikev2_pld_parse(struct iked *, struct ike_header *,
1253d39d09feSreyk 	    struct iked_message *, size_t);
12542117af45Stobhe int	 ikev2_pld_parse_quick(struct iked *, struct ike_header *,
12552117af45Stobhe 	    struct iked_message *, size_t);
125645ae9d61Sreyk 
125745ae9d61Sreyk /* eap.c */
1258d571373cStobhe int	 eap_parse(struct iked *, const struct iked_sa *, struct iked_message*,
1259ac57c459Stobhe 	    void *, int);
1260ac57c459Stobhe int	 eap_success(struct iked *, struct iked_sa *, int);
1261ac57c459Stobhe int	 eap_identity_request(struct iked *, struct iked_sa *);
1262ac57c459Stobhe int	 eap_mschap_challenge(struct iked *, struct iked_sa *, int, int,
1263ac57c459Stobhe 	    uint8_t *, size_t);
1264ac57c459Stobhe int	 eap_mschap_success(struct iked *, struct iked_sa *, int);
1265ac57c459Stobhe int	 eap_challenge_request(struct iked *, struct iked_sa *, int);
126645ae9d61Sreyk 
1267f36db9c4Syasuoka /* radius.c */
1268f36db9c4Syasuoka int	 iked_radius_request(struct iked *, struct iked_sa *,
1269f36db9c4Syasuoka 	    struct iked_message *);
1270f36db9c4Syasuoka void	 iked_radius_request_free(struct iked *, struct iked_radserver_req *);
1271f36db9c4Syasuoka void	 iked_radius_on_event(int, short, void *);
1272f36db9c4Syasuoka void	 iked_radius_acct_on(struct iked *);
1273f36db9c4Syasuoka void	 iked_radius_acct_off(struct iked *);
1274f36db9c4Syasuoka void	 iked_radius_acct_start(struct iked *, struct iked_sa *);
1275f36db9c4Syasuoka void	 iked_radius_acct_stop(struct iked *, struct iked_sa *);
1276f36db9c4Syasuoka void	 iked_radius_dae_on_event(int, short, void *);
1277f36db9c4Syasuoka 
127845ae9d61Sreyk /* pfkey.c */
12798f6f6c19Stobhe int	 pfkey_couple(struct iked *, struct iked_sas *, int);
12808f6f6c19Stobhe int	 pfkey_flow_add(struct iked *, struct iked_flow *);
12818f6f6c19Stobhe int	 pfkey_flow_delete(struct iked *, struct iked_flow *);
12828f6f6c19Stobhe int	 pfkey_sa_init(struct iked *, struct iked_childsa *, uint32_t *);
12838f6f6c19Stobhe int	 pfkey_sa_add(struct iked *, struct iked_childsa *, struct iked_childsa *);
12848f6f6c19Stobhe int	 pfkey_sa_update_addresses(struct iked *, struct iked_childsa *);
12858f6f6c19Stobhe int	 pfkey_sa_delete(struct iked *, struct iked_childsa *);
12868f6f6c19Stobhe int	 pfkey_sa_last_used(struct iked *, struct iked_childsa *, uint64_t *);
1287e7c3d382Stobhe int	 pfkey_flush(struct iked *);
12888f6f6c19Stobhe int	 pfkey_socket(struct iked *);
12896417b90fSreyk void	 pfkey_init(struct iked *, int fd);
129045ae9d61Sreyk 
129145ae9d61Sreyk /* ca.c */
1292a7dbf4aeStobhe void	 caproc(struct privsep *, struct privsep_proc *);
1293a2749d89Sreyk int	 ca_setreq(struct iked *, struct iked_sa *, struct iked_static_id *,
129412b74e23Stobhe 	    uint8_t, uint8_t, uint8_t *, size_t, enum privsep_procid);
129545ae9d61Sreyk int	 ca_setcert(struct iked *, struct iked_sahdr *, struct iked_id *,
1296d09d3a7dSreyk 	    uint8_t, uint8_t *, size_t, enum privsep_procid);
129745ae9d61Sreyk int	 ca_setauth(struct iked *, struct iked_sa *,
1298f2f2a684Sreyk 	    struct ibuf *, enum privsep_procid);
1299e8b444cdSreyk void	 ca_getkey(struct privsep *, struct iked_id *, enum imsg_type);
1300a30a01d6Stobhe int	 ca_certbundle_add(struct ibuf *, struct iked_id *);
1301e8b444cdSreyk int	 ca_privkey_serialize(EVP_PKEY *, struct iked_id *);
1302e8b444cdSreyk int	 ca_pubkey_serialize(EVP_PKEY *, struct iked_id *);
130386cf9d9cSmarkus void	 ca_sslerror(const char *);
1304d09d3a7dSreyk char	*ca_asn1_name(uint8_t *, size_t);
130554977822Smarkus void	*ca_x509_name_parse(char *);
1306a9cab3faStobhe void	 ca_cert_info(const char *, X509 *);
130745ae9d61Sreyk 
1308a183e813Sreyk /* timer.c */
1309b3eeacebSmikeb void	 timer_set(struct iked *, struct iked_timer *,
1310e71a3409Smikeb 	    void (*)(struct iked *, void *), void *);
1311b3eeacebSmikeb void	 timer_add(struct iked *, struct iked_timer *, int);
1312b3eeacebSmikeb void	 timer_del(struct iked *, struct iked_timer *);
1313a183e813Sreyk 
131445ae9d61Sreyk /* proc.c */
1315a7dbf4aeStobhe void	 proc_init(struct privsep *, struct privsep_proc *, unsigned int, int,
1316a7dbf4aeStobhe 	    int, char **, enum privsep_procid);
1317fc7fd3e3Sreyk void	 proc_kill(struct privsep *);
13188e8f56e9Stobhe void	 proc_connect(struct privsep *, void (*)(struct privsep *));
1319fc7fd3e3Sreyk void	 proc_dispatch(int, short event, void *);
1320a7dbf4aeStobhe void	 proc_run(struct privsep *, struct privsep_proc *,
1321d09d3a7dSreyk 	    struct privsep_proc *, unsigned int,
1322bf556abcSreyk 	    void (*)(struct privsep *, struct privsep_proc *, void *), void *);
1323fc7fd3e3Sreyk void	 imsg_event_add(struct imsgev *);
1324d09d3a7dSreyk int	 imsg_compose_event(struct imsgev *, uint16_t, uint32_t,
1325d09d3a7dSreyk 	    pid_t, int, void *, uint16_t);
1326d09d3a7dSreyk int	 imsg_composev_event(struct imsgev *, uint16_t, uint32_t,
1327fc7fd3e3Sreyk 	    pid_t, int, const struct iovec *, int);
1328bf556abcSreyk int	 proc_compose_imsg(struct privsep *, enum privsep_procid, int,
1329229c27f0Stobhe 	    uint16_t, uint32_t, int, void *, uint16_t);
1330c205e972Sreyk int	 proc_compose(struct privsep *, enum privsep_procid,
1331c205e972Sreyk 	    uint16_t, void *, uint16_t);
1332bf556abcSreyk int	 proc_composev_imsg(struct privsep *, enum privsep_procid, int,
1333229c27f0Stobhe 	    uint16_t, uint32_t, int, const struct iovec *, int);
1334c205e972Sreyk int	 proc_composev(struct privsep *, enum privsep_procid,
1335c205e972Sreyk 	    uint16_t, const struct iovec *, int);
1336bf556abcSreyk int	 proc_forward_imsg(struct privsep *, struct imsg *,
1337bf556abcSreyk 	    enum privsep_procid, int);
1338bf556abcSreyk struct imsgbuf *
1339bf556abcSreyk 	 proc_ibuf(struct privsep *, enum privsep_procid, int);
1340bf556abcSreyk struct imsgev *
1341bf556abcSreyk 	 proc_iev(struct privsep *, enum privsep_procid, int);
1342a7dbf4aeStobhe enum privsep_procid
1343a7dbf4aeStobhe 	 proc_getid(struct privsep_proc *, unsigned int, const char *);
1344a7dbf4aeStobhe int	 proc_flush_imsg(struct privsep *, enum privsep_procid, int);
134545ae9d61Sreyk 
134645ae9d61Sreyk /* util.c */
134745ae9d61Sreyk int	 socket_af(struct sockaddr *, in_port_t);
134845ae9d61Sreyk in_port_t
134947d6a31cSmarkus 	 socket_getport(struct sockaddr *);
1350bb108424Smarkus int	 socket_setport(struct sockaddr *, in_port_t);
1351b4fe66abSmikeb int	 socket_getaddr(int, struct sockaddr_storage *);
135245ae9d61Sreyk int	 socket_bypass(int, struct sockaddr *);
135345ae9d61Sreyk int	 udp_bind(struct sockaddr *, in_port_t);
13545ec2ede8Svgross ssize_t	 sendtofrom(int, void *, size_t, int, struct sockaddr *,
13555ec2ede8Svgross 	    socklen_t, struct sockaddr *, socklen_t);
135645ae9d61Sreyk ssize_t	 recvfromto(int, void *, size_t, int, struct sockaddr *,
135745ae9d61Sreyk 	    socklen_t *, struct sockaddr *, socklen_t *);
135845ae9d61Sreyk const char *
1359d09d3a7dSreyk 	 print_spi(uint64_t, int);
136045ae9d61Sreyk const char *
1361d09d3a7dSreyk 	 print_map(unsigned int, struct iked_constmap *);
136223e03483Stobhe void	 lc_idtype(char *);
1363e439be88Stobhe void	 print_hex(const uint8_t *, off_t, size_t);
1364e439be88Stobhe void	 print_hexval(const uint8_t *, off_t, size_t);
1365dca9e784Sclaudio void	 print_hexbuf(struct ibuf *);
136645ae9d61Sreyk const char *
1367d09d3a7dSreyk 	 print_bits(unsigned short, unsigned char *);
136845ae9d61Sreyk int	 sockaddr_cmp(struct sockaddr *, struct sockaddr *, int);
1369d09d3a7dSreyk uint8_t mask2prefixlen(struct sockaddr *);
1370d09d3a7dSreyk uint8_t mask2prefixlen6(struct sockaddr *);
137145ae9d61Sreyk struct in6_addr *
1372d09d3a7dSreyk 	 prefixlen2mask6(uint8_t, uint32_t *);
1373d09d3a7dSreyk uint32_t
1374d09d3a7dSreyk 	 prefixlen2mask(uint8_t);
137545ae9d61Sreyk const char *
137614e2a040Stb 	 print_addr(void *);
1377d09d3a7dSreyk char	*get_string(uint8_t *, size_t);
137845ae9d61Sreyk const char *
1379d09d3a7dSreyk 	 print_proto(uint8_t);
138045ae9d61Sreyk int	 expand_string(char *, size_t, const char *, const char *);
1381d09d3a7dSreyk uint8_t *string2unicode(const char *, size_t *);
13826a7fa426Sreyk void	 print_debug(const char *, ...)
13836a7fa426Sreyk 	    __attribute__((format(printf, 1, 2)));
13846a7fa426Sreyk void	 print_verbose(const char *, ...)
13856a7fa426Sreyk 	    __attribute__((format(printf, 1, 2)));
138645ae9d61Sreyk 
13870e397e29Sreyk /* imsg_util.c */
138845ae9d61Sreyk struct ibuf *
1389a3777487Smikeb 	 ibuf_new(const void *, size_t);
139045ae9d61Sreyk struct ibuf *
139145ae9d61Sreyk 	 ibuf_static(void);
139245ae9d61Sreyk size_t	 ibuf_length(struct ibuf *);
139345ae9d61Sreyk int	 ibuf_setsize(struct ibuf *, size_t);
139445ae9d61Sreyk struct ibuf *
1395bd027751Sclaudio 	 ibuf_getdata(struct ibuf *, size_t);
139645ae9d61Sreyk struct ibuf *
139745ae9d61Sreyk 	 ibuf_dup(struct ibuf *);
139845ae9d61Sreyk struct ibuf *
139945ae9d61Sreyk 	 ibuf_random(size_t);
140045ae9d61Sreyk 
140145ae9d61Sreyk /* log.c */
14020f12961aSreyk void	log_init(int, int);
14030f12961aSreyk void	log_procinit(const char *);
1404871fc12cSreyk void	log_setverbose(int);
1405871fc12cSreyk int	log_getverbose(void);
14066a7fa426Sreyk void	log_warn(const char *, ...)
14076a7fa426Sreyk 	    __attribute__((__format__ (printf, 1, 2)));
14086a7fa426Sreyk void	log_warnx(const char *, ...)
14096a7fa426Sreyk 	    __attribute__((__format__ (printf, 1, 2)));
14106a7fa426Sreyk void	log_info(const char *, ...)
14116a7fa426Sreyk 	    __attribute__((__format__ (printf, 1, 2)));
14126a7fa426Sreyk void	log_debug(const char *, ...)
14136a7fa426Sreyk 	    __attribute__((__format__ (printf, 1, 2)));
14146a7fa426Sreyk void	logit(int, const char *, ...)
14156a7fa426Sreyk 	    __attribute__((__format__ (printf, 2, 3)));
14166a7fa426Sreyk void	vlog(int, const char *, va_list)
14176a7fa426Sreyk 	    __attribute__((__format__ (printf, 2, 0)));
14180f12961aSreyk __dead void fatal(const char *, ...)
14190f12961aSreyk 	    __attribute__((__format__ (printf, 1, 2)));
14200f12961aSreyk __dead void fatalx(const char *, ...)
14210f12961aSreyk 	    __attribute__((__format__ (printf, 1, 2)));
142245ae9d61Sreyk 
14236d3b905bSmarkus /* ocsp.c */
1424f2702ec5Stobhe int	 ocsp_connect(struct iked *, struct imsg *);
14256d3b905bSmarkus int	 ocsp_receive_fd(struct iked *, struct imsg *);
14264f9da335Stobhe int	 ocsp_validate_cert(struct iked *, void *, size_t, struct iked_sahdr,
14274f9da335Stobhe     uint8_t, X509 *);
14286d3b905bSmarkus 
142945ae9d61Sreyk /* parse.y */
143045ae9d61Sreyk int	 parse_config(const char *, struct iked *);
143197ca1c62Stobhe int	 cmdline_symset(char *);
143297ca1c62Stobhe extern const struct ipsec_xf authxfs[];
143397ca1c62Stobhe extern const struct ipsec_xf prfxfs[];
143497ca1c62Stobhe extern const struct ipsec_xf *encxfs;
143597ca1c62Stobhe extern const struct ipsec_xf ikeencxfs[];
143697ca1c62Stobhe extern const struct ipsec_xf ipsecencxfs[];
143797ca1c62Stobhe extern const struct ipsec_xf groupxfs[];
143897ca1c62Stobhe extern const struct ipsec_xf esnxfs[];
143997ca1c62Stobhe extern const struct ipsec_xf methodxfs[];
144097ca1c62Stobhe extern const struct ipsec_xf saxfs[];
144197ca1c62Stobhe extern const struct ipsec_xf cpxfs[];
1442d09d3a7dSreyk size_t	 keylength_xf(unsigned int, unsigned int, unsigned int);
1443d09d3a7dSreyk size_t	 noncelength_xf(unsigned int, unsigned int);
144415863c3aStobhe int	 encxf_noauth(unsigned int);
144545ae9d61Sreyk 
144697ca1c62Stobhe /* print.c */
144797ca1c62Stobhe void	 print_user(struct iked_user *);
144897ca1c62Stobhe void	 print_policy(struct iked_policy *);
144997ca1c62Stobhe const char *print_xf(unsigned int, unsigned int, const struct ipsec_xf *);
145097ca1c62Stobhe 
1451a3e464c5Sreyk #endif /* IKED_H */
1452