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

1.1       misho       1: /*
                      2:  * Copyright (C) 2012-2019 Tobias Brunner
                      3:  * Copyright (C) 2005-2007 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 ike_cfg ike_cfg
                     20:  * @{ @ingroup config
                     21:  */
                     22: 
                     23: #ifndef IKE_CFG_H_
                     24: #define IKE_CFG_H_
                     25: 
                     26: typedef enum ike_version_t ike_version_t;
                     27: typedef enum fragmentation_t fragmentation_t;
                     28: typedef enum childless_t childless_t;
                     29: typedef struct ike_cfg_t ike_cfg_t;
                     30: typedef struct ike_cfg_create_t ike_cfg_create_t;
                     31: 
                     32: #include <library.h>
                     33: #include <networking/host.h>
                     34: #include <collections/linked_list.h>
                     35: #include <utils/identification.h>
                     36: #include <crypto/proposal/proposal.h>
                     37: #include <crypto/diffie_hellman.h>
                     38: 
                     39: /**
                     40:  * IKE version.
                     41:  */
                     42: enum ike_version_t {
                     43:        /** any version */
                     44:        IKE_ANY = 0,
                     45:        /** IKE version 1 */
                     46:        IKEV1 = 1,
                     47:        /** IKE version 2 */
                     48:        IKEV2 = 2,
                     49: };
                     50: 
                     51: /**
                     52:  * Proprietary IKEv1 fragmentation and IKEv2 fragmentation
                     53:  */
                     54: enum fragmentation_t {
                     55:        /** disable fragmentation */
                     56:        FRAGMENTATION_NO,
                     57:        /** announce support, but don't send any fragments */
                     58:        FRAGMENTATION_ACCEPT,
                     59:        /** enable fragmentation, if supported by peer */
                     60:        FRAGMENTATION_YES,
                     61:        /** force use of fragmentation (even for the first message for IKEv1) */
                     62:        FRAGMENTATION_FORCE,
                     63: };
                     64: 
                     65: /**
                     66:  * Childless IKE_SAs (RFC 6023)
                     67:  */
                     68: enum childless_t {
                     69:        /** Allow childless IKE_SAs as responder, but initiate regular IKE_SAs */
                     70:        CHILDLESS_ALLOW,
                     71:        /** Don't accept childless IKE_SAs as responder, don't initiate them */
                     72:        CHILDLESS_NEVER,
                     73:        /** Only accept the creation of childless IKE_SAs (also as responder) */
                     74:        CHILDLESS_FORCE,
                     75: };
                     76: 
                     77: /**
                     78:  * enum strings for ike_version_t
                     79:  */
                     80: extern enum_name_t *ike_version_names;
                     81: 
                     82: /**
                     83:  * An ike_cfg_t defines the rules to set up an IKE_SA.
                     84:  *
                     85:  * @see peer_cfg_t to get an overview over the configurations.
                     86:  */
                     87: struct ike_cfg_t {
                     88: 
                     89:        /**
                     90:         * Get the IKE version to use with this configuration.
                     91:         *
                     92:         * @return                              IKE major version
                     93:         */
                     94:        ike_version_t (*get_version)(ike_cfg_t *this);
                     95: 
                     96:        /**
                     97:         * Resolve the local address to use for initiation.
                     98:         *
                     99:         * @param family                address family to prefer, or AF_UNSPEC
                    100:         * @return                              resolved host, NULL on error
                    101:         */
                    102:        host_t* (*resolve_me)(ike_cfg_t *this, int family);
                    103: 
                    104:        /**
                    105:         * Resolve the remote address to use for initiation.
                    106:         *
                    107:         * @param family                address family to prefer, or AF_UNSPEC
                    108:         * @return                              resolved host, NULL on error
                    109:         */
                    110:        host_t* (*resolve_other)(ike_cfg_t *this, int family);
                    111: 
                    112:        /**
                    113:         * Check how good a host matches to the configured local address.
                    114:         *
                    115:         * @param host                  host to check match quality
                    116:         * @return                              quality of the match, 0 if not matching at all
                    117:         */
                    118:        u_int (*match_me)(ike_cfg_t *this, host_t *host);
                    119: 
                    120:        /**
                    121:         * Check how good a host matches to the configured remote address.
                    122:         *
                    123:         * @param host                  host to check match quality
                    124:         * @return                              quality of the match, 0 if not matching at all
                    125:         */
                    126:        u_int (*match_other)(ike_cfg_t *this, host_t *host);
                    127: 
                    128:        /**
                    129:         * Get own address.
                    130:         *
                    131:         * @return                              string of address/DNS name
                    132:         */
                    133:        char* (*get_my_addr) (ike_cfg_t *this);
                    134: 
                    135:        /**
                    136:         * Get peer's address.
                    137:         *
                    138:         * @return                              string of address/DNS name
                    139:         */
                    140:        char* (*get_other_addr) (ike_cfg_t *this);
                    141: 
                    142:        /**
                    143:         * Get the port to use as our source port.
                    144:         *
                    145:         * @return                              source address port, host order
                    146:         */
                    147:        uint16_t (*get_my_port)(ike_cfg_t *this);
                    148: 
                    149:        /**
                    150:         * Get the port to use as destination port.
                    151:         *
                    152:         * @return                              destination address, host order
                    153:         */
                    154:        uint16_t (*get_other_port)(ike_cfg_t *this);
                    155: 
                    156:        /**
                    157:         * Get the DSCP value to use for IKE packets send from connections.
                    158:         *
                    159:         * @return                              DSCP value
                    160:         */
                    161:        uint8_t (*get_dscp)(ike_cfg_t *this);
                    162: 
                    163:        /**
                    164:         * Adds a proposal to the list.
                    165:         *
                    166:         * The first added proposal has the highest priority, the last
                    167:         * added the lowest. It is safe to add NULL as proposal, which has no
                    168:         * effect.
                    169:         *
                    170:         * @param proposal              proposal to add, or NULL
                    171:         */
                    172:        void (*add_proposal) (ike_cfg_t *this, proposal_t *proposal);
                    173: 
                    174:        /**
                    175:         * Returns a list of all supported proposals.
                    176:         *
                    177:         * Returned list and its proposals must be destroyed after use.
                    178:         *
                    179:         * @return                              list containing all the proposals
                    180:         */
                    181:        linked_list_t* (*get_proposals) (ike_cfg_t *this);
                    182: 
                    183:        /**
                    184:         * Select a proposal from a list of supplied proposals.
                    185:         *
                    186:         * Returned proposal must be destroyed after use.
                    187:         *
                    188:         * @param proposals             list of proposals to select from
                    189:         * @param flags                 flags to consider during proposal selection
                    190:         * @return                              selected proposal, or NULL if none matches.
                    191:         */
                    192:        proposal_t *(*select_proposal) (ike_cfg_t *this, linked_list_t *proposals,
                    193:                                                                        proposal_selection_flag_t flags);
                    194: 
                    195:        /**
                    196:         * Check if the config has a matching proposal.
                    197:         *
                    198:         * @param match                 proposal to check
                    199:         * @param private               accept algorithms from a private range
                    200:         * @return                              TRUE if a matching proposal is contained
                    201:         */
                    202:        bool(*has_proposal)(ike_cfg_t *this, proposal_t *match, bool private);
                    203: 
                    204:        /**
                    205:         * Should we send a certificate request in IKE_SA_INIT?
                    206:         *
                    207:         * @return                              certificate request sending policy
                    208:         */
                    209:        bool (*send_certreq) (ike_cfg_t *this);
                    210: 
                    211:        /**
                    212:         * Enforce UDP encapsulation by faking NATD notifies?
                    213:         *
                    214:         * @return                              TRUE to enforce UDP encapsulation
                    215:         */
                    216:        bool (*force_encap) (ike_cfg_t *this);
                    217: 
                    218:        /**
                    219:         * Use IKE fragmentation
                    220:         *
                    221:         * @return                              TRUE to use fragmentation
                    222:         */
                    223:        fragmentation_t (*fragmentation) (ike_cfg_t *this);
                    224: 
                    225:        /**
                    226:         * Whether to initiate/accept childless IKE_SAs
                    227:         *
                    228:         * @return                              initiate/accept childless IKE_SAs
                    229:         */
                    230:        childless_t (*childless)(ike_cfg_t *this);
                    231: 
                    232:        /**
                    233:         * Get the DH group to use for IKE_SA setup.
                    234:         *
                    235:         * @return                              dh group to use for initialization
                    236:         */
                    237:        diffie_hellman_group_t (*get_dh_group)(ike_cfg_t *this);
                    238: 
                    239:        /**
                    240:         * Check if two IKE configs are equal.
                    241:         *
                    242:         * @param other                 other to check for equality
                    243:         * @return                              TRUE if other equal to this
                    244:         */
                    245:        bool (*equals)(ike_cfg_t *this, ike_cfg_t *other);
                    246: 
                    247:        /**
                    248:         * Increase reference count.
                    249:         *
                    250:         * @return                              reference to this
                    251:         */
                    252:        ike_cfg_t* (*get_ref) (ike_cfg_t *this);
                    253: 
                    254:        /**
                    255:         * Destroys a ike_cfg_t object.
                    256:         *
                    257:         * Decrements the internal reference counter and
                    258:         * destroys the ike_cfg when it reaches zero.
                    259:         */
                    260:        void (*destroy) (ike_cfg_t *this);
                    261: };
                    262: 
                    263: /**
                    264:  * Data passed to the constructor of an ike_cfg_t object.
                    265:  *
                    266:  * local and remote are comma separated lists of IP addresses, DNS names,
                    267:  * IP ranges or subnets. When initiating, the first non-range/subnet address is
                    268:  * used as address. When responding, a match is performed against all items in
                    269:  * the list.
                    270:  */
                    271: struct ike_cfg_create_t {
                    272:        /** IKE major version to use for this config */
                    273:        ike_version_t version;
                    274:        /** Address/DNS name of local peer (cloned) */
                    275:        char *local;
                    276:        /** IKE port to use as source, 500 uses IKEv2 port floating */
                    277:        uint16_t local_port;
                    278:        /** Address/DNS name of remote peer (cloned) */
                    279:        char *remote;
                    280:        /** IKE port to use as dest, 500 uses IKEv2 port floating */
                    281:        uint16_t remote_port;
                    282:        /** TRUE to not send any certificate requests */
                    283:        bool no_certreq;
                    284:        /** Enforce UDP encapsulation by faking NATD notify */
                    285:        bool force_encap;
                    286:        /** Use IKE fragmentation */
                    287:        fragmentation_t fragmentation;
                    288:        /** Childless IKE_SA configuration */
                    289:        childless_t childless;
                    290:        /** DSCP value to send IKE packets with */
                    291:        uint8_t dscp;
                    292: };
                    293: 
                    294: /**
                    295:  * Creates an ike_cfg_t object.
                    296:  *
                    297:  * @param data                         data for this ike_cfg
                    298:  * @return                                     ike_cfg_t object.
                    299:  */
                    300: ike_cfg_t *ike_cfg_create(ike_cfg_create_t *data);
                    301: 
                    302: /**
                    303:  * Determine the address family of the local or remote address(es).  If multiple
                    304:  * families are configured AF_UNSPEC is returned.  %any is ignored (%any4|6 are
                    305:  * not though).
                    306:  *
                    307:  * @param this                         ike config to check
                    308:  * @param local                                TRUE to check local addresses, FALSE for remote
                    309:  * @return                                     address family of address(es) if distinct
                    310:  */
                    311: int ike_cfg_get_family(ike_cfg_t *this, bool local);
                    312: 
                    313: /**
                    314:  * Determine if the given address was explicitly configured as local or remote
                    315:  * address.
                    316:  *
                    317:  * @param this                         ike config to check
                    318:  * @param addr                         address to check
                    319:  * @param local                                TRUE to check local addresses, FALSE for remote
                    320:  * @return                                     TRUE if address was configured
                    321:  */
                    322: bool ike_cfg_has_address(ike_cfg_t *this, host_t *addr, bool local);
                    323: 
                    324: #endif /** IKE_CFG_H_ @}*/

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