[331] | 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_lcl.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 | }
|
---|