4 * @brief Tests for the parser_t class.
9 * Copyright (C) 2005 Jan Hutter, Martin Willi
10 * Hochschule fuer Technik Rapperswil
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>.
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
25 #include "parser_test.h"
27 #include <utils/allocator.h>
28 #include <utils/logger_manager.h>
29 #include <encoding/generator.h>
30 #include <encoding/parser.h>
31 #include <encoding/payloads/encodings.h>
32 #include <encoding/payloads/ike_header.h>
33 #include <encoding/payloads/sa_payload.h>
34 #include <encoding/payloads/nonce_payload.h>
35 #include <encoding/payloads/id_payload.h>
36 #include <encoding/payloads/ke_payload.h>
37 #include <encoding/payloads/notify_payload.h>
38 #include <encoding/payloads/auth_payload.h>
39 #include <encoding/payloads/ts_payload.h>
45 void test_parser_with_header_payload(tester_t
*tester
)
48 ike_header_t
*ike_header
;
52 u_int8_t header_bytes
[] = {
61 header_chunk
.ptr
= header_bytes
;
62 header_chunk
.len
= sizeof(header_bytes
);
65 parser
= parser_create(header_chunk
);
66 tester
->assert_true(tester
,(parser
!= NULL
), "parser create check");
67 status
= parser
->parse_payload(parser
, HEADER
, (payload_t
**)&ike_header
);
68 tester
->assert_true(tester
,(status
== SUCCESS
),"parse_payload call check");
69 parser
->destroy(parser
);
71 if (status
!= SUCCESS
)
76 tester
->assert_true(tester
,(ike_header
->get_initiator_spi(ike_header
) == 1),"parsed initiator_spi value");
77 tester
->assert_true(tester
,(ike_header
->get_responder_spi(ike_header
) == 2),"parsed responder_spi value");
78 tester
->assert_true(tester
,(ike_header
->payload_interface
.get_next_type((payload_t
*)ike_header
) == 3),"parsed next_payload value");
79 tester
->assert_true(tester
,(ike_header
->get_maj_version(ike_header
) == 4),"parsed maj_version value");
80 tester
->assert_true(tester
,(ike_header
->get_min_version(ike_header
) == 5),"parsed min_version value");
81 tester
->assert_true(tester
,(ike_header
->get_exchange_type(ike_header
) == 6),"parsed exchange_type value");
82 tester
->assert_true(tester
,(ike_header
->get_initiator_flag(ike_header
) == TRUE
),"parsed flags.initiator value");
83 tester
->assert_true(tester
,(ike_header
->get_version_flag(ike_header
) == FALSE
),"parsed flags.version value");
84 tester
->assert_true(tester
,(ike_header
->get_response_flag(ike_header
) == TRUE
),"parsed flags.response value");
85 tester
->assert_true(tester
,(ike_header
->get_message_id(ike_header
) == 7),"parsed message_id value");
86 tester
->assert_true(tester
,(ike_header
->payload_interface
.get_length((payload_t
*)ike_header
) == 0x1C),"parsed length value");
88 ike_header
->destroy(ike_header
);
94 void test_parser_with_sa_payload(tester_t
*tester
)
97 sa_payload_t
*sa_payload
;
100 iterator_t
*proposals
, *transforms
, *attributes
;
102 u_int8_t sa_bytes
[] = {
103 0x00,0x80,0x00,0x24, /* payload header*/
104 0x00,0x00,0x00,0x20, /* a proposal */
106 0x01,0x02,0x03,0x04, /* spi */
107 0x00,0x00,0x00,0x14, /* transform */
109 0x80,0x01,0x00,0x05, /* attribute without length */
110 0x00,0x03,0x00,0x04, /* attribute with lenngth */
116 sa_chunk
.ptr
= sa_bytes
;
117 sa_chunk
.len
= sizeof(sa_bytes
);
120 parser
= parser_create(sa_chunk
);
121 tester
->assert_true(tester
,(parser
!= NULL
), "parser create check");
122 status
= parser
->parse_payload(parser
, SECURITY_ASSOCIATION
, (payload_t
**)&sa_payload
);
123 tester
->assert_true(tester
,(status
== SUCCESS
),"parse_payload call check");
124 parser
->destroy(parser
);
126 if (status
!= SUCCESS
)
132 proposals
= sa_payload
->create_proposal_substructure_iterator(sa_payload
, TRUE
);
133 while (proposals
->has_next(proposals
))
135 proposal_substructure_t
*proposal
;
136 proposals
->current(proposals
, (void**)&proposal
);
138 u_int8_t spi_should
[] = {0x01, 0x02, 0x03, 0x04};
140 tester
->assert_true(tester
,(proposal
->get_proposal_number(proposal
) == 1),"proposal number");
141 tester
->assert_true(tester
,(proposal
->get_protocol_id(proposal
) == 2),"proposal id");
142 spi
= proposal
->get_spi(proposal
);
143 tester
->assert_false(tester
,(memcmp(&spi_should
, spi
.ptr
, spi
.len
)),"proposal spi");
145 transforms
= proposal
->create_transform_substructure_iterator(proposal
, TRUE
);
146 while(transforms
->has_next(transforms
))
148 transform_substructure_t
*transform
;
150 transforms
->current(transforms
, (void**)&transform
);
151 tester
->assert_true(tester
,(transform
->get_transform_type(transform
) == 7),"transform type");
152 tester
->assert_true(tester
,(transform
->get_transform_id(transform
) == 3),"transform id");
153 attributes
= transform
->create_transform_attribute_iterator(transform
, TRUE
);
155 while (attributes
->has_next(attributes
))
157 transform_attribute_t
*attribute
;
158 attributes
->current(attributes
, (void**)&attribute
);
161 u_int8_t value
[] = {0x05, 0x00};
162 chunk_t attribute_value
;
163 tester
->assert_true(tester
,(attribute
->get_attribute_type(attribute
) == 1),"attribute 1 type");
164 attribute_value
= attribute
->get_value_chunk(attribute
);
165 tester
->assert_false(tester
,(memcmp(&value
, attribute_value
.ptr
, attribute_value
.len
)),"attribute 1 value");
169 u_int8_t value
[] = {0x01, 0x02, 0x03, 0x04};
170 chunk_t attribute_value
;
171 tester
->assert_true(tester
,(attribute
->get_attribute_type(attribute
) == 3),"attribute 2 type");
172 attribute_value
= attribute
->get_value_chunk(attribute
);
173 tester
->assert_false(tester
,(memcmp(&value
, attribute_value
.ptr
, attribute_value
.len
)),"attribute 2 value");
177 attributes
->destroy(attributes
);
179 transforms
->destroy(transforms
);
181 proposals
->destroy(proposals
);
183 sa_payload
->destroy(sa_payload
);
187 * Described in Header
189 void test_parser_with_nonce_payload(tester_t
*tester
)
192 nonce_payload_t
*nonce_payload
;
194 chunk_t nonce_chunk
, result
;
196 u_int8_t nonce_bytes
[] = {
197 0x00,0x00,0x00,0x14, /* payload header */
198 0x00,0x01,0x02,0x03, /* 16 Byte nonce */
204 nonce_chunk
.ptr
= nonce_bytes
;
205 nonce_chunk
.len
= sizeof(nonce_bytes
);
207 parser
= parser_create(nonce_chunk
);
208 tester
->assert_true(tester
,(parser
!= NULL
), "parser create check");
209 status
= parser
->parse_payload(parser
, NONCE
, (payload_t
**)&nonce_payload
);
210 tester
->assert_true(tester
,(status
== SUCCESS
),"parse_payload call check");
211 parser
->destroy(parser
);
213 if (status
!= SUCCESS
)
217 nonce_payload
->get_nonce(nonce_payload
, &result
);
218 tester
->assert_true(tester
,(result
.len
== 16), "parsed nonce lenght");
219 tester
->assert_false(tester
,(memcmp(nonce_bytes
+ 4, result
.ptr
, result
.len
)), "parsed nonce data");
220 nonce_payload
->destroy(nonce_payload
);
221 allocator_free_chunk(&result
);
225 * Described in Header
227 void test_parser_with_id_payload(tester_t
*tester
)
230 id_payload_t
*id_payload
;
232 chunk_t id_chunk
, result
;
234 u_int8_t id_bytes
[] = {
235 0x00,0x00,0x00,0x14, /* payload header */
237 0x04,0x05,0x06,0x07,/* 12 Byte nonce */
242 id_chunk
.ptr
= id_bytes
;
243 id_chunk
.len
= sizeof(id_bytes
);
245 parser
= parser_create(id_chunk
);
246 tester
->assert_true(tester
,(parser
!= NULL
), "parser create check");
247 status
= parser
->parse_payload(parser
, ID_INITIATOR
, (payload_t
**)&id_payload
);
248 tester
->assert_true(tester
,(status
== SUCCESS
),"parse_payload call check");
249 parser
->destroy(parser
);
251 if (status
!= SUCCESS
)
255 result
= id_payload
->get_data(id_payload
);
256 tester
->assert_true(tester
,(id_payload
->get_initiator(id_payload
) == TRUE
), "is IDi payload");
257 tester
->assert_true(tester
,(id_payload
->get_id_type(id_payload
) == ID_IPV6_ADDR
), "is ID_IPV6_ADDR ID type");
258 tester
->assert_true(tester
,(result
.len
== 12), "parsed data lenght");
259 tester
->assert_false(tester
,(memcmp(id_bytes
+ 8, result
.ptr
, result
.len
)), "parsed nonce data");
260 id_payload
->destroy(id_payload
);
261 allocator_free_chunk(&result
);
266 * Described in Header
268 void test_parser_with_ke_payload(tester_t
*tester
)
271 ke_payload_t
*ke_payload
;
273 chunk_t ke_chunk
, result
;
275 u_int8_t ke_bytes
[] = {
276 0x00,0x00,0x00,0x18, /* payload header */
277 0x00,0x03,0x00,0x00, /* dh group 3 */
278 0x01,0x02,0x03,0x03, /* 16 Byte dh data */
284 ke_chunk
.ptr
= ke_bytes
;
285 ke_chunk
.len
= sizeof(ke_bytes
);
287 parser
= parser_create(ke_chunk
);
288 tester
->assert_true(tester
,(parser
!= NULL
), "parser create check");
289 status
= parser
->parse_payload(parser
, KEY_EXCHANGE
, (payload_t
**)&ke_payload
);
290 tester
->assert_true(tester
,(status
== SUCCESS
),"parse_payload call check");
291 parser
->destroy(parser
);
293 if (status
!= SUCCESS
)
297 tester
->assert_true(tester
,(ke_payload
->get_dh_group_number(ke_payload
) == 3), "DH group");
298 result
= ke_payload
->get_key_exchange_data(ke_payload
);
299 tester
->assert_true(tester
,(result
.len
== 16), "parsed key lenght");
300 tester
->assert_false(tester
,(memcmp(ke_bytes
+ 8, result
.ptr
, result
.len
)), "parsed key data");
301 ke_payload
->destroy(ke_payload
);
306 * Described in Header
308 void test_parser_with_notify_payload(tester_t
*tester
)
311 notify_payload_t
*notify_payload
;
313 chunk_t notify_chunk
, result
;
315 u_int8_t notify_bytes
[] = {
316 0x00,0x00,0x00,0x1C, /* payload header */
318 0x01,0x02,0x03,0x03, /* spi */
319 0x04,0x05,0x06,0x07, /* noti dati */
325 notify_chunk
.ptr
= notify_bytes
;
326 notify_chunk
.len
= sizeof(notify_bytes
);
328 parser
= parser_create(notify_chunk
);
329 tester
->assert_true(tester
,(parser
!= NULL
), "parser create check");
330 status
= parser
->parse_payload(parser
, NOTIFY
, (payload_t
**)¬ify_payload
);
331 tester
->assert_true(tester
,(status
== SUCCESS
),"parse_payload call check");
332 parser
->destroy(parser
);
334 if (status
!= SUCCESS
)
338 tester
->assert_true(tester
,(notify_payload
->get_protocol_id(notify_payload
) == 3), "Protocol id");
339 tester
->assert_true(tester
,(notify_payload
->get_notify_message_type(notify_payload
) == 1), "notify message type");
341 result
= notify_payload
->get_spi(notify_payload
);
342 tester
->assert_false(tester
,(memcmp(notify_bytes
+ 8, result
.ptr
, result
.len
)), "parsed spi");
344 result
= notify_payload
->get_notification_data(notify_payload
);
345 tester
->assert_false(tester
,(memcmp(notify_bytes
+ 12, result
.ptr
, result
.len
)), "parsed notification data");
347 notify_payload
->destroy(notify_payload
);
351 * Described in Header
353 void test_parser_with_auth_payload(tester_t
*tester
)
356 auth_payload_t
*auth_payload
;
358 chunk_t auth_chunk
, result
;
360 u_int8_t auth_bytes
[] = {
361 0x00,0x00,0x00,0x14, /* payload header */
363 0x04,0x05,0x06,0x07,/* 12 Byte nonce */
368 auth_chunk
.ptr
= auth_bytes
;
369 auth_chunk
.len
= sizeof(auth_bytes
);
371 parser
= parser_create(auth_chunk
);
372 tester
->assert_true(tester
,(parser
!= NULL
), "parser create check");
373 status
= parser
->parse_payload(parser
, AUTHENTICATION
, (payload_t
**)&auth_payload
);
374 tester
->assert_true(tester
,(status
== SUCCESS
),"parse_payload call check");
375 parser
->destroy(parser
);
377 if (status
!= SUCCESS
)
381 result
= auth_payload
->get_data(auth_payload
);
382 tester
->assert_true(tester
,(auth_payload
->get_auth_method(auth_payload
) == DSS_DIGITAL_SIGNATURE
), "is DSS_DIGITAL_SIGNATURE method");
383 tester
->assert_true(tester
,(result
.len
== 12), "parsed data lenght");
384 tester
->assert_false(tester
,(memcmp(auth_bytes
+ 8, result
.ptr
, result
.len
)), "parsed nonce data");
385 auth_payload
->destroy(auth_payload
);
386 allocator_free_chunk(&result
);
390 * Described in Header
392 void test_parser_with_ts_payload(tester_t
*tester
)
395 ts_payload_t
*ts_payload
;
398 traffic_selector_substructure_t
*ts1
, *ts2
;
399 host_t
*start_host1
, *start_host2
, *end_host1
, *end_host2
;
400 iterator_t
*iterator
;
402 u_int8_t ts_bytes
[] = {
407 /* traffic selector 1 */
413 /* traffic selector 2 */
420 ts_chunk
.ptr
= ts_bytes
;
421 ts_chunk
.len
= sizeof(ts_bytes
);
423 parser
= parser_create(ts_chunk
);
424 tester
->assert_true(tester
,(parser
!= NULL
), "parser create check");
425 status
= parser
->parse_payload(parser
, TRAFFIC_SELECTOR_RESPONDER
, (payload_t
**)&ts_payload
);
426 tester
->assert_true(tester
,(status
== SUCCESS
),"parse_payload call check");
427 parser
->destroy(parser
);
429 if (status
!= SUCCESS
)
434 iterator
= ts_payload
->create_traffic_selector_substructure_iterator(ts_payload
,TRUE
);
436 tester
->assert_true(tester
,(iterator
->has_next(iterator
)), "has next check");
439 iterator
->current(iterator
,(void **)&ts1
);
440 tester
->assert_true(tester
,(ts1
->get_protocol_id(ts1
) == 0), "ip protocol id check");
441 start_host1
= ts1
->get_start_host(ts1
);
442 end_host1
= ts1
->get_end_host(ts1
);
443 tester
->assert_true(tester
,(start_host1
->get_port(start_host1
) == 500), "start port check");
444 tester
->assert_true(tester
,(end_host1
->get_port(end_host1
) == 500), "start port check");
445 tester
->assert_true(tester
,(memcmp(start_host1
->get_address(start_host1
),"192.168.1.0",strlen("192.168.1.0")) == 0), "start address check");
446 tester
->assert_true(tester
,(memcmp(end_host1
->get_address(end_host1
),"192.168.1.255",strlen("192.168.1.255")) == 0), "end address check");
448 start_host1
->destroy(start_host1
);
449 end_host1
->destroy(end_host1
);
451 tester
->assert_true(tester
,(iterator
->has_next(iterator
)), "has next check");
453 /* check second ts */
455 iterator
->current(iterator
,(void **)&ts2
);
457 tester
->assert_true(tester
,(ts2
->get_protocol_id(ts2
) == 3), "ip protocol id check");
458 start_host2
= ts2
->get_start_host(ts2
);
459 end_host2
= ts2
->get_end_host(ts2
);
460 tester
->assert_true(tester
,(start_host2
->get_port(start_host2
) == 0), "start port check");
461 tester
->assert_true(tester
,(end_host2
->get_port(end_host2
) == 65535), "start port check");
462 tester
->assert_true(tester
,(memcmp(start_host2
->get_address(start_host2
),"0.0.0.0",strlen("0.0.0.0")) == 0), "start address check");
463 tester
->assert_true(tester
,(memcmp(end_host2
->get_address(end_host2
),"255.255.255.255",strlen("255.255.255.255")) == 0), "end address check");
464 start_host2
->destroy(start_host2
);
465 end_host2
->destroy(end_host2
);
469 tester
->assert_false(tester
,(iterator
->has_next(iterator
)), "has next check");
471 iterator
->destroy(iterator
);
473 ts_payload
->destroy(ts_payload
);