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