1e1051a39Sopenharmony_ci/* 2e1051a39Sopenharmony_ci * Copyright 2006-2018 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci * 4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci */ 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci#include <stdio.h> 11e1051a39Sopenharmony_ci#include "internal/cryptlib.h" 12e1051a39Sopenharmony_ci#include <openssl/objects.h> 13e1051a39Sopenharmony_ci#include <openssl/bn.h> 14e1051a39Sopenharmony_ci#include <openssl/x509.h> 15e1051a39Sopenharmony_ci#include <openssl/x509v3.h> 16e1051a39Sopenharmony_ci#include <openssl/ts.h> 17e1051a39Sopenharmony_ci#include "ts_local.h" 18e1051a39Sopenharmony_ci 19e1051a39Sopenharmony_ciint TS_ASN1_INTEGER_print_bio(BIO *bio, const ASN1_INTEGER *num) 20e1051a39Sopenharmony_ci{ 21e1051a39Sopenharmony_ci BIGNUM *num_bn; 22e1051a39Sopenharmony_ci int result = 0; 23e1051a39Sopenharmony_ci char *hex; 24e1051a39Sopenharmony_ci 25e1051a39Sopenharmony_ci num_bn = ASN1_INTEGER_to_BN(num, NULL); 26e1051a39Sopenharmony_ci if (num_bn == NULL) 27e1051a39Sopenharmony_ci return -1; 28e1051a39Sopenharmony_ci if ((hex = BN_bn2hex(num_bn))) { 29e1051a39Sopenharmony_ci result = BIO_write(bio, "0x", 2) > 0; 30e1051a39Sopenharmony_ci result = result && BIO_write(bio, hex, strlen(hex)) > 0; 31e1051a39Sopenharmony_ci OPENSSL_free(hex); 32e1051a39Sopenharmony_ci } 33e1051a39Sopenharmony_ci BN_free(num_bn); 34e1051a39Sopenharmony_ci 35e1051a39Sopenharmony_ci return result; 36e1051a39Sopenharmony_ci} 37e1051a39Sopenharmony_ci 38e1051a39Sopenharmony_ciint TS_OBJ_print_bio(BIO *bio, const ASN1_OBJECT *obj) 39e1051a39Sopenharmony_ci{ 40e1051a39Sopenharmony_ci char obj_txt[128]; 41e1051a39Sopenharmony_ci 42e1051a39Sopenharmony_ci OBJ_obj2txt(obj_txt, sizeof(obj_txt), obj, 0); 43e1051a39Sopenharmony_ci BIO_printf(bio, "%s\n", obj_txt); 44e1051a39Sopenharmony_ci 45e1051a39Sopenharmony_ci return 1; 46e1051a39Sopenharmony_ci} 47e1051a39Sopenharmony_ci 48e1051a39Sopenharmony_ciint TS_ext_print_bio(BIO *bio, const STACK_OF(X509_EXTENSION) *extensions) 49e1051a39Sopenharmony_ci{ 50e1051a39Sopenharmony_ci int i, critical, n; 51e1051a39Sopenharmony_ci X509_EXTENSION *ex; 52e1051a39Sopenharmony_ci ASN1_OBJECT *obj; 53e1051a39Sopenharmony_ci 54e1051a39Sopenharmony_ci BIO_printf(bio, "Extensions:\n"); 55e1051a39Sopenharmony_ci n = X509v3_get_ext_count(extensions); 56e1051a39Sopenharmony_ci for (i = 0; i < n; i++) { 57e1051a39Sopenharmony_ci ex = X509v3_get_ext(extensions, i); 58e1051a39Sopenharmony_ci obj = X509_EXTENSION_get_object(ex); 59e1051a39Sopenharmony_ci if (i2a_ASN1_OBJECT(bio, obj) < 0) 60e1051a39Sopenharmony_ci return 0; 61e1051a39Sopenharmony_ci critical = X509_EXTENSION_get_critical(ex); 62e1051a39Sopenharmony_ci BIO_printf(bio, ":%s\n", critical ? " critical" : ""); 63e1051a39Sopenharmony_ci if (!X509V3_EXT_print(bio, ex, 0, 4)) { 64e1051a39Sopenharmony_ci BIO_printf(bio, "%4s", ""); 65e1051a39Sopenharmony_ci ASN1_STRING_print(bio, X509_EXTENSION_get_data(ex)); 66e1051a39Sopenharmony_ci } 67e1051a39Sopenharmony_ci BIO_write(bio, "\n", 1); 68e1051a39Sopenharmony_ci } 69e1051a39Sopenharmony_ci 70e1051a39Sopenharmony_ci return 1; 71e1051a39Sopenharmony_ci} 72e1051a39Sopenharmony_ci 73e1051a39Sopenharmony_ciint TS_X509_ALGOR_print_bio(BIO *bio, const X509_ALGOR *alg) 74e1051a39Sopenharmony_ci{ 75e1051a39Sopenharmony_ci int i = OBJ_obj2nid(alg->algorithm); 76e1051a39Sopenharmony_ci return BIO_printf(bio, "Hash Algorithm: %s\n", 77e1051a39Sopenharmony_ci (i == NID_undef) ? "UNKNOWN" : OBJ_nid2ln(i)); 78e1051a39Sopenharmony_ci} 79e1051a39Sopenharmony_ci 80e1051a39Sopenharmony_ciint TS_MSG_IMPRINT_print_bio(BIO *bio, TS_MSG_IMPRINT *a) 81e1051a39Sopenharmony_ci{ 82e1051a39Sopenharmony_ci ASN1_OCTET_STRING *msg; 83e1051a39Sopenharmony_ci 84e1051a39Sopenharmony_ci TS_X509_ALGOR_print_bio(bio, a->hash_algo); 85e1051a39Sopenharmony_ci 86e1051a39Sopenharmony_ci BIO_printf(bio, "Message data:\n"); 87e1051a39Sopenharmony_ci msg = a->hashed_msg; 88e1051a39Sopenharmony_ci BIO_dump_indent(bio, (const char *)ASN1_STRING_get0_data(msg), 89e1051a39Sopenharmony_ci ASN1_STRING_length(msg), 4); 90e1051a39Sopenharmony_ci 91e1051a39Sopenharmony_ci return 1; 92e1051a39Sopenharmony_ci} 93