/src/openssl30/crypto/ts/ts_rsp_print.c
| Line | Count | Source (jump to first uncovered line) | 
| 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 | 338 | { | 
| 30 | 338 |     BIO_printf(bio, "Status info:\n"); | 
| 31 | 338 |     TS_STATUS_INFO_print_bio(bio, a->status_info); | 
| 32 |  |  | 
| 33 | 338 |     BIO_printf(bio, "\nTST info:\n"); | 
| 34 | 338 |     if (a->tst_info != NULL) | 
| 35 | 0 |         TS_TST_INFO_print_bio(bio, a->tst_info); | 
| 36 | 338 |     else | 
| 37 | 338 |         BIO_printf(bio, "Not included.\n"); | 
| 38 |  |  | 
| 39 | 338 |     return 1; | 
| 40 | 338 | } | 
| 41 |  |  | 
| 42 |  | int TS_STATUS_INFO_print_bio(BIO *bio, TS_STATUS_INFO *a) | 
| 43 | 2.00k | { | 
| 44 | 2.00k |     static const char *status_map[] = { | 
| 45 | 2.00k |         "Granted.", | 
| 46 | 2.00k |         "Granted with modifications.", | 
| 47 | 2.00k |         "Rejected.", | 
| 48 | 2.00k |         "Waiting.", | 
| 49 | 2.00k |         "Revocation warning.", | 
| 50 | 2.00k |         "Revoked." | 
| 51 | 2.00k |     }; | 
| 52 | 2.00k |     static const struct status_map_st failure_map[] = { | 
| 53 | 2.00k |         {TS_INFO_BAD_ALG, | 
| 54 | 2.00k |          "unrecognized or unsupported algorithm identifier"}, | 
| 55 | 2.00k |         {TS_INFO_BAD_REQUEST, | 
| 56 | 2.00k |          "transaction not permitted or supported"}, | 
| 57 | 2.00k |         {TS_INFO_BAD_DATA_FORMAT, | 
| 58 | 2.00k |          "the data submitted has the wrong format"}, | 
| 59 | 2.00k |         {TS_INFO_TIME_NOT_AVAILABLE, | 
| 60 | 2.00k |          "the TSA's time source is not available"}, | 
| 61 | 2.00k |         {TS_INFO_UNACCEPTED_POLICY, | 
| 62 | 2.00k |          "the requested TSA policy is not supported by the TSA"}, | 
| 63 | 2.00k |         {TS_INFO_UNACCEPTED_EXTENSION, | 
| 64 | 2.00k |          "the requested extension is not supported by the TSA"}, | 
| 65 | 2.00k |         {TS_INFO_ADD_INFO_NOT_AVAILABLE, | 
| 66 | 2.00k |          "the additional information requested could not be understood " | 
| 67 | 2.00k |          "or is not available"}, | 
| 68 | 2.00k |         {TS_INFO_SYSTEM_FAILURE, | 
| 69 | 2.00k |          "the request cannot be handled due to system failure"}, | 
| 70 | 2.00k |         {-1, NULL} | 
| 71 | 2.00k |     }; | 
| 72 | 2.00k |     long status; | 
| 73 | 2.00k |     int i, lines = 0; | 
| 74 |  |  | 
| 75 | 2.00k |     BIO_printf(bio, "Status: "); | 
| 76 | 2.00k |     status = ASN1_INTEGER_get(a->status); | 
| 77 | 2.00k |     if (0 <= status && status < (long)OSSL_NELEM(status_map)) | 
| 78 | 27 |         BIO_printf(bio, "%s\n", status_map[status]); | 
| 79 | 1.97k |     else | 
| 80 | 1.97k |         BIO_printf(bio, "out of bounds\n"); | 
| 81 |  |  | 
| 82 | 2.00k |     BIO_printf(bio, "Status description: "); | 
| 83 | 16.9k |     for (i = 0; i < sk_ASN1_UTF8STRING_num(a->text); ++i) { | 
| 84 | 14.9k |         if (i > 0) | 
| 85 | 14.2k |             BIO_puts(bio, "\t"); | 
| 86 | 14.9k |         ASN1_STRING_print_ex(bio, sk_ASN1_UTF8STRING_value(a->text, i), 0); | 
| 87 | 14.9k |         BIO_puts(bio, "\n"); | 
| 88 | 14.9k |     } | 
| 89 | 2.00k |     if (i == 0) | 
| 90 | 1.32k |         BIO_printf(bio, "unspecified\n"); | 
| 91 |  |  | 
| 92 | 2.00k |     BIO_printf(bio, "Failure info: "); | 
| 93 | 2.00k |     if (a->failure_info != NULL) | 
| 94 | 144 |         lines = ts_status_map_print(bio, failure_map, a->failure_info); | 
| 95 | 2.00k |     if (lines == 0) | 
| 96 | 1.86k |         BIO_printf(bio, "unspecified"); | 
| 97 | 2.00k |     BIO_printf(bio, "\n"); | 
| 98 |  |  | 
| 99 | 2.00k |     return 1; | 
| 100 | 2.00k | } | 
| 101 |  |  | 
| 102 |  | static int ts_status_map_print(BIO *bio, const struct status_map_st *a, | 
| 103 |  |                                const ASN1_BIT_STRING *v) | 
| 104 | 144 | { | 
| 105 | 144 |     int lines = 0; | 
| 106 |  |  | 
| 107 | 1.29k |     for (; a->bit >= 0; ++a) { | 
| 108 | 1.15k |         if (ASN1_BIT_STRING_get_bit(v, a->bit)) { | 
| 109 | 340 |             if (++lines > 1) | 
| 110 | 204 |                 BIO_printf(bio, ", "); | 
| 111 | 340 |             BIO_printf(bio, "%s", a->text); | 
| 112 | 340 |         } | 
| 113 | 1.15k |     } | 
| 114 |  |  | 
| 115 | 144 |     return lines; | 
| 116 | 144 | } | 
| 117 |  |  | 
| 118 |  | int TS_TST_INFO_print_bio(BIO *bio, TS_TST_INFO *a) | 
| 119 | 16 | { | 
| 120 | 16 |     int v; | 
| 121 |  |  | 
| 122 | 16 |     if (a == NULL) | 
| 123 | 0 |         return 0; | 
| 124 |  |  | 
| 125 | 16 |     v = ASN1_INTEGER_get(a->version); | 
| 126 | 16 |     BIO_printf(bio, "Version: %d\n", v); | 
| 127 |  |  | 
| 128 | 16 |     BIO_printf(bio, "Policy OID: "); | 
| 129 | 16 |     TS_OBJ_print_bio(bio, a->policy_id); | 
| 130 |  |  | 
| 131 | 16 |     TS_MSG_IMPRINT_print_bio(bio, a->msg_imprint); | 
| 132 |  |  | 
| 133 | 16 |     BIO_printf(bio, "Serial number: "); | 
| 134 | 16 |     if (a->serial == NULL) | 
| 135 | 0 |         BIO_printf(bio, "unspecified"); | 
| 136 | 16 |     else | 
| 137 | 16 |         TS_ASN1_INTEGER_print_bio(bio, a->serial); | 
| 138 | 16 |     BIO_write(bio, "\n", 1); | 
| 139 |  |  | 
| 140 | 16 |     BIO_printf(bio, "Time stamp: "); | 
| 141 | 16 |     ASN1_GENERALIZEDTIME_print(bio, a->time); | 
| 142 | 16 |     BIO_write(bio, "\n", 1); | 
| 143 |  |  | 
| 144 | 16 |     BIO_printf(bio, "Accuracy: "); | 
| 145 | 16 |     if (a->accuracy == NULL) | 
| 146 | 9 |         BIO_printf(bio, "unspecified"); | 
| 147 | 7 |     else | 
| 148 | 7 |         ts_ACCURACY_print_bio(bio, a->accuracy); | 
| 149 | 16 |     BIO_write(bio, "\n", 1); | 
| 150 |  |  | 
| 151 | 16 |     BIO_printf(bio, "Ordering: %s\n", a->ordering ? "yes" : "no"); | 
| 152 |  |  | 
| 153 | 16 |     BIO_printf(bio, "Nonce: "); | 
| 154 | 16 |     if (a->nonce == NULL) | 
| 155 | 6 |         BIO_printf(bio, "unspecified"); | 
| 156 | 10 |     else | 
| 157 | 10 |         TS_ASN1_INTEGER_print_bio(bio, a->nonce); | 
| 158 | 16 |     BIO_write(bio, "\n", 1); | 
| 159 |  |  | 
| 160 | 16 |     BIO_printf(bio, "TSA: "); | 
| 161 | 16 |     if (a->tsa == NULL) | 
| 162 | 8 |         BIO_printf(bio, "unspecified"); | 
| 163 | 8 |     else { | 
| 164 | 8 |         STACK_OF(CONF_VALUE) *nval; | 
| 165 | 8 |         if ((nval = i2v_GENERAL_NAME(NULL, a->tsa, NULL))) | 
| 166 | 7 |             X509V3_EXT_val_prn(bio, nval, 0, 0); | 
| 167 | 8 |         sk_CONF_VALUE_pop_free(nval, X509V3_conf_free); | 
| 168 | 8 |     } | 
| 169 | 16 |     BIO_write(bio, "\n", 1); | 
| 170 |  |  | 
| 171 | 16 |     TS_ext_print_bio(bio, a->extensions); | 
| 172 |  |  | 
| 173 | 16 |     return 1; | 
| 174 | 16 | } | 
| 175 |  |  | 
| 176 |  | static int ts_ACCURACY_print_bio(BIO *bio, const TS_ACCURACY *a) | 
| 177 | 7 | { | 
| 178 | 7 |     if (a->seconds != NULL) | 
| 179 | 2 |         TS_ASN1_INTEGER_print_bio(bio, a->seconds); | 
| 180 | 5 |     else | 
| 181 | 5 |         BIO_printf(bio, "unspecified"); | 
| 182 | 7 |     BIO_printf(bio, " seconds, "); | 
| 183 | 7 |     if (a->millis != NULL) | 
| 184 | 3 |         TS_ASN1_INTEGER_print_bio(bio, a->millis); | 
| 185 | 4 |     else | 
| 186 | 4 |         BIO_printf(bio, "unspecified"); | 
| 187 | 7 |     BIO_printf(bio, " millis, "); | 
| 188 | 7 |     if (a->micros != NULL) | 
| 189 | 2 |         TS_ASN1_INTEGER_print_bio(bio, a->micros); | 
| 190 | 5 |     else | 
| 191 | 5 |         BIO_printf(bio, "unspecified"); | 
| 192 | 7 |     BIO_printf(bio, " micros"); | 
| 193 |  |  | 
| 194 | 7 |     return 1; | 
| 195 | 7 | } |