diff --git a/Source/charon/testcases/generator_test.c b/Source/charon/testcases/generator_test.c index 5ec4bcae1..2a981fbf5 100644 --- a/Source/charon/testcases/generator_test.c +++ b/Source/charon/testcases/generator_test.c @@ -33,6 +33,7 @@ #include "../payloads/ike_header.h" #include "../payloads/transform_attribute.h" #include "../payloads/transform_substructure.h" +#include "../payloads/proposal_substructure.h" /* * Described in Header @@ -308,3 +309,138 @@ void test_generator_with_transform_substructure(tester_t *tester) global_logger_manager->destroy_logger(global_logger_manager,logger); } + + +/* + * Described in header + */ +void test_generator_with_proposal_substructure(tester_t *tester) +{ + generator_t *generator; + transform_attribute_t *attribute1, *attribute2, *attribute3; + transform_substructure_t *transform1, *transform2; + proposal_substructure_t *proposal; + chunk_t data; + status_t status; + chunk_t generated_data; + logger_t *logger; + + logger = global_logger_manager->create_logger(global_logger_manager,TESTER,"transform substr."); + + /* create generator */ + generator = generator_create(); + tester->assert_true(tester,(generator != NULL), "generator create check"); + + /* create attribute 1 */ + attribute1 = transform_attribute_create(); + char *stringval = "abcd"; + data.ptr = (void *) stringval; + data.len = 4; + status = attribute1->set_value(attribute1,data); + tester->assert_true(tester,(status == SUCCESS),"set_value call check"); + status = attribute1->set_attribute_type(attribute1,0); + tester->assert_true(tester,(status == SUCCESS),"set_attribute_type call check"); + logger->log(logger,CONTROL,"attribute1 created"); + + /* create attribute 2 */ + attribute2 = transform_attribute_create(); + stringval = "efgh"; + data.ptr = (void *) stringval; + data.len = 4; + status = attribute2->set_value(attribute2,data); + tester->assert_true(tester,(status == SUCCESS),"set_value call check"); + status = attribute2->set_attribute_type(attribute2,0); + tester->assert_true(tester,(status == SUCCESS),"set_attribute_type call check"); + logger->log(logger,CONTROL,"attribute2 created"); + + /* create attribute 3 */ + attribute3 = transform_attribute_create(); + stringval = "ijkl"; + data.ptr = (void *) stringval; + data.len = 4; + status = attribute3->set_value(attribute3,data); + tester->assert_true(tester,(status == SUCCESS),"set_value call check"); + status = attribute3->set_attribute_type(attribute3,0); + tester->assert_true(tester,(status == SUCCESS),"set_attribute_type call check"); + logger->log(logger,CONTROL,"attribute3 created"); + + /* create transform 1*/ + transform1 = transform_substructure_create(); + tester->assert_true(tester,(transform1 != NULL), "transform create check"); + status = transform1->add_transform_attribute(transform1,attribute1); + tester->assert_true(tester,(status == SUCCESS),"add_transform_attribute call check"); + status = transform1->add_transform_attribute(transform1,attribute2); + tester->assert_true(tester,(status == SUCCESS),"add_transform_attribute call check"); + status = transform1->set_transform_type(transform1,5); /* hex 5 */ + tester->assert_true(tester,(status == SUCCESS),"set_transform_type call check"); + status = transform1->set_transform_id(transform1,65000); /* hex FDE8 */ + tester->assert_true(tester,(status == SUCCESS),"set_transform_id call check"); + + /* create transform 2*/ + transform2 = transform_substructure_create(); + tester->assert_true(tester,(transform2 != NULL), "transform create check"); + status = transform2->add_transform_attribute(transform2,attribute3); + tester->assert_true(tester,(status == SUCCESS),"add_transform_attribute call check"); + status = transform2->set_transform_type(transform2,3); /* hex 3 */ + tester->assert_true(tester,(status == SUCCESS),"set_transform_type call check"); + status = transform2->set_transform_id(transform2,4); /* hex 4 */ + tester->assert_true(tester,(status == SUCCESS),"set_transform_id call check"); + + logger->log(logger,CONTROL,"transforms created"); + + proposal = proposal_substructure_create(); + tester->assert_true(tester,(proposal != NULL), "proposal create check"); + + stringval = "ABCDEFGH"; + data.ptr = (void *) stringval; + data.len = 8; + + status = proposal->add_transform_substructure(proposal,transform1); + tester->assert_true(tester,(status == SUCCESS),"add_transform_substructure call check"); + status = proposal->add_transform_substructure(proposal,transform2); + tester->assert_true(tester,(status == SUCCESS),"add_transform_substructure call check"); + status = proposal->set_spi(proposal,data); + tester->assert_true(tester,(status == SUCCESS),"set_spi call check"); + status = proposal->set_proposal_number(proposal,7); + tester->assert_true(tester,(status == SUCCESS),"set_proposal_number call check"); + status = proposal->set_protocol_id(proposal,4); + tester->assert_true(tester,(status == SUCCESS),"set_protocol_id call check"); + + + status = generator->generate_payload(generator,(payload_t *)proposal); + tester->assert_true(tester,(status == SUCCESS),"generate_payload call check"); + tester->assert_true(tester,(generator->write_to_chunk(generator,&generated_data) == SUCCESS),"write_to_chunk call check"); + logger->log_chunk(logger,RAW,"generated transform",&generated_data); + + u_int8_t expected_generation[] = { + /* proposal header */ + 0x00,0x00,0x00,0x38, + 0x07,0x04,0x08,0x02, + /* SPI */ + 0x41,0x42,0x43,0x44, + 0x45,0x46,0x47,0x48, + /* first transform */ + 0x03,0x00,0x00,0x18, + 0x05,0x00,0xFD,0xE8, + /* first transform attributes */ + 0x00,0x00,0x00,0x04, + 0x61,0x62,0x63,0x64, + 0x00,0x00,0x00,0x04, + 0x65,0x66,0x67,0x68, + /* second transform */ + 0x00,0x00,0x00,0x10, + 0x03,0x00,0x00,0x04, + /* second transform attributes */ + 0x00,0x00,0x00,0x04, + 0x69,0x6A,0x6B,0x6C + }; + tester->assert_true(tester,(memcmp(expected_generation,generated_data.ptr,sizeof(expected_generation)) == 0), "compare generated data"); + + allocator_free_chunk(generated_data); + tester->assert_true(tester,(proposal->destroy(proposal) == SUCCESS), "proposal destroy call check"); + tester->assert_true(tester,(generator->destroy(generator) == SUCCESS), "generator destroy call check"); + + + global_logger_manager->destroy_logger(global_logger_manager,logger); +} + diff --git a/Source/charon/testcases/generator_test.h b/Source/charon/testcases/generator_test.h index 7031dae93..faf9286e4 100644 --- a/Source/charon/testcases/generator_test.h +++ b/Source/charon/testcases/generator_test.h @@ -50,5 +50,13 @@ void test_generator_with_transform_attribute(tester_t *tester); */ void test_generator_with_transform_substructure(tester_t *tester); +/** + * @brief Test function used to test the generator with proposal substructure payload + * + * + * @param tester associated tester object + */ +void test_generator_with_proposal_substructure(tester_t *tester); + #endif /*GENERATOR_TEST_H_*/