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