Home | History | Annotate | Line # | Download | only in dns
      1 /*	$NetBSD: rsa_test.c,v 1.3 2025/01/26 16:25:48 christos Exp $	*/
      2 
      3 /*
      4  * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
      5  *
      6  * SPDX-License-Identifier: MPL-2.0
      7  *
      8  * This Source Code Form is subject to the terms of the Mozilla Public
      9  * License, v. 2.0. If a copy of the MPL was not distributed with this
     10  * file, you can obtain one at https://mozilla.org/MPL/2.0/.
     11  *
     12  * See the COPYRIGHT file distributed with this work for additional
     13  * information regarding copyright ownership.
     14  */
     15 
     16 #include <inttypes.h>
     17 #include <sched.h> /* IWYU pragma: keep */
     18 #include <setjmp.h>
     19 #include <stdarg.h>
     20 #include <stddef.h>
     21 #include <stdio.h>
     22 #include <stdlib.h>
     23 #include <string.h>
     24 #include <unistd.h>
     25 
     26 /*
     27  * As a workaround, include an OpenSSL header file before including cmocka.h,
     28  * because OpenSSL 3.1.0 uses __attribute__(malloc), conflicting with a
     29  * redefined malloc in cmocka.h.
     30  */
     31 #include <openssl/err.h>
     32 
     33 #define UNIT_TESTING
     34 #include <cmocka.h>
     35 
     36 #include <isc/util.h>
     37 
     38 #include "dst_internal.h"
     39 
     40 #include <tests/dns.h>
     41 
     42 static int
     43 setup_test(void **state) {
     44 	isc_result_t result;
     45 
     46 	UNUSED(state);
     47 
     48 	result = dst_lib_init(mctx, NULL);
     49 
     50 	if (result != ISC_R_SUCCESS) {
     51 		return 1;
     52 	}
     53 
     54 	return 0;
     55 }
     56 
     57 static int
     58 teardown_test(void **state) {
     59 	UNUSED(state);
     60 
     61 	dst_lib_destroy();
     62 
     63 	return 0;
     64 }
     65 
     66 static unsigned char d[10] = { 0xa,  0x10, 0xbb, 0,    0xfe,
     67 			       0x15, 0x1,  0x88, 0xcc, 0x7d };
     68 
     69 static unsigned char sigsha1[256] = {
     70 	0x45, 0x55, 0xd6, 0xf8, 0x05, 0xd2, 0x2e, 0x79, 0x14, 0x2b, 0x1b, 0xd1,
     71 	0x4b, 0xb7, 0xcd, 0xc0, 0xa2, 0xf3, 0x85, 0x32, 0x1f, 0xa3, 0xfd, 0x1f,
     72 	0x30, 0xe0, 0xde, 0xb2, 0x6f, 0x3c, 0x8e, 0x2b, 0x82, 0x92, 0xcd, 0x1c,
     73 	0x1b, 0xdf, 0xe6, 0xd5, 0x4d, 0x93, 0xe6, 0xaa, 0x40, 0x28, 0x1b, 0x7b,
     74 	0x2e, 0x40, 0x4d, 0xb5, 0x4d, 0x43, 0xe8, 0xfc, 0x93, 0x86, 0x68, 0xe3,
     75 	0xbf, 0x73, 0x9a, 0x1e, 0x6b, 0x5d, 0x52, 0xb8, 0x98, 0x1c, 0x94, 0xe1,
     76 	0x85, 0x8b, 0xee, 0xb1, 0x4f, 0x22, 0x71, 0xcb, 0xfd, 0xb2, 0xa8, 0x88,
     77 	0x64, 0xb4, 0xb1, 0x4a, 0xa1, 0x7a, 0xce, 0x52, 0x83, 0xd8, 0xf2, 0x9e,
     78 	0x67, 0x4c, 0xc3, 0x37, 0x74, 0xfe, 0xe0, 0x25, 0x2a, 0xfd, 0xa3, 0x09,
     79 	0xff, 0x8a, 0x92, 0x0d, 0xa9, 0xb3, 0x90, 0x23, 0xbe, 0x6a, 0x2c, 0x9e,
     80 	0x5c, 0x6d, 0xb4, 0xa7, 0xd7, 0x97, 0xdd, 0xc6, 0xb8, 0xae, 0xd4, 0x88,
     81 	0x64, 0x63, 0x1e, 0x85, 0x20, 0x09, 0xea, 0xc4, 0x0b, 0xca, 0xbf, 0x83,
     82 	0x5c, 0x89, 0xae, 0x64, 0x15, 0x76, 0x06, 0x51, 0xb6, 0xa1, 0x99, 0xb2,
     83 	0x3c, 0x50, 0x99, 0x86, 0x7d, 0xc7, 0xca, 0x4e, 0x1d, 0x2c, 0x17, 0xbb,
     84 	0x6c, 0x7a, 0xc9, 0x3f, 0x5e, 0x28, 0x57, 0x2c, 0xda, 0x01, 0x1d, 0xe8,
     85 	0x01, 0xf8, 0xf6, 0x37, 0xe1, 0x34, 0x56, 0xae, 0x6e, 0xb1, 0xd4, 0xa2,
     86 	0xc4, 0x02, 0xc1, 0xca, 0x96, 0xb0, 0x06, 0x72, 0x2a, 0x27, 0xaa, 0xc8,
     87 	0xd5, 0x50, 0x81, 0x49, 0x46, 0x33, 0xf8, 0xf7, 0x6b, 0xf4, 0x9c, 0x30,
     88 	0x90, 0x50, 0xf6, 0x16, 0x76, 0x9d, 0xc6, 0x73, 0xb5, 0xbc, 0x8a, 0xb6,
     89 	0x1d, 0x98, 0xcb, 0xce, 0x36, 0x6f, 0x60, 0xec, 0x96, 0x49, 0x08, 0x85,
     90 	0x5b, 0xc1, 0x8e, 0xb0, 0xea, 0x9e, 0x1f, 0xd6, 0x27, 0x7f, 0xb6, 0xe0,
     91 	0x04, 0x12, 0xd2, 0x81
     92 };
     93 
     94 static unsigned char sigsha256[256] = {
     95 	0x83, 0x53, 0x15, 0xfc, 0xca, 0xdb, 0xf6, 0x0d, 0x53, 0x24, 0x5b, 0x5a,
     96 	0x8e, 0xd0, 0xbe, 0x5e, 0xbc, 0xe8, 0x9e, 0x92, 0x3c, 0xfa, 0x93, 0x03,
     97 	0xce, 0x2f, 0xc7, 0x6d, 0xd0, 0xbb, 0x9d, 0x06, 0x83, 0xc6, 0xd3, 0xc0,
     98 	0xc1, 0x57, 0x9c, 0x82, 0x17, 0x7f, 0xb5, 0xf8, 0x31, 0x18, 0xda, 0x46,
     99 	0x05, 0x2c, 0xf8, 0xea, 0xaa, 0xcd, 0x99, 0x18, 0xff, 0x23, 0x5e, 0xef,
    100 	0xf0, 0x87, 0x47, 0x6e, 0x91, 0xfd, 0x19, 0x0b, 0x39, 0x19, 0x6a, 0xc8,
    101 	0xdf, 0x71, 0x66, 0x8e, 0xa9, 0xa0, 0x79, 0x5c, 0x2c, 0x52, 0x00, 0x61,
    102 	0x17, 0x86, 0x66, 0x03, 0x52, 0xad, 0xec, 0x06, 0x53, 0xd9, 0x6d, 0xe3,
    103 	0xe3, 0xea, 0x28, 0x15, 0xb3, 0x75, 0xf4, 0x61, 0x7d, 0xed, 0x69, 0x2c,
    104 	0x24, 0xf3, 0x21, 0xb1, 0x8a, 0xea, 0x60, 0xa2, 0x9e, 0x6a, 0xa6, 0x53,
    105 	0x12, 0xf6, 0x5c, 0xef, 0xd7, 0x49, 0x4a, 0x02, 0xe7, 0xf8, 0x64, 0x89,
    106 	0x13, 0xac, 0xd5, 0x1e, 0x58, 0xff, 0xa1, 0x63, 0xdd, 0xa0, 0x1f, 0x44,
    107 	0x99, 0x6a, 0x59, 0x7f, 0x35, 0xbd, 0xf1, 0xf3, 0x7a, 0x28, 0x44, 0xe3,
    108 	0x4c, 0x68, 0xb1, 0xb3, 0x97, 0x3c, 0x46, 0xe3, 0xc2, 0x12, 0x9e, 0x68,
    109 	0x0b, 0xa6, 0x6c, 0x8f, 0x58, 0x48, 0x44, 0xa4, 0xf7, 0xa7, 0xc2, 0x91,
    110 	0x8f, 0xbf, 0x00, 0xd0, 0x01, 0x35, 0xd4, 0x86, 0x6e, 0x1f, 0xea, 0x42,
    111 	0x60, 0xb1, 0x84, 0x27, 0xf4, 0x99, 0x36, 0x06, 0x98, 0x12, 0x83, 0x32,
    112 	0x9f, 0xcd, 0x50, 0x5a, 0x5e, 0xb8, 0x8e, 0xfe, 0x8d, 0x8d, 0x33, 0x2d,
    113 	0x45, 0xe1, 0xc9, 0xdf, 0x2a, 0xd8, 0x38, 0x1d, 0x95, 0xd4, 0x42, 0xee,
    114 	0x93, 0x5b, 0x0f, 0x1e, 0x07, 0x06, 0x3a, 0x92, 0xf1, 0x59, 0x1d, 0x6e,
    115 	0x1c, 0x31, 0xf3, 0xce, 0xa9, 0x1f, 0xad, 0x4d, 0x76, 0x4d, 0x24, 0x98,
    116 	0xe2, 0x0e, 0x8c, 0x35
    117 };
    118 
    119 static unsigned char sigsha512[512] = {
    120 	0x4e, 0x2f, 0x63, 0x42, 0xc5, 0xf3, 0x05, 0x4a, 0xa6, 0x3a, 0x93, 0xa0,
    121 	0xd9, 0x33, 0xa0, 0xd1, 0x46, 0x33, 0x42, 0xe8, 0x74, 0xeb, 0x3b, 0x10,
    122 	0x82, 0xd7, 0xcf, 0x39, 0x23, 0xb3, 0xe9, 0x23, 0x53, 0x87, 0x8c, 0xee,
    123 	0x78, 0xcb, 0xb3, 0xd9, 0xd2, 0x6d, 0x1a, 0x7c, 0x01, 0x4f, 0xed, 0x8d,
    124 	0xf2, 0x72, 0xe4, 0x6a, 0x00, 0x8a, 0x60, 0xa6, 0xd5, 0x9c, 0x43, 0x6c,
    125 	0xef, 0x38, 0x0c, 0x74, 0x82, 0x5d, 0x22, 0xaa, 0x87, 0x81, 0x90, 0x9c,
    126 	0x64, 0x07, 0x9b, 0x13, 0x51, 0xe0, 0xa5, 0xc2, 0x83, 0x78, 0x2b, 0x9b,
    127 	0xb3, 0x8a, 0x9d, 0x36, 0x33, 0xbd, 0x0d, 0x53, 0x84, 0xae, 0xe8, 0x13,
    128 	0x36, 0xf6, 0xdf, 0x96, 0xe9, 0xda, 0xc3, 0xd7, 0xa9, 0x2f, 0xf3, 0x5e,
    129 	0x5f, 0x1f, 0x7f, 0x38, 0x7e, 0x8d, 0xbe, 0x90, 0x5e, 0x13, 0xb2, 0x20,
    130 	0xbb, 0x9d, 0xfe, 0xe1, 0x52, 0xce, 0xe6, 0x80, 0xa7, 0x95, 0x24, 0x59,
    131 	0xe3, 0xac, 0x24, 0xc4, 0xfa, 0x1c, 0x44, 0x34, 0x29, 0x8d, 0xb1, 0xd0,
    132 	0xd9, 0x4c, 0xff, 0xc4, 0xdb, 0xca, 0xc4, 0x3f, 0x38, 0xf9, 0xe4, 0xaf,
    133 	0x75, 0x0a, 0x67, 0x4d, 0xa0, 0x2b, 0xb0, 0x83, 0xce, 0x53, 0xc4, 0xb9,
    134 	0x2e, 0x61, 0xb6, 0x64, 0xe5, 0xb5, 0xe5, 0xac, 0x9d, 0x51, 0xec, 0x58,
    135 	0x42, 0x90, 0x78, 0xf6, 0x46, 0x96, 0xef, 0xb6, 0x97, 0xb7, 0x54, 0x28,
    136 	0x1a, 0x4c, 0x29, 0xf4, 0x7a, 0x33, 0xc6, 0x07, 0xfd, 0xec, 0x97, 0x36,
    137 	0x1d, 0x42, 0x88, 0x94, 0x27, 0xc2, 0xa3, 0xe1, 0xd4, 0x87, 0xa1, 0x8a,
    138 	0x2b, 0xff, 0x47, 0x60, 0xfe, 0x1f, 0xaf, 0xc2, 0xeb, 0x17, 0xdd, 0x56,
    139 	0xc5, 0x94, 0x5c, 0xcb, 0x23, 0xe5, 0x49, 0x4d, 0x99, 0x06, 0x02, 0x5a,
    140 	0xfc, 0xfc, 0xdc, 0xee, 0x49, 0xbc, 0x47, 0x60, 0xff, 0x6a, 0x63, 0x8b,
    141 	0xe1, 0x2e, 0xa3, 0xa7
    142 };
    143 
    144 /* RSA verify */
    145 ISC_RUN_TEST_IMPL(isc_rsa_verify) {
    146 	isc_result_t ret;
    147 	dns_fixedname_t fname;
    148 	isc_buffer_t buf;
    149 	dns_name_t *name;
    150 	dst_key_t *key = NULL;
    151 	dst_context_t *ctx = NULL;
    152 	isc_region_t r;
    153 
    154 	UNUSED(state);
    155 
    156 	name = dns_fixedname_initname(&fname);
    157 	isc_buffer_constinit(&buf, "rsa.", 4);
    158 	isc_buffer_add(&buf, 4);
    159 	ret = dns_name_fromtext(name, &buf, NULL, 0, NULL);
    160 	assert_int_equal(ret, ISC_R_SUCCESS);
    161 
    162 	ret = dst_key_fromfile(name, 29238, DST_ALG_RSASHA256, DST_TYPE_PUBLIC,
    163 			       TESTS_DIR, mctx, &key);
    164 	assert_int_equal(ret, ISC_R_SUCCESS);
    165 
    166 	/* RSASHA1 - May not be supported by the OS */
    167 	if (dst_algorithm_supported(DST_ALG_RSASHA1)) {
    168 		key->key_alg = DST_ALG_RSASHA1;
    169 
    170 		ret = dst_context_create(key, mctx, DNS_LOGCATEGORY_DNSSEC,
    171 					 false, 0, &ctx);
    172 		assert_int_equal(ret, ISC_R_SUCCESS);
    173 
    174 		r.base = d;
    175 		r.length = 10;
    176 		ret = dst_context_adddata(ctx, &r);
    177 		assert_int_equal(ret, ISC_R_SUCCESS);
    178 
    179 		r.base = sigsha1;
    180 		r.length = 256;
    181 		ret = dst_context_verify(ctx, &r);
    182 		assert_int_equal(ret, ISC_R_SUCCESS);
    183 
    184 		dst_context_destroy(&ctx);
    185 	}
    186 
    187 	/* RSASHA256 */
    188 
    189 	key->key_alg = DST_ALG_RSASHA256;
    190 
    191 	ret = dst_context_create(key, mctx, DNS_LOGCATEGORY_DNSSEC, false, 0,
    192 				 &ctx);
    193 	assert_int_equal(ret, ISC_R_SUCCESS);
    194 
    195 	r.base = d;
    196 	r.length = 10;
    197 	ret = dst_context_adddata(ctx, &r);
    198 	assert_int_equal(ret, ISC_R_SUCCESS);
    199 
    200 	r.base = sigsha256;
    201 	r.length = 256;
    202 	ret = dst_context_verify(ctx, &r);
    203 	assert_int_equal(ret, ISC_R_SUCCESS);
    204 
    205 	dst_context_destroy(&ctx);
    206 
    207 	/* RSASHA512 */
    208 
    209 	key->key_alg = DST_ALG_RSASHA512;
    210 
    211 	ret = dst_context_create(key, mctx, DNS_LOGCATEGORY_DNSSEC, false, 0,
    212 				 &ctx);
    213 	assert_int_equal(ret, ISC_R_SUCCESS);
    214 
    215 	r.base = d;
    216 	r.length = 10;
    217 	ret = dst_context_adddata(ctx, &r);
    218 	assert_int_equal(ret, ISC_R_SUCCESS);
    219 
    220 	r.base = sigsha512;
    221 	r.length = 256;
    222 	ret = dst_context_verify(ctx, &r);
    223 	assert_int_equal(ret, ISC_R_SUCCESS);
    224 
    225 	dst_context_destroy(&ctx);
    226 
    227 	dst_key_free(&key);
    228 }
    229 
    230 ISC_TEST_LIST_START
    231 ISC_TEST_ENTRY_CUSTOM(isc_rsa_verify, setup_test, teardown_test)
    232 ISC_TEST_LIST_END
    233 
    234 ISC_TEST_MAIN
    235