Annotation of embedaddon/strongswan/src/libstrongswan/tests/suites/test_proposal.c, revision 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>