Annotation of embedaddon/strongswan/src/libcharon/sa/ike_sa.h, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2006-2019 Tobias Brunner
3: * Copyright (C) 2006 Daniel Roethlisberger
4: * Copyright (C) 2005-2009 Martin Willi
5: * Copyright (C) 2005 Jan Hutter
6: * HSR Hochschule fuer Technik Rapperswil
7: *
8: * This program is free software; you can redistribute it and/or modify it
9: * under the terms of the GNU General Public License as published by the
10: * Free Software Foundation; either version 2 of the License, or (at your
11: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
12: *
13: * This program is distributed in the hope that it will be useful, but
14: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16: * for more details.
17: */
18:
19: /**
20: * @defgroup ike_sa ike_sa
21: * @{ @ingroup sa
22: */
23:
24: #ifndef IKE_SA_H_
25: #define IKE_SA_H_
26:
27: typedef enum ike_extension_t ike_extension_t;
28: typedef enum ike_condition_t ike_condition_t;
29: typedef enum ike_sa_state_t ike_sa_state_t;
30: typedef enum statistic_t statistic_t;
31: typedef struct ike_sa_t ike_sa_t;
32:
33: #include <library.h>
34: #include <attributes/attribute_handler.h>
35: #include <encoding/message.h>
36: #include <encoding/payloads/proposal_substructure.h>
37: #include <encoding/payloads/configuration_attribute.h>
38: #include <sa/ike_sa_id.h>
39: #include <sa/child_sa.h>
40: #include <sa/task.h>
41: #include <sa/task_manager.h>
42: #include <sa/keymat.h>
43: #include <config/peer_cfg.h>
44: #include <config/ike_cfg.h>
45: #include <credentials/auth_cfg.h>
46: #include <networking/packet.h>
47:
48: /**
49: * Timeout in seconds after that a half open IKE_SA gets deleted.
50: */
51: #define HALF_OPEN_IKE_SA_TIMEOUT 30
52:
53: /**
54: * Interval to send keepalives when NATed, in seconds.
55: */
56: #define KEEPALIVE_INTERVAL 20
57:
58: /**
59: * After which time rekeying should be retried if it failed, in seconds.
60: */
61: #define RETRY_INTERVAL 15
62:
63: /**
64: * Jitter to subtract from RETRY_INTERVAL to randomize rekey retry.
65: */
66: #define RETRY_JITTER 10
67:
68: /**
69: * Number of redirects allowed within REDIRECT_LOOP_DETECT_PERIOD.
70: */
71: #define MAX_REDIRECTS 5
72:
73: /**
74: * Time period in seconds in which at most MAX_REDIRECTS are allowed.
75: */
76: #define REDIRECT_LOOP_DETECT_PERIOD 300
77:
78: /**
79: * Extensions (or optional features) the peer supports
80: */
81: enum ike_extension_t {
82:
83: /**
84: * peer supports NAT traversal as specified in RFC4306 or RFC3947
85: * including some RFC3947 drafts
86: */
87: EXT_NATT = (1<<0),
88:
89: /**
90: * peer supports MOBIKE (RFC4555)
91: */
92: EXT_MOBIKE = (1<<1),
93:
94: /**
95: * peer supports HTTP cert lookups as specified in RFC4306
96: */
97: EXT_HASH_AND_URL = (1<<2),
98:
99: /**
100: * peer supports multiple authentication exchanges, RFC4739
101: */
102: EXT_MULTIPLE_AUTH = (1<<3),
103:
104: /**
105: * peer uses strongSwan, accept private use extensions
106: */
107: EXT_STRONGSWAN = (1<<4),
108:
109: /**
110: * peer supports EAP-only authentication, draft-eronen-ipsec-ikev2-eap-auth
111: */
112: EXT_EAP_ONLY_AUTHENTICATION = (1<<5),
113:
114: /**
115: * peer is probably a Windows RAS client
116: */
117: EXT_MS_WINDOWS = (1<<6),
118:
119: /**
120: * peer supports XAuth authentication, draft-ietf-ipsec-isakmp-xauth-06
121: */
122: EXT_XAUTH = (1<<7),
123:
124: /**
125: * peer supports DPD detection, RFC 3706 (or IKEv2)
126: */
127: EXT_DPD = (1<<8),
128:
129: /**
130: * peer supports Cisco Unity configuration attributes
131: */
132: EXT_CISCO_UNITY = (1<<9),
133:
134: /**
135: * peer supports NAT traversal as specified in
136: * draft-ietf-ipsec-nat-t-ike-02 .. -03
137: */
138: EXT_NATT_DRAFT_02_03 = (1<<10),
139:
140: /**
141: * peer supports proprietary IKEv1 or standardized IKEv2 fragmentation
142: */
143: EXT_IKE_FRAGMENTATION = (1<<11),
144:
145: /**
146: * Signature Authentication, RFC 7427
147: */
148: EXT_SIGNATURE_AUTH = (1<<12),
149:
150: /**
151: * IKEv2 Redirect Mechanism, RFC 5685
152: */
153: EXT_IKE_REDIRECTION = (1<<13),
154:
155: /**
156: * IKEv2 Message ID sync, RFC 6311
157: */
158: EXT_IKE_MESSAGE_ID_SYNC = (1<<14),
159:
160: /**
161: * Postquantum Preshared Keys, draft-ietf-ipsecme-qr-ikev2
162: */
163: EXT_PPK = (1<<15),
164:
165: /**
166: * Responder accepts childless IKE_SAs, RFC 6023
167: */
168: EXT_IKE_CHILDLESS = (1<<16),
169: };
170:
171: /**
172: * Conditions of an IKE_SA, change during its lifetime
173: */
174: enum ike_condition_t {
175:
176: /**
177: * Connection is natted (or faked) somewhere
178: */
179: COND_NAT_ANY = (1<<0),
180:
181: /**
182: * we are behind NAT
183: */
184: COND_NAT_HERE = (1<<1),
185:
186: /**
187: * other is behind NAT
188: */
189: COND_NAT_THERE = (1<<2),
190:
191: /**
192: * Faking NAT to enforce UDP encapsulation
193: */
194: COND_NAT_FAKE = (1<<3),
195:
196: /**
197: * peer has been authenticated using EAP at least once
198: */
199: COND_EAP_AUTHENTICATED = (1<<4),
200:
201: /**
202: * received a certificate request from the peer
203: */
204: COND_CERTREQ_SEEN = (1<<5),
205:
206: /**
207: * Local peer is the "original" IKE initiator. Unaffected from rekeying.
208: */
209: COND_ORIGINAL_INITIATOR = (1<<6),
210:
211: /**
212: * IKE_SA is stale, the peer is currently unreachable (MOBIKE)
213: */
214: COND_STALE = (1<<7),
215:
216: /**
217: * Initial contact received
218: */
219: COND_INIT_CONTACT_SEEN = (1<<8),
220:
221: /**
222: * Peer has been authenticated using XAuth
223: */
224: COND_XAUTH_AUTHENTICATED = (1<<9),
225:
226: /**
227: * This IKE_SA is currently being reauthenticated
228: */
229: COND_REAUTHENTICATING = (1<<10),
230:
231: /**
232: * This IKE_SA has been redirected
233: */
234: COND_REDIRECTED = (1<<11),
235:
236: /**
237: * Online certificate revocation checking is suspended for this IKE_SA
238: */
239: COND_ONLINE_VALIDATION_SUSPENDED = (1<<12),
240:
241: /**
242: * A Postquantum Preshared Key was used when this IKE_SA was created
243: */
244: COND_PPK = (1<<13),
245: };
246:
247: /**
248: * Timing information and statistics to query from an SA
249: */
250: enum statistic_t {
251: /** Timestamp of SA establishment */
252: STAT_ESTABLISHED = 0,
253: /** Timestamp of scheduled rekeying */
254: STAT_REKEY,
255: /** Timestamp of scheduled reauthentication */
256: STAT_REAUTH,
257: /** Timestamp of scheduled delete */
258: STAT_DELETE,
259: /** Timestamp of last inbound IKE packet */
260: STAT_INBOUND,
261: /** Timestamp of last outbound IKE packet */
262: STAT_OUTBOUND,
263:
264: STAT_MAX
265: };
266:
267: /**
268: * State of an IKE_SA.
269: *
270: * An IKE_SA passes various states in its lifetime. A newly created
271: * SA is in the state CREATED.
272: * @verbatim
273: +----------------+
274: ¦ SA_CREATED ¦
275: +----------------+
276: ¦
277: on initiate()---> ¦ <----- on IKE_SA_INIT received
278: V
279: +----------------+
280: ¦ SA_CONNECTING ¦
281: +----------------+
282: ¦
283: ¦ <----- on IKE_AUTH successfully completed
284: V
285: +----------------+
286: ¦ SA_ESTABLISHED ¦-------------------------+ <-- on rekeying
287: +----------------+ ¦
288: ¦ V
289: on delete()---> ¦ <----- on IKE_SA +-------------+
290: ¦ delete request ¦ SA_REKEYING ¦
291: ¦ received +-------------+
292: V ¦
293: +----------------+ ¦
294: ¦ SA_DELETING ¦<------------------------+ <-- after rekeying
295: +----------------+
296: ¦
297: ¦ <----- after delete() acknowledged
298: ¦
299: \V/
300: X
301: / \
302: @endverbatim
303: */
304: enum ike_sa_state_t {
305:
306: /**
307: * IKE_SA just got created, but is not initiating nor responding yet.
308: */
309: IKE_CREATED,
310:
311: /**
312: * IKE_SA gets initiated actively or passively
313: */
314: IKE_CONNECTING,
315:
316: /**
317: * IKE_SA is fully established
318: */
319: IKE_ESTABLISHED,
320:
321: /**
322: * IKE_SA is managed externally and does not process messages
323: */
324: IKE_PASSIVE,
325:
326: /**
327: * IKE_SA rekeying in progress
328: */
329: IKE_REKEYING,
330:
331: /**
332: * IKE_SA has been rekeyed (or is redundant)
333: */
334: IKE_REKEYED,
335:
336: /**
337: * IKE_SA is in progress of deletion
338: */
339: IKE_DELETING,
340:
341: /**
342: * IKE_SA object gets destroyed
343: */
344: IKE_DESTROYING,
345: };
346:
347: /**
348: * enum names for ike_sa_state_t.
349: */
350: extern enum_name_t *ike_sa_state_names;
351:
352: /**
353: * Class ike_sa_t representing an IKE_SA.
354: *
355: * An IKE_SA contains crypto information related to a connection
356: * with a peer. It contains multiple IPsec CHILD_SA, for which
357: * it is responsible. All traffic is handled by an IKE_SA, using
358: * the task manager and its tasks.
359: */
360: struct ike_sa_t {
361:
362: /**
363: * Get the id of the SA.
364: *
365: * Returned ike_sa_id_t object is not getting cloned!
366: *
367: * @return ike_sa's ike_sa_id_t
368: */
369: ike_sa_id_t* (*get_id) (ike_sa_t *this);
370:
371: /**
372: * Gets the IKE version of the SA
373: */
374: ike_version_t (*get_version)(ike_sa_t *this);
375:
376: /**
377: * Get the numerical ID uniquely defining this IKE_SA.
378: *
379: * @return unique ID
380: */
381: uint32_t (*get_unique_id) (ike_sa_t *this);
382:
383: /**
384: * Get the state of the IKE_SA.
385: *
386: * @return state of the IKE_SA
387: */
388: ike_sa_state_t (*get_state) (ike_sa_t *this);
389:
390: /**
391: * Set the state of the IKE_SA.
392: *
393: * @param state state to set for the IKE_SA
394: */
395: void (*set_state) (ike_sa_t *this, ike_sa_state_t state);
396:
397: /**
398: * Get the name of the connection this IKE_SA uses.
399: *
400: * @return name
401: */
402: char* (*get_name) (ike_sa_t *this);
403:
404: /**
405: * Get statistic values from the IKE_SA.
406: *
407: * @param kind kind of requested value
408: * @return value as integer
409: */
410: uint32_t (*get_statistic)(ike_sa_t *this, statistic_t kind);
411:
412: /**
413: * Set statistic value of the IKE_SA.
414: *
415: * @param kind kind of value to update
416: * @param value value as integer
417: */
418: void (*set_statistic)(ike_sa_t *this, statistic_t kind, uint32_t value);
419:
420: /**
421: * Get the own host address.
422: *
423: * @return host address
424: */
425: host_t* (*get_my_host) (ike_sa_t *this);
426:
427: /**
428: * Set the own host address.
429: *
430: * @param me host address
431: */
432: void (*set_my_host) (ike_sa_t *this, host_t *me);
433:
434: /**
435: * Get the other peers host address.
436: *
437: * @return host address
438: */
439: host_t* (*get_other_host) (ike_sa_t *this);
440:
441: /**
442: * Set the others host address.
443: *
444: * @param other host address
445: */
446: void (*set_other_host) (ike_sa_t *this, host_t *other);
447:
448: /**
449: * Float to port 4500 (e.g. if a NAT is detected).
450: *
451: * The port of either endpoint is changed only if it is currently
452: * set to the default value of 500.
453: */
454: void (*float_ports)(ike_sa_t *this);
455:
456: /**
457: * Update the IKE_SAs host.
458: *
459: * Hosts may be NULL to use current host.
460: *
461: * @param me new local host address, or NULL
462: * @param other new remote host address, or NULL
463: * @param force force update
464: */
465: void (*update_hosts)(ike_sa_t *this, host_t *me, host_t *other, bool force);
466:
467: /**
468: * Get the own identification.
469: *
470: * @return identification
471: */
472: identification_t* (*get_my_id) (ike_sa_t *this);
473:
474: /**
475: * Set the own identification.
476: *
477: * @param me identification
478: */
479: void (*set_my_id) (ike_sa_t *this, identification_t *me);
480:
481: /**
482: * Get the other peer's identification.
483: *
484: * @return identification
485: */
486: identification_t* (*get_other_id) (ike_sa_t *this);
487:
488: /**
489: * Get the others peer identity, but prefer an EAP-Identity.
490: *
491: * @return EAP or IKEv2 identity
492: */
493: identification_t* (*get_other_eap_id)(ike_sa_t *this);
494:
495: /**
496: * Set the other peer's identification.
497: *
498: * @param other identification
499: */
500: void (*set_other_id) (ike_sa_t *this, identification_t *other);
501:
502: /**
503: * Get the config used to setup this IKE_SA.
504: *
505: * @return ike_config
506: */
507: ike_cfg_t* (*get_ike_cfg) (ike_sa_t *this);
508:
509: /**
510: * Set the config to setup this IKE_SA.
511: *
512: * @param config ike_config to use
513: */
514: void (*set_ike_cfg) (ike_sa_t *this, ike_cfg_t* config);
515:
516: /**
517: * Get the peer config used by this IKE_SA.
518: *
519: * @return peer_config
520: */
521: peer_cfg_t* (*get_peer_cfg) (ike_sa_t *this);
522:
523: /**
524: * Set the peer config to use with this IKE_SA.
525: *
526: * @param config peer_config to use
527: */
528: void (*set_peer_cfg) (ike_sa_t *this, peer_cfg_t *config);
529:
530: /**
531: * Get the authentication config with rules of the current auth round.
532: *
533: * @param local TRUE for local rules, FALSE for remote constraints
534: * @return current cfg
535: */
536: auth_cfg_t* (*get_auth_cfg)(ike_sa_t *this, bool local);
537:
538: /**
539: * Insert a completed authentication round.
540: *
541: * @param local TRUE for own rules, FALSE for others constraints
542: * @param cfg auth config to append
543: */
544: void (*add_auth_cfg)(ike_sa_t *this, bool local, auth_cfg_t *cfg);
545:
546: /**
547: * Create an enumerator over added authentication rounds.
548: *
549: * @param local TRUE for own rules, FALSE for others constraints
550: * @return enumerator over auth_cfg_t
551: */
552: enumerator_t* (*create_auth_cfg_enumerator)(ike_sa_t *this, bool local);
553:
554: /**
555: * Verify the trustchains (validity, revocation) in completed public key
556: * auth rounds.
557: *
558: * @return TRUE if certificates were valid, FALSE otherwise
559: */
560: bool (*verify_peer_certificate)(ike_sa_t *this);
561:
562: /**
563: * Get the selected proposal of this IKE_SA.
564: *
565: * @return selected proposal
566: */
567: proposal_t* (*get_proposal)(ike_sa_t *this);
568:
569: /**
570: * Set the proposal selected for this IKE_SA.
571: *
572: * @param selected proposal
573: */
574: void (*set_proposal)(ike_sa_t *this, proposal_t *proposal);
575:
576: /**
577: * Set the message ID of the IKE_SA.
578: *
579: * The IKE_SA stores two message IDs, one for initiating exchanges (send)
580: * and one to respond to exchanges (expect).
581: *
582: * @param initiate TRUE to set message ID for initiating
583: * @param mid message id to set
584: */
585: void (*set_message_id)(ike_sa_t *this, bool initiate, uint32_t mid);
586:
587: /**
588: * Get the message ID of the IKE_SA.
589: *
590: * The IKE_SA stores two message IDs, one for initiating exchanges (send)
591: * and one to respond to exchanges (expect).
592: *
593: * @param initiate TRUE to get message ID for initiating
594: * @return current message
595: */
596: uint32_t (*get_message_id)(ike_sa_t *this, bool initiate);
597:
598: /**
599: * Add an additional address for the peer.
600: *
601: * In MOBIKE, a peer may transmit additional addresses where it is
602: * reachable. These are stored in the IKE_SA.
603: * The own list of addresses is not stored, they are queried from
604: * the kernel when required.
605: *
606: * @param host host to add to list
607: */
608: void (*add_peer_address)(ike_sa_t *this, host_t *host);
609:
610: /**
611: * Create an enumerator over all known addresses of the peer.
612: *
613: * @return enumerator over addresses
614: */
615: enumerator_t* (*create_peer_address_enumerator)(ike_sa_t *this);
616:
617: /**
618: * Remove all known addresses of the peer.
619: */
620: void (*clear_peer_addresses)(ike_sa_t *this);
621:
622: /**
623: * Check if mappings have changed on a NAT for our source address.
624: *
625: * @param hash received DESTINATION_IP hash
626: * @return TRUE if mappings have changed
627: */
628: bool (*has_mapping_changed)(ike_sa_t *this, chunk_t hash);
629:
630: /**
631: * Enable an extension the peer supports.
632: *
633: * If support for an IKE extension is detected, this method is called
634: * to enable that extension and behave accordingly.
635: *
636: * @param extension extension to enable
637: */
638: void (*enable_extension)(ike_sa_t *this, ike_extension_t extension);
639:
640: /**
641: * Check if the peer supports an extension.
642: *
643: * @param extension extension to check for support
644: * @return TRUE if peer supports it, FALSE otherwise
645: */
646: bool (*supports_extension)(ike_sa_t *this, ike_extension_t extension);
647:
648: /**
649: * Enable/disable a condition flag for this IKE_SA.
650: *
651: * @param condition condition to enable/disable
652: * @param enable TRUE to enable condition, FALSE to disable
653: */
654: void (*set_condition) (ike_sa_t *this, ike_condition_t condition, bool enable);
655:
656: /**
657: * Check if a condition flag is set.
658: *
659: * @param condition condition to check
660: * @return TRUE if condition flag set, FALSE otherwise
661: */
662: bool (*has_condition) (ike_sa_t *this, ike_condition_t condition);
663:
664: #ifdef ME
665: /**
666: * Activate mediation server functionality for this IKE_SA.
667: */
668: void (*act_as_mediation_server) (ike_sa_t *this);
669:
670: /**
671: * Get the server reflexive host.
672: *
673: * @return server reflexive host
674: */
675: host_t* (*get_server_reflexive_host) (ike_sa_t *this);
676:
677: /**
678: * Set the server reflexive host.
679: *
680: * @param host server reflexive host
681: */
682: void (*set_server_reflexive_host) (ike_sa_t *this, host_t *host);
683:
684: /**
685: * Get the connect ID.
686: *
687: * @return connect ID
688: */
689: chunk_t (*get_connect_id) (ike_sa_t *this);
690:
691: /**
692: * Initiate the mediation of a mediated connection (i.e. initiate a
693: * ME_CONNECT exchange to a mediation server).
694: *
695: * @param mediated_cfg peer_cfg of the mediated connection
696: * @return
697: * - SUCCESS if initialization started
698: * - DESTROY_ME if initialization failed
699: */
700: status_t (*initiate_mediation) (ike_sa_t *this, peer_cfg_t *mediated_cfg);
701:
702: /**
703: * Initiate the mediated connection
704: *
705: * @param me local endpoint (gets cloned)
706: * @param other remote endpoint (gets cloned)
707: * @param connect_id connect ID (gets cloned)
708: * @return
709: * - SUCCESS if initialization started
710: * - DESTROY_ME if initialization failed
711: */
712: status_t (*initiate_mediated) (ike_sa_t *this, host_t *me, host_t *other,
713: chunk_t connect_id);
714:
715: /**
716: * Relay data from one peer to another (i.e. initiate a ME_CONNECT exchange
717: * to a peer).
718: *
719: * Data is cloned.
720: *
721: * @param requester ID of the requesting peer
722: * @param connect_id data of the ME_CONNECTID payload
723: * @param connect_key data of the ME_CONNECTKEY payload
724: * @param endpoints endpoints
725: * @param response TRUE if this is a response
726: * @return
727: * - SUCCESS if relay started
728: * - DESTROY_ME if relay failed
729: */
730: status_t (*relay) (ike_sa_t *this, identification_t *requester,
731: chunk_t connect_id, chunk_t connect_key,
732: linked_list_t *endpoints, bool response);
733:
734: /**
735: * Send a callback to a peer.
736: *
737: * Data is cloned.
738: *
739: * @param peer_id ID of the other peer
740: * @return
741: * - SUCCESS if response started
742: * - DESTROY_ME if response failed
743: */
744: status_t (*callback) (ike_sa_t *this, identification_t *peer_id);
745:
746: /**
747: * Respond to a ME_CONNECT request.
748: *
749: * Data is cloned.
750: *
751: * @param peer_id ID of the other peer
752: * @param connect_id the connect ID supplied by the initiator
753: * @return
754: * - SUCCESS if response started
755: * - DESTROY_ME if response failed
756: */
757: status_t (*respond) (ike_sa_t *this, identification_t *peer_id,
758: chunk_t connect_id);
759: #endif /* ME */
760:
761: /**
762: * Initiate a new connection.
763: *
764: * The configs are owned by the IKE_SA after the call. If the initiate
765: * is triggered by a packet, traffic selectors of the packet can be added
766: * to the CHILD_SA.
767: *
768: * @param child_cfg child config to create CHILD from
769: * @param reqid reqid to use for CHILD_SA, 0 assign uniquely
770: * @param tsi source of triggering packet
771: * @param tsr destination of triggering packet.
772: * @return
773: * - SUCCESS if initialization started
774: * - DESTROY_ME if initialization failed
775: */
776: status_t (*initiate) (ike_sa_t *this, child_cfg_t *child_cfg,
777: uint32_t reqid, traffic_selector_t *tsi,
778: traffic_selector_t *tsr);
779:
780: /**
781: * Retry initiation of this IKE_SA after it got deferred previously.
782: *
783: * @return
784: * - SUCCESS if initiation deferred or started
785: * - DESTROY_ME if initiation failed
786: */
787: status_t (*retry_initiate) (ike_sa_t *this);
788:
789: /**
790: * Initiates the deletion of an IKE_SA.
791: *
792: * Sends a delete message to the remote peer and waits for
793: * its response. If the response comes in, or a timeout occurs,
794: * the IKE SA gets destroyed, unless force is TRUE then the IKE_SA is
795: * destroyed immediately without waiting for a response.
796: *
797: * @param force whether to immediately destroy the IKE_SA afterwards
798: * without waiting for a response
799: * @return
800: * - SUCCESS if deletion is initialized
801: * - DESTROY_ME, if destroying is forced, or the IKE_SA
802: * is not in an established state and can not be
803: * deleted (but destroyed)
804: */
805: status_t (*delete) (ike_sa_t *this, bool force);
806:
807: /**
808: * Update IKE_SAs after network interfaces have changed.
809: *
810: * Whenever the network interface configuration changes, the kernel
811: * interface calls roam() on each IKE_SA. The IKE_SA then checks if
812: * the new network config requires changes, and handles appropriate.
813: * If MOBIKE is supported, addresses are updated; If not, the tunnel is
814: * restarted.
815: *
816: * @param address TRUE if address list changed, FALSE otherwise
817: * @return SUCCESS, FAILED, DESTROY_ME
818: */
819: status_t (*roam)(ike_sa_t *this, bool address);
820:
821: /**
822: * Processes an incoming IKE message.
823: *
824: * Message processing may fail. If a critical failure occurs,
825: * process_message() return DESTROY_ME. Then the caller must
826: * destroy the IKE_SA immediately, as it is unusable.
827: *
828: * @param message message to process
829: * @return
830: * - SUCCESS
831: * - FAILED
832: * - DESTROY_ME if this IKE_SA MUST be deleted
833: */
834: status_t (*process_message)(ike_sa_t *this, message_t *message);
835:
836: /**
837: * Generate an IKE message to send it to the peer.
838: *
839: * This method generates all payloads in the message and encrypts/signs
840: * the packet.
841: *
842: * @param message message to generate
843: * @param packet generated output packet
844: * @return
845: * - SUCCESS
846: * - FAILED
847: * - DESTROY_ME if this IKE_SA MUST be deleted
848: */
849: status_t (*generate_message)(ike_sa_t *this, message_t *message,
850: packet_t **packet);
851:
852: /**
853: * Generate an IKE message to send it to the peer. If enabled and supported
854: * it will be fragmented.
855: *
856: * This method generates all payloads in the message and encrypts/signs
857: * the packet/fragments.
858: *
859: * @param message message to generate
860: * @param packets enumerator of generated packet_t* (are not destroyed
861: * with the enumerator)
862: * @return
863: * - SUCCESS
864: * - FAILED
865: * - DESTROY_ME if this IKE_SA MUST be deleted
866: */
867: status_t (*generate_message_fragmented)(ike_sa_t *this, message_t *message,
868: enumerator_t **packets);
869:
870: /**
871: * Retransmits a request.
872: *
873: * @param message_id ID of the request to retransmit
874: * @return
875: * - SUCCESS
876: * - NOT_FOUND if request doesn't have to be retransmitted
877: */
878: status_t (*retransmit) (ike_sa_t *this, uint32_t message_id);
879:
880: /**
881: * Sends a DPD request to the peer.
882: *
883: * To check if a peer is still alive, periodic
884: * empty INFORMATIONAL messages are sent if no
885: * other traffic was received.
886: *
887: * @return
888: * - SUCCESS
889: * - DESTROY_ME, if peer did not respond
890: */
891: status_t (*send_dpd) (ike_sa_t *this);
892:
893: /**
894: * Sends a keep alive packet.
895: *
896: * To refresh NAT tables in a NAT router between the peers, periodic empty
897: * UDP packets are sent if no other traffic was sent.
898: *
899: * @param scheduled if this is a scheduled keepalive
900: */
901: void (*send_keepalive) (ike_sa_t *this, bool scheduled);
902:
903: /**
904: * Redirect an active IKE_SA.
905: *
906: * @param gateway gateway ID (IP or FQDN) of the target
907: * @return state, including DESTROY_ME, if this IKE_SA MUST be
908: * destroyed
909: */
910: status_t (*redirect)(ike_sa_t *this, identification_t *gateway);
911:
912: /**
913: * Handle a redirect request.
914: *
915: * The behavior is different depending on the state of the IKE_SA.
916: *
917: * @param gateway gateway ID (IP or FQDN) of the target
918: * @return FALSE if redirect not possible, TRUE otherwise
919: */
920: bool (*handle_redirect)(ike_sa_t *this, identification_t *gateway);
921:
922: /**
923: * Get the address of the gateway that redirected us.
924: *
925: * @return original gateway address
926: */
927: host_t *(*get_redirected_from)(ike_sa_t *this);
928:
929: /**
930: * Get the keying material of this IKE_SA.
931: *
932: * @return per IKE_SA keymat instance
933: */
934: keymat_t* (*get_keymat)(ike_sa_t *this);
935:
936: /**
937: * Associates a child SA to this IKE SA
938: *
939: * @param child_sa child_sa to add
940: */
941: void (*add_child_sa) (ike_sa_t *this, child_sa_t *child_sa);
942:
943: /**
944: * Get a CHILD_SA identified by protocol and SPI.
945: *
946: * @param protocol protocol of the SA
947: * @param spi SPI of the CHILD_SA
948: * @param inbound TRUE if SPI is inbound, FALSE if outbound
949: * @return child_sa, or NULL if none found
950: */
951: child_sa_t* (*get_child_sa) (ike_sa_t *this, protocol_id_t protocol,
952: uint32_t spi, bool inbound);
953:
954: /**
955: * Get the number of CHILD_SAs.
956: *
957: * @return number of CHILD_SAs
958: */
959: int (*get_child_count) (ike_sa_t *this);
960:
961: /**
962: * Create an enumerator over all CHILD_SAs.
963: *
964: * @return enumerator
965: */
966: enumerator_t* (*create_child_sa_enumerator) (ike_sa_t *this);
967:
968: /**
969: * Remove the CHILD_SA the given enumerator points to from this IKE_SA.
970: *
971: * @param enumerator enumerator pointing to CHILD_SA
972: */
973: void (*remove_child_sa) (ike_sa_t *this, enumerator_t *enumerator);
974:
975: /**
976: * Rekey the CHILD SA with the specified reqid.
977: *
978: * Looks for a CHILD SA owned by this IKE_SA, and start the rekeing.
979: *
980: * @param protocol protocol of the SA
981: * @param spi inbound SPI of the CHILD_SA
982: * @return
983: * - NOT_FOUND, if IKE_SA has no such CHILD_SA
984: * - SUCCESS, if rekeying initiated
985: */
986: status_t (*rekey_child_sa) (ike_sa_t *this, protocol_id_t protocol, uint32_t spi);
987:
988: /**
989: * Close the CHILD SA with the specified protocol/SPI.
990: *
991: * Looks for a CHILD SA owned by this IKE_SA, deletes it and
992: * notify's the remote peer about the delete. The associated
993: * states and policies in the kernel get deleted, if they exist.
994: *
995: * @param protocol protocol of the SA
996: * @param spi inbound SPI of the CHILD_SA
997: * @param expired TRUE if CHILD_SA is expired
998: * @return
999: * - NOT_FOUND, if IKE_SA has no such CHILD_SA
1000: * - SUCCESS, if delete message sent
1001: */
1002: status_t (*delete_child_sa)(ike_sa_t *this, protocol_id_t protocol,
1003: uint32_t spi, bool expired);
1004:
1005: /**
1006: * Destroy a CHILD SA with the specified protocol/SPI.
1007: *
1008: * Looks for a CHILD SA owned by this IKE_SA and destroys it.
1009: *
1010: * @param protocol protocol of the SA
1011: * @param spi inbound SPI of the CHILD_SA
1012: * @return
1013: * - NOT_FOUND, if IKE_SA has no such CHILD_SA
1014: * - SUCCESS
1015: */
1016: status_t (*destroy_child_sa) (ike_sa_t *this, protocol_id_t protocol, uint32_t spi);
1017:
1018: /**
1019: * Rekey the IKE_SA.
1020: *
1021: * Sets up a new IKE_SA, moves all CHILD_SAs to it and deletes this IKE_SA.
1022: *
1023: * @return - SUCCESS, if IKE_SA rekeying initiated
1024: */
1025: status_t (*rekey) (ike_sa_t *this);
1026:
1027: /**
1028: * Reauthenticate the IKE_SA.
1029: *
1030: * Triggers a new IKE_SA that replaces this one. IKEv1 implicitly inherits
1031: * all Quick Modes, while IKEv2 recreates all active and queued CHILD_SAs
1032: * in the new IKE_SA.
1033: *
1034: * @return DESTROY_ME to destroy the IKE_SA
1035: */
1036: status_t (*reauth) (ike_sa_t *this);
1037:
1038: /**
1039: * Reestablish the IKE_SA.
1040: *
1041: * Reestablish an IKE_SA after it has been closed.
1042: *
1043: * @return DESTROY_ME to destroy the IKE_SA
1044: */
1045: status_t (*reestablish) (ike_sa_t *this);
1046:
1047: /**
1048: * Set the lifetime limit received/to send in a AUTH_LIFETIME notify.
1049: *
1050: * If the IKE_SA is already ESTABLISHED, an INFORMATIONAL is sent with
1051: * an AUTH_LIFETIME notify. The call never fails on unestablished SAs.
1052: *
1053: * @param lifetime lifetime in seconds
1054: * @return DESTROY_ME to destroy the IKE_SA
1055: */
1056: status_t (*set_auth_lifetime)(ike_sa_t *this, uint32_t lifetime);
1057:
1058: /**
1059: * Add a virtual IP to use for this IKE_SA and its children.
1060: *
1061: * The virtual IP is assigned per IKE_SA, not per CHILD_SA. It has the same
1062: * lifetime as the IKE_SA.
1063: *
1064: * @param local TRUE to set local address, FALSE for remote
1065: * @param ip IP to set as virtual IP
1066: */
1067: void (*add_virtual_ip) (ike_sa_t *this, bool local, host_t *ip);
1068:
1069: /**
1070: * Clear all virtual IPs stored on this IKE_SA.
1071: *
1072: * @param local TRUE to clear local addresses, FALSE for remote
1073: */
1074: void (*clear_virtual_ips) (ike_sa_t *this, bool local);
1075:
1076: /**
1077: * Get interface ID to use as default for children of this IKE_SA.
1078: *
1079: * @param inbound TRUE for inbound interface ID
1080: * @return interface ID
1081: */
1082: uint32_t (*get_if_id)(ike_sa_t *this, bool inbound);
1083:
1084: /**
1085: * Create an enumerator over virtual IPs.
1086: *
1087: * @param local TRUE to get local virtual IP, FALSE for remote
1088: * @return enumerator over host_t*
1089: */
1090: enumerator_t* (*create_virtual_ip_enumerator) (ike_sa_t *this, bool local);
1091:
1092: /**
1093: * Register a configuration attribute to the IKE_SA.
1094: *
1095: * If an IRAS sends a configuration attribute it is installed and
1096: * registered at the IKE_SA. Attributes are inherit()ed and get released
1097: * when the IKE_SA is closed.
1098: *
1099: * Unhandled attributes are passed as well, but with a NULL handler. They
1100: * do not get released.
1101: *
1102: * @param handler handler installed the attribute, use for release()
1103: * @param type configuration attribute type
1104: * @param data associated attribute data
1105: */
1106: void (*add_configuration_attribute)(ike_sa_t *this,
1107: attribute_handler_t *handler,
1108: configuration_attribute_type_t type, chunk_t data);
1109:
1110: /**
1111: * Create an enumerator over received configuration attributes.
1112: *
1113: * The resulting enumerator is over the configuration_attribute_type_t type,
1114: * a value chunk_t followed by a bool flag. The boolean flag indicates if
1115: * the attribute has been handled by an attribute handler.
1116: *
1117: * @return enumerator over type, value and the "handled" flag.
1118: */
1119: enumerator_t* (*create_attribute_enumerator)(ike_sa_t *this);
1120:
1121: /**
1122: * Set local and remote host addresses to be used for IKE.
1123: *
1124: * These addresses are communicated via the KMADDRESS field of a MIGRATE
1125: * message sent via the NETLINK or PF _KEY kernel socket interface.
1126: *
1127: * @param local local kmaddress
1128: * @param remote remote kmaddress
1129: */
1130: void (*set_kmaddress) (ike_sa_t *this, host_t *local, host_t *remote);
1131:
1132: /**
1133: * Create enumerator over a task queue of this IKE_SA.
1134: *
1135: * @param queue type to enumerate
1136: * @return enumerator over task_t
1137: */
1138: enumerator_t* (*create_task_enumerator)(ike_sa_t *this, task_queue_t queue);
1139:
1140: /**
1141: * Remove the task the given enumerator points to.
1142: *
1143: * @note This should be used with caution, in particular, for tasks in the
1144: * active and passive queues.
1145: *
1146: * @param enumerator enumerator created with the method above
1147: */
1148: void (*remove_task)(ike_sa_t *this, enumerator_t *enumerator);
1149:
1150: /**
1151: * Flush a task queue, cancelling all tasks in it.
1152: *
1153: * @param queue queue type to flush
1154: */
1155: void (*flush_queue)(ike_sa_t *this, task_queue_t queue);
1156:
1157: /**
1158: * Queue a task for initiation to the task manager.
1159: *
1160: * @param task task to queue
1161: */
1162: void (*queue_task)(ike_sa_t *this, task_t *task);
1163:
1164: /**
1165: * Queue a task in the manager, but delay its initiation for at least the
1166: * given number of seconds.
1167: *
1168: * @param task task to queue
1169: * @param delay minimum delay in s before initiating the task
1170: */
1171: void (*queue_task_delayed)(ike_sa_t *this, task_t *task, uint32_t delay);
1172:
1173: /**
1174: * Adopt child creating tasks from the given IKE_SA.
1175: *
1176: * @param other other IKE_SA to adopt tasks from
1177: */
1178: void (*adopt_child_tasks)(ike_sa_t *this, ike_sa_t *other);
1179:
1180: /**
1181: * Inherit required attributes to new SA before rekeying.
1182: *
1183: * Some properties of the SA must be applied before starting IKE_SA
1184: * rekeying, such as the configuration or support extensions.
1185: *
1186: * @param other other IKE_SA to inherit from
1187: */
1188: void (*inherit_pre)(ike_sa_t *this, ike_sa_t *other);
1189:
1190: /**
1191: * Inherit all attributes of other to this after rekeying.
1192: *
1193: * When rekeying is completed, all CHILD_SAs, the virtual IP and all
1194: * outstanding tasks are moved from other to this.
1195: *
1196: * @param other other IKE SA to inherit from
1197: */
1198: void (*inherit_post) (ike_sa_t *this, ike_sa_t *other);
1199:
1200: /**
1201: * Reset the IKE_SA, usable when initiating fails.
1202: *
1203: * @param new_spi TRUE to allocate a new initiator SPI
1204: */
1205: void (*reset) (ike_sa_t *this, bool new_spi);
1206:
1207: /**
1208: * Destroys a ike_sa_t object.
1209: */
1210: void (*destroy) (ike_sa_t *this);
1211: };
1212:
1213: /**
1214: * Creates an ike_sa_t object with a specific ID and IKE version.
1215: *
1216: * @param ike_sa_id ike_sa_id_t to associate with new IKE_SA/ISAKMP_SA
1217: * @param initiator TRUE to create this IKE_SA as initiator
1218: * @param version IKE version of this SA
1219: * @return ike_sa_t object
1220: */
1221: ike_sa_t *ike_sa_create(ike_sa_id_t *ike_sa_id, bool initiator,
1222: ike_version_t version);
1223:
1224: #endif /** IKE_SA_H_ @}*/
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>