14617b4e358210ee6950af1f1bec1e992fb913e3
[strongswan.git] / src / libcharon / encoding / payloads / payload.c
1 /*
2 * Copyright (C) 2007 Tobias Brunner
3 * Copyright (C) 2005-2006 Martin Willi
4 * Copyright (C) 2005 Jan Hutter
5 * 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 #include "payload.h"
20
21 #include <encoding/payloads/ike_header.h>
22 #include <encoding/payloads/sa_payload.h>
23 #include <encoding/payloads/nonce_payload.h>
24 #include <encoding/payloads/id_payload.h>
25 #include <encoding/payloads/ke_payload.h>
26 #include <encoding/payloads/notify_payload.h>
27 #include <encoding/payloads/auth_payload.h>
28 #include <encoding/payloads/cert_payload.h>
29 #include <encoding/payloads/certreq_payload.h>
30 #include <encoding/payloads/encryption_payload.h>
31 #include <encoding/payloads/ts_payload.h>
32 #include <encoding/payloads/delete_payload.h>
33 #include <encoding/payloads/vendor_id_payload.h>
34 #include <encoding/payloads/cp_payload.h>
35 #include <encoding/payloads/configuration_attribute.h>
36 #include <encoding/payloads/eap_payload.h>
37 #include <encoding/payloads/unknown_payload.h>
38
39
40 ENUM_BEGIN(payload_type_names, NO_PAYLOAD, NO_PAYLOAD,
41 "NO_PAYLOAD");
42 ENUM_NEXT(payload_type_names, SECURITY_ASSOCIATION_V1, VENDOR_ID_V1, NO_PAYLOAD,
43 "SECURITY_ASSOCIATION_V1",
44 "PROPOSAL_V1",
45 "TRANSFORM_V1",
46 "KEY_EXCHANGE_V1",
47 "ID_V1",
48 "CERTIFICATE_V1",
49 "CERTIFICATE_REQUEST_V1",
50 "HASH_V1",
51 "SIGNATURE_V1",
52 "NONCE_V1",
53 "NOTIFICATION_V1",
54 "DELETE_V1",
55 "VENDOR_ID_V1");
56 ENUM_NEXT(payload_type_names, SECURITY_ASSOCIATION, EXTENSIBLE_AUTHENTICATION, VENDOR_ID_V1,
57 "SECURITY_ASSOCIATION",
58 "KEY_EXCHANGE",
59 "ID_INITIATOR",
60 "ID_RESPONDER",
61 "CERTIFICATE",
62 "CERTIFICATE_REQUEST",
63 "AUTHENTICATION",
64 "NONCE",
65 "NOTIFY",
66 "DELETE",
67 "VENDOR_ID",
68 "TRAFFIC_SELECTOR_INITIATOR",
69 "TRAFFIC_SELECTOR_RESPONDER",
70 "ENCRYPTED",
71 "CONFIGURATION",
72 "EXTENSIBLE_AUTHENTICATION");
73 #ifdef ME
74 ENUM_NEXT(payload_type_names, ID_PEER, ID_PEER, EXTENSIBLE_AUTHENTICATION,
75 "ID_PEER");
76 ENUM_NEXT(payload_type_names, HEADER, CONFIGURATION_ATTRIBUTE, ID_PEER,
77 "HEADER",
78 "PROPOSAL_SUBSTRUCTURE",
79 "TRANSFORM_SUBSTRUCTURE",
80 "TRANSFORM_ATTRIBUTE",
81 "TRAFFIC_SELECTOR_SUBSTRUCTURE",
82 "CONFIGURATION_ATTRIBUTE");
83 #else
84 ENUM_NEXT(payload_type_names, HEADER, CONFIGURATION_ATTRIBUTE, EXTENSIBLE_AUTHENTICATION,
85 "HEADER",
86 "PROPOSAL_SUBSTRUCTURE",
87 "TRANSFORM_SUBSTRUCTURE",
88 "TRANSFORM_ATTRIBUTE",
89 "TRAFFIC_SELECTOR_SUBSTRUCTURE",
90 "CONFIGURATION_ATTRIBUTE");
91 #endif /* ME */
92 ENUM_END(payload_type_names, CONFIGURATION_ATTRIBUTE);
93
94 /* short forms of payload names */
95 ENUM_BEGIN(payload_type_short_names, NO_PAYLOAD, NO_PAYLOAD,
96 "--");
97 ENUM_NEXT(payload_type_short_names, SECURITY_ASSOCIATION_V1, VENDOR_ID_V1, NO_PAYLOAD,
98 "SA",
99 "PROP",
100 "TRANS",
101 "KE",
102 "ID",
103 "CERT",
104 "CERTREQ",
105 "HASH",
106 "SIG",
107 "No",
108 "NO",
109 "D",
110 "V");
111 ENUM_NEXT(payload_type_short_names, SECURITY_ASSOCIATION, EXTENSIBLE_AUTHENTICATION, VENDOR_ID_V1,
112 "SA",
113 "KE",
114 "IDi",
115 "IDr",
116 "CERT",
117 "CERTREQ",
118 "AUTH",
119 "No",
120 "N",
121 "D",
122 "V",
123 "TSi",
124 "TSr",
125 "E",
126 "CP",
127 "EAP");
128 #ifdef ME
129 ENUM_NEXT(payload_type_short_names, ID_PEER, ID_PEER, EXTENSIBLE_AUTHENTICATION,
130 "IDp");
131 ENUM_NEXT(payload_type_short_names, HEADER, CONFIGURATION_ATTRIBUTE, ID_PEER,
132 "HDR",
133 "PROP",
134 "TRANS",
135 "TRANSATTR",
136 "TSSUB",
137 "CPATTR");
138 #else
139 ENUM_NEXT(payload_type_short_names, HEADER, CONFIGURATION_ATTRIBUTE, EXTENSIBLE_AUTHENTICATION,
140 "HDR",
141 "PROP",
142 "TRANS",
143 "TRANSATTR",
144 "TSSUB",
145 "CPATTR");
146 #endif /* ME */
147 ENUM_END(payload_type_short_names, CONFIGURATION_ATTRIBUTE);
148
149 /*
150 * see header
151 */
152 payload_t *payload_create(payload_type_t type)
153 {
154 switch (type)
155 {
156 case HEADER:
157 return (payload_t*)ike_header_create();
158 case SECURITY_ASSOCIATION:
159 case SECURITY_ASSOCIATION_V1:
160 return (payload_t*)sa_payload_create(type);
161 case PROPOSAL_SUBSTRUCTURE:
162 return (payload_t*)proposal_substructure_create();
163 case TRANSFORM_SUBSTRUCTURE:
164 return (payload_t*)transform_substructure_create();
165 case TRANSFORM_ATTRIBUTE:
166 return (payload_t*)transform_attribute_create();
167 case NONCE:
168 return (payload_t*)nonce_payload_create();
169 case ID_INITIATOR:
170 return (payload_t*)id_payload_create(ID_INITIATOR);
171 case ID_RESPONDER:
172 return (payload_t*)id_payload_create(ID_RESPONDER);
173 #ifdef ME
174 case ID_PEER:
175 return (payload_t*)id_payload_create(ID_PEER);
176 #endif /* ME */
177 case AUTHENTICATION:
178 return (payload_t*)auth_payload_create();
179 case CERTIFICATE:
180 return (payload_t*)cert_payload_create();
181 case CERTIFICATE_REQUEST:
182 return (payload_t*)certreq_payload_create();
183 case TRAFFIC_SELECTOR_SUBSTRUCTURE:
184 return (payload_t*)traffic_selector_substructure_create();
185 case TRAFFIC_SELECTOR_INITIATOR:
186 return (payload_t*)ts_payload_create(TRUE);
187 case TRAFFIC_SELECTOR_RESPONDER:
188 return (payload_t*)ts_payload_create(FALSE);
189 case KEY_EXCHANGE:
190 return (payload_t*)ke_payload_create();
191 case NOTIFY:
192 return (payload_t*)notify_payload_create();
193 case DELETE:
194 return (payload_t*)delete_payload_create(0);
195 case VENDOR_ID:
196 case VENDOR_ID_V1:
197 return (payload_t*)vendor_id_payload_create(type);
198 case CONFIGURATION:
199 return (payload_t*)cp_payload_create();
200 case CONFIGURATION_ATTRIBUTE:
201 return (payload_t*)configuration_attribute_create();
202 case EXTENSIBLE_AUTHENTICATION:
203 return (payload_t*)eap_payload_create();
204 case ENCRYPTED:
205 return (payload_t*)encryption_payload_create();
206 default:
207 return (payload_t*)unknown_payload_create(type);
208 }
209 }
210
211 /**
212 * See header.
213 */
214 bool payload_is_known(payload_type_t type)
215 {
216 if (type == HEADER)
217 {
218 return TRUE;
219 }
220 if (type >= SECURITY_ASSOCIATION && type <= EXTENSIBLE_AUTHENTICATION)
221 {
222 return TRUE;
223 }
224 if (type >= SECURITY_ASSOCIATION_V1 && type <= VENDOR_ID_V1)
225 {
226 return TRUE;
227 }
228 #ifdef ME
229 if (type == ID_PEER)
230 {
231 return TRUE;
232 }
233 #endif
234 return FALSE;
235 }
236
237 /**
238 * See header.
239 */
240 void* payload_get_field(payload_t *payload, encoding_type_t type, u_int skip)
241 {
242 encoding_rule_t *rule;
243 size_t count;
244 int i;
245
246 payload->get_encoding_rules(payload, &rule, &count);
247 for (i = 0; i < count; i++)
248 {
249 if (rule[i].type == type && skip-- == 0)
250 {
251 return ((char*)payload) + rule[i].offset;
252 }
253 }
254 return NULL;
255 }