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