1 /*
2  * Copyright 2019-2020 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the Apache License 2.0 (the "License").  You may not use
5  * this file except in compliance with the License.  You can obtain a copy
6  * in the file LICENSE in the source distribution or at
7  * https://www.openssl.org/source/license.html
8  */
9 
10 #include "apps.h"
11 #include "app_params.h"
12 
describe_param_type(char * buf,size_t bufsz,const OSSL_PARAM * param)13 static 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 
print_param_types(const char * thing,const OSSL_PARAM * pdefs,int indent)75 int 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 
print_param_value(const OSSL_PARAM * p,int indent)97 void 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