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