| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 | /* * Copyright 2019-2020 The OpenSSL Project Authors. All Rights Reserved. * * Licensed under the Apache License 2.0 (the "License").  You may not use * this file except in compliance with the License.  You can obtain a copy * in the file LICENSE in the source distribution or at * https://www.openssl.org/source/license.html */#include "apps.h"#include "app_params.h"static int describe_param_type(char *buf, size_t bufsz, const OSSL_PARAM *param){    const char *type_mod = "";    const char *type = NULL;    int show_type_number = 0;    int printed_len;    switch (param->data_type) {    case OSSL_PARAM_UNSIGNED_INTEGER:        type_mod = "unsigned ";        /* FALLTHRU */    case OSSL_PARAM_INTEGER:        type = "integer";        break;    case OSSL_PARAM_UTF8_PTR:        type_mod = "pointer to a ";        /* FALLTHRU */    case OSSL_PARAM_UTF8_STRING:        type = "UTF8 encoded string";        break;    case OSSL_PARAM_OCTET_PTR:        type_mod = "pointer to an ";        /* FALLTHRU */    case OSSL_PARAM_OCTET_STRING:        type = "octet string";        break;    default:        type = "unknown type";        show_type_number = 1;        break;    }    printed_len = BIO_snprintf(buf, bufsz, "%s: ", param->key);    if (printed_len > 0) {        buf += printed_len;        bufsz -= printed_len;    }    printed_len = BIO_snprintf(buf, bufsz, "%s%s", type_mod, type);    if (printed_len > 0) {        buf += printed_len;        bufsz -= printed_len;    }    if (show_type_number) {        printed_len = BIO_snprintf(buf, bufsz, " [%d]", param->data_type);        if (printed_len > 0) {            buf += printed_len;            bufsz -= printed_len;        }    }    if (param->data_size == 0)        printed_len = BIO_snprintf(buf, bufsz, " (arbitrary size)");    else        printed_len = BIO_snprintf(buf, bufsz, " (max %zu bytes large)",                                   param->data_size);    if (printed_len > 0) {        buf += printed_len;        bufsz -= printed_len;    }    *buf = '\0';    return 1;}int print_param_types(const char *thing, const OSSL_PARAM *pdefs, int indent){    if (pdefs == NULL) {        return 1;    } else if (pdefs->key == NULL) {        /*         * An empty list?  This shouldn't happen, but let's just make sure to         * say something if there's a badly written provider...         */        BIO_printf(bio_out, "%*sEmpty list of %s (!!!)\n", indent, "", thing);    } else {        BIO_printf(bio_out, "%*s%s:\n", indent, "", thing);        for (; pdefs->key != NULL; pdefs++) {            char buf[200];       /* This should be ample space */            describe_param_type(buf, sizeof(buf), pdefs);            BIO_printf(bio_out, "%*s  %s\n", indent, "", buf);        }    }    return 1;}void print_param_value(const OSSL_PARAM *p, int indent){    int64_t i;    uint64_t u;    printf("%*s%s: ", indent, "", p->key);    switch (p->data_type) {    case OSSL_PARAM_UNSIGNED_INTEGER:        if (OSSL_PARAM_get_uint64(p, &u))            BIO_printf(bio_out, "%llu\n", (unsigned long long int)u);        else            BIO_printf(bio_out, "error getting value\n");        break;    case OSSL_PARAM_INTEGER:        if (OSSL_PARAM_get_int64(p, &i))            BIO_printf(bio_out, "%lld\n", (long long int)i);        else            BIO_printf(bio_out, "error getting value\n");        break;    case OSSL_PARAM_UTF8_PTR:        BIO_printf(bio_out, "'%s'\n", *(char **)(p->data));        break;    case OSSL_PARAM_UTF8_STRING:        BIO_printf(bio_out, "'%s'\n", (char *)p->data);        break;    case OSSL_PARAM_OCTET_PTR:    case OSSL_PARAM_OCTET_STRING:        BIO_printf(bio_out, "<%zu bytes>\n", p->data_size);        break;    default:        BIO_printf(bio_out, "unknown type (%u) of %zu bytes\n",                   p->data_type, p->data_size);        break;    }}
 |