From 2743e38c2f4bcb00142d8c65e48a66f547033a64 Mon Sep 17 00:00:00 2001 From: "Dr. Stephen Henson" Date: Mon, 16 Mar 2015 17:43:17 +0000 Subject: [PATCH] make X509_NAME opaque Reviewed-by: Richard Levitte --- apps/ca.c | 2 +- crypto/asn1/Makefile | 17 +------ crypto/asn1/a_strex.c | 4 +- crypto/asn1/asn1_locl.h | 10 ---- crypto/asn1/tasn_prn.c | 2 +- crypto/include/internal/asn1_int.h | 10 ++++ crypto/include/internal/x509_int.h | 77 ++++++++++++++++++++++++++++++ crypto/x509/Makefile | 6 ++- crypto/x509/x509.h | 18 +------ crypto/x509/x509_cmp.c | 1 + crypto/x509/x509_obj.c | 1 + crypto/x509/x509name.c | 6 +++ crypto/{asn1 => x509}/x_name.c | 3 +- crypto/x509v3/v3_crld.c | 2 + crypto/x509v3/v3_ncons.c | 2 + 15 files changed, 113 insertions(+), 48 deletions(-) create mode 100644 crypto/include/internal/x509_int.h rename crypto/{asn1 => x509}/x_name.c (99%) diff --git a/apps/ca.c b/apps/ca.c index 9ef0ce31e6..b498b0a25a 100644 --- a/apps/ca.c +++ b/apps/ca.c @@ -1688,7 +1688,7 @@ static int do_body(X509 **xret, EVP_PKEY *pkey, X509 *x509, if (msie_hack) { /* assume all type should be strings */ - nid = OBJ_obj2nid(ne->object); + nid = OBJ_obj2nid(X509_NAME_ENTRY_get_object(ne)); if (str->type == V_ASN1_UNIVERSALSTRING) ASN1_UNIVERSALSTRING_to_string(str); diff --git a/crypto/asn1/Makefile b/crypto/asn1/Makefile index 6c7c22a050..2ce5f730d1 100644 --- a/crypto/asn1/Makefile +++ b/crypto/asn1/Makefile @@ -21,7 +21,7 @@ LIBSRC= a_object.c a_bitstr.c a_utctm.c a_gentm.c a_time.c a_int.c a_octet.c \ a_print.c a_type.c a_dup.c a_d2i_fp.c a_i2d_fp.c \ a_enum.c a_utf8.c a_sign.c a_digest.c a_verify.c a_mbstr.c a_strex.c \ x_algor.c x_val.c x_pubkey.c x_sig.c x_req.c x_bignum.c \ - x_long.c x_name.c x_x509.c x_x509a.c x_crl.c x_info.c x_spki.c nsseq.c \ + x_long.c x_x509.c x_x509a.c x_crl.c x_info.c x_spki.c nsseq.c \ x_nx509.c d2i_pu.c d2i_pr.c i2d_pu.c i2d_pr.c\ t_req.c t_x509.c t_x509a.c t_crl.c t_pkey.c t_spki.c t_bitst.c \ tasn_new.c tasn_fre.c tasn_enc.c tasn_dec.c tasn_utl.c tasn_typ.c \ @@ -35,7 +35,7 @@ LIBOBJ= a_object.o a_bitstr.o a_utctm.o a_gentm.o a_time.o a_int.o a_octet.o \ a_print.o a_type.o a_dup.o a_d2i_fp.o a_i2d_fp.o \ a_enum.o a_utf8.o a_sign.o a_digest.o a_verify.o a_mbstr.o a_strex.o \ x_algor.o x_val.o x_pubkey.o x_sig.o x_req.o x_bignum.o \ - x_long.o x_name.o x_x509.o x_x509a.o x_crl.o x_info.o x_spki.o nsseq.o \ + x_long.o x_x509.o x_x509a.o x_crl.o x_info.o x_spki.o nsseq.o \ x_nx509.o d2i_pu.o d2i_pr.o i2d_pu.o i2d_pr.o \ t_req.o t_x509.o t_x509a.o t_crl.o t_pkey.o t_spki.o t_bitst.o \ tasn_new.o tasn_fre.o tasn_enc.o tasn_dec.o tasn_utl.o tasn_typ.o \ @@ -781,19 +781,6 @@ x_long.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h x_long.o: ../../include/openssl/ossl_typ.h ../../include/openssl/safestack.h x_long.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h x_long.o: ../cryptlib.h x_long.c -x_name.o: ../../e_os.h ../../include/openssl/asn1.h -x_name.o: ../../include/openssl/asn1t.h ../../include/openssl/bio.h -x_name.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h -x_name.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h -x_name.o: ../../include/openssl/ecdh.h ../../include/openssl/ecdsa.h -x_name.o: ../../include/openssl/err.h ../../include/openssl/evp.h -x_name.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h -x_name.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h -x_name.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h -x_name.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h -x_name.o: ../../include/openssl/sha.h ../../include/openssl/stack.h -x_name.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h -x_name.o: ../../include/openssl/x509_vfy.h ../cryptlib.h asn1_locl.h x_name.c x_nx509.o: ../../include/openssl/asn1.h ../../include/openssl/asn1t.h x_nx509.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h x_nx509.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h diff --git a/crypto/asn1/a_strex.c b/crypto/asn1/a_strex.c index 1744853653..243e29a8fe 100644 --- a/crypto/asn1/a_strex.c +++ b/crypto/asn1/a_strex.c @@ -501,7 +501,7 @@ static int do_name_ex(char_io *io_ch, void *arg, X509_NAME *n, else ent = X509_NAME_get_entry(n, i); if (prev != -1) { - if (prev == ent->set) { + if (prev == X509_NAME_ENTRY_set(ent)) { if (!io_ch(arg, sep_mv, sep_mv_len)) return -1; outlen += sep_mv_len; @@ -514,7 +514,7 @@ static int do_name_ex(char_io *io_ch, void *arg, X509_NAME *n, outlen += indent; } } - prev = ent->set; + prev = X509_NAME_ENTRY_set(ent); fn = X509_NAME_ENTRY_get_object(ent); val = X509_NAME_ENTRY_get_data(ent); fn_nid = OBJ_obj2nid(fn); diff --git a/crypto/asn1/asn1_locl.h b/crypto/asn1/asn1_locl.h index a7569e7387..ec4c0e8052 100644 --- a/crypto/asn1/asn1_locl.h +++ b/crypto/asn1/asn1_locl.h @@ -62,16 +62,6 @@ int asn1_utctime_to_tm(struct tm *tm, const ASN1_UTCTIME *d); int asn1_generalizedtime_to_tm(struct tm *tm, const ASN1_GENERALIZEDTIME *d); -/* ASN1 print context structure */ - -struct asn1_pctx_st { - unsigned long flags; - unsigned long nm_flags; - unsigned long cert_flags; - unsigned long oid_flags; - unsigned long str_flags; -} /* ASN1_PCTX */ ; - /* ASN1 scan context structure */ struct asn1_sctx_st { diff --git a/crypto/asn1/tasn_prn.c b/crypto/asn1/tasn_prn.c index d8450b39b0..cb3d35b63d 100644 --- a/crypto/asn1/tasn_prn.c +++ b/crypto/asn1/tasn_prn.c @@ -65,7 +65,7 @@ #include #include #include -#include "asn1_locl.h" +#include "internal/asn1_int.h" /* * Print routines. diff --git a/crypto/include/internal/asn1_int.h b/crypto/include/internal/asn1_int.h index 20c8f40511..9e74f47d25 100644 --- a/crypto/include/internal/asn1_int.h +++ b/crypto/include/internal/asn1_int.h @@ -119,3 +119,13 @@ struct asn1_object_st { const unsigned char *data; /* data remains const after init */ int flags; /* Should we free this one */ }; + +/* ASN1 print context structure */ + +struct asn1_pctx_st { + unsigned long flags; + unsigned long nm_flags; + unsigned long cert_flags; + unsigned long oid_flags; + unsigned long str_flags; +} /* ASN1_PCTX */ ; diff --git a/crypto/include/internal/x509_int.h b/crypto/include/internal/x509_int.h new file mode 100644 index 0000000000..761f702e7f --- /dev/null +++ b/crypto/include/internal/x509_int.h @@ -0,0 +1,77 @@ +/* x509_int.h */ +/* + * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project + * 2015. + */ +/* ==================================================================== + * Copyright (c) 2015 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + +/* Internal X509 structures and functions: not for application use */ + +struct X509_name_entry_st { + ASN1_OBJECT *object; + ASN1_STRING *value; + int set; + int size; /* temp variable */ +}; + +/* we always keep X509_NAMEs in 2 forms. */ +struct X509_name_st { + STACK_OF(X509_NAME_ENTRY) *entries; + int modified; /* true if 'bytes' needs to be built */ + BUF_MEM *bytes; +/* unsigned long hash; Keep the hash around for lookups */ + unsigned char *canon_enc; + int canon_enclen; +} /* X509_NAME */ ; diff --git a/crypto/x509/Makefile b/crypto/x509/Makefile index 2a576e06f3..cd585bd983 100644 --- a/crypto/x509/Makefile +++ b/crypto/x509/Makefile @@ -22,13 +22,15 @@ LIBSRC= x509_def.c x509_d2.c x509_r2x.c x509_cmp.c \ x509_set.c x509cset.c x509rset.c x509_err.c \ x509name.c x509_v3.c x509_ext.c x509_att.c \ x509type.c x509_lu.c x_all.c x509_txt.c \ - x509_trs.c by_file.c by_dir.c x509_vpm.c x_attrib.c x_exten.c + x509_trs.c by_file.c by_dir.c x509_vpm.c \ + x_attrib.c x_exten.c x_name.c LIBOBJ= x509_def.o x509_d2.o x509_r2x.o x509_cmp.o \ x509_obj.o x509_req.o x509spki.o x509_vfy.o \ x509_set.o x509cset.o x509rset.o x509_err.o \ x509name.o x509_v3.o x509_ext.o x509_att.o \ x509type.o x509_lu.o x_all.o x509_txt.o \ - x509_trs.o by_file.o by_dir.o x509_vpm.o x_attrib.o x_exten.o + x509_trs.o by_file.o by_dir.o x509_vpm.o \ + x_attrib.o x_exten.o x_name.o SRC= $(LIBSRC) diff --git a/crypto/x509/x509.h b/crypto/x509/x509.h index 5fcea0c6bb..7a59dab2d6 100644 --- a/crypto/x509/x509.h +++ b/crypto/x509/x509.h @@ -148,25 +148,10 @@ typedef struct X509_sig_st { ASN1_OCTET_STRING *digest; } X509_SIG; -typedef struct X509_name_entry_st { - ASN1_OBJECT *object; - ASN1_STRING *value; - int set; - int size; /* temp variable */ -} X509_NAME_ENTRY; +typedef struct X509_name_entry_st X509_NAME_ENTRY; DECLARE_STACK_OF(X509_NAME_ENTRY) -/* we always keep X509_NAMEs in 2 forms. */ -struct X509_name_st { - STACK_OF(X509_NAME_ENTRY) *entries; - int modified; /* true if 'bytes' needs to be built */ - BUF_MEM *bytes; -/* unsigned long hash; Keep the hash around for lookups */ - unsigned char *canon_enc; - int canon_enclen; -} /* X509_NAME */ ; - DECLARE_STACK_OF(X509_NAME) # define X509_EX_V_NETSCAPE_HACK 0x8000 @@ -980,6 +965,7 @@ int X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *ne, int type, const unsigned char *bytes, int len); ASN1_OBJECT *X509_NAME_ENTRY_get_object(X509_NAME_ENTRY *ne); ASN1_STRING *X509_NAME_ENTRY_get_data(X509_NAME_ENTRY *ne); +int X509_NAME_ENTRY_set(const X509_NAME_ENTRY *ne); int X509v3_get_ext_count(const STACK_OF(X509_EXTENSION) *x); int X509v3_get_ext_by_NID(const STACK_OF(X509_EXTENSION) *x, diff --git a/crypto/x509/x509_cmp.c b/crypto/x509/x509_cmp.c index eb46a677a4..51c47cc781 100644 --- a/crypto/x509/x509_cmp.c +++ b/crypto/x509/x509_cmp.c @@ -63,6 +63,7 @@ #include #include #include +#include "internal/x509_int.h" int X509_issuer_and_serial_cmp(const X509 *a, const X509 *b) { diff --git a/crypto/x509/x509_obj.c b/crypto/x509/x509_obj.c index d317f3af25..4e80c1b4fe 100644 --- a/crypto/x509/x509_obj.c +++ b/crypto/x509/x509_obj.c @@ -62,6 +62,7 @@ #include #include #include +#include "internal/x509_int.h" char *X509_NAME_oneline(X509_NAME *a, char *buf, int len) { diff --git a/crypto/x509/x509name.c b/crypto/x509/x509name.c index 6ea601f962..6bb1e5d3aa 100644 --- a/crypto/x509/x509name.c +++ b/crypto/x509/x509name.c @@ -63,6 +63,7 @@ #include #include #include +#include "internal/x509_int.h" int X509_NAME_get_text_by_NID(X509_NAME *name, int nid, char *buf, int len) { @@ -395,3 +396,8 @@ ASN1_STRING *X509_NAME_ENTRY_get_data(X509_NAME_ENTRY *ne) return (NULL); return (ne->value); } + +int X509_NAME_ENTRY_set(const X509_NAME_ENTRY *ne) +{ + return ne->set; +} diff --git a/crypto/asn1/x_name.c b/crypto/x509/x_name.c similarity index 99% rename from crypto/asn1/x_name.c rename to crypto/x509/x_name.c index b915050ba3..e6a862e90d 100644 --- a/crypto/asn1/x_name.c +++ b/crypto/x509/x_name.c @@ -61,7 +61,8 @@ #include "cryptlib.h" #include #include -#include "asn1_locl.h" +#include "internal/x509_int.h" +#include "internal/asn1_int.h" typedef STACK_OF(X509_NAME_ENTRY) STACK_OF_X509_NAME_ENTRY; DECLARE_STACK_OF(STACK_OF_X509_NAME_ENTRY) diff --git a/crypto/x509v3/v3_crld.c b/crypto/x509v3/v3_crld.c index 9363541a98..e38632fafa 100644 --- a/crypto/x509v3/v3_crld.c +++ b/crypto/x509v3/v3_crld.c @@ -64,6 +64,8 @@ #include #include +#include "internal/x509_int.h" + static void *v2i_crld(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval); static int i2r_crldp(const X509V3_EXT_METHOD *method, void *pcrldp, BIO *out, diff --git a/crypto/x509v3/v3_ncons.c b/crypto/x509v3/v3_ncons.c index 3672b684d5..c66e08042d 100644 --- a/crypto/x509v3/v3_ncons.c +++ b/crypto/x509v3/v3_ncons.c @@ -63,6 +63,8 @@ #include #include +#include "internal/x509_int.h" + static void *v2i_NAME_CONSTRAINTS(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval); -- 2.39.2