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

1.1     ! misho       1: /*
        !             2:  * Copyright (C) 2016 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 <credentials/auth_cfg.h>
        !            19: 
        !            20: struct {
        !            21:        char *constraints;
        !            22:        signature_scheme_t sig[5];
        !            23:        signature_scheme_t ike[5];
        !            24: } sig_constraints_tests[] = {
        !            25:        { "rsa-sha256", { SIGN_RSA_EMSA_PKCS1_SHA2_256, 0 }, {0}},
        !            26:        { "rsa-sha256-sha512", { SIGN_RSA_EMSA_PKCS1_SHA2_256, SIGN_RSA_EMSA_PKCS1_SHA2_512, 0 }, {0}},
        !            27:        { "ecdsa-sha256", { SIGN_ECDSA_WITH_SHA256_DER, SIGN_ECDSA_256, 0 }, {0}},
        !            28:        { "rsa-sha256-ecdsa-sha256", { SIGN_RSA_EMSA_PKCS1_SHA2_256, SIGN_ECDSA_WITH_SHA256_DER, SIGN_ECDSA_256, 0 }, {0}},
        !            29:        { "pubkey-sha256", { SIGN_RSA_EMSA_PKCS1_SHA2_256, SIGN_ECDSA_WITH_SHA256_DER, SIGN_ECDSA_256, SIGN_BLISS_WITH_SHA2_256, 0 }, {0}},
        !            30:        { "ike:rsa-sha256", {0}, { SIGN_RSA_EMSA_PKCS1_SHA2_256, 0 }},
        !            31:        { "ike:rsa-sha256-rsa-sha256", { SIGN_RSA_EMSA_PKCS1_SHA2_256, 0 }, { SIGN_RSA_EMSA_PKCS1_SHA2_256, 0 }},
        !            32:        { "rsa-sha256-ike:rsa-sha256", { SIGN_RSA_EMSA_PKCS1_SHA2_256, 0 }, { SIGN_RSA_EMSA_PKCS1_SHA2_256, 0 }},
        !            33:        { "ike:pubkey-sha256", {0}, { SIGN_RSA_EMSA_PKCS1_SHA2_256, SIGN_ECDSA_WITH_SHA256_DER, SIGN_ECDSA_256, SIGN_BLISS_WITH_SHA2_256, 0 }},
        !            34:        { "rsa-ecdsa-sha256", { SIGN_ECDSA_WITH_SHA256_DER, SIGN_ECDSA_256, 0 }, {0}},
        !            35:        { "rsa-4096-ecdsa-sha256", { SIGN_ECDSA_WITH_SHA256_DER, SIGN_ECDSA_256, 0 }, {0}},
        !            36:        { "rsa-4096-ecdsa-256-sha256", { SIGN_ECDSA_WITH_SHA256_DER, SIGN_ECDSA_256, 0 }, {0}},
        !            37:        { "rsa-ecdsa256-sha256", { SIGN_RSA_EMSA_PKCS1_SHA2_256, 0 }, {0}},
        !            38:        { "rsa4096-sha256", {0}, {0}},
        !            39:        { "sha256", {0}, {0}},
        !            40:        { "ike:sha256", {0}, {0}},
        !            41: };
        !            42: 
        !            43: static void check_sig_constraints(auth_cfg_t *cfg, auth_rule_t type,
        !            44:                                                                  signature_scheme_t expected[])
        !            45: {
        !            46:        enumerator_t *enumerator;
        !            47:        auth_rule_t t;
        !            48:        signature_params_t *value;
        !            49:        int i = 0;
        !            50: 
        !            51:        enumerator = cfg->create_enumerator(cfg);
        !            52:        while (enumerator->enumerate(enumerator, &t, &value))
        !            53:        {
        !            54:                if (t == type)
        !            55:                {
        !            56:                        ck_assert(expected[i]);
        !            57:                        ck_assert_int_eq(expected[i], value->scheme);
        !            58:                        i++;
        !            59:                }
        !            60:        }
        !            61:        enumerator->destroy(enumerator);
        !            62:        ck_assert(!expected[i]);
        !            63: }
        !            64: 
        !            65: START_TEST(test_sig_constraints)
        !            66: {
        !            67:        auth_cfg_t *cfg;
        !            68:        signature_scheme_t none[] = {0};
        !            69: 
        !            70:        cfg = auth_cfg_create();
        !            71:        cfg->add_pubkey_constraints(cfg, sig_constraints_tests[_i].constraints, FALSE);
        !            72:        check_sig_constraints(cfg, AUTH_RULE_SIGNATURE_SCHEME, sig_constraints_tests[_i].sig);
        !            73:        check_sig_constraints(cfg, AUTH_RULE_IKE_SIGNATURE_SCHEME, none);
        !            74:        cfg->destroy(cfg);
        !            75: 
        !            76:        lib->settings->set_bool(lib->settings, "%s.signature_authentication_constraints",
        !            77:                                                        FALSE, lib->ns);
        !            78: 
        !            79:        cfg = auth_cfg_create();
        !            80:        cfg->add_pubkey_constraints(cfg, sig_constraints_tests[_i].constraints, TRUE);
        !            81:        check_sig_constraints(cfg, AUTH_RULE_SIGNATURE_SCHEME, sig_constraints_tests[_i].sig);
        !            82:        check_sig_constraints(cfg, AUTH_RULE_IKE_SIGNATURE_SCHEME, sig_constraints_tests[_i].ike);
        !            83:        cfg->destroy(cfg);
        !            84: }
        !            85: END_TEST
        !            86: 
        !            87: START_TEST(test_ike_constraints_fallback)
        !            88: {
        !            89:        auth_cfg_t *cfg;
        !            90: 
        !            91:        lib->settings->set_bool(lib->settings, "%s.signature_authentication_constraints",
        !            92:                                                        TRUE, lib->ns);
        !            93: 
        !            94:        cfg = auth_cfg_create();
        !            95:        cfg->add_pubkey_constraints(cfg, sig_constraints_tests[_i].constraints, TRUE);
        !            96:        check_sig_constraints(cfg, AUTH_RULE_SIGNATURE_SCHEME, sig_constraints_tests[_i].sig);
        !            97:        if (sig_constraints_tests[_i].ike[0])
        !            98:        {
        !            99:                check_sig_constraints(cfg, AUTH_RULE_IKE_SIGNATURE_SCHEME, sig_constraints_tests[_i].ike);
        !           100:        }
        !           101:        else
        !           102:        {
        !           103:                check_sig_constraints(cfg, AUTH_RULE_IKE_SIGNATURE_SCHEME, sig_constraints_tests[_i].sig);
        !           104:        }
        !           105:        cfg->destroy(cfg);
        !           106: }
        !           107: END_TEST
        !           108: 
        !           109: typedef union {
        !           110:        rsa_pss_params_t pss;
        !           111: } signature_param_types_t;
        !           112: 
        !           113: struct {
        !           114:        char *constraints;
        !           115:        signature_scheme_t sig[5];
        !           116:        signature_param_types_t p[5];
        !           117: } sig_constraints_params_tests[] = {
        !           118:        { "rsa/pss-sha256", { SIGN_RSA_EMSA_PSS, 0 }, {
        !           119:                { .pss = { .hash = HASH_SHA256, .mgf1_hash = HASH_SHA256, .salt_len = HASH_SIZE_SHA256, }}}},
        !           120:        { "rsa/pss-sha256-sha384", { SIGN_RSA_EMSA_PSS, SIGN_RSA_EMSA_PSS, 0 }, {
        !           121:                { .pss = { .hash = HASH_SHA256, .mgf1_hash = HASH_SHA256, .salt_len = HASH_SIZE_SHA256, }},
        !           122:                { .pss = { .hash = HASH_SHA384, .mgf1_hash = HASH_SHA384, .salt_len = HASH_SIZE_SHA384, }}}},
        !           123:        { "rsa/pss-sha256-rsa-sha256", { SIGN_RSA_EMSA_PSS, SIGN_RSA_EMSA_PKCS1_SHA2_256, 0 }, {
        !           124:                { .pss = { .hash = HASH_SHA256, .mgf1_hash = HASH_SHA256, .salt_len = HASH_SIZE_SHA256, }}}},
        !           125:        { "rsa-sha256-rsa/pss-sha256", { SIGN_RSA_EMSA_PKCS1_SHA2_256, SIGN_RSA_EMSA_PSS, 0 }, {
        !           126:                {},
        !           127:                { .pss = { .hash = HASH_SHA256, .mgf1_hash = HASH_SHA256, .salt_len = HASH_SIZE_SHA256, }}}},
        !           128:        { "rsa/pss", { 0 }, {}},
        !           129: };
        !           130: 
        !           131: static void check_sig_constraints_params(auth_cfg_t *cfg, auth_rule_t type,
        !           132:                                                                                 signature_scheme_t scheme[],
        !           133:                                                                                 signature_param_types_t p[])
        !           134: {
        !           135:        enumerator_t *enumerator;
        !           136:        auth_rule_t t;
        !           137:        signature_params_t *value;
        !           138:        int i = 0;
        !           139: 
        !           140:        enumerator = cfg->create_enumerator(cfg);
        !           141:        while (enumerator->enumerate(enumerator, &t, &value))
        !           142:        {
        !           143:                if (t == type)
        !           144:                {
        !           145:                        if (scheme[i] == SIGN_RSA_EMSA_PSS)
        !           146:                        {
        !           147:                                signature_params_t expected = {
        !           148:                                        .scheme = scheme[i],
        !           149:                                        .params = &p[i].pss,
        !           150:                                };
        !           151:                                ck_assert(signature_params_equal(value, &expected));
        !           152:                        }
        !           153:                        else
        !           154:                        {
        !           155:                                ck_assert(scheme[i]);
        !           156:                                ck_assert(!value->params);
        !           157:                                ck_assert_int_eq(scheme[i], value->scheme);
        !           158:                        }
        !           159:                        i++;
        !           160:                }
        !           161:        }
        !           162:        enumerator->destroy(enumerator);
        !           163:        ck_assert(!scheme[i]);
        !           164: }
        !           165: 
        !           166: START_TEST(test_sig_constraints_params)
        !           167: {
        !           168:        auth_cfg_t *cfg;
        !           169: 
        !           170:        cfg = auth_cfg_create();
        !           171:        cfg->add_pubkey_constraints(cfg, sig_constraints_params_tests[_i].constraints, TRUE);
        !           172:        check_sig_constraints_params(cfg, AUTH_RULE_IKE_SIGNATURE_SCHEME,
        !           173:                                                                 sig_constraints_params_tests[_i].sig,
        !           174:                                                                 sig_constraints_params_tests[_i].p);
        !           175:        cfg->destroy(cfg);
        !           176: }
        !           177: END_TEST
        !           178: 
        !           179: struct {
        !           180:        char *constraints;
        !           181:        signature_scheme_t sig[6];
        !           182:        signature_param_types_t p[6];
        !           183: } sig_constraints_rsa_pss_tests[] = {
        !           184:        { "pubkey-sha256", { SIGN_RSA_EMSA_PSS, SIGN_RSA_EMSA_PKCS1_SHA2_256, SIGN_ECDSA_WITH_SHA256_DER, SIGN_ECDSA_256, SIGN_BLISS_WITH_SHA2_256, 0 }, {
        !           185:                { .pss = { .hash = HASH_SHA256, .mgf1_hash = HASH_SHA256, .salt_len = HASH_SIZE_SHA256, }}, {}, {}, {}, {}}},
        !           186:        { "rsa-sha256", { SIGN_RSA_EMSA_PSS, SIGN_RSA_EMSA_PKCS1_SHA2_256, 0 }, {
        !           187:                { .pss = { .hash = HASH_SHA256, .mgf1_hash = HASH_SHA256, .salt_len = HASH_SIZE_SHA256, }}, {}}},
        !           188: };
        !           189: 
        !           190: START_TEST(test_sig_constraints_rsa_pss)
        !           191: {
        !           192:        auth_cfg_t *cfg;
        !           193: 
        !           194:        lib->settings->set_bool(lib->settings, "%s.rsa_pss", TRUE, lib->ns);
        !           195: 
        !           196:        cfg = auth_cfg_create();
        !           197:        cfg->add_pubkey_constraints(cfg, sig_constraints_rsa_pss_tests[_i].constraints, TRUE);
        !           198:        check_sig_constraints_params(cfg, AUTH_RULE_IKE_SIGNATURE_SCHEME,
        !           199:                                                                 sig_constraints_rsa_pss_tests[_i].sig,
        !           200:                                                                 sig_constraints_rsa_pss_tests[_i].p);
        !           201:        cfg->destroy(cfg);
        !           202: }
        !           203: END_TEST
        !           204: 
        !           205: Suite *auth_cfg_suite_create()
        !           206: {
        !           207:        Suite *s;
        !           208:        TCase *tc;
        !           209: 
        !           210:        s = suite_create("auth_cfg");
        !           211: 
        !           212:        tc = tcase_create("add_pubkey_constraints");
        !           213:        tcase_add_loop_test(tc, test_sig_constraints, 0, countof(sig_constraints_tests));
        !           214:        tcase_add_loop_test(tc, test_ike_constraints_fallback, 0, countof(sig_constraints_tests));
        !           215:        suite_add_tcase(s, tc);
        !           216: 
        !           217:        tc = tcase_create("add_pubkey_constraints parameters");
        !           218:        tcase_add_loop_test(tc, test_sig_constraints_params, 0, countof(sig_constraints_params_tests));
        !           219:        tcase_add_loop_test(tc, test_sig_constraints_rsa_pss, 0, countof(sig_constraints_rsa_pss_tests));
        !           220:        suite_add_tcase(s, tc);
        !           221: 
        !           222:        return s;
        !           223: }

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