1e1051a39Sopenharmony_ci/* 2e1051a39Sopenharmony_ci * Copyright 2019-2020 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci * 4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci */ 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci#include "apps.h" 11e1051a39Sopenharmony_ci#include "app_params.h" 12e1051a39Sopenharmony_ci 13e1051a39Sopenharmony_cistatic int describe_param_type(char *buf, size_t bufsz, const OSSL_PARAM *param) 14e1051a39Sopenharmony_ci{ 15e1051a39Sopenharmony_ci const char *type_mod = ""; 16e1051a39Sopenharmony_ci const char *type = NULL; 17e1051a39Sopenharmony_ci int show_type_number = 0; 18e1051a39Sopenharmony_ci int printed_len; 19e1051a39Sopenharmony_ci 20e1051a39Sopenharmony_ci switch (param->data_type) { 21e1051a39Sopenharmony_ci case OSSL_PARAM_UNSIGNED_INTEGER: 22e1051a39Sopenharmony_ci type_mod = "unsigned "; 23e1051a39Sopenharmony_ci /* FALLTHRU */ 24e1051a39Sopenharmony_ci case OSSL_PARAM_INTEGER: 25e1051a39Sopenharmony_ci type = "integer"; 26e1051a39Sopenharmony_ci break; 27e1051a39Sopenharmony_ci case OSSL_PARAM_UTF8_PTR: 28e1051a39Sopenharmony_ci type_mod = "pointer to a "; 29e1051a39Sopenharmony_ci /* FALLTHRU */ 30e1051a39Sopenharmony_ci case OSSL_PARAM_UTF8_STRING: 31e1051a39Sopenharmony_ci type = "UTF8 encoded string"; 32e1051a39Sopenharmony_ci break; 33e1051a39Sopenharmony_ci case OSSL_PARAM_OCTET_PTR: 34e1051a39Sopenharmony_ci type_mod = "pointer to an "; 35e1051a39Sopenharmony_ci /* FALLTHRU */ 36e1051a39Sopenharmony_ci case OSSL_PARAM_OCTET_STRING: 37e1051a39Sopenharmony_ci type = "octet string"; 38e1051a39Sopenharmony_ci break; 39e1051a39Sopenharmony_ci default: 40e1051a39Sopenharmony_ci type = "unknown type"; 41e1051a39Sopenharmony_ci show_type_number = 1; 42e1051a39Sopenharmony_ci break; 43e1051a39Sopenharmony_ci } 44e1051a39Sopenharmony_ci 45e1051a39Sopenharmony_ci printed_len = BIO_snprintf(buf, bufsz, "%s: ", param->key); 46e1051a39Sopenharmony_ci if (printed_len > 0) { 47e1051a39Sopenharmony_ci buf += printed_len; 48e1051a39Sopenharmony_ci bufsz -= printed_len; 49e1051a39Sopenharmony_ci } 50e1051a39Sopenharmony_ci printed_len = BIO_snprintf(buf, bufsz, "%s%s", type_mod, type); 51e1051a39Sopenharmony_ci if (printed_len > 0) { 52e1051a39Sopenharmony_ci buf += printed_len; 53e1051a39Sopenharmony_ci bufsz -= printed_len; 54e1051a39Sopenharmony_ci } 55e1051a39Sopenharmony_ci if (show_type_number) { 56e1051a39Sopenharmony_ci printed_len = BIO_snprintf(buf, bufsz, " [%d]", param->data_type); 57e1051a39Sopenharmony_ci if (printed_len > 0) { 58e1051a39Sopenharmony_ci buf += printed_len; 59e1051a39Sopenharmony_ci bufsz -= printed_len; 60e1051a39Sopenharmony_ci } 61e1051a39Sopenharmony_ci } 62e1051a39Sopenharmony_ci if (param->data_size == 0) 63e1051a39Sopenharmony_ci printed_len = BIO_snprintf(buf, bufsz, " (arbitrary size)"); 64e1051a39Sopenharmony_ci else 65e1051a39Sopenharmony_ci printed_len = BIO_snprintf(buf, bufsz, " (max %zu bytes large)", 66e1051a39Sopenharmony_ci param->data_size); 67e1051a39Sopenharmony_ci if (printed_len > 0) { 68e1051a39Sopenharmony_ci buf += printed_len; 69e1051a39Sopenharmony_ci bufsz -= printed_len; 70e1051a39Sopenharmony_ci } 71e1051a39Sopenharmony_ci *buf = '\0'; 72e1051a39Sopenharmony_ci return 1; 73e1051a39Sopenharmony_ci} 74e1051a39Sopenharmony_ci 75e1051a39Sopenharmony_ciint print_param_types(const char *thing, const OSSL_PARAM *pdefs, int indent) 76e1051a39Sopenharmony_ci{ 77e1051a39Sopenharmony_ci if (pdefs == NULL) { 78e1051a39Sopenharmony_ci return 1; 79e1051a39Sopenharmony_ci } else if (pdefs->key == NULL) { 80e1051a39Sopenharmony_ci /* 81e1051a39Sopenharmony_ci * An empty list? This shouldn't happen, but let's just make sure to 82e1051a39Sopenharmony_ci * say something if there's a badly written provider... 83e1051a39Sopenharmony_ci */ 84e1051a39Sopenharmony_ci BIO_printf(bio_out, "%*sEmpty list of %s (!!!)\n", indent, "", thing); 85e1051a39Sopenharmony_ci } else { 86e1051a39Sopenharmony_ci BIO_printf(bio_out, "%*s%s:\n", indent, "", thing); 87e1051a39Sopenharmony_ci for (; pdefs->key != NULL; pdefs++) { 88e1051a39Sopenharmony_ci char buf[200]; /* This should be ample space */ 89e1051a39Sopenharmony_ci 90e1051a39Sopenharmony_ci describe_param_type(buf, sizeof(buf), pdefs); 91e1051a39Sopenharmony_ci BIO_printf(bio_out, "%*s %s\n", indent, "", buf); 92e1051a39Sopenharmony_ci } 93e1051a39Sopenharmony_ci } 94e1051a39Sopenharmony_ci return 1; 95e1051a39Sopenharmony_ci} 96e1051a39Sopenharmony_ci 97e1051a39Sopenharmony_civoid print_param_value(const OSSL_PARAM *p, int indent) 98e1051a39Sopenharmony_ci{ 99e1051a39Sopenharmony_ci int64_t i; 100e1051a39Sopenharmony_ci uint64_t u; 101e1051a39Sopenharmony_ci 102e1051a39Sopenharmony_ci printf("%*s%s: ", indent, "", p->key); 103e1051a39Sopenharmony_ci switch (p->data_type) { 104e1051a39Sopenharmony_ci case OSSL_PARAM_UNSIGNED_INTEGER: 105e1051a39Sopenharmony_ci if (OSSL_PARAM_get_uint64(p, &u)) 106e1051a39Sopenharmony_ci BIO_printf(bio_out, "%llu\n", (unsigned long long int)u); 107e1051a39Sopenharmony_ci else 108e1051a39Sopenharmony_ci BIO_printf(bio_out, "error getting value\n"); 109e1051a39Sopenharmony_ci break; 110e1051a39Sopenharmony_ci case OSSL_PARAM_INTEGER: 111e1051a39Sopenharmony_ci if (OSSL_PARAM_get_int64(p, &i)) 112e1051a39Sopenharmony_ci BIO_printf(bio_out, "%lld\n", (long long int)i); 113e1051a39Sopenharmony_ci else 114e1051a39Sopenharmony_ci BIO_printf(bio_out, "error getting value\n"); 115e1051a39Sopenharmony_ci break; 116e1051a39Sopenharmony_ci case OSSL_PARAM_UTF8_PTR: 117e1051a39Sopenharmony_ci BIO_printf(bio_out, "'%s'\n", *(char **)(p->data)); 118e1051a39Sopenharmony_ci break; 119e1051a39Sopenharmony_ci case OSSL_PARAM_UTF8_STRING: 120e1051a39Sopenharmony_ci BIO_printf(bio_out, "'%s'\n", (char *)p->data); 121e1051a39Sopenharmony_ci break; 122e1051a39Sopenharmony_ci case OSSL_PARAM_OCTET_PTR: 123e1051a39Sopenharmony_ci case OSSL_PARAM_OCTET_STRING: 124e1051a39Sopenharmony_ci BIO_printf(bio_out, "<%zu bytes>\n", p->data_size); 125e1051a39Sopenharmony_ci break; 126e1051a39Sopenharmony_ci default: 127e1051a39Sopenharmony_ci BIO_printf(bio_out, "unknown type (%u) of %zu bytes\n", 128e1051a39Sopenharmony_ci p->data_type, p->data_size); 129e1051a39Sopenharmony_ci break; 130e1051a39Sopenharmony_ci } 131e1051a39Sopenharmony_ci} 132e1051a39Sopenharmony_ci 133