1 /* $OpenBSD: ts_rsp_print.c,v 1.6 2022/07/24 08:16:47 tb Exp $ */
2 /* Written by Zoltan Glozik (zglozik@stones.com) for the OpenSSL
3 * project 2002.
4 */
5 /* ====================================================================
6 * Copyright (c) 2006 The OpenSSL Project. All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 *
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 *
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in
17 * the documentation and/or other materials provided with the
18 * distribution.
19 *
20 * 3. All advertising materials mentioning features or use of this
21 * software must display the following acknowledgment:
22 * "This product includes software developed by the OpenSSL Project
23 * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24 *
25 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26 * endorse or promote products derived from this software without
27 * prior written permission. For written permission, please contact
28 * licensing@OpenSSL.org.
29 *
30 * 5. Products derived from this software may not be called "OpenSSL"
31 * nor may "OpenSSL" appear in their names without prior written
32 * permission of the OpenSSL Project.
33 *
34 * 6. Redistributions of any form whatsoever must retain the following
35 * acknowledgment:
36 * "This product includes software developed by the OpenSSL Project
37 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38 *
39 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
43 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50 * OF THE POSSIBILITY OF SUCH DAMAGE.
51 * ====================================================================
52 *
53 * This product includes cryptographic software written by Eric Young
54 * (eay@cryptsoft.com). This product includes software written by Tim
55 * Hudson (tjh@cryptsoft.com).
56 *
57 */
58
59 #include <stdio.h>
60
61 #include <openssl/bn.h>
62 #include <openssl/objects.h>
63 #include <openssl/ts.h>
64 #include <openssl/x509v3.h>
65
66 #include "ts_local.h"
67
68 struct status_map_st {
69 int bit;
70 const char *text;
71 };
72
73 /* Local function declarations. */
74
75 static int TS_status_map_print(BIO *bio, struct status_map_st *a,
76 ASN1_BIT_STRING *v);
77 static int TS_ACCURACY_print_bio(BIO *bio, const TS_ACCURACY *accuracy);
78
79 /* Function definitions. */
80
81 int
TS_RESP_print_bio(BIO * bio,TS_RESP * a)82 TS_RESP_print_bio(BIO *bio, TS_RESP *a)
83 {
84 TS_TST_INFO *tst_info;
85
86 BIO_printf(bio, "Status info:\n");
87 TS_STATUS_INFO_print_bio(bio, TS_RESP_get_status_info(a));
88
89 BIO_printf(bio, "\nTST info:\n");
90 tst_info = TS_RESP_get_tst_info(a);
91 if (tst_info != NULL)
92 TS_TST_INFO_print_bio(bio, TS_RESP_get_tst_info(a));
93 else
94 BIO_printf(bio, "Not included.\n");
95
96 return 1;
97 }
98
99 int
TS_STATUS_INFO_print_bio(BIO * bio,TS_STATUS_INFO * a)100 TS_STATUS_INFO_print_bio(BIO *bio, TS_STATUS_INFO *a)
101 {
102 static const char *status_map[] = {
103 "Granted.",
104 "Granted with modifications.",
105 "Rejected.",
106 "Waiting.",
107 "Revocation warning.",
108 "Revoked."
109 };
110 static struct status_map_st failure_map[] = {
111 {
112 TS_INFO_BAD_ALG,
113 "unrecognized or unsupported algorithm identifier"
114 },
115 {
116 TS_INFO_BAD_REQUEST,
117 "transaction not permitted or supported"
118 },
119 {
120 TS_INFO_BAD_DATA_FORMAT,
121 "the data submitted has the wrong format"
122 },
123 {
124 TS_INFO_TIME_NOT_AVAILABLE,
125 "the TSA's time source is not available"
126 },
127 {
128 TS_INFO_UNACCEPTED_POLICY,
129 "the requested TSA policy is not supported by the TSA"
130 },
131 {
132 TS_INFO_UNACCEPTED_EXTENSION,
133 "the requested extension is not supported by the TSA"
134 },
135 {
136 TS_INFO_ADD_INFO_NOT_AVAILABLE,
137 "the additional information requested could not be understood "
138 "or is not available"
139 },
140 {
141 TS_INFO_SYSTEM_FAILURE,
142 "the request cannot be handled due to system failure"
143 },
144 { -1, NULL }
145 };
146 long status;
147 int i, lines = 0;
148
149 /* Printing status code. */
150 BIO_printf(bio, "Status: ");
151 status = ASN1_INTEGER_get(a->status);
152 if (0 <= status &&
153 status < (long)(sizeof(status_map) / sizeof(status_map[0])))
154 BIO_printf(bio, "%s\n", status_map[status]);
155 else
156 BIO_printf(bio, "out of bounds\n");
157
158 /* Printing status description. */
159 BIO_printf(bio, "Status description: ");
160 for (i = 0; i < sk_ASN1_UTF8STRING_num(a->text); ++i) {
161 if (i > 0)
162 BIO_puts(bio, "\t");
163 ASN1_STRING_print_ex(bio, sk_ASN1_UTF8STRING_value(a->text, i),
164 0);
165 BIO_puts(bio, "\n");
166 }
167 if (i == 0)
168 BIO_printf(bio, "unspecified\n");
169
170 /* Printing failure information. */
171 BIO_printf(bio, "Failure info: ");
172 if (a->failure_info != NULL)
173 lines = TS_status_map_print(bio, failure_map, a->failure_info);
174 if (lines == 0)
175 BIO_printf(bio, "unspecified");
176 BIO_printf(bio, "\n");
177
178 return 1;
179 }
180
181 static int
TS_status_map_print(BIO * bio,struct status_map_st * a,ASN1_BIT_STRING * v)182 TS_status_map_print(BIO *bio, struct status_map_st *a, ASN1_BIT_STRING *v)
183 {
184 int lines = 0;
185
186 for (; a->bit >= 0; ++a) {
187 if (ASN1_BIT_STRING_get_bit(v, a->bit)) {
188 if (++lines > 1)
189 BIO_printf(bio, ", ");
190 BIO_printf(bio, "%s", a->text);
191 }
192 }
193
194 return lines;
195 }
196
197 int
TS_TST_INFO_print_bio(BIO * bio,TS_TST_INFO * a)198 TS_TST_INFO_print_bio(BIO *bio, TS_TST_INFO *a)
199 {
200 int v;
201 ASN1_OBJECT *policy_id;
202 const ASN1_INTEGER *serial;
203 const ASN1_GENERALIZEDTIME *gtime;
204 TS_ACCURACY *accuracy;
205 const ASN1_INTEGER *nonce;
206 GENERAL_NAME *tsa_name;
207
208 if (a == NULL)
209 return 0;
210
211 /* Print version. */
212 v = TS_TST_INFO_get_version(a);
213 BIO_printf(bio, "Version: %d\n", v);
214
215 /* Print policy id. */
216 BIO_printf(bio, "Policy OID: ");
217 policy_id = TS_TST_INFO_get_policy_id(a);
218 TS_OBJ_print_bio(bio, policy_id);
219
220 /* Print message imprint. */
221 TS_MSG_IMPRINT_print_bio(bio, TS_TST_INFO_get_msg_imprint(a));
222
223 /* Print serial number. */
224 BIO_printf(bio, "Serial number: ");
225 serial = TS_TST_INFO_get_serial(a);
226 if (serial == NULL)
227 BIO_printf(bio, "unspecified");
228 else
229 TS_ASN1_INTEGER_print_bio(bio, serial);
230 BIO_write(bio, "\n", 1);
231
232 /* Print time stamp. */
233 BIO_printf(bio, "Time stamp: ");
234 gtime = TS_TST_INFO_get_time(a);
235 ASN1_GENERALIZEDTIME_print(bio, gtime);
236 BIO_write(bio, "\n", 1);
237
238 /* Print accuracy. */
239 BIO_printf(bio, "Accuracy: ");
240 accuracy = TS_TST_INFO_get_accuracy(a);
241 if (accuracy == NULL)
242 BIO_printf(bio, "unspecified");
243 else
244 TS_ACCURACY_print_bio(bio, accuracy);
245 BIO_write(bio, "\n", 1);
246
247 /* Print ordering. */
248 BIO_printf(bio, "Ordering: %s\n",
249 TS_TST_INFO_get_ordering(a) ? "yes" : "no");
250
251 /* Print nonce. */
252 BIO_printf(bio, "Nonce: ");
253 nonce = TS_TST_INFO_get_nonce(a);
254 if (nonce == NULL)
255 BIO_printf(bio, "unspecified");
256 else
257 TS_ASN1_INTEGER_print_bio(bio, nonce);
258 BIO_write(bio, "\n", 1);
259
260 /* Print TSA name. */
261 BIO_printf(bio, "TSA: ");
262 tsa_name = TS_TST_INFO_get_tsa(a);
263 if (tsa_name == NULL)
264 BIO_printf(bio, "unspecified");
265 else {
266 STACK_OF(CONF_VALUE) *nval;
267 if ((nval = i2v_GENERAL_NAME(NULL, tsa_name, NULL)))
268 X509V3_EXT_val_prn(bio, nval, 0, 0);
269 sk_CONF_VALUE_pop_free(nval, X509V3_conf_free);
270 }
271 BIO_write(bio, "\n", 1);
272
273 /* Print extensions. */
274 TS_ext_print_bio(bio, TS_TST_INFO_get_exts(a));
275
276 return 1;
277 }
278
279 static int
TS_ACCURACY_print_bio(BIO * bio,const TS_ACCURACY * accuracy)280 TS_ACCURACY_print_bio(BIO *bio, const TS_ACCURACY *accuracy)
281 {
282 const ASN1_INTEGER *seconds = TS_ACCURACY_get_seconds(accuracy);
283 const ASN1_INTEGER *millis = TS_ACCURACY_get_millis(accuracy);
284 const ASN1_INTEGER *micros = TS_ACCURACY_get_micros(accuracy);
285
286 if (seconds != NULL)
287 TS_ASN1_INTEGER_print_bio(bio, seconds);
288 else
289 BIO_printf(bio, "unspecified");
290 BIO_printf(bio, " seconds, ");
291 if (millis != NULL)
292 TS_ASN1_INTEGER_print_bio(bio, millis);
293 else
294 BIO_printf(bio, "unspecified");
295 BIO_printf(bio, " millis, ");
296 if (micros != NULL)
297 TS_ASN1_INTEGER_print_bio(bio, micros);
298 else
299 BIO_printf(bio, "unspecified");
300 BIO_printf(bio, " micros");
301
302 return 1;
303 }
304