Annotation of embedaddon/strongswan/src/libcharon/config/peer_cfg.h, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2007-2019 Tobias Brunner
                      3:  * Copyright (C) 2005-2009 Martin Willi
                      4:  * Copyright (C) 2005 Jan Hutter
                      5:  * HSR Hochschule fuer Technik Rapperswil
                      6:  *
                      7:  * This program is free software; you can redistribute it and/or modify it
                      8:  * under the terms of the GNU General Public License as published by the
                      9:  * Free Software Foundation; either version 2 of the License, or (at your
                     10:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
                     11:  *
                     12:  * This program is distributed in the hope that it will be useful, but
                     13:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     14:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
                     15:  * for more details.
                     16:  */
                     17: 
                     18: /**
                     19:  * @defgroup peer_cfg peer_cfg
                     20:  * @{ @ingroup config
                     21:  */
                     22: 
                     23: #ifndef PEER_CFG_H_
                     24: #define PEER_CFG_H_
                     25: 
                     26: typedef enum cert_policy_t cert_policy_t;
                     27: typedef enum unique_policy_t unique_policy_t;
                     28: typedef struct peer_cfg_t peer_cfg_t;
                     29: typedef struct peer_cfg_create_t peer_cfg_create_t;
                     30: 
                     31: #include <library.h>
                     32: #include <utils/identification.h>
                     33: #include <collections/enumerator.h>
                     34: #include <selectors/traffic_selector.h>
                     35: #include <crypto/proposal/proposal.h>
                     36: #include <config/ike_cfg.h>
                     37: #include <config/child_cfg.h>
                     38: #include <credentials/auth_cfg.h>
                     39: 
                     40: /**
                     41:  * Certificate sending policy. This is also used for certificate
                     42:  * requests when using this definition for the other peer. If
                     43:  * it is CERT_NEVER_SEND, a certreq is omitted, otherwise its
                     44:  * included.
                     45:  *
                     46:  * @warning These definitions must be the same as in pluto/starter,
                     47:  * as they are sent over the stroke socket.
                     48:  */
                     49: enum cert_policy_t {
                     50:        /** always send certificates, even when not requested */
                     51:        CERT_ALWAYS_SEND =              0,
                     52:        /** send certificate upon cert request */
                     53:        CERT_SEND_IF_ASKED =    1,
                     54:        /** never send a certificate, even when requested */
                     55:        CERT_NEVER_SEND =               2,
                     56: };
                     57: 
                     58: /**
                     59:  * enum strings for cert_policy_t
                     60:  */
                     61: extern enum_name_t *cert_policy_names;
                     62: 
                     63: /**
                     64:  * Uniqueness of an IKE_SA, used to drop multiple connections with one peer.
                     65:  */
                     66: enum unique_policy_t {
                     67:        /** never check for client uniqueness */
                     68:        UNIQUE_NEVER,
                     69:        /** only check for client uniqueness when receiving an INITIAL_CONTACT */
                     70:        UNIQUE_NO,
                     71:        /** replace existing IKE_SAs when new ones get established by a client */
                     72:        UNIQUE_REPLACE,
                     73:        /** keep existing IKE_SAs, close the new ones on connection attempt */
                     74:        UNIQUE_KEEP,
                     75: };
                     76: 
                     77: /**
                     78:  * enum strings for unique_policy_t
                     79:  */
                     80: extern enum_name_t *unique_policy_names;
                     81: 
                     82: /**
                     83:  * Configuration of a peer, specified by IDs.
                     84:  *
                     85:  * The peer config defines a connection between two given IDs. It contains
                     86:  * exactly one ike_cfg_t, which is used for initiation. Additionally, it
                     87:  * contains multiple child_cfg_t defining which CHILD_SAs are allowed for this
                     88:  * peer.
                     89:  * @verbatim
                     90:                           +-------------------+        +---------------+
                     91:    +---------------+      |     peer_cfg      |      +---------------+ |
                     92:    |    ike_cfg    |      +-------------------+      |   child_cfg   | |
                     93:    +---------------+      | - ids             |      +---------------+ |
                     94:    | - hosts       | 1  1 | - cas             | 1  n | - proposals   | |
                     95:    | - proposals   |<-----| - auth info       |----->| - traffic sel | |
                     96:    | - ...         |      | - dpd config      |      | - ...         |-+
                     97:    +---------------+      | - ...             |      +---------------+
                     98:                           +-------------------+
                     99:                              | 1         0 |
                    100:                              |             |
                    101:                              v n         n V
                    102:              +-------------------+     +-------------------+
                    103:            +-------------------+ |   +-------------------+ |
                    104:            |     auth_cfg      | |   |     auth_cfg      | |
                    105:            +-------------------+ |   +-------------------+ |
                    106:            | - local rules     |-+   | - remote constr.  |-+
                    107:            +-------------------+     +-------------------+
                    108:    @endverbatim
                    109:  *
                    110:  * Each peer_cfg has two lists of authentication config attached. Local
                    111:  * authentication configs define how to authenticate ourself against the remote
                    112:  * peer. Each config is enforced using the multiple authentication extension
                    113:  * (RFC4739).
                    114:  * The remote authentication configs are handled as constraints. The peer has
                    115:  * to fulfill each of these rules (using multiple authentication, in any order)
                    116:  * to gain access to the configuration.
                    117:  */
                    118: struct peer_cfg_t {
                    119: 
                    120:        /**
                    121:         * Get the name of the peer_cfg.
                    122:         *
                    123:         * Returned object is not getting cloned.
                    124:         *
                    125:         * @return                              peer_cfg's name
                    126:         */
                    127:        char* (*get_name) (peer_cfg_t *this);
                    128: 
                    129:        /**
                    130:         * Get the IKE version to use for initiating.
                    131:         *
                    132:         * @return                              IKE major version
                    133:         */
                    134:        ike_version_t (*get_ike_version)(peer_cfg_t *this);
                    135: 
                    136:        /**
                    137:         * Get the IKE config to use for initiation.
                    138:         *
                    139:         * @return                              the IKE config to use
                    140:         */
                    141:        ike_cfg_t* (*get_ike_cfg) (peer_cfg_t *this);
                    142: 
                    143:        /**
                    144:         * Attach a CHILD config.
                    145:         *
                    146:         * @param child_cfg             CHILD config to add
                    147:         */
                    148:        void (*add_child_cfg) (peer_cfg_t *this, child_cfg_t *child_cfg);
                    149: 
                    150:        /**
                    151:         * Detach a CHILD config, pointed to by an enumerator.
                    152:         *
                    153:         * @param enumerator    enumerator indicating element position
                    154:         */
                    155:        void (*remove_child_cfg)(peer_cfg_t *this, enumerator_t *enumerator);
                    156: 
                    157:        /**
                    158:         * Replace the CHILD configs with those in the given PEER config.
                    159:         *
                    160:         * The enumerator enumerates the removed and added CHILD configs
                    161:         * (child_cfg_t*, bool), where the flag is FALSE for removed configs and
                    162:         * TRUE for added configs. Configs that are equal are not enumerated.
                    163:         *
                    164:         * @param other                 other config to get CHILD configs from
                    165:         * @return                              an enumerator over removed/added CHILD configs
                    166:         */
                    167:        enumerator_t* (*replace_child_cfgs)(peer_cfg_t *this, peer_cfg_t *other);
                    168: 
                    169:        /**
                    170:         * Create an enumerator for all attached CHILD configs.
                    171:         *
                    172:         * @return                              an enumerator over all CHILD configs.
                    173:         */
                    174:        enumerator_t* (*create_child_cfg_enumerator) (peer_cfg_t *this);
                    175: 
                    176:        /**
                    177:         * Select a CHILD config from traffic selectors.
                    178:         *
                    179:         * @param my_ts                 TS for local side
                    180:         * @param other_ts              TS for remote side
                    181:         * @param my_hosts              hosts to narrow down dynamic TS for local side
                    182:         * @param other_hosts   hosts to narrow down dynamic TS for remote side
                    183:         * @return                              selected CHILD config, or NULL if no match found
                    184:         */
                    185:        child_cfg_t* (*select_child_cfg) (peer_cfg_t *this,
                    186:                                                        linked_list_t *my_ts, linked_list_t *other_ts,
                    187:                                                        linked_list_t *my_hosts, linked_list_t *other_hosts);
                    188: 
                    189:        /**
                    190:         * Add an authentication config to the peer configuration.
                    191:         *
                    192:         * @param cfg                   config to add
                    193:         * @param local                 TRUE for local rules, FALSE for remote constraints
                    194:         */
                    195:        void (*add_auth_cfg)(peer_cfg_t *this, auth_cfg_t *cfg, bool local);
                    196: 
                    197:        /**
                    198:         * Create an enumerator over registered authentication configs.
                    199:         *
                    200:         * @param local                 TRUE for local rules, FALSE for remote constraints
                    201:         * @return                              enumerator over auth_cfg_t*
                    202:         */
                    203:        enumerator_t* (*create_auth_cfg_enumerator)(peer_cfg_t *this, bool local);
                    204: 
                    205:        /**
                    206:         * Should a certificate be sent for this connection?
                    207:         *
                    208:         * @return                      certificate sending policy
                    209:         */
                    210:        cert_policy_t (*get_cert_policy) (peer_cfg_t *this);
                    211: 
                    212:        /**
                    213:         * How to handle uniqueness of IKE_SAs?
                    214:         *
                    215:         * @return                      unique policy
                    216:         */
                    217:        unique_policy_t (*get_unique_policy) (peer_cfg_t *this);
                    218: 
                    219:        /**
                    220:         * Get the max number of retries after timeout.
                    221:         *
                    222:         * @return                      max number retries
                    223:         */
                    224:        uint32_t (*get_keyingtries) (peer_cfg_t *this);
                    225: 
                    226:        /**
                    227:         * Get a time to start rekeying.
                    228:         *
                    229:         * @param jitter        subtract a jitter value to randomize time
                    230:         * @return                      time in s when to start rekeying, 0 disables rekeying
                    231:         */
                    232:        uint32_t (*get_rekey_time)(peer_cfg_t *this, bool jitter);
                    233: 
                    234:        /**
                    235:         * Get a time to start reauthentication.
                    236:         *
                    237:         * @param jitter        subtract a jitter value to randomize time
                    238:         * @return                      time in s when to start reauthentication, 0 disables it
                    239:         */
                    240:        uint32_t (*get_reauth_time)(peer_cfg_t *this, bool jitter);
                    241: 
                    242:        /**
                    243:         * Get the timeout of a rekeying/reauthenticating SA.
                    244:         *
                    245:         * @return                      timeout in s
                    246:         */
                    247:        uint32_t (*get_over_time)(peer_cfg_t *this);
                    248: 
                    249:        /**
                    250:         * Use MOBIKE (RFC4555) if peer supports it?
                    251:         *
                    252:         * @return                      TRUE to enable MOBIKE support
                    253:         */
                    254:        bool (*use_mobike) (peer_cfg_t *this);
                    255: 
                    256:        /**
                    257:         * Use/Accept aggressive mode with IKEv1?.
                    258:         *
                    259:         * @return                      TRUE to use aggressive mode
                    260:         */
                    261:        bool (*use_aggressive)(peer_cfg_t *this);
                    262: 
                    263:        /**
                    264:         * Use pull or push mode for mode config?
                    265:         *
                    266:         * @return                      TRUE to use pull, FALSE to use push mode
                    267:         */
                    268:        bool (*use_pull_mode)(peer_cfg_t *this);
                    269: 
                    270:        /**
                    271:         * Get the DPD check interval.
                    272:         *
                    273:         * @return                      dpd_delay in seconds
                    274:         */
                    275:        uint32_t (*get_dpd) (peer_cfg_t *this);
                    276: 
                    277:        /**
                    278:         * Get the DPD timeout interval (IKEv1 only)
                    279:         *
                    280:         * @return                      dpd_timeout in seconds
                    281:         */
                    282:        uint32_t (*get_dpd_timeout) (peer_cfg_t *this);
                    283: 
                    284:        /**
                    285:         * Add a virtual IP to request as initiator.
                    286:         *
                    287:         * @param vip                   virtual IP to request, may be %any or %any6
                    288:         */
                    289:        void (*add_virtual_ip)(peer_cfg_t *this, host_t *vip);
                    290: 
                    291:        /**
                    292:         * Create an enumerator over virtual IPs to request.
                    293:         *
                    294:         * The returned enumerator enumerates over IPs added with add_virtual_ip().
                    295:         *
                    296:         * @return                              enumerator over host_t*
                    297:         */
                    298:        enumerator_t* (*create_virtual_ip_enumerator)(peer_cfg_t *this);
                    299: 
                    300:        /**
                    301:         * Add a pool name this configuration uses to select virtual IPs.
                    302:         *
                    303:         * @param name                  pool name to use for virtual IP lookup
                    304:         */
                    305:        void (*add_pool)(peer_cfg_t *this, char *name);
                    306: 
                    307:        /**
                    308:         * Create an enumerator over pool names of this config.
                    309:         *
                    310:         * @return                              enumerator over char*
                    311:         */
                    312:        enumerator_t* (*create_pool_enumerator)(peer_cfg_t *this);
                    313: 
                    314:        /**
                    315:         * Optional interface ID to set on policies/SAs.
                    316:         *
                    317:         * @param inbound               TRUE for inbound, FALSE for outbound
                    318:         * @return                              interface ID
                    319:         */
                    320:        uint32_t (*get_if_id)(peer_cfg_t *this, bool inbound);
                    321: 
                    322:        /**
                    323:         * Get the PPK ID to use with this peer.
                    324:         *
                    325:         * @return                              PPK id
                    326:         */
                    327:        identification_t *(*get_ppk_id)(peer_cfg_t *this);
                    328: 
                    329:        /**
                    330:         * Whether a PPK is required with this peer.
                    331:         *
                    332:         * @return                              TRUE, if a PPK is required
                    333:         */
                    334:        bool (*ppk_required)(peer_cfg_t *this);
                    335: 
                    336: #ifdef ME
                    337:        /**
                    338:         * Is this a mediation connection?
                    339:         *
                    340:         * @return                              TRUE, if this is a mediation connection
                    341:         */
                    342:        bool (*is_mediation)(peer_cfg_t *this);
                    343: 
                    344:        /**
                    345:         * Get name of the connection this one is mediated through.
                    346:         *
                    347:         * @return                              the name of the mediation connection
                    348:         */
                    349:        char* (*get_mediated_by)(peer_cfg_t *this);
                    350: 
                    351:        /**
                    352:         * Get the id of the other peer at the mediation server.
                    353:         *
                    354:         * This is the leftid of the peer's connection with the mediation server.
                    355:         *
                    356:         * If it is not configured, it is assumed to be the same as the right id
                    357:         * of this connection.
                    358:         *
                    359:         * @return                              the id of the other peer
                    360:         */
                    361:        identification_t* (*get_peer_id)(peer_cfg_t *this);
                    362: #endif /* ME */
                    363: 
                    364:        /**
                    365:         * Check if two peer configurations are equal.
                    366:         *
                    367:         * This method does not compare associated ike/child_cfg.
                    368:         *
                    369:         * @param other                 candidate to check for equality against this
                    370:         * @return                              TRUE if peer_cfg and ike_cfg are equal
                    371:         */
                    372:        bool (*equals)(peer_cfg_t *this, peer_cfg_t *other);
                    373: 
                    374:        /**
                    375:         * Increase reference count.
                    376:         *
                    377:         * @return                              reference to this
                    378:         */
                    379:        peer_cfg_t* (*get_ref) (peer_cfg_t *this);
                    380: 
                    381:        /**
                    382:         * Destroys the peer_cfg object.
                    383:         *
                    384:         * Decrements the internal reference counter and
                    385:         * destroys the peer_cfg when it reaches zero.
                    386:         */
                    387:        void (*destroy) (peer_cfg_t *this);
                    388: };
                    389: 
                    390: /**
                    391:  * Data passed to the constructor of a peer_cfg_t object.
                    392:  */
                    393: struct peer_cfg_create_t {
                    394:        /** Whether to send a certificate payload */
                    395:        cert_policy_t cert_policy;
                    396:        /** Uniqueness of an IKE_SA */
                    397:        unique_policy_t unique;
                    398:        /** How many keying tries should be done before giving up */
                    399:        uint32_t keyingtries;
                    400:        /** Timeout in seconds before starting rekeying */
                    401:        uint32_t rekey_time;
                    402:        /** Timeout in seconds before starting reauthentication */
                    403:        uint32_t reauth_time;
                    404:        /** Time range in seconds to randomly subtract from rekey/reauth time */
                    405:        uint32_t jitter_time;
                    406:        /** Maximum overtime in seconds before closing a rekeying/reauth SA */
                    407:        uint32_t over_time;
                    408:        /** Disable MOBIKE (RFC4555) */
                    409:        bool no_mobike;
                    410:        /** Use/accept aggressive mode with IKEv1 */
                    411:        bool aggressive;
                    412:        /** TRUE to use modeconfig push, FALSE for pull */
                    413:        bool push_mode;
                    414:        /** DPD check interval, 0 to disable */
                    415:        uint32_t dpd;
                    416:        /** DPD timeout interval (IKEv1 only), if 0 default applies */
                    417:        uint32_t dpd_timeout;
                    418:        /** Optional inbound interface ID */
                    419:        uint32_t if_id_in;
                    420:        /** Optional outbound interface ID */
                    421:        uint32_t if_id_out;
                    422:        /** Postquantum Preshared Key ID (adopted) */
                    423:        identification_t *ppk_id;
                    424:        /** TRUE if a PPK is required, FALSE if it's optional */
                    425:        bool ppk_required;
                    426: #ifdef ME
                    427:        /** TRUE if this is a mediation connection */
                    428:        bool mediation;
                    429:        /** peer_cfg_t of the mediation connection to mediate through (cloned) */
                    430:        char *mediated_by;
                    431:        /** ID that identifies our peer at the mediation server (adopted) */
                    432:        identification_t *peer_id;
                    433: #endif /* ME */
                    434: };
                    435: 
                    436: /**
                    437:  * Create a configuration object for IKE_AUTH and later.
                    438:  *
                    439:  * @param name                         name of the peer_cfg (cloned)
                    440:  * @param ike_cfg                      IKE config to use when acting as initiator (adopted)
                    441:  * @param data                         data for this peer_cfg
                    442:  * @return                                     peer_cfg_t object
                    443:  */
                    444: peer_cfg_t *peer_cfg_create(char *name, ike_cfg_t *ike_cfg,
                    445:                                                        peer_cfg_create_t *data);
                    446: 
                    447: #endif /** PEER_CFG_H_ @}*/

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>