1 | /*
|
---|
2 | * Copyright 2006-2020 The OpenSSL Project Authors. All Rights Reserved.
|
---|
3 | *
|
---|
4 | * Licensed under the Apache License 2.0 (the "License"). You may not use
|
---|
5 | * this file except in compliance with the License. You can obtain a copy
|
---|
6 | * in the file LICENSE in the source distribution or at
|
---|
7 | * https://www.openssl.org/source/license.html
|
---|
8 | */
|
---|
9 |
|
---|
10 | #include <stdio.h>
|
---|
11 | #include "internal/cryptlib.h"
|
---|
12 | #include <openssl/objects.h>
|
---|
13 | #include <openssl/bn.h>
|
---|
14 | #include <openssl/x509v3.h>
|
---|
15 | #include <openssl/ts.h>
|
---|
16 | #include "ts_local.h"
|
---|
17 |
|
---|
18 | struct status_map_st {
|
---|
19 | int bit;
|
---|
20 | const char *text;
|
---|
21 | };
|
---|
22 |
|
---|
23 | static int ts_status_map_print(BIO *bio, const struct status_map_st *a,
|
---|
24 | const ASN1_BIT_STRING *v);
|
---|
25 | static int ts_ACCURACY_print_bio(BIO *bio, const TS_ACCURACY *accuracy);
|
---|
26 |
|
---|
27 |
|
---|
28 | int TS_RESP_print_bio(BIO *bio, TS_RESP *a)
|
---|
29 | {
|
---|
30 | BIO_printf(bio, "Status info:\n");
|
---|
31 | TS_STATUS_INFO_print_bio(bio, a->status_info);
|
---|
32 |
|
---|
33 | BIO_printf(bio, "\nTST info:\n");
|
---|
34 | if (a->tst_info != NULL)
|
---|
35 | TS_TST_INFO_print_bio(bio, a->tst_info);
|
---|
36 | else
|
---|
37 | BIO_printf(bio, "Not included.\n");
|
---|
38 |
|
---|
39 | return 1;
|
---|
40 | }
|
---|
41 |
|
---|
42 | int TS_STATUS_INFO_print_bio(BIO *bio, TS_STATUS_INFO *a)
|
---|
43 | {
|
---|
44 | static const char *status_map[] = {
|
---|
45 | "Granted.",
|
---|
46 | "Granted with modifications.",
|
---|
47 | "Rejected.",
|
---|
48 | "Waiting.",
|
---|
49 | "Revocation warning.",
|
---|
50 | "Revoked."
|
---|
51 | };
|
---|
52 | static const struct status_map_st failure_map[] = {
|
---|
53 | {TS_INFO_BAD_ALG,
|
---|
54 | "unrecognized or unsupported algorithm identifier"},
|
---|
55 | {TS_INFO_BAD_REQUEST,
|
---|
56 | "transaction not permitted or supported"},
|
---|
57 | {TS_INFO_BAD_DATA_FORMAT,
|
---|
58 | "the data submitted has the wrong format"},
|
---|
59 | {TS_INFO_TIME_NOT_AVAILABLE,
|
---|
60 | "the TSA's time source is not available"},
|
---|
61 | {TS_INFO_UNACCEPTED_POLICY,
|
---|
62 | "the requested TSA policy is not supported by the TSA"},
|
---|
63 | {TS_INFO_UNACCEPTED_EXTENSION,
|
---|
64 | "the requested extension is not supported by the TSA"},
|
---|
65 | {TS_INFO_ADD_INFO_NOT_AVAILABLE,
|
---|
66 | "the additional information requested could not be understood "
|
---|
67 | "or is not available"},
|
---|
68 | {TS_INFO_SYSTEM_FAILURE,
|
---|
69 | "the request cannot be handled due to system failure"},
|
---|
70 | {-1, NULL}
|
---|
71 | };
|
---|
72 | long status;
|
---|
73 | int i, lines = 0;
|
---|
74 |
|
---|
75 | BIO_printf(bio, "Status: ");
|
---|
76 | status = ASN1_INTEGER_get(a->status);
|
---|
77 | if (0 <= status && status < (long)OSSL_NELEM(status_map))
|
---|
78 | BIO_printf(bio, "%s\n", status_map[status]);
|
---|
79 | else
|
---|
80 | BIO_printf(bio, "out of bounds\n");
|
---|
81 |
|
---|
82 | BIO_printf(bio, "Status description: ");
|
---|
83 | for (i = 0; i < sk_ASN1_UTF8STRING_num(a->text); ++i) {
|
---|
84 | if (i > 0)
|
---|
85 | BIO_puts(bio, "\t");
|
---|
86 | ASN1_STRING_print_ex(bio, sk_ASN1_UTF8STRING_value(a->text, i), 0);
|
---|
87 | BIO_puts(bio, "\n");
|
---|
88 | }
|
---|
89 | if (i == 0)
|
---|
90 | BIO_printf(bio, "unspecified\n");
|
---|
91 |
|
---|
92 | BIO_printf(bio, "Failure info: ");
|
---|
93 | if (a->failure_info != NULL)
|
---|
94 | lines = ts_status_map_print(bio, failure_map, a->failure_info);
|
---|
95 | if (lines == 0)
|
---|
96 | BIO_printf(bio, "unspecified");
|
---|
97 | BIO_printf(bio, "\n");
|
---|
98 |
|
---|
99 | return 1;
|
---|
100 | }
|
---|
101 |
|
---|
102 | static int ts_status_map_print(BIO *bio, const struct status_map_st *a,
|
---|
103 | const ASN1_BIT_STRING *v)
|
---|
104 | {
|
---|
105 | int lines = 0;
|
---|
106 |
|
---|
107 | for (; a->bit >= 0; ++a) {
|
---|
108 | if (ASN1_BIT_STRING_get_bit(v, a->bit)) {
|
---|
109 | if (++lines > 1)
|
---|
110 | BIO_printf(bio, ", ");
|
---|
111 | BIO_printf(bio, "%s", a->text);
|
---|
112 | }
|
---|
113 | }
|
---|
114 |
|
---|
115 | return lines;
|
---|
116 | }
|
---|
117 |
|
---|
118 | int TS_TST_INFO_print_bio(BIO *bio, TS_TST_INFO *a)
|
---|
119 | {
|
---|
120 | int v;
|
---|
121 |
|
---|
122 | if (a == NULL)
|
---|
123 | return 0;
|
---|
124 |
|
---|
125 | v = ASN1_INTEGER_get(a->version);
|
---|
126 | BIO_printf(bio, "Version: %d\n", v);
|
---|
127 |
|
---|
128 | BIO_printf(bio, "Policy OID: ");
|
---|
129 | TS_OBJ_print_bio(bio, a->policy_id);
|
---|
130 |
|
---|
131 | TS_MSG_IMPRINT_print_bio(bio, a->msg_imprint);
|
---|
132 |
|
---|
133 | BIO_printf(bio, "Serial number: ");
|
---|
134 | if (a->serial == NULL)
|
---|
135 | BIO_printf(bio, "unspecified");
|
---|
136 | else
|
---|
137 | TS_ASN1_INTEGER_print_bio(bio, a->serial);
|
---|
138 | BIO_write(bio, "\n", 1);
|
---|
139 |
|
---|
140 | BIO_printf(bio, "Time stamp: ");
|
---|
141 | ASN1_GENERALIZEDTIME_print(bio, a->time);
|
---|
142 | BIO_write(bio, "\n", 1);
|
---|
143 |
|
---|
144 | BIO_printf(bio, "Accuracy: ");
|
---|
145 | if (a->accuracy == NULL)
|
---|
146 | BIO_printf(bio, "unspecified");
|
---|
147 | else
|
---|
148 | ts_ACCURACY_print_bio(bio, a->accuracy);
|
---|
149 | BIO_write(bio, "\n", 1);
|
---|
150 |
|
---|
151 | BIO_printf(bio, "Ordering: %s\n", a->ordering ? "yes" : "no");
|
---|
152 |
|
---|
153 | BIO_printf(bio, "Nonce: ");
|
---|
154 | if (a->nonce == NULL)
|
---|
155 | BIO_printf(bio, "unspecified");
|
---|
156 | else
|
---|
157 | TS_ASN1_INTEGER_print_bio(bio, a->nonce);
|
---|
158 | BIO_write(bio, "\n", 1);
|
---|
159 |
|
---|
160 | BIO_printf(bio, "TSA: ");
|
---|
161 | if (a->tsa == NULL)
|
---|
162 | BIO_printf(bio, "unspecified");
|
---|
163 | else {
|
---|
164 | STACK_OF(CONF_VALUE) *nval;
|
---|
165 | if ((nval = i2v_GENERAL_NAME(NULL, a->tsa, NULL)))
|
---|
166 | X509V3_EXT_val_prn(bio, nval, 0, 0);
|
---|
167 | sk_CONF_VALUE_pop_free(nval, X509V3_conf_free);
|
---|
168 | }
|
---|
169 | BIO_write(bio, "\n", 1);
|
---|
170 |
|
---|
171 | TS_ext_print_bio(bio, a->extensions);
|
---|
172 |
|
---|
173 | return 1;
|
---|
174 | }
|
---|
175 |
|
---|
176 | static int ts_ACCURACY_print_bio(BIO *bio, const TS_ACCURACY *a)
|
---|
177 | {
|
---|
178 | if (a->seconds != NULL)
|
---|
179 | TS_ASN1_INTEGER_print_bio(bio, a->seconds);
|
---|
180 | else
|
---|
181 | BIO_printf(bio, "unspecified");
|
---|
182 | BIO_printf(bio, " seconds, ");
|
---|
183 | if (a->millis != NULL)
|
---|
184 | TS_ASN1_INTEGER_print_bio(bio, a->millis);
|
---|
185 | else
|
---|
186 | BIO_printf(bio, "unspecified");
|
---|
187 | BIO_printf(bio, " millis, ");
|
---|
188 | if (a->micros != NULL)
|
---|
189 | TS_ASN1_INTEGER_print_bio(bio, a->micros);
|
---|
190 | else
|
---|
191 | BIO_printf(bio, "unspecified");
|
---|
192 | BIO_printf(bio, " micros");
|
---|
193 |
|
---|
194 | return 1;
|
---|
195 | }
|
---|