1 /* 2 * Copyright 2006-2016 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the OpenSSL license (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 } 196