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