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