1e1051a39Sopenharmony_ci/* 2e1051a39Sopenharmony_ci * Copyright 1995-2021 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/buffer.h> 13e1051a39Sopenharmony_ci#include <openssl/bn.h> 14e1051a39Sopenharmony_ci#include <openssl/objects.h> 15e1051a39Sopenharmony_ci#include <openssl/x509.h> 16e1051a39Sopenharmony_ci#include <openssl/x509v3.h> 17e1051a39Sopenharmony_ci#include <openssl/rsa.h> 18e1051a39Sopenharmony_ci#include <openssl/dsa.h> 19e1051a39Sopenharmony_ci 20e1051a39Sopenharmony_ci#ifndef OPENSSL_NO_STDIO 21e1051a39Sopenharmony_ciint X509_REQ_print_fp(FILE *fp, X509_REQ *x) 22e1051a39Sopenharmony_ci{ 23e1051a39Sopenharmony_ci BIO *b; 24e1051a39Sopenharmony_ci int ret; 25e1051a39Sopenharmony_ci 26e1051a39Sopenharmony_ci if ((b = BIO_new(BIO_s_file())) == NULL) { 27e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_X509, ERR_R_BUF_LIB); 28e1051a39Sopenharmony_ci return 0; 29e1051a39Sopenharmony_ci } 30e1051a39Sopenharmony_ci BIO_set_fp(b, fp, BIO_NOCLOSE); 31e1051a39Sopenharmony_ci ret = X509_REQ_print(b, x); 32e1051a39Sopenharmony_ci BIO_free(b); 33e1051a39Sopenharmony_ci return ret; 34e1051a39Sopenharmony_ci} 35e1051a39Sopenharmony_ci#endif 36e1051a39Sopenharmony_ci 37e1051a39Sopenharmony_ciint X509_REQ_print_ex(BIO *bp, X509_REQ *x, unsigned long nmflags, 38e1051a39Sopenharmony_ci unsigned long cflag) 39e1051a39Sopenharmony_ci{ 40e1051a39Sopenharmony_ci long l; 41e1051a39Sopenharmony_ci int i; 42e1051a39Sopenharmony_ci EVP_PKEY *pkey; 43e1051a39Sopenharmony_ci STACK_OF(X509_EXTENSION) *exts; 44e1051a39Sopenharmony_ci char mlch = ' '; 45e1051a39Sopenharmony_ci int nmindent = 0; 46e1051a39Sopenharmony_ci 47e1051a39Sopenharmony_ci if ((nmflags & XN_FLAG_SEP_MASK) == XN_FLAG_SEP_MULTILINE) { 48e1051a39Sopenharmony_ci mlch = '\n'; 49e1051a39Sopenharmony_ci nmindent = 12; 50e1051a39Sopenharmony_ci } 51e1051a39Sopenharmony_ci 52e1051a39Sopenharmony_ci if (nmflags == X509_FLAG_COMPAT) 53e1051a39Sopenharmony_ci nmindent = 16; 54e1051a39Sopenharmony_ci 55e1051a39Sopenharmony_ci if (!(cflag & X509_FLAG_NO_HEADER)) { 56e1051a39Sopenharmony_ci if (BIO_write(bp, "Certificate Request:\n", 21) <= 0) 57e1051a39Sopenharmony_ci goto err; 58e1051a39Sopenharmony_ci if (BIO_write(bp, " Data:\n", 10) <= 0) 59e1051a39Sopenharmony_ci goto err; 60e1051a39Sopenharmony_ci } 61e1051a39Sopenharmony_ci if (!(cflag & X509_FLAG_NO_VERSION)) { 62e1051a39Sopenharmony_ci l = X509_REQ_get_version(x); 63e1051a39Sopenharmony_ci if (l == X509_REQ_VERSION_1) { 64e1051a39Sopenharmony_ci if (BIO_printf(bp, "%8sVersion: %ld (0x%lx)\n", "", l + 1, (unsigned long)l) <= 0) 65e1051a39Sopenharmony_ci goto err; 66e1051a39Sopenharmony_ci } else { 67e1051a39Sopenharmony_ci if (BIO_printf(bp, "%8sVersion: Unknown (%ld)\n", "", l) <= 0) 68e1051a39Sopenharmony_ci goto err; 69e1051a39Sopenharmony_ci } 70e1051a39Sopenharmony_ci } 71e1051a39Sopenharmony_ci if (!(cflag & X509_FLAG_NO_SUBJECT)) { 72e1051a39Sopenharmony_ci if (BIO_printf(bp, " Subject:%c", mlch) <= 0) 73e1051a39Sopenharmony_ci goto err; 74e1051a39Sopenharmony_ci if (X509_NAME_print_ex(bp, X509_REQ_get_subject_name(x), 75e1051a39Sopenharmony_ci nmindent, nmflags) < 0) 76e1051a39Sopenharmony_ci goto err; 77e1051a39Sopenharmony_ci if (BIO_write(bp, "\n", 1) <= 0) 78e1051a39Sopenharmony_ci goto err; 79e1051a39Sopenharmony_ci } 80e1051a39Sopenharmony_ci if (!(cflag & X509_FLAG_NO_PUBKEY)) { 81e1051a39Sopenharmony_ci X509_PUBKEY *xpkey; 82e1051a39Sopenharmony_ci ASN1_OBJECT *koid; 83e1051a39Sopenharmony_ci if (BIO_write(bp, " Subject Public Key Info:\n", 33) <= 0) 84e1051a39Sopenharmony_ci goto err; 85e1051a39Sopenharmony_ci if (BIO_printf(bp, "%12sPublic Key Algorithm: ", "") <= 0) 86e1051a39Sopenharmony_ci goto err; 87e1051a39Sopenharmony_ci xpkey = X509_REQ_get_X509_PUBKEY(x); 88e1051a39Sopenharmony_ci X509_PUBKEY_get0_param(&koid, NULL, NULL, NULL, xpkey); 89e1051a39Sopenharmony_ci if (i2a_ASN1_OBJECT(bp, koid) <= 0) 90e1051a39Sopenharmony_ci goto err; 91e1051a39Sopenharmony_ci if (BIO_puts(bp, "\n") <= 0) 92e1051a39Sopenharmony_ci goto err; 93e1051a39Sopenharmony_ci 94e1051a39Sopenharmony_ci pkey = X509_REQ_get0_pubkey(x); 95e1051a39Sopenharmony_ci if (pkey == NULL) { 96e1051a39Sopenharmony_ci if (BIO_printf(bp, "%12sUnable to load Public Key\n", "") <= 0) 97e1051a39Sopenharmony_ci goto err; 98e1051a39Sopenharmony_ci ERR_print_errors(bp); 99e1051a39Sopenharmony_ci } else { 100e1051a39Sopenharmony_ci if (EVP_PKEY_print_public(bp, pkey, 16, NULL) <= 0) 101e1051a39Sopenharmony_ci goto err; 102e1051a39Sopenharmony_ci } 103e1051a39Sopenharmony_ci } 104e1051a39Sopenharmony_ci 105e1051a39Sopenharmony_ci if (!(cflag & X509_FLAG_NO_ATTRIBUTES)) { 106e1051a39Sopenharmony_ci /* may not be */ 107e1051a39Sopenharmony_ci if (BIO_printf(bp, "%8sAttributes:\n", "") <= 0) 108e1051a39Sopenharmony_ci goto err; 109e1051a39Sopenharmony_ci 110e1051a39Sopenharmony_ci if (X509_REQ_get_attr_count(x) == 0) { 111e1051a39Sopenharmony_ci if (BIO_printf(bp, "%12s(none)\n", "") <= 0) 112e1051a39Sopenharmony_ci goto err; 113e1051a39Sopenharmony_ci } else { 114e1051a39Sopenharmony_ci for (i = 0; i < X509_REQ_get_attr_count(x); i++) { 115e1051a39Sopenharmony_ci ASN1_TYPE *at; 116e1051a39Sopenharmony_ci X509_ATTRIBUTE *a; 117e1051a39Sopenharmony_ci ASN1_BIT_STRING *bs = NULL; 118e1051a39Sopenharmony_ci ASN1_OBJECT *aobj; 119e1051a39Sopenharmony_ci int j, type = 0, count = 1, ii = 0; 120e1051a39Sopenharmony_ci 121e1051a39Sopenharmony_ci a = X509_REQ_get_attr(x, i); 122e1051a39Sopenharmony_ci aobj = X509_ATTRIBUTE_get0_object(a); 123e1051a39Sopenharmony_ci if (X509_REQ_extension_nid(OBJ_obj2nid(aobj))) 124e1051a39Sopenharmony_ci continue; 125e1051a39Sopenharmony_ci if (BIO_printf(bp, "%12s", "") <= 0) 126e1051a39Sopenharmony_ci goto err; 127e1051a39Sopenharmony_ci if ((j = i2a_ASN1_OBJECT(bp, aobj)) > 0) { 128e1051a39Sopenharmony_ci ii = 0; 129e1051a39Sopenharmony_ci count = X509_ATTRIBUTE_count(a); 130e1051a39Sopenharmony_ci if (count == 0) { 131e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_X509, X509_R_INVALID_ATTRIBUTES); 132e1051a39Sopenharmony_ci return 0; 133e1051a39Sopenharmony_ci } 134e1051a39Sopenharmony_ci get_next: 135e1051a39Sopenharmony_ci at = X509_ATTRIBUTE_get0_type(a, ii); 136e1051a39Sopenharmony_ci type = at->type; 137e1051a39Sopenharmony_ci bs = at->value.asn1_string; 138e1051a39Sopenharmony_ci } 139e1051a39Sopenharmony_ci for (j = 25 - j; j > 0; j--) 140e1051a39Sopenharmony_ci if (BIO_write(bp, " ", 1) != 1) 141e1051a39Sopenharmony_ci goto err; 142e1051a39Sopenharmony_ci if (BIO_puts(bp, ":") <= 0) 143e1051a39Sopenharmony_ci goto err; 144e1051a39Sopenharmony_ci switch (type) { 145e1051a39Sopenharmony_ci case V_ASN1_PRINTABLESTRING: 146e1051a39Sopenharmony_ci case V_ASN1_T61STRING: 147e1051a39Sopenharmony_ci case V_ASN1_NUMERICSTRING: 148e1051a39Sopenharmony_ci case V_ASN1_UTF8STRING: 149e1051a39Sopenharmony_ci case V_ASN1_IA5STRING: 150e1051a39Sopenharmony_ci if (BIO_write(bp, (char *)bs->data, bs->length) 151e1051a39Sopenharmony_ci != bs->length) 152e1051a39Sopenharmony_ci goto err; 153e1051a39Sopenharmony_ci if (BIO_puts(bp, "\n") <= 0) 154e1051a39Sopenharmony_ci goto err; 155e1051a39Sopenharmony_ci break; 156e1051a39Sopenharmony_ci default: 157e1051a39Sopenharmony_ci if (BIO_puts(bp, "unable to print attribute\n") <= 0) 158e1051a39Sopenharmony_ci goto err; 159e1051a39Sopenharmony_ci break; 160e1051a39Sopenharmony_ci } 161e1051a39Sopenharmony_ci if (++ii < count) 162e1051a39Sopenharmony_ci goto get_next; 163e1051a39Sopenharmony_ci } 164e1051a39Sopenharmony_ci } 165e1051a39Sopenharmony_ci } 166e1051a39Sopenharmony_ci if (!(cflag & X509_FLAG_NO_EXTENSIONS)) { 167e1051a39Sopenharmony_ci exts = X509_REQ_get_extensions(x); 168e1051a39Sopenharmony_ci if (exts) { 169e1051a39Sopenharmony_ci if (BIO_printf(bp, "%12sRequested Extensions:\n", "") <= 0) 170e1051a39Sopenharmony_ci goto err; 171e1051a39Sopenharmony_ci for (i = 0; i < sk_X509_EXTENSION_num(exts); i++) { 172e1051a39Sopenharmony_ci ASN1_OBJECT *obj; 173e1051a39Sopenharmony_ci X509_EXTENSION *ex; 174e1051a39Sopenharmony_ci int critical; 175e1051a39Sopenharmony_ci ex = sk_X509_EXTENSION_value(exts, i); 176e1051a39Sopenharmony_ci if (BIO_printf(bp, "%16s", "") <= 0) 177e1051a39Sopenharmony_ci goto err; 178e1051a39Sopenharmony_ci obj = X509_EXTENSION_get_object(ex); 179e1051a39Sopenharmony_ci if (i2a_ASN1_OBJECT(bp, obj) <= 0) 180e1051a39Sopenharmony_ci goto err; 181e1051a39Sopenharmony_ci critical = X509_EXTENSION_get_critical(ex); 182e1051a39Sopenharmony_ci if (BIO_printf(bp, ": %s\n", critical ? "critical" : "") <= 0) 183e1051a39Sopenharmony_ci goto err; 184e1051a39Sopenharmony_ci if (!X509V3_EXT_print(bp, ex, cflag, 20)) { 185e1051a39Sopenharmony_ci if (BIO_printf(bp, "%20s", "") <= 0 186e1051a39Sopenharmony_ci || ASN1_STRING_print(bp, 187e1051a39Sopenharmony_ci X509_EXTENSION_get_data(ex)) <= 0) 188e1051a39Sopenharmony_ci goto err; 189e1051a39Sopenharmony_ci } 190e1051a39Sopenharmony_ci if (BIO_write(bp, "\n", 1) <= 0) 191e1051a39Sopenharmony_ci goto err; 192e1051a39Sopenharmony_ci } 193e1051a39Sopenharmony_ci sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free); 194e1051a39Sopenharmony_ci } 195e1051a39Sopenharmony_ci } 196e1051a39Sopenharmony_ci 197e1051a39Sopenharmony_ci if (!(cflag & X509_FLAG_NO_SIGDUMP)) { 198e1051a39Sopenharmony_ci const X509_ALGOR *sig_alg; 199e1051a39Sopenharmony_ci const ASN1_BIT_STRING *sig; 200e1051a39Sopenharmony_ci X509_REQ_get0_signature(x, &sig, &sig_alg); 201e1051a39Sopenharmony_ci if (!X509_signature_print(bp, sig_alg, sig)) 202e1051a39Sopenharmony_ci goto err; 203e1051a39Sopenharmony_ci } 204e1051a39Sopenharmony_ci 205e1051a39Sopenharmony_ci return 1; 206e1051a39Sopenharmony_ci err: 207e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_X509, ERR_R_BUF_LIB); 208e1051a39Sopenharmony_ci return 0; 209e1051a39Sopenharmony_ci} 210e1051a39Sopenharmony_ci 211e1051a39Sopenharmony_ciint X509_REQ_print(BIO *bp, X509_REQ *x) 212e1051a39Sopenharmony_ci{ 213e1051a39Sopenharmony_ci return X509_REQ_print_ex(bp, x, XN_FLAG_COMPAT, X509_FLAG_COMPAT); 214e1051a39Sopenharmony_ci} 215