Annotation of embedaddon/strongswan/src/libstrongswan/crypto/proposal/proposal.h, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2009-2020 Tobias Brunner
! 3: * Copyright (C) 2006 Martin Willi
! 4: * HSR Hochschule fuer Technik Rapperswil
! 5: *
! 6: * This program is free software; you can redistribute it and/or modify it
! 7: * under the terms of the GNU General Public License as published by the
! 8: * Free Software Foundation; either version 2 of the License, or (at your
! 9: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
! 10: *
! 11: * This program is distributed in the hope that it will be useful, but
! 12: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 13: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
! 14: * for more details.
! 15: */
! 16:
! 17: /**
! 18: * @defgroup proposal proposal
! 19: * @{ @ingroup crypto
! 20: */
! 21:
! 22: #ifndef PROPOSAL_H_
! 23: #define PROPOSAL_H_
! 24:
! 25: typedef enum protocol_id_t protocol_id_t;
! 26: typedef enum proposal_selection_flag_t proposal_selection_flag_t;
! 27: typedef enum extended_sequence_numbers_t extended_sequence_numbers_t;
! 28: typedef struct proposal_t proposal_t;
! 29:
! 30: #include <library.h>
! 31: #include <utils/identification.h>
! 32: #include <collections/linked_list.h>
! 33: #include <networking/host.h>
! 34: #include <crypto/transform.h>
! 35: #include <crypto/crypters/crypter.h>
! 36: #include <crypto/signers/signer.h>
! 37: #include <crypto/diffie_hellman.h>
! 38:
! 39: /**
! 40: * Protocol ID of a proposal.
! 41: */
! 42: enum protocol_id_t {
! 43: PROTO_NONE = 0,
! 44: PROTO_IKE = 1,
! 45: PROTO_AH = 2,
! 46: PROTO_ESP = 3,
! 47: PROTO_IPCOMP = 4, /* IKEv1 only */
! 48: };
! 49:
! 50: /**
! 51: * enum names for protocol_id_t
! 52: */
! 53: extern enum_name_t *protocol_id_names;
! 54:
! 55: /**
! 56: * Flags for selecting proposals.
! 57: */
! 58: enum proposal_selection_flag_t {
! 59: /** Whether to prefer configured (default) or supplied proposals. */
! 60: PROPOSAL_PREFER_SUPPLIED = (1<<0),
! 61: /** Whether to skip and ignore algorithms from a private range. */
! 62: PROPOSAL_SKIP_PRIVATE = (1<<1),
! 63: /** Whether to skip and ignore diffie hellman groups. */
! 64: PROPOSAL_SKIP_DH = (1<<2),
! 65: };
! 66:
! 67: /**
! 68: * Stores a set of algorithms used for an SA.
! 69: *
! 70: * A proposal stores algorithms for a specific protocol.
! 71: * Proposals with multiple protocols are not supported, as that's not specified
! 72: * in RFC 7296 anymore.
! 73: */
! 74: struct proposal_t {
! 75:
! 76: /**
! 77: * Add an algorithm to the proposal.
! 78: *
! 79: * The algorithms are stored by priority, first added is the most preferred.
! 80: * Key size is only needed for encryption algorithms with variable key
! 81: * size (such as AES). Must be set to zero if the key size is not specified.
! 82: *
! 83: * @param type kind of algorithm
! 84: * @param alg identifier for algorithm
! 85: * @param key_size key size to use
! 86: */
! 87: void (*add_algorithm) (proposal_t *this, transform_type_t type,
! 88: uint16_t alg, uint16_t key_size);
! 89:
! 90: /**
! 91: * Get an enumerator over algorithms for a specific transform type.
! 92: *
! 93: * @param type kind of algorithm
! 94: * @return enumerator over uint16_t alg, uint16_t key_size
! 95: */
! 96: enumerator_t *(*create_enumerator) (proposal_t *this, transform_type_t type);
! 97:
! 98: /**
! 99: * Get the algorithm for a type to use.
! 100: *
! 101: * If there are multiple algorithms, only the first is returned.
! 102: *
! 103: * @param type kind of algorithm
! 104: * @param alg pointer which receives algorithm
! 105: * @param key_size pointer which receives the key size
! 106: * @return TRUE if algorithm of this kind available
! 107: */
! 108: bool (*get_algorithm) (proposal_t *this, transform_type_t type,
! 109: uint16_t *alg, uint16_t *key_size);
! 110:
! 111: /**
! 112: * Check if the proposal has a specific DH group.
! 113: *
! 114: * @param group group to check for
! 115: * @return TRUE if algorithm included
! 116: */
! 117: bool (*has_dh_group)(proposal_t *this, diffie_hellman_group_t group);
! 118:
! 119: /**
! 120: * Move the given DH group to the front of the list if it was contained in
! 121: * the proposal.
! 122: *
! 123: * @param group group to promote
! 124: * @return TRUE if algorithm included
! 125: */
! 126: bool (*promote_dh_group)(proposal_t *this, diffie_hellman_group_t group);
! 127:
! 128: /**
! 129: * Compare two proposals and select a matching subset.
! 130: *
! 131: * If the proposals are for the same protocols (AH/ESP), they are
! 132: * compared. If they have at least one algorithm of each type
! 133: * in common, a resulting proposal of this kind is created.
! 134: *
! 135: * Unless the flag PROPOSAL_PREFER_SUPPLIED is set, other is expected to be
! 136: * the remote proposal from which to copy SPI and proposal number to the
! 137: * result, otherwise copy from this proposal.
! 138: *
! 139: * @param other proposal to compare against
! 140: * @param flags flags to consider during proposal selection
! 141: * @return selected proposal, NULL if proposals don't match
! 142: */
! 143: proposal_t *(*select)(proposal_t *this, proposal_t *other,
! 144: proposal_selection_flag_t flags);
! 145:
! 146: /**
! 147: * Check if the given proposal matches this proposal.
! 148: *
! 149: * This is similar to select, but no resulting proposal is selected.
! 150: *
! 151: * @param other proposal to compare against
! 152: * @param flags flags to consider during proposal selection
! 153: * @return TRUE if the proposals match
! 154: */
! 155: bool (*matches)(proposal_t *this, proposal_t *other,
! 156: proposal_selection_flag_t flags);
! 157:
! 158: /**
! 159: * Get the protocol ID of the proposal.
! 160: *
! 161: * @return protocol of the proposal
! 162: */
! 163: protocol_id_t (*get_protocol) (proposal_t *this);
! 164:
! 165: /**
! 166: * Get the SPI of the proposal.
! 167: *
! 168: * @return SPI of the proposal
! 169: */
! 170: uint64_t (*get_spi) (proposal_t *this);
! 171:
! 172: /**
! 173: * Set the SPI of the proposal.
! 174: *
! 175: * @param spi SPI to set for proposal
! 176: */
! 177: void (*set_spi) (proposal_t *this, uint64_t spi);
! 178:
! 179: /**
! 180: * Get the proposal number, as encoded in the SA payload.
! 181: *
! 182: * @return proposal number
! 183: */
! 184: uint8_t (*get_number)(proposal_t *this);
! 185:
! 186: /**
! 187: * Get number of the transform on which this proposal is based (IKEv1 only)
! 188: *
! 189: * @return transform number (or 0)
! 190: */
! 191: uint8_t (*get_transform_number)(proposal_t *this);
! 192:
! 193: /**
! 194: * Check for the equality of two proposals.
! 195: *
! 196: * @param other other proposal to check for equality
! 197: * @return TRUE if proposals are equal
! 198: */
! 199: bool (*equals)(proposal_t *this, proposal_t *other);
! 200:
! 201: /**
! 202: * Clone a proposal.
! 203: *
! 204: * @param flags flags to consider during cloning
! 205: * @return clone of proposal
! 206: */
! 207: proposal_t *(*clone)(proposal_t *this, proposal_selection_flag_t flags);
! 208:
! 209: /**
! 210: * Destroys the proposal object.
! 211: */
! 212: void (*destroy) (proposal_t *this);
! 213: };
! 214:
! 215: /**
! 216: * Create a proposal for IKE, ESP or AH.
! 217: *
! 218: * @param protocol protocol, such as PROTO_ESP
! 219: * @param number proposal number, as encoded in SA payload
! 220: * @return proposal_t object
! 221: */
! 222: proposal_t *proposal_create(protocol_id_t protocol, uint8_t number);
! 223:
! 224: /**
! 225: * Create a proposal for IKE, ESP or AH that includes a transform number.
! 226: *
! 227: * @param protocol protocol, such as PROTO_ESP
! 228: * @param number proposal number, as encoded in SA payload
! 229: * @param transform transform number, as encoded in payload
! 230: * @return proposal_t object
! 231: */
! 232: proposal_t *proposal_create_v1(protocol_id_t protocol, uint8_t number,
! 233: uint8_t transform);
! 234:
! 235: /**
! 236: * Create a default proposal.
! 237: *
! 238: * @param protocol protocol, such as PROTO_ESP
! 239: * @return proposal_t object
! 240: */
! 241: proposal_t *proposal_create_default(protocol_id_t protocol);
! 242:
! 243: /**
! 244: * Create a default proposal for supported AEAD algorithms.
! 245: *
! 246: * @param protocol protocol, such as PROTO_ESP
! 247: * @return proposal_t object, NULL if none supported
! 248: */
! 249: proposal_t *proposal_create_default_aead(protocol_id_t protocol);
! 250:
! 251: /**
! 252: * Create a proposal from a string identifying the algorithms.
! 253: *
! 254: * Each algorithm identifier is separated with a '-' character e.g.
! 255: * aes256-sha2-curve25519. Multiple algorithms of the same transform type can be
! 256: * given (they don't have to be grouped together), the order is preserved e.g.
! 257: * curve25519-sha2-aes256-sha1-modp3072-aes128 is the same as
! 258: * aes256-aes128-sha2-sha1-curve25519-modp3072.
! 259: *
! 260: * The proposal is validated (e.g. PROTO_IKE proposals must contain a key
! 261: * exchange method, AEAD algorithms can't be combined with classic encryption
! 262: * algorithms etc.) and in some cases modified (e.g. by adding missing PRFs for
! 263: * PROTO_IKE, or by adding noesn in PROTO_ESP/AH proposals if neither esn, nor
! 264: * noesn is contained in the string etc.).
! 265: *
! 266: * @param protocol protocol, such as PROTO_ESP
! 267: * @param algs algorithms as string
! 268: * @return proposal_t object, NULL if invalid
! 269: */
! 270: proposal_t *proposal_create_from_string(protocol_id_t protocol,
! 271: const char *algs);
! 272:
! 273: /**
! 274: * Select a common proposal from the given lists of proposals.
! 275: *
! 276: * @param configured list of configured/local proposals
! 277: * @param supplied list of supplied/remote proposals
! 278: * @param flags flags to consider during proposal selection
! 279: * @return selected proposal, or NULL (allocated)
! 280: */
! 281: proposal_t *proposal_select(linked_list_t *configured, linked_list_t *supplied,
! 282: proposal_selection_flag_t flags);
! 283:
! 284: /**
! 285: * printf hook function for proposal_t.
! 286: *
! 287: * Arguments are:
! 288: * proposal_t*
! 289: * With the #-specifier, arguments are:
! 290: * linked_list_t* (containing proposal_t*)
! 291: */
! 292: int proposal_printf_hook(printf_hook_data_t *data, printf_hook_spec_t *spec,
! 293: const void *const *args);
! 294:
! 295: #endif /** PROPOSAL_H_ @}*/
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>