Annotation of embedaddon/strongswan/src/libstrongswan/tests/suites/test_proposal.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2016-2018 Tobias Brunner
                      3:  * HSR Hochschule fuer Technik Rapperswil
                      4:  *
                      5:  * This program is free software; you can redistribute it and/or modify it
                      6:  * under the terms of the GNU General Public License as published by the
                      7:  * Free Software Foundation; either version 2 of the License, or (at your
                      8:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
                      9:  *
                     10:  * This program is distributed in the hope that it will be useful, but
                     11:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     12:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
                     13:  * for more details.
                     14:  */
                     15: 
                     16: #include "test_suite.h"
                     17: 
                     18: #include <crypto/proposal/proposal.h>
                     19: 
                     20: static struct {
                     21:        protocol_id_t proto;
                     22:        char *proposal;
                     23:        char *expected;
                     24: } create_data[] = {
                     25:        { PROTO_IKE, "", NULL },
                     26:        { PROTO_IKE, "sha256", NULL },
                     27:        { PROTO_IKE, "sha256-modp3072", NULL },
                     28:        { PROTO_IKE, "null-sha256-modp3072", "IKE:NULL/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_3072" },
                     29:        { PROTO_IKE, "aes128", NULL },
                     30:        { PROTO_IKE, "aes128-sha256", NULL },
                     31:        { PROTO_IKE, "aes128-sha256-modpnone", NULL },
                     32:        { PROTO_IKE, "aes128-prfsha256", NULL },
                     33:        { PROTO_IKE, "aes128-prfsha256-modp2048", NULL },
                     34:        { PROTO_IKE, "aes128-sha256-modp3072", "IKE:AES_CBC_128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_3072" },
                     35:        { PROTO_IKE, "aes128-sha256-prfsha384-modp3072", "IKE:AES_CBC_128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_384/MODP_3072" },
                     36:        { PROTO_IKE, "aes128gcm16-modp3072", NULL },
                     37:        { PROTO_IKE, "aes128gcm16-prfsha256-modp3072", "IKE:AES_GCM_16_128/PRF_HMAC_SHA2_256/MODP_3072" },
                     38:        { PROTO_IKE, "aes128gcm16-sha256-modp3072", "IKE:AES_GCM_16_128/PRF_HMAC_SHA2_256/MODP_3072" },
                     39:        { PROTO_IKE, "aes128gcm16-aes128-modp3072", NULL },
                     40:        { PROTO_IKE, "aes128gcm16-aes128-sha256-modp3072", NULL },
                     41:        { PROTO_ESP, "", NULL },
                     42:        { PROTO_ESP, "sha256", NULL },
                     43:        { PROTO_ESP, "aes128-sha256", "ESP:AES_CBC_128/HMAC_SHA2_256_128/NO_EXT_SEQ" },
                     44:        { PROTO_ESP, "aes128-sha256-esn", "ESP:AES_CBC_128/HMAC_SHA2_256_128/EXT_SEQ" },
                     45:        { PROTO_ESP, "aes128-sha256-noesn", "ESP:AES_CBC_128/HMAC_SHA2_256_128/NO_EXT_SEQ" },
                     46:        { PROTO_ESP, "aes128-sha256-esn-noesn", "ESP:AES_CBC_128/HMAC_SHA2_256_128/EXT_SEQ/NO_EXT_SEQ" },
                     47:        { PROTO_ESP, "aes128-sha256-prfsha256-modp3072", "ESP:AES_CBC_128/HMAC_SHA2_256_128/MODP_3072/NO_EXT_SEQ" },
                     48:        { PROTO_ESP, "aes128gcm16-aes128-sha256-modp3072", NULL },
                     49:        { PROTO_ESP, "aes128gmac", "ESP:NULL_AES_GMAC_128/NO_EXT_SEQ" },
                     50:        { PROTO_AH,  "", NULL },
                     51:        { PROTO_AH,  "aes128", NULL },
                     52:        { PROTO_AH,  "aes128-sha256", "AH:HMAC_SHA2_256_128/NO_EXT_SEQ" },
                     53:        { PROTO_AH,  "sha256-sha1", "AH:HMAC_SHA2_256_128/HMAC_SHA1_96/NO_EXT_SEQ" },
                     54:        { PROTO_AH,  "aes128gmac-sha256", "AH:AES_128_GMAC/HMAC_SHA2_256_128/NO_EXT_SEQ" },
                     55:        { PROTO_AH,  "aes128gmac-sha256-prfsha256", "AH:AES_128_GMAC/HMAC_SHA2_256_128/NO_EXT_SEQ" },
                     56:        { PROTO_AH,  "aes128gmac-aes256gmac-aes128-sha256", "AH:AES_128_GMAC/AES_256_GMAC/HMAC_SHA2_256_128/NO_EXT_SEQ" },
                     57:        { PROTO_AH,  "sha256-esn", "AH:HMAC_SHA2_256_128/EXT_SEQ" },
                     58:        { PROTO_AH,  "sha256-noesn", "AH:HMAC_SHA2_256_128/NO_EXT_SEQ" },
                     59:        { PROTO_AH,  "sha256-esn-noesn", "AH:HMAC_SHA2_256_128/EXT_SEQ/NO_EXT_SEQ" },
                     60: };
                     61: 
                     62: static void assert_proposal_eq(proposal_t *proposal, char *expected)
                     63: {
                     64:        char str[BUF_LEN];
                     65: 
                     66:        if (!expected)
                     67:        {
                     68:                ck_assert(!proposal);
                     69:                return;
                     70:        }
                     71:        snprintf(str, sizeof(str), "%P", proposal);
                     72:        ck_assert_str_eq(expected, str);
                     73: }
                     74: 
                     75: START_TEST(test_create_from_string)
                     76: {
                     77:        proposal_t *proposal;
                     78: 
                     79:        proposal = proposal_create_from_string(create_data[_i].proto,
                     80:                                                                                   create_data[_i].proposal);
                     81:        assert_proposal_eq(proposal, create_data[_i].expected);
                     82:        DESTROY_IF(proposal);
                     83: }
                     84: END_TEST
                     85: 
                     86: static struct {
                     87:        protocol_id_t proto;
                     88:        char *self;
                     89:        char *other;
                     90:        char *expected;
                     91:        proposal_selection_flag_t flags;
                     92: } select_data[] = {
                     93:        { PROTO_ESP, "aes128", "aes128", "aes128" },
                     94:        { PROTO_ESP, "aes128", "aes256", NULL },
                     95:        { PROTO_ESP, "aes128-aes256", "aes256-aes128", "aes128" },
                     96:        { PROTO_ESP, "aes256-aes128", "aes128-aes256", "aes256" },
                     97:        { PROTO_ESP, "aes128-aes256-sha1-sha256", "aes256-aes128-sha256-sha1", "aes128-sha1" },
                     98:        { PROTO_ESP, "aes256-aes128-sha256-sha1", "aes128-aes256-sha1-sha256", "aes256-sha256" },
                     99:        { PROTO_ESP, "aes128-sha256-modp3072", "aes128-sha256", NULL },
                    100:        { PROTO_ESP, "aes128-sha256-modp3072", "aes128-sha256", "aes128-sha256", PROPOSAL_SKIP_DH },
                    101:        { PROTO_ESP, "aes128-sha256", "aes128-sha256-modp3072", NULL },
                    102:        { PROTO_ESP, "aes128-sha256", "aes128-sha256-modp3072", "aes128-sha256", PROPOSAL_SKIP_DH },
                    103:        { PROTO_ESP, "aes128-sha256-modp3072", "aes128-sha256-modp3072", "aes128-sha256", PROPOSAL_SKIP_DH },
                    104:        { PROTO_ESP, "aes128-sha256-modp3072", "aes128-sha256-ecp256", "aes128-sha256", PROPOSAL_SKIP_DH },
                    105:        { PROTO_ESP, "aes128-sha256-modp3072", "aes128-sha256-modpnone", NULL },
                    106:        { PROTO_ESP, "aes128-sha256-modpnone", "aes128-sha256-modp3072", NULL },
                    107:        { PROTO_ESP, "aes128-sha256-modp3072-modpnone", "aes128-sha256", "aes128-sha256" },
                    108:        { PROTO_ESP, "aes128-sha256", "aes128-sha256-modp3072-modpnone", "aes128-sha256" },
                    109:        { PROTO_ESP, "aes128-sha256-modp3072-modpnone", "aes128-sha256-modpnone-modp3072", "aes128-sha256-modp3072" },
                    110:        { PROTO_ESP, "aes128-sha256-modpnone-modp3072", "aes128-sha256-modp3072-modpnone", "aes128-sha256" },
                    111:        { PROTO_ESP, "aes128-sha256-esn", "aes128-sha256-esn", "aes128-sha256-esn" },
                    112:        { PROTO_ESP, "aes128-sha256-noesn", "aes128-sha256-esn", NULL },
                    113:        { PROTO_ESP, "aes128-sha256-noesn-esn", "aes128-sha256-esn", "aes128-sha256-esn" },
                    114:        { PROTO_ESP, "aes128-sha256-noesn-esn", "aes128-sha256", "aes128-sha256" },
                    115:        { PROTO_ESP, "aes128-sha256-esn-noesn", "aes128-sha256-noesn-esn", "aes128-sha256-esn" },
                    116:        { PROTO_IKE, "aes128-sha256-modp3072", "aes128-sha256-modp3072", "aes128-sha256-modp3072" },
                    117:        { PROTO_IKE, "aes128-sha256-modp3072", "aes128-sha256-modp3072-modpnone", "aes128-sha256-modp3072" },
                    118:        { PROTO_IKE, "aes128-sha256-modp3072-modpnone", "aes128-sha256-modp3072", "aes128-sha256-modp3072" },
                    119: };
                    120: 
                    121: START_TEST(test_select)
                    122: {
                    123:        proposal_t *self, *other, *selected, *expected;
                    124: 
                    125:        self = proposal_create_from_string(select_data[_i].proto,
                    126:                                                                           select_data[_i].self);
                    127:        other = proposal_create_from_string(select_data[_i].proto,
                    128:                                                                                select_data[_i].other);
                    129:        selected = self->select(self, other, select_data[_i].flags);
                    130:        if (select_data[_i].expected)
                    131:        {
                    132:                expected = proposal_create_from_string(select_data[_i].proto,
                    133:                                                                                           select_data[_i].expected);
                    134:                ck_assert(selected);
                    135:                ck_assert_msg(expected->equals(expected, selected), "proposal %P does "
                    136:                                          "not match expected %P", selected, expected);
                    137:                expected->destroy(expected);
                    138:        }
                    139:        else
                    140:        {
                    141:                ck_assert(!selected);
                    142:        }
                    143:        DESTROY_IF(selected);
                    144:        other->destroy(other);
                    145:        self->destroy(self);
                    146: }
                    147: END_TEST
                    148: 
                    149: START_TEST(test_select_spi)
                    150: {
                    151:        proposal_t *self, *other, *selected;
                    152: 
                    153:        self = proposal_create_from_string(PROTO_ESP, "aes128-sha256-modp3072");
                    154:        other = proposal_create_from_string(PROTO_ESP, "aes128-sha256-modp3072");
                    155:        other->set_spi(other, 0x12345678);
                    156: 
                    157:        selected = self->select(self, other, 0);
                    158:        ck_assert(selected);
                    159:        ck_assert_int_eq(selected->get_spi(selected), other->get_spi(other));
                    160:        selected->destroy(selected);
                    161: 
                    162:        selected = self->select(self, other, PROPOSAL_PREFER_SUPPLIED);
                    163:        ck_assert(selected);
                    164:        ck_assert_int_eq(selected->get_spi(selected), self->get_spi(self));
                    165:        selected->destroy(selected);
                    166: 
                    167:        other->destroy(other);
                    168:        self->destroy(self);
                    169: }
                    170: END_TEST
                    171: 
                    172: START_TEST(test_matches)
                    173: {
                    174:        proposal_t *self, *other;
                    175: 
                    176:        self = proposal_create_from_string(select_data[_i].proto,
                    177:                                                                           select_data[_i].self);
                    178:        other = proposal_create_from_string(select_data[_i].proto,
                    179:                                                                                select_data[_i].other);
                    180:        if (select_data[_i].expected)
                    181:        {
                    182:                ck_assert(self->matches(self, other, select_data[_i].flags));
                    183:                ck_assert(other->matches(other, self, select_data[_i].flags));
                    184:                ck_assert(self->matches(self, other,
                    185:                                  select_data[_i].flags | PROPOSAL_PREFER_SUPPLIED));
                    186:                ck_assert(other->matches(other, self,
                    187:                                  select_data[_i].flags | PROPOSAL_PREFER_SUPPLIED));
                    188:        }
                    189:        else
                    190:        {
                    191:                ck_assert(!self->matches(self, other, select_data[_i].flags));
                    192:                ck_assert(!other->matches(other, self, select_data[_i].flags));
                    193:                ck_assert(!self->matches(self, other,
                    194:                                  select_data[_i].flags | PROPOSAL_PREFER_SUPPLIED));
                    195:                ck_assert(!other->matches(other, self,
                    196:                                  select_data[_i].flags | PROPOSAL_PREFER_SUPPLIED));
                    197:        }
                    198:        other->destroy(other);
                    199:        self->destroy(self);
                    200: }
                    201: END_TEST
                    202: 
                    203: static struct {
                    204:        protocol_id_t proto;
                    205:        char *self[5];
                    206:        char *other[5];
                    207:        char *expected;
                    208:        proposal_selection_flag_t flags;
                    209: } select_proposal_data[] = {
                    210:        { PROTO_ESP, {}, {}, NULL },
                    211:        { PROTO_ESP, { "aes128" }, {}, NULL },
                    212:        { PROTO_ESP, {}, { "aes128" }, NULL },
                    213:        { PROTO_ESP, { "aes128" }, { "aes256" }, NULL },
                    214:        { PROTO_ESP, { "aes128" }, { "aes128" }, "aes128" },
                    215:        { PROTO_ESP, { "aes128", "aes256" }, { "aes256", "aes128" }, "aes128" },
                    216:        { PROTO_ESP, { "aes128", "aes256" }, { "aes256", "aes128" }, "aes256",
                    217:                PROPOSAL_PREFER_SUPPLIED },
                    218:        { PROTO_ESP, { "aes128-modp1024", "aes256-modp1024" },
                    219:                                 { "aes256-modp2048", "aes128-modp2048" }, NULL },
                    220:        { PROTO_ESP, { "aes128-modp1024", "aes256-modp1024" },
                    221:                                 { "aes256-modp2048", "aes128-modp2048" }, "aes128",
                    222:                PROPOSAL_SKIP_DH },
                    223:        { PROTO_ESP, { "aes128-modp1024", "aes256-modp1024" },
                    224:                                 { "aes256-modp2048", "aes128-modp2048" }, "aes256",
                    225:                PROPOSAL_PREFER_SUPPLIED | PROPOSAL_SKIP_DH },
                    226: };
                    227: 
                    228: START_TEST(test_select_proposal)
                    229: {
                    230:        linked_list_t *self, *other;
                    231:        proposal_t *proposal, *selected, *expected;
                    232:        int i;
                    233: 
                    234:        self = linked_list_create();
                    235:        other = linked_list_create();
                    236: 
                    237:        for (i = 0; i < countof(select_proposal_data[_i].self); i++)
                    238:        {
                    239:                if (!select_proposal_data[_i].self[i])
                    240:                {
                    241:                        break;
                    242:                }
                    243:                proposal = proposal_create_from_string(select_proposal_data[_i].proto,
                    244:                                                                                        select_proposal_data[_i].self[i]);
                    245:                self->insert_last(self, proposal);
                    246:        }
                    247:        for (i = 0; i < countof(select_proposal_data[_i].other); i++)
                    248:        {
                    249:                if (!select_proposal_data[_i].other[i])
                    250:                {
                    251:                        break;
                    252:                }
                    253:                proposal = proposal_create_from_string(select_proposal_data[_i].proto,
                    254:                                                                                        select_proposal_data[_i].other[i]);
                    255:                other->insert_last(other, proposal);
                    256:        }
                    257:        selected = proposal_select(self, other, select_proposal_data[_i].flags);
                    258:        if (select_proposal_data[_i].expected)
                    259:        {
                    260:                expected = proposal_create_from_string(select_proposal_data[_i].proto,
                    261:                                                                                        select_proposal_data[_i].expected);
                    262:                ck_assert(selected);
                    263:                ck_assert_msg(expected->equals(expected, selected), "proposal %P does "
                    264:                                          "not match expected %P", selected, expected);
                    265:                expected->destroy(expected);
                    266:        }
                    267:        else
                    268:        {
                    269:                ck_assert(!selected);
                    270:        }
                    271:        DESTROY_IF(selected);
                    272:        other->destroy_offset(other, offsetof(proposal_t, destroy));
                    273:        self->destroy_offset(self, offsetof(proposal_t, destroy));
                    274: }
                    275: END_TEST
                    276: 
                    277: START_TEST(test_promote_dh_group)
                    278: {
                    279:        proposal_t *proposal;
                    280: 
                    281:        proposal = proposal_create_from_string(PROTO_IKE,
                    282:                                                                                   "aes128-sha256-modp3072-ecp256");
                    283:        ck_assert(proposal->promote_dh_group(proposal, ECP_256_BIT));
                    284:        assert_proposal_eq(proposal, "IKE:AES_CBC_128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/ECP_256/MODP_3072");
                    285:        proposal->destroy(proposal);
                    286: }
                    287: END_TEST
                    288: 
                    289: START_TEST(test_promote_dh_group_already_front)
                    290: {
                    291:        proposal_t *proposal;
                    292: 
                    293:        proposal = proposal_create_from_string(PROTO_IKE,
                    294:                                                                                   "aes128-sha256-modp3072-ecp256");
                    295:        ck_assert(proposal->promote_dh_group(proposal, MODP_3072_BIT));
                    296:        assert_proposal_eq(proposal, "IKE:AES_CBC_128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_3072/ECP_256");
                    297:        proposal->destroy(proposal);
                    298: }
                    299: END_TEST
                    300: 
                    301: START_TEST(test_promote_dh_group_not_contained)
                    302: {
                    303:        proposal_t *proposal;
                    304: 
                    305:        proposal = proposal_create_from_string(PROTO_IKE,
                    306:                                                                                   "aes128-sha256-modp3072-ecp256");
                    307: 
                    308:        ck_assert(!proposal->promote_dh_group(proposal, MODP_2048_BIT));
                    309:        assert_proposal_eq(proposal, "IKE:AES_CBC_128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_3072/ECP_256");
                    310:        proposal->destroy(proposal);
                    311: }
                    312: END_TEST
                    313: 
                    314: START_TEST(test_unknown_transform_types_print)
                    315: {
                    316:        proposal_t *proposal;
                    317: 
                    318:        proposal = proposal_create(PROTO_IKE, 0);
                    319:        proposal->add_algorithm(proposal, 242, 42, 128);
                    320:        assert_proposal_eq(proposal, "IKE:UNKNOWN_242_42_128");
                    321:        proposal->destroy(proposal);
                    322: 
                    323:        proposal = proposal_create_from_string(PROTO_IKE,
                    324:                                                                                   "aes128-sha256-ecp256");
                    325:        proposal->add_algorithm(proposal, 242, 42, 128);
                    326:        proposal->add_algorithm(proposal, 243, 1, 0);
                    327:        assert_proposal_eq(proposal, "IKE:AES_CBC_128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/ECP_256/UNKNOWN_242_42_128/UNKNOWN_243_1");
                    328:        proposal->destroy(proposal);
                    329: }
                    330: END_TEST
                    331: 
                    332: START_TEST(test_unknown_transform_types_equals)
                    333: {
                    334:        proposal_t *self, *other;
                    335: 
                    336:        self = proposal_create_from_string(PROTO_IKE, "aes128-sha256-ecp256");
                    337:        other = proposal_create_from_string(PROTO_IKE, "aes128-sha256-ecp256");
                    338:        other->add_algorithm(other, 242, 42, 0);
                    339:        ck_assert(!self->equals(self, other));
                    340:        ck_assert(!other->equals(other, self));
                    341:        self->add_algorithm(self, 242, 42, 0);
                    342:        ck_assert(self->equals(self, other));
                    343:        ck_assert(other->equals(other, self));
                    344:        other->destroy(other);
                    345:        self->destroy(self);
                    346: }
                    347: END_TEST
                    348: 
                    349: START_TEST(test_unknown_transform_types_select_fail)
                    350: {
                    351:        proposal_t *self, *other, *selected;
                    352: 
                    353:        self = proposal_create_from_string(PROTO_IKE, "aes128-sha256-ecp256");
                    354:        other = proposal_create_from_string(PROTO_IKE, "aes128-sha256-ecp256");
                    355:        other->add_algorithm(other, 242, 42, 0);
                    356: 
                    357:        selected = self->select(self, other, 0);
                    358:        ck_assert(!selected);
                    359:        other->destroy(other);
                    360:        self->destroy(self);
                    361: }
                    362: END_TEST
                    363: 
                    364: START_TEST(test_unknown_transform_types_select_fail_subtype)
                    365: {
                    366:        proposal_t *self, *other, *selected;
                    367: 
                    368:        self = proposal_create_from_string(PROTO_IKE, "aes128-sha256-ecp256");
                    369:        self->add_algorithm(self, 242, 8, 0);
                    370:        other = proposal_create_from_string(PROTO_IKE, "aes128-sha256-ecp256");
                    371:        other->add_algorithm(other, 242, 42, 0);
                    372: 
                    373:        selected = self->select(self, other, 0);
                    374:        ck_assert(!selected);
                    375:        other->destroy(other);
                    376:        self->destroy(self);
                    377: }
                    378: END_TEST
                    379: 
                    380: START_TEST(test_unknown_transform_types_select_success)
                    381: {
                    382:        proposal_t *self, *other, *selected;
                    383: 
                    384:        self = proposal_create_from_string(PROTO_IKE, "aes128-sha256-ecp256");
                    385:        self->add_algorithm(self, 242, 42, 128);
                    386:        other = proposal_create_from_string(PROTO_IKE, "aes128-sha256-ecp256");
                    387:        other->add_algorithm(other, 242, 42, 128);
                    388:        other->add_algorithm(other, 242, 1, 0);
                    389: 
                    390:        selected = self->select(self, other, 0);
                    391:        ck_assert(selected);
                    392:        assert_proposal_eq(selected, "IKE:AES_CBC_128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/ECP_256/UNKNOWN_242_42_128");
                    393:        selected->destroy(selected);
                    394:        other->destroy(other);
                    395:        self->destroy(self);
                    396: }
                    397: END_TEST
                    398: 
                    399: START_TEST(test_chacha20_poly1305_key_length)
                    400: {
                    401:        proposal_t *proposal;
                    402:        uint16_t alg, ks;
                    403: 
                    404:        proposal = proposal_create_from_string(PROTO_IKE, "chacha20poly1305-prfsha256-ecp256");
                    405:        proposal->get_algorithm(proposal, ENCRYPTION_ALGORITHM, &alg, &ks);
                    406:        ck_assert_int_eq(alg, ENCR_CHACHA20_POLY1305);
                    407:        ck_assert_int_eq(ks, 0);
                    408:        assert_proposal_eq(proposal, "IKE:CHACHA20_POLY1305/PRF_HMAC_SHA2_256/ECP_256");
                    409:        proposal->destroy(proposal);
                    410: }
                    411: END_TEST
                    412: 
                    413: static struct {
                    414:        protocol_id_t proto;
                    415:        char *orig;
                    416:        char *expected;
                    417:        proposal_selection_flag_t flags;
                    418: } clone_data[] = {
                    419:        { PROTO_ESP, "aes128", "aes128" },
                    420:        { PROTO_ESP, "aes128-serpent", "aes128-serpent" },
                    421:        { PROTO_ESP, "aes128-serpent", "aes128", PROPOSAL_SKIP_PRIVATE },
                    422:        { PROTO_ESP, "aes128-sha256-modp3072", "aes128-sha256-modp3072" },
                    423:        { PROTO_ESP, "aes128-sha256-modp3072", "aes128-sha256", PROPOSAL_SKIP_DH },
                    424:        { PROTO_ESP, "aes128-serpent-modp3072", "aes128-serpent",
                    425:                PROPOSAL_SKIP_DH },
                    426:        { PROTO_ESP, "aes128-serpent-modp3072", "aes128",
                    427:                PROPOSAL_SKIP_PRIVATE | PROPOSAL_SKIP_DH },
                    428: };
                    429: 
                    430: START_TEST(test_clone)
                    431: {
                    432:        proposal_t *orig, *result, *expected;
                    433: 
                    434:        orig = proposal_create_from_string(clone_data[_i].proto,
                    435:                                                                           clone_data[_i].orig);
                    436:        orig->set_spi(orig, 0x12345678);
                    437: 
                    438:        result = orig->clone(orig, clone_data[_i].flags);
                    439: 
                    440:        expected = proposal_create_from_string(clone_data[_i].proto,
                    441:                                                                                   clone_data[_i].expected);
                    442:        ck_assert_msg(expected->equals(expected, result), "proposal %P does "
                    443:                                  "not match expected %P", result, expected);
                    444:        ck_assert_int_eq(orig->get_spi(orig), result->get_spi(result));
                    445: 
                    446:        expected->destroy(expected);
                    447:        result->destroy(result);
                    448:        orig->destroy(orig);
                    449: }
                    450: END_TEST
                    451: 
                    452: Suite *proposal_suite_create()
                    453: {
                    454:        Suite *s;
                    455:        TCase *tc;
                    456: 
                    457:        s = suite_create("proposal");
                    458: 
                    459:        tc = tcase_create("create_from_string");
                    460:        tcase_add_loop_test(tc, test_create_from_string, 0, countof(create_data));
                    461:        suite_add_tcase(s, tc);
                    462: 
                    463:        tc = tcase_create("select");
                    464:        tcase_add_loop_test(tc, test_select, 0, countof(select_data));
                    465:        tcase_add_test(tc, test_select_spi);
                    466:        suite_add_tcase(s, tc);
                    467: 
                    468:        tc = tcase_create("matches");
                    469:        tcase_add_loop_test(tc, test_matches, 0, countof(select_data));
                    470:        suite_add_tcase(s, tc);
                    471: 
                    472:        tc = tcase_create("select_proposal");
                    473:        tcase_add_loop_test(tc, test_select_proposal, 0,
                    474:                                                countof(select_proposal_data));
                    475:        suite_add_tcase(s, tc);
                    476: 
                    477:        tc = tcase_create("promote_dh_group");
                    478:        tcase_add_test(tc, test_promote_dh_group);
                    479:        tcase_add_test(tc, test_promote_dh_group_already_front);
                    480:        tcase_add_test(tc, test_promote_dh_group_not_contained);
                    481:        suite_add_tcase(s, tc);
                    482: 
                    483:        tc = tcase_create("unknown transform types");
                    484:        tcase_add_test(tc, test_unknown_transform_types_print);
                    485:        tcase_add_test(tc, test_unknown_transform_types_equals);
                    486:        tcase_add_test(tc, test_unknown_transform_types_select_fail);
                    487:        tcase_add_test(tc, test_unknown_transform_types_select_fail_subtype);
                    488:        tcase_add_test(tc, test_unknown_transform_types_select_success);
                    489:        suite_add_tcase(s, tc);
                    490: 
                    491:        tc = tcase_create("chacha20/poly1305");
                    492:        tcase_add_test(tc, test_chacha20_poly1305_key_length);
                    493:        suite_add_tcase(s, tc);
                    494: 
                    495:        tc = tcase_create("clone");
                    496:        tcase_add_loop_test(tc, test_clone, 0, countof(clone_data));
                    497:        suite_add_tcase(s, tc);
                    498: 
                    499:        return s;
                    500: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>