Home | History | Annotate | Line # | Download | only in ts
      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