Annotation of embedaddon/strongswan/src/libstrongswan/crypto/proposal/proposal.h, revision 1.1.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>