1dbb5a83ac22b3a81ac73363707994673ec28484
[strongswan.git] / Source / charon / encoding / payloads / sa_payload.h
1 /**
2 * @file sa_payload.h
3 *
4 * @brief Interface of sa_payload_t.
5 *
6 */
7
8 /*
9 * Copyright (C) 2005 Jan Hutter, Martin Willi
10 * Hochschule fuer Technik Rapperswil
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the
14 * Free Software Foundation; either version 2 of the License, or (at your
15 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
16 *
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
19 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
20 * for more details.
21 */
22
23 #ifndef SA_PAYLOAD_H_
24 #define SA_PAYLOAD_H_
25
26 #include <types.h>
27 #include <encoding/payloads/payload.h>
28 #include <encoding/payloads/proposal_substructure.h>
29 #include <utils/linked_list.h>
30 #include <config/init_config.h>
31 #include <config/sa_config.h>
32
33 /**
34 * Critical flag must not be set.
35 *
36 * @ingroup payloads
37 */
38 #define SA_PAYLOAD_CRITICAL_FLAG FALSE;
39
40 /**
41 * SA_PAYLOAD length in bytes without any proposal substructure.
42 *
43 * @ingroup payloads
44 */
45 #define SA_PAYLOAD_HEADER_LENGTH 4
46
47 typedef struct sa_payload_t sa_payload_t;
48
49 /**
50 * @brief Class representing an IKEv2-SA Payload.
51 *
52 * The SA Payload format is described in RFC section 3.3.
53 *
54 * @b Constructors:
55 * - sa_payload_create()
56 * - sa_payload_create_from_ike_proposals()
57 * - sa_payload_create_from_child_proposal()
58 *
59 * @ingroup payloads
60 */
61 struct sa_payload_t {
62 /**
63 * The payload_t interface.
64 */
65 payload_t payload_interface;
66
67 /**
68 * @brief Creates an iterator of stored proposal_substructure_t objects.
69 *
70 * @warning The created iterator has to get destroyed by the caller!
71 *
72 * @warning When deleting an proposal using this iterator,
73 * the length of this transform substructure has to be refreshed
74 * by calling get_length()!
75 *
76 * @param this calling sa_payload_t object
77 * @param[in] forward iterator direction (TRUE: front to end)
78 * @return created iterator_t object
79 */
80 iterator_t *(*create_proposal_substructure_iterator) (sa_payload_t *this, bool forward);
81
82 /**
83 * @brief Adds a proposal_substructure_t object to this object.
84 *
85 * @warning The added proposal_substructure_t object is
86 * getting destroyed in destroy function of sa_payload_t.
87 *
88 * @param this calling sa_payload_t object
89 * @param proposal proposal_substructure_t object to add
90 */
91 void (*add_proposal_substructure) (sa_payload_t *this,proposal_substructure_t *proposal);
92
93 /**
94 * @brief Creates an array of ike_proposal_t's in this SA payload.
95 *
96 * An IKE proposal consist of transform of type ENCRYPTION_ALGORITHM,
97 * PSEUDO_RANDOM_FUNCTION, INTEGRITY_ALGORITHM and DIFFIE_HELLMAN_GROUP
98 *
99 * @param proposals the pointer to the first entry of ike_proposal_t's is set
100 * @param proposal_count the number of found proposals is written at this location
101 * @return
102 * - SUCCESS if an IKE proposal could be found
103 * - NOT_FOUND if no IKE proposal could be found
104 * - FAILED if a proposal does not contain all needed transforms
105 * for a IKE_PROPOSAL
106 */
107 status_t (*get_ike_proposals) (sa_payload_t *this, ike_proposal_t **proposals, size_t *proposal_count);
108
109 /**
110 * @brief Creates an array of child_proposal_t's in this SA payload.
111 *
112 * @param proposals the pointer to the first entry of child_proposal_t's is set
113 * @param proposal_count the number of found proposals is written at this location
114 * @return
115 * - SUCCESS if child proposals could be found
116 * - NOT_FOUND if no child proposal could be found
117 * - FAILED if a proposal does not contain all needed transforms
118 */
119 status_t (*get_child_proposals) (sa_payload_t *this, child_proposal_t **proposals, size_t *proposal_count);
120
121 /**
122 * @brief Destroys an sa_payload_t object.
123 *
124 * @param this sa_payload_t object to destroy
125 */
126 void (*destroy) (sa_payload_t *this);
127 };
128
129 /**
130 * @brief Creates an empty sa_payload_t object
131 *
132 * @return created sa_payload_t object
133 *
134 * @ingroup payloads
135 */
136 sa_payload_t *sa_payload_create();
137
138 /**
139 * @brief Creates a sa_payload_t object from array of ike_proposal_t's.
140 *
141 * @return created sa_payload_t object
142 * @param proposals pointer to first proposal in array of type ike_proposal_t
143 * @param proposal_count number of ike_proposal_t's in array
144 * @return sa_payload_t object
145 *
146 * @ingroup payloads
147 */
148 sa_payload_t *sa_payload_create_from_ike_proposals(ike_proposal_t *proposals, size_t proposal_count);
149
150 /**
151 * @brief Creates a sa_payload_t object from array of child_proposal_t's.
152 *
153 * @warning for proposals where AH and ESP is not set, an empty proposal is created.
154 *
155 *
156 * @return created sa_payload_t object
157 * @param proposals pointer to first proposal in array of type child_proposal_t
158 * @param proposal_count number of child_proposal_t's in array
159 * @return sa_payload_t object
160 *
161 * @ingroup payloads
162 */
163 sa_payload_t *sa_payload_create_from_child_proposals(child_proposal_t *proposals, size_t proposal_count);
164
165
166 #endif /*SA_PAYLOAD_H_*/