OpenSSL 1.1.1-pre2
This commit is contained in:
@@ -5,4 +5,4 @@ SOURCE[../../libcrypto]=\
|
||||
v3_int.c v3_enum.c v3_sxnet.c v3_cpols.c v3_crld.c v3_purp.c v3_info.c \
|
||||
v3_akeya.c v3_pmaps.c v3_pcons.c v3_ncons.c v3_pcia.c v3_pci.c \
|
||||
pcy_cache.c pcy_node.c pcy_data.c pcy_map.c pcy_tree.c pcy_lib.c \
|
||||
v3_asid.c v3_addr.c v3_tlsf.c
|
||||
v3_asid.c v3_addr.c v3_tlsf.c v3_admis.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 1999-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
* Copyright 1999-2017 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
@@ -22,3 +22,4 @@ extern const X509V3_EXT_METHOD v3_name_constraints, v3_inhibit_anyp, v3_idp;
|
||||
extern const X509V3_EXT_METHOD v3_addr, v3_asid;
|
||||
extern const X509V3_EXT_METHOD v3_ct_scts[3];
|
||||
extern const X509V3_EXT_METHOD v3_tls_feature;
|
||||
extern const X509V3_EXT_METHOD v3_ext_admission;
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
void policy_data_free(X509_POLICY_DATA *data)
|
||||
{
|
||||
if (!data)
|
||||
if (data == NULL)
|
||||
return;
|
||||
ASN1_OBJECT_free(data->valid_policy);
|
||||
/* Don't free qualifiers if shared */
|
||||
@@ -40,11 +40,11 @@ X509_POLICY_DATA *policy_data_new(POLICYINFO *policy,
|
||||
{
|
||||
X509_POLICY_DATA *ret;
|
||||
ASN1_OBJECT *id;
|
||||
if (!policy && !cid)
|
||||
if (policy == NULL && cid == NULL)
|
||||
return NULL;
|
||||
if (cid) {
|
||||
id = OBJ_dup(cid);
|
||||
if (!id)
|
||||
if (id == NULL)
|
||||
return NULL;
|
||||
} else
|
||||
id = NULL;
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
/*
|
||||
* Copyright 1999-2017 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
/*
|
||||
* This table will be searched using OBJ_bsearch so it *must* kept in order
|
||||
* of the ext_nid values.
|
||||
*/
|
||||
|
||||
static const X509V3_EXT_METHOD *standard_exts[] = {
|
||||
&v3_nscert,
|
||||
&v3_ns_ia5_list[0],
|
||||
&v3_ns_ia5_list[1],
|
||||
&v3_ns_ia5_list[2],
|
||||
&v3_ns_ia5_list[3],
|
||||
&v3_ns_ia5_list[4],
|
||||
&v3_ns_ia5_list[5],
|
||||
&v3_ns_ia5_list[6],
|
||||
&v3_skey_id,
|
||||
&v3_key_usage,
|
||||
&v3_pkey_usage_period,
|
||||
&v3_alt[0],
|
||||
&v3_alt[1],
|
||||
&v3_bcons,
|
||||
&v3_crl_num,
|
||||
&v3_cpols,
|
||||
&v3_akey_id,
|
||||
&v3_crld,
|
||||
&v3_ext_ku,
|
||||
&v3_delta_crl,
|
||||
&v3_crl_reason,
|
||||
#ifndef OPENSSL_NO_OCSP
|
||||
&v3_crl_invdate,
|
||||
#endif
|
||||
&v3_sxnet,
|
||||
&v3_info,
|
||||
#ifndef OPENSSL_NO_RFC3779
|
||||
&v3_addr,
|
||||
&v3_asid,
|
||||
#endif
|
||||
#ifndef OPENSSL_NO_OCSP
|
||||
&v3_ocsp_nonce,
|
||||
&v3_ocsp_crlid,
|
||||
&v3_ocsp_accresp,
|
||||
&v3_ocsp_nocheck,
|
||||
&v3_ocsp_acutoff,
|
||||
&v3_ocsp_serviceloc,
|
||||
#endif
|
||||
&v3_sinfo,
|
||||
&v3_policy_constraints,
|
||||
#ifndef OPENSSL_NO_OCSP
|
||||
&v3_crl_hold,
|
||||
#endif
|
||||
&v3_pci,
|
||||
&v3_name_constraints,
|
||||
&v3_policy_mappings,
|
||||
&v3_inhibit_anyp,
|
||||
&v3_idp,
|
||||
&v3_alt[2],
|
||||
&v3_freshest_crl,
|
||||
#ifndef OPENSSL_NO_CT
|
||||
&v3_ct_scts[0],
|
||||
&v3_ct_scts[1],
|
||||
&v3_ct_scts[2],
|
||||
#endif
|
||||
&v3_tls_feature,
|
||||
&v3_ext_admission
|
||||
};
|
||||
|
||||
/* Number of standard extensions */
|
||||
|
||||
#define STANDARD_EXTENSION_COUNT OSSL_NELEM(standard_exts)
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
/*
|
||||
* Copyright 1999-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
/*
|
||||
* Simple program to check the ext_dat.h is correct and print out problems if
|
||||
* it is not.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <openssl/x509v3.h>
|
||||
|
||||
#include "ext_dat.h"
|
||||
|
||||
main()
|
||||
{
|
||||
int i, prev = -1, bad = 0;
|
||||
X509V3_EXT_METHOD **tmp;
|
||||
i = OSSL_NELEM(standard_exts);
|
||||
if (i != STANDARD_EXTENSION_COUNT)
|
||||
fprintf(stderr, "Extension number invalid expecting %d\n", i);
|
||||
tmp = standard_exts;
|
||||
for (i = 0; i < STANDARD_EXTENSION_COUNT; i++, tmp++) {
|
||||
if ((*tmp)->ext_nid < prev)
|
||||
bad = 1;
|
||||
prev = (*tmp)->ext_nid;
|
||||
|
||||
}
|
||||
if (bad) {
|
||||
tmp = standard_exts;
|
||||
fprintf(stderr, "Extensions out of order!\n");
|
||||
for (i = 0; i < STANDARD_EXTENSION_COUNT; i++, tmp++)
|
||||
printf("%d : %s\n", (*tmp)->ext_nid, OBJ_nid2sn((*tmp)->ext_nid));
|
||||
} else
|
||||
fprintf(stderr, "Order OK\n");
|
||||
}
|
||||
+19
-11
@@ -342,7 +342,8 @@ static int range_should_be_prefix(const unsigned char *min,
|
||||
unsigned char mask;
|
||||
int i, j;
|
||||
|
||||
OPENSSL_assert(memcmp(min, max, length) <= 0);
|
||||
if (memcmp(min, max, length) <= 0)
|
||||
return -1;
|
||||
for (i = 0; i < length && min[i] == max[i]; i++) ;
|
||||
for (j = length - 1; j >= 0 && min[j] == 0x00 && max[j] == 0xFF; j--) ;
|
||||
if (i < j)
|
||||
@@ -431,7 +432,6 @@ static int make_addressRange(IPAddressOrRange **result,
|
||||
if ((aor = IPAddressOrRange_new()) == NULL)
|
||||
return 0;
|
||||
aor->type = IPAddressOrRange_addressRange;
|
||||
OPENSSL_assert(aor->u.addressRange == NULL);
|
||||
if ((aor->u.addressRange = IPAddressRange_new()) == NULL)
|
||||
goto err;
|
||||
if (aor->u.addressRange->min == NULL &&
|
||||
@@ -498,7 +498,6 @@ static IPAddressFamily *make_IPAddressFamily(IPAddrBlocks *addr,
|
||||
|
||||
for (i = 0; i < sk_IPAddressFamily_num(addr); i++) {
|
||||
f = sk_IPAddressFamily_value(addr, i);
|
||||
OPENSSL_assert(f->addressFamily->data != NULL);
|
||||
if (f->addressFamily->length == keylen &&
|
||||
!memcmp(f->addressFamily->data, key, keylen))
|
||||
return f;
|
||||
@@ -877,7 +876,8 @@ int X509v3_addr_canonize(IPAddrBlocks *addr)
|
||||
}
|
||||
(void)sk_IPAddressFamily_set_cmp_func(addr, IPAddressFamily_cmp);
|
||||
sk_IPAddressFamily_sort(addr);
|
||||
OPENSSL_assert(X509v3_addr_is_canonical(addr));
|
||||
if (!ossl_assert(X509v3_addr_is_canonical(addr)))
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -1182,9 +1182,13 @@ static int addr_validate_path_internal(X509_STORE_CTX *ctx,
|
||||
int i, j, ret = 1;
|
||||
X509 *x;
|
||||
|
||||
OPENSSL_assert(chain != NULL && sk_X509_num(chain) > 0);
|
||||
OPENSSL_assert(ctx != NULL || ext != NULL);
|
||||
OPENSSL_assert(ctx == NULL || ctx->verify_cb != NULL);
|
||||
if (!ossl_assert(chain != NULL && sk_X509_num(chain) > 0)
|
||||
|| !ossl_assert(ctx != NULL || ext != NULL)
|
||||
|| !ossl_assert(ctx == NULL || ctx->verify_cb != NULL)) {
|
||||
if (ctx != NULL)
|
||||
ctx->error = X509_V_ERR_UNSPECIFIED;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Figure out where to start. If we don't have an extension to
|
||||
@@ -1197,7 +1201,6 @@ static int addr_validate_path_internal(X509_STORE_CTX *ctx,
|
||||
} else {
|
||||
i = 0;
|
||||
x = sk_X509_value(chain, i);
|
||||
OPENSSL_assert(x != NULL);
|
||||
if ((ext = x->rfc3779_addr) == NULL)
|
||||
goto done;
|
||||
}
|
||||
@@ -1207,7 +1210,8 @@ static int addr_validate_path_internal(X509_STORE_CTX *ctx,
|
||||
if ((child = sk_IPAddressFamily_dup(ext)) == NULL) {
|
||||
X509V3err(X509V3_F_ADDR_VALIDATE_PATH_INTERNAL,
|
||||
ERR_R_MALLOC_FAILURE);
|
||||
ctx->error = X509_V_ERR_OUT_OF_MEM;
|
||||
if (ctx != NULL)
|
||||
ctx->error = X509_V_ERR_OUT_OF_MEM;
|
||||
ret = 0;
|
||||
goto done;
|
||||
}
|
||||
@@ -1218,7 +1222,6 @@ static int addr_validate_path_internal(X509_STORE_CTX *ctx,
|
||||
*/
|
||||
for (i++; i < sk_X509_num(chain); i++) {
|
||||
x = sk_X509_value(chain, i);
|
||||
OPENSSL_assert(x != NULL);
|
||||
if (!X509v3_addr_is_canonical(x->rfc3779_addr))
|
||||
validation_err(X509_V_ERR_INVALID_EXTENSION);
|
||||
if (x->rfc3779_addr == NULL) {
|
||||
@@ -1262,7 +1265,6 @@ static int addr_validate_path_internal(X509_STORE_CTX *ctx,
|
||||
/*
|
||||
* Trust anchor can't inherit.
|
||||
*/
|
||||
OPENSSL_assert(x != NULL);
|
||||
if (x->rfc3779_addr != NULL) {
|
||||
for (j = 0; j < sk_IPAddressFamily_num(x->rfc3779_addr); j++) {
|
||||
IPAddressFamily *fp =
|
||||
@@ -1285,6 +1287,12 @@ static int addr_validate_path_internal(X509_STORE_CTX *ctx,
|
||||
*/
|
||||
int X509v3_addr_validate_path(X509_STORE_CTX *ctx)
|
||||
{
|
||||
if (ctx->chain == NULL
|
||||
|| sk_X509_num(ctx->chain) == 0
|
||||
|| ctx->verify_cb == NULL) {
|
||||
ctx->error = X509_V_ERR_UNSPECIFIED;
|
||||
return 0;
|
||||
}
|
||||
return addr_validate_path_internal(ctx, ctx->chain, NULL);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,356 @@
|
||||
/*
|
||||
* Copyright 2017-2018 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include "internal/cryptlib.h"
|
||||
#include <openssl/conf.h>
|
||||
#include <openssl/ossl_typ.h>
|
||||
#include <openssl/asn1.h>
|
||||
#include <openssl/asn1t.h>
|
||||
|
||||
#include <openssl/x509v3.h>
|
||||
|
||||
#include <openssl/safestack.h>
|
||||
|
||||
#include "v3_admis.h"
|
||||
#include "ext_dat.h"
|
||||
|
||||
|
||||
ASN1_SEQUENCE(NAMING_AUTHORITY) = {
|
||||
ASN1_OPT(NAMING_AUTHORITY, namingAuthorityId, ASN1_OBJECT),
|
||||
ASN1_OPT(NAMING_AUTHORITY, namingAuthorityUrl, ASN1_IA5STRING),
|
||||
ASN1_OPT(NAMING_AUTHORITY, namingAuthorityText, DIRECTORYSTRING),
|
||||
} ASN1_SEQUENCE_END(NAMING_AUTHORITY)
|
||||
|
||||
ASN1_SEQUENCE(PROFESSION_INFO) = {
|
||||
ASN1_EXP_OPT(PROFESSION_INFO, namingAuthority, NAMING_AUTHORITY, 0),
|
||||
ASN1_SEQUENCE_OF(PROFESSION_INFO, professionItems, DIRECTORYSTRING),
|
||||
ASN1_SEQUENCE_OF_OPT(PROFESSION_INFO, professionOIDs, ASN1_OBJECT),
|
||||
ASN1_OPT(PROFESSION_INFO, registrationNumber, ASN1_PRINTABLESTRING),
|
||||
ASN1_OPT(PROFESSION_INFO, addProfessionInfo, ASN1_OCTET_STRING),
|
||||
} ASN1_SEQUENCE_END(PROFESSION_INFO)
|
||||
|
||||
ASN1_SEQUENCE(ADMISSIONS) = {
|
||||
ASN1_EXP_OPT(ADMISSIONS, admissionAuthority, GENERAL_NAME, 0),
|
||||
ASN1_EXP_OPT(ADMISSIONS, namingAuthority, NAMING_AUTHORITY, 1),
|
||||
ASN1_SEQUENCE_OF(ADMISSIONS, professionInfos, PROFESSION_INFO),
|
||||
} ASN1_SEQUENCE_END(ADMISSIONS)
|
||||
|
||||
ASN1_SEQUENCE(ADMISSION_SYNTAX) = {
|
||||
ASN1_OPT(ADMISSION_SYNTAX, admissionAuthority, GENERAL_NAME),
|
||||
ASN1_SEQUENCE_OF(ADMISSION_SYNTAX, contentsOfAdmissions, ADMISSIONS),
|
||||
} ASN1_SEQUENCE_END(ADMISSION_SYNTAX)
|
||||
|
||||
IMPLEMENT_ASN1_FUNCTIONS(NAMING_AUTHORITY)
|
||||
IMPLEMENT_ASN1_FUNCTIONS(PROFESSION_INFO)
|
||||
IMPLEMENT_ASN1_FUNCTIONS(ADMISSIONS)
|
||||
IMPLEMENT_ASN1_FUNCTIONS(ADMISSION_SYNTAX)
|
||||
|
||||
static int i2r_ADMISSION_SYNTAX(const struct v3_ext_method *method, void *in,
|
||||
BIO *bp, int ind);
|
||||
|
||||
const X509V3_EXT_METHOD v3_ext_admission = {
|
||||
NID_x509ExtAdmission, /* .ext_nid = */
|
||||
0, /* .ext_flags = */
|
||||
ASN1_ITEM_ref(ADMISSION_SYNTAX), /* .it = */
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, /* .i2s = */
|
||||
NULL, /* .s2i = */
|
||||
NULL, /* .i2v = */
|
||||
NULL, /* .v2i = */
|
||||
&i2r_ADMISSION_SYNTAX, /* .i2r = */
|
||||
NULL, /* .r2i = */
|
||||
NULL /* extension-specific data */
|
||||
};
|
||||
|
||||
|
||||
static int i2r_NAMING_AUTHORITY(const struct v3_ext_method *method, void *in,
|
||||
BIO *bp, int ind)
|
||||
{
|
||||
NAMING_AUTHORITY * namingAuthority = (NAMING_AUTHORITY*) in;
|
||||
|
||||
if (namingAuthority == NULL)
|
||||
return 0;
|
||||
|
||||
if (namingAuthority->namingAuthorityId == NULL
|
||||
&& namingAuthority->namingAuthorityText == NULL
|
||||
&& namingAuthority->namingAuthorityUrl == NULL)
|
||||
return 0;
|
||||
|
||||
if (BIO_printf(bp, "%*snamingAuthority: ", ind, "") <= 0)
|
||||
goto err;
|
||||
|
||||
if (namingAuthority->namingAuthorityId != NULL) {
|
||||
char objbuf[128];
|
||||
const char *ln = OBJ_nid2ln(OBJ_obj2nid(namingAuthority->namingAuthorityId));
|
||||
|
||||
if (BIO_printf(bp, "%*s admissionAuthorityId: ", ind, "") <= 0)
|
||||
goto err;
|
||||
|
||||
OBJ_obj2txt(objbuf, sizeof(objbuf), namingAuthority->namingAuthorityId, 1);
|
||||
|
||||
if (BIO_printf(bp, "%s%s%s%s\n", ln ? ln : "",
|
||||
ln ? " (" : "", objbuf, ln ? ")" : "") <= 0)
|
||||
goto err;
|
||||
}
|
||||
if (namingAuthority->namingAuthorityText != NULL) {
|
||||
if (BIO_printf(bp, "%*s namingAuthorityText: ", ind, "") <= 0
|
||||
|| ASN1_STRING_print(bp, namingAuthority->namingAuthorityText) <= 0
|
||||
|| BIO_printf(bp, "\n") <= 0)
|
||||
goto err;
|
||||
}
|
||||
if (namingAuthority->namingAuthorityUrl != NULL ) {
|
||||
if (BIO_printf(bp, "%*s namingAuthorityUrl: ", ind, "") <= 0
|
||||
|| ASN1_STRING_print(bp, namingAuthority->namingAuthorityUrl) <= 0
|
||||
|| BIO_printf(bp, "\n") <= 0)
|
||||
goto err;
|
||||
}
|
||||
return 1;
|
||||
|
||||
err:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int i2r_ADMISSION_SYNTAX(const struct v3_ext_method *method, void *in,
|
||||
BIO *bp, int ind)
|
||||
{
|
||||
ADMISSION_SYNTAX * admission = (ADMISSION_SYNTAX *)in;
|
||||
int i, j, k;
|
||||
|
||||
if (admission->admissionAuthority != NULL) {
|
||||
if (BIO_printf(bp, "%*sadmissionAuthority:\n", ind, "") <= 0
|
||||
|| BIO_printf(bp, "%*s ", ind, "") <= 0
|
||||
|| GENERAL_NAME_print(bp, admission->admissionAuthority) <= 0
|
||||
|| BIO_printf(bp, "\n") <= 0)
|
||||
goto err;
|
||||
}
|
||||
|
||||
for (i = 0; i < sk_ADMISSIONS_num(admission->contentsOfAdmissions); i++) {
|
||||
ADMISSIONS* entry = sk_ADMISSIONS_value(admission->contentsOfAdmissions, i);
|
||||
|
||||
if (BIO_printf(bp, "%*sEntry %0d:\n", ind, "", 1 + i) <= 0) goto err;
|
||||
|
||||
if (entry->admissionAuthority != NULL) {
|
||||
if (BIO_printf(bp, "%*s admissionAuthority:\n", ind, "") <= 0
|
||||
|| BIO_printf(bp, "%*s ", ind, "") <= 0
|
||||
|| GENERAL_NAME_print(bp, entry->admissionAuthority) <= 0
|
||||
|| BIO_printf(bp, "\n") <= 0)
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (entry->namingAuthority != NULL) {
|
||||
if (i2r_NAMING_AUTHORITY(method, entry->namingAuthority, bp, ind) <= 0)
|
||||
goto err;
|
||||
}
|
||||
|
||||
for (j = 0; j < sk_PROFESSION_INFO_num(entry->professionInfos); j++) {
|
||||
PROFESSION_INFO* pinfo = sk_PROFESSION_INFO_value(entry->professionInfos, j);
|
||||
|
||||
if (BIO_printf(bp, "%*s Profession Info Entry %0d:\n", ind, "", 1 + j) <= 0)
|
||||
goto err;
|
||||
|
||||
if (pinfo->registrationNumber != NULL) {
|
||||
if (BIO_printf(bp, "%*s registrationNumber: ", ind, "") <= 0
|
||||
|| ASN1_STRING_print(bp, pinfo->registrationNumber) <= 0
|
||||
|| BIO_printf(bp, "\n") <= 0)
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (pinfo->namingAuthority != NULL) {
|
||||
if (i2r_NAMING_AUTHORITY(method, pinfo->namingAuthority, bp, ind + 2) <= 0)
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (pinfo->professionItems != NULL) {
|
||||
|
||||
if (BIO_printf(bp, "%*s Info Entries:\n", ind, "") <= 0)
|
||||
goto err;
|
||||
for (k = 0; k < sk_ASN1_STRING_num(pinfo->professionItems); k++) {
|
||||
ASN1_STRING* val = sk_ASN1_STRING_value(pinfo->professionItems, k);
|
||||
|
||||
if (BIO_printf(bp, "%*s ", ind, "") <= 0
|
||||
|| ASN1_STRING_print(bp, val) <= 0
|
||||
|| BIO_printf(bp, "\n") <= 0)
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
if (pinfo->professionOIDs != NULL) {
|
||||
if (BIO_printf(bp, "%*s Profession OIDs:\n", ind, "") <= 0)
|
||||
goto err;
|
||||
for (k = 0; k < sk_ASN1_OBJECT_num(pinfo->professionOIDs); k++) {
|
||||
ASN1_OBJECT* obj = sk_ASN1_OBJECT_value(pinfo->professionOIDs, k);
|
||||
const char *ln = OBJ_nid2ln(OBJ_obj2nid(obj));
|
||||
char objbuf[128];
|
||||
|
||||
OBJ_obj2txt(objbuf, sizeof(objbuf), obj, 1);
|
||||
if (BIO_printf(bp, "%*s %s%s%s%s\n", ind, "",
|
||||
ln ? ln : "", ln ? " (" : "",
|
||||
objbuf, ln ? ")" : "") <= 0)
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
|
||||
err:
|
||||
return -1;
|
||||
}
|
||||
|
||||
const ASN1_OBJECT *NAMING_AUTHORITY_get0_authorityId(const NAMING_AUTHORITY *n)
|
||||
{
|
||||
return n->namingAuthorityId;
|
||||
}
|
||||
|
||||
void NAMING_AUTHORITY_set0_authorityId(NAMING_AUTHORITY *n, ASN1_OBJECT* id)
|
||||
{
|
||||
ASN1_OBJECT_free(n->namingAuthorityId);
|
||||
n->namingAuthorityId = id;
|
||||
}
|
||||
|
||||
const ASN1_IA5STRING *NAMING_AUTHORITY_get0_authorityURL(
|
||||
const NAMING_AUTHORITY *n)
|
||||
{
|
||||
return n->namingAuthorityUrl;
|
||||
}
|
||||
|
||||
void NAMING_AUTHORITY_set0_authorityURL(NAMING_AUTHORITY *n, ASN1_IA5STRING* u)
|
||||
{
|
||||
ASN1_IA5STRING_free(n->namingAuthorityUrl);
|
||||
n->namingAuthorityUrl = u;
|
||||
}
|
||||
|
||||
const ASN1_STRING *NAMING_AUTHORITY_get0_authorityText(
|
||||
const NAMING_AUTHORITY *n)
|
||||
{
|
||||
return n->namingAuthorityText;
|
||||
}
|
||||
|
||||
void NAMING_AUTHORITY_set0_authorityText(NAMING_AUTHORITY *n, ASN1_STRING* t)
|
||||
{
|
||||
ASN1_IA5STRING_free(n->namingAuthorityText);
|
||||
n->namingAuthorityText = t;
|
||||
}
|
||||
|
||||
const GENERAL_NAME *ADMISSION_SYNTAX_get0_admissionAuthority(const ADMISSION_SYNTAX *as)
|
||||
{
|
||||
return as->admissionAuthority;
|
||||
}
|
||||
|
||||
void ADMISSION_SYNTAX_set0_admissionAuthority(ADMISSION_SYNTAX *as,
|
||||
GENERAL_NAME *aa)
|
||||
{
|
||||
GENERAL_NAME_free(as->admissionAuthority);
|
||||
as->admissionAuthority = aa;
|
||||
}
|
||||
|
||||
const STACK_OF(ADMISSIONS) *ADMISSION_SYNTAX_get0_contentsOfAdmissions(const ADMISSION_SYNTAX *as)
|
||||
{
|
||||
return as->contentsOfAdmissions;
|
||||
}
|
||||
|
||||
void ADMISSION_SYNTAX_set0_contentsOfAdmissions(ADMISSION_SYNTAX *as,
|
||||
STACK_OF(ADMISSIONS) *a)
|
||||
{
|
||||
sk_ADMISSIONS_pop_free(as->contentsOfAdmissions, ADMISSIONS_free);
|
||||
as->contentsOfAdmissions = a;
|
||||
}
|
||||
|
||||
const GENERAL_NAME *ADMISSIONS_get0_admissionAuthority(const ADMISSIONS *a)
|
||||
{
|
||||
return a->admissionAuthority;
|
||||
}
|
||||
|
||||
void ADMISSIONS_set0_admissionAuthority(ADMISSIONS *a, GENERAL_NAME *aa)
|
||||
{
|
||||
GENERAL_NAME_free(a->admissionAuthority);
|
||||
a->admissionAuthority = aa;
|
||||
}
|
||||
|
||||
const NAMING_AUTHORITY *ADMISSIONS_get0_namingAuthority(const ADMISSIONS *a)
|
||||
{
|
||||
return a->namingAuthority;
|
||||
}
|
||||
|
||||
void ADMISSIONS_set0_namingAuthority(ADMISSIONS *a, NAMING_AUTHORITY *na)
|
||||
{
|
||||
NAMING_AUTHORITY_free(a->namingAuthority);
|
||||
a->namingAuthority = na;
|
||||
}
|
||||
|
||||
const PROFESSION_INFOS *ADMISSIONS_get0_professionInfos(const ADMISSIONS *a)
|
||||
{
|
||||
return a->professionInfos;
|
||||
}
|
||||
|
||||
void ADMISSIONS_set0_professionInfos(ADMISSIONS *a, PROFESSION_INFOS *pi)
|
||||
{
|
||||
sk_PROFESSION_INFO_pop_free(a->professionInfos, PROFESSION_INFO_free);
|
||||
a->professionInfos = pi;
|
||||
}
|
||||
|
||||
const ASN1_OCTET_STRING *PROFESSION_INFO_get0_addProfessionInfo(const PROFESSION_INFO *pi)
|
||||
{
|
||||
return pi->addProfessionInfo;
|
||||
}
|
||||
|
||||
void PROFESSION_INFO_set0_addProfessionInfo(PROFESSION_INFO *pi,
|
||||
ASN1_OCTET_STRING *aos)
|
||||
{
|
||||
ASN1_OCTET_STRING_free(pi->addProfessionInfo);
|
||||
pi->addProfessionInfo = aos;
|
||||
}
|
||||
|
||||
const NAMING_AUTHORITY *PROFESSION_INFO_get0_namingAuthority(const PROFESSION_INFO *pi)
|
||||
{
|
||||
return pi->namingAuthority;
|
||||
}
|
||||
|
||||
void PROFESSION_INFO_set0_namingAuthority(PROFESSION_INFO *pi,
|
||||
NAMING_AUTHORITY *na)
|
||||
{
|
||||
NAMING_AUTHORITY_free(pi->namingAuthority);
|
||||
pi->namingAuthority = na;
|
||||
}
|
||||
|
||||
const STACK_OF(ASN1_STRING) *PROFESSION_INFO_get0_professionItems(const PROFESSION_INFO *pi)
|
||||
{
|
||||
return pi->professionItems;
|
||||
}
|
||||
|
||||
void PROFESSION_INFO_set0_professionItems(PROFESSION_INFO *pi,
|
||||
STACK_OF(ASN1_STRING) *as)
|
||||
{
|
||||
sk_ASN1_STRING_pop_free(pi->professionItems, ASN1_STRING_free);
|
||||
pi->professionItems = as;
|
||||
}
|
||||
|
||||
const STACK_OF(ASN1_OBJECT) *PROFESSION_INFO_get0_professionOIDs(const PROFESSION_INFO *pi)
|
||||
{
|
||||
return pi->professionOIDs;
|
||||
}
|
||||
|
||||
void PROFESSION_INFO_set0_professionOIDs(PROFESSION_INFO *pi,
|
||||
STACK_OF(ASN1_OBJECT) *po)
|
||||
{
|
||||
sk_ASN1_OBJECT_pop_free(pi->professionOIDs, ASN1_OBJECT_free);
|
||||
pi->professionOIDs = po;
|
||||
}
|
||||
|
||||
const ASN1_PRINTABLESTRING *PROFESSION_INFO_get0_registrationNumber(const PROFESSION_INFO *pi)
|
||||
{
|
||||
return pi->registrationNumber;
|
||||
}
|
||||
|
||||
void PROFESSION_INFO_set0_registrationNumber(PROFESSION_INFO *pi,
|
||||
ASN1_PRINTABLESTRING *rn)
|
||||
{
|
||||
ASN1_PRINTABLESTRING_free(pi->registrationNumber);
|
||||
pi->registrationNumber = rn;
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Copyright 2017-2018 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
#ifndef HEADER_V3_ADMISSION_H
|
||||
# define HEADER_V3_ADMISSION_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct NamingAuthority_st {
|
||||
ASN1_OBJECT* namingAuthorityId;
|
||||
ASN1_IA5STRING* namingAuthorityUrl;
|
||||
ASN1_STRING* namingAuthorityText; /* i.e. DIRECTORYSTRING */
|
||||
};
|
||||
|
||||
struct ProfessionInfo_st {
|
||||
NAMING_AUTHORITY* namingAuthority;
|
||||
STACK_OF(ASN1_STRING)* professionItems; /* i.e. DIRECTORYSTRING */
|
||||
STACK_OF(ASN1_OBJECT)* professionOIDs;
|
||||
ASN1_PRINTABLESTRING* registrationNumber;
|
||||
ASN1_OCTET_STRING* addProfessionInfo;
|
||||
};
|
||||
|
||||
struct Admissions_st {
|
||||
GENERAL_NAME* admissionAuthority;
|
||||
NAMING_AUTHORITY* namingAuthority;
|
||||
STACK_OF(PROFESSION_INFO)* professionInfos;
|
||||
};
|
||||
|
||||
struct AdmissionSyntax_st {
|
||||
GENERAL_NAME* admissionAuthority;
|
||||
STACK_OF(ADMISSIONS)* contentsOfAdmissions;
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
+45
-29
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 1999-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
* Copyright 1999-2017 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
@@ -68,6 +68,7 @@ STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(X509V3_EXT_METHOD *method,
|
||||
unsigned char *p;
|
||||
char oline[256], htmp[5];
|
||||
int i;
|
||||
|
||||
switch (gen->type) {
|
||||
case GEN_OTHERNAME:
|
||||
if (!X509V3_add_value("othername", "<unsupported>", &ret))
|
||||
@@ -100,7 +101,7 @@ STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(X509V3_EXT_METHOD *method,
|
||||
break;
|
||||
|
||||
case GEN_DIRNAME:
|
||||
if (X509_NAME_oneline(gen->d.dirn, oline, 256) == NULL
|
||||
if (X509_NAME_oneline(gen->d.dirn, oline, sizeof(oline)) == NULL
|
||||
|| !X509V3_add_value("DirName", oline, &ret))
|
||||
return NULL;
|
||||
break;
|
||||
@@ -108,8 +109,8 @@ STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(X509V3_EXT_METHOD *method,
|
||||
case GEN_IPADD:
|
||||
p = gen->d.ip->data;
|
||||
if (gen->d.ip->length == 4)
|
||||
BIO_snprintf(oline, sizeof(oline),
|
||||
"%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
|
||||
BIO_snprintf(oline, sizeof(oline), "%d.%d.%d.%d",
|
||||
p[0], p[1], p[2], p[3]);
|
||||
else if (gen->d.ip->length == 16) {
|
||||
oline[0] = 0;
|
||||
for (i = 0; i < 8; i++) {
|
||||
@@ -201,25 +202,28 @@ static GENERAL_NAMES *v2i_issuer_alt(X509V3_EXT_METHOD *method,
|
||||
X509V3_CTX *ctx,
|
||||
STACK_OF(CONF_VALUE) *nval)
|
||||
{
|
||||
GENERAL_NAMES *gens = NULL;
|
||||
CONF_VALUE *cnf;
|
||||
const int num = sk_CONF_VALUE_num(nval);
|
||||
GENERAL_NAMES *gens = sk_GENERAL_NAME_new_reserve(NULL, num);
|
||||
int i;
|
||||
|
||||
if ((gens = sk_GENERAL_NAME_new_null()) == NULL) {
|
||||
if (gens == NULL) {
|
||||
X509V3err(X509V3_F_V2I_ISSUER_ALT, ERR_R_MALLOC_FAILURE);
|
||||
sk_GENERAL_NAME_free(gens);
|
||||
return NULL;
|
||||
}
|
||||
for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
|
||||
cnf = sk_CONF_VALUE_value(nval, i);
|
||||
for (i = 0; i < num; i++) {
|
||||
CONF_VALUE *cnf = sk_CONF_VALUE_value(nval, i);
|
||||
|
||||
if (!name_cmp(cnf->name, "issuer")
|
||||
&& cnf->value && strcmp(cnf->value, "copy") == 0) {
|
||||
if (!copy_issuer(ctx, gens))
|
||||
goto err;
|
||||
} else {
|
||||
GENERAL_NAME *gen;
|
||||
if ((gen = v2i_GENERAL_NAME(method, ctx, cnf)) == NULL)
|
||||
GENERAL_NAME *gen = v2i_GENERAL_NAME(method, ctx, cnf);
|
||||
|
||||
if (gen == NULL)
|
||||
goto err;
|
||||
sk_GENERAL_NAME_push(gens, gen);
|
||||
sk_GENERAL_NAME_push(gens, gen); /* no failure as it was reserved */
|
||||
}
|
||||
}
|
||||
return gens;
|
||||
@@ -235,7 +239,7 @@ static int copy_issuer(X509V3_CTX *ctx, GENERAL_NAMES *gens)
|
||||
GENERAL_NAMES *ialt;
|
||||
GENERAL_NAME *gen;
|
||||
X509_EXTENSION *ext;
|
||||
int i;
|
||||
int i, num;
|
||||
|
||||
if (ctx && (ctx->flags == CTX_TEST))
|
||||
return 1;
|
||||
@@ -252,12 +256,15 @@ static int copy_issuer(X509V3_CTX *ctx, GENERAL_NAMES *gens)
|
||||
goto err;
|
||||
}
|
||||
|
||||
for (i = 0; i < sk_GENERAL_NAME_num(ialt); i++) {
|
||||
num = sk_GENERAL_NAME_num(ialt);
|
||||
if (!sk_GENERAL_NAME_reserve(gens, num)) {
|
||||
X509V3err(X509V3_F_COPY_ISSUER, ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
|
||||
for (i = 0; i < num; i++) {
|
||||
gen = sk_GENERAL_NAME_value(ialt, i);
|
||||
if (!sk_GENERAL_NAME_push(gens, gen)) {
|
||||
X509V3err(X509V3_F_COPY_ISSUER, ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
sk_GENERAL_NAME_push(gens, gen); /* no failure as it was reserved */
|
||||
}
|
||||
sk_GENERAL_NAME_free(ialt);
|
||||
|
||||
@@ -272,15 +279,19 @@ static GENERAL_NAMES *v2i_subject_alt(X509V3_EXT_METHOD *method,
|
||||
X509V3_CTX *ctx,
|
||||
STACK_OF(CONF_VALUE) *nval)
|
||||
{
|
||||
GENERAL_NAMES *gens = NULL;
|
||||
GENERAL_NAMES *gens;
|
||||
CONF_VALUE *cnf;
|
||||
const int num = sk_CONF_VALUE_num(nval);
|
||||
int i;
|
||||
|
||||
if ((gens = sk_GENERAL_NAME_new_null()) == NULL) {
|
||||
gens = sk_GENERAL_NAME_new_reserve(NULL, num);
|
||||
if (gens == NULL) {
|
||||
X509V3err(X509V3_F_V2I_SUBJECT_ALT, ERR_R_MALLOC_FAILURE);
|
||||
sk_GENERAL_NAME_free(gens);
|
||||
return NULL;
|
||||
}
|
||||
for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
|
||||
|
||||
for (i = 0; i < num; i++) {
|
||||
cnf = sk_CONF_VALUE_value(nval, i);
|
||||
if (!name_cmp(cnf->name, "email")
|
||||
&& cnf->value && strcmp(cnf->value, "copy") == 0) {
|
||||
@@ -294,7 +305,7 @@ static GENERAL_NAMES *v2i_subject_alt(X509V3_EXT_METHOD *method,
|
||||
GENERAL_NAME *gen;
|
||||
if ((gen = v2i_GENERAL_NAME(method, ctx, cnf)) == NULL)
|
||||
goto err;
|
||||
sk_GENERAL_NAME_push(gens, gen);
|
||||
sk_GENERAL_NAME_push(gens, gen); /* no failure as it was reserved */
|
||||
}
|
||||
}
|
||||
return gens;
|
||||
@@ -313,10 +324,12 @@ static int copy_email(X509V3_CTX *ctx, GENERAL_NAMES *gens, int move_p)
|
||||
ASN1_IA5STRING *email = NULL;
|
||||
X509_NAME_ENTRY *ne;
|
||||
GENERAL_NAME *gen = NULL;
|
||||
int i;
|
||||
int i = -1;
|
||||
|
||||
if (ctx != NULL && ctx->flags == CTX_TEST)
|
||||
return 1;
|
||||
if (!ctx || (!ctx->subject_cert && !ctx->subject_req)) {
|
||||
if (ctx == NULL
|
||||
|| (ctx->subject_cert == NULL && ctx->subject_req == NULL)) {
|
||||
X509V3err(X509V3_F_COPY_EMAIL, X509V3_R_NO_SUBJECT_DETAILS);
|
||||
goto err;
|
||||
}
|
||||
@@ -327,7 +340,6 @@ static int copy_email(X509V3_CTX *ctx, GENERAL_NAMES *gens, int move_p)
|
||||
nm = X509_REQ_get_subject_name(ctx->subject_req);
|
||||
|
||||
/* Now add any email address(es) to STACK */
|
||||
i = -1;
|
||||
while ((i = X509_NAME_get_index_by_NID(nm,
|
||||
NID_pkcs9_emailAddress, i)) >= 0) {
|
||||
ne = X509_NAME_get_entry(nm, i);
|
||||
@@ -364,19 +376,23 @@ GENERAL_NAMES *v2i_GENERAL_NAMES(const X509V3_EXT_METHOD *method,
|
||||
X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval)
|
||||
{
|
||||
GENERAL_NAME *gen;
|
||||
GENERAL_NAMES *gens = NULL;
|
||||
GENERAL_NAMES *gens;
|
||||
CONF_VALUE *cnf;
|
||||
const int num = sk_CONF_VALUE_num(nval);
|
||||
int i;
|
||||
|
||||
if ((gens = sk_GENERAL_NAME_new_null()) == NULL) {
|
||||
gens = sk_GENERAL_NAME_new_reserve(NULL, num);
|
||||
if (gens == NULL) {
|
||||
X509V3err(X509V3_F_V2I_GENERAL_NAMES, ERR_R_MALLOC_FAILURE);
|
||||
sk_GENERAL_NAME_free(gens);
|
||||
return NULL;
|
||||
}
|
||||
for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
|
||||
|
||||
for (i = 0; i < num; i++) {
|
||||
cnf = sk_CONF_VALUE_value(nval, i);
|
||||
if ((gen = v2i_GENERAL_NAME(method, ctx, cnf)) == NULL)
|
||||
goto err;
|
||||
sk_GENERAL_NAME_push(gens, gen);
|
||||
sk_GENERAL_NAME_push(gens, gen); /* no failure as it was reserved */
|
||||
}
|
||||
return gens;
|
||||
err:
|
||||
|
||||
+60
-32
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2006-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
* Copyright 2006-2018 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
@@ -11,6 +11,7 @@
|
||||
* Implementation of RFC 3779 section 3.2.
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "internal/cryptlib.h"
|
||||
@@ -123,13 +124,13 @@ static int ASIdOrRange_cmp(const ASIdOrRange *const *a_,
|
||||
{
|
||||
const ASIdOrRange *a = *a_, *b = *b_;
|
||||
|
||||
OPENSSL_assert((a->type == ASIdOrRange_id && a->u.id != NULL) ||
|
||||
(a->type == ASIdOrRange_range && a->u.range != NULL &&
|
||||
a->u.range->min != NULL && a->u.range->max != NULL));
|
||||
assert((a->type == ASIdOrRange_id && a->u.id != NULL) ||
|
||||
(a->type == ASIdOrRange_range && a->u.range != NULL &&
|
||||
a->u.range->min != NULL && a->u.range->max != NULL));
|
||||
|
||||
OPENSSL_assert((b->type == ASIdOrRange_id && b->u.id != NULL) ||
|
||||
(b->type == ASIdOrRange_range && b->u.range != NULL &&
|
||||
b->u.range->min != NULL && b->u.range->max != NULL));
|
||||
assert((b->type == ASIdOrRange_id && b->u.id != NULL) ||
|
||||
(b->type == ASIdOrRange_range && b->u.range != NULL &&
|
||||
b->u.range->min != NULL && b->u.range->max != NULL));
|
||||
|
||||
if (a->type == ASIdOrRange_id && b->type == ASIdOrRange_id)
|
||||
return ASN1_INTEGER_cmp(a->u.id, b->u.id);
|
||||
@@ -167,7 +168,6 @@ int X509v3_asid_add_inherit(ASIdentifiers *asid, int which)
|
||||
if (*choice == NULL) {
|
||||
if ((*choice = ASIdentifierChoice_new()) == NULL)
|
||||
return 0;
|
||||
OPENSSL_assert((*choice)->u.inherit == NULL);
|
||||
if (((*choice)->u.inherit = ASN1_NULL_new()) == NULL)
|
||||
return 0;
|
||||
(*choice)->type = ASIdentifierChoice_inherit;
|
||||
@@ -200,7 +200,6 @@ int X509v3_asid_add_id_or_range(ASIdentifiers *asid,
|
||||
if (*choice == NULL) {
|
||||
if ((*choice = ASIdentifierChoice_new()) == NULL)
|
||||
return 0;
|
||||
OPENSSL_assert((*choice)->u.asIdsOrRanges == NULL);
|
||||
(*choice)->u.asIdsOrRanges = sk_ASIdOrRange_new(ASIdOrRange_cmp);
|
||||
if ((*choice)->u.asIdsOrRanges == NULL)
|
||||
return 0;
|
||||
@@ -232,20 +231,23 @@ int X509v3_asid_add_id_or_range(ASIdentifiers *asid,
|
||||
/*
|
||||
* Extract min and max values from an ASIdOrRange.
|
||||
*/
|
||||
static void extract_min_max(ASIdOrRange *aor,
|
||||
ASN1_INTEGER **min, ASN1_INTEGER **max)
|
||||
static int extract_min_max(ASIdOrRange *aor,
|
||||
ASN1_INTEGER **min, ASN1_INTEGER **max)
|
||||
{
|
||||
OPENSSL_assert(aor != NULL && min != NULL && max != NULL);
|
||||
if (!ossl_assert(aor != NULL))
|
||||
return 0;
|
||||
switch (aor->type) {
|
||||
case ASIdOrRange_id:
|
||||
*min = aor->u.id;
|
||||
*max = aor->u.id;
|
||||
return;
|
||||
return 1;
|
||||
case ASIdOrRange_range:
|
||||
*min = aor->u.range->min;
|
||||
*max = aor->u.range->max;
|
||||
return;
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -279,8 +281,9 @@ static int ASIdentifierChoice_is_canonical(ASIdentifierChoice *choice)
|
||||
ASN1_INTEGER *a_min = NULL, *a_max = NULL, *b_min = NULL, *b_max =
|
||||
NULL;
|
||||
|
||||
extract_min_max(a, &a_min, &a_max);
|
||||
extract_min_max(b, &b_min, &b_max);
|
||||
if (!extract_min_max(a, &a_min, &a_max)
|
||||
|| !extract_min_max(b, &b_min, &b_max))
|
||||
goto done;
|
||||
|
||||
/*
|
||||
* Punt misordered list, overlapping start, or inverted range.
|
||||
@@ -318,8 +321,8 @@ static int ASIdentifierChoice_is_canonical(ASIdentifierChoice *choice)
|
||||
ASIdOrRange *a = sk_ASIdOrRange_value(choice->u.asIdsOrRanges, i);
|
||||
ASN1_INTEGER *a_min, *a_max;
|
||||
if (a != NULL && a->type == ASIdOrRange_range) {
|
||||
extract_min_max(a, &a_min, &a_max);
|
||||
if (ASN1_INTEGER_cmp(a_min, a_max) > 0)
|
||||
if (!extract_min_max(a, &a_min, &a_max)
|
||||
|| ASN1_INTEGER_cmp(a_min, a_max) > 0)
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
@@ -382,13 +385,15 @@ static int ASIdentifierChoice_canonize(ASIdentifierChoice *choice)
|
||||
ASN1_INTEGER *a_min = NULL, *a_max = NULL, *b_min = NULL, *b_max =
|
||||
NULL;
|
||||
|
||||
extract_min_max(a, &a_min, &a_max);
|
||||
extract_min_max(b, &b_min, &b_max);
|
||||
if (!extract_min_max(a, &a_min, &a_max)
|
||||
|| !extract_min_max(b, &b_min, &b_max))
|
||||
goto done;
|
||||
|
||||
/*
|
||||
* Make sure we're properly sorted (paranoia).
|
||||
*/
|
||||
OPENSSL_assert(ASN1_INTEGER_cmp(a_min, b_min) <= 0);
|
||||
if (!ossl_assert(ASN1_INTEGER_cmp(a_min, b_min) <= 0))
|
||||
goto done;
|
||||
|
||||
/*
|
||||
* Punt inverted ranges.
|
||||
@@ -464,13 +469,15 @@ static int ASIdentifierChoice_canonize(ASIdentifierChoice *choice)
|
||||
ASIdOrRange *a = sk_ASIdOrRange_value(choice->u.asIdsOrRanges, i);
|
||||
ASN1_INTEGER *a_min, *a_max;
|
||||
if (a != NULL && a->type == ASIdOrRange_range) {
|
||||
extract_min_max(a, &a_min, &a_max);
|
||||
if (ASN1_INTEGER_cmp(a_min, a_max) > 0)
|
||||
if (!extract_min_max(a, &a_min, &a_max)
|
||||
|| ASN1_INTEGER_cmp(a_min, a_max) > 0)
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
OPENSSL_assert(ASIdentifierChoice_is_canonical(choice)); /* Paranoia */
|
||||
/* Paranoia */
|
||||
if (!ossl_assert(ASIdentifierChoice_is_canonical(choice)))
|
||||
goto done;
|
||||
|
||||
ret = 1;
|
||||
|
||||
@@ -655,11 +662,14 @@ static int asid_contains(ASIdOrRanges *parent, ASIdOrRanges *child)
|
||||
|
||||
p = 0;
|
||||
for (c = 0; c < sk_ASIdOrRange_num(child); c++) {
|
||||
extract_min_max(sk_ASIdOrRange_value(child, c), &c_min, &c_max);
|
||||
if (!extract_min_max(sk_ASIdOrRange_value(child, c), &c_min, &c_max))
|
||||
return 0;
|
||||
for (;; p++) {
|
||||
if (p >= sk_ASIdOrRange_num(parent))
|
||||
return 0;
|
||||
extract_min_max(sk_ASIdOrRange_value(parent, p), &p_min, &p_max);
|
||||
if (!extract_min_max(sk_ASIdOrRange_value(parent, p), &p_min,
|
||||
&p_max))
|
||||
return 0;
|
||||
if (ASN1_INTEGER_cmp(p_max, c_max) < 0)
|
||||
continue;
|
||||
if (ASN1_INTEGER_cmp(p_min, c_min) > 0)
|
||||
@@ -715,9 +725,14 @@ static int asid_validate_path_internal(X509_STORE_CTX *ctx,
|
||||
int i, ret = 1, inherit_as = 0, inherit_rdi = 0;
|
||||
X509 *x;
|
||||
|
||||
OPENSSL_assert(chain != NULL && sk_X509_num(chain) > 0);
|
||||
OPENSSL_assert(ctx != NULL || ext != NULL);
|
||||
OPENSSL_assert(ctx == NULL || ctx->verify_cb != NULL);
|
||||
if (!ossl_assert(chain != NULL && sk_X509_num(chain) > 0)
|
||||
|| !ossl_assert(ctx != NULL || ext != NULL)
|
||||
|| !ossl_assert(ctx == NULL || ctx->verify_cb != NULL)) {
|
||||
if (ctx != NULL)
|
||||
ctx->error = X509_V_ERR_UNSPECIFIED;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Figure out where to start. If we don't have an extension to
|
||||
@@ -730,7 +745,6 @@ static int asid_validate_path_internal(X509_STORE_CTX *ctx,
|
||||
} else {
|
||||
i = 0;
|
||||
x = sk_X509_value(chain, i);
|
||||
OPENSSL_assert(x != NULL);
|
||||
if ((ext = x->rfc3779_asid) == NULL)
|
||||
goto done;
|
||||
}
|
||||
@@ -763,7 +777,11 @@ static int asid_validate_path_internal(X509_STORE_CTX *ctx,
|
||||
*/
|
||||
for (i++; i < sk_X509_num(chain); i++) {
|
||||
x = sk_X509_value(chain, i);
|
||||
OPENSSL_assert(x != NULL);
|
||||
if (!ossl_assert(x != NULL)) {
|
||||
if (ctx != NULL)
|
||||
ctx->error = X509_V_ERR_UNSPECIFIED;
|
||||
return 0;
|
||||
}
|
||||
if (x->rfc3779_asid == NULL) {
|
||||
if (child_as != NULL || child_rdi != NULL)
|
||||
validation_err(X509_V_ERR_UNNESTED_RESOURCE);
|
||||
@@ -809,7 +827,11 @@ static int asid_validate_path_internal(X509_STORE_CTX *ctx,
|
||||
/*
|
||||
* Trust anchor can't inherit.
|
||||
*/
|
||||
OPENSSL_assert(x != NULL);
|
||||
if (!ossl_assert(x != NULL)) {
|
||||
if (ctx != NULL)
|
||||
ctx->error = X509_V_ERR_UNSPECIFIED;
|
||||
return 0;
|
||||
}
|
||||
if (x->rfc3779_asid != NULL) {
|
||||
if (x->rfc3779_asid->asnum != NULL &&
|
||||
x->rfc3779_asid->asnum->type == ASIdentifierChoice_inherit)
|
||||
@@ -830,6 +852,12 @@ static int asid_validate_path_internal(X509_STORE_CTX *ctx,
|
||||
*/
|
||||
int X509v3_asid_validate_path(X509_STORE_CTX *ctx)
|
||||
{
|
||||
if (ctx->chain == NULL
|
||||
|| sk_X509_num(ctx->chain) == 0
|
||||
|| ctx->verify_cb == NULL) {
|
||||
ctx->error = X509_V_ERR_UNSPECIFIED;
|
||||
return 0;
|
||||
}
|
||||
return asid_validate_path_internal(ctx, ctx->chain, NULL);
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
/* extension creation utilities */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include "internal/ctype.h"
|
||||
#include "internal/cryptlib.h"
|
||||
#include <openssl/conf.h>
|
||||
#include <openssl/x509.h>
|
||||
@@ -192,7 +192,7 @@ static int v3_check_critical(const char **value)
|
||||
if ((strlen(p) < 9) || strncmp(p, "critical,", 9))
|
||||
return 0;
|
||||
p += 9;
|
||||
while (isspace((unsigned char)*p))
|
||||
while (ossl_isspace(*p))
|
||||
p++;
|
||||
*value = p;
|
||||
return 1;
|
||||
@@ -212,7 +212,7 @@ static int v3_check_generic(const char **value)
|
||||
} else
|
||||
return 0;
|
||||
|
||||
while (isspace((unsigned char)*p))
|
||||
while (ossl_isspace(*p))
|
||||
p++;
|
||||
*value = p;
|
||||
return gen_type;
|
||||
|
||||
+57
-13
@@ -31,6 +31,8 @@ static POLICYINFO *policy_section(X509V3_CTX *ctx,
|
||||
static POLICYQUALINFO *notice_section(X509V3_CTX *ctx,
|
||||
STACK_OF(CONF_VALUE) *unot, int ia5org);
|
||||
static int nref_nos(STACK_OF(ASN1_INTEGER) *nnums, STACK_OF(CONF_VALUE) *nos);
|
||||
static int displaytext_str2tag(const char *tagstr, unsigned int *tag_len);
|
||||
static int displaytext_get_tag_len(const char *tagstr);
|
||||
|
||||
const X509V3_EXT_METHOD v3_cpols = {
|
||||
NID_certificate_policies, 0, ASN1_ITEM_ref(CERTIFICATEPOLICIES),
|
||||
@@ -86,26 +88,30 @@ IMPLEMENT_ASN1_FUNCTIONS(NOTICEREF)
|
||||
static STACK_OF(POLICYINFO) *r2i_certpol(X509V3_EXT_METHOD *method,
|
||||
X509V3_CTX *ctx, const char *value)
|
||||
{
|
||||
STACK_OF(POLICYINFO) *pols = NULL;
|
||||
STACK_OF(POLICYINFO) *pols;
|
||||
char *pstr;
|
||||
POLICYINFO *pol;
|
||||
ASN1_OBJECT *pobj;
|
||||
STACK_OF(CONF_VALUE) *vals;
|
||||
STACK_OF(CONF_VALUE) *vals = X509V3_parse_list(value);
|
||||
CONF_VALUE *cnf;
|
||||
const int num = sk_CONF_VALUE_num(vals);
|
||||
int i, ia5org;
|
||||
pols = sk_POLICYINFO_new_null();
|
||||
if (pols == NULL) {
|
||||
X509V3err(X509V3_F_R2I_CERTPOL, ERR_R_MALLOC_FAILURE);
|
||||
return NULL;
|
||||
}
|
||||
vals = X509V3_parse_list(value);
|
||||
|
||||
if (vals == NULL) {
|
||||
X509V3err(X509V3_F_R2I_CERTPOL, ERR_R_X509V3_LIB);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pols = sk_POLICYINFO_new_reserve(NULL, num);
|
||||
if (pols == NULL) {
|
||||
X509V3err(X509V3_F_R2I_CERTPOL, ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
|
||||
ia5org = 0;
|
||||
for (i = 0; i < sk_CONF_VALUE_num(vals); i++) {
|
||||
for (i = 0; i < num; i++) {
|
||||
cnf = sk_CONF_VALUE_value(vals, i);
|
||||
|
||||
if (cnf->value || !cnf->name) {
|
||||
X509V3err(X509V3_F_R2I_CERTPOL,
|
||||
X509V3_R_INVALID_POLICY_IDENTIFIER);
|
||||
@@ -239,16 +245,50 @@ static POLICYINFO *policy_section(X509V3_CTX *ctx,
|
||||
err:
|
||||
POLICYINFO_free(pol);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int displaytext_get_tag_len(const char *tagstr)
|
||||
{
|
||||
char *colon = strchr(tagstr, ':');
|
||||
|
||||
return (colon == NULL) ? -1 : colon - tagstr;
|
||||
}
|
||||
|
||||
static int displaytext_str2tag(const char *tagstr, unsigned int *tag_len)
|
||||
{
|
||||
int len;
|
||||
|
||||
*tag_len = 0;
|
||||
len = displaytext_get_tag_len(tagstr);
|
||||
|
||||
if (len == -1)
|
||||
return V_ASN1_VISIBLESTRING;
|
||||
*tag_len = len;
|
||||
if (len == sizeof("UTF8") - 1 && strncmp(tagstr, "UTF8", len) == 0)
|
||||
return V_ASN1_UTF8STRING;
|
||||
if (len == sizeof("UTF8String") - 1 && strncmp(tagstr, "UTF8String", len) == 0)
|
||||
return V_ASN1_UTF8STRING;
|
||||
if (len == sizeof("BMP") - 1 && strncmp(tagstr, "BMP", len) == 0)
|
||||
return V_ASN1_BMPSTRING;
|
||||
if (len == sizeof("BMPSTRING") - 1 && strncmp(tagstr, "BMPSTRING", len) == 0)
|
||||
return V_ASN1_BMPSTRING;
|
||||
if (len == sizeof("VISIBLE") - 1 && strncmp(tagstr, "VISIBLE", len) == 0)
|
||||
return V_ASN1_VISIBLESTRING;
|
||||
if (len == sizeof("VISIBLESTRING") - 1 && strncmp(tagstr, "VISIBLESTRING", len) == 0)
|
||||
return V_ASN1_VISIBLESTRING;
|
||||
*tag_len = 0;
|
||||
return V_ASN1_VISIBLESTRING;
|
||||
}
|
||||
|
||||
static POLICYQUALINFO *notice_section(X509V3_CTX *ctx,
|
||||
STACK_OF(CONF_VALUE) *unot, int ia5org)
|
||||
{
|
||||
int i, ret;
|
||||
int i, ret, len, tag;
|
||||
unsigned int tag_len;
|
||||
CONF_VALUE *cnf;
|
||||
USERNOTICE *not;
|
||||
POLICYQUALINFO *qual;
|
||||
char *value = NULL;
|
||||
|
||||
if ((qual = POLICYQUALINFO_new()) == NULL)
|
||||
goto merr;
|
||||
@@ -261,11 +301,15 @@ static POLICYQUALINFO *notice_section(X509V3_CTX *ctx,
|
||||
qual->d.usernotice = not;
|
||||
for (i = 0; i < sk_CONF_VALUE_num(unot); i++) {
|
||||
cnf = sk_CONF_VALUE_value(unot, i);
|
||||
value = cnf->value;
|
||||
if (strcmp(cnf->name, "explicitText") == 0) {
|
||||
if ((not->exptext = ASN1_VISIBLESTRING_new()) == NULL)
|
||||
tag = displaytext_str2tag(value, &tag_len);
|
||||
if ((not->exptext = ASN1_STRING_type_new(tag)) == NULL)
|
||||
goto merr;
|
||||
if (!ASN1_STRING_set(not->exptext, cnf->value,
|
||||
strlen(cnf->value)))
|
||||
if (tag_len != 0)
|
||||
value += tag_len + 1;
|
||||
len = strlen(value);
|
||||
if (!ASN1_STRING_set(not->exptext, value, len))
|
||||
goto merr;
|
||||
} else if (strcmp(cnf->name, "organization") == 0) {
|
||||
NOTICEREF *nref;
|
||||
|
||||
+10
-13
@@ -205,8 +205,8 @@ static DIST_POINT *crldp_from_section(X509V3_CTX *ctx,
|
||||
{
|
||||
int i;
|
||||
CONF_VALUE *cnf;
|
||||
DIST_POINT *point = NULL;
|
||||
point = DIST_POINT_new();
|
||||
DIST_POINT *point = DIST_POINT_new();
|
||||
|
||||
if (point == NULL)
|
||||
goto err;
|
||||
for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
|
||||
@@ -237,16 +237,19 @@ static DIST_POINT *crldp_from_section(X509V3_CTX *ctx,
|
||||
static void *v2i_crld(const X509V3_EXT_METHOD *method,
|
||||
X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval)
|
||||
{
|
||||
STACK_OF(DIST_POINT) *crld = NULL;
|
||||
STACK_OF(DIST_POINT) *crld;
|
||||
GENERAL_NAMES *gens = NULL;
|
||||
GENERAL_NAME *gen = NULL;
|
||||
CONF_VALUE *cnf;
|
||||
const int num = sk_CONF_VALUE_num(nval);
|
||||
int i;
|
||||
|
||||
if ((crld = sk_DIST_POINT_new_null()) == NULL)
|
||||
crld = sk_DIST_POINT_new_reserve(NULL, num);
|
||||
if (crld == NULL)
|
||||
goto merr;
|
||||
for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
|
||||
for (i = 0; i < num; i++) {
|
||||
DIST_POINT *point;
|
||||
|
||||
cnf = sk_CONF_VALUE_value(nval, i);
|
||||
if (!cnf->value) {
|
||||
STACK_OF(CONF_VALUE) *dpsect;
|
||||
@@ -257,10 +260,7 @@ static void *v2i_crld(const X509V3_EXT_METHOD *method,
|
||||
X509V3_section_free(ctx, dpsect);
|
||||
if (!point)
|
||||
goto err;
|
||||
if (!sk_DIST_POINT_push(crld, point)) {
|
||||
DIST_POINT_free(point);
|
||||
goto merr;
|
||||
}
|
||||
sk_DIST_POINT_push(crld, point); /* no failure as it was reserved */
|
||||
} else {
|
||||
if ((gen = v2i_GENERAL_NAME(method, ctx, cnf)) == NULL)
|
||||
goto err;
|
||||
@@ -271,10 +271,7 @@ static void *v2i_crld(const X509V3_EXT_METHOD *method,
|
||||
gen = NULL;
|
||||
if ((point = DIST_POINT_new()) == NULL)
|
||||
goto merr;
|
||||
if (!sk_DIST_POINT_push(crld, point)) {
|
||||
DIST_POINT_free(point);
|
||||
goto merr;
|
||||
}
|
||||
sk_DIST_POINT_push(crld, point); /* no failure as it was reserved */
|
||||
if ((point->distpoint = DIST_POINT_NAME_new()) == NULL)
|
||||
goto merr;
|
||||
point->distpoint->name.fullname = gens;
|
||||
|
||||
@@ -38,7 +38,7 @@ const X509V3_EXT_METHOD v3_crl_reason = {
|
||||
crl_reasons
|
||||
};
|
||||
|
||||
char *i2s_ASN1_ENUMERATED_TABLE(X509V3_EXT_METHOD *method,
|
||||
char *i2s_ASN1_ENUMERATED_TABLE(X509V3_EXT_METHOD *method,
|
||||
const ASN1_ENUMERATED *e)
|
||||
{
|
||||
ENUMERATED_NAMES *enam;
|
||||
|
||||
@@ -74,14 +74,17 @@ static void *v2i_EXTENDED_KEY_USAGE(const X509V3_EXT_METHOD *method,
|
||||
char *extval;
|
||||
ASN1_OBJECT *objtmp;
|
||||
CONF_VALUE *val;
|
||||
const int num = sk_CONF_VALUE_num(nval);
|
||||
int i;
|
||||
|
||||
if ((extku = sk_ASN1_OBJECT_new_null()) == NULL) {
|
||||
extku = sk_ASN1_OBJECT_new_reserve(NULL, num);
|
||||
if (extku == NULL) {
|
||||
X509V3err(X509V3_F_V2I_EXTENDED_KEY_USAGE, ERR_R_MALLOC_FAILURE);
|
||||
sk_ASN1_OBJECT_free(extku);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
|
||||
for (i = 0; i < num; i++) {
|
||||
val = sk_CONF_VALUE_value(nval, i);
|
||||
if (val->value)
|
||||
extval = val->value;
|
||||
@@ -94,7 +97,7 @@ static void *v2i_EXTENDED_KEY_USAGE(const X509V3_EXT_METHOD *method,
|
||||
X509V3_conf_err(val);
|
||||
return NULL;
|
||||
}
|
||||
sk_ASN1_OBJECT_push(extku, objtmp);
|
||||
sk_ASN1_OBJECT_push(extku, objtmp); /* no failure as it was reserved */
|
||||
}
|
||||
return extku;
|
||||
}
|
||||
+8
-10
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 1999-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
* Copyright 1999-2017 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
@@ -78,16 +78,13 @@ static STACK_OF(CONF_VALUE) *i2v_AUTHORITY_INFO_ACCESS(
|
||||
tret = tmp;
|
||||
vtmp = sk_CONF_VALUE_value(tret, i);
|
||||
i2t_ASN1_OBJECT(objtmp, sizeof(objtmp), desc->method);
|
||||
nlen = strlen(objtmp) + strlen(vtmp->name) + 5;
|
||||
nlen = strlen(objtmp) + 3 + strlen(vtmp->name) + 1;
|
||||
ntmp = OPENSSL_malloc(nlen);
|
||||
if (ntmp == NULL)
|
||||
goto err;
|
||||
OPENSSL_strlcpy(ntmp, objtmp, nlen);
|
||||
OPENSSL_strlcat(ntmp, " - ", nlen);
|
||||
OPENSSL_strlcat(ntmp, vtmp->name, nlen);
|
||||
BIO_snprintf(ntmp, nlen, "%s - %s", objtmp, vtmp->name);
|
||||
OPENSSL_free(vtmp->name);
|
||||
vtmp->name = ntmp;
|
||||
|
||||
}
|
||||
if (ret == NULL && tret == NULL)
|
||||
return sk_CONF_VALUE_new_null();
|
||||
@@ -110,20 +107,21 @@ static AUTHORITY_INFO_ACCESS *v2i_AUTHORITY_INFO_ACCESS(X509V3_EXT_METHOD
|
||||
CONF_VALUE *cnf, ctmp;
|
||||
ACCESS_DESCRIPTION *acc;
|
||||
int i, objlen;
|
||||
const int num = sk_CONF_VALUE_num(nval);
|
||||
char *objtmp, *ptmp;
|
||||
|
||||
if ((ainfo = sk_ACCESS_DESCRIPTION_new_null()) == NULL) {
|
||||
if ((ainfo = sk_ACCESS_DESCRIPTION_new_reserve(NULL, num)) == NULL) {
|
||||
X509V3err(X509V3_F_V2I_AUTHORITY_INFO_ACCESS, ERR_R_MALLOC_FAILURE);
|
||||
return NULL;
|
||||
}
|
||||
for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
|
||||
for (i = 0; i < num; i++) {
|
||||
cnf = sk_CONF_VALUE_value(nval, i);
|
||||
if ((acc = ACCESS_DESCRIPTION_new()) == NULL
|
||||
|| !sk_ACCESS_DESCRIPTION_push(ainfo, acc)) {
|
||||
if ((acc = ACCESS_DESCRIPTION_new()) == NULL) {
|
||||
X509V3err(X509V3_F_V2I_AUTHORITY_INFO_ACCESS,
|
||||
ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
sk_ACCESS_DESCRIPTION_push(ainfo, acc); /* Cannot fail due to reserve */
|
||||
ptmp = strchr(cnf->name, ';');
|
||||
if (!ptmp) {
|
||||
X509V3err(X509V3_F_V2I_AUTHORITY_INFO_ACCESS,
|
||||
|
||||
+1
-67
@@ -47,73 +47,7 @@ DECLARE_OBJ_BSEARCH_CMP_FN(const X509V3_EXT_METHOD *,
|
||||
IMPLEMENT_OBJ_BSEARCH_CMP_FN(const X509V3_EXT_METHOD *,
|
||||
const X509V3_EXT_METHOD *, ext);
|
||||
|
||||
/*
|
||||
* This table will be searched using OBJ_bsearch so it *must* kept in order
|
||||
* of the ext_nid values.
|
||||
*/
|
||||
|
||||
static const X509V3_EXT_METHOD *standard_exts[] = {
|
||||
&v3_nscert,
|
||||
&v3_ns_ia5_list[0],
|
||||
&v3_ns_ia5_list[1],
|
||||
&v3_ns_ia5_list[2],
|
||||
&v3_ns_ia5_list[3],
|
||||
&v3_ns_ia5_list[4],
|
||||
&v3_ns_ia5_list[5],
|
||||
&v3_ns_ia5_list[6],
|
||||
&v3_skey_id,
|
||||
&v3_key_usage,
|
||||
&v3_pkey_usage_period,
|
||||
&v3_alt[0],
|
||||
&v3_alt[1],
|
||||
&v3_bcons,
|
||||
&v3_crl_num,
|
||||
&v3_cpols,
|
||||
&v3_akey_id,
|
||||
&v3_crld,
|
||||
&v3_ext_ku,
|
||||
&v3_delta_crl,
|
||||
&v3_crl_reason,
|
||||
#ifndef OPENSSL_NO_OCSP
|
||||
&v3_crl_invdate,
|
||||
#endif
|
||||
&v3_sxnet,
|
||||
&v3_info,
|
||||
#ifndef OPENSSL_NO_RFC3779
|
||||
&v3_addr,
|
||||
&v3_asid,
|
||||
#endif
|
||||
#ifndef OPENSSL_NO_OCSP
|
||||
&v3_ocsp_nonce,
|
||||
&v3_ocsp_crlid,
|
||||
&v3_ocsp_accresp,
|
||||
&v3_ocsp_nocheck,
|
||||
&v3_ocsp_acutoff,
|
||||
&v3_ocsp_serviceloc,
|
||||
#endif
|
||||
&v3_sinfo,
|
||||
&v3_policy_constraints,
|
||||
#ifndef OPENSSL_NO_OCSP
|
||||
&v3_crl_hold,
|
||||
#endif
|
||||
&v3_pci,
|
||||
&v3_name_constraints,
|
||||
&v3_policy_mappings,
|
||||
&v3_inhibit_anyp,
|
||||
&v3_idp,
|
||||
&v3_alt[2],
|
||||
&v3_freshest_crl,
|
||||
#ifndef OPENSSL_NO_CT
|
||||
&v3_ct_scts[0],
|
||||
&v3_ct_scts[1],
|
||||
&v3_ct_scts[2],
|
||||
#endif
|
||||
&v3_tls_feature,
|
||||
};
|
||||
|
||||
/* Number of standard extensions */
|
||||
|
||||
#define STANDARD_EXTENSION_COUNT OSSL_NELEM(standard_exts)
|
||||
#include "standard_exts.h"
|
||||
|
||||
const X509V3_EXT_METHOD *X509V3_EXT_get_nid(int nid)
|
||||
{
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2003-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
* Copyright 2003-2017 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
@@ -7,9 +7,9 @@
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "internal/cryptlib.h"
|
||||
#include "internal/numbers.h"
|
||||
#include <stdio.h>
|
||||
#include "internal/asn1_int.h"
|
||||
#include <openssl/asn1t.h>
|
||||
#include <openssl/conf.h>
|
||||
@@ -316,6 +316,7 @@ int NAME_CONSTRAINTS_check_CN(X509 *x, NAME_CONSTRAINTS *nc)
|
||||
for (i = -1;;) {
|
||||
X509_NAME_ENTRY *ne;
|
||||
ASN1_STRING *hn;
|
||||
|
||||
i = X509_NAME_get_index_by_NID(nm, NID_commonName, i);
|
||||
if (i == -1)
|
||||
break;
|
||||
|
||||
@@ -7,7 +7,11 @@
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
/* Copyright (c) 2004 Kungliga Tekniska Högskolan
|
||||
/*
|
||||
* This file is dual-licensed and is also available under the following
|
||||
* terms:
|
||||
*
|
||||
* Copyright (c) 2004 Kungliga Tekniska Högskolan
|
||||
* (Royal Institute of Technology, Stockholm, Sweden).
|
||||
* All rights reserved.
|
||||
*
|
||||
|
||||
@@ -7,7 +7,11 @@
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
/* Copyright (c) 2004 Kungliga Tekniska Högskolan
|
||||
/*
|
||||
* This file is dual-licensed and is also available under the following
|
||||
* terms:
|
||||
*
|
||||
* Copyright (c) 2004 Kungliga Tekniska Högskolan
|
||||
* (Royal Institute of Technology, Stockholm, Sweden).
|
||||
* All rights reserved.
|
||||
*
|
||||
|
||||
+1
-14
@@ -17,10 +17,7 @@
|
||||
static int i2r_PKEY_USAGE_PERIOD(X509V3_EXT_METHOD *method,
|
||||
PKEY_USAGE_PERIOD *usage, BIO *out,
|
||||
int indent);
|
||||
/*
|
||||
* static PKEY_USAGE_PERIOD *v2i_PKEY_USAGE_PERIOD(X509V3_EXT_METHOD *method,
|
||||
* X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *values);
|
||||
*/
|
||||
|
||||
const X509V3_EXT_METHOD v3_pkey_usage_period = {
|
||||
NID_private_key_usage_period, 0, ASN1_ITEM_ref(PKEY_USAGE_PERIOD),
|
||||
0, 0, 0, 0,
|
||||
@@ -53,13 +50,3 @@ static int i2r_PKEY_USAGE_PERIOD(X509V3_EXT_METHOD *method,
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*-
|
||||
static PKEY_USAGE_PERIOD *v2i_PKEY_USAGE_PERIOD(method, ctx, values)
|
||||
X509V3_EXT_METHOD *method;
|
||||
X509V3_CTX *ctx;
|
||||
STACK_OF(CONF_VALUE) *values;
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
*/
|
||||
@@ -52,6 +52,7 @@ static STACK_OF(CONF_VALUE) *i2v_POLICY_MAPPINGS(const X509V3_EXT_METHOD
|
||||
int i;
|
||||
char obj_tmp1[80];
|
||||
char obj_tmp2[80];
|
||||
|
||||
for (i = 0; i < sk_POLICY_MAPPING_num(pmaps); i++) {
|
||||
pmap = sk_POLICY_MAPPING_value(pmaps, i);
|
||||
i2t_ASN1_OBJECT(obj_tmp1, 80, pmap->issuerDomainPolicy);
|
||||
@@ -64,18 +65,19 @@ static STACK_OF(CONF_VALUE) *i2v_POLICY_MAPPINGS(const X509V3_EXT_METHOD
|
||||
static void *v2i_POLICY_MAPPINGS(const X509V3_EXT_METHOD *method,
|
||||
X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval)
|
||||
{
|
||||
POLICY_MAPPINGS *pmaps = NULL;
|
||||
POLICY_MAPPING *pmap = NULL;
|
||||
ASN1_OBJECT *obj1 = NULL, *obj2 = NULL;
|
||||
CONF_VALUE *val;
|
||||
POLICY_MAPPINGS *pmaps;
|
||||
const int num = sk_CONF_VALUE_num(nval);
|
||||
int i;
|
||||
|
||||
if ((pmaps = sk_POLICY_MAPPING_new_null()) == NULL) {
|
||||
if ((pmaps = sk_POLICY_MAPPING_new_reserve(NULL, num)) == NULL) {
|
||||
X509V3err(X509V3_F_V2I_POLICY_MAPPINGS, ERR_R_MALLOC_FAILURE);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (i = 0; i < sk_CONF_VALUE_num(nval); i++) {
|
||||
for (i = 0; i < num; i++) {
|
||||
val = sk_CONF_VALUE_value(nval, i);
|
||||
if (!val->value || !val->name) {
|
||||
X509V3err(X509V3_F_V2I_POLICY_MAPPINGS,
|
||||
@@ -99,7 +101,7 @@ static void *v2i_POLICY_MAPPINGS(const X509V3_EXT_METHOD *method,
|
||||
pmap->issuerDomainPolicy = obj1;
|
||||
pmap->subjectDomainPolicy = obj2;
|
||||
obj1 = obj2 = NULL;
|
||||
sk_POLICY_MAPPING_push(pmaps, pmap);
|
||||
sk_POLICY_MAPPING_push(pmaps, pmap); /* no failure as it was reserved */
|
||||
}
|
||||
return pmaps;
|
||||
err:
|
||||
|
||||
@@ -488,6 +488,7 @@ static void x509v3_cache_extensions(X509 *x)
|
||||
break;
|
||||
}
|
||||
}
|
||||
x509_init_sig_info(x);
|
||||
x->ex_flags |= EXFLAG_SET;
|
||||
}
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ const X509V3_EXT_METHOD v3_skey_id = {
|
||||
NULL
|
||||
};
|
||||
|
||||
char *i2s_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method,
|
||||
char *i2s_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method,
|
||||
const ASN1_OCTET_STRING *oct)
|
||||
{
|
||||
return OPENSSL_buf2hexstr(oct->data, oct->length);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
* Copyright 2015-2017 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
@@ -7,8 +7,9 @@
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "e_os.h"
|
||||
#include "internal/cryptlib.h"
|
||||
#include <stdio.h>
|
||||
#include "internal/o_str.h"
|
||||
#include <openssl/asn1t.h>
|
||||
#include <openssl/conf.h>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 1999-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
* Copyright 1999-2017 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
@@ -9,9 +9,10 @@
|
||||
|
||||
/* X509 v3 extension utilities */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include "e_os.h"
|
||||
#include "internal/cryptlib.h"
|
||||
#include <stdio.h>
|
||||
#include "internal/ctype.h"
|
||||
#include <openssl/conf.h>
|
||||
#include <openssl/crypto.h>
|
||||
#include <openssl/x509v3.h>
|
||||
@@ -377,12 +378,12 @@ static char *strip_spaces(char *name)
|
||||
char *p, *q;
|
||||
/* Skip over leading spaces */
|
||||
p = name;
|
||||
while (*p && isspace((unsigned char)*p))
|
||||
while (*p && ossl_isspace(*p))
|
||||
p++;
|
||||
if (!*p)
|
||||
return NULL;
|
||||
q = p + strlen(p) - 1;
|
||||
while ((q != p) && isspace((unsigned char)*q))
|
||||
while ((q != p) && ossl_isspace(*q))
|
||||
q--;
|
||||
if (p != q)
|
||||
q[1] = 0;
|
||||
@@ -467,11 +468,11 @@ static STACK_OF(OPENSSL_STRING) *get_email(X509_NAME *name,
|
||||
{
|
||||
STACK_OF(OPENSSL_STRING) *ret = NULL;
|
||||
X509_NAME_ENTRY *ne;
|
||||
ASN1_IA5STRING *email;
|
||||
const ASN1_IA5STRING *email;
|
||||
GENERAL_NAME *gen;
|
||||
int i;
|
||||
int i = -1;
|
||||
|
||||
/* Now add any email address(es) to STACK */
|
||||
i = -1;
|
||||
/* First supplied X509_NAME */
|
||||
while ((i = X509_NAME_get_index_by_NID(name,
|
||||
NID_pkcs9_emailAddress, i)) >= 0) {
|
||||
|
||||
@@ -1,79 +0,0 @@
|
||||
/*
|
||||
* Copyright 1999-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include "internal/cryptlib.h"
|
||||
#include <openssl/asn1.h>
|
||||
#include <openssl/conf.h>
|
||||
#include <openssl/x509.h>
|
||||
#include <openssl/x509v3.h>
|
||||
|
||||
/* Test application to add extensions from a config file */
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
LHASH *conf;
|
||||
X509 *cert;
|
||||
FILE *inf;
|
||||
char *conf_file;
|
||||
int i;
|
||||
int count;
|
||||
X509_EXTENSION *ext;
|
||||
X509V3_add_standard_extensions();
|
||||
ERR_load_crypto_strings();
|
||||
if (!argv[1]) {
|
||||
fprintf(stderr, "Usage: v3conf cert.pem [file.cnf]\n");
|
||||
exit(1);
|
||||
}
|
||||
conf_file = argv[2];
|
||||
if (!conf_file)
|
||||
conf_file = "test.cnf";
|
||||
conf = CONF_load(NULL, "test.cnf", NULL);
|
||||
if (!conf) {
|
||||
fprintf(stderr, "Error opening Config file %s\n", conf_file);
|
||||
ERR_print_errors_fp(stderr);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
inf = fopen(argv[1], "r");
|
||||
if (!inf) {
|
||||
fprintf(stderr, "Can't open certificate file %s\n", argv[1]);
|
||||
exit(1);
|
||||
}
|
||||
cert = PEM_read_X509(inf, NULL, NULL);
|
||||
if (!cert) {
|
||||
fprintf(stderr, "Error reading certificate file %s\n", argv[1]);
|
||||
exit(1);
|
||||
}
|
||||
fclose(inf);
|
||||
|
||||
sk_pop_free(cert->cert_info->extensions, X509_EXTENSION_free);
|
||||
cert->cert_info->extensions = NULL;
|
||||
|
||||
if (!X509V3_EXT_add_conf(conf, NULL, "test_section", cert)) {
|
||||
fprintf(stderr, "Error adding extensions\n");
|
||||
ERR_print_errors_fp(stderr);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
count = X509_get_ext_count(cert);
|
||||
printf("%d extensions\n", count);
|
||||
for (i = 0; i < count; i++) {
|
||||
ext = X509_get_ext(cert, i);
|
||||
printf("%s", OBJ_nid2ln(OBJ_obj2nid(ext->object)));
|
||||
if (ext->critical)
|
||||
printf(",critical:\n");
|
||||
else
|
||||
printf(":\n");
|
||||
X509V3_EXT_print_fp(stdout, ext, 0, 0);
|
||||
printf("\n");
|
||||
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
+215
-153
@@ -8,168 +8,231 @@
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <openssl/err.h>
|
||||
#include <openssl/x509v3.h>
|
||||
#include <openssl/x509v3err.h>
|
||||
|
||||
/* BEGIN ERROR CODES */
|
||||
#ifndef OPENSSL_NO_ERR
|
||||
|
||||
# define ERR_FUNC(func) ERR_PACK(ERR_LIB_X509V3,func,0)
|
||||
# define ERR_REASON(reason) ERR_PACK(ERR_LIB_X509V3,0,reason)
|
||||
|
||||
static ERR_STRING_DATA X509V3_str_functs[] = {
|
||||
{ERR_FUNC(X509V3_F_A2I_GENERAL_NAME), "a2i_GENERAL_NAME"},
|
||||
{ERR_FUNC(X509V3_F_ADDR_VALIDATE_PATH_INTERNAL),
|
||||
static const ERR_STRING_DATA X509V3_str_functs[] = {
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_A2I_GENERAL_NAME, 0),
|
||||
"a2i_GENERAL_NAME"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_ADDR_VALIDATE_PATH_INTERNAL, 0),
|
||||
"addr_validate_path_internal"},
|
||||
{ERR_FUNC(X509V3_F_ASIDENTIFIERCHOICE_CANONIZE),
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_ASIDENTIFIERCHOICE_CANONIZE, 0),
|
||||
"ASIdentifierChoice_canonize"},
|
||||
{ERR_FUNC(X509V3_F_ASIDENTIFIERCHOICE_IS_CANONICAL),
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_ASIDENTIFIERCHOICE_IS_CANONICAL, 0),
|
||||
"ASIdentifierChoice_is_canonical"},
|
||||
{ERR_FUNC(X509V3_F_BIGNUM_TO_STRING), "bignum_to_string"},
|
||||
{ERR_FUNC(X509V3_F_COPY_EMAIL), "copy_email"},
|
||||
{ERR_FUNC(X509V3_F_COPY_ISSUER), "copy_issuer"},
|
||||
{ERR_FUNC(X509V3_F_DO_DIRNAME), "do_dirname"},
|
||||
{ERR_FUNC(X509V3_F_DO_EXT_I2D), "do_ext_i2d"},
|
||||
{ERR_FUNC(X509V3_F_DO_EXT_NCONF), "do_ext_nconf"},
|
||||
{ERR_FUNC(X509V3_F_GNAMES_FROM_SECTNAME), "gnames_from_sectname"},
|
||||
{ERR_FUNC(X509V3_F_I2S_ASN1_ENUMERATED), "i2s_ASN1_ENUMERATED"},
|
||||
{ERR_FUNC(X509V3_F_I2S_ASN1_IA5STRING), "i2s_ASN1_IA5STRING"},
|
||||
{ERR_FUNC(X509V3_F_I2S_ASN1_INTEGER), "i2s_ASN1_INTEGER"},
|
||||
{ERR_FUNC(X509V3_F_I2V_AUTHORITY_INFO_ACCESS),
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_BIGNUM_TO_STRING, 0),
|
||||
"bignum_to_string"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_COPY_EMAIL, 0), "copy_email"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_COPY_ISSUER, 0), "copy_issuer"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_DO_DIRNAME, 0), "do_dirname"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_DO_EXT_I2D, 0), "do_ext_i2d"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_DO_EXT_NCONF, 0), "do_ext_nconf"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_GNAMES_FROM_SECTNAME, 0),
|
||||
"gnames_from_sectname"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_I2S_ASN1_ENUMERATED, 0),
|
||||
"i2s_ASN1_ENUMERATED"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_I2S_ASN1_IA5STRING, 0),
|
||||
"i2s_ASN1_IA5STRING"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_I2S_ASN1_INTEGER, 0),
|
||||
"i2s_ASN1_INTEGER"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_I2V_AUTHORITY_INFO_ACCESS, 0),
|
||||
"i2v_AUTHORITY_INFO_ACCESS"},
|
||||
{ERR_FUNC(X509V3_F_NOTICE_SECTION), "notice_section"},
|
||||
{ERR_FUNC(X509V3_F_NREF_NOS), "nref_nos"},
|
||||
{ERR_FUNC(X509V3_F_POLICY_SECTION), "policy_section"},
|
||||
{ERR_FUNC(X509V3_F_PROCESS_PCI_VALUE), "process_pci_value"},
|
||||
{ERR_FUNC(X509V3_F_R2I_CERTPOL), "r2i_certpol"},
|
||||
{ERR_FUNC(X509V3_F_R2I_PCI), "r2i_pci"},
|
||||
{ERR_FUNC(X509V3_F_S2I_ASN1_IA5STRING), "s2i_ASN1_IA5STRING"},
|
||||
{ERR_FUNC(X509V3_F_S2I_ASN1_INTEGER), "s2i_ASN1_INTEGER"},
|
||||
{ERR_FUNC(X509V3_F_S2I_ASN1_OCTET_STRING), "s2i_ASN1_OCTET_STRING"},
|
||||
{ERR_FUNC(X509V3_F_S2I_SKEY_ID), "s2i_skey_id"},
|
||||
{ERR_FUNC(X509V3_F_SET_DIST_POINT_NAME), "set_dist_point_name"},
|
||||
{ERR_FUNC(X509V3_F_SXNET_ADD_ID_ASC), "SXNET_add_id_asc"},
|
||||
{ERR_FUNC(X509V3_F_SXNET_ADD_ID_INTEGER), "SXNET_add_id_INTEGER"},
|
||||
{ERR_FUNC(X509V3_F_SXNET_ADD_ID_ULONG), "SXNET_add_id_ulong"},
|
||||
{ERR_FUNC(X509V3_F_SXNET_GET_ID_ASC), "SXNET_get_id_asc"},
|
||||
{ERR_FUNC(X509V3_F_SXNET_GET_ID_ULONG), "SXNET_get_id_ulong"},
|
||||
{ERR_FUNC(X509V3_F_V2I_ASIDENTIFIERS), "v2i_ASIdentifiers"},
|
||||
{ERR_FUNC(X509V3_F_V2I_ASN1_BIT_STRING), "v2i_ASN1_BIT_STRING"},
|
||||
{ERR_FUNC(X509V3_F_V2I_AUTHORITY_INFO_ACCESS),
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_NOTICE_SECTION, 0), "notice_section"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_NREF_NOS, 0), "nref_nos"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_POLICY_SECTION, 0), "policy_section"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_PROCESS_PCI_VALUE, 0),
|
||||
"process_pci_value"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_R2I_CERTPOL, 0), "r2i_certpol"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_R2I_PCI, 0), "r2i_pci"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_S2I_ASN1_IA5STRING, 0),
|
||||
"s2i_ASN1_IA5STRING"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_S2I_ASN1_INTEGER, 0),
|
||||
"s2i_ASN1_INTEGER"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_S2I_ASN1_OCTET_STRING, 0),
|
||||
"s2i_ASN1_OCTET_STRING"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_S2I_SKEY_ID, 0), "s2i_skey_id"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_SET_DIST_POINT_NAME, 0),
|
||||
"set_dist_point_name"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_SXNET_ADD_ID_ASC, 0),
|
||||
"SXNET_add_id_asc"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_SXNET_ADD_ID_INTEGER, 0),
|
||||
"SXNET_add_id_INTEGER"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_SXNET_ADD_ID_ULONG, 0),
|
||||
"SXNET_add_id_ulong"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_SXNET_GET_ID_ASC, 0),
|
||||
"SXNET_get_id_asc"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_SXNET_GET_ID_ULONG, 0),
|
||||
"SXNET_get_id_ulong"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_V2I_ASIDENTIFIERS, 0),
|
||||
"v2i_ASIdentifiers"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_V2I_ASN1_BIT_STRING, 0),
|
||||
"v2i_ASN1_BIT_STRING"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_V2I_AUTHORITY_INFO_ACCESS, 0),
|
||||
"v2i_AUTHORITY_INFO_ACCESS"},
|
||||
{ERR_FUNC(X509V3_F_V2I_AUTHORITY_KEYID), "v2i_AUTHORITY_KEYID"},
|
||||
{ERR_FUNC(X509V3_F_V2I_BASIC_CONSTRAINTS), "v2i_BASIC_CONSTRAINTS"},
|
||||
{ERR_FUNC(X509V3_F_V2I_CRLD), "v2i_crld"},
|
||||
{ERR_FUNC(X509V3_F_V2I_EXTENDED_KEY_USAGE), "v2i_EXTENDED_KEY_USAGE"},
|
||||
{ERR_FUNC(X509V3_F_V2I_GENERAL_NAMES), "v2i_GENERAL_NAMES"},
|
||||
{ERR_FUNC(X509V3_F_V2I_GENERAL_NAME_EX), "v2i_GENERAL_NAME_ex"},
|
||||
{ERR_FUNC(X509V3_F_V2I_IDP), "v2i_idp"},
|
||||
{ERR_FUNC(X509V3_F_V2I_IPADDRBLOCKS), "v2i_IPAddrBlocks"},
|
||||
{ERR_FUNC(X509V3_F_V2I_ISSUER_ALT), "v2i_issuer_alt"},
|
||||
{ERR_FUNC(X509V3_F_V2I_NAME_CONSTRAINTS), "v2i_NAME_CONSTRAINTS"},
|
||||
{ERR_FUNC(X509V3_F_V2I_POLICY_CONSTRAINTS), "v2i_POLICY_CONSTRAINTS"},
|
||||
{ERR_FUNC(X509V3_F_V2I_POLICY_MAPPINGS), "v2i_POLICY_MAPPINGS"},
|
||||
{ERR_FUNC(X509V3_F_V2I_SUBJECT_ALT), "v2i_subject_alt"},
|
||||
{ERR_FUNC(X509V3_F_V2I_TLS_FEATURE), "v2i_TLS_FEATURE"},
|
||||
{ERR_FUNC(X509V3_F_V3_GENERIC_EXTENSION), "v3_generic_extension"},
|
||||
{ERR_FUNC(X509V3_F_X509V3_ADD1_I2D), "X509V3_add1_i2d"},
|
||||
{ERR_FUNC(X509V3_F_X509V3_ADD_VALUE), "X509V3_add_value"},
|
||||
{ERR_FUNC(X509V3_F_X509V3_EXT_ADD), "X509V3_EXT_add"},
|
||||
{ERR_FUNC(X509V3_F_X509V3_EXT_ADD_ALIAS), "X509V3_EXT_add_alias"},
|
||||
{ERR_FUNC(X509V3_F_X509V3_EXT_I2D), "X509V3_EXT_i2d"},
|
||||
{ERR_FUNC(X509V3_F_X509V3_EXT_NCONF), "X509V3_EXT_nconf"},
|
||||
{ERR_FUNC(X509V3_F_X509V3_GET_SECTION), "X509V3_get_section"},
|
||||
{ERR_FUNC(X509V3_F_X509V3_GET_STRING), "X509V3_get_string"},
|
||||
{ERR_FUNC(X509V3_F_X509V3_GET_VALUE_BOOL), "X509V3_get_value_bool"},
|
||||
{ERR_FUNC(X509V3_F_X509V3_PARSE_LIST), "X509V3_parse_list"},
|
||||
{ERR_FUNC(X509V3_F_X509_PURPOSE_ADD), "X509_PURPOSE_add"},
|
||||
{ERR_FUNC(X509V3_F_X509_PURPOSE_SET), "X509_PURPOSE_set"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_V2I_AUTHORITY_KEYID, 0),
|
||||
"v2i_AUTHORITY_KEYID"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_V2I_BASIC_CONSTRAINTS, 0),
|
||||
"v2i_BASIC_CONSTRAINTS"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_V2I_CRLD, 0), "v2i_crld"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_V2I_EXTENDED_KEY_USAGE, 0),
|
||||
"v2i_EXTENDED_KEY_USAGE"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_V2I_GENERAL_NAMES, 0),
|
||||
"v2i_GENERAL_NAMES"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_V2I_GENERAL_NAME_EX, 0),
|
||||
"v2i_GENERAL_NAME_ex"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_V2I_IDP, 0), "v2i_idp"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_V2I_IPADDRBLOCKS, 0),
|
||||
"v2i_IPAddrBlocks"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_V2I_ISSUER_ALT, 0), "v2i_issuer_alt"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_V2I_NAME_CONSTRAINTS, 0),
|
||||
"v2i_NAME_CONSTRAINTS"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_V2I_POLICY_CONSTRAINTS, 0),
|
||||
"v2i_POLICY_CONSTRAINTS"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_V2I_POLICY_MAPPINGS, 0),
|
||||
"v2i_POLICY_MAPPINGS"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_V2I_SUBJECT_ALT, 0), "v2i_subject_alt"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_V2I_TLS_FEATURE, 0), "v2i_TLS_FEATURE"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_V3_GENERIC_EXTENSION, 0),
|
||||
"v3_generic_extension"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_X509V3_ADD1_I2D, 0), "X509V3_add1_i2d"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_X509V3_ADD_VALUE, 0),
|
||||
"X509V3_add_value"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_X509V3_EXT_ADD, 0), "X509V3_EXT_add"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_X509V3_EXT_ADD_ALIAS, 0),
|
||||
"X509V3_EXT_add_alias"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_X509V3_EXT_I2D, 0), "X509V3_EXT_i2d"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_X509V3_EXT_NCONF, 0),
|
||||
"X509V3_EXT_nconf"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_X509V3_GET_SECTION, 0),
|
||||
"X509V3_get_section"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_X509V3_GET_STRING, 0),
|
||||
"X509V3_get_string"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_X509V3_GET_VALUE_BOOL, 0),
|
||||
"X509V3_get_value_bool"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_X509V3_PARSE_LIST, 0),
|
||||
"X509V3_parse_list"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_X509_PURPOSE_ADD, 0),
|
||||
"X509_PURPOSE_add"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, X509V3_F_X509_PURPOSE_SET, 0),
|
||||
"X509_PURPOSE_set"},
|
||||
{0, NULL}
|
||||
};
|
||||
|
||||
static ERR_STRING_DATA X509V3_str_reasons[] = {
|
||||
{ERR_REASON(X509V3_R_BAD_IP_ADDRESS), "bad ip address"},
|
||||
{ERR_REASON(X509V3_R_BAD_OBJECT), "bad object"},
|
||||
{ERR_REASON(X509V3_R_BN_DEC2BN_ERROR), "bn dec2bn error"},
|
||||
{ERR_REASON(X509V3_R_BN_TO_ASN1_INTEGER_ERROR),
|
||||
"bn to asn1 integer error"},
|
||||
{ERR_REASON(X509V3_R_DIRNAME_ERROR), "dirname error"},
|
||||
{ERR_REASON(X509V3_R_DISTPOINT_ALREADY_SET), "distpoint already set"},
|
||||
{ERR_REASON(X509V3_R_DUPLICATE_ZONE_ID), "duplicate zone id"},
|
||||
{ERR_REASON(X509V3_R_ERROR_CONVERTING_ZONE), "error converting zone"},
|
||||
{ERR_REASON(X509V3_R_ERROR_CREATING_EXTENSION),
|
||||
"error creating extension"},
|
||||
{ERR_REASON(X509V3_R_ERROR_IN_EXTENSION), "error in extension"},
|
||||
{ERR_REASON(X509V3_R_EXPECTED_A_SECTION_NAME), "expected a section name"},
|
||||
{ERR_REASON(X509V3_R_EXTENSION_EXISTS), "extension exists"},
|
||||
{ERR_REASON(X509V3_R_EXTENSION_NAME_ERROR), "extension name error"},
|
||||
{ERR_REASON(X509V3_R_EXTENSION_NOT_FOUND), "extension not found"},
|
||||
{ERR_REASON(X509V3_R_EXTENSION_SETTING_NOT_SUPPORTED),
|
||||
"extension setting not supported"},
|
||||
{ERR_REASON(X509V3_R_EXTENSION_VALUE_ERROR), "extension value error"},
|
||||
{ERR_REASON(X509V3_R_ILLEGAL_EMPTY_EXTENSION), "illegal empty extension"},
|
||||
{ERR_REASON(X509V3_R_INCORRECT_POLICY_SYNTAX_TAG),
|
||||
"incorrect policy syntax tag"},
|
||||
{ERR_REASON(X509V3_R_INVALID_ASNUMBER), "invalid asnumber"},
|
||||
{ERR_REASON(X509V3_R_INVALID_ASRANGE), "invalid asrange"},
|
||||
{ERR_REASON(X509V3_R_INVALID_BOOLEAN_STRING), "invalid boolean string"},
|
||||
{ERR_REASON(X509V3_R_INVALID_EXTENSION_STRING),
|
||||
"invalid extension string"},
|
||||
{ERR_REASON(X509V3_R_INVALID_INHERITANCE), "invalid inheritance"},
|
||||
{ERR_REASON(X509V3_R_INVALID_IPADDRESS), "invalid ipaddress"},
|
||||
{ERR_REASON(X509V3_R_INVALID_MULTIPLE_RDNS), "invalid multiple rdns"},
|
||||
{ERR_REASON(X509V3_R_INVALID_NAME), "invalid name"},
|
||||
{ERR_REASON(X509V3_R_INVALID_NULL_ARGUMENT), "invalid null argument"},
|
||||
{ERR_REASON(X509V3_R_INVALID_NULL_NAME), "invalid null name"},
|
||||
{ERR_REASON(X509V3_R_INVALID_NULL_VALUE), "invalid null value"},
|
||||
{ERR_REASON(X509V3_R_INVALID_NUMBER), "invalid number"},
|
||||
{ERR_REASON(X509V3_R_INVALID_NUMBERS), "invalid numbers"},
|
||||
{ERR_REASON(X509V3_R_INVALID_OBJECT_IDENTIFIER),
|
||||
"invalid object identifier"},
|
||||
{ERR_REASON(X509V3_R_INVALID_OPTION), "invalid option"},
|
||||
{ERR_REASON(X509V3_R_INVALID_POLICY_IDENTIFIER),
|
||||
"invalid policy identifier"},
|
||||
{ERR_REASON(X509V3_R_INVALID_PROXY_POLICY_SETTING),
|
||||
"invalid proxy policy setting"},
|
||||
{ERR_REASON(X509V3_R_INVALID_PURPOSE), "invalid purpose"},
|
||||
{ERR_REASON(X509V3_R_INVALID_SAFI), "invalid safi"},
|
||||
{ERR_REASON(X509V3_R_INVALID_SECTION), "invalid section"},
|
||||
{ERR_REASON(X509V3_R_INVALID_SYNTAX), "invalid syntax"},
|
||||
{ERR_REASON(X509V3_R_ISSUER_DECODE_ERROR), "issuer decode error"},
|
||||
{ERR_REASON(X509V3_R_MISSING_VALUE), "missing value"},
|
||||
{ERR_REASON(X509V3_R_NEED_ORGANIZATION_AND_NUMBERS),
|
||||
"need organization and numbers"},
|
||||
{ERR_REASON(X509V3_R_NO_CONFIG_DATABASE), "no config database"},
|
||||
{ERR_REASON(X509V3_R_NO_ISSUER_CERTIFICATE), "no issuer certificate"},
|
||||
{ERR_REASON(X509V3_R_NO_ISSUER_DETAILS), "no issuer details"},
|
||||
{ERR_REASON(X509V3_R_NO_POLICY_IDENTIFIER), "no policy identifier"},
|
||||
{ERR_REASON(X509V3_R_NO_PROXY_CERT_POLICY_LANGUAGE_DEFINED),
|
||||
"no proxy cert policy language defined"},
|
||||
{ERR_REASON(X509V3_R_NO_PUBLIC_KEY), "no public key"},
|
||||
{ERR_REASON(X509V3_R_NO_SUBJECT_DETAILS), "no subject details"},
|
||||
{ERR_REASON(X509V3_R_OPERATION_NOT_DEFINED), "operation not defined"},
|
||||
{ERR_REASON(X509V3_R_OTHERNAME_ERROR), "othername error"},
|
||||
{ERR_REASON(X509V3_R_POLICY_LANGUAGE_ALREADY_DEFINED),
|
||||
"policy language already defined"},
|
||||
{ERR_REASON(X509V3_R_POLICY_PATH_LENGTH), "policy path length"},
|
||||
{ERR_REASON(X509V3_R_POLICY_PATH_LENGTH_ALREADY_DEFINED),
|
||||
"policy path length already defined"},
|
||||
{ERR_REASON(X509V3_R_POLICY_WHEN_PROXY_LANGUAGE_REQUIRES_NO_POLICY),
|
||||
"policy when proxy language requires no policy"},
|
||||
{ERR_REASON(X509V3_R_SECTION_NOT_FOUND), "section not found"},
|
||||
{ERR_REASON(X509V3_R_UNABLE_TO_GET_ISSUER_DETAILS),
|
||||
"unable to get issuer details"},
|
||||
{ERR_REASON(X509V3_R_UNABLE_TO_GET_ISSUER_KEYID),
|
||||
"unable to get issuer keyid"},
|
||||
{ERR_REASON(X509V3_R_UNKNOWN_BIT_STRING_ARGUMENT),
|
||||
"unknown bit string argument"},
|
||||
{ERR_REASON(X509V3_R_UNKNOWN_EXTENSION), "unknown extension"},
|
||||
{ERR_REASON(X509V3_R_UNKNOWN_EXTENSION_NAME), "unknown extension name"},
|
||||
{ERR_REASON(X509V3_R_UNKNOWN_OPTION), "unknown option"},
|
||||
{ERR_REASON(X509V3_R_UNSUPPORTED_OPTION), "unsupported option"},
|
||||
{ERR_REASON(X509V3_R_UNSUPPORTED_TYPE), "unsupported type"},
|
||||
{ERR_REASON(X509V3_R_USER_TOO_LONG), "user too long"},
|
||||
static const ERR_STRING_DATA X509V3_str_reasons[] = {
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_BAD_IP_ADDRESS), "bad ip address"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_BAD_OBJECT), "bad object"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_BN_DEC2BN_ERROR), "bn dec2bn error"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_BN_TO_ASN1_INTEGER_ERROR),
|
||||
"bn to asn1 integer error"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_DIRNAME_ERROR), "dirname error"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_DISTPOINT_ALREADY_SET),
|
||||
"distpoint already set"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_DUPLICATE_ZONE_ID),
|
||||
"duplicate zone id"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_ERROR_CONVERTING_ZONE),
|
||||
"error converting zone"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_ERROR_CREATING_EXTENSION),
|
||||
"error creating extension"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_ERROR_IN_EXTENSION),
|
||||
"error in extension"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_EXPECTED_A_SECTION_NAME),
|
||||
"expected a section name"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_EXTENSION_EXISTS),
|
||||
"extension exists"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_EXTENSION_NAME_ERROR),
|
||||
"extension name error"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_EXTENSION_NOT_FOUND),
|
||||
"extension not found"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_EXTENSION_SETTING_NOT_SUPPORTED),
|
||||
"extension setting not supported"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_EXTENSION_VALUE_ERROR),
|
||||
"extension value error"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_ILLEGAL_EMPTY_EXTENSION),
|
||||
"illegal empty extension"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_INCORRECT_POLICY_SYNTAX_TAG),
|
||||
"incorrect policy syntax tag"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_INVALID_ASNUMBER),
|
||||
"invalid asnumber"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_INVALID_ASRANGE), "invalid asrange"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_INVALID_BOOLEAN_STRING),
|
||||
"invalid boolean string"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_INVALID_EXTENSION_STRING),
|
||||
"invalid extension string"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_INVALID_INHERITANCE),
|
||||
"invalid inheritance"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_INVALID_IPADDRESS),
|
||||
"invalid ipaddress"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_INVALID_MULTIPLE_RDNS),
|
||||
"invalid multiple rdns"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_INVALID_NAME), "invalid name"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_INVALID_NULL_ARGUMENT),
|
||||
"invalid null argument"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_INVALID_NULL_NAME),
|
||||
"invalid null name"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_INVALID_NULL_VALUE),
|
||||
"invalid null value"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_INVALID_NUMBER), "invalid number"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_INVALID_NUMBERS), "invalid numbers"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_INVALID_OBJECT_IDENTIFIER),
|
||||
"invalid object identifier"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_INVALID_OPTION), "invalid option"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_INVALID_POLICY_IDENTIFIER),
|
||||
"invalid policy identifier"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_INVALID_PROXY_POLICY_SETTING),
|
||||
"invalid proxy policy setting"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_INVALID_PURPOSE), "invalid purpose"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_INVALID_SAFI), "invalid safi"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_INVALID_SECTION), "invalid section"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_INVALID_SYNTAX), "invalid syntax"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_ISSUER_DECODE_ERROR),
|
||||
"issuer decode error"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_MISSING_VALUE), "missing value"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_NEED_ORGANIZATION_AND_NUMBERS),
|
||||
"need organization and numbers"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_NO_CONFIG_DATABASE),
|
||||
"no config database"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_NO_ISSUER_CERTIFICATE),
|
||||
"no issuer certificate"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_NO_ISSUER_DETAILS),
|
||||
"no issuer details"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_NO_POLICY_IDENTIFIER),
|
||||
"no policy identifier"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_NO_PROXY_CERT_POLICY_LANGUAGE_DEFINED),
|
||||
"no proxy cert policy language defined"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_NO_PUBLIC_KEY), "no public key"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_NO_SUBJECT_DETAILS),
|
||||
"no subject details"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_OPERATION_NOT_DEFINED),
|
||||
"operation not defined"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_OTHERNAME_ERROR), "othername error"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_POLICY_LANGUAGE_ALREADY_DEFINED),
|
||||
"policy language already defined"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_POLICY_PATH_LENGTH),
|
||||
"policy path length"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_POLICY_PATH_LENGTH_ALREADY_DEFINED),
|
||||
"policy path length already defined"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_POLICY_WHEN_PROXY_LANGUAGE_REQUIRES_NO_POLICY),
|
||||
"policy when proxy language requires no policy"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_SECTION_NOT_FOUND),
|
||||
"section not found"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_UNABLE_TO_GET_ISSUER_DETAILS),
|
||||
"unable to get issuer details"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_UNABLE_TO_GET_ISSUER_KEYID),
|
||||
"unable to get issuer keyid"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_UNKNOWN_BIT_STRING_ARGUMENT),
|
||||
"unknown bit string argument"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_UNKNOWN_EXTENSION),
|
||||
"unknown extension"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_UNKNOWN_EXTENSION_NAME),
|
||||
"unknown extension name"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_UNKNOWN_OPTION), "unknown option"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_UNSUPPORTED_OPTION),
|
||||
"unsupported option"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_UNSUPPORTED_TYPE),
|
||||
"unsupported type"},
|
||||
{ERR_PACK(ERR_LIB_X509V3, 0, X509V3_R_USER_TOO_LONG), "user too long"},
|
||||
{0, NULL}
|
||||
};
|
||||
|
||||
@@ -178,10 +241,9 @@ static ERR_STRING_DATA X509V3_str_reasons[] = {
|
||||
int ERR_load_X509V3_strings(void)
|
||||
{
|
||||
#ifndef OPENSSL_NO_ERR
|
||||
|
||||
if (ERR_func_error_string(X509V3_str_functs[0].error) == NULL) {
|
||||
ERR_load_strings(0, X509V3_str_functs);
|
||||
ERR_load_strings(0, X509V3_str_reasons);
|
||||
ERR_load_strings_const(X509V3_str_functs);
|
||||
ERR_load_strings_const(X509V3_str_reasons);
|
||||
}
|
||||
#endif
|
||||
return 1;
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
/*
|
||||
* Copyright 1999-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the OpenSSL license (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <openssl/asn1.h>
|
||||
#include <openssl/conf.h>
|
||||
#include <openssl/x509.h>
|
||||
#include <openssl/x509v3.h>
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
X509 *cert;
|
||||
FILE *inf;
|
||||
int i, count;
|
||||
X509_EXTENSION *ext;
|
||||
|
||||
X509V3_add_standard_extensions();
|
||||
ERR_load_crypto_strings();
|
||||
if (!argv[1]) {
|
||||
fprintf(stderr, "Usage v3prin cert.pem\n");
|
||||
exit(1);
|
||||
}
|
||||
if ((inf = fopen(argv[1], "r")) == NULL) {
|
||||
fprintf(stderr, "Can't open %s\n", argv[1]);
|
||||
exit(1);
|
||||
}
|
||||
if ((cert = PEM_read_X509(inf, NULL, NULL)) == NULL) {
|
||||
fprintf(stderr, "Can't read certificate %s\n", argv[1]);
|
||||
ERR_print_errors_fp(stderr);
|
||||
exit(1);
|
||||
}
|
||||
fclose(inf);
|
||||
count = X509_get_ext_count(cert);
|
||||
printf("%d extensions\n", count);
|
||||
for (i = 0; i < count; i++) {
|
||||
ext = X509_get_ext(cert, i);
|
||||
printf("%s\n", OBJ_nid2ln(OBJ_obj2nid(ext->object)));
|
||||
if (!X509V3_EXT_print_fp(stdout, ext, 0, 0))
|
||||
ERR_print_errors_fp(stderr);
|
||||
printf("\n");
|
||||
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user