xref: /openbsd-src/lib/libcrypto/ts/ts_rsp_print.c (revision bb933e2f230376c8b238191c449a15fbc0f42703)
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