1 1.1 christos /* 2 1.1.1.2 christos * Copyright 2020-2024 The OpenSSL Project Authors. All Rights Reserved. 3 1.1 christos * 4 1.1 christos * Licensed under the Apache License 2.0 (the "License"); 5 1.1 christos * you may not use this file except in compliance with the License. 6 1.1 christos * You may obtain a copy of the License at 7 1.1 christos * https://www.openssl.org/source/license.html 8 1.1 christos * or in the file LICENSE in the source distribution. 9 1.1 christos */ 10 1.1 christos 11 1.1 christos /* 12 1.1 christos * This program tests the use of OSSL_PARAM, currently in raw form. 13 1.1 christos */ 14 1.1 christos 15 1.1 christos #include "internal/nelem.h" 16 1.1 christos #include "internal/cryptlib.h" 17 1.1 christos #include "testutil.h" 18 1.1 christos 19 1.1 christos struct testdata 20 1.1 christos { 21 1.1 christos const char *in; 22 1.1 christos const unsigned char *expected; 23 1.1 christos size_t expected_len; 24 1.1 christos const char sep; 25 1.1 christos }; 26 1.1 christos 27 1.1 christos static const unsigned char test_1[] = { 0xAB, 0xCD, 0xEF, 0xF1 }; 28 1.1 christos static const unsigned char test_2[] = { 0xAB, 0xCD, 0xEF, 0x76, 0x00 }; 29 1.1 christos 30 1.1 christos static struct testdata tbl_testdata[] = { 31 1.1 christos { 32 1.1 christos "AB:CD:EF:F1", 33 1.1 christos test_1, sizeof(test_1), 34 1.1 christos ':', 35 1.1 christos }, 36 1.1 christos { 37 1.1 christos "AB:CD:EF:76:00", 38 1.1 christos test_2, sizeof(test_2), 39 1.1 christos ':', 40 1.1 christos }, 41 1.1 christos { 42 1.1 christos "AB_CD_EF_F1", 43 1.1 christos test_1, sizeof(test_1), 44 1.1 christos '_', 45 1.1 christos }, 46 1.1 christos { 47 1.1 christos "AB_CD_EF_76_00", 48 1.1 christos test_2, sizeof(test_2), 49 1.1 christos '_', 50 1.1 christos }, 51 1.1 christos { 52 1.1 christos "ABCDEFF1", 53 1.1 christos test_1, sizeof(test_1), 54 1.1 christos '\0', 55 1.1 christos }, 56 1.1 christos { 57 1.1 christos "ABCDEF7600", 58 1.1 christos test_2, sizeof(test_2), 59 1.1 christos '\0', 60 1.1 christos }, 61 1.1 christos }; 62 1.1 christos 63 1.1 christos static int test_hexstr_sep_to_from(int test_index) 64 1.1 christos { 65 1.1 christos int ret = 0; 66 1.1 christos long len = 0; 67 1.1 christos unsigned char *buf = NULL; 68 1.1 christos char *out = NULL; 69 1.1 christos struct testdata *test = &tbl_testdata[test_index]; 70 1.1 christos 71 1.1 christos if (!TEST_ptr(buf = ossl_hexstr2buf_sep(test->in, &len, test->sep)) 72 1.1 christos || !TEST_mem_eq(buf, len, test->expected, test->expected_len) 73 1.1 christos || !TEST_ptr(out = ossl_buf2hexstr_sep(buf, len, test->sep)) 74 1.1 christos || !TEST_str_eq(out, test->in)) 75 1.1 christos goto err; 76 1.1 christos 77 1.1 christos ret = 1; 78 1.1 christos err: 79 1.1 christos OPENSSL_free(buf); 80 1.1 christos OPENSSL_free(out); 81 1.1 christos return ret; 82 1.1 christos } 83 1.1 christos 84 1.1 christos static int test_hexstr_to_from(int test_index) 85 1.1 christos { 86 1.1 christos int ret = 0; 87 1.1 christos long len = 0; 88 1.1 christos unsigned char *buf = NULL; 89 1.1 christos char *out = NULL; 90 1.1 christos struct testdata *test = &tbl_testdata[test_index]; 91 1.1 christos 92 1.1 christos if (test->sep != '_') { 93 1.1 christos if (!TEST_ptr(buf = OPENSSL_hexstr2buf(test->in, &len)) 94 1.1 christos || !TEST_mem_eq(buf, len, test->expected, test->expected_len) 95 1.1 christos || !TEST_ptr(out = OPENSSL_buf2hexstr(buf, len))) 96 1.1 christos goto err; 97 1.1 christos if (test->sep == ':') { 98 1.1 christos if (!TEST_str_eq(out, test->in)) 99 1.1 christos goto err; 100 1.1 christos } else if (!TEST_str_ne(out, test->in)) { 101 1.1 christos goto err; 102 1.1 christos } 103 1.1 christos } else { 104 1.1 christos if (!TEST_ptr_null(buf = OPENSSL_hexstr2buf(test->in, &len))) 105 1.1 christos goto err; 106 1.1 christos } 107 1.1 christos ret = 1; 108 1.1 christos err: 109 1.1 christos OPENSSL_free(buf); 110 1.1 christos OPENSSL_free(out); 111 1.1 christos return ret; 112 1.1 christos } 113 1.1 christos 114 1.1 christos static int test_hexstr_ex_to_from(int test_index) 115 1.1 christos { 116 1.1 christos size_t len = 0; 117 1.1 christos char out[64]; 118 1.1 christos unsigned char buf[64]; 119 1.1 christos struct testdata *test = &tbl_testdata[test_index]; 120 1.1 christos 121 1.1 christos return TEST_true(OPENSSL_hexstr2buf_ex(buf, sizeof(buf), &len, test->in, ':')) 122 1.1 christos && TEST_mem_eq(buf, len, test->expected, test->expected_len) 123 1.1.1.2 christos && TEST_false(OPENSSL_buf2hexstr_ex(out, 3 * len - 1, NULL, buf, len, 124 1.1.1.2 christos ':')) 125 1.1 christos && TEST_true(OPENSSL_buf2hexstr_ex(out, sizeof(out), NULL, buf, len, 126 1.1.1.2 christos ':')) 127 1.1.1.2 christos && TEST_str_eq(out, test->in) 128 1.1.1.2 christos && TEST_true(OPENSSL_buf2hexstr_ex(out, sizeof(out), NULL, buf, 0, 129 1.1.1.2 christos ':')) 130 1.1.1.2 christos && TEST_size_t_eq(strlen(out), 0); 131 1.1 christos } 132 1.1 christos 133 1.1 christos int setup_tests(void) 134 1.1 christos { 135 1.1 christos ADD_ALL_TESTS(test_hexstr_sep_to_from, OSSL_NELEM(tbl_testdata)); 136 1.1 christos ADD_ALL_TESTS(test_hexstr_to_from, OSSL_NELEM(tbl_testdata)); 137 1.1 christos ADD_ALL_TESTS(test_hexstr_ex_to_from, 2); 138 1.1 christos return 1; 139 1.1 christos } 140