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