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