Packages
hackney
3.0.2
4.7.2
4.7.1
4.7.0
4.6.1
4.6.0
4.5.2
4.5.1
4.5.0
4.4.5
4.4.3
4.4.2
4.4.1
4.4.0
4.3.0
4.2.3
4.2.2
4.2.1
4.2.0
4.1.0
4.0.3
4.0.2
4.0.1
4.0.0
3.2.1
3.2.0
3.1.2
3.1.1
3.1.0
3.0.3
3.0.2
3.0.1
3.0.0
retired
2.0.1
2.0.0
2.0.0-beta.1
1.25.0
1.24.1
1.24.0
1.23.0
1.22.0
1.21.0
1.20.1
1.20.0
1.19.1
1.19.0
1.18.2
1.18.1
1.18.0
1.17.4
1.17.3
1.17.2
1.17.1
1.17.0
1.16.0
1.15.2
1.15.1
1.15.0
1.14.3
1.14.2
1.14.0
1.13.0
1.12.1
1.12.0
1.11.0
1.10.1
1.10.0
1.9.0
1.8.6
1.8.5
1.8.4
1.8.3
1.8.2
1.8.0
1.7.1
1.7.0
1.6.6
retired
1.6.5
1.6.4
retired
1.6.3
1.6.2
1.6.1
1.6.0
1.5.7
1.5.6
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.4.10
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.2
1.3.1
1.3.0
1.2.0
1.1.0
1.0.6
1.0.5
1.0.2
1.0.1
0.15.2
0.15.0
0.14.3
0.14.2
0.14.1
0.14.0
0.13.1
Simple HTTP client with HTTP/1.1, HTTP/2, and HTTP/3 support
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
c_src/boringssl/crypto/x509/v3_prn.cc
// Copyright 1999-2016 The OpenSSL Project Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// X509 v3 extension utilities
#include <stdio.h>
#include <openssl/bio.h>
#include <openssl/conf.h>
#include <openssl/mem.h>
#include <openssl/x509.h>
// Extension printing routines
static int unknown_ext_print(BIO *out, const X509_EXTENSION *ext,
unsigned long flag, int indent, int supported);
// Print out a name+value stack
static void X509V3_EXT_val_prn(BIO *out, const STACK_OF(CONF_VALUE) *val,
int indent, int ml) {
if (!val) {
return;
}
if (!ml || !sk_CONF_VALUE_num(val)) {
BIO_printf(out, "%*s", indent, "");
if (!sk_CONF_VALUE_num(val)) {
BIO_puts(out, "<EMPTY>\n");
}
}
for (size_t i = 0; i < sk_CONF_VALUE_num(val); i++) {
if (ml) {
BIO_printf(out, "%*s", indent, "");
} else if (i > 0) {
BIO_printf(out, ", ");
}
const CONF_VALUE *nval = sk_CONF_VALUE_value(val, i);
if (!nval->name) {
BIO_puts(out, nval->value);
} else if (!nval->value) {
BIO_puts(out, nval->name);
} else {
BIO_printf(out, "%s:%s", nval->name, nval->value);
}
if (ml) {
BIO_puts(out, "\n");
}
}
}
// Main routine: print out a general extension
int X509V3_EXT_print(BIO *out, const X509_EXTENSION *ext, unsigned long flag,
int indent) {
const X509V3_EXT_METHOD *method = X509V3_EXT_get(ext);
if (method == nullptr) {
return unknown_ext_print(out, ext, flag, indent, 0);
}
const ASN1_STRING *ext_data = X509_EXTENSION_get_data(ext);
const unsigned char *p = ASN1_STRING_get0_data(ext_data);
void *ext_str = ASN1_item_d2i(nullptr, &p, ASN1_STRING_length(ext_data),
ASN1_ITEM_ptr(method->it));
if (!ext_str) {
return unknown_ext_print(out, ext, flag, indent, 1);
}
char *value = nullptr;
STACK_OF(CONF_VALUE) *nval = nullptr;
int ok = 0;
if (method->i2s) {
if (!(value = method->i2s(method, ext_str))) {
goto err;
}
BIO_printf(out, "%*s%s", indent, "", value);
} else if (method->i2v) {
if (!(nval = method->i2v(method, ext_str, nullptr))) {
goto err;
}
X509V3_EXT_val_prn(out, nval, indent,
method->ext_flags & X509V3_EXT_MULTILINE);
} else if (method->i2r) {
if (!method->i2r(method, ext_str, out, indent)) {
goto err;
}
} else {
OPENSSL_PUT_ERROR(X509V3, X509V3_R_OPERATION_NOT_DEFINED);
goto err;
}
ok = 1;
err:
sk_CONF_VALUE_pop_free(nval, X509V3_conf_free);
OPENSSL_free(value);
ASN1_item_free(reinterpret_cast<ASN1_VALUE *>(ext_str),
ASN1_ITEM_ptr(method->it));
return ok;
}
int X509V3_extensions_print(BIO *bp, const char *title,
const STACK_OF(X509_EXTENSION) *exts,
unsigned long flag, int indent) {
size_t i;
int j;
if (sk_X509_EXTENSION_num(exts) <= 0) {
return 1;
}
if (title) {
BIO_printf(bp, "%*s%s:\n", indent, "", title);
indent += 4;
}
for (i = 0; i < sk_X509_EXTENSION_num(exts); i++) {
const X509_EXTENSION *ex = sk_X509_EXTENSION_value(exts, i);
if (indent && BIO_printf(bp, "%*s", indent, "") <= 0) {
return 0;
}
const ASN1_OBJECT *obj = X509_EXTENSION_get_object(ex);
i2a_ASN1_OBJECT(bp, obj);
j = X509_EXTENSION_get_critical(ex);
if (BIO_printf(bp, ": %s\n", j ? "critical" : "") <= 0) {
return 0;
}
if (!X509V3_EXT_print(bp, ex, flag, indent + 4)) {
BIO_printf(bp, "%*s", indent + 4, "");
ASN1_STRING_print(bp, X509_EXTENSION_get_data(ex));
}
if (BIO_write(bp, "\n", 1) <= 0) {
return 0;
}
}
return 1;
}
static int unknown_ext_print(BIO *out, const X509_EXTENSION *ext,
unsigned long flag, int indent, int supported) {
switch (flag & X509V3_EXT_UNKNOWN_MASK) {
case X509V3_EXT_DEFAULT:
return 0;
case X509V3_EXT_ERROR_UNKNOWN:
if (supported) {
BIO_printf(out, "%*s<Parse Error>", indent, "");
} else {
BIO_printf(out, "%*s<Not Supported>", indent, "");
}
return 1;
case X509V3_EXT_PARSE_UNKNOWN:
case X509V3_EXT_DUMP_UNKNOWN: {
const ASN1_STRING *data = X509_EXTENSION_get_data(ext);
return BIO_hexdump(out, ASN1_STRING_get0_data(data),
ASN1_STRING_length(data), indent);
}
default:
return 1;
}
}
int X509V3_EXT_print_fp(FILE *fp, const X509_EXTENSION *ext, int flag,
int indent) {
BIO *bio_tmp;
int ret;
if (!(bio_tmp = BIO_new_fp(fp, BIO_NOCLOSE))) {
return 0;
}
ret = X509V3_EXT_print(bio_tmp, ext, flag, indent);
BIO_free(bio_tmp);
return ret;
}