Annotation of embedaddon/strongswan/src/libstrongswan/tests/suites/test_crypto_factory.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (C) 2014 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/crypto_factory.h>
        !            19: 
        !            20: static rng_t *rng_create(rng_quality_t quality)
        !            21: {
        !            22:        rng_quality_t *q = malloc_thing(rng_quality_t);
        !            23:        *q = quality;
        !            24:        return (rng_t*)q;
        !            25: }
        !            26: 
        !            27: static rng_t *rng_create_weak(rng_quality_t quality)
        !            28: {
        !            29:        ck_assert(quality == RNG_WEAK);
        !            30:        return rng_create(RNG_WEAK);
        !            31: }
        !            32: 
        !            33: static rng_t *rng_create_strong(rng_quality_t quality)
        !            34: {
        !            35:        ck_assert(quality <= RNG_STRONG);
        !            36:        return rng_create(RNG_STRONG);
        !            37: }
        !            38: 
        !            39: static rng_t *rng_create_true(rng_quality_t quality)
        !            40: {
        !            41:        ck_assert(quality <= RNG_TRUE);
        !            42:        return rng_create(RNG_TRUE);
        !            43: }
        !            44: 
        !            45: static rng_t *rng_create_true_second(rng_quality_t quality)
        !            46: {
        !            47:        fail("should never be called");
        !            48:        return rng_create(RNG_TRUE);
        !            49: }
        !            50: 
        !            51: static rng_quality_t rng_weak = RNG_WEAK;
        !            52: static rng_quality_t rng_strong = RNG_STRONG;
        !            53: static rng_quality_t rng_true = RNG_TRUE;
        !            54: 
        !            55: static struct {
        !            56:        rng_quality_t *exp_weak;
        !            57:        rng_quality_t *exp_strong;
        !            58:        rng_quality_t *exp_true;
        !            59:        struct {
        !            60:                rng_quality_t *q;
        !            61:                rng_constructor_t create;
        !            62:        } data[4];
        !            63: } rng_data[] = {
        !            64:        { NULL, NULL, NULL, {
        !            65:                { NULL, NULL }
        !            66:        }},
        !            67:        { &rng_weak, NULL, NULL, {
        !            68:                { &rng_weak, rng_create_weak },
        !            69:                { NULL, NULL }
        !            70:        }},
        !            71:        { &rng_strong, &rng_strong, NULL, {
        !            72:                { &rng_strong, rng_create_strong },
        !            73:                { NULL, NULL }
        !            74:        }},
        !            75:        { &rng_true, &rng_true, &rng_true, {
        !            76:                { &rng_true, rng_create_true },
        !            77:                { NULL, NULL }
        !            78:        }},
        !            79:        { &rng_true, &rng_true, &rng_true, {
        !            80:                { &rng_true, rng_create_true },
        !            81:                { &rng_true, rng_create_true_second },
        !            82:                { NULL, NULL }
        !            83:        }},
        !            84:        { &rng_weak, &rng_true, &rng_true, {
        !            85:                { &rng_weak, rng_create_weak },
        !            86:                { &rng_true, rng_create_true },
        !            87:                { NULL, NULL }
        !            88:        }},
        !            89:        { &rng_weak, &rng_strong, &rng_true, {
        !            90:                { &rng_true, rng_create_true },
        !            91:                { &rng_strong, rng_create_strong },
        !            92:                { &rng_weak, rng_create_weak },
        !            93:                { NULL, NULL }
        !            94:        }},
        !            95:        { &rng_weak, &rng_strong, &rng_true, {
        !            96:                { &rng_weak, rng_create_weak },
        !            97:                { &rng_strong, rng_create_strong },
        !            98:                { &rng_true, rng_create_true },
        !            99:                { NULL, NULL }
        !           100:        }},
        !           101: };
        !           102: 
        !           103: static void verify_rng(crypto_factory_t *factory, rng_quality_t request,
        !           104:                                           rng_quality_t *expected)
        !           105: {
        !           106:        rng_quality_t *res;
        !           107: 
        !           108:        res = (rng_quality_t*)factory->create_rng(factory, request);
        !           109:        if (!expected)
        !           110:        {
        !           111:                ck_assert(!res);
        !           112:        }
        !           113:        else
        !           114:        {
        !           115:                ck_assert(res);
        !           116:                ck_assert_int_eq(*expected, *res);
        !           117:                free(res);
        !           118:        }
        !           119: }
        !           120: 
        !           121: START_TEST(test_create_rng)
        !           122: {
        !           123:        crypto_factory_t *factory;
        !           124:        int i;
        !           125: 
        !           126:        factory = crypto_factory_create();
        !           127:        for (i = 0; rng_data[_i].data[i].q; i++)
        !           128:        {
        !           129:                ck_assert(factory->add_rng(factory, *rng_data[_i].data[i].q, "test",
        !           130:                                                                   rng_data[_i].data[i].create));
        !           131:        }
        !           132:        verify_rng(factory, RNG_WEAK, rng_data[_i].exp_weak);
        !           133:        verify_rng(factory, RNG_STRONG, rng_data[_i].exp_strong);
        !           134:        verify_rng(factory, RNG_TRUE, rng_data[_i].exp_true);
        !           135:        for (i = 0; rng_data[_i].data[i].q; i++)
        !           136:        {
        !           137:                factory->remove_rng(factory, rng_data[_i].data[i].create);
        !           138:        }
        !           139:        factory->destroy(factory);
        !           140: }
        !           141: END_TEST
        !           142: 
        !           143: static diffie_hellman_t *dh_create(char *plugin)
        !           144: {
        !           145:        return (diffie_hellman_t*)plugin;
        !           146: }
        !           147: 
        !           148: static diffie_hellman_t *dh_create_modp1024(diffie_hellman_group_t group, ...)
        !           149: {
        !           150:        ck_assert(group == MODP_1024_BIT);
        !           151:        return dh_create("plugin1");
        !           152: }
        !           153: 
        !           154: static diffie_hellman_t *dh_create_modp1024_second(diffie_hellman_group_t group,
        !           155:                                                                                                   ...)
        !           156: {
        !           157:        ck_assert(group == MODP_1024_BIT);
        !           158:        return dh_create("plugin2");
        !           159: }
        !           160: 
        !           161: static diffie_hellman_t *dh_create_modp2048(diffie_hellman_group_t group, ...)
        !           162: {
        !           163:        ck_assert(group == MODP_2048_BIT);
        !           164:        return dh_create("plugin1");
        !           165: }
        !           166: 
        !           167: static diffie_hellman_t *dh_create_modp2048_second(diffie_hellman_group_t group,
        !           168:                                                                                                   ...)
        !           169: {
        !           170:        ck_assert(group == MODP_2048_BIT);
        !           171:        return dh_create("plugin2");
        !           172: }
        !           173: 
        !           174: static struct {
        !           175:        char *exp1024;
        !           176:        char *exp2048;
        !           177:        struct {
        !           178:                diffie_hellman_group_t g;
        !           179:                dh_constructor_t create;
        !           180:                char *plugin;
        !           181:        } data[4];
        !           182: } dh_data[] = {
        !           183:        { NULL, NULL, {
        !           184:                { MODP_NONE, NULL, NULL }
        !           185:        }},
        !           186:        { "plugin1", NULL, {
        !           187:                { MODP_1024_BIT, dh_create_modp1024, "plugin1" },
        !           188:                { MODP_NONE, NULL, NULL }
        !           189:        }},
        !           190:        { "plugin1", NULL, {
        !           191:                { MODP_1024_BIT, dh_create_modp1024, "plugin1" },
        !           192:                { MODP_1024_BIT, dh_create_modp1024_second, "plugin2" },
        !           193:                { MODP_NONE, NULL, NULL }
        !           194:        }},
        !           195:        { "plugin2", NULL, {
        !           196:                { MODP_1024_BIT, dh_create_modp1024_second, "plugin2" },
        !           197:                { MODP_1024_BIT, dh_create_modp1024, "plugin1" },
        !           198:                { MODP_NONE, NULL, NULL }
        !           199:        }},
        !           200:        { "plugin1", "plugin1", {
        !           201:                { MODP_1024_BIT, dh_create_modp1024, "plugin1" },
        !           202:                { MODP_2048_BIT, dh_create_modp2048, "plugin1" },
        !           203:                { MODP_NONE, NULL }
        !           204:        }},
        !           205:        { "plugin1", "plugin1", {
        !           206:                { MODP_2048_BIT, dh_create_modp2048, "plugin1" },
        !           207:                { MODP_1024_BIT, dh_create_modp1024, "plugin1" },
        !           208:                { MODP_NONE, NULL }
        !           209:        }},
        !           210:        { "plugin1", "plugin1", {
        !           211:                { MODP_2048_BIT, dh_create_modp2048, "plugin1" },
        !           212:                { MODP_2048_BIT, dh_create_modp2048_second, "plugin2" },
        !           213:                { MODP_1024_BIT, dh_create_modp1024, "plugin1" },
        !           214:                { MODP_NONE, NULL }
        !           215:        }},
        !           216:        { "plugin1", "plugin2", {
        !           217:                { MODP_2048_BIT, dh_create_modp2048_second, "plugin2" },
        !           218:                { MODP_2048_BIT, dh_create_modp2048, "plugin1" },
        !           219:                { MODP_1024_BIT, dh_create_modp1024, "plugin1" },
        !           220:                { MODP_NONE, NULL }
        !           221:        }},
        !           222: };
        !           223: 
        !           224: static void verify_dh(crypto_factory_t *factory, diffie_hellman_group_t request,
        !           225:                                          char *expected)
        !           226: {
        !           227:        char *plugin;
        !           228: 
        !           229:        plugin = (char*)factory->create_dh(factory, request);
        !           230:        if (!expected)
        !           231:        {
        !           232:                ck_assert(!plugin);
        !           233:        }
        !           234:        else
        !           235:        {
        !           236:                ck_assert(plugin);
        !           237:                ck_assert_str_eq(expected, plugin);
        !           238:        }
        !           239: }
        !           240: 
        !           241: START_TEST(test_create_dh)
        !           242: {
        !           243:        enumerator_t *enumerator;
        !           244:        crypto_factory_t *factory;
        !           245:        diffie_hellman_group_t group;
        !           246:        char *plugin;
        !           247:        int i, len = 0;
        !           248: 
        !           249: 
        !           250:        factory = crypto_factory_create();
        !           251:        for (i = 0; dh_data[_i].data[i].g != MODP_NONE; i++)
        !           252:        {
        !           253:                ck_assert(factory->add_dh(factory, dh_data[_i].data[i].g,
        !           254:                                                                  dh_data[_i].data[i].plugin,
        !           255:                                                                  dh_data[_i].data[i].create));
        !           256:        }
        !           257:        verify_dh(factory, MODP_1024_BIT, dh_data[_i].exp1024);
        !           258:        verify_dh(factory, MODP_2048_BIT, dh_data[_i].exp2048);
        !           259: 
        !           260:        len = countof(dh_data[_i].data);
        !           261:        enumerator = factory->create_dh_enumerator(factory);
        !           262:        for (i = 0; enumerator->enumerate(enumerator, &group, &plugin) && i < len;)
        !           263:        {
        !           264:                ck_assert_int_eq(dh_data[_i].data[i].g, group);
        !           265:                while (dh_data[_i].data[i].g == group)
        !           266:                {       /* skip other entries by the same group */
        !           267:                        i++;
        !           268:                }
        !           269:                switch (group)
        !           270:                {
        !           271:                        case MODP_1024_BIT:
        !           272:                                ck_assert(dh_data[_i].exp1024);
        !           273:                                ck_assert_str_eq(dh_data[_i].exp1024, plugin);
        !           274:                                break;
        !           275:                        case MODP_2048_BIT:
        !           276:                                ck_assert(dh_data[_i].exp2048);
        !           277:                                ck_assert_str_eq(dh_data[_i].exp2048, plugin);
        !           278:                                break;
        !           279:                        default:
        !           280:                                fail("unexpected DH group");
        !           281:                                break;
        !           282:                }
        !           283:        }
        !           284:        ck_assert(!enumerator->enumerate(enumerator));
        !           285:        ck_assert_int_eq(dh_data[_i].data[i].g, MODP_NONE);
        !           286:        enumerator->destroy(enumerator);
        !           287: 
        !           288:        for (i = 0; dh_data[_i].data[i].g != MODP_NONE; i++)
        !           289:        {
        !           290:                factory->remove_dh(factory, dh_data[_i].data[i].create);
        !           291:        }
        !           292:        factory->destroy(factory);
        !           293: }
        !           294: END_TEST
        !           295: 
        !           296: Suite *crypto_factory_suite_create()
        !           297: {
        !           298:        Suite *s;
        !           299:        TCase *tc;
        !           300: 
        !           301:        s = suite_create("crypto-factory");
        !           302: 
        !           303:        tc = tcase_create("create_rng");
        !           304:        tcase_add_loop_test(tc, test_create_rng, 0, countof(rng_data));
        !           305:        suite_add_tcase(s, tc);
        !           306: 
        !           307:        tc = tcase_create("create_dh");
        !           308:        tcase_add_loop_test(tc, test_create_dh, 0, countof(dh_data));
        !           309:        suite_add_tcase(s, tc);
        !           310: 
        !           311:        return s;
        !           312: }

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