Return to test_signature_params.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / strongswan / src / libstrongswan / tests / suites |
1.1 misho 1: /* 2: * Copyright (C) 2017-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 <asn1/oid.h> 19: #include <asn1/asn1.h> 20: #include <credentials/keys/signature_params.h> 21: 22: static struct { 23: chunk_t aid; 24: rsa_pss_params_t params; 25: } rsa_pss_parse_tests[] = { 26: /* from RFC 7427, no parameters (empty sequence) */ 27: { chunk_from_chars(0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0a,0x30,0x00), 28: { .hash = HASH_SHA1, .mgf1_hash = HASH_SHA1, .salt_len = HASH_SIZE_SHA1, }}, 29: /* from RFC 7427, default parameters (SHA-1), would actually not be sent 30: * like this, as corrected in errata */ 31: { chunk_from_chars(0x30,0x3e,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0a,0x30,0x31,0xa0, 32: 0x0b,0x30,0x09,0x06,0x05,0x2b,0x0e,0x03,0x02,0x1a,0x05,0x00,0xa1,0x18,0x30,0x16, 33: 0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x08,0x30,0x09,0x06,0x05,0x2b, 34: 0x0e,0x03,0x02,0x1a,0x05,0x00,0xa2,0x03,0x02,0x01,0x14,0xa3,0x03,0x02,0x01,0x01), 35: { .hash = HASH_SHA1, .mgf1_hash = HASH_SHA1, .salt_len = HASH_SIZE_SHA1, }}, 36: /* from RFC 7427, SHA-256 */ 37: { chunk_from_chars(0x30,0x46,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0a,0x30,0x39,0xa0, 38: 0x0f,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00, 39: 0xa1,0x1c,0x30,0x1a,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x08,0x30, 40: 0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0xa2,0x03, 41: 0x02,0x01,0x20,0xa3,0x03,0x02,0x01,0x01), 42: { .hash = HASH_SHA256, .mgf1_hash = HASH_SHA256, .salt_len = HASH_SIZE_SHA256, }}, 43: /* from RFC 7427, SHA-256 (errata, without trailer, with len corrections) */ 44: { chunk_from_chars(0x30,0x41,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0a,0x30,0x34,0xa0, 45: 0x0f,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00, 46: 0xa1,0x1c,0x30,0x1a,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x08,0x30, 47: 0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0xa2,0x03, 48: 0x02,0x01,0x20), 49: { .hash = HASH_SHA256, .mgf1_hash = HASH_SHA256, .salt_len = HASH_SIZE_SHA256, }}, 50: /* SHA-512 */ 51: { chunk_from_chars(0x30,0x41,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0a,0x30,0x34,0xa0, 52: 0x0f,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x03,0x05,0x00, 53: 0xa1,0x1c,0x30,0x1a,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x08,0x30, 54: 0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x03,0x05,0x00,0xa2,0x03, 55: 0x02,0x01,0x40), 56: { .hash = HASH_SHA512, .mgf1_hash = HASH_SHA512, .salt_len = HASH_SIZE_SHA512, }}, 57: /* SHA-256, no salt */ 58: { chunk_from_chars(0x30,0x41,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0a,0x30,0x34,0xa0, 59: 0x0f,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00, 60: 0xa1,0x1c,0x30,0x1a,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x08,0x30, 61: 0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0xa2,0x03, 62: 0x02,0x01,0x00), 63: { .hash = HASH_SHA256, .mgf1_hash = HASH_SHA256, .salt_len = 0, }}, 64: /* only hash specified */ 65: { chunk_from_chars(0x30,0x1e,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0a,0x30,0x11, 66: 0xa0,0x0f,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01, 67: 0x05,0x00), 68: { .hash = HASH_SHA256, .mgf1_hash = HASH_SHA1, .salt_len = HASH_SIZE_SHA1, }}, 69: /* only mgf specified */ 70: { chunk_from_chars(0x30,0x2b,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0a,0x30,0x1e, 71: 0xa1,0x1c,0x30,0x1a,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x08, 72: 0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00), 73: { .hash = HASH_SHA1, .mgf1_hash = HASH_SHA256, .salt_len = HASH_SIZE_SHA1, }}, 74: /* only salt specified */ 75: { chunk_from_chars(0x30,0x12,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0a,0x30,0x05,0xa2, 76: 0x03,0x02,0x01,0x20), 77: { .hash = HASH_SHA1, .mgf1_hash = HASH_SHA1, .salt_len = HASH_SIZE_SHA256, }}, 78: }; 79: 80: START_TEST(test_rsa_pss_params_parse) 81: { 82: rsa_pss_params_t parsed; 83: chunk_t params; 84: int oid; 85: 86: oid = asn1_parse_algorithmIdentifier(rsa_pss_parse_tests[_i].aid, 0, ¶ms); 87: ck_assert_int_eq(OID_RSASSA_PSS, oid); 88: ck_assert(rsa_pss_params_parse(params, 1, &parsed)); 89: ck_assert_int_eq(rsa_pss_parse_tests[_i].params.hash, parsed.hash); 90: ck_assert_int_eq(rsa_pss_parse_tests[_i].params.mgf1_hash, parsed.mgf1_hash); 91: ck_assert_int_eq(rsa_pss_parse_tests[_i].params.salt_len, parsed.salt_len); 92: } 93: END_TEST 94: 95: chunk_t rsa_pss_parse_invalid_tests[] = { 96: /* unknown hash */ 97: chunk_from_chars(0x30,0x1e,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0a,0x30,0x11, 98: 0xa0,0x0f,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x00, 99: 0x05,0x00), 100: /* unknown mgf */ 101: chunk_from_chars(0x30,0x2b,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0a,0x30,0x1e, 102: 0xa1,0x1c,0x30,0x1a,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x00, 103: 0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00), 104: /* unknown mgf-1 hash */ 105: chunk_from_chars(0x30,0x2b,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0a,0x30,0x1e, 106: 0xa1,0x1c,0x30,0x1a,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x08, 107: 0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x00,0x05,0x00), 108: /* incorrect trailer */ 109: chunk_from_chars(0x30,0x12,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0a,0x30,0x05, 110: 0xa3,0x03,0x02,0x01,0x02), 111: /* too long trailer */ 112: chunk_from_chars(0x30,0x13,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0a,0x30,0x06, 113: 0xa3,0x04,0x02,0x02,0x01,0x01), 114: }; 115: 116: START_TEST(test_rsa_pss_params_parse_invalid) 117: { 118: rsa_pss_params_t parsed; 119: chunk_t params; 120: int oid; 121: 122: oid = asn1_parse_algorithmIdentifier(rsa_pss_parse_invalid_tests[_i], 0, ¶ms); 123: ck_assert_int_eq(OID_RSASSA_PSS, oid); 124: ck_assert(!rsa_pss_params_parse(params, 1, &parsed)); 125: } 126: END_TEST 127: 128: static struct { 129: chunk_t aid; 130: rsa_pss_params_t params; 131: } rsa_pss_build_tests[] = { 132: /* default parameters -> empty sequence */ 133: { chunk_from_chars(0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0a,0x30,0x00), 134: { .hash = HASH_SHA1, .mgf1_hash = HASH_SHA1, .salt_len = HASH_SIZE_SHA1, }}, 135: /* SHA-256 */ 136: { chunk_from_chars(0x30,0x41,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0a,0x30,0x34,0xa0, 137: 0x0f,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00, 138: 0xa1,0x1c,0x30,0x1a,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x08,0x30, 139: 0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0xa2,0x03, 140: 0x02,0x01,0x20), 141: { .hash = HASH_SHA256, .mgf1_hash = HASH_SHA256, .salt_len = HASH_SIZE_SHA256, }}, 142: /* default salt length: SHA-1 */ 143: { chunk_from_chars(0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0a,0x30,0x00), 144: { .hash = HASH_SHA1, .mgf1_hash = HASH_SHA1, .salt_len = HASH_SIZE_SHA1, }}, 145: /* default salt length: SHA-224 */ 146: { chunk_from_chars(0x30,0x23,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0a,0x30,0x16,0xa0, 147: 0x0f,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x04,0x05,0x00, 148: 0xa2,0x03,0x02,0x01,0x1c), 149: { .hash = HASH_SHA224, .mgf1_hash = HASH_SHA1, .salt_len = HASH_SIZE_SHA224, }}, 150: /* default salt length: SHA-384 */ 151: { chunk_from_chars(0x30,0x23,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0a,0x30,0x16,0xa0, 152: 0x0f,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x02,0x05,0x00, 153: 0xa2,0x03,0x02,0x01,0x30), 154: { .hash = HASH_SHA384, .mgf1_hash = HASH_SHA1, .salt_len = HASH_SIZE_SHA384, }}, 155: /* SHA-512 */ 156: { chunk_from_chars(0x30,0x41,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0a,0x30,0x34,0xa0, 157: 0x0f,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x03,0x05,0x00, 158: 0xa1,0x1c,0x30,0x1a,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x08,0x30, 159: 0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x03,0x05,0x00,0xa2,0x03, 160: 0x02,0x01,0x40), 161: { .hash = HASH_SHA512, .mgf1_hash = HASH_SHA512, .salt_len = HASH_SIZE_SHA512, }}, 162: /* SHA-256, no salt */ 163: { chunk_from_chars(0x30,0x41,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0a,0x30,0x34,0xa0, 164: 0x0f,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00, 165: 0xa1,0x1c,0x30,0x1a,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x08,0x30, 166: 0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0xa2,0x03, 167: 0x02,0x01,0x00), 168: { .hash = HASH_SHA256, .mgf1_hash = HASH_SHA256, .salt_len = 0, }}, 169: /* SHA-256, rest default */ 170: { chunk_from_chars(0x30,0x1e,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0a,0x30,0x11, 171: 0xa0,0x0f,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01, 172: 0x05,0x00), 173: { .hash = HASH_SHA256, .mgf1_hash = HASH_SHA1, .salt_len = HASH_SIZE_SHA1, }}, 174: /* MGF1-SHA-256, rest default */ 175: { chunk_from_chars(0x30,0x2b,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0a,0x30,0x1e, 176: 0xa1,0x1c,0x30,0x1a,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x08, 177: 0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00), 178: { .hash = HASH_SHA1, .mgf1_hash = HASH_SHA256, .salt_len = HASH_SIZE_SHA1, }}, 179: /* only salt specified */ 180: { chunk_from_chars(0x30,0x12,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0a,0x30,0x05,0xa2, 181: 0x03,0x02,0x01,0x20), 182: { .hash = HASH_SHA1, .mgf1_hash = HASH_SHA1, .salt_len = HASH_SIZE_SHA256, }}, 183: }; 184: 185: START_TEST(test_rsa_pss_params_build) 186: { 187: chunk_t params, aid; 188: 189: ck_assert(rsa_pss_params_build(&rsa_pss_build_tests[_i].params, ¶ms)); 190: aid = asn1_wrap(ASN1_SEQUENCE, "mm", asn1_build_known_oid(OID_RSASSA_PSS), 191: params); 192: ck_assert_chunk_eq(rsa_pss_build_tests[_i].aid, aid); 193: chunk_free(&aid); 194: } 195: END_TEST 196: 197: rsa_pss_params_t rsa_pss_build_invalid_tests[] = { 198: /* unknown hash */ 199: { .hash = HASH_UNKNOWN, .mgf1_hash = HASH_SHA1, .salt_len = HASH_SIZE_SHA1, }, 200: /* invalid mgf */ 201: { .hash = HASH_SHA256, .mgf1_hash = HASH_UNKNOWN, .salt_len = HASH_SIZE_SHA256, }, 202: /* undetermined salt */ 203: { .hash = HASH_UNKNOWN, .mgf1_hash = HASH_SHA1, .salt_len = RSA_PSS_SALT_LEN_DEFAULT, }, 204: }; 205: 206: START_TEST(test_rsa_pss_params_build_invalid) 207: { 208: chunk_t params; 209: 210: ck_assert(!rsa_pss_params_build(&rsa_pss_build_invalid_tests[_i], ¶ms)); 211: } 212: END_TEST 213: 214: 215: static struct { 216: ssize_t expected; 217: size_t modbits; 218: rsa_pss_params_t params; 219: } rsa_pss_salt_len_tests[] = { 220: { HASH_SIZE_SHA256, 0, 221: { .hash = HASH_SHA256, .mgf1_hash = HASH_SHA256, .salt_len = RSA_PSS_SALT_LEN_DEFAULT, }}, 222: { HASH_SIZE_SHA256, 3072, 223: { .hash = HASH_SHA256, .mgf1_hash = HASH_SHA256, .salt_len = RSA_PSS_SALT_LEN_DEFAULT, }}, 224: { -1, 0, 225: { .hash = HASH_SHA256, .mgf1_hash = HASH_SHA256, .salt_len = RSA_PSS_SALT_LEN_MAX, }}, 226: { 0, 256, 227: { .hash = HASH_SHA256, .mgf1_hash = HASH_SHA256, .salt_len = RSA_PSS_SALT_LEN_MAX, }}, 228: { 350, 3071, 229: { .hash = HASH_SHA256, .mgf1_hash = HASH_SHA256, .salt_len = RSA_PSS_SALT_LEN_MAX, }}, 230: { 350, 3072, 231: { .hash = HASH_SHA256, .mgf1_hash = HASH_SHA256, .salt_len = RSA_PSS_SALT_LEN_MAX, }}, 232: { 350, 3073, 233: { .hash = HASH_SHA256, .mgf1_hash = HASH_SHA256, .salt_len = RSA_PSS_SALT_LEN_MAX, }}, 234: { 478, 4096, 235: { .hash = HASH_SHA256, .mgf1_hash = HASH_SHA256, .salt_len = RSA_PSS_SALT_LEN_MAX, }}, 236: { 10, 0, 237: { .hash = HASH_SHA256, .mgf1_hash = HASH_SHA256, .salt_len = 10, }}, 238: { 10, 3072, 239: { .hash = HASH_SHA256, .mgf1_hash = HASH_SHA256, .salt_len = 10, }}, 240: }; 241: 242: START_TEST(test_rsa_pss_params_set_salt_len) 243: { 244: if (rsa_pss_params_set_salt_len(&rsa_pss_salt_len_tests[_i].params, 245: rsa_pss_salt_len_tests[_i].modbits)) 246: { 247: ck_assert_int_eq(rsa_pss_salt_len_tests[_i].expected, 248: rsa_pss_salt_len_tests[_i].params.salt_len); 249: } 250: else 251: { 252: ck_assert(rsa_pss_salt_len_tests[_i].expected < 0); 253: } 254: } 255: END_TEST 256: 257: static rsa_pss_params_t rsa_pss_params_sha1 = { .hash = HASH_SHA1, .mgf1_hash = HASH_SHA1, .salt_len = HASH_SIZE_SHA1, }; 258: static rsa_pss_params_t rsa_pss_params_sha256 = { .hash = HASH_SHA256, .mgf1_hash = HASH_SHA256, .salt_len = HASH_SIZE_SHA256, }; 259: static rsa_pss_params_t rsa_pss_params_sha256_mgf1 = { .hash = HASH_SHA256, .mgf1_hash = HASH_SHA512, .salt_len = HASH_SIZE_SHA256, }; 260: static rsa_pss_params_t rsa_pss_params_sha256_salt = { .hash = HASH_SHA256, .mgf1_hash = HASH_SHA256, .salt_len = 10, }; 261: 262: static struct { 263: bool equal; 264: bool complies; 265: signature_params_t a; 266: signature_params_t b; 267: } params_compare_tests[] = { 268: { TRUE, TRUE, { .scheme = SIGN_RSA_EMSA_PKCS1_SHA2_256, }, { .scheme = SIGN_RSA_EMSA_PKCS1_SHA2_256, }, }, 269: { FALSE, FALSE, { .scheme = SIGN_RSA_EMSA_PKCS1_SHA1, }, { .scheme = SIGN_RSA_EMSA_PKCS1_SHA2_256, }, }, 270: { TRUE, TRUE, { .scheme = SIGN_RSA_EMSA_PSS, .params = &rsa_pss_params_sha256 }, 271: { .scheme = SIGN_RSA_EMSA_PSS, .params = &rsa_pss_params_sha256 }, }, 272: { FALSE, FALSE, { .scheme = SIGN_RSA_EMSA_PKCS1_SHA2_256, .params = &rsa_pss_params_sha256 }, 273: { .scheme = SIGN_RSA_EMSA_PKCS1_SHA2_256, .params = &rsa_pss_params_sha256 }, }, 274: { FALSE, FALSE, { .scheme = SIGN_RSA_EMSA_PSS, .params = &rsa_pss_params_sha256 }, 275: { .scheme = SIGN_RSA_EMSA_PSS, .params = &rsa_pss_params_sha256_mgf1 }, }, 276: { FALSE, TRUE, { .scheme = SIGN_RSA_EMSA_PSS, .params = &rsa_pss_params_sha256 }, 277: { .scheme = SIGN_RSA_EMSA_PSS, .params = &rsa_pss_params_sha256_salt }, }, 278: { FALSE, FALSE, { .scheme = SIGN_RSA_EMSA_PSS, .params = &rsa_pss_params_sha1 }, 279: { .scheme = SIGN_RSA_EMSA_PSS, .params = &rsa_pss_params_sha256 }, }, 280: { FALSE, FALSE, { .scheme = SIGN_RSA_EMSA_PSS, .params = &rsa_pss_params_sha256 }, 281: { .scheme = SIGN_RSA_EMSA_PSS, }, }, 282: }; 283: 284: START_TEST(test_params_compare) 285: { 286: bool res; 287: 288: res = signature_params_equal(¶ms_compare_tests[_i].a, 289: ¶ms_compare_tests[_i].b); 290: ck_assert(res == params_compare_tests[_i].equal); 291: res = signature_params_comply(¶ms_compare_tests[_i].a, 292: ¶ms_compare_tests[_i].b); 293: ck_assert(res == params_compare_tests[_i].complies); 294: res = signature_params_comply(¶ms_compare_tests[_i].b, 295: ¶ms_compare_tests[_i].a); 296: ck_assert(res == params_compare_tests[_i].complies); 297: } 298: END_TEST 299: 300: START_TEST(test_params_compare_null) 301: { 302: ck_assert(signature_params_equal(NULL, NULL)); 303: ck_assert(!signature_params_equal(¶ms_compare_tests[0].a, NULL)); 304: ck_assert(!signature_params_equal(NULL, ¶ms_compare_tests[0].a)); 305: } 306: END_TEST 307: 308: static struct { 309: signature_params_t src; 310: signature_params_t res; 311: } params_clone_tests[] = { 312: { { .scheme = SIGN_RSA_EMSA_PKCS1_SHA2_256, }, { .scheme = SIGN_RSA_EMSA_PKCS1_SHA2_256, }, }, 313: { { .scheme = SIGN_RSA_EMSA_PSS }, { .scheme = SIGN_RSA_EMSA_PSS }, }, 314: { { .scheme = SIGN_RSA_EMSA_PSS, .params = &rsa_pss_params_sha256 }, 315: { .scheme = SIGN_RSA_EMSA_PSS, .params = &rsa_pss_params_sha256 }, }, 316: { { .scheme = SIGN_RSA_EMSA_PSS, .params = &rsa_pss_params_sha256_salt }, 317: { .scheme = SIGN_RSA_EMSA_PSS, .params = &rsa_pss_params_sha256_salt }, }, 318: { { .scheme = SIGN_RSA_EMSA_PKCS1_SHA2_256, .params = &rsa_pss_params_sha256 }, 319: { .scheme = SIGN_RSA_EMSA_PKCS1_SHA2_256 }, }, 320: }; 321: 322: START_TEST(test_params_clone) 323: { 324: signature_params_t *clone = NULL; 325: 326: clone = signature_params_clone(¶ms_clone_tests[_i].src); 327: ck_assert(signature_params_equal(clone, ¶ms_clone_tests[_i].res)); 328: signature_params_destroy(clone); 329: } 330: END_TEST 331: 332: START_TEST(test_params_clone_null) 333: { 334: signature_params_t *clone = NULL; 335: 336: clone = signature_params_clone(clone); 337: ck_assert(!clone); 338: signature_params_destroy(clone); 339: } 340: END_TEST 341: 342: START_TEST(test_params_clear) 343: { 344: signature_params_t *clone; 345: 346: clone = signature_params_clone(¶ms_clone_tests[_i].src); 347: signature_params_clear(clone); 348: ck_assert_int_eq(clone->scheme, SIGN_UNKNOWN); 349: ck_assert(!clone->params); 350: free(clone); 351: } 352: END_TEST 353: 354: START_TEST(test_params_clear_null) 355: { 356: signature_params_t *clone = NULL; 357: 358: signature_params_clear(clone); 359: } 360: END_TEST 361: 362: START_TEST(test_params_parse_rsa_pss) 363: { 364: signature_params_t parsed, res = { .scheme = SIGN_RSA_EMSA_PSS, }; 365: 366: ck_assert(signature_params_parse(rsa_pss_parse_tests[_i].aid, 0, &parsed)); 367: res.params = &rsa_pss_parse_tests[_i].params; 368: ck_assert(signature_params_equal(&parsed, &res)); 369: signature_params_clear(&parsed); 370: } 371: END_TEST 372: 373: START_TEST(test_params_parse_rsa_pss_invalid) 374: { 375: signature_params_t parsed; 376: 377: ck_assert(!signature_params_parse(rsa_pss_parse_invalid_tests[_i], 0, &parsed)); 378: } 379: END_TEST 380: 381: static struct { 382: bool valid; 383: chunk_t aid; 384: signature_params_t params; 385: } params_parse_tests[] = { 386: { TRUE, chunk_from_chars(0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00), 387: { .scheme = SIGN_RSA_EMSA_PKCS1_SHA2_256, }}, 388: { TRUE, chunk_from_chars(0x30,0x0a,0x06,0x08,0x2a,0x86,0x48,0xce,0x3d,0x04,0x03,0x02), 389: { .scheme = SIGN_ECDSA_WITH_SHA256_DER, }}, 390: { FALSE, chunk_from_chars(0x30,0x0a,0x06,0x08,0x2a,0x86,0x48,0xce,0x3d,0x04,0x03,0xff), }, 391: }; 392: 393: START_TEST(test_params_parse_other) 394: { 395: signature_params_t parsed; 396: 397: if (params_parse_tests[_i].valid) 398: { 399: ck_assert(signature_params_parse(params_parse_tests[_i].aid, 0, &parsed)); 400: ck_assert(signature_params_equal(&parsed, ¶ms_parse_tests[_i].params)); 401: signature_params_clear(&parsed); 402: } 403: else 404: { 405: ck_assert(!signature_params_parse(params_parse_tests[_i].aid, 0, &parsed)); 406: } 407: } 408: END_TEST 409: 410: START_TEST(test_params_build_rsa_pss) 411: { 412: signature_params_t scheme = { .scheme = SIGN_RSA_EMSA_PSS, }; 413: chunk_t aid; 414: 415: scheme.params = &rsa_pss_build_tests[_i].params; 416: ck_assert(signature_params_build(&scheme, &aid)); 417: ck_assert_chunk_eq(rsa_pss_build_tests[_i].aid, aid); 418: chunk_free(&aid); 419: } 420: END_TEST 421: 422: START_TEST(test_params_build_rsa_pss_invalid) 423: { 424: signature_params_t scheme = { .scheme = SIGN_RSA_EMSA_PSS, }; 425: chunk_t aid; 426: 427: scheme.params = &rsa_pss_build_invalid_tests[_i]; 428: ck_assert(!signature_params_build(&scheme, &aid)); 429: } 430: END_TEST 431: 432: static struct { 433: bool valid; 434: signature_params_t params; 435: chunk_t aid; 436: } params_build_tests[] = { 437: { TRUE, { .scheme = SIGN_RSA_EMSA_PKCS1_SHA2_256, }, 438: chunk_from_chars(0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00), }, 439: { TRUE, { .scheme = SIGN_ECDSA_WITH_SHA256_DER, }, 440: chunk_from_chars(0x30,0x0a,0x06,0x08,0x2a,0x86,0x48,0xce,0x3d,0x04,0x03,0x02), }, 441: { FALSE, { .scheme = SIGN_UNKNOWN, }, }, 442: }; 443: 444: START_TEST(test_params_build_other) 445: { 446: chunk_t aid; 447: 448: if (params_build_tests[_i].valid) 449: { 450: ck_assert(signature_params_build(¶ms_build_tests[_i].params, &aid)); 451: ck_assert_chunk_eq(params_build_tests[_i].aid, aid); 452: chunk_free(&aid); 453: } 454: else 455: { 456: ck_assert(!signature_params_build(¶ms_build_tests[_i].params, &aid)); 457: } 458: } 459: END_TEST 460: 461: Suite *signature_params_suite_create() 462: { 463: Suite *s; 464: TCase *tc; 465: 466: s = suite_create("signature params"); 467: 468: tc = tcase_create("rsa/pss parse"); 469: tcase_add_loop_test(tc, test_rsa_pss_params_parse, 0, countof(rsa_pss_parse_tests)); 470: tcase_add_loop_test(tc, test_rsa_pss_params_parse_invalid, 0, countof(rsa_pss_parse_invalid_tests)); 471: suite_add_tcase(s, tc); 472: 473: tc = tcase_create("rsa/pss build"); 474: tcase_add_loop_test(tc, test_rsa_pss_params_build, 0, countof(rsa_pss_build_tests)); 475: tcase_add_loop_test(tc, test_rsa_pss_params_build_invalid, 0, countof(rsa_pss_build_invalid_tests)); 476: suite_add_tcase(s, tc); 477: 478: tc = tcase_create("rsa/pss salt len"); 479: tcase_add_loop_test(tc, test_rsa_pss_params_set_salt_len, 0, countof(rsa_pss_salt_len_tests)); 480: suite_add_tcase(s, tc); 481: 482: tc = tcase_create("params compare"); 483: tcase_add_loop_test(tc, test_params_compare, 0, countof(params_compare_tests)); 484: tcase_add_test(tc, test_params_compare_null); 485: suite_add_tcase(s, tc); 486: 487: tc = tcase_create("params clone"); 488: tcase_add_loop_test(tc, test_params_clone, 0, countof(params_clone_tests)); 489: tcase_add_test(tc, test_params_clone_null); 490: suite_add_tcase(s, tc); 491: 492: tc = tcase_create("params clear"); 493: tcase_add_loop_test(tc, test_params_clear, 0, countof(params_clone_tests)); 494: tcase_add_test(tc, test_params_clear_null); 495: suite_add_tcase(s, tc); 496: 497: tc = tcase_create("parse"); 498: tcase_add_loop_test(tc, test_params_parse_rsa_pss, 0, countof(rsa_pss_parse_tests)); 499: tcase_add_loop_test(tc, test_params_parse_rsa_pss_invalid, 0, countof(rsa_pss_parse_invalid_tests)); 500: tcase_add_loop_test(tc, test_params_parse_other, 0, countof(params_parse_tests)); 501: suite_add_tcase(s, tc); 502: 503: tc = tcase_create("build"); 504: tcase_add_loop_test(tc, test_params_build_rsa_pss, 0, countof(rsa_pss_build_tests)); 505: tcase_add_loop_test(tc, test_params_build_rsa_pss_invalid, 0, countof(rsa_pss_build_invalid_tests)); 506: tcase_add_loop_test(tc, test_params_build_other, 0, countof(params_build_tests)); 507: suite_add_tcase(s, tc); 508: 509: return s; 510: }