Home | History | Annotate | Line # | Download | only in racoon
      1 /*	$NetBSD: handler.h,v 1.27 2025/03/07 15:55:29 christos Exp $	*/
      2 
      3 /* Id: handler.h,v 1.19 2006/02/25 08:25:12 manubsd Exp */
      4 
      5 /*
      6  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
      7  * All rights reserved.
      8  *
      9  * Redistribution and use in source and binary forms, with or without
     10  * modification, are permitted provided that the following conditions
     11  * are met:
     12  * 1. Redistributions of source code must retain the above copyright
     13  *    notice, this list of conditions and the following disclaimer.
     14  * 2. Redistributions in binary form must reproduce the above copyright
     15  *    notice, this list of conditions and the following disclaimer in the
     16  *    documentation and/or other materials provided with the distribution.
     17  * 3. Neither the name of the project nor the names of its contributors
     18  *    may be used to endorse or promote products derived from this software
     19  *    without specific prior written permission.
     20  *
     21  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
     22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
     25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     31  * SUCH DAMAGE.
     32  */
     33 
     34 #ifndef _HANDLER_H
     35 #define _HANDLER_H
     36 
     37 #include <sys/queue.h>
     38 #include <openssl/rsa.h>
     39 
     40 #include <sys/time.h>
     41 
     42 #include "isakmp_var.h"
     43 #include "oakley.h"
     44 #include "schedule.h"
     45 #include "evt.h"
     46 
     47 /* Phase 1 handler */
     48 /*
     49  * main mode:
     50  *      initiator               responder
     51  *  0   (---)                   (---)
     52  *  1   start                   start (1st msg received)
     53  *  2   (---)                   1st valid msg received
     54  *  3   1st msg sent	        1st msg sent
     55  *  4   1st valid msg received  2st valid msg received
     56  *  5   2nd msg sent            2nd msg sent
     57  *  6   2nd valid msg received  3rd valid msg received
     58  *  7   3rd msg sent            3rd msg sent
     59  *  8   3rd valid msg received  (---)
     60  *  9   SA established          SA established
     61  *
     62  * aggressive mode:
     63  *      initiator               responder
     64  *  0   (---)                   (---)
     65  *  1   start                   start (1st msg received)
     66  *  2   (---)                   1st valid msg received
     67  *  3   1st msg sent	        1st msg sent
     68  *  4   1st valid msg received  2st valid msg received
     69  *  5   (---)                   (---)
     70  *  6   (---)                   (---)
     71  *  7   (---)                   (---)
     72  *  8   (---)                   (---)
     73  *  9   SA established          SA established
     74  *
     75  * base mode:
     76  *      initiator               responder
     77  *  0   (---)                   (---)
     78  *  1   start                   start (1st msg received)
     79  *  2   (---)                   1st valid msg received
     80  *  3   1st msg sent	        1st msg sent
     81  *  4   1st valid msg received  2st valid msg received
     82  *  5   2nd msg sent            (---)
     83  *  6   (---)                   (---)
     84  *  7   (---)                   (---)
     85  *  8   (---)                   (---)
     86  *  9   SA established          SA established
     87  */
     88 #define PHASE1ST_SPAWN			0
     89 #define PHASE1ST_START			1
     90 #define PHASE1ST_MSG1RECEIVED		2
     91 #define PHASE1ST_MSG1SENT		3
     92 #define PHASE1ST_MSG2RECEIVED		4
     93 #define PHASE1ST_MSG2SENT		5
     94 #define PHASE1ST_MSG3RECEIVED		6
     95 #define PHASE1ST_MSG3SENT		7
     96 #define PHASE1ST_MSG4RECEIVED		8
     97 #define PHASE1ST_ESTABLISHED		9
     98 #define PHASE1ST_DYING			10
     99 #define PHASE1ST_EXPIRED		11
    100 #define PHASE1ST_MAX			12
    101 
    102 /* About address semantics in each case.
    103  *			initiator(addr=I)	responder(addr=R)
    104  *			src	dst		src	dst
    105  *			(local)	(remote)	(local)	(remote)
    106  * phase 1 handler	I	R		R	I
    107  * phase 2 handler	I	R		R	I
    108  * getspi msg		R	I		I	R
    109  * acquire msg		I	R
    110  * ID payload		I	R		I	R
    111  */
    112 #ifdef ENABLE_HYBRID
    113 struct isakmp_cfg_state;
    114 #endif
    115 struct ph1handle {
    116 	isakmp_index index;
    117 
    118 	int status;			/* status of this SA */
    119 	int side;			/* INITIATOR or RESPONDER */
    120 
    121 	struct sockaddr *remote;	/* remote address to negosiate ph1 */
    122 	struct sockaddr *local;		/* local address to negosiate ph1 */
    123 			/* XXX copy from rmconf due to anonymous configuration.
    124 			 * If anonymous will be forbidden, we do delete them. */
    125 
    126 	struct remoteconf *rmconf;	/* pointer to remote configuration */
    127 
    128 	struct isakmpsa *approval;	/* pointer to SA(s) approved. */
    129 	vchar_t *authstr;		/* place holder of string for auth. */
    130 					/* for example pre-shared key */
    131 
    132 	uint8_t version;		/* ISAKMP version */
    133 	uint8_t etype;			/* Exchange type actually for use */
    134 	uint8_t flags;			/* Flags */
    135 	uint32_t msgid;		/* message id */
    136 
    137 	uint32_t vendorid_mask;	/* bitmask of received supported vendor ids*/
    138 #ifdef ENABLE_NATT
    139 	struct ph1natt_options *natt_options;	/* Selected NAT-T IKE version */
    140 	uint32_t natt_flags;		/* NAT-T related flags */
    141 #endif
    142 #ifdef ENABLE_FRAG
    143 	int frag;			/* IKE phase 1 fragmentation */
    144 	int frag_last_index;
    145 	struct isakmp_frag_item *frag_chain;	/* Received fragments */
    146 #endif
    147 
    148 	struct sched sce;		/* schedule for expire */
    149 
    150 	struct sched scr;		/* schedule for resend */
    151 	int retry_counter;		/* for resend. */
    152 	vchar_t *sendbuf;		/* buffer for re-sending */
    153 
    154 	vchar_t *dhpriv;		/* DH; private value */
    155 	vchar_t *dhpub;			/* DH; public value */
    156 	vchar_t *dhpub_p;		/* DH; partner's public value */
    157 	vchar_t *dhgxy;			/* DH; shared secret */
    158 	vchar_t *nonce;			/* nonce value */
    159 	vchar_t *nonce_p;		/* partner's nonce value */
    160 	vchar_t *skeyid;		/* SKEYID */
    161 	vchar_t *skeyid_d;		/* SKEYID_d */
    162 	vchar_t *skeyid_a;		/* SKEYID_a, i.e. hash */
    163 	vchar_t *skeyid_e;		/* SKEYID_e, i.e. encryption */
    164 	vchar_t *key;			/* cipher key */
    165 	vchar_t *hash;			/* HASH minus general header */
    166 	vchar_t *sig;			/* SIG minus general header */
    167 	vchar_t *sig_p;			/* peer's SIG minus general header */
    168 	vchar_t *cert;			/* CERT minus general header */
    169 	vchar_t *cert_p;		/* peer's CERT minus general header */
    170 	vchar_t *crl_p;			/* peer's CRL minus general header */
    171 	vchar_t *cr_p;			/* peer's CR not including general */
    172 	RSA *rsa;			/* my RSA key */
    173 	RSA *rsa_p;			/* peer's RSA key */
    174 	struct genlist *rsa_candidates;	/* possible candidates for peer's RSA key */
    175 	vchar_t *id;			/* ID minus gen header */
    176 	vchar_t *id_p;			/* partner's ID minus general header */
    177 					/* i.e. struct ipsecdoi_id_b*. */
    178 	struct isakmp_ivm *ivm;		/* IVs */
    179 
    180 	vchar_t *sa;			/* whole SA payload to send/to be sent*/
    181 					/* to calculate HASH */
    182 					/* NOT INCLUDING general header. */
    183 
    184 	vchar_t *sa_ret;		/* SA payload to reply/to be replyed */
    185 					/* NOT INCLUDING general header. */
    186 					/* NOTE: Should be release after use. */
    187 
    188 #ifdef HAVE_GSSAPI
    189 	void *gssapi_state;		/* GSS-API specific state. */
    190 					/* Allocated when needed */
    191 	vchar_t *gi_i;			/* optional initiator GSS id */
    192 	vchar_t *gi_r;			/* optional responder GSS id */
    193 #endif
    194 
    195 	struct isakmp_pl_hash *pl_hash;	/* pointer to hash payload */
    196 
    197 	time_t created;			/* timestamp for establish */
    198 	int initial_contact_received;	/* set if initial contact received */
    199 #ifdef ENABLE_STATS
    200 	struct timeval start;
    201 	struct timeval end;
    202 #endif
    203 
    204 #ifdef ENABLE_DPD
    205 	int		dpd_support;	/* Does remote supports DPD ? */
    206 	uint32_t	dpd_last_ack;
    207 	uint32_t	dpd_seq;		/* DPD seq number to receive */
    208 	uint8_t	dpd_fails;		/* number of failures */
    209 	struct sched	dpd_r_u;
    210 #endif
    211 
    212 	uint32_t msgid2;		/* msgid counter for Phase 2 */
    213 	int ph2cnt;	/* the number which is negotiated by this phase 1 */
    214 	LIST_HEAD(_ph2ofph1_, ph2handle) ph2tree;
    215 
    216 	LIST_ENTRY(ph1handle) chain;
    217 #ifdef ENABLE_HYBRID
    218 	struct isakmp_cfg_state *mode_cfg;	/* ISAKMP mode config state */
    219 #endif
    220 	EVT_LISTENER_LIST(evt_listeners);
    221 };
    222 
    223 /* For limiting enumeration of ph1 tree */
    224 struct ph1selector {
    225 	struct sockaddr *local;
    226 	struct sockaddr *remote;
    227 };
    228 
    229 /* Phase 2 handler */
    230 /* allocated per a SA or SA bundles of a pair of peer's IP addresses. */
    231 /*
    232  *      initiator               responder
    233  *  0   (---)                   (---)
    234  *  1   start                   start (1st msg received)
    235  *  2   acquire msg get         1st valid msg received
    236  *  3   getspi request sent     getspi request sent
    237  *  4   getspi done             getspi done
    238  *  5   1st msg sent            1st msg sent
    239  *  6   1st valid msg received  2nd valid msg received
    240  *  7   (commit bit)            (commit bit)
    241  *  8   SAs added               SAs added
    242  *  9   SAs established         SAs established
    243  * 10   SAs expired             SAs expired
    244  */
    245 #define PHASE2ST_SPAWN		0
    246 #define PHASE2ST_START		1
    247 #define PHASE2ST_STATUS2	2
    248 #define PHASE2ST_GETSPISENT	3
    249 #define PHASE2ST_GETSPIDONE	4
    250 #define PHASE2ST_MSG1SENT	5
    251 #define PHASE2ST_STATUS6	6
    252 #define PHASE2ST_COMMIT		7
    253 #define PHASE2ST_ADDSA		8
    254 #define PHASE2ST_ESTABLISHED	9
    255 #define PHASE2ST_EXPIRED	10
    256 #define PHASE2ST_MAX		11
    257 
    258 struct ph2handle {
    259 	/* source and destination addresses used for IKE exchange. Might
    260 	 * differ from source and destination of SA. On the initiator,
    261 	 * they are tweaked if a hint is available in the SPD (set by
    262 	 * MIGRATE for instance). Otherwise they are the source and
    263 	 * destination of SA for transport mode and the tunnel endpoints
    264 	 * for tunnel mode */
    265 	struct sockaddr *src;
    266 	struct sockaddr *dst;
    267 
    268 	/* source and destination addresses of the SA in the case addresses
    269 	 * used for IKE exchanges (src and dst) do differ. On the initiator,
    270 	 * they are set (if needed) in pk_recvacquire(). On the responder,
    271 	 * they are _derived_ from the local and remote parameters of the
    272 	 * SP, if available. */
    273 	struct sockaddr *sa_src;
    274 	struct sockaddr *sa_dst;
    275 
    276 	/* Store our Phase 2 ID and the peer ID (ID minus general header).
    277 	 * On the initiator, they are set during ACQUIRE processing.
    278 	 * On the responder, they are set from the content of ID payload
    279 	 * in quick_r1recv(). Then, if they are of type address or
    280 	 * tunnel, they are compared to sainfo selectors.
    281 	 */
    282 	vchar_t *id;			/* ID minus gen header */
    283 	vchar_t *id_p;			/* peer's ID minus general header */
    284 
    285 #ifdef ENABLE_NATT
    286 	struct sockaddr *natoa_src;	/* peer's view of my address */
    287 	struct sockaddr *natoa_dst;	/* peer's view of his address */
    288 #endif
    289 
    290 	uint32_t spid;			/* policy id by kernel */
    291 
    292 	int status;			/* ipsec sa status */
    293 	uint8_t side;			/* INITIATOR or RESPONDER */
    294 
    295 	struct sched sce;		/* schedule for expire */
    296 	struct sched scr;		/* schedule for resend */
    297 	int retry_counter;		/* for resend. */
    298 	vchar_t *sendbuf;		/* buffer for re-sending */
    299 	vchar_t *msg1;			/* buffer for re-sending */
    300 				/* used for responder's first message */
    301 
    302 	int retry_checkph1;		/* counter to wait phase 1 finished. */
    303 					/* NOTE: actually it's timer. */
    304 
    305 	uint32_t seq;			/* sequence number used by PF_KEY */
    306 			/*
    307 			 * NOTE: In responder side, we can't identify each SAs
    308 			 * with same destination address for example, when
    309 			 * socket based SA is required.  So we set a identifier
    310 			 * number to "seq", and sent kernel by pfkey.
    311 			 */
    312 	uint8_t satype;		/* satype in PF_KEY */
    313 			/*
    314 			 * saved satype in the original PF_KEY request from
    315 			 * the kernel in order to reply a error.
    316 			 */
    317 
    318 	uint8_t flags;			/* Flags for phase 2 */
    319 	uint32_t msgid;		/* msgid for phase 2 */
    320 
    321 	struct sainfo *sainfo;		/* place holder of sainfo */
    322 	struct saprop *proposal;	/* SA(s) proposal. */
    323 	struct saprop *approval;	/* SA(s) approved. */
    324 	uint32_t lifetime_secs;	/* responder lifetime (seconds) */
    325 	uint32_t lifetime_kb;		/* responder lifetime (kbytes) */
    326 	caddr_t spidx_gen;		/* policy from peer's proposal */
    327 
    328 	struct dhgroup *pfsgrp;		/* DH; prime number */
    329 	vchar_t *dhpriv;		/* DH; private value */
    330 	vchar_t *dhpub;			/* DH; public value */
    331 	vchar_t *dhpub_p;		/* DH; partner's public value */
    332 	vchar_t *dhgxy;			/* DH; shared secret */
    333 	vchar_t *nonce;			/* nonce value in phase 2 */
    334 	vchar_t *nonce_p;		/* partner's nonce value in phase 2 */
    335 
    336 	vchar_t *sa;			/* whole SA payload to send/to be sent*/
    337 					/* to calculate HASH */
    338 					/* NOT INCLUDING general header. */
    339 
    340 	vchar_t *sa_ret;		/* SA payload to reply/to be replyed */
    341 					/* NOT INCLUDING general header. */
    342 					/* NOTE: Should be release after use. */
    343 
    344 	struct isakmp_ivm *ivm;		/* IVs */
    345 
    346 	int generated_spidx;	/* mark handlers whith generated policy */
    347 
    348 #ifdef ENABLE_STATS
    349 	struct timeval start;
    350 	struct timeval end;
    351 #endif
    352 	struct ph1handle *ph1;	/* back pointer to isakmp status */
    353 
    354 	LIST_ENTRY(ph2handle) chain;
    355 	LIST_ENTRY(ph2handle) ph1bind;	/* chain to ph1handle */
    356 	EVT_LISTENER_LIST(evt_listeners);
    357 };
    358 
    359 /* For limiting enumeration of ph2 tree */
    360 struct ph2selector {
    361 	uint32_t spid;
    362 	struct sockaddr *src;
    363 	struct sockaddr *dst;
    364 };
    365 
    366 /*
    367  * for handling initial contact.
    368  */
    369 struct contacted {
    370 	struct sockaddr *remote;	/* remote address to negosiate ph1 */
    371 	LIST_ENTRY(contacted) chain;
    372 };
    373 
    374 /*
    375  * for checking a packet retransmited.
    376  */
    377 struct recvdpkt {
    378 	struct sockaddr *remote;	/* the remote address */
    379 	struct sockaddr *local;		/* the local address */
    380 	vchar_t *hash;			/* hash of the received packet */
    381 	vchar_t *sendbuf;		/* buffer for the response */
    382 	int retry_counter;		/* how many times to send */
    383 	struct timeval time_send;	/* timestamp of previous send */
    384 
    385 	LIST_ENTRY(recvdpkt) chain;
    386 };
    387 
    388 /* for parsing ISAKMP header. */
    389 struct isakmp_parse_t {
    390 	u_char type;		/* payload type of mine */
    391 	int len;		/* ntohs(ptr->len) */
    392 	struct isakmp_gen *ptr;
    393 };
    394 
    395 /*
    396  * for IV management.
    397  *
    398  * - normal case
    399  * initiator                                     responder
    400  * -------------------------                     --------------------------
    401  * initialize iv(A), ive(A).                     initialize iv(A), ive(A).
    402  * encode by ive(A).
    403  * save to iv(B).            ---[packet(B)]-->   save to ive(B).
    404  *                                               decode by iv(A).
    405  *                                               packet consistency.
    406  *                                               sync iv(B) with ive(B).
    407  *                                               check auth, integrity.
    408  *                                               encode by ive(B).
    409  * save to ive(C).          <--[packet(C)]---    save to iv(C).
    410  * decoded by iv(B).
    411  *      :
    412  *
    413  * - In the case that a error is found while cipher processing,
    414  * initiator                                     responder
    415  * -------------------------                     --------------------------
    416  * initialize iv(A), ive(A).                     initialize iv(A), ive(A).
    417  * encode by ive(A).
    418  * save to iv(B).            ---[packet(B)]-->   save to ive(B).
    419  *                                               decode by iv(A).
    420  *                                               packet consistency.
    421  *                                               sync iv(B) with ive(B).
    422  *                                               check auth, integrity.
    423  *                                               error found.
    424  *                                               create notify.
    425  *                                               get ive2(X) from iv(B).
    426  *                                               encode by ive2(X).
    427  * get iv2(X) from iv(B).   <--[packet(Y)]---    save to iv2(Y).
    428  * save to ive2(Y).
    429  * decoded by iv2(X).
    430  *      :
    431  *
    432  * The reason why the responder synchronizes iv with ive after checking the
    433  * packet consistency is that it is required to leave the IV for decoding
    434  * packet.  Because there is a potential of error while checking the packet
    435  * consistency.  Also the reason why that is before authentication and
    436  * integirty check is that the IV for informational exchange has to be made
    437  * by the IV which is after packet decoded and checking the packet consistency.
    438  * Otherwise IV mismatched happens between the intitiator and the responder.
    439  */
    440 struct isakmp_ivm {
    441 	vchar_t *iv;	/* for decoding packet */
    442 			/* if phase 1, it's for computing phase2 iv */
    443 	vchar_t *ive;	/* for encoding packet */
    444 };
    445 
    446 /* for dumping */
    447 struct ph1dump {
    448 	isakmp_index index;
    449 	int status;
    450 	int side;
    451 	struct sockaddr_storage remote;
    452 	struct sockaddr_storage local;
    453 	uint8_t version;
    454 	uint8_t etype;
    455 	time_t created;
    456 	int ph2cnt;
    457 };
    458 
    459 struct sockaddr;
    460 struct ph1handle;
    461 struct ph2handle;
    462 struct policyindex;
    463 
    464 extern struct ph1handle *getph1byindex(isakmp_index *);
    465 extern struct ph1handle *getph1byindex0(isakmp_index *);
    466 
    467 extern int enumph1(struct ph1selector *ph1sel,
    468     int (* enum_func)(struct ph1handle *iph1, void *arg), void *enum_arg);
    469 
    470 #define GETPH1_F_ESTABLISHED		0x0001
    471 
    472 extern struct ph1handle *getph1(struct ph1handle *ph1hint,
    473     struct sockaddr *local, struct sockaddr *remote, int flags);
    474 
    475 #define getph1byaddr(local, remote, est) \
    476 	getph1(NULL, local, remote, /*CONSTCOND*/est ? GETPH1_F_ESTABLISHED : 0)
    477 #define getph1bydstaddr(remote) \
    478 	getph1(NULL, NULL, remote, 0)
    479 
    480 #ifdef ENABLE_HYBRID
    481 struct ph1handle *getph1bylogin(char *);
    482 int purgeph1bylogin(char *);
    483 #endif
    484 extern void migrate_ph12(struct ph1handle *old_iph1, struct ph1handle *new_iph1);
    485 extern void migrate_dying_ph12(struct ph1handle *iph1);
    486 extern vchar_t *dumpph1(void);
    487 extern struct ph1handle *newph1(void);
    488 extern void delph1(struct ph1handle *);
    489 extern int insph1(struct ph1handle *);
    490 extern void remph1(struct ph1handle *);
    491 extern int resolveph1rmconf(struct ph1handle *);
    492 extern void flushph1(void);
    493 extern void initph1tree(void);
    494 extern int ph1_rekey_enabled(struct ph1handle *);
    495 
    496 extern int enumph2(struct ph2selector *ph2sel,
    497     int (* enum_func)(struct ph2handle *iph2, void *arg), void *enum_arg);
    498 extern struct ph2handle *getph2byseq(uint32_t);
    499 extern struct ph2handle *getph2bysaddr(struct sockaddr *, struct sockaddr *);
    500 extern struct ph2handle *getph2bymsgid(struct ph1handle *, uint32_t);
    501 extern struct ph2handle *getph2byid(struct sockaddr *,
    502     struct sockaddr *, uint32_t);
    503 extern struct ph2handle *getph2bysaidx(struct sockaddr *, struct sockaddr *,
    504     u_int, uint32_t);
    505 extern struct ph2handle *newph2(void);
    506 extern void initph2(struct ph2handle *);
    507 extern void delph2(struct ph2handle *);
    508 extern int insph2(struct ph2handle *);
    509 extern void remph2(struct ph2handle *);
    510 extern void flushph2(void);
    511 extern void deleteallph2(struct sockaddr *, struct sockaddr *, u_int);
    512 extern void initph2tree(void);
    513 
    514 extern void bindph12(struct ph1handle *, struct ph2handle *);
    515 extern void unbindph12(struct ph2handle *);
    516 
    517 extern struct contacted *getcontacted(struct sockaddr *);
    518 extern int inscontacted(struct sockaddr *);
    519 extern void remcontacted(struct sockaddr *);
    520 extern void initctdtree(void);
    521 
    522 extern int check_recvdpkt(struct sockaddr *, struct sockaddr *, vchar_t *);
    523 extern int add_recvdpkt(struct sockaddr *, struct sockaddr *, vchar_t *,
    524     vchar_t *);
    525 extern void init_recvdpkt(void);
    526 
    527 #ifdef ENABLE_HYBRID
    528 extern int exclude_cfg_addr(const struct sockaddr *);
    529 #endif
    530 
    531 extern int revalidate_ph12(void);
    532 
    533 #endif /* _HANDLER_H */
    534