Annotation of embedaddon/strongswan/src/libcharon/sa/child_sa.h, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2006-2019 Tobias Brunner
                      3:  * Copyright (C) 2006-2008 Martin Willi
                      4:  * Copyright (C) 2006 Daniel Roethlisberger
                      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 child_sa child_sa
                     20:  * @{ @ingroup sa
                     21:  */
                     22: 
                     23: #ifndef CHILD_SA_H_
                     24: #define CHILD_SA_H_
                     25: 
                     26: typedef enum child_sa_state_t child_sa_state_t;
                     27: typedef enum child_sa_outbound_state_t child_sa_outbound_state_t;
                     28: typedef struct child_sa_t child_sa_t;
                     29: typedef struct child_sa_create_t child_sa_create_t;
                     30: 
                     31: #include <library.h>
                     32: #include <crypto/prf_plus.h>
                     33: #include <encoding/payloads/proposal_substructure.h>
                     34: #include <crypto/proposal/proposal.h>
                     35: #include <config/child_cfg.h>
                     36: 
                     37: /**
                     38:  * States of a CHILD_SA
                     39:  */
                     40: enum child_sa_state_t {
                     41: 
                     42:        /**
                     43:         * Just created, uninstalled CHILD_SA
                     44:         */
                     45:        CHILD_CREATED,
                     46: 
                     47:        /**
                     48:         * Installed SPD, but no SAD entries
                     49:         */
                     50:        CHILD_ROUTED,
                     51: 
                     52:        /**
                     53:         * Installing an in-use CHILD_SA
                     54:         */
                     55:        CHILD_INSTALLING,
                     56: 
                     57:        /**
                     58:         * Installed both SAs of a CHILD_SA
                     59:         */
                     60:        CHILD_INSTALLED,
                     61: 
                     62:        /**
                     63:         * While updating hosts, in update_hosts()
                     64:         */
                     65:        CHILD_UPDATING,
                     66: 
                     67:        /**
                     68:         * CHILD_SA which is rekeying
                     69:         */
                     70:        CHILD_REKEYING,
                     71: 
                     72:        /**
                     73:         * CHILD_SA that was rekeyed, but stays installed
                     74:         */
                     75:        CHILD_REKEYED,
                     76: 
                     77:        /**
                     78:         * CHILD_SA negotiation failed, but gets retried
                     79:         */
                     80:        CHILD_RETRYING,
                     81: 
                     82:        /**
                     83:         * CHILD_SA in progress of delete
                     84:         */
                     85:        CHILD_DELETING,
                     86: 
                     87:        /**
                     88:         * CHILD_SA has been deleted, but not yet destroyed
                     89:         */
                     90:        CHILD_DELETED,
                     91: 
                     92:        /**
                     93:         * CHILD_SA object gets destroyed
                     94:         */
                     95:        CHILD_DESTROYING,
                     96: };
                     97: 
                     98: /**
                     99:  * enum strings for child_sa_state_t.
                    100:  */
                    101: extern enum_name_t *child_sa_state_names;
                    102: 
                    103: /**
                    104:  * States of the outbound SA of a CHILD_SA
                    105:  */
                    106: enum child_sa_outbound_state_t {
                    107: 
                    108:        /**
                    109:         * Outbound SA is not installed
                    110:         */
                    111:        CHILD_OUTBOUND_NONE = 0,
                    112: 
                    113:        /**
                    114:         * Data for the outbound SA has been registered during a rekeying (not set
                    115:         * once the SA and policies are both installed)
                    116:         */
                    117:        CHILD_OUTBOUND_REGISTERED = (1<<0),
                    118: 
                    119:        /**
                    120:         * The outbound SA has been installed
                    121:         */
                    122:        CHILD_OUTBOUND_SA = (1<<1),
                    123: 
                    124:        /**
                    125:         * The outbound policies have been installed
                    126:         */
                    127:        CHILD_OUTBOUND_POLICIES = (1<<2),
                    128: 
                    129:        /**
                    130:         * The outbound SA and policies are both installed
                    131:         */
                    132:        CHILD_OUTBOUND_INSTALLED = (CHILD_OUTBOUND_SA|CHILD_OUTBOUND_POLICIES),
                    133: };
                    134: 
                    135: /**
                    136:  * enum strings for child_sa_outbound_state_t.
                    137:  */
                    138: extern enum_name_t *child_sa_outbound_state_names;
                    139: 
                    140: /**
                    141:  * Represents an IPsec SAs between two hosts.
                    142:  *
                    143:  * A child_sa_t contains two SAs. SAs for both
                    144:  * directions are managed in one child_sa_t object. Both
                    145:  * SAs and the policies have the same reqid.
                    146:  *
                    147:  * The procedure for child sa setup is as follows:
                    148:  * - A gets SPIs for a all protocols in its proposals via child_sa_t.alloc
                    149:  * - A send the proposals with the allocated SPIs to B
                    150:  * - B selects a suitable proposal
                    151:  * - B allocates an SPI for the selected protocol
                    152:  * - B calls child_sa_t.install for both, the allocated and received SPI
                    153:  * - B sends the proposal with the allocated SPI to A
                    154:  * - A calls child_sa_t.install for both, the allocated and received SPI
                    155:  *
                    156:  * Once SAs are set up, policies can be added using add_policies.
                    157:  */
                    158: struct child_sa_t {
                    159: 
                    160:        /**
                    161:         * Get the name of the config this CHILD_SA uses.
                    162:         *
                    163:         * @return                      name
                    164:         */
                    165:        char* (*get_name) (child_sa_t *this);
                    166: 
                    167:        /**
                    168:         * Get the reqid of the CHILD SA.
                    169:         *
                    170:         * Every CHILD_SA has a reqid. The kernel uses this ID to
                    171:         * identify it.
                    172:         *
                    173:         * @return                      reqid of the CHILD SA
                    174:         */
                    175:        uint32_t (*get_reqid)(child_sa_t *this);
                    176: 
                    177:        /**
                    178:         * Get the unique numerical identifier for this CHILD_SA.
                    179:         *
                    180:         * While the same reqid might be shared between multiple SAs, the unique_id
                    181:         * is truly unique for all CHILD_SA instances.
                    182:         *
                    183:         * @return                      unique CHILD_SA identifier
                    184:         */
                    185:        uint32_t (*get_unique_id)(child_sa_t *this);
                    186: 
                    187:        /**
                    188:         * Get the config used to set up this child sa.
                    189:         *
                    190:         * @return                      child_cfg
                    191:         */
                    192:        child_cfg_t* (*get_config) (child_sa_t *this);
                    193: 
                    194:        /**
                    195:         * Get the state of the CHILD_SA.
                    196:         *
                    197:         * @return                      CHILD_SA state
                    198:         */
                    199:        child_sa_state_t (*get_state)(child_sa_t *this);
                    200: 
                    201:        /**
                    202:         * Get the state of the outbound SA.
                    203:         *
                    204:         * @return                      outbound SA state
                    205:         */
                    206:        child_sa_outbound_state_t (*get_outbound_state)(child_sa_t *this);
                    207: 
                    208:        /**
                    209:         * Set the state of the CHILD_SA.
                    210:         *
                    211:         * @param state         state to set on CHILD_SA
                    212:         */
                    213:        void (*set_state) (child_sa_t *this, child_sa_state_t state);
                    214: 
                    215:        /**
                    216:         * Get the SPI of this CHILD_SA.
                    217:         *
                    218:         * Set the boolean parameter inbound to TRUE to
                    219:         * get the SPI for which we receive packets, use
                    220:         * FALSE to get those we use for sending packets.
                    221:         *
                    222:         * @param inbound       TRUE to get inbound SPI, FALSE for outbound.
                    223:         * @return                      SPI of the CHILD SA
                    224:         */
                    225:        uint32_t (*get_spi) (child_sa_t *this, bool inbound);
                    226: 
                    227:        /**
                    228:         * Get the CPI of this CHILD_SA.
                    229:         *
                    230:         * Set the boolean parameter inbound to TRUE to
                    231:         * get the CPI for which we receive packets, use
                    232:         * FALSE to get those we use for sending packets.
                    233:         *
                    234:         * @param inbound       TRUE to get inbound CPI, FALSE for outbound.
                    235:         * @return                      CPI of the CHILD SA
                    236:         */
                    237:        uint16_t (*get_cpi) (child_sa_t *this, bool inbound);
                    238: 
                    239:        /**
                    240:         * Get the protocol which this CHILD_SA uses to protect traffic.
                    241:         *
                    242:         * @return                      AH | ESP
                    243:         */
                    244:        protocol_id_t (*get_protocol) (child_sa_t *this);
                    245: 
                    246:        /**
                    247:         * Set the negotiated protocol to use for this CHILD_SA.
                    248:         *
                    249:         * @param protocol      AH | ESP
                    250:         */
                    251:        void (*set_protocol)(child_sa_t *this, protocol_id_t protocol);
                    252: 
                    253:        /**
                    254:         * Get the IPsec mode of this CHILD_SA.
                    255:         *
                    256:         * @return                      TUNNEL | TRANSPORT | BEET
                    257:         */
                    258:        ipsec_mode_t (*get_mode)(child_sa_t *this);
                    259: 
                    260:        /**
                    261:         * Set the negotiated IPsec mode to use.
                    262:         *
                    263:         * @param mode          TUNNEL | TRANSPORT | BEET
                    264:         */
                    265:        void (*set_mode)(child_sa_t *this, ipsec_mode_t mode);
                    266: 
                    267:        /**
                    268:         * Get the used IPComp algorithm.
                    269:         *
                    270:         * @return                      IPComp compression algorithm.
                    271:         */
                    272:        ipcomp_transform_t (*get_ipcomp)(child_sa_t *this);
                    273: 
                    274:        /**
                    275:         * Set the IPComp algorithm to use.
                    276:         *
                    277:         * @param ipcomp        the IPComp transform to use
                    278:         */
                    279:        void (*set_ipcomp)(child_sa_t *this, ipcomp_transform_t ipcomp);
                    280: 
                    281:        /**
                    282:         * Get the action to enforce if the remote peer closes the CHILD_SA.
                    283:         *
                    284:         * @return                      close action
                    285:         */
                    286:        action_t (*get_close_action)(child_sa_t *this);
                    287: 
                    288:        /**
                    289:         * Override the close action specified by the CHILD_SA config.
                    290:         *
                    291:         * @param                       close action to enforce
                    292:         */
                    293:        void (*set_close_action)(child_sa_t *this, action_t action);
                    294: 
                    295:        /**
                    296:         * Get the action to enforce if the peer is considered dead.
                    297:         *
                    298:         * @return                      dpd action
                    299:         */
                    300:        action_t (*get_dpd_action)(child_sa_t *this);
                    301: 
                    302:        /**
                    303:         * Override the DPD action specified by the CHILD_SA config.
                    304:         *
                    305:         * @param                       dpd action to enforce
                    306:         */
                    307:        void (*set_dpd_action)(child_sa_t *this, action_t action);
                    308: 
                    309:        /**
                    310:         * Get the selected proposal.
                    311:         *
                    312:         * @return                      selected proposal
                    313:         */
                    314:        proposal_t* (*get_proposal)(child_sa_t *this);
                    315: 
                    316:        /**
                    317:         * Set the negotiated proposal.
                    318:         *
                    319:         * @param proposal      selected proposal
                    320:         */
                    321:        void (*set_proposal)(child_sa_t *this, proposal_t *proposal);
                    322: 
                    323:        /**
                    324:         * Check if this CHILD_SA uses UDP encapsulation.
                    325:         *
                    326:         * @return                      TRUE if SA encapsulates ESP packets
                    327:         */
                    328:        bool (*has_encap)(child_sa_t *this);
                    329: 
                    330:        /**
                    331:         * Get the absolute time when the CHILD_SA expires or gets rekeyed.
                    332:         *
                    333:         * @param hard          TRUE for hard lifetime, FALSE for soft (rekey) lifetime
                    334:         * @return                      absolute time
                    335:         */
                    336:        time_t (*get_lifetime)(child_sa_t *this, bool hard);
                    337: 
                    338:        /**
                    339:         * Get the absolute time when this SA has been installed.
                    340:         *
                    341:         * @return                      monotonic absolute install time
                    342:         */
                    343:        time_t (*get_installtime)(child_sa_t *this);
                    344: 
                    345:        /**
                    346:         * Get last use time and the number of bytes processed.
                    347:         *
                    348:         * @param inbound               TRUE for inbound traffic, FALSE for outbound
                    349:         * @param[out] time             time of last use in seconds (NULL to ignore)
                    350:         * @param[out] bytes    number of processed bytes (NULL to ignore)
                    351:         * @param[out] packets  number of processed packets (NULL to ignore)
                    352:         */
                    353:        void (*get_usestats)(child_sa_t *this, bool inbound, time_t *time,
                    354:                                                 uint64_t *bytes, uint64_t *packets);
                    355: 
                    356:        /**
                    357:         * Get the mark used with this CHILD_SA.
                    358:         *
                    359:         * @param inbound               TRUE to get inbound mark, FALSE for outbound
                    360:         * @return                              mark used with this CHILD_SA
                    361:         */
                    362:        mark_t (*get_mark)(child_sa_t *this, bool inbound);
                    363: 
                    364:        /**
                    365:         * Get the interface ID used with this CHILD_SA.
                    366:         *
                    367:         * @param inbound               TRUE to get inbound ID, FALSE for outbound
                    368:         * @return                              interface ID used with this CHILD_SA
                    369:         */
                    370:        uint32_t (*get_if_id)(child_sa_t *this, bool inbound);
                    371: 
                    372:        /**
                    373:         * Create an enumerator over traffic selectors of one side.
                    374:         *
                    375:         * @param local         TRUE for own traffic selectors, FALSE for remote.
                    376:         * @return                      enumerator over traffic_selector_t*
                    377:         */
                    378:        enumerator_t* (*create_ts_enumerator)(child_sa_t *this, bool local);
                    379: 
                    380:        /**
                    381:         * Create an enumerator over installed policies.
                    382:         *
                    383:         * The enumerated traffic selectors is a full mesh of compatible local
                    384:         * and remote traffic selectors.
                    385:         *
                    386:         * @return                      enumerator over a pair of traffic_selector_t*
                    387:         */
                    388:        enumerator_t* (*create_policy_enumerator)(child_sa_t *this);
                    389: 
                    390:        /**
                    391:         * Allocate an SPI to include in a proposal.
                    392:         *
                    393:         * @param protocol      protocol to allocate SPI for (ESP|AH)
                    394:         * @param spi           SPI output pointer
                    395:         * @return                      SPI, 0 on failure
                    396:         */
                    397:        uint32_t (*alloc_spi)(child_sa_t *this, protocol_id_t protocol);
                    398: 
                    399:        /**
                    400:         * Allocate a CPI to use for IPComp.
                    401:         *
                    402:         * @return                      CPI, 0 on failure
                    403:         */
                    404:        uint16_t (*alloc_cpi)(child_sa_t *this);
                    405: 
                    406:        /**
                    407:         * Install an IPsec SA for one direction.
                    408:         *
                    409:         * set_policies() should be called before calling this.
                    410:         *
                    411:         * @param encr          encryption key, if any
                    412:         * @param integ         integrity key
                    413:         * @param spi           SPI to use, allocated for inbound
                    414:         * @param cpi           CPI to use, allocated for outbound
                    415:         * @param initiator     TRUE if initiator of exchange resulting in this SA
                    416:         * @param inbound       TRUE to install an inbound SA, FALSE for outbound
                    417:         * @param tfcv3         TRUE if peer supports ESPv3 TFC
                    418:         * @return                      SUCCESS or FAILED
                    419:         */
                    420:        status_t (*install)(child_sa_t *this, chunk_t encr, chunk_t integ,
                    421:                                                uint32_t spi, uint16_t cpi,
                    422:                                                bool initiator, bool inbound, bool tfcv3);
                    423: 
                    424:        /**
                    425:         * Register data for the installation of an outbound SA as responder during
                    426:         * a rekeying.
                    427:         *
                    428:         * If the kernel is able to handle SPIs on policies the SA is installed
                    429:         * immediately, if not it won't be installed until install_outbound() is
                    430:         * called.
                    431:         *
                    432:         * @param encr          encryption key, if any (cloned)
                    433:         * @param integ         integrity key (cloned)
                    434:         * @param spi           SPI to use, allocated for inbound
                    435:         * @param cpi           CPI to use, allocated for outbound
                    436:         * @param tfcv3         TRUE if peer supports ESPv3 TFC
                    437:         * @return                      SUCCESS or FAILED
                    438:         */
                    439:        status_t (*register_outbound)(child_sa_t *this, chunk_t encr, chunk_t integ,
                    440:                                                                  uint32_t spi, uint16_t cpi, bool tfcv3);
                    441: 
                    442:        /**
                    443:         * Install the outbound policies and, if not already done, the outbound SA
                    444:         * as responder during a rekeying.
                    445:         *
                    446:         * @return                      SUCCESS or FAILED
                    447:         */
                    448:        status_t (*install_outbound)(child_sa_t *this);
                    449: 
                    450:        /**
                    451:         * Remove the outbound SA and the outbound policies after a rekeying.
                    452:         */
                    453:        void (*remove_outbound)(child_sa_t *this);
                    454: 
                    455:        /**
                    456:         * Configure the policies using some traffic selectors.
                    457:         *
                    458:         * Supplied lists of traffic_selector_t's specify the policies
                    459:         * to use for this child sa.
                    460:         *
                    461:         * Install the policies by calling install_policies().
                    462:         *
                    463:         * This should be called before calling install() so the traffic selectors
                    464:         * may be passed to the kernel interface when installing the SAs.
                    465:         *
                    466:         * @param my_ts         traffic selectors for local site (cloned)
                    467:         * @param other_ts      traffic selectors for remote site (cloned)
                    468:         */
                    469:        void (*set_policies)(child_sa_t *this, linked_list_t *my_ts_list,
                    470:                                                 linked_list_t *other_ts_list);
                    471: 
                    472:        /**
                    473:         * Install the configured policies.
                    474:         *
                    475:         * If register_outbound() was called previously this only installs the
                    476:         * inbound and forward policies, the outbound policies are installed when
                    477:         * install_outbound() is called.
                    478:         *
                    479:         * @return                      SUCCESS or FAILED
                    480:         */
                    481:        status_t (*install_policies)(child_sa_t *this);
                    482: 
                    483:        /**
                    484:         * Set the outbound SPI of the CHILD_SA that replaced this CHILD_SA during
                    485:         * a rekeying.
                    486:         *
                    487:         * @param spi           outbound SPI of the CHILD_SA that replaced this CHILD_SA
                    488:         */
                    489:        void (*set_rekey_spi)(child_sa_t *this, uint32_t spi);
                    490: 
                    491:        /**
                    492:         * Get the outbound SPI of the CHILD_SA that replaced this CHILD_SA during
                    493:         * a rekeying.
                    494:         *
                    495:         * @return                      outbound SPI of the CHILD_SA that replaced this CHILD_SA
                    496:         */
                    497:        uint32_t (*get_rekey_spi)(child_sa_t *this);
                    498: 
                    499:        /**
                    500:         * Update hosts and ecapsulation mode in the kernel SAs and policies.
                    501:         *
                    502:         * @param me            the new local host
                    503:         * @param other         the new remote host
                    504:         * @param vips          list of local virtual IPs
                    505:         * @param encap         TRUE to use UDP encapsulation for NAT traversal
                    506:         * @return                      SUCCESS or FAILED
                    507:         */
                    508:        status_t (*update)(child_sa_t *this, host_t *me, host_t *other,
                    509:                                           linked_list_t *vips, bool encap);
                    510:        /**
                    511:         * Destroys a child_sa.
                    512:         */
                    513:        void (*destroy) (child_sa_t *this);
                    514: };
                    515: 
                    516: /**
                    517:  * Data passed to the constructor of a child_sa_t object.
                    518:  */
                    519: struct child_sa_create_t {
                    520:        /** Optional reqid of old CHILD_SA when rekeying */
                    521:        uint32_t reqid;
                    522:        /** Optional inbound mark when rekeying */
                    523:        uint32_t mark_in;
                    524:        /** Optional outbound mark when rekeying */
                    525:        uint32_t mark_out;
                    526:        /** Optional inbound interface ID when rekeying */
                    527:        uint32_t if_id_in;
                    528:        /** Optional outbound interface ID when rekeying */
                    529:        uint32_t if_id_out;
                    530:        /** Optional default inbound interface ID, if neither if_id_in, nor config
                    531:         * sets one */
                    532:        uint32_t if_id_in_def;
                    533:        /** Optional default outbound interface ID, if neither if_id_out, nor config
                    534:         * sets one */
                    535:        uint32_t if_id_out_def;
                    536:        /** TRUE to enable UDP encapsulation (NAT traversal) */
                    537:        bool encap;
                    538: };
                    539: 
                    540: /**
                    541:  * Constructor to create a child SA negotiated with IKE.
                    542:  *
                    543:  * @param me                           own address
                    544:  * @param other                                remote address
                    545:  * @param config                       config to use for this CHILD_SA
                    546:  * @param data                         data for this CHILD_SA
                    547:  * @return                                     child_sa_t object
                    548:  */
                    549: child_sa_t *child_sa_create(host_t *me, host_t *other, child_cfg_t *config,
                    550:                                                        child_sa_create_t *data);
                    551: 
                    552: #endif /** CHILD_SA_H_ @}*/

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