mirror of
https://github.com/guanzhi/GmSSL.git
synced 2026-08-08 23:13:38 +08:00
Merge remote-tracking branch 'origin/master'
# Conflicts: # README.md
This commit is contained in:
@@ -1,444 +0,0 @@
|
||||
#
|
||||
# OpenSSL/crypto/x509/Makefile
|
||||
#
|
||||
|
||||
DIR= x509
|
||||
TOP= ../..
|
||||
CC= cc
|
||||
INCLUDES= -I.. -I$(TOP) -I../../include
|
||||
CFLAG=-g
|
||||
MAKEFILE= Makefile
|
||||
AR= ar r
|
||||
|
||||
CFLAGS= $(INCLUDES) $(CFLAG)
|
||||
|
||||
GENERAL=Makefile README
|
||||
TEST=verify_extra_test.c
|
||||
APPS=
|
||||
|
||||
LIB=$(TOP)/libcrypto.a
|
||||
LIBSRC= x509_def.c x509_d2.c x509_r2x.c x509_cmp.c \
|
||||
x509_obj.c x509_req.c x509spki.c x509_vfy.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
|
||||
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
|
||||
|
||||
SRC= $(LIBSRC)
|
||||
|
||||
EXHEADER= x509.h x509_vfy.h
|
||||
HEADER= $(EXHEADER) vpm_int.h
|
||||
|
||||
ALL= $(GENERAL) $(SRC) $(HEADER)
|
||||
|
||||
top:
|
||||
(cd ../..; $(MAKE) DIRS=crypto SDIRS=$(DIR) sub_all)
|
||||
|
||||
all: lib
|
||||
|
||||
lib: $(LIBOBJ)
|
||||
$(AR) $(LIB) $(LIBOBJ)
|
||||
$(RANLIB) $(LIB) || echo Never mind.
|
||||
@touch lib
|
||||
|
||||
files:
|
||||
$(PERL) $(TOP)/util/files.pl Makefile >> $(TOP)/MINFO
|
||||
|
||||
links:
|
||||
@$(PERL) $(TOP)/util/mklink.pl ../../include/openssl $(EXHEADER)
|
||||
@$(PERL) $(TOP)/util/mklink.pl ../../test $(TEST)
|
||||
@$(PERL) $(TOP)/util/mklink.pl ../../apps $(APPS)
|
||||
|
||||
install:
|
||||
@[ -n "$(INSTALLTOP)" ] # should be set by top Makefile...
|
||||
@headerlist="$(EXHEADER)"; for i in $$headerlist ; \
|
||||
do \
|
||||
(cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i; \
|
||||
chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i ); \
|
||||
done;
|
||||
|
||||
tags:
|
||||
ctags $(SRC)
|
||||
|
||||
tests:
|
||||
|
||||
lint:
|
||||
lint -DLINT $(INCLUDES) $(SRC)>fluff
|
||||
|
||||
update: depend
|
||||
|
||||
depend:
|
||||
@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...
|
||||
$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC)
|
||||
|
||||
dclean:
|
||||
$(PERL) -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new
|
||||
mv -f Makefile.new $(MAKEFILE)
|
||||
|
||||
clean:
|
||||
rm -f *.o *.obj lib tags core .pure .nfs* *.old *.bak fluff
|
||||
|
||||
# DO NOT DELETE THIS LINE -- make depend depends on it.
|
||||
|
||||
by_dir.o: ../../e_os.h ../../include/openssl/asn1.h ../../include/openssl/bio.h
|
||||
by_dir.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h
|
||||
by_dir.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h
|
||||
by_dir.o: ../../include/openssl/ecdh.h ../../include/openssl/ecdsa.h
|
||||
by_dir.o: ../../include/openssl/err.h ../../include/openssl/evp.h
|
||||
by_dir.o: ../../include/openssl/kdf.h ../../include/openssl/lhash.h
|
||||
by_dir.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h
|
||||
by_dir.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h
|
||||
by_dir.o: ../../include/openssl/ossl_typ.h ../../include/openssl/pkcs7.h
|
||||
by_dir.o: ../../include/openssl/safestack.h ../../include/openssl/sha.h
|
||||
by_dir.o: ../../include/openssl/sm2.h ../../include/openssl/sm3.h
|
||||
by_dir.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h
|
||||
by_dir.o: ../../include/openssl/x509.h ../../include/openssl/x509_vfy.h
|
||||
by_dir.o: ../cryptlib.h by_dir.c
|
||||
by_file.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
by_file.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
by_file.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
|
||||
by_file.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h
|
||||
by_file.o: ../../include/openssl/ecdsa.h ../../include/openssl/err.h
|
||||
by_file.o: ../../include/openssl/evp.h ../../include/openssl/kdf.h
|
||||
by_file.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h
|
||||
by_file.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h
|
||||
by_file.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
by_file.o: ../../include/openssl/pem.h ../../include/openssl/pem2.h
|
||||
by_file.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
by_file.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
by_file.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
by_file.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
by_file.o: ../../include/openssl/x509_vfy.h ../cryptlib.h by_file.c
|
||||
x509_att.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509_att.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509_att.o: ../../include/openssl/conf.h ../../include/openssl/crypto.h
|
||||
x509_att.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h
|
||||
x509_att.o: ../../include/openssl/ecdh.h ../../include/openssl/ecdsa.h
|
||||
x509_att.o: ../../include/openssl/err.h ../../include/openssl/evp.h
|
||||
x509_att.o: ../../include/openssl/kdf.h ../../include/openssl/lhash.h
|
||||
x509_att.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h
|
||||
x509_att.o: ../../include/openssl/opensslconf.h
|
||||
x509_att.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509_att.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509_att.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509_att.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509_att.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509_att.o: ../../include/openssl/x509_vfy.h ../../include/openssl/x509v3.h
|
||||
x509_att.o: ../cryptlib.h x509_att.c
|
||||
x509_cmp.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509_cmp.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509_cmp.o: ../../include/openssl/conf.h ../../include/openssl/crypto.h
|
||||
x509_cmp.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h
|
||||
x509_cmp.o: ../../include/openssl/ecdh.h ../../include/openssl/ecdsa.h
|
||||
x509_cmp.o: ../../include/openssl/err.h ../../include/openssl/evp.h
|
||||
x509_cmp.o: ../../include/openssl/kdf.h ../../include/openssl/lhash.h
|
||||
x509_cmp.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h
|
||||
x509_cmp.o: ../../include/openssl/opensslconf.h
|
||||
x509_cmp.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509_cmp.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509_cmp.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509_cmp.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509_cmp.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509_cmp.o: ../../include/openssl/x509_vfy.h ../../include/openssl/x509v3.h
|
||||
x509_cmp.o: ../cryptlib.h x509_cmp.c
|
||||
x509_d2.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509_d2.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509_d2.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
|
||||
x509_d2.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h
|
||||
x509_d2.o: ../../include/openssl/ecdsa.h ../../include/openssl/err.h
|
||||
x509_d2.o: ../../include/openssl/evp.h ../../include/openssl/kdf.h
|
||||
x509_d2.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h
|
||||
x509_d2.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h
|
||||
x509_d2.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509_d2.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509_d2.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509_d2.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509_d2.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509_d2.o: ../../include/openssl/x509_vfy.h ../cryptlib.h x509_d2.c
|
||||
x509_def.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509_def.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509_def.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
|
||||
x509_def.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h
|
||||
x509_def.o: ../../include/openssl/ecdsa.h ../../include/openssl/err.h
|
||||
x509_def.o: ../../include/openssl/evp.h ../../include/openssl/kdf.h
|
||||
x509_def.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h
|
||||
x509_def.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h
|
||||
x509_def.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509_def.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509_def.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509_def.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509_def.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509_def.o: ../../include/openssl/x509_vfy.h ../cryptlib.h x509_def.c
|
||||
x509_err.o: ../../include/openssl/asn1.h ../../include/openssl/bio.h
|
||||
x509_err.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h
|
||||
x509_err.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h
|
||||
x509_err.o: ../../include/openssl/ecdh.h ../../include/openssl/ecdsa.h
|
||||
x509_err.o: ../../include/openssl/err.h ../../include/openssl/evp.h
|
||||
x509_err.o: ../../include/openssl/kdf.h ../../include/openssl/lhash.h
|
||||
x509_err.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h
|
||||
x509_err.o: ../../include/openssl/opensslconf.h
|
||||
x509_err.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509_err.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509_err.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509_err.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509_err.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509_err.o: ../../include/openssl/x509_vfy.h x509_err.c
|
||||
x509_ext.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509_ext.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509_ext.o: ../../include/openssl/conf.h ../../include/openssl/crypto.h
|
||||
x509_ext.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h
|
||||
x509_ext.o: ../../include/openssl/ecdh.h ../../include/openssl/ecdsa.h
|
||||
x509_ext.o: ../../include/openssl/err.h ../../include/openssl/evp.h
|
||||
x509_ext.o: ../../include/openssl/kdf.h ../../include/openssl/lhash.h
|
||||
x509_ext.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h
|
||||
x509_ext.o: ../../include/openssl/opensslconf.h
|
||||
x509_ext.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509_ext.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509_ext.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509_ext.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509_ext.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509_ext.o: ../../include/openssl/x509_vfy.h ../../include/openssl/x509v3.h
|
||||
x509_ext.o: ../cryptlib.h x509_ext.c
|
||||
x509_lu.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509_lu.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509_lu.o: ../../include/openssl/conf.h ../../include/openssl/crypto.h
|
||||
x509_lu.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h
|
||||
x509_lu.o: ../../include/openssl/ecdh.h ../../include/openssl/ecdsa.h
|
||||
x509_lu.o: ../../include/openssl/err.h ../../include/openssl/evp.h
|
||||
x509_lu.o: ../../include/openssl/kdf.h ../../include/openssl/lhash.h
|
||||
x509_lu.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h
|
||||
x509_lu.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h
|
||||
x509_lu.o: ../../include/openssl/ossl_typ.h ../../include/openssl/pkcs7.h
|
||||
x509_lu.o: ../../include/openssl/safestack.h ../../include/openssl/sha.h
|
||||
x509_lu.o: ../../include/openssl/sm2.h ../../include/openssl/sm3.h
|
||||
x509_lu.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h
|
||||
x509_lu.o: ../../include/openssl/x509.h ../../include/openssl/x509_vfy.h
|
||||
x509_lu.o: ../../include/openssl/x509v3.h ../cryptlib.h x509_lu.c
|
||||
x509_obj.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509_obj.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509_obj.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
|
||||
x509_obj.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h
|
||||
x509_obj.o: ../../include/openssl/ecdsa.h ../../include/openssl/err.h
|
||||
x509_obj.o: ../../include/openssl/evp.h ../../include/openssl/kdf.h
|
||||
x509_obj.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h
|
||||
x509_obj.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h
|
||||
x509_obj.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509_obj.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509_obj.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509_obj.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509_obj.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509_obj.o: ../../include/openssl/x509_vfy.h ../cryptlib.h x509_obj.c
|
||||
x509_r2x.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509_r2x.o: ../../include/openssl/bio.h ../../include/openssl/bn.h
|
||||
x509_r2x.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h
|
||||
x509_r2x.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h
|
||||
x509_r2x.o: ../../include/openssl/ecdh.h ../../include/openssl/ecdsa.h
|
||||
x509_r2x.o: ../../include/openssl/err.h ../../include/openssl/evp.h
|
||||
x509_r2x.o: ../../include/openssl/kdf.h ../../include/openssl/lhash.h
|
||||
x509_r2x.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h
|
||||
x509_r2x.o: ../../include/openssl/opensslconf.h
|
||||
x509_r2x.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509_r2x.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509_r2x.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509_r2x.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509_r2x.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509_r2x.o: ../../include/openssl/x509_vfy.h ../cryptlib.h x509_r2x.c
|
||||
x509_req.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509_req.o: ../../include/openssl/asn1t.h ../../include/openssl/bio.h
|
||||
x509_req.o: ../../include/openssl/bn.h ../../include/openssl/buffer.h
|
||||
x509_req.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
|
||||
x509_req.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h
|
||||
x509_req.o: ../../include/openssl/ecdsa.h ../../include/openssl/err.h
|
||||
x509_req.o: ../../include/openssl/evp.h ../../include/openssl/kdf.h
|
||||
x509_req.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h
|
||||
x509_req.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h
|
||||
x509_req.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509_req.o: ../../include/openssl/pem.h ../../include/openssl/pem2.h
|
||||
x509_req.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509_req.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509_req.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509_req.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509_req.o: ../../include/openssl/x509_vfy.h ../cryptlib.h x509_req.c
|
||||
x509_set.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509_set.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509_set.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
|
||||
x509_set.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h
|
||||
x509_set.o: ../../include/openssl/ecdsa.h ../../include/openssl/err.h
|
||||
x509_set.o: ../../include/openssl/evp.h ../../include/openssl/kdf.h
|
||||
x509_set.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h
|
||||
x509_set.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h
|
||||
x509_set.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509_set.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509_set.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509_set.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509_set.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509_set.o: ../../include/openssl/x509_vfy.h ../cryptlib.h x509_set.c
|
||||
x509_trs.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509_trs.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509_trs.o: ../../include/openssl/conf.h ../../include/openssl/crypto.h
|
||||
x509_trs.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h
|
||||
x509_trs.o: ../../include/openssl/ecdh.h ../../include/openssl/ecdsa.h
|
||||
x509_trs.o: ../../include/openssl/err.h ../../include/openssl/evp.h
|
||||
x509_trs.o: ../../include/openssl/kdf.h ../../include/openssl/lhash.h
|
||||
x509_trs.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h
|
||||
x509_trs.o: ../../include/openssl/opensslconf.h
|
||||
x509_trs.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509_trs.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509_trs.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509_trs.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509_trs.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509_trs.o: ../../include/openssl/x509_vfy.h ../../include/openssl/x509v3.h
|
||||
x509_trs.o: ../cryptlib.h x509_trs.c
|
||||
x509_txt.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509_txt.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509_txt.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
|
||||
x509_txt.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h
|
||||
x509_txt.o: ../../include/openssl/ecdsa.h ../../include/openssl/err.h
|
||||
x509_txt.o: ../../include/openssl/evp.h ../../include/openssl/kdf.h
|
||||
x509_txt.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h
|
||||
x509_txt.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h
|
||||
x509_txt.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509_txt.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509_txt.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509_txt.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509_txt.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509_txt.o: ../../include/openssl/x509_vfy.h ../cryptlib.h x509_txt.c
|
||||
x509_v3.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509_v3.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509_v3.o: ../../include/openssl/conf.h ../../include/openssl/crypto.h
|
||||
x509_v3.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h
|
||||
x509_v3.o: ../../include/openssl/ecdh.h ../../include/openssl/ecdsa.h
|
||||
x509_v3.o: ../../include/openssl/err.h ../../include/openssl/evp.h
|
||||
x509_v3.o: ../../include/openssl/kdf.h ../../include/openssl/lhash.h
|
||||
x509_v3.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h
|
||||
x509_v3.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h
|
||||
x509_v3.o: ../../include/openssl/ossl_typ.h ../../include/openssl/pkcs7.h
|
||||
x509_v3.o: ../../include/openssl/safestack.h ../../include/openssl/sha.h
|
||||
x509_v3.o: ../../include/openssl/sm2.h ../../include/openssl/sm3.h
|
||||
x509_v3.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h
|
||||
x509_v3.o: ../../include/openssl/x509.h ../../include/openssl/x509_vfy.h
|
||||
x509_v3.o: ../../include/openssl/x509v3.h ../cryptlib.h x509_v3.c
|
||||
x509_vfy.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509_vfy.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509_vfy.o: ../../include/openssl/conf.h ../../include/openssl/crypto.h
|
||||
x509_vfy.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h
|
||||
x509_vfy.o: ../../include/openssl/ecdh.h ../../include/openssl/ecdsa.h
|
||||
x509_vfy.o: ../../include/openssl/err.h ../../include/openssl/evp.h
|
||||
x509_vfy.o: ../../include/openssl/kdf.h ../../include/openssl/lhash.h
|
||||
x509_vfy.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h
|
||||
x509_vfy.o: ../../include/openssl/opensslconf.h
|
||||
x509_vfy.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509_vfy.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509_vfy.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509_vfy.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509_vfy.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509_vfy.o: ../../include/openssl/x509_vfy.h ../../include/openssl/x509v3.h
|
||||
x509_vfy.o: ../cryptlib.h vpm_int.h x509_vfy.c
|
||||
x509_vpm.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509_vpm.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509_vpm.o: ../../include/openssl/conf.h ../../include/openssl/crypto.h
|
||||
x509_vpm.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h
|
||||
x509_vpm.o: ../../include/openssl/ecdh.h ../../include/openssl/ecdsa.h
|
||||
x509_vpm.o: ../../include/openssl/err.h ../../include/openssl/evp.h
|
||||
x509_vpm.o: ../../include/openssl/kdf.h ../../include/openssl/lhash.h
|
||||
x509_vpm.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h
|
||||
x509_vpm.o: ../../include/openssl/opensslconf.h
|
||||
x509_vpm.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509_vpm.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509_vpm.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509_vpm.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509_vpm.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509_vpm.o: ../../include/openssl/x509_vfy.h ../../include/openssl/x509v3.h
|
||||
x509_vpm.o: ../cryptlib.h vpm_int.h x509_vpm.c
|
||||
x509cset.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509cset.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509cset.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
|
||||
x509cset.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h
|
||||
x509cset.o: ../../include/openssl/ecdsa.h ../../include/openssl/err.h
|
||||
x509cset.o: ../../include/openssl/evp.h ../../include/openssl/kdf.h
|
||||
x509cset.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h
|
||||
x509cset.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h
|
||||
x509cset.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509cset.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509cset.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509cset.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509cset.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509cset.o: ../../include/openssl/x509_vfy.h ../cryptlib.h x509cset.c
|
||||
x509name.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509name.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509name.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
|
||||
x509name.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h
|
||||
x509name.o: ../../include/openssl/ecdsa.h ../../include/openssl/err.h
|
||||
x509name.o: ../../include/openssl/evp.h ../../include/openssl/kdf.h
|
||||
x509name.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h
|
||||
x509name.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h
|
||||
x509name.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509name.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509name.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509name.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509name.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509name.o: ../../include/openssl/x509_vfy.h ../cryptlib.h x509name.c
|
||||
x509rset.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509rset.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509rset.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
|
||||
x509rset.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h
|
||||
x509rset.o: ../../include/openssl/ecdsa.h ../../include/openssl/err.h
|
||||
x509rset.o: ../../include/openssl/evp.h ../../include/openssl/kdf.h
|
||||
x509rset.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h
|
||||
x509rset.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h
|
||||
x509rset.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509rset.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509rset.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509rset.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509rset.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509rset.o: ../../include/openssl/x509_vfy.h ../cryptlib.h x509rset.c
|
||||
x509spki.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509spki.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509spki.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
|
||||
x509spki.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h
|
||||
x509spki.o: ../../include/openssl/ecdsa.h ../../include/openssl/err.h
|
||||
x509spki.o: ../../include/openssl/evp.h ../../include/openssl/kdf.h
|
||||
x509spki.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h
|
||||
x509spki.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h
|
||||
x509spki.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509spki.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509spki.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509spki.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509spki.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509spki.o: ../../include/openssl/x509_vfy.h ../cryptlib.h x509spki.c
|
||||
x509type.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509type.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509type.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
|
||||
x509type.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h
|
||||
x509type.o: ../../include/openssl/ecdsa.h ../../include/openssl/err.h
|
||||
x509type.o: ../../include/openssl/evp.h ../../include/openssl/kdf.h
|
||||
x509type.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h
|
||||
x509type.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h
|
||||
x509type.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509type.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509type.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509type.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509type.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509type.o: ../../include/openssl/x509_vfy.h ../cryptlib.h x509type.c
|
||||
x_all.o: ../../e_os.h ../../include/openssl/asn1.h ../../include/openssl/bio.h
|
||||
x_all.o: ../../include/openssl/buffer.h ../../include/openssl/conf.h
|
||||
x_all.o: ../../include/openssl/crypto.h ../../include/openssl/dsa.h
|
||||
x_all.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h
|
||||
x_all.o: ../../include/openssl/ecdh.h ../../include/openssl/ecdsa.h
|
||||
x_all.o: ../../include/openssl/err.h ../../include/openssl/evp.h
|
||||
x_all.o: ../../include/openssl/kdf.h ../../include/openssl/lhash.h
|
||||
x_all.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h
|
||||
x_all.o: ../../include/openssl/ocsp.h ../../include/openssl/opensslconf.h
|
||||
x_all.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x_all.o: ../../include/openssl/pkcs7.h ../../include/openssl/rsa.h
|
||||
x_all.o: ../../include/openssl/safestack.h ../../include/openssl/sha.h
|
||||
x_all.o: ../../include/openssl/sm2.h ../../include/openssl/sm3.h
|
||||
x_all.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h
|
||||
x_all.o: ../../include/openssl/x509.h ../../include/openssl/x509_vfy.h
|
||||
x_all.o: ../../include/openssl/x509v3.h ../cryptlib.h x_all.c
|
||||
@@ -1,444 +0,0 @@
|
||||
#
|
||||
# OpenSSL/crypto/x509/Makefile
|
||||
#
|
||||
|
||||
DIR= x509
|
||||
TOP= ../..
|
||||
CC= cc
|
||||
INCLUDES= -I.. -I$(TOP) -I../../include
|
||||
CFLAG=-g
|
||||
MAKEFILE= Makefile
|
||||
AR= ar r
|
||||
|
||||
CFLAGS= $(INCLUDES) $(CFLAG)
|
||||
|
||||
GENERAL=Makefile README
|
||||
TEST=verify_extra_test.c
|
||||
APPS=
|
||||
|
||||
LIB=$(TOP)/libcrypto.a
|
||||
LIBSRC= x509_def.c x509_d2.c x509_r2x.c x509_cmp.c \
|
||||
x509_obj.c x509_req.c x509spki.c x509_vfy.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
|
||||
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
|
||||
|
||||
SRC= $(LIBSRC)
|
||||
|
||||
EXHEADER= x509.h x509_vfy.h
|
||||
HEADER= $(EXHEADER) vpm_int.h
|
||||
|
||||
ALL= $(GENERAL) $(SRC) $(HEADER)
|
||||
|
||||
top:
|
||||
(cd ../..; $(MAKE) DIRS=crypto SDIRS=$(DIR) sub_all)
|
||||
|
||||
all: lib
|
||||
|
||||
lib: $(LIBOBJ)
|
||||
$(AR) $(LIB) $(LIBOBJ)
|
||||
$(RANLIB) $(LIB) || echo Never mind.
|
||||
@touch lib
|
||||
|
||||
files:
|
||||
$(PERL) $(TOP)/util/files.pl Makefile >> $(TOP)/MINFO
|
||||
|
||||
links:
|
||||
@$(PERL) $(TOP)/util/mklink.pl ../../include/openssl $(EXHEADER)
|
||||
@$(PERL) $(TOP)/util/mklink.pl ../../test $(TEST)
|
||||
@$(PERL) $(TOP)/util/mklink.pl ../../apps $(APPS)
|
||||
|
||||
install:
|
||||
@[ -n "$(INSTALLTOP)" ] # should be set by top Makefile...
|
||||
@headerlist="$(EXHEADER)"; for i in $$headerlist ; \
|
||||
do \
|
||||
(cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i; \
|
||||
chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i ); \
|
||||
done;
|
||||
|
||||
tags:
|
||||
ctags $(SRC)
|
||||
|
||||
tests:
|
||||
|
||||
lint:
|
||||
lint -DLINT $(INCLUDES) $(SRC)>fluff
|
||||
|
||||
update: depend
|
||||
|
||||
depend:
|
||||
@[ -n "$(MAKEDEPEND)" ] # should be set by upper Makefile...
|
||||
$(MAKEDEPEND) -- $(CFLAG) $(INCLUDES) $(DEPFLAG) -- $(PROGS) $(LIBSRC)
|
||||
|
||||
dclean:
|
||||
$(PERL) -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new
|
||||
mv -f Makefile.new $(MAKEFILE)
|
||||
|
||||
clean:
|
||||
rm -f *.o *.obj lib tags core .pure .nfs* *.old *.bak fluff
|
||||
|
||||
# DO NOT DELETE THIS LINE -- make depend depends on it.
|
||||
|
||||
by_dir.o: ../../e_os.h ../../include/openssl/asn1.h ../../include/openssl/bio.h
|
||||
by_dir.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h
|
||||
by_dir.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h
|
||||
by_dir.o: ../../include/openssl/ecdh.h ../../include/openssl/ecdsa.h
|
||||
by_dir.o: ../../include/openssl/err.h ../../include/openssl/evp.h
|
||||
by_dir.o: ../../include/openssl/kdf.h ../../include/openssl/lhash.h
|
||||
by_dir.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h
|
||||
by_dir.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h
|
||||
by_dir.o: ../../include/openssl/ossl_typ.h ../../include/openssl/pkcs7.h
|
||||
by_dir.o: ../../include/openssl/safestack.h ../../include/openssl/sha.h
|
||||
by_dir.o: ../../include/openssl/sm2.h ../../include/openssl/sm3.h
|
||||
by_dir.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h
|
||||
by_dir.o: ../../include/openssl/x509.h ../../include/openssl/x509_vfy.h
|
||||
by_dir.o: ../cryptlib.h by_dir.c
|
||||
by_file.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
by_file.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
by_file.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
|
||||
by_file.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h
|
||||
by_file.o: ../../include/openssl/ecdsa.h ../../include/openssl/err.h
|
||||
by_file.o: ../../include/openssl/evp.h ../../include/openssl/kdf.h
|
||||
by_file.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h
|
||||
by_file.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h
|
||||
by_file.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
by_file.o: ../../include/openssl/pem.h ../../include/openssl/pem2.h
|
||||
by_file.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
by_file.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
by_file.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
by_file.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
by_file.o: ../../include/openssl/x509_vfy.h ../cryptlib.h by_file.c
|
||||
x509_att.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509_att.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509_att.o: ../../include/openssl/conf.h ../../include/openssl/crypto.h
|
||||
x509_att.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h
|
||||
x509_att.o: ../../include/openssl/ecdh.h ../../include/openssl/ecdsa.h
|
||||
x509_att.o: ../../include/openssl/err.h ../../include/openssl/evp.h
|
||||
x509_att.o: ../../include/openssl/kdf.h ../../include/openssl/lhash.h
|
||||
x509_att.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h
|
||||
x509_att.o: ../../include/openssl/opensslconf.h
|
||||
x509_att.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509_att.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509_att.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509_att.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509_att.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509_att.o: ../../include/openssl/x509_vfy.h ../../include/openssl/x509v3.h
|
||||
x509_att.o: ../cryptlib.h x509_att.c
|
||||
x509_cmp.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509_cmp.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509_cmp.o: ../../include/openssl/conf.h ../../include/openssl/crypto.h
|
||||
x509_cmp.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h
|
||||
x509_cmp.o: ../../include/openssl/ecdh.h ../../include/openssl/ecdsa.h
|
||||
x509_cmp.o: ../../include/openssl/err.h ../../include/openssl/evp.h
|
||||
x509_cmp.o: ../../include/openssl/kdf.h ../../include/openssl/lhash.h
|
||||
x509_cmp.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h
|
||||
x509_cmp.o: ../../include/openssl/opensslconf.h
|
||||
x509_cmp.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509_cmp.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509_cmp.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509_cmp.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509_cmp.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509_cmp.o: ../../include/openssl/x509_vfy.h ../../include/openssl/x509v3.h
|
||||
x509_cmp.o: ../cryptlib.h x509_cmp.c
|
||||
x509_d2.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509_d2.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509_d2.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
|
||||
x509_d2.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h
|
||||
x509_d2.o: ../../include/openssl/ecdsa.h ../../include/openssl/err.h
|
||||
x509_d2.o: ../../include/openssl/evp.h ../../include/openssl/kdf.h
|
||||
x509_d2.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h
|
||||
x509_d2.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h
|
||||
x509_d2.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509_d2.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509_d2.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509_d2.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509_d2.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509_d2.o: ../../include/openssl/x509_vfy.h ../cryptlib.h x509_d2.c
|
||||
x509_def.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509_def.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509_def.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
|
||||
x509_def.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h
|
||||
x509_def.o: ../../include/openssl/ecdsa.h ../../include/openssl/err.h
|
||||
x509_def.o: ../../include/openssl/evp.h ../../include/openssl/kdf.h
|
||||
x509_def.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h
|
||||
x509_def.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h
|
||||
x509_def.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509_def.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509_def.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509_def.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509_def.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509_def.o: ../../include/openssl/x509_vfy.h ../cryptlib.h x509_def.c
|
||||
x509_err.o: ../../include/openssl/asn1.h ../../include/openssl/bio.h
|
||||
x509_err.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h
|
||||
x509_err.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h
|
||||
x509_err.o: ../../include/openssl/ecdh.h ../../include/openssl/ecdsa.h
|
||||
x509_err.o: ../../include/openssl/err.h ../../include/openssl/evp.h
|
||||
x509_err.o: ../../include/openssl/kdf.h ../../include/openssl/lhash.h
|
||||
x509_err.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h
|
||||
x509_err.o: ../../include/openssl/opensslconf.h
|
||||
x509_err.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509_err.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509_err.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509_err.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509_err.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509_err.o: ../../include/openssl/x509_vfy.h x509_err.c
|
||||
x509_ext.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509_ext.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509_ext.o: ../../include/openssl/conf.h ../../include/openssl/crypto.h
|
||||
x509_ext.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h
|
||||
x509_ext.o: ../../include/openssl/ecdh.h ../../include/openssl/ecdsa.h
|
||||
x509_ext.o: ../../include/openssl/err.h ../../include/openssl/evp.h
|
||||
x509_ext.o: ../../include/openssl/kdf.h ../../include/openssl/lhash.h
|
||||
x509_ext.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h
|
||||
x509_ext.o: ../../include/openssl/opensslconf.h
|
||||
x509_ext.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509_ext.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509_ext.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509_ext.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509_ext.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509_ext.o: ../../include/openssl/x509_vfy.h ../../include/openssl/x509v3.h
|
||||
x509_ext.o: ../cryptlib.h x509_ext.c
|
||||
x509_lu.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509_lu.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509_lu.o: ../../include/openssl/conf.h ../../include/openssl/crypto.h
|
||||
x509_lu.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h
|
||||
x509_lu.o: ../../include/openssl/ecdh.h ../../include/openssl/ecdsa.h
|
||||
x509_lu.o: ../../include/openssl/err.h ../../include/openssl/evp.h
|
||||
x509_lu.o: ../../include/openssl/kdf.h ../../include/openssl/lhash.h
|
||||
x509_lu.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h
|
||||
x509_lu.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h
|
||||
x509_lu.o: ../../include/openssl/ossl_typ.h ../../include/openssl/pkcs7.h
|
||||
x509_lu.o: ../../include/openssl/safestack.h ../../include/openssl/sha.h
|
||||
x509_lu.o: ../../include/openssl/sm2.h ../../include/openssl/sm3.h
|
||||
x509_lu.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h
|
||||
x509_lu.o: ../../include/openssl/x509.h ../../include/openssl/x509_vfy.h
|
||||
x509_lu.o: ../../include/openssl/x509v3.h ../cryptlib.h x509_lu.c
|
||||
x509_obj.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509_obj.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509_obj.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
|
||||
x509_obj.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h
|
||||
x509_obj.o: ../../include/openssl/ecdsa.h ../../include/openssl/err.h
|
||||
x509_obj.o: ../../include/openssl/evp.h ../../include/openssl/kdf.h
|
||||
x509_obj.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h
|
||||
x509_obj.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h
|
||||
x509_obj.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509_obj.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509_obj.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509_obj.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509_obj.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509_obj.o: ../../include/openssl/x509_vfy.h ../cryptlib.h x509_obj.c
|
||||
x509_r2x.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509_r2x.o: ../../include/openssl/bio.h ../../include/openssl/bn.h
|
||||
x509_r2x.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h
|
||||
x509_r2x.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h
|
||||
x509_r2x.o: ../../include/openssl/ecdh.h ../../include/openssl/ecdsa.h
|
||||
x509_r2x.o: ../../include/openssl/err.h ../../include/openssl/evp.h
|
||||
x509_r2x.o: ../../include/openssl/kdf.h ../../include/openssl/lhash.h
|
||||
x509_r2x.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h
|
||||
x509_r2x.o: ../../include/openssl/opensslconf.h
|
||||
x509_r2x.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509_r2x.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509_r2x.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509_r2x.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509_r2x.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509_r2x.o: ../../include/openssl/x509_vfy.h ../cryptlib.h x509_r2x.c
|
||||
x509_req.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509_req.o: ../../include/openssl/asn1t.h ../../include/openssl/bio.h
|
||||
x509_req.o: ../../include/openssl/bn.h ../../include/openssl/buffer.h
|
||||
x509_req.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
|
||||
x509_req.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h
|
||||
x509_req.o: ../../include/openssl/ecdsa.h ../../include/openssl/err.h
|
||||
x509_req.o: ../../include/openssl/evp.h ../../include/openssl/kdf.h
|
||||
x509_req.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h
|
||||
x509_req.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h
|
||||
x509_req.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509_req.o: ../../include/openssl/pem.h ../../include/openssl/pem2.h
|
||||
x509_req.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509_req.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509_req.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509_req.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509_req.o: ../../include/openssl/x509_vfy.h ../cryptlib.h x509_req.c
|
||||
x509_set.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509_set.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509_set.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
|
||||
x509_set.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h
|
||||
x509_set.o: ../../include/openssl/ecdsa.h ../../include/openssl/err.h
|
||||
x509_set.o: ../../include/openssl/evp.h ../../include/openssl/kdf.h
|
||||
x509_set.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h
|
||||
x509_set.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h
|
||||
x509_set.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509_set.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509_set.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509_set.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509_set.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509_set.o: ../../include/openssl/x509_vfy.h ../cryptlib.h x509_set.c
|
||||
x509_trs.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509_trs.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509_trs.o: ../../include/openssl/conf.h ../../include/openssl/crypto.h
|
||||
x509_trs.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h
|
||||
x509_trs.o: ../../include/openssl/ecdh.h ../../include/openssl/ecdsa.h
|
||||
x509_trs.o: ../../include/openssl/err.h ../../include/openssl/evp.h
|
||||
x509_trs.o: ../../include/openssl/kdf.h ../../include/openssl/lhash.h
|
||||
x509_trs.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h
|
||||
x509_trs.o: ../../include/openssl/opensslconf.h
|
||||
x509_trs.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509_trs.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509_trs.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509_trs.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509_trs.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509_trs.o: ../../include/openssl/x509_vfy.h ../../include/openssl/x509v3.h
|
||||
x509_trs.o: ../cryptlib.h x509_trs.c
|
||||
x509_txt.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509_txt.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509_txt.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
|
||||
x509_txt.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h
|
||||
x509_txt.o: ../../include/openssl/ecdsa.h ../../include/openssl/err.h
|
||||
x509_txt.o: ../../include/openssl/evp.h ../../include/openssl/kdf.h
|
||||
x509_txt.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h
|
||||
x509_txt.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h
|
||||
x509_txt.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509_txt.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509_txt.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509_txt.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509_txt.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509_txt.o: ../../include/openssl/x509_vfy.h ../cryptlib.h x509_txt.c
|
||||
x509_v3.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509_v3.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509_v3.o: ../../include/openssl/conf.h ../../include/openssl/crypto.h
|
||||
x509_v3.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h
|
||||
x509_v3.o: ../../include/openssl/ecdh.h ../../include/openssl/ecdsa.h
|
||||
x509_v3.o: ../../include/openssl/err.h ../../include/openssl/evp.h
|
||||
x509_v3.o: ../../include/openssl/kdf.h ../../include/openssl/lhash.h
|
||||
x509_v3.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h
|
||||
x509_v3.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h
|
||||
x509_v3.o: ../../include/openssl/ossl_typ.h ../../include/openssl/pkcs7.h
|
||||
x509_v3.o: ../../include/openssl/safestack.h ../../include/openssl/sha.h
|
||||
x509_v3.o: ../../include/openssl/sm2.h ../../include/openssl/sm3.h
|
||||
x509_v3.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h
|
||||
x509_v3.o: ../../include/openssl/x509.h ../../include/openssl/x509_vfy.h
|
||||
x509_v3.o: ../../include/openssl/x509v3.h ../cryptlib.h x509_v3.c
|
||||
x509_vfy.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509_vfy.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509_vfy.o: ../../include/openssl/conf.h ../../include/openssl/crypto.h
|
||||
x509_vfy.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h
|
||||
x509_vfy.o: ../../include/openssl/ecdh.h ../../include/openssl/ecdsa.h
|
||||
x509_vfy.o: ../../include/openssl/err.h ../../include/openssl/evp.h
|
||||
x509_vfy.o: ../../include/openssl/kdf.h ../../include/openssl/lhash.h
|
||||
x509_vfy.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h
|
||||
x509_vfy.o: ../../include/openssl/opensslconf.h
|
||||
x509_vfy.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509_vfy.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509_vfy.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509_vfy.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509_vfy.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509_vfy.o: ../../include/openssl/x509_vfy.h ../../include/openssl/x509v3.h
|
||||
x509_vfy.o: ../cryptlib.h vpm_int.h x509_vfy.c
|
||||
x509_vpm.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509_vpm.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509_vpm.o: ../../include/openssl/conf.h ../../include/openssl/crypto.h
|
||||
x509_vpm.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h
|
||||
x509_vpm.o: ../../include/openssl/ecdh.h ../../include/openssl/ecdsa.h
|
||||
x509_vpm.o: ../../include/openssl/err.h ../../include/openssl/evp.h
|
||||
x509_vpm.o: ../../include/openssl/kdf.h ../../include/openssl/lhash.h
|
||||
x509_vpm.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h
|
||||
x509_vpm.o: ../../include/openssl/opensslconf.h
|
||||
x509_vpm.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509_vpm.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509_vpm.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509_vpm.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509_vpm.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509_vpm.o: ../../include/openssl/x509_vfy.h ../../include/openssl/x509v3.h
|
||||
x509_vpm.o: ../cryptlib.h vpm_int.h x509_vpm.c
|
||||
x509cset.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509cset.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509cset.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
|
||||
x509cset.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h
|
||||
x509cset.o: ../../include/openssl/ecdsa.h ../../include/openssl/err.h
|
||||
x509cset.o: ../../include/openssl/evp.h ../../include/openssl/kdf.h
|
||||
x509cset.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h
|
||||
x509cset.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h
|
||||
x509cset.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509cset.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509cset.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509cset.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509cset.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509cset.o: ../../include/openssl/x509_vfy.h ../cryptlib.h x509cset.c
|
||||
x509name.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509name.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509name.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
|
||||
x509name.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h
|
||||
x509name.o: ../../include/openssl/ecdsa.h ../../include/openssl/err.h
|
||||
x509name.o: ../../include/openssl/evp.h ../../include/openssl/kdf.h
|
||||
x509name.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h
|
||||
x509name.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h
|
||||
x509name.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509name.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509name.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509name.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509name.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509name.o: ../../include/openssl/x509_vfy.h ../cryptlib.h x509name.c
|
||||
x509rset.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509rset.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509rset.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
|
||||
x509rset.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h
|
||||
x509rset.o: ../../include/openssl/ecdsa.h ../../include/openssl/err.h
|
||||
x509rset.o: ../../include/openssl/evp.h ../../include/openssl/kdf.h
|
||||
x509rset.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h
|
||||
x509rset.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h
|
||||
x509rset.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509rset.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509rset.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509rset.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509rset.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509rset.o: ../../include/openssl/x509_vfy.h ../cryptlib.h x509rset.c
|
||||
x509spki.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509spki.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509spki.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
|
||||
x509spki.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h
|
||||
x509spki.o: ../../include/openssl/ecdsa.h ../../include/openssl/err.h
|
||||
x509spki.o: ../../include/openssl/evp.h ../../include/openssl/kdf.h
|
||||
x509spki.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h
|
||||
x509spki.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h
|
||||
x509spki.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509spki.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509spki.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509spki.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509spki.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509spki.o: ../../include/openssl/x509_vfy.h ../cryptlib.h x509spki.c
|
||||
x509type.o: ../../e_os.h ../../include/openssl/asn1.h
|
||||
x509type.o: ../../include/openssl/bio.h ../../include/openssl/buffer.h
|
||||
x509type.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
|
||||
x509type.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h
|
||||
x509type.o: ../../include/openssl/ecdsa.h ../../include/openssl/err.h
|
||||
x509type.o: ../../include/openssl/evp.h ../../include/openssl/kdf.h
|
||||
x509type.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h
|
||||
x509type.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h
|
||||
x509type.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x509type.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h
|
||||
x509type.o: ../../include/openssl/sha.h ../../include/openssl/sm2.h
|
||||
x509type.o: ../../include/openssl/sm3.h ../../include/openssl/stack.h
|
||||
x509type.o: ../../include/openssl/symhacks.h ../../include/openssl/x509.h
|
||||
x509type.o: ../../include/openssl/x509_vfy.h ../cryptlib.h x509type.c
|
||||
x_all.o: ../../e_os.h ../../include/openssl/asn1.h ../../include/openssl/bio.h
|
||||
x_all.o: ../../include/openssl/buffer.h ../../include/openssl/conf.h
|
||||
x_all.o: ../../include/openssl/crypto.h ../../include/openssl/dsa.h
|
||||
x_all.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h
|
||||
x_all.o: ../../include/openssl/ecdh.h ../../include/openssl/ecdsa.h
|
||||
x_all.o: ../../include/openssl/err.h ../../include/openssl/evp.h
|
||||
x_all.o: ../../include/openssl/kdf.h ../../include/openssl/lhash.h
|
||||
x_all.o: ../../include/openssl/obj_mac.h ../../include/openssl/objects.h
|
||||
x_all.o: ../../include/openssl/ocsp.h ../../include/openssl/opensslconf.h
|
||||
x_all.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
x_all.o: ../../include/openssl/pkcs7.h ../../include/openssl/rsa.h
|
||||
x_all.o: ../../include/openssl/safestack.h ../../include/openssl/sha.h
|
||||
x_all.o: ../../include/openssl/sm2.h ../../include/openssl/sm3.h
|
||||
x_all.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h
|
||||
x_all.o: ../../include/openssl/x509.h ../../include/openssl/x509_vfy.h
|
||||
x_all.o: ../../include/openssl/x509v3.h ../cryptlib.h x_all.c
|
||||
10
crypto/x509/build.info
Normal file
10
crypto/x509/build.info
Normal file
@@ -0,0 +1,10 @@
|
||||
LIBS=../../libcrypto
|
||||
SOURCE[../../libcrypto]=\
|
||||
x509_def.c x509_d2.c x509_r2x.c x509_cmp.c \
|
||||
x509_obj.c x509_req.c x509spki.c x509_vfy.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_crl.c t_crl.c x_req.c t_req.c x_x509.c t_x509.c \
|
||||
x_pubkey.c x_x509a.c x_attrib.c x_exten.c x_name.c
|
||||
@@ -1,66 +1,17 @@
|
||||
/* crypto/x509/by_dir.c */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
/*
|
||||
* Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
* 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 <time.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "cryptlib.h"
|
||||
#include "internal/cryptlib.h"
|
||||
|
||||
#ifndef NO_SYS_TYPES_H
|
||||
# include <sys/types.h>
|
||||
@@ -69,36 +20,37 @@
|
||||
# include <sys/stat.h>
|
||||
#endif
|
||||
|
||||
|
||||
#include <openssl/lhash.h>
|
||||
#include <openssl/x509.h>
|
||||
#include "internal/x509_int.h"
|
||||
#include "x509_lcl.h"
|
||||
|
||||
typedef struct lookup_dir_hashes_st {
|
||||
struct lookup_dir_hashes_st {
|
||||
unsigned long hash;
|
||||
int suffix;
|
||||
} BY_DIR_HASH;
|
||||
};
|
||||
|
||||
typedef struct lookup_dir_entry_st {
|
||||
struct lookup_dir_entry_st {
|
||||
char *dir;
|
||||
int dir_type;
|
||||
STACK_OF(BY_DIR_HASH) *hashes;
|
||||
} BY_DIR_ENTRY;
|
||||
};
|
||||
|
||||
typedef struct lookup_dir_st {
|
||||
BUF_MEM *buffer;
|
||||
STACK_OF(BY_DIR_ENTRY) *dirs;
|
||||
CRYPTO_RWLOCK *lock;
|
||||
} BY_DIR;
|
||||
|
||||
DECLARE_STACK_OF(BY_DIR_HASH)
|
||||
DECLARE_STACK_OF(BY_DIR_ENTRY)
|
||||
|
||||
static int dir_ctrl(X509_LOOKUP *ctx, int cmd, const char *argp, long argl,
|
||||
char **ret);
|
||||
static int new_dir(X509_LOOKUP *lu);
|
||||
static void free_dir(X509_LOOKUP *lu);
|
||||
static int add_cert_dir(BY_DIR *ctx, const char *dir, int type);
|
||||
static int get_cert_by_subject(X509_LOOKUP *xl, int type, X509_NAME *name,
|
||||
X509_OBJECT *ret);
|
||||
X509_LOOKUP_METHOD x509_dir_lookup = {
|
||||
static int get_cert_by_subject(X509_LOOKUP *xl, X509_LOOKUP_TYPE type,
|
||||
X509_NAME *name, X509_OBJECT *ret);
|
||||
static X509_LOOKUP_METHOD x509_dir_lookup = {
|
||||
"Load certs from files in a directory",
|
||||
new_dir, /* new */
|
||||
free_dir, /* free */
|
||||
@@ -148,15 +100,21 @@ static int new_dir(X509_LOOKUP *lu)
|
||||
{
|
||||
BY_DIR *a;
|
||||
|
||||
if ((a = (BY_DIR *)OPENSSL_malloc(sizeof(BY_DIR))) == NULL)
|
||||
return (0);
|
||||
if ((a = OPENSSL_malloc(sizeof(*a))) == NULL)
|
||||
return 0;
|
||||
if ((a->buffer = BUF_MEM_new()) == NULL) {
|
||||
OPENSSL_free(a);
|
||||
return (0);
|
||||
return 0;
|
||||
}
|
||||
a->dirs = NULL;
|
||||
a->lock = CRYPTO_THREAD_lock_new();
|
||||
if (a->lock == NULL) {
|
||||
BUF_MEM_free(a->buffer);
|
||||
OPENSSL_free(a);
|
||||
return 0;
|
||||
}
|
||||
lu->method_data = (char *)a;
|
||||
return (1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void by_dir_hash_free(BY_DIR_HASH *hash)
|
||||
@@ -176,10 +134,8 @@ static int by_dir_hash_cmp(const BY_DIR_HASH *const *a,
|
||||
|
||||
static void by_dir_entry_free(BY_DIR_ENTRY *ent)
|
||||
{
|
||||
if (ent->dir)
|
||||
OPENSSL_free(ent->dir);
|
||||
if (ent->hashes)
|
||||
sk_BY_DIR_HASH_pop_free(ent->hashes, by_dir_hash_free);
|
||||
OPENSSL_free(ent->dir);
|
||||
sk_BY_DIR_HASH_pop_free(ent->hashes, by_dir_hash_free);
|
||||
OPENSSL_free(ent);
|
||||
}
|
||||
|
||||
@@ -188,17 +144,15 @@ static void free_dir(X509_LOOKUP *lu)
|
||||
BY_DIR *a;
|
||||
|
||||
a = (BY_DIR *)lu->method_data;
|
||||
if (a->dirs != NULL)
|
||||
sk_BY_DIR_ENTRY_pop_free(a->dirs, by_dir_entry_free);
|
||||
if (a->buffer != NULL)
|
||||
BUF_MEM_free(a->buffer);
|
||||
sk_BY_DIR_ENTRY_pop_free(a->dirs, by_dir_entry_free);
|
||||
BUF_MEM_free(a->buffer);
|
||||
CRYPTO_THREAD_lock_free(a->lock);
|
||||
OPENSSL_free(a);
|
||||
}
|
||||
|
||||
static int add_cert_dir(BY_DIR *ctx, const char *dir, int type)
|
||||
{
|
||||
int j, len;
|
||||
const char *s, *ss, *p;
|
||||
const char *s, *p;
|
||||
|
||||
if (dir == NULL || !*dir) {
|
||||
X509err(X509_F_ADD_CERT_DIR, X509_R_INVALID_DIRECTORY);
|
||||
@@ -210,15 +164,17 @@ static int add_cert_dir(BY_DIR *ctx, const char *dir, int type)
|
||||
do {
|
||||
if ((*p == LIST_SEPARATOR_CHAR) || (*p == '\0')) {
|
||||
BY_DIR_ENTRY *ent;
|
||||
ss = s;
|
||||
int j;
|
||||
size_t len;
|
||||
const char *ss = s;
|
||||
s = p + 1;
|
||||
len = (int)(p - ss);
|
||||
len = p - ss;
|
||||
if (len == 0)
|
||||
continue;
|
||||
for (j = 0; j < sk_BY_DIR_ENTRY_num(ctx->dirs); j++) {
|
||||
ent = sk_BY_DIR_ENTRY_value(ctx->dirs, j);
|
||||
if (strlen(ent->dir) == (size_t)len &&
|
||||
strncmp(ent->dir, ss, (unsigned int)len) == 0)
|
||||
if (strlen(ent->dir) == len &&
|
||||
strncmp(ent->dir, ss, len) == 0)
|
||||
break;
|
||||
}
|
||||
if (j < sk_BY_DIR_ENTRY_num(ctx->dirs))
|
||||
@@ -230,18 +186,16 @@ static int add_cert_dir(BY_DIR *ctx, const char *dir, int type)
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
ent = OPENSSL_malloc(sizeof(BY_DIR_ENTRY));
|
||||
if (!ent)
|
||||
ent = OPENSSL_malloc(sizeof(*ent));
|
||||
if (ent == NULL)
|
||||
return 0;
|
||||
ent->dir_type = type;
|
||||
ent->hashes = sk_BY_DIR_HASH_new(by_dir_hash_cmp);
|
||||
ent->dir = OPENSSL_malloc((unsigned int)len + 1);
|
||||
if (!ent->dir || !ent->hashes) {
|
||||
ent->dir = OPENSSL_strndup(ss, len);
|
||||
if (ent->dir == NULL || ent->hashes == NULL) {
|
||||
by_dir_entry_free(ent);
|
||||
return 0;
|
||||
}
|
||||
strncpy(ent->dir, ss, (unsigned int)len);
|
||||
ent->dir[len] = '\0';
|
||||
if (!sk_BY_DIR_ENTRY_push(ctx->dirs, ent)) {
|
||||
by_dir_entry_free(ent);
|
||||
return 0;
|
||||
@@ -251,19 +205,13 @@ static int add_cert_dir(BY_DIR *ctx, const char *dir, int type)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int get_cert_by_subject(X509_LOOKUP *xl, int type, X509_NAME *name,
|
||||
X509_OBJECT *ret)
|
||||
static int get_cert_by_subject(X509_LOOKUP *xl, X509_LOOKUP_TYPE type,
|
||||
X509_NAME *name, X509_OBJECT *ret)
|
||||
{
|
||||
BY_DIR *ctx;
|
||||
union {
|
||||
struct {
|
||||
X509 st_x509;
|
||||
X509_CINF st_x509_cinf;
|
||||
} x509;
|
||||
struct {
|
||||
X509_CRL st_crl;
|
||||
X509_CRL_INFO st_crl_info;
|
||||
} crl;
|
||||
X509 st_x509;
|
||||
X509_CRL crl;
|
||||
} data;
|
||||
int ok = 0;
|
||||
int i, j, k;
|
||||
@@ -277,14 +225,12 @@ static int get_cert_by_subject(X509_LOOKUP *xl, int type, X509_NAME *name,
|
||||
|
||||
stmp.type = type;
|
||||
if (type == X509_LU_X509) {
|
||||
data.x509.st_x509.cert_info = &data.x509.st_x509_cinf;
|
||||
data.x509.st_x509_cinf.subject = name;
|
||||
stmp.data.x509 = &data.x509.st_x509;
|
||||
data.st_x509.cert_info.subject = name;
|
||||
stmp.data.x509 = &data.st_x509;
|
||||
postfix = "";
|
||||
} else if (type == X509_LU_CRL) {
|
||||
data.crl.st_crl.crl = &data.crl.st_crl_info;
|
||||
data.crl.st_crl_info.issuer = name;
|
||||
stmp.data.crl = &data.crl.st_crl;
|
||||
data.crl.crl.issuer = name;
|
||||
stmp.data.crl = &data.crl;
|
||||
postfix = "r";
|
||||
} else {
|
||||
X509err(X509_F_GET_CERT_BY_SUBJECT, X509_R_WRONG_LOOKUP_TYPE);
|
||||
@@ -311,7 +257,7 @@ static int get_cert_by_subject(X509_LOOKUP *xl, int type, X509_NAME *name,
|
||||
}
|
||||
if (type == X509_LU_CRL && ent->hashes) {
|
||||
htmp.hash = h;
|
||||
CRYPTO_r_lock(CRYPTO_LOCK_X509_STORE);
|
||||
CRYPTO_THREAD_read_lock(ctx->lock);
|
||||
idx = sk_BY_DIR_HASH_find(ent->hashes, &htmp);
|
||||
if (idx >= 0) {
|
||||
hent = sk_BY_DIR_HASH_value(ent->hashes, idx);
|
||||
@@ -320,7 +266,7 @@ static int get_cert_by_subject(X509_LOOKUP *xl, int type, X509_NAME *name,
|
||||
hent = NULL;
|
||||
k = 0;
|
||||
}
|
||||
CRYPTO_r_unlock(CRYPTO_LOCK_X509_STORE);
|
||||
CRYPTO_THREAD_unlock(ctx->lock);
|
||||
} else {
|
||||
k = 0;
|
||||
hent = NULL;
|
||||
@@ -377,18 +323,18 @@ static int get_cert_by_subject(X509_LOOKUP *xl, int type, X509_NAME *name,
|
||||
/*
|
||||
* we have added it to the cache so now pull it out again
|
||||
*/
|
||||
CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE);
|
||||
CRYPTO_THREAD_write_lock(ctx->lock);
|
||||
j = sk_X509_OBJECT_find(xl->store_ctx->objs, &stmp);
|
||||
if (j != -1)
|
||||
tmp = sk_X509_OBJECT_value(xl->store_ctx->objs, j);
|
||||
else
|
||||
tmp = NULL;
|
||||
CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE);
|
||||
CRYPTO_THREAD_unlock(ctx->lock);
|
||||
|
||||
/* If a CRL, update the last file suffix added for this */
|
||||
|
||||
if (type == X509_LU_CRL) {
|
||||
CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE);
|
||||
CRYPTO_THREAD_write_lock(ctx->lock);
|
||||
/*
|
||||
* Look for entry again in case another thread added an entry
|
||||
* first.
|
||||
@@ -400,19 +346,26 @@ static int get_cert_by_subject(X509_LOOKUP *xl, int type, X509_NAME *name,
|
||||
hent = sk_BY_DIR_HASH_value(ent->hashes, idx);
|
||||
}
|
||||
if (!hent) {
|
||||
hent = OPENSSL_malloc(sizeof(BY_DIR_HASH));
|
||||
hent = OPENSSL_malloc(sizeof(*hent));
|
||||
if (hent == NULL) {
|
||||
CRYPTO_THREAD_unlock(ctx->lock);
|
||||
X509err(X509_F_GET_CERT_BY_SUBJECT, ERR_R_MALLOC_FAILURE);
|
||||
ok = 0;
|
||||
goto finish;
|
||||
}
|
||||
hent->hash = h;
|
||||
hent->suffix = k;
|
||||
if (!sk_BY_DIR_HASH_push(ent->hashes, hent)) {
|
||||
CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE);
|
||||
CRYPTO_THREAD_unlock(ctx->lock);
|
||||
OPENSSL_free(hent);
|
||||
ok = 0;
|
||||
goto finish;
|
||||
}
|
||||
} else if (hent->suffix < k)
|
||||
} else if (hent->suffix < k) {
|
||||
hent->suffix = k;
|
||||
}
|
||||
|
||||
CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE);
|
||||
CRYPTO_THREAD_unlock(ctx->lock);
|
||||
|
||||
}
|
||||
|
||||
@@ -430,7 +383,6 @@ static int get_cert_by_subject(X509_LOOKUP *xl, int type, X509_NAME *name,
|
||||
}
|
||||
}
|
||||
finish:
|
||||
if (b != NULL)
|
||||
BUF_MEM_free(b);
|
||||
BUF_MEM_free(b);
|
||||
return (ok);
|
||||
}
|
||||
|
||||
@@ -1,76 +1,26 @@
|
||||
/* crypto/x509/by_file.c */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
/*
|
||||
* Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
* 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 <time.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "cryptlib.h"
|
||||
#include "internal/cryptlib.h"
|
||||
#include <openssl/lhash.h>
|
||||
#include <openssl/buffer.h>
|
||||
#include <openssl/x509.h>
|
||||
#include <openssl/pem.h>
|
||||
|
||||
#ifndef OPENSSL_NO_STDIO
|
||||
#include "x509_lcl.h"
|
||||
|
||||
static int by_file_ctrl(X509_LOOKUP *ctx, int cmd, const char *argc,
|
||||
long argl, char **ret);
|
||||
X509_LOOKUP_METHOD x509_file_lookup = {
|
||||
static X509_LOOKUP_METHOD x509_file_lookup = {
|
||||
"Load file into cache",
|
||||
NULL, /* new */
|
||||
NULL, /* free */
|
||||
@@ -131,7 +81,7 @@ int X509_load_cert_file(X509_LOOKUP *ctx, const char *file, int type)
|
||||
|
||||
if (file == NULL)
|
||||
return (1);
|
||||
in = BIO_new(BIO_s_file_internal());
|
||||
in = BIO_new(BIO_s_file());
|
||||
|
||||
if ((in == NULL) || (BIO_read_filename(in, file) <= 0)) {
|
||||
X509err(X509_F_X509_LOAD_CERT_FILE, ERR_R_SYS_LIB);
|
||||
@@ -174,10 +124,8 @@ int X509_load_cert_file(X509_LOOKUP *ctx, const char *file, int type)
|
||||
goto err;
|
||||
}
|
||||
err:
|
||||
if (x != NULL)
|
||||
X509_free(x);
|
||||
if (in != NULL)
|
||||
BIO_free(in);
|
||||
X509_free(x);
|
||||
BIO_free(in);
|
||||
return (ret);
|
||||
}
|
||||
|
||||
@@ -190,7 +138,7 @@ int X509_load_crl_file(X509_LOOKUP *ctx, const char *file, int type)
|
||||
|
||||
if (file == NULL)
|
||||
return (1);
|
||||
in = BIO_new(BIO_s_file_internal());
|
||||
in = BIO_new(BIO_s_file());
|
||||
|
||||
if ((in == NULL) || (BIO_read_filename(in, file) <= 0)) {
|
||||
X509err(X509_F_X509_LOAD_CRL_FILE, ERR_R_SYS_LIB);
|
||||
@@ -233,10 +181,8 @@ int X509_load_crl_file(X509_LOOKUP *ctx, const char *file, int type)
|
||||
goto err;
|
||||
}
|
||||
err:
|
||||
if (x != NULL)
|
||||
X509_CRL_free(x);
|
||||
if (in != NULL)
|
||||
BIO_free(in);
|
||||
X509_CRL_free(x);
|
||||
BIO_free(in);
|
||||
return (ret);
|
||||
}
|
||||
|
||||
@@ -273,5 +219,3 @@ int X509_load_cert_crl_file(X509_LOOKUP *ctx, const char *file, int type)
|
||||
sk_X509_INFO_pop_free(inf, X509_INFO_free);
|
||||
return count;
|
||||
}
|
||||
|
||||
#endif /* OPENSSL_NO_STDIO */
|
||||
|
||||
89
crypto/x509/t_crl.c
Normal file
89
crypto/x509/t_crl.c
Normal file
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
* 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/buffer.h>
|
||||
#include <openssl/bn.h>
|
||||
#include <openssl/objects.h>
|
||||
#include <openssl/x509.h>
|
||||
#include <openssl/x509v3.h>
|
||||
|
||||
#ifndef OPENSSL_NO_STDIO
|
||||
int X509_CRL_print_fp(FILE *fp, X509_CRL *x)
|
||||
{
|
||||
BIO *b;
|
||||
int ret;
|
||||
|
||||
if ((b = BIO_new(BIO_s_file())) == NULL) {
|
||||
X509err(X509_F_X509_CRL_PRINT_FP, ERR_R_BUF_LIB);
|
||||
return (0);
|
||||
}
|
||||
BIO_set_fp(b, fp, BIO_NOCLOSE);
|
||||
ret = X509_CRL_print(b, x);
|
||||
BIO_free(b);
|
||||
return (ret);
|
||||
}
|
||||
#endif
|
||||
|
||||
int X509_CRL_print(BIO *out, X509_CRL *x)
|
||||
{
|
||||
STACK_OF(X509_REVOKED) *rev;
|
||||
X509_REVOKED *r;
|
||||
const X509_ALGOR *sig_alg;
|
||||
const ASN1_BIT_STRING *sig;
|
||||
long l;
|
||||
int i;
|
||||
char *p;
|
||||
|
||||
BIO_printf(out, "Certificate Revocation List (CRL):\n");
|
||||
l = X509_CRL_get_version(x);
|
||||
if (l >= 0 && l <= 1)
|
||||
BIO_printf(out, "%8sVersion %ld (0x%lx)\n", "", l + 1, (unsigned long)l);
|
||||
else
|
||||
BIO_printf(out, "%8sVersion unknown (%ld)\n", "", l);
|
||||
X509_CRL_get0_signature(x, &sig, &sig_alg);
|
||||
X509_signature_print(out, sig_alg, NULL);
|
||||
p = X509_NAME_oneline(X509_CRL_get_issuer(x), NULL, 0);
|
||||
BIO_printf(out, "%8sIssuer: %s\n", "", p);
|
||||
OPENSSL_free(p);
|
||||
BIO_printf(out, "%8sLast Update: ", "");
|
||||
ASN1_TIME_print(out, X509_CRL_get0_lastUpdate(x));
|
||||
BIO_printf(out, "\n%8sNext Update: ", "");
|
||||
if (X509_CRL_get0_nextUpdate(x))
|
||||
ASN1_TIME_print(out, X509_CRL_get0_nextUpdate(x));
|
||||
else
|
||||
BIO_printf(out, "NONE");
|
||||
BIO_printf(out, "\n");
|
||||
|
||||
X509V3_extensions_print(out, "CRL extensions",
|
||||
X509_CRL_get0_extensions(x), 0, 8);
|
||||
|
||||
rev = X509_CRL_get_REVOKED(x);
|
||||
|
||||
if (sk_X509_REVOKED_num(rev) > 0)
|
||||
BIO_printf(out, "Revoked Certificates:\n");
|
||||
else
|
||||
BIO_printf(out, "No Revoked Certificates.\n");
|
||||
|
||||
for (i = 0; i < sk_X509_REVOKED_num(rev); i++) {
|
||||
r = sk_X509_REVOKED_value(rev, i);
|
||||
BIO_printf(out, " Serial Number: ");
|
||||
i2a_ASN1_INTEGER(out, X509_REVOKED_get0_serialNumber(r));
|
||||
BIO_printf(out, "\n Revocation Date: ");
|
||||
ASN1_TIME_print(out, X509_REVOKED_get0_revocationDate(r));
|
||||
BIO_printf(out, "\n");
|
||||
X509V3_extensions_print(out, "CRL entry extensions",
|
||||
X509_REVOKED_get0_extensions(r), 0, 8);
|
||||
}
|
||||
X509_signature_print(out, sig_alg, sig);
|
||||
|
||||
return 1;
|
||||
|
||||
}
|
||||
198
crypto/x509/t_req.c
Normal file
198
crypto/x509/t_req.c
Normal file
@@ -0,0 +1,198 @@
|
||||
/*
|
||||
* Copyright 1995-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/buffer.h>
|
||||
#include <openssl/bn.h>
|
||||
#include <openssl/objects.h>
|
||||
#include <openssl/x509.h>
|
||||
#include <openssl/x509v3.h>
|
||||
#include <openssl/rsa.h>
|
||||
#include <openssl/dsa.h>
|
||||
|
||||
#ifndef OPENSSL_NO_STDIO
|
||||
int X509_REQ_print_fp(FILE *fp, X509_REQ *x)
|
||||
{
|
||||
BIO *b;
|
||||
int ret;
|
||||
|
||||
if ((b = BIO_new(BIO_s_file())) == NULL) {
|
||||
X509err(X509_F_X509_REQ_PRINT_FP, ERR_R_BUF_LIB);
|
||||
return (0);
|
||||
}
|
||||
BIO_set_fp(b, fp, BIO_NOCLOSE);
|
||||
ret = X509_REQ_print(b, x);
|
||||
BIO_free(b);
|
||||
return (ret);
|
||||
}
|
||||
#endif
|
||||
|
||||
int X509_REQ_print_ex(BIO *bp, X509_REQ *x, unsigned long nmflags,
|
||||
unsigned long cflag)
|
||||
{
|
||||
long l;
|
||||
int i;
|
||||
EVP_PKEY *pkey;
|
||||
STACK_OF(X509_EXTENSION) *exts;
|
||||
char mlch = ' ';
|
||||
int nmindent = 0;
|
||||
|
||||
if ((nmflags & XN_FLAG_SEP_MASK) == XN_FLAG_SEP_MULTILINE) {
|
||||
mlch = '\n';
|
||||
nmindent = 12;
|
||||
}
|
||||
|
||||
if (nmflags == X509_FLAG_COMPAT)
|
||||
nmindent = 16;
|
||||
|
||||
if (!(cflag & X509_FLAG_NO_HEADER)) {
|
||||
if (BIO_write(bp, "Certificate Request:\n", 21) <= 0)
|
||||
goto err;
|
||||
if (BIO_write(bp, " Data:\n", 10) <= 0)
|
||||
goto err;
|
||||
}
|
||||
if (!(cflag & X509_FLAG_NO_VERSION)) {
|
||||
l = X509_REQ_get_version(x);
|
||||
if (l >= 0 && l <= 2) {
|
||||
if (BIO_printf(bp, "%8sVersion: %ld (0x%lx)\n", "", l + 1, (unsigned long)l) <= 0)
|
||||
goto err;
|
||||
} else {
|
||||
if (BIO_printf(bp, "%8sVersion: Unknown (%ld)\n", "", l) <= 0)
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
if (!(cflag & X509_FLAG_NO_SUBJECT)) {
|
||||
if (BIO_printf(bp, " Subject:%c", mlch) <= 0)
|
||||
goto err;
|
||||
if (X509_NAME_print_ex(bp, X509_REQ_get_subject_name(x),
|
||||
nmindent, nmflags) < 0)
|
||||
goto err;
|
||||
if (BIO_write(bp, "\n", 1) <= 0)
|
||||
goto err;
|
||||
}
|
||||
if (!(cflag & X509_FLAG_NO_PUBKEY)) {
|
||||
X509_PUBKEY *xpkey;
|
||||
ASN1_OBJECT *koid;
|
||||
if (BIO_write(bp, " Subject Public Key Info:\n", 33) <= 0)
|
||||
goto err;
|
||||
if (BIO_printf(bp, "%12sPublic Key Algorithm: ", "") <= 0)
|
||||
goto err;
|
||||
xpkey = X509_REQ_get_X509_PUBKEY(x);
|
||||
X509_PUBKEY_get0_param(&koid, NULL, NULL, NULL, xpkey);
|
||||
if (i2a_ASN1_OBJECT(bp, koid) <= 0)
|
||||
goto err;
|
||||
if (BIO_puts(bp, "\n") <= 0)
|
||||
goto err;
|
||||
|
||||
pkey = X509_REQ_get0_pubkey(x);
|
||||
if (pkey == NULL) {
|
||||
BIO_printf(bp, "%12sUnable to load Public Key\n", "");
|
||||
ERR_print_errors(bp);
|
||||
} else {
|
||||
EVP_PKEY_print_public(bp, pkey, 16, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
if (!(cflag & X509_FLAG_NO_ATTRIBUTES)) {
|
||||
/* may not be */
|
||||
if (BIO_printf(bp, "%8sAttributes:\n", "") <= 0)
|
||||
goto err;
|
||||
|
||||
if (X509_REQ_get_attr_count(x) == 0) {
|
||||
if (BIO_printf(bp, "%12sa0:00\n", "") <= 0)
|
||||
goto err;
|
||||
} else {
|
||||
for (i = 0; i < X509_REQ_get_attr_count(x); i++) {
|
||||
ASN1_TYPE *at;
|
||||
X509_ATTRIBUTE *a;
|
||||
ASN1_BIT_STRING *bs = NULL;
|
||||
ASN1_OBJECT *aobj;
|
||||
int j, type = 0, count = 1, ii = 0;
|
||||
|
||||
a = X509_REQ_get_attr(x, i);
|
||||
aobj = X509_ATTRIBUTE_get0_object(a);
|
||||
if (X509_REQ_extension_nid(OBJ_obj2nid(aobj)))
|
||||
continue;
|
||||
if (BIO_printf(bp, "%12s", "") <= 0)
|
||||
goto err;
|
||||
if ((j = i2a_ASN1_OBJECT(bp, aobj)) > 0) {
|
||||
ii = 0;
|
||||
count = X509_ATTRIBUTE_count(a);
|
||||
get_next:
|
||||
at = X509_ATTRIBUTE_get0_type(a, ii);
|
||||
type = at->type;
|
||||
bs = at->value.asn1_string;
|
||||
}
|
||||
for (j = 25 - j; j > 0; j--)
|
||||
if (BIO_write(bp, " ", 1) != 1)
|
||||
goto err;
|
||||
if (BIO_puts(bp, ":") <= 0)
|
||||
goto err;
|
||||
if ((type == V_ASN1_PRINTABLESTRING) ||
|
||||
(type == V_ASN1_T61STRING) ||
|
||||
(type == V_ASN1_UTF8STRING) ||
|
||||
(type == V_ASN1_IA5STRING)) {
|
||||
if (BIO_write(bp, (char *)bs->data, bs->length)
|
||||
!= bs->length)
|
||||
goto err;
|
||||
BIO_puts(bp, "\n");
|
||||
} else {
|
||||
BIO_puts(bp, "unable to print attribute\n");
|
||||
}
|
||||
if (++ii < count)
|
||||
goto get_next;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!(cflag & X509_FLAG_NO_EXTENSIONS)) {
|
||||
exts = X509_REQ_get_extensions(x);
|
||||
if (exts) {
|
||||
BIO_printf(bp, "%8sRequested Extensions:\n", "");
|
||||
for (i = 0; i < sk_X509_EXTENSION_num(exts); i++) {
|
||||
ASN1_OBJECT *obj;
|
||||
X509_EXTENSION *ex;
|
||||
int critical;
|
||||
ex = sk_X509_EXTENSION_value(exts, i);
|
||||
if (BIO_printf(bp, "%12s", "") <= 0)
|
||||
goto err;
|
||||
obj = X509_EXTENSION_get_object(ex);
|
||||
i2a_ASN1_OBJECT(bp, obj);
|
||||
critical = X509_EXTENSION_get_critical(ex);
|
||||
if (BIO_printf(bp, ": %s\n", critical ? "critical" : "") <= 0)
|
||||
goto err;
|
||||
if (!X509V3_EXT_print(bp, ex, cflag, 16)) {
|
||||
BIO_printf(bp, "%16s", "");
|
||||
ASN1_STRING_print(bp, X509_EXTENSION_get_data(ex));
|
||||
}
|
||||
if (BIO_write(bp, "\n", 1) <= 0)
|
||||
goto err;
|
||||
}
|
||||
sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free);
|
||||
}
|
||||
}
|
||||
|
||||
if (!(cflag & X509_FLAG_NO_SIGDUMP)) {
|
||||
const X509_ALGOR *sig_alg;
|
||||
const ASN1_BIT_STRING *sig;
|
||||
X509_REQ_get0_signature(x, &sig, &sig_alg);
|
||||
if (!X509_signature_print(bp, sig_alg, sig))
|
||||
goto err;
|
||||
}
|
||||
|
||||
return (1);
|
||||
err:
|
||||
X509err(X509_F_X509_REQ_PRINT_EX, ERR_R_BUF_LIB);
|
||||
return (0);
|
||||
}
|
||||
|
||||
int X509_REQ_print(BIO *bp, X509_REQ *x)
|
||||
{
|
||||
return X509_REQ_print_ex(bp, x, XN_FLAG_COMPAT, X509_FLAG_COMPAT);
|
||||
}
|
||||
376
crypto/x509/t_x509.c
Normal file
376
crypto/x509/t_x509.c
Normal file
@@ -0,0 +1,376 @@
|
||||
/*
|
||||
* Copyright 1995-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/buffer.h>
|
||||
#include <openssl/bn.h>
|
||||
#include <openssl/objects.h>
|
||||
#include <openssl/x509.h>
|
||||
#include <openssl/x509v3.h>
|
||||
#include "internal/asn1_int.h"
|
||||
|
||||
#ifndef OPENSSL_NO_STDIO
|
||||
int X509_print_fp(FILE *fp, X509 *x)
|
||||
{
|
||||
return X509_print_ex_fp(fp, x, XN_FLAG_COMPAT, X509_FLAG_COMPAT);
|
||||
}
|
||||
|
||||
int X509_print_ex_fp(FILE *fp, X509 *x, unsigned long nmflag,
|
||||
unsigned long cflag)
|
||||
{
|
||||
BIO *b;
|
||||
int ret;
|
||||
|
||||
if ((b = BIO_new(BIO_s_file())) == NULL) {
|
||||
X509err(X509_F_X509_PRINT_EX_FP, ERR_R_BUF_LIB);
|
||||
return (0);
|
||||
}
|
||||
BIO_set_fp(b, fp, BIO_NOCLOSE);
|
||||
ret = X509_print_ex(b, x, nmflag, cflag);
|
||||
BIO_free(b);
|
||||
return (ret);
|
||||
}
|
||||
#endif
|
||||
|
||||
int X509_print(BIO *bp, X509 *x)
|
||||
{
|
||||
return X509_print_ex(bp, x, XN_FLAG_COMPAT, X509_FLAG_COMPAT);
|
||||
}
|
||||
|
||||
int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflags,
|
||||
unsigned long cflag)
|
||||
{
|
||||
long l;
|
||||
int ret = 0, i;
|
||||
char *m = NULL, mlch = ' ';
|
||||
int nmindent = 0;
|
||||
ASN1_INTEGER *bs;
|
||||
EVP_PKEY *pkey = NULL;
|
||||
const char *neg;
|
||||
|
||||
if ((nmflags & XN_FLAG_SEP_MASK) == XN_FLAG_SEP_MULTILINE) {
|
||||
mlch = '\n';
|
||||
nmindent = 12;
|
||||
}
|
||||
|
||||
if (nmflags == X509_FLAG_COMPAT)
|
||||
nmindent = 16;
|
||||
|
||||
if (!(cflag & X509_FLAG_NO_HEADER)) {
|
||||
if (BIO_write(bp, "Certificate:\n", 13) <= 0)
|
||||
goto err;
|
||||
if (BIO_write(bp, " Data:\n", 10) <= 0)
|
||||
goto err;
|
||||
}
|
||||
if (!(cflag & X509_FLAG_NO_VERSION)) {
|
||||
l = X509_get_version(x);
|
||||
if (l >= 0 && l <= 2) {
|
||||
if (BIO_printf(bp, "%8sVersion: %ld (0x%lx)\n", "", l + 1, (unsigned long)l) <= 0)
|
||||
goto err;
|
||||
} else {
|
||||
if (BIO_printf(bp, "%8sVersion: Unknown (%ld)\n", "", l) <= 0)
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
if (!(cflag & X509_FLAG_NO_SERIAL)) {
|
||||
|
||||
if (BIO_write(bp, " Serial Number:", 22) <= 0)
|
||||
goto err;
|
||||
|
||||
bs = X509_get_serialNumber(x);
|
||||
if (bs->length <= (int)sizeof(long)) {
|
||||
ERR_set_mark();
|
||||
l = ASN1_INTEGER_get(bs);
|
||||
ERR_pop_to_mark();
|
||||
} else {
|
||||
l = -1;
|
||||
}
|
||||
if (l != -1) {
|
||||
unsigned long ul;
|
||||
if (bs->type == V_ASN1_NEG_INTEGER) {
|
||||
ul = 0 - (unsigned long)l;
|
||||
neg = "-";
|
||||
} else {
|
||||
ul = l;
|
||||
neg = "";
|
||||
}
|
||||
if (BIO_printf(bp, " %s%lu (%s0x%lx)\n", neg, ul, neg, ul) <= 0)
|
||||
goto err;
|
||||
} else {
|
||||
neg = (bs->type == V_ASN1_NEG_INTEGER) ? " (Negative)" : "";
|
||||
if (BIO_printf(bp, "\n%12s%s", "", neg) <= 0)
|
||||
goto err;
|
||||
|
||||
for (i = 0; i < bs->length; i++) {
|
||||
if (BIO_printf(bp, "%02x%c", bs->data[i],
|
||||
((i + 1 == bs->length) ? '\n' : ':')) <= 0)
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (!(cflag & X509_FLAG_NO_SIGNAME)) {
|
||||
const X509_ALGOR *tsig_alg = X509_get0_tbs_sigalg(x);
|
||||
if (X509_signature_print(bp, tsig_alg, NULL) <= 0)
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (!(cflag & X509_FLAG_NO_ISSUER)) {
|
||||
if (BIO_printf(bp, " Issuer:%c", mlch) <= 0)
|
||||
goto err;
|
||||
if (X509_NAME_print_ex(bp, X509_get_issuer_name(x), nmindent, nmflags)
|
||||
< 0)
|
||||
goto err;
|
||||
if (BIO_write(bp, "\n", 1) <= 0)
|
||||
goto err;
|
||||
}
|
||||
if (!(cflag & X509_FLAG_NO_VALIDITY)) {
|
||||
if (BIO_write(bp, " Validity\n", 17) <= 0)
|
||||
goto err;
|
||||
if (BIO_write(bp, " Not Before: ", 24) <= 0)
|
||||
goto err;
|
||||
if (!ASN1_TIME_print(bp, X509_get0_notBefore(x)))
|
||||
goto err;
|
||||
if (BIO_write(bp, "\n Not After : ", 25) <= 0)
|
||||
goto err;
|
||||
if (!ASN1_TIME_print(bp, X509_get0_notAfter(x)))
|
||||
goto err;
|
||||
if (BIO_write(bp, "\n", 1) <= 0)
|
||||
goto err;
|
||||
}
|
||||
if (!(cflag & X509_FLAG_NO_SUBJECT)) {
|
||||
if (BIO_printf(bp, " Subject:%c", mlch) <= 0)
|
||||
goto err;
|
||||
if (X509_NAME_print_ex
|
||||
(bp, X509_get_subject_name(x), nmindent, nmflags) < 0)
|
||||
goto err;
|
||||
if (BIO_write(bp, "\n", 1) <= 0)
|
||||
goto err;
|
||||
}
|
||||
if (!(cflag & X509_FLAG_NO_PUBKEY)) {
|
||||
X509_PUBKEY *xpkey = X509_get_X509_PUBKEY(x);
|
||||
ASN1_OBJECT *xpoid;
|
||||
X509_PUBKEY_get0_param(&xpoid, NULL, NULL, NULL, xpkey);
|
||||
if (BIO_write(bp, " Subject Public Key Info:\n", 33) <= 0)
|
||||
goto err;
|
||||
if (BIO_printf(bp, "%12sPublic Key Algorithm: ", "") <= 0)
|
||||
goto err;
|
||||
if (i2a_ASN1_OBJECT(bp, xpoid) <= 0)
|
||||
goto err;
|
||||
if (BIO_puts(bp, "\n") <= 0)
|
||||
goto err;
|
||||
|
||||
pkey = X509_get0_pubkey(x);
|
||||
if (pkey == NULL) {
|
||||
BIO_printf(bp, "%12sUnable to load Public Key\n", "");
|
||||
ERR_print_errors(bp);
|
||||
} else {
|
||||
EVP_PKEY_print_public(bp, pkey, 16, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
if (!(cflag & X509_FLAG_NO_IDS)) {
|
||||
const ASN1_BIT_STRING *iuid, *suid;
|
||||
X509_get0_uids(x, &iuid, &suid);
|
||||
if (iuid != NULL) {
|
||||
if (BIO_printf(bp, "%8sIssuer Unique ID: ", "") <= 0)
|
||||
goto err;
|
||||
if (!X509_signature_dump(bp, iuid, 12))
|
||||
goto err;
|
||||
}
|
||||
if (suid != NULL) {
|
||||
if (BIO_printf(bp, "%8sSubject Unique ID: ", "") <= 0)
|
||||
goto err;
|
||||
if (!X509_signature_dump(bp, suid, 12))
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
if (!(cflag & X509_FLAG_NO_EXTENSIONS))
|
||||
X509V3_extensions_print(bp, "X509v3 extensions",
|
||||
X509_get0_extensions(x), cflag, 8);
|
||||
|
||||
if (!(cflag & X509_FLAG_NO_SIGDUMP)) {
|
||||
const X509_ALGOR *sig_alg;
|
||||
const ASN1_BIT_STRING *sig;
|
||||
X509_get0_signature(&sig, &sig_alg, x);
|
||||
if (X509_signature_print(bp, sig_alg, sig) <= 0)
|
||||
goto err;
|
||||
}
|
||||
if (!(cflag & X509_FLAG_NO_AUX)) {
|
||||
if (!X509_aux_print(bp, x, 0))
|
||||
goto err;
|
||||
}
|
||||
ret = 1;
|
||||
err:
|
||||
OPENSSL_free(m);
|
||||
return (ret);
|
||||
}
|
||||
|
||||
int X509_ocspid_print(BIO *bp, X509 *x)
|
||||
{
|
||||
unsigned char *der = NULL;
|
||||
unsigned char *dertmp;
|
||||
int derlen;
|
||||
int i;
|
||||
unsigned char SHA1md[SHA_DIGEST_LENGTH];
|
||||
ASN1_BIT_STRING *keybstr;
|
||||
X509_NAME *subj;
|
||||
|
||||
/*
|
||||
* display the hash of the subject as it would appear in OCSP requests
|
||||
*/
|
||||
if (BIO_printf(bp, " Subject OCSP hash: ") <= 0)
|
||||
goto err;
|
||||
subj = X509_get_subject_name(x);
|
||||
derlen = i2d_X509_NAME(subj, NULL);
|
||||
if ((der = dertmp = OPENSSL_malloc(derlen)) == NULL)
|
||||
goto err;
|
||||
i2d_X509_NAME(subj, &dertmp);
|
||||
|
||||
if (!EVP_Digest(der, derlen, SHA1md, NULL, EVP_sha1(), NULL))
|
||||
goto err;
|
||||
for (i = 0; i < SHA_DIGEST_LENGTH; i++) {
|
||||
if (BIO_printf(bp, "%02X", SHA1md[i]) <= 0)
|
||||
goto err;
|
||||
}
|
||||
OPENSSL_free(der);
|
||||
der = NULL;
|
||||
|
||||
/*
|
||||
* display the hash of the public key as it would appear in OCSP requests
|
||||
*/
|
||||
if (BIO_printf(bp, "\n Public key OCSP hash: ") <= 0)
|
||||
goto err;
|
||||
|
||||
keybstr = X509_get0_pubkey_bitstr(x);
|
||||
|
||||
if (keybstr == NULL)
|
||||
goto err;
|
||||
|
||||
if (!EVP_Digest(ASN1_STRING_get0_data(keybstr),
|
||||
ASN1_STRING_length(keybstr), SHA1md, NULL, EVP_sha1(),
|
||||
NULL))
|
||||
goto err;
|
||||
for (i = 0; i < SHA_DIGEST_LENGTH; i++) {
|
||||
if (BIO_printf(bp, "%02X", SHA1md[i]) <= 0)
|
||||
goto err;
|
||||
}
|
||||
BIO_printf(bp, "\n");
|
||||
|
||||
return (1);
|
||||
err:
|
||||
OPENSSL_free(der);
|
||||
return (0);
|
||||
}
|
||||
|
||||
int X509_signature_dump(BIO *bp, const ASN1_STRING *sig, int indent)
|
||||
{
|
||||
const unsigned char *s;
|
||||
int i, n;
|
||||
|
||||
n = sig->length;
|
||||
s = sig->data;
|
||||
for (i = 0; i < n; i++) {
|
||||
if ((i % 18) == 0) {
|
||||
if (BIO_write(bp, "\n", 1) <= 0)
|
||||
return 0;
|
||||
if (BIO_indent(bp, indent, indent) <= 0)
|
||||
return 0;
|
||||
}
|
||||
if (BIO_printf(bp, "%02x%s", s[i], ((i + 1) == n) ? "" : ":") <= 0)
|
||||
return 0;
|
||||
}
|
||||
if (BIO_write(bp, "\n", 1) != 1)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int X509_signature_print(BIO *bp, const X509_ALGOR *sigalg,
|
||||
const ASN1_STRING *sig)
|
||||
{
|
||||
int sig_nid;
|
||||
if (BIO_puts(bp, " Signature Algorithm: ") <= 0)
|
||||
return 0;
|
||||
if (i2a_ASN1_OBJECT(bp, sigalg->algorithm) <= 0)
|
||||
return 0;
|
||||
|
||||
sig_nid = OBJ_obj2nid(sigalg->algorithm);
|
||||
if (sig_nid != NID_undef) {
|
||||
int pkey_nid, dig_nid;
|
||||
const EVP_PKEY_ASN1_METHOD *ameth;
|
||||
if (OBJ_find_sigid_algs(sig_nid, &dig_nid, &pkey_nid)) {
|
||||
ameth = EVP_PKEY_asn1_find(NULL, pkey_nid);
|
||||
if (ameth && ameth->sig_print)
|
||||
return ameth->sig_print(bp, sigalg, sig, 9, 0);
|
||||
}
|
||||
}
|
||||
if (sig)
|
||||
return X509_signature_dump(bp, sig, 9);
|
||||
else if (BIO_puts(bp, "\n") <= 0)
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int X509_aux_print(BIO *out, X509 *x, int indent)
|
||||
{
|
||||
char oidstr[80], first;
|
||||
STACK_OF(ASN1_OBJECT) *trust, *reject;
|
||||
const unsigned char *alias, *keyid;
|
||||
int keyidlen;
|
||||
int i;
|
||||
if (X509_trusted(x) == 0)
|
||||
return 1;
|
||||
trust = X509_get0_trust_objects(x);
|
||||
reject = X509_get0_reject_objects(x);
|
||||
if (trust) {
|
||||
first = 1;
|
||||
BIO_printf(out, "%*sTrusted Uses:\n%*s", indent, "", indent + 2, "");
|
||||
for (i = 0; i < sk_ASN1_OBJECT_num(trust); i++) {
|
||||
if (!first)
|
||||
BIO_puts(out, ", ");
|
||||
else
|
||||
first = 0;
|
||||
OBJ_obj2txt(oidstr, sizeof oidstr,
|
||||
sk_ASN1_OBJECT_value(trust, i), 0);
|
||||
BIO_puts(out, oidstr);
|
||||
}
|
||||
BIO_puts(out, "\n");
|
||||
} else
|
||||
BIO_printf(out, "%*sNo Trusted Uses.\n", indent, "");
|
||||
if (reject) {
|
||||
first = 1;
|
||||
BIO_printf(out, "%*sRejected Uses:\n%*s", indent, "", indent + 2, "");
|
||||
for (i = 0; i < sk_ASN1_OBJECT_num(reject); i++) {
|
||||
if (!first)
|
||||
BIO_puts(out, ", ");
|
||||
else
|
||||
first = 0;
|
||||
OBJ_obj2txt(oidstr, sizeof oidstr,
|
||||
sk_ASN1_OBJECT_value(reject, i), 0);
|
||||
BIO_puts(out, oidstr);
|
||||
}
|
||||
BIO_puts(out, "\n");
|
||||
} else
|
||||
BIO_printf(out, "%*sNo Rejected Uses.\n", indent, "");
|
||||
alias = X509_alias_get0(x, NULL);
|
||||
if (alias)
|
||||
BIO_printf(out, "%*sAlias: %s\n", indent, "", alias);
|
||||
keyid = X509_keyid_get0(x, &keyidlen);
|
||||
if (keyid) {
|
||||
BIO_printf(out, "%*sKey Id: ", indent, "");
|
||||
for (i = 0; i < keyidlen; i++)
|
||||
BIO_printf(out, "%s%02X", i ? ":" : "", keyid[i]);
|
||||
BIO_write(out, "\n", 1);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
@@ -1,208 +0,0 @@
|
||||
/*
|
||||
* Written by Matt Caswell for the OpenSSL project.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1998-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
|
||||
* openssl-core@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).
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <openssl/crypto.h>
|
||||
#include <openssl/bio.h>
|
||||
#include <openssl/x509.h>
|
||||
#include <openssl/pem.h>
|
||||
#include <openssl/err.h>
|
||||
|
||||
static STACK_OF(X509) *load_certs_from_file(const char *filename)
|
||||
{
|
||||
STACK_OF(X509) *certs;
|
||||
BIO *bio;
|
||||
X509 *x;
|
||||
|
||||
bio = BIO_new_file(filename, "r");
|
||||
|
||||
if (bio == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
certs = sk_X509_new_null();
|
||||
if (certs == NULL) {
|
||||
BIO_free(bio);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ERR_set_mark();
|
||||
do {
|
||||
x = PEM_read_bio_X509(bio, NULL, 0, NULL);
|
||||
if (x != NULL && !sk_X509_push(certs, x)) {
|
||||
sk_X509_pop_free(certs, X509_free);
|
||||
BIO_free(bio);
|
||||
return NULL;
|
||||
} else if (x == NULL) {
|
||||
/*
|
||||
* We probably just ran out of certs, so ignore any errors
|
||||
* generated
|
||||
*/
|
||||
ERR_pop_to_mark();
|
||||
}
|
||||
} while (x != NULL);
|
||||
|
||||
BIO_free(bio);
|
||||
|
||||
return certs;
|
||||
}
|
||||
|
||||
/*
|
||||
* Test for CVE-2015-1793 (Alternate Chains Certificate Forgery)
|
||||
*
|
||||
* Chain is as follows:
|
||||
*
|
||||
* rootCA (self-signed)
|
||||
* |
|
||||
* interCA
|
||||
* |
|
||||
* subinterCA subinterCA (self-signed)
|
||||
* | |
|
||||
* leaf ------------------
|
||||
* |
|
||||
* bad
|
||||
*
|
||||
* rootCA, interCA, subinterCA, subinterCA (ss) all have CA=TRUE
|
||||
* leaf and bad have CA=FALSE
|
||||
*
|
||||
* subinterCA and subinterCA (ss) have the same subject name and keys
|
||||
*
|
||||
* interCA (but not rootCA) and subinterCA (ss) are in the trusted store
|
||||
* (roots.pem)
|
||||
* leaf and subinterCA are in the untrusted list (untrusted.pem)
|
||||
* bad is the certificate being verified (bad.pem)
|
||||
*
|
||||
* Versions vulnerable to CVE-2015-1793 will fail to detect that leaf has
|
||||
* CA=FALSE, and will therefore incorrectly verify bad
|
||||
*
|
||||
*/
|
||||
static int test_alt_chains_cert_forgery(void)
|
||||
{
|
||||
int ret = 0;
|
||||
int i;
|
||||
X509 *x = NULL;
|
||||
STACK_OF(X509) *untrusted = NULL;
|
||||
BIO *bio = NULL;
|
||||
X509_STORE_CTX *sctx = NULL;
|
||||
X509_STORE *store = NULL;
|
||||
X509_LOOKUP *lookup = NULL;
|
||||
|
||||
store = X509_STORE_new();
|
||||
if (store == NULL)
|
||||
goto err;
|
||||
|
||||
lookup = X509_STORE_add_lookup(store, X509_LOOKUP_file());
|
||||
if (lookup == NULL)
|
||||
goto err;
|
||||
if(!X509_LOOKUP_load_file(lookup, "certs/roots.pem", X509_FILETYPE_PEM))
|
||||
goto err;
|
||||
|
||||
untrusted = load_certs_from_file("certs/untrusted.pem");
|
||||
|
||||
if ((bio = BIO_new_file("certs/bad.pem", "r")) == NULL)
|
||||
goto err;
|
||||
|
||||
if((x = PEM_read_bio_X509(bio, NULL, 0, NULL)) == NULL)
|
||||
goto err;
|
||||
|
||||
sctx = X509_STORE_CTX_new();
|
||||
if (sctx == NULL)
|
||||
goto err;
|
||||
|
||||
if (!X509_STORE_CTX_init(sctx, store, x, untrusted))
|
||||
goto err;
|
||||
|
||||
i = X509_verify_cert(sctx);
|
||||
|
||||
if(i == 0 && X509_STORE_CTX_get_error(sctx) == X509_V_ERR_INVALID_CA) {
|
||||
/* This is the result we were expecting: Test passed */
|
||||
ret = 1;
|
||||
}
|
||||
err:
|
||||
X509_STORE_CTX_free(sctx);
|
||||
X509_free(x);
|
||||
BIO_free(bio);
|
||||
sk_X509_pop_free(untrusted, X509_free);
|
||||
X509_STORE_free(store);
|
||||
if (ret != 1)
|
||||
ERR_print_errors_fp(stderr);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
CRYPTO_malloc_debug_init();
|
||||
CRYPTO_set_mem_debug_options(V_CRYPTO_MDEBUG_ALL);
|
||||
CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
|
||||
|
||||
ERR_load_crypto_strings();
|
||||
OpenSSL_add_all_digests();
|
||||
|
||||
if (!test_alt_chains_cert_forgery()) {
|
||||
fprintf(stderr, "Test alt chains cert forgery failed\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
EVP_cleanup();
|
||||
CRYPTO_cleanup_all_ex_data();
|
||||
ERR_remove_thread_state(NULL);
|
||||
ERR_free_strings();
|
||||
CRYPTO_mem_leaks_fp(stderr);
|
||||
|
||||
printf("PASS\n");
|
||||
return 0;
|
||||
}
|
||||
@@ -1,70 +0,0 @@
|
||||
/* vpm_int.h */
|
||||
/*
|
||||
* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project
|
||||
* 2013.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 2013 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 only structure to hold additional X509_VERIFY_PARAM data */
|
||||
|
||||
struct X509_VERIFY_PARAM_ID_st {
|
||||
STACK_OF(OPENSSL_STRING) *hosts; /* Set of acceptable names */
|
||||
unsigned int hostflags; /* Flags to control matching features */
|
||||
char *peername; /* Matching hostname in peer certificate */
|
||||
char *email; /* If not NULL email address to match */
|
||||
size_t emaillen;
|
||||
unsigned char *ip; /* If not NULL IP address to match */
|
||||
size_t iplen; /* Length of IP address */
|
||||
};
|
||||
1331
crypto/x509/x509.h
1331
crypto/x509/x509.h
File diff suppressed because it is too large
Load Diff
@@ -1,69 +1,21 @@
|
||||
/* crypto/x509/x509_att.c */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
/*
|
||||
* Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
* 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/stack.h>
|
||||
#include "cryptlib.h"
|
||||
#include "internal/cryptlib.h"
|
||||
#include <openssl/asn1.h>
|
||||
#include <openssl/objects.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/x509.h>
|
||||
#include <openssl/x509v3.h>
|
||||
#include "x509_lcl.h"
|
||||
|
||||
int X509at_get_attr_count(const STACK_OF(X509_ATTRIBUTE) *x)
|
||||
{
|
||||
@@ -73,16 +25,15 @@ int X509at_get_attr_count(const STACK_OF(X509_ATTRIBUTE) *x)
|
||||
int X509at_get_attr_by_NID(const STACK_OF(X509_ATTRIBUTE) *x, int nid,
|
||||
int lastpos)
|
||||
{
|
||||
ASN1_OBJECT *obj;
|
||||
const ASN1_OBJECT *obj = OBJ_nid2obj(nid);
|
||||
|
||||
obj = OBJ_nid2obj(nid);
|
||||
if (obj == NULL)
|
||||
return (-2);
|
||||
return (X509at_get_attr_by_OBJ(x, obj, lastpos));
|
||||
}
|
||||
|
||||
int X509at_get_attr_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *sk,
|
||||
ASN1_OBJECT *obj, int lastpos)
|
||||
const ASN1_OBJECT *obj, int lastpos)
|
||||
{
|
||||
int n;
|
||||
X509_ATTRIBUTE *ex;
|
||||
@@ -146,10 +97,8 @@ STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr(STACK_OF(X509_ATTRIBUTE) **x,
|
||||
err:
|
||||
X509err(X509_F_X509AT_ADD1_ATTR, ERR_R_MALLOC_FAILURE);
|
||||
err2:
|
||||
if (new_attr != NULL)
|
||||
X509_ATTRIBUTE_free(new_attr);
|
||||
if (sk != NULL)
|
||||
sk_X509_ATTRIBUTE_free(sk);
|
||||
X509_ATTRIBUTE_free(new_attr);
|
||||
sk_X509_ATTRIBUTE_free(sk);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -201,7 +150,7 @@ STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_txt(STACK_OF(X509_ATTRIBUTE)
|
||||
}
|
||||
|
||||
void *X509at_get0_data_by_OBJ(STACK_OF(X509_ATTRIBUTE) *x,
|
||||
ASN1_OBJECT *obj, int lastpos, int type)
|
||||
const ASN1_OBJECT *obj, int lastpos, int type)
|
||||
{
|
||||
int i;
|
||||
X509_ATTRIBUTE *at;
|
||||
@@ -290,13 +239,13 @@ int X509_ATTRIBUTE_set1_object(X509_ATTRIBUTE *attr, const ASN1_OBJECT *obj)
|
||||
return (0);
|
||||
ASN1_OBJECT_free(attr->object);
|
||||
attr->object = OBJ_dup(obj);
|
||||
return (1);
|
||||
return attr->object != NULL;
|
||||
}
|
||||
|
||||
int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype,
|
||||
const void *data, int len)
|
||||
{
|
||||
ASN1_TYPE *ttmp;
|
||||
ASN1_TYPE *ttmp = NULL;
|
||||
ASN1_STRING *stmp = NULL;
|
||||
int atype = 0;
|
||||
if (!attr)
|
||||
@@ -310,44 +259,45 @@ int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype,
|
||||
}
|
||||
atype = stmp->type;
|
||||
} else if (len != -1) {
|
||||
if (!(stmp = ASN1_STRING_type_new(attrtype)))
|
||||
if ((stmp = ASN1_STRING_type_new(attrtype)) == NULL)
|
||||
goto err;
|
||||
if (!ASN1_STRING_set(stmp, data, len))
|
||||
goto err;
|
||||
atype = attrtype;
|
||||
}
|
||||
if (!(attr->value.set = sk_ASN1_TYPE_new_null()))
|
||||
goto err;
|
||||
attr->single = 0;
|
||||
/*
|
||||
* This is a bit naughty because the attribute should really have at
|
||||
* least one value but some types use and zero length SET and require
|
||||
* this.
|
||||
*/
|
||||
if (attrtype == 0)
|
||||
if (attrtype == 0) {
|
||||
ASN1_STRING_free(stmp);
|
||||
return 1;
|
||||
if (!(ttmp = ASN1_TYPE_new()))
|
||||
}
|
||||
if ((ttmp = ASN1_TYPE_new()) == NULL)
|
||||
goto err;
|
||||
if ((len == -1) && !(attrtype & MBSTRING_FLAG)) {
|
||||
if (!ASN1_TYPE_set1(ttmp, attrtype, data))
|
||||
goto err;
|
||||
} else
|
||||
} else {
|
||||
ASN1_TYPE_set(ttmp, atype, stmp);
|
||||
if (!sk_ASN1_TYPE_push(attr->value.set, ttmp))
|
||||
stmp = NULL;
|
||||
}
|
||||
if (!sk_ASN1_TYPE_push(attr->set, ttmp))
|
||||
goto err;
|
||||
return 1;
|
||||
err:
|
||||
X509err(X509_F_X509_ATTRIBUTE_SET1_DATA, ERR_R_MALLOC_FAILURE);
|
||||
ASN1_TYPE_free(ttmp);
|
||||
ASN1_STRING_free(stmp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int X509_ATTRIBUTE_count(X509_ATTRIBUTE *attr)
|
||||
int X509_ATTRIBUTE_count(const X509_ATTRIBUTE *attr)
|
||||
{
|
||||
if (!attr->single)
|
||||
return sk_ASN1_TYPE_num(attr->value.set);
|
||||
if (attr->value.single)
|
||||
return 1;
|
||||
return 0;
|
||||
if (attr == NULL)
|
||||
return 0;
|
||||
return sk_ASN1_TYPE_num(attr->set);
|
||||
}
|
||||
|
||||
ASN1_OBJECT *X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr)
|
||||
@@ -374,11 +324,6 @@ void *X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx,
|
||||
ASN1_TYPE *X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr, int idx)
|
||||
{
|
||||
if (attr == NULL)
|
||||
return (NULL);
|
||||
if (idx >= X509_ATTRIBUTE_count(attr))
|
||||
return NULL;
|
||||
if (!attr->single)
|
||||
return sk_ASN1_TYPE_value(attr->value.set, idx);
|
||||
else
|
||||
return attr->value.single;
|
||||
return sk_ASN1_TYPE_value(attr->set, idx);
|
||||
}
|
||||
|
||||
@@ -1,77 +1,29 @@
|
||||
/* crypto/x509/x509_cmp.c */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
/*
|
||||
* Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
* 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 <ctype.h>
|
||||
#include "cryptlib.h"
|
||||
#include "internal/cryptlib.h"
|
||||
#include <openssl/asn1.h>
|
||||
#include <openssl/objects.h>
|
||||
#include <openssl/x509.h>
|
||||
#include <openssl/x509v3.h>
|
||||
#include "internal/x509_int.h"
|
||||
|
||||
int X509_issuer_and_serial_cmp(const X509 *a, const X509 *b)
|
||||
{
|
||||
int i;
|
||||
X509_CINF *ai, *bi;
|
||||
const X509_CINF *ai, *bi;
|
||||
|
||||
ai = a->cert_info;
|
||||
bi = b->cert_info;
|
||||
i = M_ASN1_INTEGER_cmp(ai->serialNumber, bi->serialNumber);
|
||||
ai = &a->cert_info;
|
||||
bi = &b->cert_info;
|
||||
i = ASN1_INTEGER_cmp(&ai->serialNumber, &bi->serialNumber);
|
||||
if (i)
|
||||
return (i);
|
||||
return (X509_NAME_cmp(ai->issuer, bi->issuer));
|
||||
@@ -81,94 +33,97 @@ int X509_issuer_and_serial_cmp(const X509 *a, const X509 *b)
|
||||
unsigned long X509_issuer_and_serial_hash(X509 *a)
|
||||
{
|
||||
unsigned long ret = 0;
|
||||
EVP_MD_CTX ctx;
|
||||
EVP_MD_CTX *ctx = EVP_MD_CTX_new();
|
||||
unsigned char md[16];
|
||||
char *f;
|
||||
|
||||
EVP_MD_CTX_init(&ctx);
|
||||
f = X509_NAME_oneline(a->cert_info->issuer, NULL, 0);
|
||||
if (!EVP_DigestInit_ex(&ctx, EVP_md5(), NULL))
|
||||
if (ctx == NULL)
|
||||
goto err;
|
||||
if (!EVP_DigestUpdate(&ctx, (unsigned char *)f, strlen(f)))
|
||||
f = X509_NAME_oneline(a->cert_info.issuer, NULL, 0);
|
||||
if (!EVP_DigestInit_ex(ctx, EVP_md5(), NULL))
|
||||
goto err;
|
||||
if (!EVP_DigestUpdate(ctx, (unsigned char *)f, strlen(f)))
|
||||
goto err;
|
||||
OPENSSL_free(f);
|
||||
if (!EVP_DigestUpdate
|
||||
(&ctx, (unsigned char *)a->cert_info->serialNumber->data,
|
||||
(unsigned long)a->cert_info->serialNumber->length))
|
||||
(ctx, (unsigned char *)a->cert_info.serialNumber.data,
|
||||
(unsigned long)a->cert_info.serialNumber.length))
|
||||
goto err;
|
||||
if (!EVP_DigestFinal_ex(&ctx, &(md[0]), NULL))
|
||||
if (!EVP_DigestFinal_ex(ctx, &(md[0]), NULL))
|
||||
goto err;
|
||||
ret = (((unsigned long)md[0]) | ((unsigned long)md[1] << 8L) |
|
||||
((unsigned long)md[2] << 16L) | ((unsigned long)md[3] << 24L)
|
||||
) & 0xffffffffL;
|
||||
err:
|
||||
EVP_MD_CTX_cleanup(&ctx);
|
||||
EVP_MD_CTX_free(ctx);
|
||||
return (ret);
|
||||
}
|
||||
#endif
|
||||
|
||||
int X509_issuer_name_cmp(const X509 *a, const X509 *b)
|
||||
{
|
||||
return (X509_NAME_cmp(a->cert_info->issuer, b->cert_info->issuer));
|
||||
return (X509_NAME_cmp(a->cert_info.issuer, b->cert_info.issuer));
|
||||
}
|
||||
|
||||
int X509_subject_name_cmp(const X509 *a, const X509 *b)
|
||||
{
|
||||
return (X509_NAME_cmp(a->cert_info->subject, b->cert_info->subject));
|
||||
return (X509_NAME_cmp(a->cert_info.subject, b->cert_info.subject));
|
||||
}
|
||||
|
||||
int X509_CRL_cmp(const X509_CRL *a, const X509_CRL *b)
|
||||
{
|
||||
return (X509_NAME_cmp(a->crl->issuer, b->crl->issuer));
|
||||
return (X509_NAME_cmp(a->crl.issuer, b->crl.issuer));
|
||||
}
|
||||
|
||||
#ifndef OPENSSL_NO_SHA
|
||||
int X509_CRL_match(const X509_CRL *a, const X509_CRL *b)
|
||||
{
|
||||
return memcmp(a->sha1_hash, b->sha1_hash, 20);
|
||||
}
|
||||
#endif
|
||||
|
||||
X509_NAME *X509_get_issuer_name(X509 *a)
|
||||
X509_NAME *X509_get_issuer_name(const X509 *a)
|
||||
{
|
||||
return (a->cert_info->issuer);
|
||||
return (a->cert_info.issuer);
|
||||
}
|
||||
|
||||
unsigned long X509_issuer_name_hash(X509 *x)
|
||||
{
|
||||
return (X509_NAME_hash(x->cert_info->issuer));
|
||||
return (X509_NAME_hash(x->cert_info.issuer));
|
||||
}
|
||||
|
||||
#ifndef OPENSSL_NO_MD5
|
||||
unsigned long X509_issuer_name_hash_old(X509 *x)
|
||||
{
|
||||
return (X509_NAME_hash_old(x->cert_info->issuer));
|
||||
return (X509_NAME_hash_old(x->cert_info.issuer));
|
||||
}
|
||||
#endif
|
||||
|
||||
X509_NAME *X509_get_subject_name(X509 *a)
|
||||
X509_NAME *X509_get_subject_name(const X509 *a)
|
||||
{
|
||||
return (a->cert_info->subject);
|
||||
return (a->cert_info.subject);
|
||||
}
|
||||
|
||||
ASN1_INTEGER *X509_get_serialNumber(X509 *a)
|
||||
{
|
||||
return (a->cert_info->serialNumber);
|
||||
return &a->cert_info.serialNumber;
|
||||
}
|
||||
|
||||
const ASN1_INTEGER *X509_get0_serialNumber(const X509 *a)
|
||||
{
|
||||
return &a->cert_info.serialNumber;
|
||||
}
|
||||
|
||||
unsigned long X509_subject_name_hash(X509 *x)
|
||||
{
|
||||
return (X509_NAME_hash(x->cert_info->subject));
|
||||
return (X509_NAME_hash(x->cert_info.subject));
|
||||
}
|
||||
|
||||
#ifndef OPENSSL_NO_MD5
|
||||
unsigned long X509_subject_name_hash_old(X509 *x)
|
||||
{
|
||||
return (X509_NAME_hash_old(x->cert_info->subject));
|
||||
return (X509_NAME_hash_old(x->cert_info.subject));
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef OPENSSL_NO_SHA
|
||||
/*
|
||||
* Compare two certificates: they must be identical for this to work. NB:
|
||||
* Although "cmp" operations are generally prototyped to take "const"
|
||||
@@ -188,16 +143,16 @@ int X509_cmp(const X509 *a, const X509 *b)
|
||||
if (rv)
|
||||
return rv;
|
||||
/* Check for match against stored encoding too */
|
||||
if (!a->cert_info->enc.modified && !b->cert_info->enc.modified) {
|
||||
rv = (int)(a->cert_info->enc.len - b->cert_info->enc.len);
|
||||
if (rv)
|
||||
return rv;
|
||||
return memcmp(a->cert_info->enc.enc, b->cert_info->enc.enc,
|
||||
a->cert_info->enc.len);
|
||||
if (!a->cert_info.enc.modified && !b->cert_info.enc.modified) {
|
||||
if (a->cert_info.enc.len < b->cert_info.enc.len)
|
||||
return -1;
|
||||
if (a->cert_info.enc.len > b->cert_info.enc.len)
|
||||
return 1;
|
||||
return memcmp(a->cert_info.enc.enc, b->cert_info.enc.enc,
|
||||
a->cert_info.enc.len);
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
#endif
|
||||
|
||||
int X509_NAME_cmp(const X509_NAME *a, const X509_NAME *b)
|
||||
{
|
||||
@@ -251,21 +206,23 @@ unsigned long X509_NAME_hash(X509_NAME *x)
|
||||
|
||||
unsigned long X509_NAME_hash_old(X509_NAME *x)
|
||||
{
|
||||
EVP_MD_CTX md_ctx;
|
||||
EVP_MD_CTX *md_ctx = EVP_MD_CTX_new();
|
||||
unsigned long ret = 0;
|
||||
unsigned char md[16];
|
||||
|
||||
if (md_ctx == NULL)
|
||||
return ret;
|
||||
|
||||
/* Make sure X509_NAME structure contains valid cached encoding */
|
||||
i2d_X509_NAME(x, NULL);
|
||||
EVP_MD_CTX_init(&md_ctx);
|
||||
EVP_MD_CTX_set_flags(&md_ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
|
||||
if (EVP_DigestInit_ex(&md_ctx, EVP_md5(), NULL)
|
||||
&& EVP_DigestUpdate(&md_ctx, x->bytes->data, x->bytes->length)
|
||||
&& EVP_DigestFinal_ex(&md_ctx, md, NULL))
|
||||
EVP_MD_CTX_set_flags(md_ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
|
||||
if (EVP_DigestInit_ex(md_ctx, EVP_md5(), NULL)
|
||||
&& EVP_DigestUpdate(md_ctx, x->bytes->data, x->bytes->length)
|
||||
&& EVP_DigestFinal_ex(md_ctx, md, NULL))
|
||||
ret = (((unsigned long)md[0]) | ((unsigned long)md[1] << 8L) |
|
||||
((unsigned long)md[2] << 16L) | ((unsigned long)md[3] << 24L)
|
||||
) & 0xffffffffL;
|
||||
EVP_MD_CTX_cleanup(&md_ctx);
|
||||
EVP_MD_CTX_free(md_ctx);
|
||||
|
||||
return (ret);
|
||||
}
|
||||
@@ -276,15 +233,13 @@ X509 *X509_find_by_issuer_and_serial(STACK_OF(X509) *sk, X509_NAME *name,
|
||||
ASN1_INTEGER *serial)
|
||||
{
|
||||
int i;
|
||||
X509_CINF cinf;
|
||||
X509 x, *x509 = NULL;
|
||||
|
||||
if (!sk)
|
||||
return NULL;
|
||||
|
||||
x.cert_info = &cinf;
|
||||
cinf.serialNumber = serial;
|
||||
cinf.issuer = name;
|
||||
x.cert_info.serialNumber = *serial;
|
||||
x.cert_info.issuer = name;
|
||||
|
||||
for (i = 0; i < sk_X509_num(sk); i++) {
|
||||
x509 = sk_X509_value(sk, i);
|
||||
@@ -307,26 +262,26 @@ X509 *X509_find_by_subject(STACK_OF(X509) *sk, X509_NAME *name)
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
EVP_PKEY *X509_get0_pubkey(const X509 *x)
|
||||
{
|
||||
if (x == NULL)
|
||||
return NULL;
|
||||
return X509_PUBKEY_get0(x->cert_info.key);
|
||||
}
|
||||
|
||||
EVP_PKEY *X509_get_pubkey(X509 *x)
|
||||
{
|
||||
if ((x == NULL) || (x->cert_info == NULL))
|
||||
return (NULL);
|
||||
return (X509_PUBKEY_get(x->cert_info->key));
|
||||
}
|
||||
|
||||
ASN1_BIT_STRING *X509_get0_pubkey_bitstr(const X509 *x)
|
||||
{
|
||||
if (!x)
|
||||
if (x == NULL)
|
||||
return NULL;
|
||||
return x->cert_info->key->public_key;
|
||||
return X509_PUBKEY_get(x->cert_info.key);
|
||||
}
|
||||
|
||||
int X509_check_private_key(X509 *x, EVP_PKEY *k)
|
||||
int X509_check_private_key(const X509 *x, const EVP_PKEY *k)
|
||||
{
|
||||
EVP_PKEY *xk;
|
||||
const EVP_PKEY *xk;
|
||||
int ret;
|
||||
|
||||
xk = X509_get_pubkey(x);
|
||||
xk = X509_get0_pubkey(x);
|
||||
|
||||
if (xk)
|
||||
ret = EVP_PKEY_cmp(xk, k);
|
||||
@@ -345,8 +300,6 @@ int X509_check_private_key(X509 *x, EVP_PKEY *k)
|
||||
case -2:
|
||||
X509err(X509_F_X509_CHECK_PRIVATE_KEY, X509_R_UNKNOWN_KEY_TYPE);
|
||||
}
|
||||
if (xk)
|
||||
EVP_PKEY_free(xk);
|
||||
if (ret > 0)
|
||||
return 1;
|
||||
return 0;
|
||||
@@ -364,8 +317,8 @@ static int check_suite_b(EVP_PKEY *pkey, int sign_nid, unsigned long *pflags)
|
||||
{
|
||||
const EC_GROUP *grp = NULL;
|
||||
int curve_nid;
|
||||
if (pkey && pkey->type == EVP_PKEY_EC)
|
||||
grp = EC_KEY_get0_group(pkey->pkey.ec);
|
||||
if (pkey && EVP_PKEY_id(pkey) == EVP_PKEY_EC)
|
||||
grp = EC_KEY_get0_group(EVP_PKEY_get0_EC_KEY(pkey));
|
||||
if (!grp)
|
||||
return X509_V_ERR_SUITE_B_INVALID_ALGORITHM;
|
||||
curve_nid = EC_GROUP_get_curve_name(grp);
|
||||
@@ -395,11 +348,12 @@ int X509_chain_check_suiteb(int *perror_depth, X509 *x, STACK_OF(X509) *chain,
|
||||
unsigned long flags)
|
||||
{
|
||||
int rv, i, sign_nid;
|
||||
EVP_PKEY *pk = NULL;
|
||||
unsigned long tflags;
|
||||
EVP_PKEY *pk;
|
||||
unsigned long tflags = flags;
|
||||
|
||||
if (!(flags & X509_V_FLAG_SUITEB_128_LOS))
|
||||
return X509_V_OK;
|
||||
tflags = flags;
|
||||
|
||||
/* If no EE certificate passed in must be first in chain */
|
||||
if (x == NULL) {
|
||||
x = sk_X509_value(chain, 0);
|
||||
@@ -407,6 +361,17 @@ int X509_chain_check_suiteb(int *perror_depth, X509 *x, STACK_OF(X509) *chain,
|
||||
} else
|
||||
i = 0;
|
||||
|
||||
pk = X509_get0_pubkey(x);
|
||||
|
||||
/*
|
||||
* With DANE-EE(3) success, or DANE-EE(3)/PKIX-EE(1) failure we don't build
|
||||
* a chain all, just report trust success or failure, but must also report
|
||||
* Suite-B errors if applicable. This is indicated via a NULL chain
|
||||
* pointer. All we need to do is check the leaf key algorithm.
|
||||
*/
|
||||
if (chain == NULL)
|
||||
return check_suite_b(pk, -1, &tflags);
|
||||
|
||||
if (X509_get_version(x) != 2) {
|
||||
rv = X509_V_ERR_SUITE_B_INVALID_VERSION;
|
||||
/* Correct error depth */
|
||||
@@ -414,7 +379,6 @@ int X509_chain_check_suiteb(int *perror_depth, X509 *x, STACK_OF(X509) *chain,
|
||||
goto end;
|
||||
}
|
||||
|
||||
pk = X509_get_pubkey(x);
|
||||
/* Check EE key only */
|
||||
rv = check_suite_b(pk, -1, &tflags);
|
||||
if (rv != X509_V_OK) {
|
||||
@@ -429,8 +393,7 @@ int X509_chain_check_suiteb(int *perror_depth, X509 *x, STACK_OF(X509) *chain,
|
||||
rv = X509_V_ERR_SUITE_B_INVALID_VERSION;
|
||||
goto end;
|
||||
}
|
||||
EVP_PKEY_free(pk);
|
||||
pk = X509_get_pubkey(x);
|
||||
pk = X509_get0_pubkey(x);
|
||||
rv = check_suite_b(pk, sign_nid, &tflags);
|
||||
if (rv != X509_V_OK)
|
||||
goto end;
|
||||
@@ -439,8 +402,6 @@ int X509_chain_check_suiteb(int *perror_depth, X509 *x, STACK_OF(X509) *chain,
|
||||
/* Final check: root CA signature */
|
||||
rv = check_suite_b(pk, X509_get_signature_nid(x), &tflags);
|
||||
end:
|
||||
if (pk)
|
||||
EVP_PKEY_free(pk);
|
||||
if (rv != X509_V_OK) {
|
||||
/* Invalid signature or LOS errors are for previous cert */
|
||||
if ((rv == X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM
|
||||
@@ -448,7 +409,7 @@ int X509_chain_check_suiteb(int *perror_depth, X509 *x, STACK_OF(X509) *chain,
|
||||
i--;
|
||||
/*
|
||||
* If we have LOS error and flags changed then we are signing P-384
|
||||
* with P-256. Use more meaninggul error.
|
||||
* with P-256. Use more meaningful error.
|
||||
*/
|
||||
if (rv == X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED && flags != tflags)
|
||||
rv = X509_V_ERR_SUITE_B_CANNOT_SIGN_P_384_WITH_P_256;
|
||||
@@ -463,7 +424,7 @@ int X509_CRL_check_suiteb(X509_CRL *crl, EVP_PKEY *pk, unsigned long flags)
|
||||
int sign_nid;
|
||||
if (!(flags & X509_V_FLAG_SUITEB_128_LOS))
|
||||
return X509_V_OK;
|
||||
sign_nid = OBJ_obj2nid(crl->crl->sig_alg->algorithm);
|
||||
sign_nid = OBJ_obj2nid(crl->crl.sig_alg.algorithm);
|
||||
return check_suite_b(pk, sign_nid, &flags);
|
||||
}
|
||||
|
||||
@@ -492,7 +453,7 @@ STACK_OF(X509) *X509_chain_up_ref(STACK_OF(X509) *chain)
|
||||
ret = sk_X509_dup(chain);
|
||||
for (i = 0; i < sk_X509_num(ret); i++) {
|
||||
X509 *x = sk_X509_value(ret, i);
|
||||
CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509);
|
||||
X509_up_ref(x);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1,67 +1,17 @@
|
||||
/* crypto/x509/x509_d2.c */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
/*
|
||||
* Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
* 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 "cryptlib.h"
|
||||
#include "internal/cryptlib.h"
|
||||
#include <openssl/crypto.h>
|
||||
#include <openssl/x509.h>
|
||||
|
||||
#ifndef OPENSSL_NO_STDIO
|
||||
int X509_STORE_set_default_paths(X509_STORE *ctx)
|
||||
{
|
||||
X509_LOOKUP *lookup;
|
||||
@@ -86,13 +36,6 @@ int X509_STORE_load_locations(X509_STORE *ctx, const char *file,
|
||||
const char *path)
|
||||
{
|
||||
X509_LOOKUP *lookup;
|
||||
|
||||
//Support Go:
|
||||
//Go调用此函数传递空串时处理异常
|
||||
if (file && *file == '\0')
|
||||
file = NULL;
|
||||
if (path && *path == '\0')
|
||||
path = NULL;
|
||||
|
||||
if (file != NULL) {
|
||||
lookup = X509_STORE_add_lookup(ctx, X509_LOOKUP_file());
|
||||
@@ -112,5 +55,3 @@ int X509_STORE_load_locations(X509_STORE *ctx, const char *file,
|
||||
return (0);
|
||||
return (1);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,63 +1,14 @@
|
||||
/* crypto/x509/x509_def.c */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
/*
|
||||
* Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
* 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 "cryptlib.h"
|
||||
#include "internal/cryptlib.h"
|
||||
#include <openssl/crypto.h>
|
||||
#include <openssl/x509.h>
|
||||
|
||||
|
||||
@@ -1,62 +1,11 @@
|
||||
/* crypto/x509/x509_err.c */
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1999-2012 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
|
||||
* openssl-core@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).
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* NOTE: this file was auto generated by the mkerr.pl script: any changes
|
||||
* made to it will be overwritten when the script next updates this file,
|
||||
* only reason strings will be preserved.
|
||||
* Generated by util/mkerr.pl DO NOT EDIT
|
||||
* Copyright 1995-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>
|
||||
@@ -70,11 +19,14 @@
|
||||
# define ERR_REASON(reason) ERR_PACK(ERR_LIB_X509,0,reason)
|
||||
|
||||
static ERR_STRING_DATA X509_str_functs[] = {
|
||||
{ERR_FUNC(X509_F_ADD_CERT_DIR), "ADD_CERT_DIR"},
|
||||
{ERR_FUNC(X509_F_BY_FILE_CTRL), "BY_FILE_CTRL"},
|
||||
{ERR_FUNC(X509_F_CHECK_POLICY), "CHECK_POLICY"},
|
||||
{ERR_FUNC(X509_F_DIR_CTRL), "DIR_CTRL"},
|
||||
{ERR_FUNC(X509_F_GET_CERT_BY_SUBJECT), "GET_CERT_BY_SUBJECT"},
|
||||
{ERR_FUNC(X509_F_ADD_CERT_DIR), "add_cert_dir"},
|
||||
{ERR_FUNC(X509_F_BUILD_CHAIN), "build_chain"},
|
||||
{ERR_FUNC(X509_F_BY_FILE_CTRL), "by_file_ctrl"},
|
||||
{ERR_FUNC(X509_F_CHECK_NAME_CONSTRAINTS), "check_name_constraints"},
|
||||
{ERR_FUNC(X509_F_CHECK_POLICY), "check_policy"},
|
||||
{ERR_FUNC(X509_F_DANE_I2D), "dane_i2d"},
|
||||
{ERR_FUNC(X509_F_DIR_CTRL), "dir_ctrl"},
|
||||
{ERR_FUNC(X509_F_GET_CERT_BY_SUBJECT), "get_cert_by_subject"},
|
||||
{ERR_FUNC(X509_F_NETSCAPE_SPKI_B64_DECODE), "NETSCAPE_SPKI_b64_decode"},
|
||||
{ERR_FUNC(X509_F_NETSCAPE_SPKI_B64_ENCODE), "NETSCAPE_SPKI_b64_encode"},
|
||||
{ERR_FUNC(X509_F_X509AT_ADD1_ATTR), "X509at_add1_attr"},
|
||||
@@ -108,8 +60,10 @@ static ERR_STRING_DATA X509_str_functs[] = {
|
||||
"X509_NAME_ENTRY_set_object"},
|
||||
{ERR_FUNC(X509_F_X509_NAME_ONELINE), "X509_NAME_oneline"},
|
||||
{ERR_FUNC(X509_F_X509_NAME_PRINT), "X509_NAME_print"},
|
||||
{ERR_FUNC(X509_F_X509_OBJECT_NEW), "X509_OBJECT_new"},
|
||||
{ERR_FUNC(X509_F_X509_PRINT_EX_FP), "X509_print_ex_fp"},
|
||||
{ERR_FUNC(X509_F_X509_PUBKEY_GET), "X509_PUBKEY_get"},
|
||||
{ERR_FUNC(X509_F_X509_PUBKEY_DECODE), "x509_pubkey_decode"},
|
||||
{ERR_FUNC(X509_F_X509_PUBKEY_GET0), "X509_PUBKEY_get0"},
|
||||
{ERR_FUNC(X509_F_X509_PUBKEY_SET), "X509_PUBKEY_set"},
|
||||
{ERR_FUNC(X509_F_X509_REQ_CHECK_PRIVATE_KEY),
|
||||
"X509_REQ_check_private_key"},
|
||||
@@ -133,6 +87,7 @@ static ERR_STRING_DATA X509_str_functs[] = {
|
||||
|
||||
static ERR_STRING_DATA X509_str_reasons[] = {
|
||||
{ERR_REASON(X509_R_AKID_MISMATCH), "akid mismatch"},
|
||||
{ERR_REASON(X509_R_BAD_SELECTOR), "bad selector"},
|
||||
{ERR_REASON(X509_R_BAD_X509_FILETYPE), "bad x509 filetype"},
|
||||
{ERR_REASON(X509_R_BASE64_DECODE_ERROR), "base64 decode error"},
|
||||
{ERR_REASON(X509_R_CANT_CHECK_DH_KEY), "cant check dh key"},
|
||||
@@ -140,7 +95,6 @@ static ERR_STRING_DATA X509_str_reasons[] = {
|
||||
"cert already in hash table"},
|
||||
{ERR_REASON(X509_R_CRL_ALREADY_DELTA), "crl already delta"},
|
||||
{ERR_REASON(X509_R_CRL_VERIFY_FAILURE), "crl verify failure"},
|
||||
{ERR_REASON(X509_R_ERR_ASN1_LIB), "err asn1 lib"},
|
||||
{ERR_REASON(X509_R_IDP_MISMATCH), "idp mismatch"},
|
||||
{ERR_REASON(X509_R_INVALID_DIRECTORY), "invalid directory"},
|
||||
{ERR_REASON(X509_R_INVALID_FIELD_NAME), "invalid field name"},
|
||||
@@ -151,6 +105,7 @@ static ERR_STRING_DATA X509_str_reasons[] = {
|
||||
{ERR_REASON(X509_R_LOADING_CERT_DIR), "loading cert dir"},
|
||||
{ERR_REASON(X509_R_LOADING_DEFAULTS), "loading defaults"},
|
||||
{ERR_REASON(X509_R_METHOD_NOT_SUPPORTED), "method not supported"},
|
||||
{ERR_REASON(X509_R_NAME_TOO_LONG), "name too long"},
|
||||
{ERR_REASON(X509_R_NEWER_CRL_NOT_NEWER), "newer crl not newer"},
|
||||
{ERR_REASON(X509_R_NO_CERT_SET_FOR_US_TO_VERIFY),
|
||||
"no cert set for us to verify"},
|
||||
@@ -174,7 +129,7 @@ static ERR_STRING_DATA X509_str_reasons[] = {
|
||||
|
||||
#endif
|
||||
|
||||
void ERR_load_X509_strings(void)
|
||||
int ERR_load_X509_strings(void)
|
||||
{
|
||||
#ifndef OPENSSL_NO_ERR
|
||||
|
||||
@@ -183,4 +138,5 @@ void ERR_load_X509_strings(void)
|
||||
ERR_load_strings(0, X509_str_reasons);
|
||||
}
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -1,186 +1,139 @@
|
||||
/* crypto/x509/x509_ext.c */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
/*
|
||||
* Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
* 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/stack.h>
|
||||
#include "cryptlib.h"
|
||||
#include "internal/cryptlib.h"
|
||||
#include <openssl/asn1.h>
|
||||
#include <openssl/objects.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/x509.h>
|
||||
#include "internal/x509_int.h"
|
||||
#include <openssl/x509v3.h>
|
||||
|
||||
int X509_CRL_get_ext_count(X509_CRL *x)
|
||||
int X509_CRL_get_ext_count(const X509_CRL *x)
|
||||
{
|
||||
return (X509v3_get_ext_count(x->crl->extensions));
|
||||
return (X509v3_get_ext_count(x->crl.extensions));
|
||||
}
|
||||
|
||||
int X509_CRL_get_ext_by_NID(X509_CRL *x, int nid, int lastpos)
|
||||
int X509_CRL_get_ext_by_NID(const X509_CRL *x, int nid, int lastpos)
|
||||
{
|
||||
return (X509v3_get_ext_by_NID(x->crl->extensions, nid, lastpos));
|
||||
return (X509v3_get_ext_by_NID(x->crl.extensions, nid, lastpos));
|
||||
}
|
||||
|
||||
int X509_CRL_get_ext_by_OBJ(X509_CRL *x, ASN1_OBJECT *obj, int lastpos)
|
||||
int X509_CRL_get_ext_by_OBJ(const X509_CRL *x, const ASN1_OBJECT *obj,
|
||||
int lastpos)
|
||||
{
|
||||
return (X509v3_get_ext_by_OBJ(x->crl->extensions, obj, lastpos));
|
||||
return (X509v3_get_ext_by_OBJ(x->crl.extensions, obj, lastpos));
|
||||
}
|
||||
|
||||
int X509_CRL_get_ext_by_critical(X509_CRL *x, int crit, int lastpos)
|
||||
int X509_CRL_get_ext_by_critical(const X509_CRL *x, int crit, int lastpos)
|
||||
{
|
||||
return (X509v3_get_ext_by_critical(x->crl->extensions, crit, lastpos));
|
||||
return (X509v3_get_ext_by_critical(x->crl.extensions, crit, lastpos));
|
||||
}
|
||||
|
||||
X509_EXTENSION *X509_CRL_get_ext(X509_CRL *x, int loc)
|
||||
X509_EXTENSION *X509_CRL_get_ext(const X509_CRL *x, int loc)
|
||||
{
|
||||
return (X509v3_get_ext(x->crl->extensions, loc));
|
||||
return (X509v3_get_ext(x->crl.extensions, loc));
|
||||
}
|
||||
|
||||
X509_EXTENSION *X509_CRL_delete_ext(X509_CRL *x, int loc)
|
||||
{
|
||||
return (X509v3_delete_ext(x->crl->extensions, loc));
|
||||
return (X509v3_delete_ext(x->crl.extensions, loc));
|
||||
}
|
||||
|
||||
void *X509_CRL_get_ext_d2i(X509_CRL *x, int nid, int *crit, int *idx)
|
||||
void *X509_CRL_get_ext_d2i(const X509_CRL *x, int nid, int *crit, int *idx)
|
||||
{
|
||||
return X509V3_get_d2i(x->crl->extensions, nid, crit, idx);
|
||||
return X509V3_get_d2i(x->crl.extensions, nid, crit, idx);
|
||||
}
|
||||
|
||||
int X509_CRL_add1_ext_i2d(X509_CRL *x, int nid, void *value, int crit,
|
||||
unsigned long flags)
|
||||
{
|
||||
return X509V3_add1_i2d(&x->crl->extensions, nid, value, crit, flags);
|
||||
return X509V3_add1_i2d(&x->crl.extensions, nid, value, crit, flags);
|
||||
}
|
||||
|
||||
int X509_CRL_add_ext(X509_CRL *x, X509_EXTENSION *ex, int loc)
|
||||
{
|
||||
return (X509v3_add_ext(&(x->crl->extensions), ex, loc) != NULL);
|
||||
return (X509v3_add_ext(&(x->crl.extensions), ex, loc) != NULL);
|
||||
}
|
||||
|
||||
int X509_get_ext_count(X509 *x)
|
||||
int X509_get_ext_count(const X509 *x)
|
||||
{
|
||||
return (X509v3_get_ext_count(x->cert_info->extensions));
|
||||
return (X509v3_get_ext_count(x->cert_info.extensions));
|
||||
}
|
||||
|
||||
int X509_get_ext_by_NID(X509 *x, int nid, int lastpos)
|
||||
int X509_get_ext_by_NID(const X509 *x, int nid, int lastpos)
|
||||
{
|
||||
return (X509v3_get_ext_by_NID(x->cert_info->extensions, nid, lastpos));
|
||||
return (X509v3_get_ext_by_NID(x->cert_info.extensions, nid, lastpos));
|
||||
}
|
||||
|
||||
int X509_get_ext_by_OBJ(X509 *x, ASN1_OBJECT *obj, int lastpos)
|
||||
int X509_get_ext_by_OBJ(const X509 *x, const ASN1_OBJECT *obj, int lastpos)
|
||||
{
|
||||
return (X509v3_get_ext_by_OBJ(x->cert_info->extensions, obj, lastpos));
|
||||
return (X509v3_get_ext_by_OBJ(x->cert_info.extensions, obj, lastpos));
|
||||
}
|
||||
|
||||
int X509_get_ext_by_critical(X509 *x, int crit, int lastpos)
|
||||
int X509_get_ext_by_critical(const X509 *x, int crit, int lastpos)
|
||||
{
|
||||
return (X509v3_get_ext_by_critical
|
||||
(x->cert_info->extensions, crit, lastpos));
|
||||
(x->cert_info.extensions, crit, lastpos));
|
||||
}
|
||||
|
||||
X509_EXTENSION *X509_get_ext(X509 *x, int loc)
|
||||
X509_EXTENSION *X509_get_ext(const X509 *x, int loc)
|
||||
{
|
||||
return (X509v3_get_ext(x->cert_info->extensions, loc));
|
||||
return (X509v3_get_ext(x->cert_info.extensions, loc));
|
||||
}
|
||||
|
||||
X509_EXTENSION *X509_delete_ext(X509 *x, int loc)
|
||||
{
|
||||
return (X509v3_delete_ext(x->cert_info->extensions, loc));
|
||||
return (X509v3_delete_ext(x->cert_info.extensions, loc));
|
||||
}
|
||||
|
||||
int X509_add_ext(X509 *x, X509_EXTENSION *ex, int loc)
|
||||
{
|
||||
return (X509v3_add_ext(&(x->cert_info->extensions), ex, loc) != NULL);
|
||||
return (X509v3_add_ext(&(x->cert_info.extensions), ex, loc) != NULL);
|
||||
}
|
||||
|
||||
void *X509_get_ext_d2i(X509 *x, int nid, int *crit, int *idx)
|
||||
void *X509_get_ext_d2i(const X509 *x, int nid, int *crit, int *idx)
|
||||
{
|
||||
return X509V3_get_d2i(x->cert_info->extensions, nid, crit, idx);
|
||||
return X509V3_get_d2i(x->cert_info.extensions, nid, crit, idx);
|
||||
}
|
||||
|
||||
int X509_add1_ext_i2d(X509 *x, int nid, void *value, int crit,
|
||||
unsigned long flags)
|
||||
{
|
||||
return X509V3_add1_i2d(&x->cert_info->extensions, nid, value, crit,
|
||||
return X509V3_add1_i2d(&x->cert_info.extensions, nid, value, crit,
|
||||
flags);
|
||||
}
|
||||
|
||||
int X509_REVOKED_get_ext_count(X509_REVOKED *x)
|
||||
int X509_REVOKED_get_ext_count(const X509_REVOKED *x)
|
||||
{
|
||||
return (X509v3_get_ext_count(x->extensions));
|
||||
}
|
||||
|
||||
int X509_REVOKED_get_ext_by_NID(X509_REVOKED *x, int nid, int lastpos)
|
||||
int X509_REVOKED_get_ext_by_NID(const X509_REVOKED *x, int nid, int lastpos)
|
||||
{
|
||||
return (X509v3_get_ext_by_NID(x->extensions, nid, lastpos));
|
||||
}
|
||||
|
||||
int X509_REVOKED_get_ext_by_OBJ(X509_REVOKED *x, ASN1_OBJECT *obj,
|
||||
int X509_REVOKED_get_ext_by_OBJ(const X509_REVOKED *x, const ASN1_OBJECT *obj,
|
||||
int lastpos)
|
||||
{
|
||||
return (X509v3_get_ext_by_OBJ(x->extensions, obj, lastpos));
|
||||
}
|
||||
|
||||
int X509_REVOKED_get_ext_by_critical(X509_REVOKED *x, int crit, int lastpos)
|
||||
int X509_REVOKED_get_ext_by_critical(const X509_REVOKED *x, int crit, int lastpos)
|
||||
{
|
||||
return (X509v3_get_ext_by_critical(x->extensions, crit, lastpos));
|
||||
}
|
||||
|
||||
X509_EXTENSION *X509_REVOKED_get_ext(X509_REVOKED *x, int loc)
|
||||
X509_EXTENSION *X509_REVOKED_get_ext(const X509_REVOKED *x, int loc)
|
||||
{
|
||||
return (X509v3_get_ext(x->extensions, loc));
|
||||
}
|
||||
@@ -195,7 +148,7 @@ int X509_REVOKED_add_ext(X509_REVOKED *x, X509_EXTENSION *ex, int loc)
|
||||
return (X509v3_add_ext(&(x->extensions), ex, loc) != NULL);
|
||||
}
|
||||
|
||||
void *X509_REVOKED_get_ext_d2i(X509_REVOKED *x, int nid, int *crit, int *idx)
|
||||
void *X509_REVOKED_get_ext_d2i(const X509_REVOKED *x, int nid, int *crit, int *idx)
|
||||
{
|
||||
return X509V3_get_d2i(x->extensions, nid, crit, idx);
|
||||
}
|
||||
@@ -205,7 +158,3 @@ int X509_REVOKED_add1_ext_i2d(X509_REVOKED *x, int nid, void *value, int crit,
|
||||
{
|
||||
return X509V3_add1_i2d(&x->extensions, nid, value, crit, flags);
|
||||
}
|
||||
|
||||
IMPLEMENT_STACK_OF(X509_EXTENSION)
|
||||
|
||||
IMPLEMENT_ASN1_SET_OF(X509_EXTENSION)
|
||||
|
||||
142
crypto/x509/x509_lcl.h
Normal file
142
crypto/x509/x509_lcl.h
Normal file
@@ -0,0 +1,142 @@
|
||||
/*
|
||||
* Copyright 2014-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
|
||||
*/
|
||||
|
||||
/*
|
||||
* This structure holds all parameters associated with a verify operation by
|
||||
* including an X509_VERIFY_PARAM structure in related structures the
|
||||
* parameters used can be customized
|
||||
*/
|
||||
|
||||
struct X509_VERIFY_PARAM_st {
|
||||
char *name;
|
||||
time_t check_time; /* Time to use */
|
||||
uint32_t inh_flags; /* Inheritance flags */
|
||||
unsigned long flags; /* Various verify flags */
|
||||
int purpose; /* purpose to check untrusted certificates */
|
||||
int trust; /* trust setting to check */
|
||||
int depth; /* Verify depth */
|
||||
int auth_level; /* Security level for chain verification */
|
||||
STACK_OF(ASN1_OBJECT) *policies; /* Permissible policies */
|
||||
/* Peer identity details */
|
||||
STACK_OF(OPENSSL_STRING) *hosts; /* Set of acceptable names */
|
||||
unsigned int hostflags; /* Flags to control matching features */
|
||||
char *peername; /* Matching hostname in peer certificate */
|
||||
char *email; /* If not NULL email address to match */
|
||||
size_t emaillen;
|
||||
unsigned char *ip; /* If not NULL IP address to match */
|
||||
size_t iplen; /* Length of IP address */
|
||||
};
|
||||
|
||||
/* No error callback if depth < 0 */
|
||||
int x509_check_cert_time(X509_STORE_CTX *ctx, X509 *x, int depth);
|
||||
|
||||
/* a sequence of these are used */
|
||||
struct x509_attributes_st {
|
||||
ASN1_OBJECT *object;
|
||||
STACK_OF(ASN1_TYPE) *set;
|
||||
};
|
||||
|
||||
struct X509_extension_st {
|
||||
ASN1_OBJECT *object;
|
||||
ASN1_BOOLEAN critical;
|
||||
ASN1_OCTET_STRING value;
|
||||
};
|
||||
|
||||
/*
|
||||
* Method to handle CRL access. In general a CRL could be very large (several
|
||||
* Mb) and can consume large amounts of resources if stored in memory by
|
||||
* multiple processes. This method allows general CRL operations to be
|
||||
* redirected to more efficient callbacks: for example a CRL entry database.
|
||||
*/
|
||||
|
||||
#define X509_CRL_METHOD_DYNAMIC 1
|
||||
|
||||
struct x509_crl_method_st {
|
||||
int flags;
|
||||
int (*crl_init) (X509_CRL *crl);
|
||||
int (*crl_free) (X509_CRL *crl);
|
||||
int (*crl_lookup) (X509_CRL *crl, X509_REVOKED **ret,
|
||||
ASN1_INTEGER *ser, X509_NAME *issuer);
|
||||
int (*crl_verify) (X509_CRL *crl, EVP_PKEY *pk);
|
||||
};
|
||||
|
||||
struct x509_lookup_method_st {
|
||||
const char *name;
|
||||
int (*new_item) (X509_LOOKUP *ctx);
|
||||
void (*free) (X509_LOOKUP *ctx);
|
||||
int (*init) (X509_LOOKUP *ctx);
|
||||
int (*shutdown) (X509_LOOKUP *ctx);
|
||||
int (*ctrl) (X509_LOOKUP *ctx, int cmd, const char *argc, long argl,
|
||||
char **ret);
|
||||
int (*get_by_subject) (X509_LOOKUP *ctx, X509_LOOKUP_TYPE type,
|
||||
X509_NAME *name, X509_OBJECT *ret);
|
||||
int (*get_by_issuer_serial) (X509_LOOKUP *ctx, X509_LOOKUP_TYPE type,
|
||||
X509_NAME *name, ASN1_INTEGER *serial,
|
||||
X509_OBJECT *ret);
|
||||
int (*get_by_fingerprint) (X509_LOOKUP *ctx, X509_LOOKUP_TYPE type,
|
||||
const unsigned char *bytes, int len,
|
||||
X509_OBJECT *ret);
|
||||
int (*get_by_alias) (X509_LOOKUP *ctx, X509_LOOKUP_TYPE type,
|
||||
const char *str, int len, X509_OBJECT *ret);
|
||||
};
|
||||
|
||||
/* This is the functions plus an instance of the local variables. */
|
||||
struct x509_lookup_st {
|
||||
int init; /* have we been started */
|
||||
int skip; /* don't use us. */
|
||||
X509_LOOKUP_METHOD *method; /* the functions */
|
||||
char *method_data; /* method data */
|
||||
X509_STORE *store_ctx; /* who owns us */
|
||||
};
|
||||
|
||||
/*
|
||||
* This is used to hold everything. It is used for all certificate
|
||||
* validation. Once we have a certificate chain, the 'verify' function is
|
||||
* then called to actually check the cert chain.
|
||||
*/
|
||||
struct x509_store_st {
|
||||
/* The following is a cache of trusted certs */
|
||||
int cache; /* if true, stash any hits */
|
||||
STACK_OF(X509_OBJECT) *objs; /* Cache of all objects */
|
||||
/* These are external lookup methods */
|
||||
STACK_OF(X509_LOOKUP) *get_cert_methods;
|
||||
X509_VERIFY_PARAM *param;
|
||||
/* Callbacks for various operations */
|
||||
/* called to verify a certificate */
|
||||
int (*verify) (X509_STORE_CTX *ctx);
|
||||
/* error callback */
|
||||
int (*verify_cb) (int ok, X509_STORE_CTX *ctx);
|
||||
/* get issuers cert from ctx */
|
||||
int (*get_issuer) (X509 **issuer, X509_STORE_CTX *ctx, X509 *x);
|
||||
/* check issued */
|
||||
int (*check_issued) (X509_STORE_CTX *ctx, X509 *x, X509 *issuer);
|
||||
/* Check revocation status of chain */
|
||||
int (*check_revocation) (X509_STORE_CTX *ctx);
|
||||
/* retrieve CRL */
|
||||
int (*get_crl) (X509_STORE_CTX *ctx, X509_CRL **crl, X509 *x);
|
||||
/* Check CRL validity */
|
||||
int (*check_crl) (X509_STORE_CTX *ctx, X509_CRL *crl);
|
||||
/* Check certificate against CRL */
|
||||
int (*cert_crl) (X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x);
|
||||
/* Check policy status of the chain */
|
||||
int (*check_policy) (X509_STORE_CTX *ctx);
|
||||
STACK_OF(X509) *(*lookup_certs) (X509_STORE_CTX *ctx, X509_NAME *nm);
|
||||
STACK_OF(X509_CRL) *(*lookup_crls) (X509_STORE_CTX *ctx, X509_NAME *nm);
|
||||
int (*cleanup) (X509_STORE_CTX *ctx);
|
||||
CRYPTO_EX_DATA ex_data;
|
||||
int references;
|
||||
CRYPTO_RWLOCK *lock;
|
||||
};
|
||||
|
||||
typedef struct lookup_dir_hashes_st BY_DIR_HASH;
|
||||
typedef struct lookup_dir_entry_st BY_DIR_ENTRY;
|
||||
DEFINE_STACK_OF(BY_DIR_HASH)
|
||||
DEFINE_STACK_OF(BY_DIR_ENTRY)
|
||||
typedef STACK_OF(X509_NAME_ENTRY) STACK_OF_X509_NAME_ENTRY;
|
||||
DEFINE_STACK_OF(STACK_OF_X509_NAME_ENTRY)
|
||||
@@ -1,80 +1,29 @@
|
||||
/* crypto/x509/x509_lu.c */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
/*
|
||||
* Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
* 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 "cryptlib.h"
|
||||
#include "internal/cryptlib.h"
|
||||
#include <openssl/lhash.h>
|
||||
#include <openssl/x509.h>
|
||||
#include "internal/x509_int.h"
|
||||
#include <openssl/x509v3.h>
|
||||
#include "x509_lcl.h"
|
||||
|
||||
X509_LOOKUP *X509_LOOKUP_new(X509_LOOKUP_METHOD *method)
|
||||
{
|
||||
X509_LOOKUP *ret;
|
||||
|
||||
ret = (X509_LOOKUP *)OPENSSL_malloc(sizeof(X509_LOOKUP));
|
||||
ret = OPENSSL_zalloc(sizeof(*ret));
|
||||
if (ret == NULL)
|
||||
return NULL;
|
||||
|
||||
ret->init = 0;
|
||||
ret->skip = 0;
|
||||
ret->method = method;
|
||||
ret->method_data = NULL;
|
||||
ret->store_ctx = NULL;
|
||||
if ((method->new_item != NULL) && !method->new_item(ret)) {
|
||||
OPENSSL_free(ret);
|
||||
return NULL;
|
||||
@@ -91,6 +40,16 @@ void X509_LOOKUP_free(X509_LOOKUP *ctx)
|
||||
OPENSSL_free(ctx);
|
||||
}
|
||||
|
||||
int X509_STORE_lock(X509_STORE *s)
|
||||
{
|
||||
return CRYPTO_THREAD_write_lock(s->lock);
|
||||
}
|
||||
|
||||
int X509_STORE_unlock(X509_STORE *s)
|
||||
{
|
||||
return CRYPTO_THREAD_unlock(s->lock);
|
||||
}
|
||||
|
||||
int X509_LOOKUP_init(X509_LOOKUP *ctx)
|
||||
{
|
||||
if (ctx->method == NULL)
|
||||
@@ -122,38 +81,39 @@ int X509_LOOKUP_ctrl(X509_LOOKUP *ctx, int cmd, const char *argc, long argl,
|
||||
return 1;
|
||||
}
|
||||
|
||||
int X509_LOOKUP_by_subject(X509_LOOKUP *ctx, int type, X509_NAME *name,
|
||||
X509_OBJECT *ret)
|
||||
int X509_LOOKUP_by_subject(X509_LOOKUP *ctx, X509_LOOKUP_TYPE type,
|
||||
X509_NAME *name, X509_OBJECT *ret)
|
||||
{
|
||||
if ((ctx->method == NULL) || (ctx->method->get_by_subject == NULL))
|
||||
return X509_LU_FAIL;
|
||||
return 0;
|
||||
if (ctx->skip)
|
||||
return 0;
|
||||
return ctx->method->get_by_subject(ctx, type, name, ret);
|
||||
}
|
||||
|
||||
int X509_LOOKUP_by_issuer_serial(X509_LOOKUP *ctx, int type, X509_NAME *name,
|
||||
ASN1_INTEGER *serial, X509_OBJECT *ret)
|
||||
int X509_LOOKUP_by_issuer_serial(X509_LOOKUP *ctx, X509_LOOKUP_TYPE type,
|
||||
X509_NAME *name, ASN1_INTEGER *serial,
|
||||
X509_OBJECT *ret)
|
||||
{
|
||||
if ((ctx->method == NULL) || (ctx->method->get_by_issuer_serial == NULL))
|
||||
return X509_LU_FAIL;
|
||||
return 0;
|
||||
return ctx->method->get_by_issuer_serial(ctx, type, name, serial, ret);
|
||||
}
|
||||
|
||||
int X509_LOOKUP_by_fingerprint(X509_LOOKUP *ctx, int type,
|
||||
unsigned char *bytes, int len,
|
||||
int X509_LOOKUP_by_fingerprint(X509_LOOKUP *ctx, X509_LOOKUP_TYPE type,
|
||||
const unsigned char *bytes, int len,
|
||||
X509_OBJECT *ret)
|
||||
{
|
||||
if ((ctx->method == NULL) || (ctx->method->get_by_fingerprint == NULL))
|
||||
return X509_LU_FAIL;
|
||||
return 0;
|
||||
return ctx->method->get_by_fingerprint(ctx, type, bytes, len, ret);
|
||||
}
|
||||
|
||||
int X509_LOOKUP_by_alias(X509_LOOKUP *ctx, int type, char *str, int len,
|
||||
X509_OBJECT *ret)
|
||||
int X509_LOOKUP_by_alias(X509_LOOKUP *ctx, X509_LOOKUP_TYPE type,
|
||||
const char *str, int len, X509_OBJECT *ret)
|
||||
{
|
||||
if ((ctx->method == NULL) || (ctx->method->get_by_alias == NULL))
|
||||
return X509_LU_FAIL;
|
||||
return 0;
|
||||
return ctx->method->get_by_alias(ctx, type, str, len, ret);
|
||||
}
|
||||
|
||||
@@ -183,35 +143,33 @@ X509_STORE *X509_STORE_new(void)
|
||||
{
|
||||
X509_STORE *ret;
|
||||
|
||||
if ((ret = (X509_STORE *)OPENSSL_malloc(sizeof(X509_STORE))) == NULL)
|
||||
if ((ret = OPENSSL_zalloc(sizeof(*ret))) == NULL)
|
||||
return NULL;
|
||||
ret->objs = sk_X509_OBJECT_new(x509_object_cmp);
|
||||
if ((ret->objs = sk_X509_OBJECT_new(x509_object_cmp)) == NULL)
|
||||
goto err;
|
||||
ret->cache = 1;
|
||||
ret->get_cert_methods = sk_X509_LOOKUP_new_null();
|
||||
ret->verify = 0;
|
||||
ret->verify_cb = 0;
|
||||
if ((ret->get_cert_methods = sk_X509_LOOKUP_new_null()) == NULL)
|
||||
goto err;
|
||||
|
||||
if ((ret->param = X509_VERIFY_PARAM_new()) == NULL)
|
||||
return NULL;
|
||||
goto err;
|
||||
|
||||
ret->get_issuer = 0;
|
||||
ret->check_issued = 0;
|
||||
ret->check_revocation = 0;
|
||||
ret->get_crl = 0;
|
||||
ret->check_crl = 0;
|
||||
ret->cert_crl = 0;
|
||||
ret->lookup_certs = 0;
|
||||
ret->lookup_crls = 0;
|
||||
ret->cleanup = 0;
|
||||
if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_X509_STORE, ret, &ret->ex_data))
|
||||
goto err;
|
||||
|
||||
if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_X509_STORE, ret, &ret->ex_data)) {
|
||||
sk_X509_OBJECT_free(ret->objs);
|
||||
OPENSSL_free(ret);
|
||||
return NULL;
|
||||
}
|
||||
ret->lock = CRYPTO_THREAD_lock_new();
|
||||
if (ret->lock == NULL)
|
||||
goto err;
|
||||
|
||||
ret->references = 1;
|
||||
return ret;
|
||||
|
||||
err:
|
||||
X509_VERIFY_PARAM_free(ret->param);
|
||||
sk_X509_OBJECT_free(ret->objs);
|
||||
sk_X509_LOOKUP_free(ret->get_cert_methods);
|
||||
OPENSSL_free(ret);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void cleanup(X509_OBJECT *a)
|
||||
@@ -238,18 +196,11 @@ void X509_STORE_free(X509_STORE *vfy)
|
||||
if (vfy == NULL)
|
||||
return;
|
||||
|
||||
i = CRYPTO_add(&vfy->references, -1, CRYPTO_LOCK_X509_STORE);
|
||||
#ifdef REF_PRINT
|
||||
REF_PRINT("X509_STORE", vfy);
|
||||
#endif
|
||||
CRYPTO_atomic_add(&vfy->references, -1, &i, vfy->lock);
|
||||
REF_PRINT_COUNT("X509_STORE", vfy);
|
||||
if (i > 0)
|
||||
return;
|
||||
#ifdef REF_CHECK
|
||||
if (i < 0) {
|
||||
fprintf(stderr, "X509_STORE_free, bad reference count\n");
|
||||
abort(); /* ok */
|
||||
}
|
||||
#endif
|
||||
REF_ASSERT_ISNT(i < 0);
|
||||
|
||||
sk = vfy->get_cert_methods;
|
||||
for (i = 0; i < sk_X509_LOOKUP_num(sk); i++) {
|
||||
@@ -261,11 +212,23 @@ void X509_STORE_free(X509_STORE *vfy)
|
||||
sk_X509_OBJECT_pop_free(vfy->objs, cleanup);
|
||||
|
||||
CRYPTO_free_ex_data(CRYPTO_EX_INDEX_X509_STORE, vfy, &vfy->ex_data);
|
||||
if (vfy->param)
|
||||
X509_VERIFY_PARAM_free(vfy->param);
|
||||
X509_VERIFY_PARAM_free(vfy->param);
|
||||
CRYPTO_THREAD_lock_free(vfy->lock);
|
||||
OPENSSL_free(vfy);
|
||||
}
|
||||
|
||||
int X509_STORE_up_ref(X509_STORE *vfy)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (CRYPTO_atomic_add(&vfy->references, 1, &i, vfy->lock) <= 0)
|
||||
return 0;
|
||||
|
||||
REF_PRINT_COUNT("X509_STORE", a);
|
||||
REF_ASSERT_ISNT(i < 2);
|
||||
return ((i > 1) ? 1 : 0);
|
||||
}
|
||||
|
||||
X509_LOOKUP *X509_STORE_add_lookup(X509_STORE *v, X509_LOOKUP_METHOD *m)
|
||||
{
|
||||
int i;
|
||||
@@ -294,39 +257,46 @@ X509_LOOKUP *X509_STORE_add_lookup(X509_STORE *v, X509_LOOKUP_METHOD *m)
|
||||
}
|
||||
}
|
||||
|
||||
int X509_STORE_get_by_subject(X509_STORE_CTX *vs, int type, X509_NAME *name,
|
||||
X509_OBJECT *ret)
|
||||
X509_OBJECT *X509_STORE_CTX_get_obj_by_subject(X509_STORE_CTX *vs,
|
||||
X509_LOOKUP_TYPE type,
|
||||
X509_NAME *name)
|
||||
{
|
||||
X509_OBJECT *ret = X509_OBJECT_new();
|
||||
|
||||
if (ret == NULL)
|
||||
return NULL;
|
||||
if (!X509_STORE_CTX_get_by_subject(vs, type, name, ret)) {
|
||||
X509_OBJECT_free(ret);
|
||||
return NULL;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int X509_STORE_CTX_get_by_subject(X509_STORE_CTX *vs, X509_LOOKUP_TYPE type,
|
||||
X509_NAME *name, X509_OBJECT *ret)
|
||||
{
|
||||
X509_STORE *ctx = vs->ctx;
|
||||
X509_LOOKUP *lu;
|
||||
X509_OBJECT stmp, *tmp;
|
||||
int i, j;
|
||||
|
||||
CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE);
|
||||
CRYPTO_THREAD_write_lock(ctx->lock);
|
||||
tmp = X509_OBJECT_retrieve_by_subject(ctx->objs, type, name);
|
||||
CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE);
|
||||
CRYPTO_THREAD_unlock(ctx->lock);
|
||||
|
||||
if (tmp == NULL || type == X509_LU_CRL) {
|
||||
for (i = vs->current_method;
|
||||
i < sk_X509_LOOKUP_num(ctx->get_cert_methods); i++) {
|
||||
for (i = 0; i < sk_X509_LOOKUP_num(ctx->get_cert_methods); i++) {
|
||||
lu = sk_X509_LOOKUP_value(ctx->get_cert_methods, i);
|
||||
j = X509_LOOKUP_by_subject(lu, type, name, &stmp);
|
||||
if (j < 0) {
|
||||
vs->current_method = j;
|
||||
return j;
|
||||
} else if (j) {
|
||||
if (j) {
|
||||
tmp = &stmp;
|
||||
break;
|
||||
}
|
||||
}
|
||||
vs->current_method = 0;
|
||||
if (tmp == NULL)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*- if (ret->data.ptr != NULL)
|
||||
X509_OBJECT_free_contents(ret); */
|
||||
|
||||
ret->type = tmp->type;
|
||||
ret->data.ptr = tmp->data.ptr;
|
||||
|
||||
@@ -338,32 +308,34 @@ int X509_STORE_get_by_subject(X509_STORE_CTX *vs, int type, X509_NAME *name,
|
||||
int X509_STORE_add_cert(X509_STORE *ctx, X509 *x)
|
||||
{
|
||||
X509_OBJECT *obj;
|
||||
int ret = 1;
|
||||
int ret = 1, added = 1;
|
||||
|
||||
if (x == NULL)
|
||||
return 0;
|
||||
obj = (X509_OBJECT *)OPENSSL_malloc(sizeof(X509_OBJECT));
|
||||
if (obj == NULL) {
|
||||
X509err(X509_F_X509_STORE_ADD_CERT, ERR_R_MALLOC_FAILURE);
|
||||
obj = X509_OBJECT_new();
|
||||
if (obj == NULL)
|
||||
return 0;
|
||||
}
|
||||
obj->type = X509_LU_X509;
|
||||
obj->data.x509 = x;
|
||||
|
||||
CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE);
|
||||
|
||||
X509_OBJECT_up_ref_count(obj);
|
||||
|
||||
CRYPTO_THREAD_write_lock(ctx->lock);
|
||||
|
||||
if (X509_OBJECT_retrieve_match(ctx->objs, obj)) {
|
||||
X509_OBJECT_free_contents(obj);
|
||||
OPENSSL_free(obj);
|
||||
X509err(X509_F_X509_STORE_ADD_CERT,
|
||||
X509_R_CERT_ALREADY_IN_HASH_TABLE);
|
||||
ret = 0;
|
||||
} else
|
||||
sk_X509_OBJECT_push(ctx->objs, obj);
|
||||
} else {
|
||||
added = sk_X509_OBJECT_push(ctx->objs, obj);
|
||||
ret = added != 0;
|
||||
}
|
||||
|
||||
CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE);
|
||||
CRYPTO_THREAD_unlock(ctx->lock);
|
||||
|
||||
if (!ret) /* obj not pushed */
|
||||
X509_OBJECT_free(obj);
|
||||
if (!added) /* on push failure */
|
||||
X509err(X509_F_X509_STORE_ADD_CERT, ERR_R_MALLOC_FAILURE);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -371,50 +343,89 @@ int X509_STORE_add_cert(X509_STORE *ctx, X509 *x)
|
||||
int X509_STORE_add_crl(X509_STORE *ctx, X509_CRL *x)
|
||||
{
|
||||
X509_OBJECT *obj;
|
||||
int ret = 1;
|
||||
int ret = 1, added = 1;
|
||||
|
||||
if (x == NULL)
|
||||
return 0;
|
||||
obj = (X509_OBJECT *)OPENSSL_malloc(sizeof(X509_OBJECT));
|
||||
if (obj == NULL) {
|
||||
X509err(X509_F_X509_STORE_ADD_CRL, ERR_R_MALLOC_FAILURE);
|
||||
obj = X509_OBJECT_new();
|
||||
if (obj == NULL)
|
||||
return 0;
|
||||
}
|
||||
obj->type = X509_LU_CRL;
|
||||
obj->data.crl = x;
|
||||
|
||||
CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE);
|
||||
|
||||
X509_OBJECT_up_ref_count(obj);
|
||||
|
||||
CRYPTO_THREAD_write_lock(ctx->lock);
|
||||
|
||||
if (X509_OBJECT_retrieve_match(ctx->objs, obj)) {
|
||||
X509_OBJECT_free_contents(obj);
|
||||
OPENSSL_free(obj);
|
||||
X509err(X509_F_X509_STORE_ADD_CRL, X509_R_CERT_ALREADY_IN_HASH_TABLE);
|
||||
ret = 0;
|
||||
} else
|
||||
sk_X509_OBJECT_push(ctx->objs, obj);
|
||||
} else {
|
||||
added = sk_X509_OBJECT_push(ctx->objs, obj);
|
||||
ret = added != 0;
|
||||
}
|
||||
|
||||
CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE);
|
||||
CRYPTO_THREAD_unlock(ctx->lock);
|
||||
|
||||
if (!ret) /* obj not pushed */
|
||||
X509_OBJECT_free(obj);
|
||||
if (!added) /* on push failure */
|
||||
X509err(X509_F_X509_STORE_ADD_CRL, ERR_R_MALLOC_FAILURE);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void X509_OBJECT_up_ref_count(X509_OBJECT *a)
|
||||
int X509_OBJECT_up_ref_count(X509_OBJECT *a)
|
||||
{
|
||||
switch (a->type) {
|
||||
default:
|
||||
break;
|
||||
case X509_LU_X509:
|
||||
CRYPTO_add(&a->data.x509->references, 1, CRYPTO_LOCK_X509);
|
||||
break;
|
||||
return X509_up_ref(a->data.x509);
|
||||
case X509_LU_CRL:
|
||||
CRYPTO_add(&a->data.crl->references, 1, CRYPTO_LOCK_X509_CRL);
|
||||
break;
|
||||
return X509_CRL_up_ref(a->data.crl);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
void X509_OBJECT_free_contents(X509_OBJECT *a)
|
||||
X509 *X509_OBJECT_get0_X509(const X509_OBJECT *a)
|
||||
{
|
||||
if (a == NULL || a->type != X509_LU_X509)
|
||||
return NULL;
|
||||
return a->data.x509;
|
||||
}
|
||||
|
||||
X509_CRL *X509_OBJECT_get0_X509_CRL(X509_OBJECT *a)
|
||||
{
|
||||
if (a == NULL || a->type != X509_LU_CRL)
|
||||
return NULL;
|
||||
return a->data.crl;
|
||||
}
|
||||
|
||||
X509_LOOKUP_TYPE X509_OBJECT_get_type(const X509_OBJECT *a)
|
||||
{
|
||||
return a->type;
|
||||
}
|
||||
|
||||
X509_OBJECT *X509_OBJECT_new()
|
||||
{
|
||||
X509_OBJECT *ret = OPENSSL_zalloc(sizeof(*ret));
|
||||
|
||||
if (ret == NULL) {
|
||||
X509err(X509_F_X509_OBJECT_NEW, ERR_R_MALLOC_FAILURE);
|
||||
return NULL;
|
||||
}
|
||||
ret->type = X509_LU_NONE;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
void X509_OBJECT_free(X509_OBJECT *a)
|
||||
{
|
||||
if (a == NULL)
|
||||
return;
|
||||
switch (a->type) {
|
||||
default:
|
||||
break;
|
||||
case X509_LU_X509:
|
||||
X509_free(a->data.x509);
|
||||
break;
|
||||
@@ -422,29 +433,26 @@ void X509_OBJECT_free_contents(X509_OBJECT *a)
|
||||
X509_CRL_free(a->data.crl);
|
||||
break;
|
||||
}
|
||||
OPENSSL_free(a);
|
||||
}
|
||||
|
||||
static int x509_object_idx_cnt(STACK_OF(X509_OBJECT) *h, int type,
|
||||
static int x509_object_idx_cnt(STACK_OF(X509_OBJECT) *h, X509_LOOKUP_TYPE type,
|
||||
X509_NAME *name, int *pnmatch)
|
||||
{
|
||||
X509_OBJECT stmp;
|
||||
X509 x509_s;
|
||||
X509_CINF cinf_s;
|
||||
X509_CRL crl_s;
|
||||
X509_CRL_INFO crl_info_s;
|
||||
int idx;
|
||||
|
||||
stmp.type = type;
|
||||
switch (type) {
|
||||
case X509_LU_X509:
|
||||
stmp.data.x509 = &x509_s;
|
||||
x509_s.cert_info = &cinf_s;
|
||||
cinf_s.subject = name;
|
||||
x509_s.cert_info.subject = name;
|
||||
break;
|
||||
case X509_LU_CRL:
|
||||
stmp.data.crl = &crl_s;
|
||||
crl_s.crl = &crl_info_s;
|
||||
crl_info_s.issuer = name;
|
||||
crl_s.crl.issuer = name;
|
||||
break;
|
||||
default:
|
||||
/* abort(); */
|
||||
@@ -467,14 +475,15 @@ static int x509_object_idx_cnt(STACK_OF(X509_OBJECT) *h, int type,
|
||||
return idx;
|
||||
}
|
||||
|
||||
int X509_OBJECT_idx_by_subject(STACK_OF(X509_OBJECT) *h, int type,
|
||||
int X509_OBJECT_idx_by_subject(STACK_OF(X509_OBJECT) *h, X509_LOOKUP_TYPE type,
|
||||
X509_NAME *name)
|
||||
{
|
||||
return x509_object_idx_cnt(h, type, name, NULL);
|
||||
}
|
||||
|
||||
X509_OBJECT *X509_OBJECT_retrieve_by_subject(STACK_OF(X509_OBJECT) *h,
|
||||
int type, X509_NAME *name)
|
||||
X509_LOOKUP_TYPE type,
|
||||
X509_NAME *name)
|
||||
{
|
||||
int idx;
|
||||
idx = X509_OBJECT_idx_by_subject(h, type, name);
|
||||
@@ -483,75 +492,78 @@ X509_OBJECT *X509_OBJECT_retrieve_by_subject(STACK_OF(X509_OBJECT) *h,
|
||||
return sk_X509_OBJECT_value(h, idx);
|
||||
}
|
||||
|
||||
STACK_OF(X509) *X509_STORE_get1_certs(X509_STORE_CTX *ctx, X509_NAME *nm)
|
||||
STACK_OF(X509_OBJECT) *X509_STORE_get0_objects(X509_STORE *v)
|
||||
{
|
||||
return v->objs;
|
||||
}
|
||||
|
||||
STACK_OF(X509) *X509_STORE_CTX_get1_certs(X509_STORE_CTX *ctx, X509_NAME *nm)
|
||||
{
|
||||
int i, idx, cnt;
|
||||
STACK_OF(X509) *sk;
|
||||
STACK_OF(X509) *sk = NULL;
|
||||
X509 *x;
|
||||
X509_OBJECT *obj;
|
||||
sk = sk_X509_new_null();
|
||||
CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE);
|
||||
|
||||
CRYPTO_THREAD_write_lock(ctx->ctx->lock);
|
||||
idx = x509_object_idx_cnt(ctx->ctx->objs, X509_LU_X509, nm, &cnt);
|
||||
if (idx < 0) {
|
||||
/*
|
||||
* Nothing found in cache: do lookup to possibly add new objects to
|
||||
* cache
|
||||
*/
|
||||
X509_OBJECT xobj;
|
||||
CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE);
|
||||
if (!X509_STORE_get_by_subject(ctx, X509_LU_X509, nm, &xobj)) {
|
||||
sk_X509_free(sk);
|
||||
X509_OBJECT *xobj = X509_OBJECT_new();
|
||||
|
||||
CRYPTO_THREAD_unlock(ctx->ctx->lock);
|
||||
if (xobj == NULL)
|
||||
return NULL;
|
||||
if (!X509_STORE_CTX_get_by_subject(ctx, X509_LU_X509, nm, xobj)) {
|
||||
X509_OBJECT_free(xobj);
|
||||
return NULL;
|
||||
}
|
||||
X509_OBJECT_free_contents(&xobj);
|
||||
CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE);
|
||||
X509_OBJECT_free(xobj);
|
||||
CRYPTO_THREAD_write_lock(ctx->ctx->lock);
|
||||
idx = x509_object_idx_cnt(ctx->ctx->objs, X509_LU_X509, nm, &cnt);
|
||||
if (idx < 0) {
|
||||
CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE);
|
||||
sk_X509_free(sk);
|
||||
CRYPTO_THREAD_unlock(ctx->ctx->lock);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
sk = sk_X509_new_null();
|
||||
for (i = 0; i < cnt; i++, idx++) {
|
||||
obj = sk_X509_OBJECT_value(ctx->ctx->objs, idx);
|
||||
x = obj->data.x509;
|
||||
CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509);
|
||||
X509_up_ref(x);
|
||||
if (!sk_X509_push(sk, x)) {
|
||||
CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE);
|
||||
CRYPTO_THREAD_unlock(ctx->ctx->lock);
|
||||
X509_free(x);
|
||||
sk_X509_pop_free(sk, X509_free);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE);
|
||||
CRYPTO_THREAD_unlock(ctx->ctx->lock);
|
||||
return sk;
|
||||
|
||||
}
|
||||
|
||||
STACK_OF(X509_CRL) *X509_STORE_get1_crls(X509_STORE_CTX *ctx, X509_NAME *nm)
|
||||
STACK_OF(X509_CRL) *X509_STORE_CTX_get1_crls(X509_STORE_CTX *ctx, X509_NAME *nm)
|
||||
{
|
||||
int i, idx, cnt;
|
||||
STACK_OF(X509_CRL) *sk;
|
||||
STACK_OF(X509_CRL) *sk = sk_X509_CRL_new_null();
|
||||
X509_CRL *x;
|
||||
X509_OBJECT *obj, xobj;
|
||||
sk = sk_X509_CRL_new_null();
|
||||
CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE);
|
||||
/* Check cache first */
|
||||
idx = x509_object_idx_cnt(ctx->ctx->objs, X509_LU_CRL, nm, &cnt);
|
||||
X509_OBJECT *obj, *xobj = X509_OBJECT_new();
|
||||
|
||||
/*
|
||||
* Always do lookup to possibly add new CRLs to cache
|
||||
*/
|
||||
CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE);
|
||||
if (!X509_STORE_get_by_subject(ctx, X509_LU_CRL, nm, &xobj)) {
|
||||
/* Always do lookup to possibly add new CRLs to cache */
|
||||
if (sk == NULL || xobj == NULL ||
|
||||
!X509_STORE_CTX_get_by_subject(ctx, X509_LU_CRL, nm, xobj)) {
|
||||
X509_OBJECT_free(xobj);
|
||||
sk_X509_CRL_free(sk);
|
||||
return NULL;
|
||||
}
|
||||
X509_OBJECT_free_contents(&xobj);
|
||||
CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE);
|
||||
X509_OBJECT_free(xobj);
|
||||
CRYPTO_THREAD_write_lock(ctx->ctx->lock);
|
||||
idx = x509_object_idx_cnt(ctx->ctx->objs, X509_LU_CRL, nm, &cnt);
|
||||
if (idx < 0) {
|
||||
CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE);
|
||||
CRYPTO_THREAD_unlock(ctx->ctx->lock);
|
||||
sk_X509_CRL_free(sk);
|
||||
return NULL;
|
||||
}
|
||||
@@ -559,15 +571,15 @@ STACK_OF(X509_CRL) *X509_STORE_get1_crls(X509_STORE_CTX *ctx, X509_NAME *nm)
|
||||
for (i = 0; i < cnt; i++, idx++) {
|
||||
obj = sk_X509_OBJECT_value(ctx->ctx->objs, idx);
|
||||
x = obj->data.crl;
|
||||
CRYPTO_add(&x->references, 1, CRYPTO_LOCK_X509_CRL);
|
||||
X509_CRL_up_ref(x);
|
||||
if (!sk_X509_CRL_push(sk, x)) {
|
||||
CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE);
|
||||
CRYPTO_THREAD_unlock(ctx->ctx->lock);
|
||||
X509_CRL_free(x);
|
||||
sk_X509_CRL_pop_free(sk, X509_CRL_free);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE);
|
||||
CRYPTO_THREAD_unlock(ctx->ctx->lock);
|
||||
return sk;
|
||||
}
|
||||
|
||||
@@ -613,32 +625,32 @@ X509_OBJECT *X509_OBJECT_retrieve_match(STACK_OF(X509_OBJECT) *h,
|
||||
int X509_STORE_CTX_get1_issuer(X509 **issuer, X509_STORE_CTX *ctx, X509 *x)
|
||||
{
|
||||
X509_NAME *xn;
|
||||
X509_OBJECT obj, *pobj;
|
||||
X509_OBJECT *obj = X509_OBJECT_new(), *pobj = NULL;
|
||||
int i, ok, idx, ret;
|
||||
|
||||
if (obj == NULL)
|
||||
return -1;
|
||||
*issuer = NULL;
|
||||
xn = X509_get_issuer_name(x);
|
||||
ok = X509_STORE_get_by_subject(ctx, X509_LU_X509, xn, &obj);
|
||||
if (ok != X509_LU_X509) {
|
||||
if (ok == X509_LU_RETRY) {
|
||||
X509_OBJECT_free_contents(&obj);
|
||||
X509err(X509_F_X509_STORE_CTX_GET1_ISSUER, X509_R_SHOULD_RETRY);
|
||||
return -1;
|
||||
} else if (ok != X509_LU_FAIL) {
|
||||
X509_OBJECT_free_contents(&obj);
|
||||
/* not good :-(, break anyway */
|
||||
return -1;
|
||||
}
|
||||
ok = X509_STORE_CTX_get_by_subject(ctx, X509_LU_X509, xn, obj);
|
||||
if (ok != 1) {
|
||||
X509_OBJECT_free(obj);
|
||||
return 0;
|
||||
}
|
||||
/* If certificate matches all OK */
|
||||
if (ctx->check_issued(ctx, x, obj.data.x509)) {
|
||||
*issuer = obj.data.x509;
|
||||
return 1;
|
||||
if (ctx->check_issued(ctx, x, obj->data.x509)) {
|
||||
if (x509_check_cert_time(ctx, obj->data.x509, -1)) {
|
||||
*issuer = obj->data.x509;
|
||||
X509_up_ref(*issuer);
|
||||
X509_OBJECT_free(obj);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
X509_OBJECT_free_contents(&obj);
|
||||
X509_OBJECT_free(obj);
|
||||
|
||||
/* Else find index of first cert accepted by 'check_issued' */
|
||||
ret = 0;
|
||||
CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE);
|
||||
CRYPTO_THREAD_write_lock(ctx->ctx->lock);
|
||||
idx = X509_OBJECT_idx_by_subject(ctx->ctx->objs, X509_LU_X509, xn);
|
||||
if (idx != -1) { /* should be true as we've had at least one
|
||||
* match */
|
||||
@@ -652,13 +664,22 @@ int X509_STORE_CTX_get1_issuer(X509 **issuer, X509_STORE_CTX *ctx, X509 *x)
|
||||
break;
|
||||
if (ctx->check_issued(ctx, x, pobj->data.x509)) {
|
||||
*issuer = pobj->data.x509;
|
||||
X509_OBJECT_up_ref_count(pobj);
|
||||
ret = 1;
|
||||
break;
|
||||
/*
|
||||
* If times check, exit with match,
|
||||
* otherwise keep looking. Leave last
|
||||
* match in issuer so we return nearest
|
||||
* match if no certificate time is OK.
|
||||
*/
|
||||
|
||||
if (x509_check_cert_time(ctx, *issuer, -1))
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE);
|
||||
CRYPTO_THREAD_unlock(ctx->ctx->lock);
|
||||
if (*issuer)
|
||||
X509_up_ref(*issuer);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -688,25 +709,153 @@ int X509_STORE_set1_param(X509_STORE *ctx, X509_VERIFY_PARAM *param)
|
||||
return X509_VERIFY_PARAM_set1(ctx->param, param);
|
||||
}
|
||||
|
||||
X509_VERIFY_PARAM *X509_STORE_get0_param(X509_STORE *ctx)
|
||||
{
|
||||
return ctx->param;
|
||||
}
|
||||
|
||||
void X509_STORE_set_verify(X509_STORE *ctx, X509_STORE_CTX_verify_fn verify)
|
||||
{
|
||||
ctx->verify = verify;
|
||||
}
|
||||
|
||||
X509_STORE_CTX_verify_fn X509_STORE_get_verify(X509_STORE *ctx)
|
||||
{
|
||||
return ctx->verify;
|
||||
}
|
||||
|
||||
void X509_STORE_set_verify_cb(X509_STORE *ctx,
|
||||
int (*verify_cb) (int, X509_STORE_CTX *))
|
||||
X509_STORE_CTX_verify_cb verify_cb)
|
||||
{
|
||||
ctx->verify_cb = verify_cb;
|
||||
}
|
||||
|
||||
void X509_STORE_set_lookup_crls_cb(X509_STORE *ctx,
|
||||
STACK_OF(X509_CRL) *(*cb) (X509_STORE_CTX
|
||||
*ctx,
|
||||
X509_NAME *nm))
|
||||
X509_STORE_CTX_verify_cb X509_STORE_get_verify_cb(X509_STORE *ctx)
|
||||
{
|
||||
ctx->lookup_crls = cb;
|
||||
return ctx->verify_cb;
|
||||
}
|
||||
|
||||
void X509_STORE_set_get_issuer(X509_STORE *ctx,
|
||||
X509_STORE_CTX_get_issuer_fn get_issuer)
|
||||
{
|
||||
ctx->get_issuer = get_issuer;
|
||||
}
|
||||
|
||||
X509_STORE_CTX_get_issuer_fn X509_STORE_get_get_issuer(X509_STORE *ctx)
|
||||
{
|
||||
return ctx->get_issuer;
|
||||
}
|
||||
|
||||
void X509_STORE_set_check_issued(X509_STORE *ctx,
|
||||
X509_STORE_CTX_check_issued_fn check_issued)
|
||||
{
|
||||
ctx->check_issued = check_issued;
|
||||
}
|
||||
|
||||
X509_STORE_CTX_check_issued_fn X509_STORE_get_check_issued(X509_STORE *ctx)
|
||||
{
|
||||
return ctx->check_issued;
|
||||
}
|
||||
|
||||
void X509_STORE_set_check_revocation(X509_STORE *ctx,
|
||||
X509_STORE_CTX_check_revocation_fn check_revocation)
|
||||
{
|
||||
ctx->check_revocation = check_revocation;
|
||||
}
|
||||
|
||||
X509_STORE_CTX_check_revocation_fn X509_STORE_get_check_revocation(X509_STORE *ctx)
|
||||
{
|
||||
return ctx->check_revocation;
|
||||
}
|
||||
|
||||
void X509_STORE_set_get_crl(X509_STORE *ctx,
|
||||
X509_STORE_CTX_get_crl_fn get_crl)
|
||||
{
|
||||
ctx->get_crl = get_crl;
|
||||
}
|
||||
|
||||
X509_STORE_CTX_get_crl_fn X509_STORE_get_get_crl(X509_STORE *ctx)
|
||||
{
|
||||
return ctx->get_crl;
|
||||
}
|
||||
|
||||
void X509_STORE_set_check_crl(X509_STORE *ctx,
|
||||
X509_STORE_CTX_check_crl_fn check_crl)
|
||||
{
|
||||
ctx->check_crl = check_crl;
|
||||
}
|
||||
|
||||
X509_STORE_CTX_check_crl_fn X509_STORE_get_check_crl(X509_STORE *ctx)
|
||||
{
|
||||
return ctx->check_crl;
|
||||
}
|
||||
|
||||
void X509_STORE_set_cert_crl(X509_STORE *ctx,
|
||||
X509_STORE_CTX_cert_crl_fn cert_crl)
|
||||
{
|
||||
ctx->cert_crl = cert_crl;
|
||||
}
|
||||
|
||||
X509_STORE_CTX_cert_crl_fn X509_STORE_get_cert_crl(X509_STORE *ctx)
|
||||
{
|
||||
return ctx->cert_crl;
|
||||
}
|
||||
|
||||
void X509_STORE_set_check_policy(X509_STORE *ctx,
|
||||
X509_STORE_CTX_check_policy_fn check_policy)
|
||||
{
|
||||
ctx->check_policy = check_policy;
|
||||
}
|
||||
|
||||
X509_STORE_CTX_check_policy_fn X509_STORE_get_check_policy(X509_STORE *ctx)
|
||||
{
|
||||
return ctx->check_policy;
|
||||
}
|
||||
|
||||
void X509_STORE_set_lookup_certs(X509_STORE *ctx,
|
||||
X509_STORE_CTX_lookup_certs_fn lookup_certs)
|
||||
{
|
||||
ctx->lookup_certs = lookup_certs;
|
||||
}
|
||||
|
||||
X509_STORE_CTX_lookup_certs_fn X509_STORE_get_lookup_certs(X509_STORE *ctx)
|
||||
{
|
||||
return ctx->lookup_certs;
|
||||
}
|
||||
|
||||
void X509_STORE_set_lookup_crls(X509_STORE *ctx,
|
||||
X509_STORE_CTX_lookup_crls_fn lookup_crls)
|
||||
{
|
||||
ctx->lookup_crls = lookup_crls;
|
||||
}
|
||||
|
||||
X509_STORE_CTX_lookup_crls_fn X509_STORE_get_lookup_crls(X509_STORE *ctx)
|
||||
{
|
||||
return ctx->lookup_crls;
|
||||
}
|
||||
|
||||
void X509_STORE_set_cleanup(X509_STORE *ctx,
|
||||
X509_STORE_CTX_cleanup_fn ctx_cleanup)
|
||||
{
|
||||
ctx->cleanup = ctx_cleanup;
|
||||
}
|
||||
|
||||
X509_STORE_CTX_cleanup_fn X509_STORE_get_cleanup(X509_STORE *ctx)
|
||||
{
|
||||
return ctx->cleanup;
|
||||
}
|
||||
|
||||
int X509_STORE_set_ex_data(X509_STORE *ctx, int idx, void *data)
|
||||
{
|
||||
return CRYPTO_set_ex_data(&ctx->ex_data, idx, data);
|
||||
}
|
||||
|
||||
void *X509_STORE_get_ex_data(X509_STORE *ctx, int idx)
|
||||
{
|
||||
return CRYPTO_get_ex_data(&ctx->ex_data, idx);
|
||||
}
|
||||
|
||||
X509_STORE *X509_STORE_CTX_get0_store(X509_STORE_CTX *ctx)
|
||||
{
|
||||
return ctx->ctx;
|
||||
}
|
||||
|
||||
IMPLEMENT_STACK_OF(X509_LOOKUP)
|
||||
|
||||
IMPLEMENT_STACK_OF(X509_OBJECT)
|
||||
|
||||
@@ -1,71 +1,30 @@
|
||||
/* crypto/x509/x509_obj.c */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
/*
|
||||
* Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
* 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 "cryptlib.h"
|
||||
#include "internal/cryptlib.h"
|
||||
#include <openssl/lhash.h>
|
||||
#include <openssl/objects.h>
|
||||
#include <openssl/x509.h>
|
||||
#include <openssl/buffer.h>
|
||||
#include "internal/x509_int.h"
|
||||
|
||||
char *X509_NAME_oneline(X509_NAME *a, char *buf, int len)
|
||||
/*
|
||||
* Limit to ensure we don't overflow: much greater than
|
||||
* anything encountered in practice.
|
||||
*/
|
||||
|
||||
#define NAME_ONELINE_MAX (1024 * 1024)
|
||||
|
||||
char *X509_NAME_oneline(const X509_NAME *a, char *buf, int len)
|
||||
{
|
||||
X509_NAME_ENTRY *ne;
|
||||
const X509_NAME_ENTRY *ne;
|
||||
int i;
|
||||
int n, lold, l, l1, l2, num, j, type;
|
||||
const char *s;
|
||||
@@ -76,7 +35,7 @@ char *X509_NAME_oneline(X509_NAME *a, char *buf, int len)
|
||||
int gs_doit[4];
|
||||
char tmp_buf[80];
|
||||
#ifdef CHARSET_EBCDIC
|
||||
char ebcdic_buf[1024];
|
||||
unsigned char ebcdic_buf[1024];
|
||||
#endif
|
||||
|
||||
if (buf == NULL) {
|
||||
@@ -86,6 +45,8 @@ char *X509_NAME_oneline(X509_NAME *a, char *buf, int len)
|
||||
goto err;
|
||||
b->data[0] = '\0';
|
||||
len = 200;
|
||||
} else if (len == 0) {
|
||||
return NULL;
|
||||
}
|
||||
if (a == NULL) {
|
||||
if (b) {
|
||||
@@ -110,15 +71,20 @@ char *X509_NAME_oneline(X509_NAME *a, char *buf, int len)
|
||||
|
||||
type = ne->value->type;
|
||||
num = ne->value->length;
|
||||
if (num > NAME_ONELINE_MAX) {
|
||||
X509err(X509_F_X509_NAME_ONELINE, X509_R_NAME_TOO_LONG);
|
||||
goto end;
|
||||
}
|
||||
q = ne->value->data;
|
||||
#ifdef CHARSET_EBCDIC
|
||||
if (type == V_ASN1_GENERALSTRING ||
|
||||
type == V_ASN1_VISIBLESTRING ||
|
||||
type == V_ASN1_PRINTABLESTRING ||
|
||||
type == V_ASN1_TELETEXSTRING ||
|
||||
type == V_ASN1_VISIBLESTRING || type == V_ASN1_IA5STRING) {
|
||||
ascii2ebcdic(ebcdic_buf, q, (num > sizeof ebcdic_buf)
|
||||
? sizeof ebcdic_buf : num);
|
||||
type == V_ASN1_IA5STRING) {
|
||||
if (num > (int)sizeof(ebcdic_buf))
|
||||
num = sizeof(ebcdic_buf);
|
||||
ascii2ebcdic(ebcdic_buf, q, num);
|
||||
q = ebcdic_buf;
|
||||
}
|
||||
#endif
|
||||
@@ -154,6 +120,10 @@ char *X509_NAME_oneline(X509_NAME *a, char *buf, int len)
|
||||
|
||||
lold = l;
|
||||
l += 1 + l1 + 1 + l2;
|
||||
if (l > NAME_ONELINE_MAX) {
|
||||
X509err(X509_F_X509_NAME_ONELINE, X509_R_NAME_TOO_LONG);
|
||||
goto end;
|
||||
}
|
||||
if (b != NULL) {
|
||||
if (!BUF_MEM_grow(b, l + 1))
|
||||
goto err;
|
||||
@@ -206,7 +176,7 @@ char *X509_NAME_oneline(X509_NAME *a, char *buf, int len)
|
||||
return (p);
|
||||
err:
|
||||
X509err(X509_F_X509_NAME_ONELINE, ERR_R_MALLOC_FAILURE);
|
||||
if (b != NULL)
|
||||
BUF_MEM_free(b);
|
||||
end:
|
||||
BUF_MEM_free(b);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -1,67 +1,19 @@
|
||||
/* crypto/x509/x509_r2x.c */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
/*
|
||||
* Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
* 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 "cryptlib.h"
|
||||
#include "internal/cryptlib.h"
|
||||
#include <openssl/bn.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/asn1.h>
|
||||
#include <openssl/x509.h>
|
||||
#include "internal/x509_int.h"
|
||||
#include <openssl/objects.h>
|
||||
#include <openssl/buffer.h>
|
||||
|
||||
@@ -70,17 +22,18 @@ X509 *X509_REQ_to_X509(X509_REQ *r, int days, EVP_PKEY *pkey)
|
||||
X509 *ret = NULL;
|
||||
X509_CINF *xi = NULL;
|
||||
X509_NAME *xn;
|
||||
EVP_PKEY *pubkey = NULL;
|
||||
|
||||
if ((ret = X509_new()) == NULL) {
|
||||
X509err(X509_F_X509_REQ_TO_X509, ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* duplicate the request */
|
||||
xi = ret->cert_info;
|
||||
xi = &ret->cert_info;
|
||||
|
||||
if (sk_X509_ATTRIBUTE_num(r->req_info->attributes) != 0) {
|
||||
if ((xi->version = M_ASN1_INTEGER_new()) == NULL)
|
||||
if (sk_X509_ATTRIBUTE_num(r->req_info.attributes) != 0) {
|
||||
if ((xi->version = ASN1_INTEGER_new()) == NULL)
|
||||
goto err;
|
||||
if (!ASN1_INTEGER_set(xi->version, 2))
|
||||
goto err;
|
||||
@@ -89,25 +42,26 @@ X509 *X509_REQ_to_X509(X509_REQ *r, int days, EVP_PKEY *pkey)
|
||||
}
|
||||
|
||||
xn = X509_REQ_get_subject_name(r);
|
||||
if (X509_set_subject_name(ret, X509_NAME_dup(xn)) == 0)
|
||||
if (X509_set_subject_name(ret, xn) == 0)
|
||||
goto err;
|
||||
if (X509_set_issuer_name(ret, X509_NAME_dup(xn)) == 0)
|
||||
if (X509_set_issuer_name(ret, xn) == 0)
|
||||
goto err;
|
||||
|
||||
if (X509_gmtime_adj(xi->validity->notBefore, 0) == NULL)
|
||||
if (X509_gmtime_adj(xi->validity.notBefore, 0) == NULL)
|
||||
goto err;
|
||||
if (X509_gmtime_adj(xi->validity->notAfter, (long)60 * 60 * 24 * days) ==
|
||||
if (X509_gmtime_adj(xi->validity.notAfter, (long)60 * 60 * 24 * days) ==
|
||||
NULL)
|
||||
goto err;
|
||||
|
||||
X509_set_pubkey(ret, X509_REQ_get_pubkey(r));
|
||||
pubkey = X509_REQ_get0_pubkey(r);
|
||||
if (pubkey == NULL || !X509_set_pubkey(ret, pubkey))
|
||||
goto err;
|
||||
|
||||
if (!X509_sign(ret, pkey, EVP_md5()))
|
||||
goto err;
|
||||
if (0) {
|
||||
return ret;
|
||||
|
||||
err:
|
||||
X509_free(ret);
|
||||
ret = NULL;
|
||||
}
|
||||
return (ret);
|
||||
X509_free(ret);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -1,68 +1,20 @@
|
||||
/* crypto/x509/x509_req.c */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
/*
|
||||
* Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
* 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 "cryptlib.h"
|
||||
#include "internal/cryptlib.h"
|
||||
#include <openssl/bn.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/asn1.h>
|
||||
#include <openssl/asn1t.h>
|
||||
#include <openssl/x509.h>
|
||||
#include "internal/x509_int.h"
|
||||
#include <openssl/objects.h>
|
||||
#include <openssl/buffer.h>
|
||||
#include <openssl/pem.h>
|
||||
@@ -80,10 +32,10 @@ X509_REQ *X509_to_X509_REQ(X509 *x, EVP_PKEY *pkey, const EVP_MD *md)
|
||||
goto err;
|
||||
}
|
||||
|
||||
ri = ret->req_info;
|
||||
ri = &ret->req_info;
|
||||
|
||||
ri->version->length = 1;
|
||||
ri->version->data = (unsigned char *)OPENSSL_malloc(1);
|
||||
ri->version->data = OPENSSL_malloc(1);
|
||||
if (ri->version->data == NULL)
|
||||
goto err;
|
||||
ri->version->data[0] = 0; /* version == 0 */
|
||||
@@ -91,11 +43,10 @@ X509_REQ *X509_to_X509_REQ(X509 *x, EVP_PKEY *pkey, const EVP_MD *md)
|
||||
if (!X509_REQ_set_subject_name(ret, X509_get_subject_name(x)))
|
||||
goto err;
|
||||
|
||||
pktmp = X509_get_pubkey(x);
|
||||
pktmp = X509_get0_pubkey(x);
|
||||
if (pktmp == NULL)
|
||||
goto err;
|
||||
i = X509_REQ_set_pubkey(ret, pktmp);
|
||||
EVP_PKEY_free(pktmp);
|
||||
if (!i)
|
||||
goto err;
|
||||
|
||||
@@ -111,9 +62,21 @@ X509_REQ *X509_to_X509_REQ(X509 *x, EVP_PKEY *pkey, const EVP_MD *md)
|
||||
|
||||
EVP_PKEY *X509_REQ_get_pubkey(X509_REQ *req)
|
||||
{
|
||||
if ((req == NULL) || (req->req_info == NULL))
|
||||
if (req == NULL)
|
||||
return (NULL);
|
||||
return (X509_PUBKEY_get(req->req_info->pubkey));
|
||||
return (X509_PUBKEY_get(req->req_info.pubkey));
|
||||
}
|
||||
|
||||
EVP_PKEY *X509_REQ_get0_pubkey(X509_REQ *req)
|
||||
{
|
||||
if (req == NULL)
|
||||
return NULL;
|
||||
return (X509_PUBKEY_get0(req->req_info.pubkey));
|
||||
}
|
||||
|
||||
X509_PUBKEY *X509_REQ_get_X509_PUBKEY(X509_REQ *req)
|
||||
{
|
||||
return req->req_info.pubkey;
|
||||
}
|
||||
|
||||
int X509_REQ_check_private_key(X509_REQ *x, EVP_PKEY *k)
|
||||
@@ -135,13 +98,13 @@ int X509_REQ_check_private_key(X509_REQ *x, EVP_PKEY *k)
|
||||
break;
|
||||
case -2:
|
||||
#ifndef OPENSSL_NO_EC
|
||||
if (k->type == EVP_PKEY_EC) {
|
||||
if (EVP_PKEY_id(k) == EVP_PKEY_EC) {
|
||||
X509err(X509_F_X509_REQ_CHECK_PRIVATE_KEY, ERR_R_EC_LIB);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
#ifndef OPENSSL_NO_DH
|
||||
if (k->type == EVP_PKEY_DH) {
|
||||
if (EVP_PKEY_id(k) == EVP_PKEY_DH) {
|
||||
/* No idea */
|
||||
X509err(X509_F_X509_REQ_CHECK_PRIVATE_KEY,
|
||||
X509_R_CANT_CHECK_DH_KEY);
|
||||
@@ -194,17 +157,14 @@ STACK_OF(X509_EXTENSION) *X509_REQ_get_extensions(X509_REQ *req)
|
||||
int idx, *pnid;
|
||||
const unsigned char *p;
|
||||
|
||||
if ((req == NULL) || (req->req_info == NULL) || !ext_nids)
|
||||
if ((req == NULL) || !ext_nids)
|
||||
return (NULL);
|
||||
for (pnid = ext_nids; *pnid != NID_undef; pnid++) {
|
||||
idx = X509_REQ_get_attr_by_NID(req, *pnid, -1);
|
||||
if (idx == -1)
|
||||
continue;
|
||||
attr = X509_REQ_get_attr(req, idx);
|
||||
if (attr->single)
|
||||
ext = attr->value.single;
|
||||
else if (sk_ASN1_TYPE_num(attr->value.set))
|
||||
ext = sk_ASN1_TYPE_value(attr->value.set, 0);
|
||||
ext = X509_ATTRIBUTE_get0_type(attr, 0);
|
||||
break;
|
||||
}
|
||||
if (!ext || (ext->type != V_ASN1_SEQUENCE))
|
||||
@@ -223,37 +183,17 @@ STACK_OF(X509_EXTENSION) *X509_REQ_get_extensions(X509_REQ *req)
|
||||
int X509_REQ_add_extensions_nid(X509_REQ *req, STACK_OF(X509_EXTENSION) *exts,
|
||||
int nid)
|
||||
{
|
||||
ASN1_TYPE *at = NULL;
|
||||
X509_ATTRIBUTE *attr = NULL;
|
||||
if (!(at = ASN1_TYPE_new()) || !(at->value.sequence = ASN1_STRING_new()))
|
||||
goto err;
|
||||
|
||||
at->type = V_ASN1_SEQUENCE;
|
||||
int extlen;
|
||||
int rv = 0;
|
||||
unsigned char *ext = NULL;
|
||||
/* Generate encoding of extensions */
|
||||
at->value.sequence->length =
|
||||
ASN1_item_i2d((ASN1_VALUE *)exts,
|
||||
&at->value.sequence->data,
|
||||
ASN1_ITEM_rptr(X509_EXTENSIONS));
|
||||
if (!(attr = X509_ATTRIBUTE_new()))
|
||||
goto err;
|
||||
if (!(attr->value.set = sk_ASN1_TYPE_new_null()))
|
||||
goto err;
|
||||
if (!sk_ASN1_TYPE_push(attr->value.set, at))
|
||||
goto err;
|
||||
at = NULL;
|
||||
attr->single = 0;
|
||||
attr->object = OBJ_nid2obj(nid);
|
||||
if (!req->req_info->attributes) {
|
||||
if (!(req->req_info->attributes = sk_X509_ATTRIBUTE_new_null()))
|
||||
goto err;
|
||||
}
|
||||
if (!sk_X509_ATTRIBUTE_push(req->req_info->attributes, attr))
|
||||
goto err;
|
||||
return 1;
|
||||
err:
|
||||
X509_ATTRIBUTE_free(attr);
|
||||
ASN1_TYPE_free(at);
|
||||
return 0;
|
||||
extlen = ASN1_item_i2d((ASN1_VALUE *)exts, &ext,
|
||||
ASN1_ITEM_rptr(X509_EXTENSIONS));
|
||||
if (extlen <= 0)
|
||||
return 0;
|
||||
rv = X509_REQ_add1_attr_by_NID(req, nid, V_ASN1_SEQUENCE, ext, extlen);
|
||||
OPENSSL_free(ext);
|
||||
return rv;
|
||||
}
|
||||
|
||||
/* This is the normal usage: use the "official" OID */
|
||||
@@ -266,33 +206,33 @@ int X509_REQ_add_extensions(X509_REQ *req, STACK_OF(X509_EXTENSION) *exts)
|
||||
|
||||
int X509_REQ_get_attr_count(const X509_REQ *req)
|
||||
{
|
||||
return X509at_get_attr_count(req->req_info->attributes);
|
||||
return X509at_get_attr_count(req->req_info.attributes);
|
||||
}
|
||||
|
||||
int X509_REQ_get_attr_by_NID(const X509_REQ *req, int nid, int lastpos)
|
||||
{
|
||||
return X509at_get_attr_by_NID(req->req_info->attributes, nid, lastpos);
|
||||
return X509at_get_attr_by_NID(req->req_info.attributes, nid, lastpos);
|
||||
}
|
||||
|
||||
int X509_REQ_get_attr_by_OBJ(const X509_REQ *req, ASN1_OBJECT *obj,
|
||||
int X509_REQ_get_attr_by_OBJ(const X509_REQ *req, const ASN1_OBJECT *obj,
|
||||
int lastpos)
|
||||
{
|
||||
return X509at_get_attr_by_OBJ(req->req_info->attributes, obj, lastpos);
|
||||
return X509at_get_attr_by_OBJ(req->req_info.attributes, obj, lastpos);
|
||||
}
|
||||
|
||||
X509_ATTRIBUTE *X509_REQ_get_attr(const X509_REQ *req, int loc)
|
||||
{
|
||||
return X509at_get_attr(req->req_info->attributes, loc);
|
||||
return X509at_get_attr(req->req_info.attributes, loc);
|
||||
}
|
||||
|
||||
X509_ATTRIBUTE *X509_REQ_delete_attr(X509_REQ *req, int loc)
|
||||
{
|
||||
return X509at_delete_attr(req->req_info->attributes, loc);
|
||||
return X509at_delete_attr(req->req_info.attributes, loc);
|
||||
}
|
||||
|
||||
int X509_REQ_add1_attr(X509_REQ *req, X509_ATTRIBUTE *attr)
|
||||
{
|
||||
if (X509at_add1_attr(&req->req_info->attributes, attr))
|
||||
if (X509at_add1_attr(&req->req_info.attributes, attr))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
@@ -301,7 +241,7 @@ int X509_REQ_add1_attr_by_OBJ(X509_REQ *req,
|
||||
const ASN1_OBJECT *obj, int type,
|
||||
const unsigned char *bytes, int len)
|
||||
{
|
||||
if (X509at_add1_attr_by_OBJ(&req->req_info->attributes, obj,
|
||||
if (X509at_add1_attr_by_OBJ(&req->req_info.attributes, obj,
|
||||
type, bytes, len))
|
||||
return 1;
|
||||
return 0;
|
||||
@@ -311,7 +251,7 @@ int X509_REQ_add1_attr_by_NID(X509_REQ *req,
|
||||
int nid, int type,
|
||||
const unsigned char *bytes, int len)
|
||||
{
|
||||
if (X509at_add1_attr_by_NID(&req->req_info->attributes, nid,
|
||||
if (X509at_add1_attr_by_NID(&req->req_info.attributes, nid,
|
||||
type, bytes, len))
|
||||
return 1;
|
||||
return 0;
|
||||
@@ -321,8 +261,38 @@ int X509_REQ_add1_attr_by_txt(X509_REQ *req,
|
||||
const char *attrname, int type,
|
||||
const unsigned char *bytes, int len)
|
||||
{
|
||||
if (X509at_add1_attr_by_txt(&req->req_info->attributes, attrname,
|
||||
if (X509at_add1_attr_by_txt(&req->req_info.attributes, attrname,
|
||||
type, bytes, len))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
long X509_REQ_get_version(const X509_REQ *req)
|
||||
{
|
||||
return ASN1_INTEGER_get(req->req_info.version);
|
||||
}
|
||||
|
||||
X509_NAME *X509_REQ_get_subject_name(const X509_REQ *req)
|
||||
{
|
||||
return req->req_info.subject;
|
||||
}
|
||||
|
||||
void X509_REQ_get0_signature(const X509_REQ *req, const ASN1_BIT_STRING **psig,
|
||||
const X509_ALGOR **palg)
|
||||
{
|
||||
if (psig != NULL)
|
||||
*psig = req->signature;
|
||||
if (palg != NULL)
|
||||
*palg = &req->sig_alg;
|
||||
}
|
||||
|
||||
int X509_REQ_get_signature_nid(const X509_REQ *req)
|
||||
{
|
||||
return OBJ_obj2nid(req->sig_alg.algorithm);
|
||||
}
|
||||
|
||||
int i2d_re_X509_REQ_tbs(X509_REQ *req, unsigned char **pp)
|
||||
{
|
||||
req->req_info.enc.modified = 1;
|
||||
return i2d_X509_REQ_INFO(&req->req_info, pp);
|
||||
}
|
||||
|
||||
@@ -1,82 +1,34 @@
|
||||
/* crypto/x509/x509_set.c */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
/*
|
||||
* Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
* 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 "cryptlib.h"
|
||||
#include "internal/cryptlib.h"
|
||||
#include <openssl/asn1.h>
|
||||
#include <openssl/objects.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/x509.h>
|
||||
#include "internal/x509_int.h"
|
||||
|
||||
int X509_set_version(X509 *x, long version)
|
||||
{
|
||||
if (x == NULL)
|
||||
return (0);
|
||||
if (version == 0) {
|
||||
M_ASN1_INTEGER_free(x->cert_info->version);
|
||||
x->cert_info->version = NULL;
|
||||
ASN1_INTEGER_free(x->cert_info.version);
|
||||
x->cert_info.version = NULL;
|
||||
return (1);
|
||||
}
|
||||
if (x->cert_info->version == NULL) {
|
||||
if ((x->cert_info->version = M_ASN1_INTEGER_new()) == NULL)
|
||||
if (x->cert_info.version == NULL) {
|
||||
if ((x->cert_info.version = ASN1_INTEGER_new()) == NULL)
|
||||
return (0);
|
||||
}
|
||||
return (ASN1_INTEGER_set(x->cert_info->version, version));
|
||||
return (ASN1_INTEGER_set(x->cert_info.version, version));
|
||||
}
|
||||
|
||||
int X509_set_serialNumber(X509 *x, ASN1_INTEGER *serial)
|
||||
@@ -84,69 +36,124 @@ int X509_set_serialNumber(X509 *x, ASN1_INTEGER *serial)
|
||||
ASN1_INTEGER *in;
|
||||
|
||||
if (x == NULL)
|
||||
return (0);
|
||||
in = x->cert_info->serialNumber;
|
||||
if (in != serial) {
|
||||
in = M_ASN1_INTEGER_dup(serial);
|
||||
if (in != NULL) {
|
||||
M_ASN1_INTEGER_free(x->cert_info->serialNumber);
|
||||
x->cert_info->serialNumber = in;
|
||||
}
|
||||
}
|
||||
return (in != NULL);
|
||||
return 0;
|
||||
in = &x->cert_info.serialNumber;
|
||||
if (in != serial)
|
||||
return ASN1_STRING_copy(in, serial);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int X509_set_issuer_name(X509 *x, X509_NAME *name)
|
||||
{
|
||||
if ((x == NULL) || (x->cert_info == NULL))
|
||||
if (x == NULL)
|
||||
return (0);
|
||||
return (X509_NAME_set(&x->cert_info->issuer, name));
|
||||
return (X509_NAME_set(&x->cert_info.issuer, name));
|
||||
}
|
||||
|
||||
int X509_set_subject_name(X509 *x, X509_NAME *name)
|
||||
{
|
||||
if ((x == NULL) || (x->cert_info == NULL))
|
||||
if (x == NULL)
|
||||
return (0);
|
||||
return (X509_NAME_set(&x->cert_info->subject, name));
|
||||
return (X509_NAME_set(&x->cert_info.subject, name));
|
||||
}
|
||||
|
||||
int X509_set_notBefore(X509 *x, const ASN1_TIME *tm)
|
||||
int x509_set1_time(ASN1_TIME **ptm, const ASN1_TIME *tm)
|
||||
{
|
||||
ASN1_TIME *in;
|
||||
|
||||
if ((x == NULL) || (x->cert_info->validity == NULL))
|
||||
return (0);
|
||||
in = x->cert_info->validity->notBefore;
|
||||
in = *ptm;
|
||||
if (in != tm) {
|
||||
in = M_ASN1_TIME_dup(tm);
|
||||
in = ASN1_STRING_dup(tm);
|
||||
if (in != NULL) {
|
||||
M_ASN1_TIME_free(x->cert_info->validity->notBefore);
|
||||
x->cert_info->validity->notBefore = in;
|
||||
ASN1_TIME_free(*ptm);
|
||||
*ptm = in;
|
||||
}
|
||||
}
|
||||
return (in != NULL);
|
||||
}
|
||||
|
||||
int X509_set_notAfter(X509 *x, const ASN1_TIME *tm)
|
||||
int X509_set1_notBefore(X509 *x, const ASN1_TIME *tm)
|
||||
{
|
||||
ASN1_TIME *in;
|
||||
if (x == NULL)
|
||||
return 0;
|
||||
return x509_set1_time(&x->cert_info.validity.notBefore, tm);
|
||||
}
|
||||
|
||||
if ((x == NULL) || (x->cert_info->validity == NULL))
|
||||
return (0);
|
||||
in = x->cert_info->validity->notAfter;
|
||||
if (in != tm) {
|
||||
in = M_ASN1_TIME_dup(tm);
|
||||
if (in != NULL) {
|
||||
M_ASN1_TIME_free(x->cert_info->validity->notAfter);
|
||||
x->cert_info->validity->notAfter = in;
|
||||
}
|
||||
}
|
||||
return (in != NULL);
|
||||
int X509_set1_notAfter(X509 *x, const ASN1_TIME *tm)
|
||||
{
|
||||
if (x == NULL)
|
||||
return 0;
|
||||
return x509_set1_time(&x->cert_info.validity.notAfter, tm);
|
||||
}
|
||||
|
||||
int X509_set_pubkey(X509 *x, EVP_PKEY *pkey)
|
||||
{
|
||||
if ((x == NULL) || (x->cert_info == NULL))
|
||||
if (x == NULL)
|
||||
return (0);
|
||||
return (X509_PUBKEY_set(&(x->cert_info->key), pkey));
|
||||
return (X509_PUBKEY_set(&(x->cert_info.key), pkey));
|
||||
}
|
||||
|
||||
int X509_up_ref(X509 *x)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (CRYPTO_atomic_add(&x->references, 1, &i, x->lock) <= 0)
|
||||
return 0;
|
||||
|
||||
REF_PRINT_COUNT("X509", x);
|
||||
REF_ASSERT_ISNT(i < 2);
|
||||
return ((i > 1) ? 1 : 0);
|
||||
}
|
||||
|
||||
long X509_get_version(const X509 *x)
|
||||
{
|
||||
return ASN1_INTEGER_get(x->cert_info.version);
|
||||
}
|
||||
|
||||
const ASN1_TIME *X509_get0_notBefore(const X509 *x)
|
||||
{
|
||||
return x->cert_info.validity.notBefore;
|
||||
}
|
||||
|
||||
const ASN1_TIME *X509_get0_notAfter(const X509 *x)
|
||||
{
|
||||
return x->cert_info.validity.notAfter;
|
||||
}
|
||||
|
||||
ASN1_TIME *X509_getm_notBefore(const X509 *x)
|
||||
{
|
||||
return x->cert_info.validity.notBefore;
|
||||
}
|
||||
|
||||
ASN1_TIME *X509_getm_notAfter(const X509 *x)
|
||||
{
|
||||
return x->cert_info.validity.notAfter;
|
||||
}
|
||||
|
||||
int X509_get_signature_type(const X509 *x)
|
||||
{
|
||||
return EVP_PKEY_type(OBJ_obj2nid(x->sig_alg.algorithm));
|
||||
}
|
||||
|
||||
X509_PUBKEY *X509_get_X509_PUBKEY(const X509 *x)
|
||||
{
|
||||
return x->cert_info.key;
|
||||
}
|
||||
|
||||
const STACK_OF(X509_EXTENSION) *X509_get0_extensions(const X509 *x)
|
||||
{
|
||||
return x->cert_info.extensions;
|
||||
}
|
||||
|
||||
void X509_get0_uids(const X509 *x, const ASN1_BIT_STRING **piuid,
|
||||
const ASN1_BIT_STRING **psuid)
|
||||
{
|
||||
if (piuid != NULL)
|
||||
*piuid = x->cert_info.issuerUID;
|
||||
if (psuid != NULL)
|
||||
*psuid = x->cert_info.subjectUID;
|
||||
}
|
||||
|
||||
const X509_ALGOR *X509_get0_tbs_sigalg(const X509 *x)
|
||||
{
|
||||
return &x->cert_info.signature;
|
||||
}
|
||||
|
||||
@@ -1,65 +1,16 @@
|
||||
/* x509_trs.c */
|
||||
/*
|
||||
* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project
|
||||
* 1999.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1999 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).
|
||||
* 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 "cryptlib.h"
|
||||
#include "internal/cryptlib.h"
|
||||
#include <openssl/x509v3.h>
|
||||
#include "internal/x509_int.h"
|
||||
|
||||
static int tr_cmp(const X509_TRUST *const *a, const X509_TRUST *const *b);
|
||||
static void trtable_free(X509_TRUST *p);
|
||||
@@ -94,9 +45,7 @@ static X509_TRUST trstandard[] = {
|
||||
{X509_TRUST_TSA, 0, trust_1oidany, "TSA server", NID_time_stamp, NULL}
|
||||
};
|
||||
|
||||
#define X509_TRUST_COUNT (sizeof(trstandard)/sizeof(X509_TRUST))
|
||||
|
||||
IMPLEMENT_STACK_OF(X509_TRUST)
|
||||
#define X509_TRUST_COUNT OSSL_NELEM(trstandard)
|
||||
|
||||
static STACK_OF(X509_TRUST) *trtable = NULL;
|
||||
|
||||
@@ -117,16 +66,11 @@ int X509_check_trust(X509 *x, int id, int flags)
|
||||
{
|
||||
X509_TRUST *pt;
|
||||
int idx;
|
||||
if (id == -1)
|
||||
return 1;
|
||||
|
||||
/* We get this as a default value */
|
||||
if (id == 0) {
|
||||
int rv;
|
||||
rv = obj_trust(NID_anyExtendedKeyUsage, x, 0);
|
||||
if (rv != X509_TRUST_UNTRUSTED)
|
||||
return rv;
|
||||
return trust_compat(NULL, x, 0);
|
||||
}
|
||||
if (id == X509_TRUST_DEFAULT)
|
||||
return obj_trust(NID_anyExtendedKeyUsage, x,
|
||||
flags | X509_TRUST_DO_SS_COMPAT);
|
||||
idx = X509_TRUST_get_by_id(id);
|
||||
if (idx == -1)
|
||||
return default_trust(id, x, flags);
|
||||
@@ -176,7 +120,7 @@ int X509_TRUST_set(int *t, int trust)
|
||||
}
|
||||
|
||||
int X509_TRUST_add(int id, int flags, int (*ck) (X509_TRUST *, X509 *, int),
|
||||
char *name, int arg1, void *arg2)
|
||||
const char *name, int arg1, void *arg2)
|
||||
{
|
||||
int idx;
|
||||
X509_TRUST *trtmp;
|
||||
@@ -190,7 +134,7 @@ int X509_TRUST_add(int id, int flags, int (*ck) (X509_TRUST *, X509 *, int),
|
||||
idx = X509_TRUST_get_by_id(id);
|
||||
/* Need a new entry */
|
||||
if (idx == -1) {
|
||||
if (!(trtmp = OPENSSL_malloc(sizeof(X509_TRUST)))) {
|
||||
if ((trtmp = OPENSSL_malloc(sizeof(*trtmp))) == NULL) {
|
||||
X509err(X509_F_X509_TRUST_ADD, ERR_R_MALLOC_FAILURE);
|
||||
return 0;
|
||||
}
|
||||
@@ -202,9 +146,9 @@ int X509_TRUST_add(int id, int flags, int (*ck) (X509_TRUST *, X509 *, int),
|
||||
if (trtmp->flags & X509_TRUST_DYNAMIC_NAME)
|
||||
OPENSSL_free(trtmp->name);
|
||||
/* dup supplied name */
|
||||
if (!(trtmp->name = BUF_strdup(name))) {
|
||||
if ((trtmp->name = OPENSSL_strdup(name)) == NULL) {
|
||||
X509err(X509_F_X509_TRUST_ADD, ERR_R_MALLOC_FAILURE);
|
||||
return 0;
|
||||
goto err;
|
||||
}
|
||||
/* Keep the dynamic flag of existing entry */
|
||||
trtmp->flags &= X509_TRUST_DYNAMIC;
|
||||
@@ -218,16 +162,23 @@ int X509_TRUST_add(int id, int flags, int (*ck) (X509_TRUST *, X509 *, int),
|
||||
|
||||
/* If its a new entry manage the dynamic table */
|
||||
if (idx == -1) {
|
||||
if (!trtable && !(trtable = sk_X509_TRUST_new(tr_cmp))) {
|
||||
if (trtable == NULL
|
||||
&& (trtable = sk_X509_TRUST_new(tr_cmp)) == NULL) {
|
||||
X509err(X509_F_X509_TRUST_ADD, ERR_R_MALLOC_FAILURE);
|
||||
return 0;
|
||||
goto err;;
|
||||
}
|
||||
if (!sk_X509_TRUST_push(trtable, trtmp)) {
|
||||
X509err(X509_F_X509_TRUST_ADD, ERR_R_MALLOC_FAILURE);
|
||||
return 0;
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
err:
|
||||
if (idx == -1) {
|
||||
OPENSSL_free(trtmp->name);
|
||||
OPENSSL_free(trtmp);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void trtable_free(X509_TRUST *p)
|
||||
@@ -243,50 +194,53 @@ static void trtable_free(X509_TRUST *p)
|
||||
|
||||
void X509_TRUST_cleanup(void)
|
||||
{
|
||||
unsigned int i;
|
||||
for (i = 0; i < X509_TRUST_COUNT; i++)
|
||||
trtable_free(trstandard + i);
|
||||
sk_X509_TRUST_pop_free(trtable, trtable_free);
|
||||
trtable = NULL;
|
||||
}
|
||||
|
||||
int X509_TRUST_get_flags(X509_TRUST *xp)
|
||||
int X509_TRUST_get_flags(const X509_TRUST *xp)
|
||||
{
|
||||
return xp->flags;
|
||||
}
|
||||
|
||||
char *X509_TRUST_get0_name(X509_TRUST *xp)
|
||||
char *X509_TRUST_get0_name(const X509_TRUST *xp)
|
||||
{
|
||||
return xp->name;
|
||||
}
|
||||
|
||||
int X509_TRUST_get_trust(X509_TRUST *xp)
|
||||
int X509_TRUST_get_trust(const X509_TRUST *xp)
|
||||
{
|
||||
return xp->trust;
|
||||
}
|
||||
|
||||
static int trust_1oidany(X509_TRUST *trust, X509 *x, int flags)
|
||||
{
|
||||
if (x->aux && (x->aux->trust || x->aux->reject))
|
||||
return obj_trust(trust->arg1, x, flags);
|
||||
/*
|
||||
* we don't have any trust settings: for compatibility we return trusted
|
||||
* if it is self signed
|
||||
* Declare the chain verified if the desired trust OID is not rejected in
|
||||
* any auxiliary trust info for this certificate, and the OID is either
|
||||
* expressly trusted, or else either "anyEKU" is trusted, or the
|
||||
* certificate is self-signed.
|
||||
*/
|
||||
return trust_compat(trust, x, flags);
|
||||
flags |= X509_TRUST_DO_SS_COMPAT | X509_TRUST_OK_ANY_EKU;
|
||||
return obj_trust(trust->arg1, x, flags);
|
||||
}
|
||||
|
||||
static int trust_1oid(X509_TRUST *trust, X509 *x, int flags)
|
||||
{
|
||||
if (x->aux)
|
||||
return obj_trust(trust->arg1, x, flags);
|
||||
return X509_TRUST_UNTRUSTED;
|
||||
/*
|
||||
* Declare the chain verified only if the desired trust OID is not
|
||||
* rejected and is expressly trusted. Neither "anyEKU" nor "compat"
|
||||
* trust in self-signed certificates apply.
|
||||
*/
|
||||
flags &= ~(X509_TRUST_DO_SS_COMPAT | X509_TRUST_OK_ANY_EKU);
|
||||
return obj_trust(trust->arg1, x, flags);
|
||||
}
|
||||
|
||||
static int trust_compat(X509_TRUST *trust, X509 *x, int flags)
|
||||
{
|
||||
/* Call for side-effect of computing hash and caching extensions */
|
||||
X509_check_purpose(x, -1, 0);
|
||||
if (x->ex_flags & EXFLAG_SS)
|
||||
if ((flags & X509_TRUST_NO_SS_COMPAT) == 0 && x->ex_flags & EXFLAG_SS)
|
||||
return X509_TRUST_TRUSTED;
|
||||
else
|
||||
return X509_TRUST_UNTRUSTED;
|
||||
@@ -294,25 +248,51 @@ static int trust_compat(X509_TRUST *trust, X509 *x, int flags)
|
||||
|
||||
static int obj_trust(int id, X509 *x, int flags)
|
||||
{
|
||||
ASN1_OBJECT *obj;
|
||||
X509_CERT_AUX *ax = x->aux;
|
||||
int i;
|
||||
X509_CERT_AUX *ax;
|
||||
ax = x->aux;
|
||||
if (!ax)
|
||||
return X509_TRUST_UNTRUSTED;
|
||||
if (ax->reject) {
|
||||
|
||||
if (ax && ax->reject) {
|
||||
for (i = 0; i < sk_ASN1_OBJECT_num(ax->reject); i++) {
|
||||
obj = sk_ASN1_OBJECT_value(ax->reject, i);
|
||||
if (OBJ_obj2nid(obj) == id)
|
||||
ASN1_OBJECT *obj = sk_ASN1_OBJECT_value(ax->reject, i);
|
||||
int nid = OBJ_obj2nid(obj);
|
||||
|
||||
if (nid == id || (nid == NID_anyExtendedKeyUsage &&
|
||||
(flags & X509_TRUST_OK_ANY_EKU)))
|
||||
return X509_TRUST_REJECTED;
|
||||
}
|
||||
}
|
||||
if (ax->trust) {
|
||||
|
||||
if (ax && ax->trust) {
|
||||
for (i = 0; i < sk_ASN1_OBJECT_num(ax->trust); i++) {
|
||||
obj = sk_ASN1_OBJECT_value(ax->trust, i);
|
||||
if (OBJ_obj2nid(obj) == id)
|
||||
ASN1_OBJECT *obj = sk_ASN1_OBJECT_value(ax->trust, i);
|
||||
int nid = OBJ_obj2nid(obj);
|
||||
|
||||
if (nid == id || (nid == NID_anyExtendedKeyUsage &&
|
||||
(flags & X509_TRUST_OK_ANY_EKU)))
|
||||
return X509_TRUST_TRUSTED;
|
||||
}
|
||||
/*
|
||||
* Reject when explicit trust EKU are set and none match.
|
||||
*
|
||||
* Returning untrusted is enough for for full chains that end in
|
||||
* self-signed roots, because when explicit trust is specified it
|
||||
* suppresses the default blanket trust of self-signed objects.
|
||||
*
|
||||
* But for partial chains, this is not enough, because absent a similar
|
||||
* trust-self-signed policy, non matching EKUs are indistinguishable
|
||||
* from lack of EKU constraints.
|
||||
*
|
||||
* Therefore, failure to match any trusted purpose must trigger an
|
||||
* explicit reject.
|
||||
*/
|
||||
return X509_TRUST_REJECTED;
|
||||
}
|
||||
return X509_TRUST_UNTRUSTED;
|
||||
|
||||
if ((flags & X509_TRUST_DO_SS_COMPAT) == 0)
|
||||
return X509_TRUST_UNTRUSTED;
|
||||
|
||||
/*
|
||||
* Not rejected, and there is no list of accepted uses, try compat.
|
||||
*/
|
||||
return trust_compat(NULL, x, flags);
|
||||
}
|
||||
|
||||
@@ -1,66 +1,17 @@
|
||||
/* crypto/x509/x509_txt.c */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
/*
|
||||
* Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
* 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 <time.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "cryptlib.h"
|
||||
#include "internal/cryptlib.h"
|
||||
#include <openssl/lhash.h>
|
||||
#include <openssl/buffer.h>
|
||||
#include <openssl/evp.h>
|
||||
@@ -70,11 +21,11 @@
|
||||
|
||||
const char *X509_verify_cert_error_string(long n)
|
||||
{
|
||||
static char buf[100];
|
||||
|
||||
switch ((int)n) {
|
||||
case X509_V_OK:
|
||||
return ("ok");
|
||||
case X509_V_ERR_UNSPECIFIED:
|
||||
return ("unspecified certificate verification error");
|
||||
case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
|
||||
return ("unable to get issuer certificate");
|
||||
case X509_V_ERR_UNABLE_TO_GET_CRL:
|
||||
@@ -91,10 +42,10 @@ const char *X509_verify_cert_error_string(long n)
|
||||
return ("CRL signature failure");
|
||||
case X509_V_ERR_CERT_NOT_YET_VALID:
|
||||
return ("certificate is not yet valid");
|
||||
case X509_V_ERR_CRL_NOT_YET_VALID:
|
||||
return ("CRL is not yet valid");
|
||||
case X509_V_ERR_CERT_HAS_EXPIRED:
|
||||
return ("certificate has expired");
|
||||
case X509_V_ERR_CRL_NOT_YET_VALID:
|
||||
return ("CRL is not yet valid");
|
||||
case X509_V_ERR_CRL_HAS_EXPIRED:
|
||||
return ("CRL has expired");
|
||||
case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
|
||||
@@ -121,23 +72,14 @@ const char *X509_verify_cert_error_string(long n)
|
||||
return ("certificate revoked");
|
||||
case X509_V_ERR_INVALID_CA:
|
||||
return ("invalid CA certificate");
|
||||
case X509_V_ERR_INVALID_NON_CA:
|
||||
return ("invalid non-CA certificate (has CA markings)");
|
||||
case X509_V_ERR_PATH_LENGTH_EXCEEDED:
|
||||
return ("path length constraint exceeded");
|
||||
case X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED:
|
||||
return ("proxy path length constraint exceeded");
|
||||
case X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED:
|
||||
return
|
||||
("proxy certificates not allowed, please set the appropriate flag");
|
||||
case X509_V_ERR_INVALID_PURPOSE:
|
||||
return ("unsupported certificate purpose");
|
||||
case X509_V_ERR_CERT_UNTRUSTED:
|
||||
return ("certificate not trusted");
|
||||
case X509_V_ERR_CERT_REJECTED:
|
||||
return ("certificate rejected");
|
||||
case X509_V_ERR_APPLICATION_VERIFICATION:
|
||||
return ("application verification failure");
|
||||
case X509_V_ERR_SUBJECT_ISSUER_MISMATCH:
|
||||
return ("subject issuer mismatch");
|
||||
case X509_V_ERR_AKID_SKID_MISMATCH:
|
||||
@@ -152,10 +94,17 @@ const char *X509_verify_cert_error_string(long n)
|
||||
return ("unhandled critical extension");
|
||||
case X509_V_ERR_KEYUSAGE_NO_CRL_SIGN:
|
||||
return ("key usage does not include CRL signing");
|
||||
case X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE:
|
||||
return ("key usage does not include digital signature");
|
||||
case X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION:
|
||||
return ("unhandled critical CRL extension");
|
||||
case X509_V_ERR_INVALID_NON_CA:
|
||||
return ("invalid non-CA certificate (has CA markings)");
|
||||
case X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED:
|
||||
return ("proxy path length constraint exceeded");
|
||||
case X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE:
|
||||
return ("key usage does not include digital signature");
|
||||
case X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED:
|
||||
return
|
||||
("proxy certificates not allowed, please set the appropriate flag");
|
||||
case X509_V_ERR_INVALID_EXTENSION:
|
||||
return ("invalid or inconsistent certificate extension");
|
||||
case X509_V_ERR_INVALID_POLICY_EXTENSION:
|
||||
@@ -168,13 +117,14 @@ const char *X509_verify_cert_error_string(long n)
|
||||
return ("Unsupported extension feature");
|
||||
case X509_V_ERR_UNNESTED_RESOURCE:
|
||||
return ("RFC 3779 resource not subset of parent's resources");
|
||||
|
||||
case X509_V_ERR_PERMITTED_VIOLATION:
|
||||
return ("permitted subtree violation");
|
||||
case X509_V_ERR_EXCLUDED_VIOLATION:
|
||||
return ("excluded subtree violation");
|
||||
case X509_V_ERR_SUBTREE_MINMAX:
|
||||
return ("name constraints minimum and maximum not supported");
|
||||
case X509_V_ERR_APPLICATION_VERIFICATION:
|
||||
return ("application verification failure");
|
||||
case X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE:
|
||||
return ("unsupported name constraint type");
|
||||
case X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX:
|
||||
@@ -183,7 +133,8 @@ const char *X509_verify_cert_error_string(long n)
|
||||
return ("unsupported or invalid name syntax");
|
||||
case X509_V_ERR_CRL_PATH_VALIDATION_ERROR:
|
||||
return ("CRL path validation error");
|
||||
|
||||
case X509_V_ERR_PATH_LOOP:
|
||||
return ("Path Loop");
|
||||
case X509_V_ERR_SUITE_B_INVALID_VERSION:
|
||||
return ("Suite B: certificate version invalid");
|
||||
case X509_V_ERR_SUITE_B_INVALID_ALGORITHM:
|
||||
@@ -196,16 +147,31 @@ const char *X509_verify_cert_error_string(long n)
|
||||
return ("Suite B: curve not allowed for this LOS");
|
||||
case X509_V_ERR_SUITE_B_CANNOT_SIGN_P_384_WITH_P_256:
|
||||
return ("Suite B: cannot sign P-384 with P-256");
|
||||
|
||||
case X509_V_ERR_HOSTNAME_MISMATCH:
|
||||
return ("Hostname mismatch");
|
||||
case X509_V_ERR_EMAIL_MISMATCH:
|
||||
return ("Email address mismatch");
|
||||
case X509_V_ERR_IP_ADDRESS_MISMATCH:
|
||||
return ("IP address mismatch");
|
||||
case X509_V_ERR_DANE_NO_MATCH:
|
||||
return ("No matching DANE TLSA records");
|
||||
case X509_V_ERR_EE_KEY_TOO_SMALL:
|
||||
return ("EE certificate key too weak");
|
||||
case X509_V_ERR_CA_KEY_TOO_SMALL:
|
||||
return ("CA certificate key too weak");
|
||||
case X509_V_ERR_CA_MD_TOO_WEAK:
|
||||
return ("CA signature digest algorithm too weak");
|
||||
case X509_V_ERR_INVALID_CALL:
|
||||
return ("Invalid certificate verification context");
|
||||
case X509_V_ERR_STORE_LOOKUP:
|
||||
return ("Issuer certificate lookup error");
|
||||
case X509_V_ERR_NO_VALID_SCTS:
|
||||
return ("Certificate Transparency required, but no valid SCTs found");
|
||||
case X509_V_ERR_PROXY_SUBJECT_NAME_VIOLATION:
|
||||
return ("proxy subject name violation");
|
||||
|
||||
default:
|
||||
BIO_snprintf(buf, sizeof buf, "error number %ld", n);
|
||||
return (buf);
|
||||
/* Printing an error number into a static buffer is not thread-safe */
|
||||
return ("unknown certificate verification error");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,69 +1,21 @@
|
||||
/* crypto/x509/x509_v3.c */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
/*
|
||||
* Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
* 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/stack.h>
|
||||
#include "cryptlib.h"
|
||||
#include "internal/cryptlib.h"
|
||||
#include <openssl/asn1.h>
|
||||
#include <openssl/objects.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/x509.h>
|
||||
#include <openssl/x509v3.h>
|
||||
#include "x509_lcl.h"
|
||||
|
||||
int X509v3_get_ext_count(const STACK_OF(X509_EXTENSION) *x)
|
||||
{
|
||||
@@ -84,7 +36,7 @@ int X509v3_get_ext_by_NID(const STACK_OF(X509_EXTENSION) *x, int nid,
|
||||
}
|
||||
|
||||
int X509v3_get_ext_by_OBJ(const STACK_OF(X509_EXTENSION) *sk,
|
||||
ASN1_OBJECT *obj, int lastpos)
|
||||
const ASN1_OBJECT *obj, int lastpos)
|
||||
{
|
||||
int n;
|
||||
X509_EXTENSION *ex;
|
||||
@@ -175,10 +127,8 @@ STACK_OF(X509_EXTENSION) *X509v3_add_ext(STACK_OF(X509_EXTENSION) **x,
|
||||
err:
|
||||
X509err(X509_F_X509V3_ADD_EXT, ERR_R_MALLOC_FAILURE);
|
||||
err2:
|
||||
if (new_ex != NULL)
|
||||
X509_EXTENSION_free(new_ex);
|
||||
if (sk != NULL)
|
||||
sk_X509_EXTENSION_free(sk);
|
||||
X509_EXTENSION_free(new_ex);
|
||||
sk_X509_EXTENSION_free(sk);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -201,7 +151,7 @@ X509_EXTENSION *X509_EXTENSION_create_by_NID(X509_EXTENSION **ex, int nid,
|
||||
}
|
||||
|
||||
X509_EXTENSION *X509_EXTENSION_create_by_OBJ(X509_EXTENSION **ex,
|
||||
ASN1_OBJECT *obj, int crit,
|
||||
const ASN1_OBJECT *obj, int crit,
|
||||
ASN1_OCTET_STRING *data)
|
||||
{
|
||||
X509_EXTENSION *ret;
|
||||
@@ -231,13 +181,13 @@ X509_EXTENSION *X509_EXTENSION_create_by_OBJ(X509_EXTENSION **ex,
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
int X509_EXTENSION_set_object(X509_EXTENSION *ex, ASN1_OBJECT *obj)
|
||||
int X509_EXTENSION_set_object(X509_EXTENSION *ex, const ASN1_OBJECT *obj)
|
||||
{
|
||||
if ((ex == NULL) || (obj == NULL))
|
||||
return (0);
|
||||
ASN1_OBJECT_free(ex->object);
|
||||
ex->object = OBJ_dup(obj);
|
||||
return (1);
|
||||
return ex->object != NULL;
|
||||
}
|
||||
|
||||
int X509_EXTENSION_set_critical(X509_EXTENSION *ex, int crit)
|
||||
@@ -254,7 +204,7 @@ int X509_EXTENSION_set_data(X509_EXTENSION *ex, ASN1_OCTET_STRING *data)
|
||||
|
||||
if (ex == NULL)
|
||||
return (0);
|
||||
i = M_ASN1_OCTET_STRING_set(ex->value, data->data, data->length);
|
||||
i = ASN1_OCTET_STRING_set(&ex->value, data->data, data->length);
|
||||
if (!i)
|
||||
return (0);
|
||||
return (1);
|
||||
@@ -271,10 +221,10 @@ ASN1_OCTET_STRING *X509_EXTENSION_get_data(X509_EXTENSION *ex)
|
||||
{
|
||||
if (ex == NULL)
|
||||
return (NULL);
|
||||
return (ex->value);
|
||||
return &ex->value;
|
||||
}
|
||||
|
||||
int X509_EXTENSION_get_critical(X509_EXTENSION *ex)
|
||||
int X509_EXTENSION_get_critical(const X509_EXTENSION *ex)
|
||||
{
|
||||
if (ex == NULL)
|
||||
return (0);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,647 +0,0 @@
|
||||
/* crypto/x509/x509_vfy.h */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
#ifndef HEADER_X509_H
|
||||
# include <openssl/x509.h>
|
||||
/*
|
||||
* openssl/x509.h ends up #include-ing this file at about the only
|
||||
* appropriate moment.
|
||||
*/
|
||||
#endif
|
||||
|
||||
#ifndef HEADER_X509_VFY_H
|
||||
# define HEADER_X509_VFY_H
|
||||
|
||||
# include <openssl/opensslconf.h>
|
||||
# ifndef OPENSSL_NO_LHASH
|
||||
# include <openssl/lhash.h>
|
||||
# endif
|
||||
# include <openssl/bio.h>
|
||||
# include <openssl/crypto.h>
|
||||
# include <openssl/symhacks.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
# if 0
|
||||
/* Outer object */
|
||||
typedef struct x509_hash_dir_st {
|
||||
int num_dirs;
|
||||
char **dirs;
|
||||
int *dirs_type;
|
||||
int num_dirs_alloced;
|
||||
} X509_HASH_DIR_CTX;
|
||||
# endif
|
||||
|
||||
typedef struct x509_file_st {
|
||||
int num_paths; /* number of paths to files or directories */
|
||||
int num_alloced;
|
||||
char **paths; /* the list of paths or directories */
|
||||
int *path_type;
|
||||
} X509_CERT_FILE_CTX;
|
||||
|
||||
/*******************************/
|
||||
/*-
|
||||
SSL_CTX -> X509_STORE
|
||||
-> X509_LOOKUP
|
||||
->X509_LOOKUP_METHOD
|
||||
-> X509_LOOKUP
|
||||
->X509_LOOKUP_METHOD
|
||||
|
||||
SSL -> X509_STORE_CTX
|
||||
->X509_STORE
|
||||
|
||||
The X509_STORE holds the tables etc for verification stuff.
|
||||
A X509_STORE_CTX is used while validating a single certificate.
|
||||
The X509_STORE has X509_LOOKUPs for looking up certs.
|
||||
The X509_STORE then calls a function to actually verify the
|
||||
certificate chain.
|
||||
*/
|
||||
|
||||
# define X509_LU_RETRY -1
|
||||
# define X509_LU_FAIL 0
|
||||
# define X509_LU_X509 1
|
||||
# define X509_LU_CRL 2
|
||||
# define X509_LU_PKEY 3
|
||||
|
||||
typedef struct x509_object_st {
|
||||
/* one of the above types */
|
||||
int type;
|
||||
union {
|
||||
char *ptr;
|
||||
X509 *x509;
|
||||
X509_CRL *crl;
|
||||
EVP_PKEY *pkey;
|
||||
} data;
|
||||
} X509_OBJECT;
|
||||
|
||||
typedef struct x509_lookup_st X509_LOOKUP;
|
||||
|
||||
DECLARE_STACK_OF(X509_LOOKUP)
|
||||
DECLARE_STACK_OF(X509_OBJECT)
|
||||
|
||||
/* This is a static that defines the function interface */
|
||||
typedef struct x509_lookup_method_st {
|
||||
const char *name;
|
||||
int (*new_item) (X509_LOOKUP *ctx);
|
||||
void (*free) (X509_LOOKUP *ctx);
|
||||
int (*init) (X509_LOOKUP *ctx);
|
||||
int (*shutdown) (X509_LOOKUP *ctx);
|
||||
int (*ctrl) (X509_LOOKUP *ctx, int cmd, const char *argc, long argl,
|
||||
char **ret);
|
||||
int (*get_by_subject) (X509_LOOKUP *ctx, int type, X509_NAME *name,
|
||||
X509_OBJECT *ret);
|
||||
int (*get_by_issuer_serial) (X509_LOOKUP *ctx, int type, X509_NAME *name,
|
||||
ASN1_INTEGER *serial, X509_OBJECT *ret);
|
||||
int (*get_by_fingerprint) (X509_LOOKUP *ctx, int type,
|
||||
unsigned char *bytes, int len,
|
||||
X509_OBJECT *ret);
|
||||
int (*get_by_alias) (X509_LOOKUP *ctx, int type, char *str, int len,
|
||||
X509_OBJECT *ret);
|
||||
} X509_LOOKUP_METHOD;
|
||||
|
||||
typedef struct X509_VERIFY_PARAM_ID_st X509_VERIFY_PARAM_ID;
|
||||
|
||||
/*
|
||||
* This structure hold all parameters associated with a verify operation by
|
||||
* including an X509_VERIFY_PARAM structure in related structures the
|
||||
* parameters used can be customized
|
||||
*/
|
||||
|
||||
typedef struct X509_VERIFY_PARAM_st {
|
||||
char *name;
|
||||
time_t check_time; /* Time to use */
|
||||
unsigned long inh_flags; /* Inheritance flags */
|
||||
unsigned long flags; /* Various verify flags */
|
||||
int purpose; /* purpose to check untrusted certificates */
|
||||
int trust; /* trust setting to check */
|
||||
int depth; /* Verify depth */
|
||||
STACK_OF(ASN1_OBJECT) *policies; /* Permissible policies */
|
||||
X509_VERIFY_PARAM_ID *id; /* opaque ID data */
|
||||
} X509_VERIFY_PARAM;
|
||||
|
||||
DECLARE_STACK_OF(X509_VERIFY_PARAM)
|
||||
|
||||
/*
|
||||
* This is used to hold everything. It is used for all certificate
|
||||
* validation. Once we have a certificate chain, the 'verify' function is
|
||||
* then called to actually check the cert chain.
|
||||
*/
|
||||
struct x509_store_st {
|
||||
/* The following is a cache of trusted certs */
|
||||
int cache; /* if true, stash any hits */
|
||||
STACK_OF(X509_OBJECT) *objs; /* Cache of all objects */
|
||||
/* These are external lookup methods */
|
||||
STACK_OF(X509_LOOKUP) *get_cert_methods;
|
||||
X509_VERIFY_PARAM *param;
|
||||
/* Callbacks for various operations */
|
||||
/* called to verify a certificate */
|
||||
int (*verify) (X509_STORE_CTX *ctx);
|
||||
/* error callback */
|
||||
int (*verify_cb) (int ok, X509_STORE_CTX *ctx);
|
||||
/* get issuers cert from ctx */
|
||||
int (*get_issuer) (X509 **issuer, X509_STORE_CTX *ctx, X509 *x);
|
||||
/* check issued */
|
||||
int (*check_issued) (X509_STORE_CTX *ctx, X509 *x, X509 *issuer);
|
||||
/* Check revocation status of chain */
|
||||
int (*check_revocation) (X509_STORE_CTX *ctx);
|
||||
/* retrieve CRL */
|
||||
int (*get_crl) (X509_STORE_CTX *ctx, X509_CRL **crl, X509 *x);
|
||||
/* Check CRL validity */
|
||||
int (*check_crl) (X509_STORE_CTX *ctx, X509_CRL *crl);
|
||||
/* Check certificate against CRL */
|
||||
int (*cert_crl) (X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x);
|
||||
STACK_OF(X509) *(*lookup_certs) (X509_STORE_CTX *ctx, X509_NAME *nm);
|
||||
STACK_OF(X509_CRL) *(*lookup_crls) (X509_STORE_CTX *ctx, X509_NAME *nm);
|
||||
int (*cleanup) (X509_STORE_CTX *ctx);
|
||||
CRYPTO_EX_DATA ex_data;
|
||||
int references;
|
||||
} /* X509_STORE */ ;
|
||||
|
||||
int X509_STORE_set_depth(X509_STORE *store, int depth);
|
||||
|
||||
# define X509_STORE_set_verify_cb_func(ctx,func) ((ctx)->verify_cb=(func))
|
||||
# define X509_STORE_set_verify_func(ctx,func) ((ctx)->verify=(func))
|
||||
|
||||
/* This is the functions plus an instance of the local variables. */
|
||||
struct x509_lookup_st {
|
||||
int init; /* have we been started */
|
||||
int skip; /* don't use us. */
|
||||
X509_LOOKUP_METHOD *method; /* the functions */
|
||||
char *method_data; /* method data */
|
||||
X509_STORE *store_ctx; /* who owns us */
|
||||
} /* X509_LOOKUP */ ;
|
||||
|
||||
/*
|
||||
* This is a used when verifying cert chains. Since the gathering of the
|
||||
* cert chain can take some time (and have to be 'retried', this needs to be
|
||||
* kept and passed around.
|
||||
*/
|
||||
struct x509_store_ctx_st { /* X509_STORE_CTX */
|
||||
X509_STORE *ctx;
|
||||
/* used when looking up certs */
|
||||
int current_method;
|
||||
/* The following are set by the caller */
|
||||
/* The cert to check */
|
||||
X509 *cert;
|
||||
/* chain of X509s - untrusted - passed in */
|
||||
STACK_OF(X509) *untrusted;
|
||||
/* set of CRLs passed in */
|
||||
STACK_OF(X509_CRL) *crls;
|
||||
X509_VERIFY_PARAM *param;
|
||||
/* Other info for use with get_issuer() */
|
||||
void *other_ctx;
|
||||
/* Callbacks for various operations */
|
||||
/* called to verify a certificate */
|
||||
int (*verify) (X509_STORE_CTX *ctx);
|
||||
/* error callback */
|
||||
int (*verify_cb) (int ok, X509_STORE_CTX *ctx);
|
||||
/* get issuers cert from ctx */
|
||||
int (*get_issuer) (X509 **issuer, X509_STORE_CTX *ctx, X509 *x);
|
||||
/* check issued */
|
||||
int (*check_issued) (X509_STORE_CTX *ctx, X509 *x, X509 *issuer);
|
||||
/* Check revocation status of chain */
|
||||
int (*check_revocation) (X509_STORE_CTX *ctx);
|
||||
/* retrieve CRL */
|
||||
int (*get_crl) (X509_STORE_CTX *ctx, X509_CRL **crl, X509 *x);
|
||||
/* Check CRL validity */
|
||||
int (*check_crl) (X509_STORE_CTX *ctx, X509_CRL *crl);
|
||||
/* Check certificate against CRL */
|
||||
int (*cert_crl) (X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x);
|
||||
int (*check_policy) (X509_STORE_CTX *ctx);
|
||||
STACK_OF(X509) *(*lookup_certs) (X509_STORE_CTX *ctx, X509_NAME *nm);
|
||||
STACK_OF(X509_CRL) *(*lookup_crls) (X509_STORE_CTX *ctx, X509_NAME *nm);
|
||||
int (*cleanup) (X509_STORE_CTX *ctx);
|
||||
/* The following is built up */
|
||||
/* if 0, rebuild chain */
|
||||
int valid;
|
||||
/* index of last untrusted cert */
|
||||
int last_untrusted;
|
||||
/* chain of X509s - built up and trusted */
|
||||
STACK_OF(X509) *chain;
|
||||
/* Valid policy tree */
|
||||
X509_POLICY_TREE *tree;
|
||||
/* Require explicit policy value */
|
||||
int explicit_policy;
|
||||
/* When something goes wrong, this is why */
|
||||
int error_depth;
|
||||
int error;
|
||||
X509 *current_cert;
|
||||
/* cert currently being tested as valid issuer */
|
||||
X509 *current_issuer;
|
||||
/* current CRL */
|
||||
X509_CRL *current_crl;
|
||||
/* score of current CRL */
|
||||
int current_crl_score;
|
||||
/* Reason mask */
|
||||
unsigned int current_reasons;
|
||||
/* For CRL path validation: parent context */
|
||||
X509_STORE_CTX *parent;
|
||||
CRYPTO_EX_DATA ex_data;
|
||||
} /* X509_STORE_CTX */ ;
|
||||
|
||||
void X509_STORE_CTX_set_depth(X509_STORE_CTX *ctx, int depth);
|
||||
|
||||
# define X509_STORE_CTX_set_app_data(ctx,data) \
|
||||
X509_STORE_CTX_set_ex_data(ctx,0,data)
|
||||
# define X509_STORE_CTX_get_app_data(ctx) \
|
||||
X509_STORE_CTX_get_ex_data(ctx,0)
|
||||
|
||||
# define X509_L_FILE_LOAD 1
|
||||
# define X509_L_ADD_DIR 2
|
||||
|
||||
# define X509_LOOKUP_load_file(x,name,type) \
|
||||
X509_LOOKUP_ctrl((x),X509_L_FILE_LOAD,(name),(long)(type),NULL)
|
||||
|
||||
# define X509_LOOKUP_add_dir(x,name,type) \
|
||||
X509_LOOKUP_ctrl((x),X509_L_ADD_DIR,(name),(long)(type),NULL)
|
||||
|
||||
# define X509_V_OK 0
|
||||
/* illegal error (for uninitialized values, to avoid X509_V_OK): 1 */
|
||||
|
||||
# define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT 2
|
||||
# define X509_V_ERR_UNABLE_TO_GET_CRL 3
|
||||
# define X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE 4
|
||||
# define X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE 5
|
||||
# define X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY 6
|
||||
# define X509_V_ERR_CERT_SIGNATURE_FAILURE 7
|
||||
# define X509_V_ERR_CRL_SIGNATURE_FAILURE 8
|
||||
# define X509_V_ERR_CERT_NOT_YET_VALID 9
|
||||
# define X509_V_ERR_CERT_HAS_EXPIRED 10
|
||||
# define X509_V_ERR_CRL_NOT_YET_VALID 11
|
||||
# define X509_V_ERR_CRL_HAS_EXPIRED 12
|
||||
# define X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD 13
|
||||
# define X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD 14
|
||||
# define X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD 15
|
||||
# define X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD 16
|
||||
# define X509_V_ERR_OUT_OF_MEM 17
|
||||
# define X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT 18
|
||||
# define X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN 19
|
||||
# define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY 20
|
||||
# define X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE 21
|
||||
# define X509_V_ERR_CERT_CHAIN_TOO_LONG 22
|
||||
# define X509_V_ERR_CERT_REVOKED 23
|
||||
# define X509_V_ERR_INVALID_CA 24
|
||||
# define X509_V_ERR_PATH_LENGTH_EXCEEDED 25
|
||||
# define X509_V_ERR_INVALID_PURPOSE 26
|
||||
# define X509_V_ERR_CERT_UNTRUSTED 27
|
||||
# define X509_V_ERR_CERT_REJECTED 28
|
||||
/* These are 'informational' when looking for issuer cert */
|
||||
# define X509_V_ERR_SUBJECT_ISSUER_MISMATCH 29
|
||||
# define X509_V_ERR_AKID_SKID_MISMATCH 30
|
||||
# define X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH 31
|
||||
# define X509_V_ERR_KEYUSAGE_NO_CERTSIGN 32
|
||||
|
||||
# define X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER 33
|
||||
# define X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION 34
|
||||
# define X509_V_ERR_KEYUSAGE_NO_CRL_SIGN 35
|
||||
# define X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION 36
|
||||
# define X509_V_ERR_INVALID_NON_CA 37
|
||||
# define X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED 38
|
||||
# define X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE 39
|
||||
# define X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED 40
|
||||
|
||||
# define X509_V_ERR_INVALID_EXTENSION 41
|
||||
# define X509_V_ERR_INVALID_POLICY_EXTENSION 42
|
||||
# define X509_V_ERR_NO_EXPLICIT_POLICY 43
|
||||
# define X509_V_ERR_DIFFERENT_CRL_SCOPE 44
|
||||
# define X509_V_ERR_UNSUPPORTED_EXTENSION_FEATURE 45
|
||||
|
||||
# define X509_V_ERR_UNNESTED_RESOURCE 46
|
||||
|
||||
# define X509_V_ERR_PERMITTED_VIOLATION 47
|
||||
# define X509_V_ERR_EXCLUDED_VIOLATION 48
|
||||
# define X509_V_ERR_SUBTREE_MINMAX 49
|
||||
# define X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE 51
|
||||
# define X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX 52
|
||||
# define X509_V_ERR_UNSUPPORTED_NAME_SYNTAX 53
|
||||
# define X509_V_ERR_CRL_PATH_VALIDATION_ERROR 54
|
||||
|
||||
/* Suite B mode algorithm violation */
|
||||
# define X509_V_ERR_SUITE_B_INVALID_VERSION 56
|
||||
# define X509_V_ERR_SUITE_B_INVALID_ALGORITHM 57
|
||||
# define X509_V_ERR_SUITE_B_INVALID_CURVE 58
|
||||
# define X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM 59
|
||||
# define X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED 60
|
||||
# define X509_V_ERR_SUITE_B_CANNOT_SIGN_P_384_WITH_P_256 61
|
||||
|
||||
/* Host, email and IP check errors */
|
||||
# define X509_V_ERR_HOSTNAME_MISMATCH 62
|
||||
# define X509_V_ERR_EMAIL_MISMATCH 63
|
||||
# define X509_V_ERR_IP_ADDRESS_MISMATCH 64
|
||||
|
||||
/* The application is not happy */
|
||||
# define X509_V_ERR_APPLICATION_VERIFICATION 50
|
||||
|
||||
/* Certificate verify flags */
|
||||
|
||||
/* Send issuer+subject checks to verify_cb */
|
||||
# define X509_V_FLAG_CB_ISSUER_CHECK 0x1
|
||||
/* Use check time instead of current time */
|
||||
# define X509_V_FLAG_USE_CHECK_TIME 0x2
|
||||
/* Lookup CRLs */
|
||||
# define X509_V_FLAG_CRL_CHECK 0x4
|
||||
/* Lookup CRLs for whole chain */
|
||||
# define X509_V_FLAG_CRL_CHECK_ALL 0x8
|
||||
/* Ignore unhandled critical extensions */
|
||||
# define X509_V_FLAG_IGNORE_CRITICAL 0x10
|
||||
/* Disable workarounds for broken certificates */
|
||||
# define X509_V_FLAG_X509_STRICT 0x20
|
||||
/* Enable proxy certificate validation */
|
||||
# define X509_V_FLAG_ALLOW_PROXY_CERTS 0x40
|
||||
/* Enable policy checking */
|
||||
# define X509_V_FLAG_POLICY_CHECK 0x80
|
||||
/* Policy variable require-explicit-policy */
|
||||
# define X509_V_FLAG_EXPLICIT_POLICY 0x100
|
||||
/* Policy variable inhibit-any-policy */
|
||||
# define X509_V_FLAG_INHIBIT_ANY 0x200
|
||||
/* Policy variable inhibit-policy-mapping */
|
||||
# define X509_V_FLAG_INHIBIT_MAP 0x400
|
||||
/* Notify callback that policy is OK */
|
||||
# define X509_V_FLAG_NOTIFY_POLICY 0x800
|
||||
/* Extended CRL features such as indirect CRLs, alternate CRL signing keys */
|
||||
# define X509_V_FLAG_EXTENDED_CRL_SUPPORT 0x1000
|
||||
/* Delta CRL support */
|
||||
# define X509_V_FLAG_USE_DELTAS 0x2000
|
||||
/* Check selfsigned CA signature */
|
||||
# define X509_V_FLAG_CHECK_SS_SIGNATURE 0x4000
|
||||
/* Use trusted store first */
|
||||
# define X509_V_FLAG_TRUSTED_FIRST 0x8000
|
||||
/* Suite B 128 bit only mode: not normally used */
|
||||
# define X509_V_FLAG_SUITEB_128_LOS_ONLY 0x10000
|
||||
/* Suite B 192 bit only mode */
|
||||
# define X509_V_FLAG_SUITEB_192_LOS 0x20000
|
||||
/* Suite B 128 bit mode allowing 192 bit algorithms */
|
||||
# define X509_V_FLAG_SUITEB_128_LOS 0x30000
|
||||
|
||||
/* Allow partial chains if at least one certificate is in trusted store */
|
||||
# define X509_V_FLAG_PARTIAL_CHAIN 0x80000
|
||||
/*
|
||||
* If the initial chain is not trusted, do not attempt to build an alternative
|
||||
* chain. Alternate chain checking was introduced in 1.0.2b. Setting this flag
|
||||
* will force the behaviour to match that of previous versions.
|
||||
*/
|
||||
# define X509_V_FLAG_NO_ALT_CHAINS 0x100000
|
||||
|
||||
# define X509_VP_FLAG_DEFAULT 0x1
|
||||
# define X509_VP_FLAG_OVERWRITE 0x2
|
||||
# define X509_VP_FLAG_RESET_FLAGS 0x4
|
||||
# define X509_VP_FLAG_LOCKED 0x8
|
||||
# define X509_VP_FLAG_ONCE 0x10
|
||||
|
||||
/* Internal use: mask of policy related options */
|
||||
# define X509_V_FLAG_POLICY_MASK (X509_V_FLAG_POLICY_CHECK \
|
||||
| X509_V_FLAG_EXPLICIT_POLICY \
|
||||
| X509_V_FLAG_INHIBIT_ANY \
|
||||
| X509_V_FLAG_INHIBIT_MAP)
|
||||
|
||||
int X509_OBJECT_idx_by_subject(STACK_OF(X509_OBJECT) *h, int type,
|
||||
X509_NAME *name);
|
||||
X509_OBJECT *X509_OBJECT_retrieve_by_subject(STACK_OF(X509_OBJECT) *h,
|
||||
int type, X509_NAME *name);
|
||||
X509_OBJECT *X509_OBJECT_retrieve_match(STACK_OF(X509_OBJECT) *h,
|
||||
X509_OBJECT *x);
|
||||
void X509_OBJECT_up_ref_count(X509_OBJECT *a);
|
||||
void X509_OBJECT_free_contents(X509_OBJECT *a);
|
||||
X509_STORE *X509_STORE_new(void);
|
||||
void X509_STORE_free(X509_STORE *v);
|
||||
|
||||
STACK_OF(X509) *X509_STORE_get1_certs(X509_STORE_CTX *st, X509_NAME *nm);
|
||||
STACK_OF(X509_CRL) *X509_STORE_get1_crls(X509_STORE_CTX *st, X509_NAME *nm);
|
||||
int X509_STORE_set_flags(X509_STORE *ctx, unsigned long flags);
|
||||
int X509_STORE_set_purpose(X509_STORE *ctx, int purpose);
|
||||
int X509_STORE_set_trust(X509_STORE *ctx, int trust);
|
||||
int X509_STORE_set1_param(X509_STORE *ctx, X509_VERIFY_PARAM *pm);
|
||||
|
||||
void X509_STORE_set_verify_cb(X509_STORE *ctx,
|
||||
int (*verify_cb) (int, X509_STORE_CTX *));
|
||||
|
||||
void X509_STORE_set_lookup_crls_cb(X509_STORE *ctx,
|
||||
STACK_OF(X509_CRL) *(*cb) (X509_STORE_CTX
|
||||
*ctx,
|
||||
X509_NAME *nm));
|
||||
|
||||
X509_STORE_CTX *X509_STORE_CTX_new(void);
|
||||
|
||||
int X509_STORE_CTX_get1_issuer(X509 **issuer, X509_STORE_CTX *ctx, X509 *x);
|
||||
|
||||
void X509_STORE_CTX_free(X509_STORE_CTX *ctx);
|
||||
int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store,
|
||||
X509 *x509, STACK_OF(X509) *chain);
|
||||
void X509_STORE_CTX_trusted_stack(X509_STORE_CTX *ctx, STACK_OF(X509) *sk);
|
||||
void X509_STORE_CTX_cleanup(X509_STORE_CTX *ctx);
|
||||
|
||||
X509_STORE *X509_STORE_CTX_get0_store(X509_STORE_CTX *ctx);
|
||||
|
||||
X509_LOOKUP *X509_STORE_add_lookup(X509_STORE *v, X509_LOOKUP_METHOD *m);
|
||||
|
||||
X509_LOOKUP_METHOD *X509_LOOKUP_hash_dir(void);
|
||||
X509_LOOKUP_METHOD *X509_LOOKUP_file(void);
|
||||
|
||||
int X509_STORE_add_cert(X509_STORE *ctx, X509 *x);
|
||||
int X509_STORE_add_crl(X509_STORE *ctx, X509_CRL *x);
|
||||
|
||||
int X509_STORE_get_by_subject(X509_STORE_CTX *vs, int type, X509_NAME *name,
|
||||
X509_OBJECT *ret);
|
||||
|
||||
int X509_LOOKUP_ctrl(X509_LOOKUP *ctx, int cmd, const char *argc,
|
||||
long argl, char **ret);
|
||||
|
||||
# ifndef OPENSSL_NO_STDIO
|
||||
int X509_load_cert_file(X509_LOOKUP *ctx, const char *file, int type);
|
||||
int X509_load_crl_file(X509_LOOKUP *ctx, const char *file, int type);
|
||||
int X509_load_cert_crl_file(X509_LOOKUP *ctx, const char *file, int type);
|
||||
# endif
|
||||
|
||||
X509_LOOKUP *X509_LOOKUP_new(X509_LOOKUP_METHOD *method);
|
||||
void X509_LOOKUP_free(X509_LOOKUP *ctx);
|
||||
int X509_LOOKUP_init(X509_LOOKUP *ctx);
|
||||
int X509_LOOKUP_by_subject(X509_LOOKUP *ctx, int type, X509_NAME *name,
|
||||
X509_OBJECT *ret);
|
||||
int X509_LOOKUP_by_issuer_serial(X509_LOOKUP *ctx, int type, X509_NAME *name,
|
||||
ASN1_INTEGER *serial, X509_OBJECT *ret);
|
||||
int X509_LOOKUP_by_fingerprint(X509_LOOKUP *ctx, int type,
|
||||
unsigned char *bytes, int len,
|
||||
X509_OBJECT *ret);
|
||||
int X509_LOOKUP_by_alias(X509_LOOKUP *ctx, int type, char *str, int len,
|
||||
X509_OBJECT *ret);
|
||||
int X509_LOOKUP_shutdown(X509_LOOKUP *ctx);
|
||||
|
||||
# ifndef OPENSSL_NO_STDIO
|
||||
int X509_STORE_load_locations(X509_STORE *ctx,
|
||||
const char *file, const char *dir);
|
||||
int X509_STORE_set_default_paths(X509_STORE *ctx);
|
||||
# endif
|
||||
|
||||
int X509_STORE_CTX_get_ex_new_index(long argl, void *argp,
|
||||
CRYPTO_EX_new *new_func,
|
||||
CRYPTO_EX_dup *dup_func,
|
||||
CRYPTO_EX_free *free_func);
|
||||
int X509_STORE_CTX_set_ex_data(X509_STORE_CTX *ctx, int idx, void *data);
|
||||
void *X509_STORE_CTX_get_ex_data(X509_STORE_CTX *ctx, int idx);
|
||||
int X509_STORE_CTX_get_error(X509_STORE_CTX *ctx);
|
||||
void X509_STORE_CTX_set_error(X509_STORE_CTX *ctx, int s);
|
||||
int X509_STORE_CTX_get_error_depth(X509_STORE_CTX *ctx);
|
||||
X509 *X509_STORE_CTX_get_current_cert(X509_STORE_CTX *ctx);
|
||||
X509 *X509_STORE_CTX_get0_current_issuer(X509_STORE_CTX *ctx);
|
||||
X509_CRL *X509_STORE_CTX_get0_current_crl(X509_STORE_CTX *ctx);
|
||||
X509_STORE_CTX *X509_STORE_CTX_get0_parent_ctx(X509_STORE_CTX *ctx);
|
||||
STACK_OF(X509) *X509_STORE_CTX_get_chain(X509_STORE_CTX *ctx);
|
||||
STACK_OF(X509) *X509_STORE_CTX_get1_chain(X509_STORE_CTX *ctx);
|
||||
void X509_STORE_CTX_set_cert(X509_STORE_CTX *c, X509 *x);
|
||||
void X509_STORE_CTX_set_chain(X509_STORE_CTX *c, STACK_OF(X509) *sk);
|
||||
void X509_STORE_CTX_set0_crls(X509_STORE_CTX *c, STACK_OF(X509_CRL) *sk);
|
||||
int X509_STORE_CTX_set_purpose(X509_STORE_CTX *ctx, int purpose);
|
||||
int X509_STORE_CTX_set_trust(X509_STORE_CTX *ctx, int trust);
|
||||
int X509_STORE_CTX_purpose_inherit(X509_STORE_CTX *ctx, int def_purpose,
|
||||
int purpose, int trust);
|
||||
void X509_STORE_CTX_set_flags(X509_STORE_CTX *ctx, unsigned long flags);
|
||||
void X509_STORE_CTX_set_time(X509_STORE_CTX *ctx, unsigned long flags,
|
||||
time_t t);
|
||||
void X509_STORE_CTX_set_verify_cb(X509_STORE_CTX *ctx,
|
||||
int (*verify_cb) (int, X509_STORE_CTX *));
|
||||
|
||||
X509_POLICY_TREE *X509_STORE_CTX_get0_policy_tree(X509_STORE_CTX *ctx);
|
||||
int X509_STORE_CTX_get_explicit_policy(X509_STORE_CTX *ctx);
|
||||
|
||||
X509_VERIFY_PARAM *X509_STORE_CTX_get0_param(X509_STORE_CTX *ctx);
|
||||
void X509_STORE_CTX_set0_param(X509_STORE_CTX *ctx, X509_VERIFY_PARAM *param);
|
||||
int X509_STORE_CTX_set_default(X509_STORE_CTX *ctx, const char *name);
|
||||
|
||||
/* X509_VERIFY_PARAM functions */
|
||||
|
||||
X509_VERIFY_PARAM *X509_VERIFY_PARAM_new(void);
|
||||
void X509_VERIFY_PARAM_free(X509_VERIFY_PARAM *param);
|
||||
int X509_VERIFY_PARAM_inherit(X509_VERIFY_PARAM *to,
|
||||
const X509_VERIFY_PARAM *from);
|
||||
int X509_VERIFY_PARAM_set1(X509_VERIFY_PARAM *to,
|
||||
const X509_VERIFY_PARAM *from);
|
||||
int X509_VERIFY_PARAM_set1_name(X509_VERIFY_PARAM *param, const char *name);
|
||||
int X509_VERIFY_PARAM_set_flags(X509_VERIFY_PARAM *param,
|
||||
unsigned long flags);
|
||||
int X509_VERIFY_PARAM_clear_flags(X509_VERIFY_PARAM *param,
|
||||
unsigned long flags);
|
||||
unsigned long X509_VERIFY_PARAM_get_flags(X509_VERIFY_PARAM *param);
|
||||
int X509_VERIFY_PARAM_set_purpose(X509_VERIFY_PARAM *param, int purpose);
|
||||
int X509_VERIFY_PARAM_set_trust(X509_VERIFY_PARAM *param, int trust);
|
||||
void X509_VERIFY_PARAM_set_depth(X509_VERIFY_PARAM *param, int depth);
|
||||
void X509_VERIFY_PARAM_set_time(X509_VERIFY_PARAM *param, time_t t);
|
||||
int X509_VERIFY_PARAM_add0_policy(X509_VERIFY_PARAM *param,
|
||||
ASN1_OBJECT *policy);
|
||||
int X509_VERIFY_PARAM_set1_policies(X509_VERIFY_PARAM *param,
|
||||
STACK_OF(ASN1_OBJECT) *policies);
|
||||
|
||||
int X509_VERIFY_PARAM_set1_host(X509_VERIFY_PARAM *param,
|
||||
const char *name, size_t namelen);
|
||||
int X509_VERIFY_PARAM_add1_host(X509_VERIFY_PARAM *param,
|
||||
const char *name, size_t namelen);
|
||||
void X509_VERIFY_PARAM_set_hostflags(X509_VERIFY_PARAM *param,
|
||||
unsigned int flags);
|
||||
char *X509_VERIFY_PARAM_get0_peername(X509_VERIFY_PARAM *);
|
||||
int X509_VERIFY_PARAM_set1_email(X509_VERIFY_PARAM *param,
|
||||
const char *email, size_t emaillen);
|
||||
int X509_VERIFY_PARAM_set1_ip(X509_VERIFY_PARAM *param,
|
||||
const unsigned char *ip, size_t iplen);
|
||||
int X509_VERIFY_PARAM_set1_ip_asc(X509_VERIFY_PARAM *param,
|
||||
const char *ipasc);
|
||||
|
||||
int X509_VERIFY_PARAM_get_depth(const X509_VERIFY_PARAM *param);
|
||||
const char *X509_VERIFY_PARAM_get0_name(const X509_VERIFY_PARAM *param);
|
||||
|
||||
int X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM *param);
|
||||
int X509_VERIFY_PARAM_get_count(void);
|
||||
const X509_VERIFY_PARAM *X509_VERIFY_PARAM_get0(int id);
|
||||
const X509_VERIFY_PARAM *X509_VERIFY_PARAM_lookup(const char *name);
|
||||
void X509_VERIFY_PARAM_table_cleanup(void);
|
||||
|
||||
int X509_policy_check(X509_POLICY_TREE **ptree, int *pexplicit_policy,
|
||||
STACK_OF(X509) *certs,
|
||||
STACK_OF(ASN1_OBJECT) *policy_oids, unsigned int flags);
|
||||
|
||||
void X509_policy_tree_free(X509_POLICY_TREE *tree);
|
||||
|
||||
int X509_policy_tree_level_count(const X509_POLICY_TREE *tree);
|
||||
X509_POLICY_LEVEL *X509_policy_tree_get0_level(const X509_POLICY_TREE *tree,
|
||||
int i);
|
||||
|
||||
STACK_OF(X509_POLICY_NODE) *X509_policy_tree_get0_policies(const
|
||||
X509_POLICY_TREE
|
||||
*tree);
|
||||
|
||||
STACK_OF(X509_POLICY_NODE) *X509_policy_tree_get0_user_policies(const
|
||||
X509_POLICY_TREE
|
||||
*tree);
|
||||
|
||||
int X509_policy_level_node_count(X509_POLICY_LEVEL *level);
|
||||
|
||||
X509_POLICY_NODE *X509_policy_level_get0_node(X509_POLICY_LEVEL *level,
|
||||
int i);
|
||||
|
||||
const ASN1_OBJECT *X509_policy_node_get0_policy(const X509_POLICY_NODE *node);
|
||||
|
||||
STACK_OF(POLICYQUALINFO) *X509_policy_node_get0_qualifiers(const
|
||||
X509_POLICY_NODE
|
||||
*node);
|
||||
const X509_POLICY_NODE *X509_policy_node_get0_parent(const X509_POLICY_NODE
|
||||
*node);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
@@ -1,72 +1,23 @@
|
||||
/* x509_vpm.c */
|
||||
/*
|
||||
* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project
|
||||
* 2004.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 2004 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).
|
||||
* Copyright 2004-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 "cryptlib.h"
|
||||
#include "internal/cryptlib.h"
|
||||
#include <openssl/crypto.h>
|
||||
#include <openssl/lhash.h>
|
||||
#include <openssl/buffer.h>
|
||||
#include <openssl/x509.h>
|
||||
#include <openssl/x509v3.h>
|
||||
#include "internal/x509_int.h"
|
||||
|
||||
#include "vpm_int.h"
|
||||
#include "x509_lcl.h"
|
||||
|
||||
/* X509_VERIFY_PARAM functions */
|
||||
|
||||
@@ -83,9 +34,7 @@ static void str_free(char *s)
|
||||
OPENSSL_free(s);
|
||||
}
|
||||
|
||||
#define string_stack_free(sk) sk_OPENSSL_STRING_pop_free(sk, str_free)
|
||||
|
||||
static int int_x509_param_set_hosts(X509_VERIFY_PARAM_ID *id, int mode,
|
||||
static int int_x509_param_set_hosts(X509_VERIFY_PARAM *vpm, int mode,
|
||||
const char *name, size_t namelen)
|
||||
{
|
||||
char *copy;
|
||||
@@ -94,35 +43,35 @@ static int int_x509_param_set_hosts(X509_VERIFY_PARAM_ID *id, int mode,
|
||||
* Refuse names with embedded NUL bytes, except perhaps as final byte.
|
||||
* XXX: Do we need to push an error onto the error stack?
|
||||
*/
|
||||
if (namelen == 0)
|
||||
if (namelen == 0 || name == NULL)
|
||||
namelen = name ? strlen(name) : 0;
|
||||
else if (name && memchr(name, '\0', namelen > 1 ? namelen - 1 : namelen))
|
||||
return 0;
|
||||
if (name && name[namelen - 1] == '\0')
|
||||
if (namelen > 0 && name[namelen - 1] == '\0')
|
||||
--namelen;
|
||||
|
||||
if (mode == SET_HOST && id->hosts) {
|
||||
string_stack_free(id->hosts);
|
||||
id->hosts = NULL;
|
||||
if (mode == SET_HOST) {
|
||||
sk_OPENSSL_STRING_pop_free(vpm->hosts, str_free);
|
||||
vpm->hosts = NULL;
|
||||
}
|
||||
if (name == NULL || namelen == 0)
|
||||
return 1;
|
||||
|
||||
copy = BUF_strndup(name, namelen);
|
||||
copy = OPENSSL_strndup(name, namelen);
|
||||
if (copy == NULL)
|
||||
return 0;
|
||||
|
||||
if (id->hosts == NULL &&
|
||||
(id->hosts = sk_OPENSSL_STRING_new_null()) == NULL) {
|
||||
if (vpm->hosts == NULL &&
|
||||
(vpm->hosts = sk_OPENSSL_STRING_new_null()) == NULL) {
|
||||
OPENSSL_free(copy);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!sk_OPENSSL_STRING_push(id->hosts, copy)) {
|
||||
if (!sk_OPENSSL_STRING_push(vpm->hosts, copy)) {
|
||||
OPENSSL_free(copy);
|
||||
if (sk_OPENSSL_STRING_num(id->hosts) == 0) {
|
||||
sk_OPENSSL_STRING_free(id->hosts);
|
||||
id->hosts = NULL;
|
||||
if (sk_OPENSSL_STRING_num(vpm->hosts) == 0) {
|
||||
sk_OPENSSL_STRING_free(vpm->hosts);
|
||||
vpm->hosts = NULL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -132,68 +81,48 @@ static int int_x509_param_set_hosts(X509_VERIFY_PARAM_ID *id, int mode,
|
||||
|
||||
static void x509_verify_param_zero(X509_VERIFY_PARAM *param)
|
||||
{
|
||||
X509_VERIFY_PARAM_ID *paramid;
|
||||
if (!param)
|
||||
return;
|
||||
param->name = NULL;
|
||||
param->purpose = 0;
|
||||
param->trust = 0;
|
||||
param->trust = X509_TRUST_DEFAULT;
|
||||
/*
|
||||
* param->inh_flags = X509_VP_FLAG_DEFAULT;
|
||||
*/
|
||||
param->inh_flags = 0;
|
||||
param->flags = 0;
|
||||
param->depth = -1;
|
||||
if (param->policies) {
|
||||
sk_ASN1_OBJECT_pop_free(param->policies, ASN1_OBJECT_free);
|
||||
param->policies = NULL;
|
||||
}
|
||||
paramid = param->id;
|
||||
if (paramid->hosts) {
|
||||
string_stack_free(paramid->hosts);
|
||||
paramid->hosts = NULL;
|
||||
}
|
||||
if (paramid->peername)
|
||||
OPENSSL_free(paramid->peername);
|
||||
if (paramid->email) {
|
||||
OPENSSL_free(paramid->email);
|
||||
paramid->email = NULL;
|
||||
paramid->emaillen = 0;
|
||||
}
|
||||
if (paramid->ip) {
|
||||
OPENSSL_free(paramid->ip);
|
||||
paramid->ip = NULL;
|
||||
paramid->iplen = 0;
|
||||
}
|
||||
|
||||
param->auth_level = -1; /* -1 means unset, 0 is explicit */
|
||||
sk_ASN1_OBJECT_pop_free(param->policies, ASN1_OBJECT_free);
|
||||
param->policies = NULL;
|
||||
sk_OPENSSL_STRING_pop_free(param->hosts, str_free);
|
||||
param->hosts = NULL;
|
||||
OPENSSL_free(param->peername);
|
||||
param->peername = NULL;
|
||||
OPENSSL_free(param->email);
|
||||
param->email = NULL;
|
||||
param->emaillen = 0;
|
||||
OPENSSL_free(param->ip);
|
||||
param->ip = NULL;
|
||||
param->iplen = 0;
|
||||
}
|
||||
|
||||
X509_VERIFY_PARAM *X509_VERIFY_PARAM_new(void)
|
||||
{
|
||||
X509_VERIFY_PARAM *param;
|
||||
X509_VERIFY_PARAM_ID *paramid;
|
||||
|
||||
param = OPENSSL_malloc(sizeof *param);
|
||||
if (!param)
|
||||
param = OPENSSL_zalloc(sizeof(*param));
|
||||
if (param == NULL)
|
||||
return NULL;
|
||||
paramid = OPENSSL_malloc(sizeof *paramid);
|
||||
if (!paramid) {
|
||||
OPENSSL_free(param);
|
||||
return NULL;
|
||||
}
|
||||
memset(param, 0, sizeof *param);
|
||||
memset(paramid, 0, sizeof *paramid);
|
||||
param->id = paramid;
|
||||
x509_verify_param_zero(param);
|
||||
return param;
|
||||
}
|
||||
|
||||
void X509_VERIFY_PARAM_free(X509_VERIFY_PARAM *param)
|
||||
{
|
||||
if (param == NULL)
|
||||
if (!param)
|
||||
return;
|
||||
x509_verify_param_zero(param);
|
||||
OPENSSL_free(param->id);
|
||||
OPENSSL_free(param);
|
||||
}
|
||||
|
||||
@@ -235,11 +164,6 @@ void X509_VERIFY_PARAM_free(X509_VERIFY_PARAM *param)
|
||||
(to_overwrite || \
|
||||
((src->field != def) && (to_default || (dest->field == def))))
|
||||
|
||||
/* As above but for ID fields */
|
||||
|
||||
#define test_x509_verify_param_copy_id(idf, def) \
|
||||
test_x509_verify_param_copy(id->idf, def)
|
||||
|
||||
/* Macro to test and copy a field if necessary */
|
||||
|
||||
#define x509_verify_param_copy(field, def) \
|
||||
@@ -251,10 +175,8 @@ int X509_VERIFY_PARAM_inherit(X509_VERIFY_PARAM *dest,
|
||||
{
|
||||
unsigned long inh_flags;
|
||||
int to_default, to_overwrite;
|
||||
X509_VERIFY_PARAM_ID *id;
|
||||
if (!src)
|
||||
return 1;
|
||||
id = src->id;
|
||||
inh_flags = dest->inh_flags | src->inh_flags;
|
||||
|
||||
if (inh_flags & X509_VP_FLAG_ONCE)
|
||||
@@ -274,8 +196,9 @@ int X509_VERIFY_PARAM_inherit(X509_VERIFY_PARAM *dest,
|
||||
to_overwrite = 0;
|
||||
|
||||
x509_verify_param_copy(purpose, 0);
|
||||
x509_verify_param_copy(trust, 0);
|
||||
x509_verify_param_copy(trust, X509_TRUST_DEFAULT);
|
||||
x509_verify_param_copy(depth, -1);
|
||||
x509_verify_param_copy(auth_level, -1);
|
||||
|
||||
/* If overwrite or check time not set, copy across */
|
||||
|
||||
@@ -296,27 +219,25 @@ int X509_VERIFY_PARAM_inherit(X509_VERIFY_PARAM *dest,
|
||||
}
|
||||
|
||||
/* Copy the host flags if and only if we're copying the host list */
|
||||
if (test_x509_verify_param_copy_id(hosts, NULL)) {
|
||||
if (dest->id->hosts) {
|
||||
string_stack_free(dest->id->hosts);
|
||||
dest->id->hosts = NULL;
|
||||
}
|
||||
if (id->hosts) {
|
||||
dest->id->hosts =
|
||||
sk_OPENSSL_STRING_deep_copy(id->hosts, str_copy, str_free);
|
||||
if (dest->id->hosts == NULL)
|
||||
if (test_x509_verify_param_copy(hosts, NULL)) {
|
||||
sk_OPENSSL_STRING_pop_free(dest->hosts, str_free);
|
||||
dest->hosts = NULL;
|
||||
if (src->hosts) {
|
||||
dest->hosts =
|
||||
sk_OPENSSL_STRING_deep_copy(src->hosts, str_copy, str_free);
|
||||
if (dest->hosts == NULL)
|
||||
return 0;
|
||||
dest->id->hostflags = id->hostflags;
|
||||
dest->hostflags = src->hostflags;
|
||||
}
|
||||
}
|
||||
|
||||
if (test_x509_verify_param_copy_id(email, NULL)) {
|
||||
if (!X509_VERIFY_PARAM_set1_email(dest, id->email, id->emaillen))
|
||||
if (test_x509_verify_param_copy(email, NULL)) {
|
||||
if (!X509_VERIFY_PARAM_set1_email(dest, src->email, src->emaillen))
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (test_x509_verify_param_copy_id(ip, NULL)) {
|
||||
if (!X509_VERIFY_PARAM_set1_ip(dest, id->ip, id->iplen))
|
||||
if (test_x509_verify_param_copy(ip, NULL)) {
|
||||
if (!X509_VERIFY_PARAM_set1_ip(dest, src->ip, src->iplen))
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -339,30 +260,27 @@ static int int_x509_param_set1(char **pdest, size_t *pdestlen,
|
||||
{
|
||||
void *tmp;
|
||||
if (src) {
|
||||
if (srclen == 0) {
|
||||
tmp = BUF_strdup(src);
|
||||
if (srclen == 0)
|
||||
srclen = strlen(src);
|
||||
} else
|
||||
tmp = BUF_memdup(src, srclen);
|
||||
if (!tmp)
|
||||
|
||||
tmp = OPENSSL_memdup(src, srclen);
|
||||
if (tmp == NULL)
|
||||
return 0;
|
||||
} else {
|
||||
tmp = NULL;
|
||||
srclen = 0;
|
||||
}
|
||||
if (*pdest)
|
||||
OPENSSL_free(*pdest);
|
||||
OPENSSL_free(*pdest);
|
||||
*pdest = tmp;
|
||||
if (pdestlen)
|
||||
if (pdestlen != NULL)
|
||||
*pdestlen = srclen;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int X509_VERIFY_PARAM_set1_name(X509_VERIFY_PARAM *param, const char *name)
|
||||
{
|
||||
if (param->name)
|
||||
OPENSSL_free(param->name);
|
||||
param->name = BUF_strdup(name);
|
||||
OPENSSL_free(param->name);
|
||||
param->name = OPENSSL_strdup(name);
|
||||
if (param->name)
|
||||
return 1;
|
||||
return 0;
|
||||
@@ -388,6 +306,17 @@ unsigned long X509_VERIFY_PARAM_get_flags(X509_VERIFY_PARAM *param)
|
||||
return param->flags;
|
||||
}
|
||||
|
||||
uint32_t X509_VERIFY_PARAM_get_inh_flags(const X509_VERIFY_PARAM *param)
|
||||
{
|
||||
return param->inh_flags;
|
||||
}
|
||||
|
||||
int X509_VERIFY_PARAM_set_inh_flags(X509_VERIFY_PARAM *param, uint32_t flags)
|
||||
{
|
||||
param->inh_flags = flags;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int X509_VERIFY_PARAM_set_purpose(X509_VERIFY_PARAM *param, int purpose)
|
||||
{
|
||||
return X509_PURPOSE_set(¶m->purpose, purpose);
|
||||
@@ -403,6 +332,16 @@ void X509_VERIFY_PARAM_set_depth(X509_VERIFY_PARAM *param, int depth)
|
||||
param->depth = depth;
|
||||
}
|
||||
|
||||
void X509_VERIFY_PARAM_set_auth_level(X509_VERIFY_PARAM *param, int auth_level)
|
||||
{
|
||||
param->auth_level = auth_level;
|
||||
}
|
||||
|
||||
time_t X509_VERIFY_PARAM_get_time(const X509_VERIFY_PARAM *param)
|
||||
{
|
||||
return param->check_time;
|
||||
}
|
||||
|
||||
void X509_VERIFY_PARAM_set_time(X509_VERIFY_PARAM *param, time_t t)
|
||||
{
|
||||
param->check_time = t;
|
||||
@@ -427,10 +366,10 @@ int X509_VERIFY_PARAM_set1_policies(X509_VERIFY_PARAM *param,
|
||||
{
|
||||
int i;
|
||||
ASN1_OBJECT *oid, *doid;
|
||||
|
||||
if (!param)
|
||||
return 0;
|
||||
if (param->policies)
|
||||
sk_ASN1_OBJECT_pop_free(param->policies, ASN1_OBJECT_free);
|
||||
sk_ASN1_OBJECT_pop_free(param->policies, ASN1_OBJECT_free);
|
||||
|
||||
if (!policies) {
|
||||
param->policies = NULL;
|
||||
@@ -458,30 +397,48 @@ int X509_VERIFY_PARAM_set1_policies(X509_VERIFY_PARAM *param,
|
||||
int X509_VERIFY_PARAM_set1_host(X509_VERIFY_PARAM *param,
|
||||
const char *name, size_t namelen)
|
||||
{
|
||||
return int_x509_param_set_hosts(param->id, SET_HOST, name, namelen);
|
||||
return int_x509_param_set_hosts(param, SET_HOST, name, namelen);
|
||||
}
|
||||
|
||||
int X509_VERIFY_PARAM_add1_host(X509_VERIFY_PARAM *param,
|
||||
const char *name, size_t namelen)
|
||||
{
|
||||
return int_x509_param_set_hosts(param->id, ADD_HOST, name, namelen);
|
||||
return int_x509_param_set_hosts(param, ADD_HOST, name, namelen);
|
||||
}
|
||||
|
||||
void X509_VERIFY_PARAM_set_hostflags(X509_VERIFY_PARAM *param,
|
||||
unsigned int flags)
|
||||
{
|
||||
param->id->hostflags = flags;
|
||||
param->hostflags = flags;
|
||||
}
|
||||
|
||||
char *X509_VERIFY_PARAM_get0_peername(X509_VERIFY_PARAM *param)
|
||||
{
|
||||
return param->id->peername;
|
||||
return param->peername;
|
||||
}
|
||||
|
||||
/*
|
||||
* Move peername from one param structure to another, freeing any name present
|
||||
* at the target. If the source is a NULL parameter structure, free and zero
|
||||
* the target peername.
|
||||
*/
|
||||
void X509_VERIFY_PARAM_move_peername(X509_VERIFY_PARAM *to,
|
||||
X509_VERIFY_PARAM *from)
|
||||
{
|
||||
char *peername = (from != NULL) ? from->peername : NULL;
|
||||
|
||||
if (to->peername != peername) {
|
||||
OPENSSL_free(to->peername);
|
||||
to->peername = peername;
|
||||
}
|
||||
if (from)
|
||||
from->peername = NULL;
|
||||
}
|
||||
|
||||
int X509_VERIFY_PARAM_set1_email(X509_VERIFY_PARAM *param,
|
||||
const char *email, size_t emaillen)
|
||||
{
|
||||
return int_x509_param_set1(¶m->id->email, ¶m->id->emaillen,
|
||||
return int_x509_param_set1(¶m->email, ¶m->emaillen,
|
||||
email, emaillen);
|
||||
}
|
||||
|
||||
@@ -490,7 +447,7 @@ int X509_VERIFY_PARAM_set1_ip(X509_VERIFY_PARAM *param,
|
||||
{
|
||||
if (iplen != 0 && iplen != 4 && iplen != 16)
|
||||
return 0;
|
||||
return int_x509_param_set1((char **)¶m->id->ip, ¶m->id->iplen,
|
||||
return int_x509_param_set1((char **)¶m->ip, ¶m->iplen,
|
||||
(char *)ip, iplen);
|
||||
}
|
||||
|
||||
@@ -510,14 +467,17 @@ int X509_VERIFY_PARAM_get_depth(const X509_VERIFY_PARAM *param)
|
||||
return param->depth;
|
||||
}
|
||||
|
||||
int X509_VERIFY_PARAM_get_auth_level(const X509_VERIFY_PARAM *param)
|
||||
{
|
||||
return param->auth_level;
|
||||
}
|
||||
|
||||
const char *X509_VERIFY_PARAM_get0_name(const X509_VERIFY_PARAM *param)
|
||||
{
|
||||
return param->name;
|
||||
}
|
||||
|
||||
static X509_VERIFY_PARAM_ID _empty_id = { NULL, 0U, NULL, NULL, 0, NULL, 0 };
|
||||
|
||||
#define vpm_empty_id (X509_VERIFY_PARAM_ID *)&_empty_id
|
||||
#define vpm_empty_id NULL, 0U, NULL, NULL, 0, NULL, 0
|
||||
|
||||
/*
|
||||
* Default verify parameters: these are used for various applications and can
|
||||
@@ -530,10 +490,11 @@ static const X509_VERIFY_PARAM default_table[] = {
|
||||
"default", /* X509 default parameters */
|
||||
0, /* Check time */
|
||||
0, /* internal flags */
|
||||
0, /* flags */
|
||||
X509_V_FLAG_TRUSTED_FIRST, /* flags */
|
||||
0, /* purpose */
|
||||
0, /* trust */
|
||||
100, /* depth */
|
||||
-1, /* auth_level */
|
||||
NULL, /* policies */
|
||||
vpm_empty_id},
|
||||
{
|
||||
@@ -544,6 +505,7 @@ static const X509_VERIFY_PARAM default_table[] = {
|
||||
X509_PURPOSE_SMIME_SIGN, /* purpose */
|
||||
X509_TRUST_EMAIL, /* trust */
|
||||
-1, /* depth */
|
||||
-1, /* auth_level */
|
||||
NULL, /* policies */
|
||||
vpm_empty_id},
|
||||
{
|
||||
@@ -554,6 +516,7 @@ static const X509_VERIFY_PARAM default_table[] = {
|
||||
X509_PURPOSE_SMIME_SIGN, /* purpose */
|
||||
X509_TRUST_EMAIL, /* trust */
|
||||
-1, /* depth */
|
||||
-1, /* auth_level */
|
||||
NULL, /* policies */
|
||||
vpm_empty_id},
|
||||
{
|
||||
@@ -564,6 +527,7 @@ static const X509_VERIFY_PARAM default_table[] = {
|
||||
X509_PURPOSE_SSL_CLIENT, /* purpose */
|
||||
X509_TRUST_SSL_CLIENT, /* trust */
|
||||
-1, /* depth */
|
||||
-1, /* auth_level */
|
||||
NULL, /* policies */
|
||||
vpm_empty_id},
|
||||
{
|
||||
@@ -574,6 +538,7 @@ static const X509_VERIFY_PARAM default_table[] = {
|
||||
X509_PURPOSE_SSL_SERVER, /* purpose */
|
||||
X509_TRUST_SSL_SERVER, /* trust */
|
||||
-1, /* depth */
|
||||
-1, /* auth_level */
|
||||
NULL, /* policies */
|
||||
vpm_empty_id}
|
||||
};
|
||||
@@ -598,9 +563,9 @@ int X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM *param)
|
||||
{
|
||||
int idx;
|
||||
X509_VERIFY_PARAM *ptmp;
|
||||
if (!param_table) {
|
||||
if (param_table == NULL) {
|
||||
param_table = sk_X509_VERIFY_PARAM_new(param_cmp);
|
||||
if (!param_table)
|
||||
if (param_table == NULL)
|
||||
return 0;
|
||||
} else {
|
||||
idx = sk_X509_VERIFY_PARAM_find(param_table, param);
|
||||
@@ -617,7 +582,7 @@ int X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM *param)
|
||||
|
||||
int X509_VERIFY_PARAM_get_count(void)
|
||||
{
|
||||
int num = sizeof(default_table) / sizeof(X509_VERIFY_PARAM);
|
||||
int num = OSSL_NELEM(default_table);
|
||||
if (param_table)
|
||||
num += sk_X509_VERIFY_PARAM_num(param_table);
|
||||
return num;
|
||||
@@ -625,7 +590,7 @@ int X509_VERIFY_PARAM_get_count(void)
|
||||
|
||||
const X509_VERIFY_PARAM *X509_VERIFY_PARAM_get0(int id)
|
||||
{
|
||||
int num = sizeof(default_table) / sizeof(X509_VERIFY_PARAM);
|
||||
int num = OSSL_NELEM(default_table);
|
||||
if (id < num)
|
||||
return default_table + id;
|
||||
return sk_X509_VERIFY_PARAM_value(param_table, id - num);
|
||||
@@ -642,14 +607,11 @@ const X509_VERIFY_PARAM *X509_VERIFY_PARAM_lookup(const char *name)
|
||||
if (idx != -1)
|
||||
return sk_X509_VERIFY_PARAM_value(param_table, idx);
|
||||
}
|
||||
return OBJ_bsearch_table(&pm, default_table,
|
||||
sizeof(default_table) /
|
||||
sizeof(X509_VERIFY_PARAM));
|
||||
return OBJ_bsearch_table(&pm, default_table, OSSL_NELEM(default_table));
|
||||
}
|
||||
|
||||
void X509_VERIFY_PARAM_table_cleanup(void)
|
||||
{
|
||||
if (param_table)
|
||||
sk_X509_VERIFY_PARAM_pop_free(param_table, X509_VERIFY_PARAM_free);
|
||||
sk_X509_VERIFY_PARAM_pop_free(param_table, X509_VERIFY_PARAM_free);
|
||||
param_table = NULL;
|
||||
}
|
||||
|
||||
@@ -1,119 +1,50 @@
|
||||
/* crypto/x509/x509cset.c */
|
||||
/*
|
||||
* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project
|
||||
* 2001.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 2001 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).
|
||||
* Copyright 2001-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 "cryptlib.h"
|
||||
#include "internal/cryptlib.h"
|
||||
#include <openssl/asn1.h>
|
||||
#include <openssl/objects.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/x509.h>
|
||||
#include "internal/x509_int.h"
|
||||
|
||||
int X509_CRL_set_version(X509_CRL *x, long version)
|
||||
{
|
||||
if (x == NULL)
|
||||
return (0);
|
||||
if (x->crl->version == NULL) {
|
||||
if ((x->crl->version = M_ASN1_INTEGER_new()) == NULL)
|
||||
if (x->crl.version == NULL) {
|
||||
if ((x->crl.version = ASN1_INTEGER_new()) == NULL)
|
||||
return (0);
|
||||
}
|
||||
return (ASN1_INTEGER_set(x->crl->version, version));
|
||||
return (ASN1_INTEGER_set(x->crl.version, version));
|
||||
}
|
||||
|
||||
int X509_CRL_set_issuer_name(X509_CRL *x, X509_NAME *name)
|
||||
{
|
||||
if ((x == NULL) || (x->crl == NULL))
|
||||
return (0);
|
||||
return (X509_NAME_set(&x->crl->issuer, name));
|
||||
}
|
||||
|
||||
int X509_CRL_set_lastUpdate(X509_CRL *x, const ASN1_TIME *tm)
|
||||
{
|
||||
ASN1_TIME *in;
|
||||
|
||||
if (x == NULL)
|
||||
return (0);
|
||||
in = x->crl->lastUpdate;
|
||||
if (in != tm) {
|
||||
in = M_ASN1_TIME_dup(tm);
|
||||
if (in != NULL) {
|
||||
M_ASN1_TIME_free(x->crl->lastUpdate);
|
||||
x->crl->lastUpdate = in;
|
||||
}
|
||||
}
|
||||
return (in != NULL);
|
||||
return (X509_NAME_set(&x->crl.issuer, name));
|
||||
}
|
||||
|
||||
int X509_CRL_set_nextUpdate(X509_CRL *x, const ASN1_TIME *tm)
|
||||
int X509_CRL_set1_lastUpdate(X509_CRL *x, const ASN1_TIME *tm)
|
||||
{
|
||||
ASN1_TIME *in;
|
||||
|
||||
if (x == NULL)
|
||||
return (0);
|
||||
in = x->crl->nextUpdate;
|
||||
if (in != tm) {
|
||||
in = M_ASN1_TIME_dup(tm);
|
||||
if (in != NULL) {
|
||||
M_ASN1_TIME_free(x->crl->nextUpdate);
|
||||
x->crl->nextUpdate = in;
|
||||
}
|
||||
}
|
||||
return (in != NULL);
|
||||
return 0;
|
||||
return x509_set1_time(&x->crl.lastUpdate, tm);
|
||||
}
|
||||
|
||||
int X509_CRL_set1_nextUpdate(X509_CRL *x, const ASN1_TIME *tm)
|
||||
{
|
||||
if (x == NULL)
|
||||
return 0;
|
||||
return x509_set1_time(&x->crl.nextUpdate, tm);
|
||||
}
|
||||
|
||||
int X509_CRL_sort(X509_CRL *c)
|
||||
@@ -123,15 +54,88 @@ int X509_CRL_sort(X509_CRL *c)
|
||||
/*
|
||||
* sort the data so it will be written in serial number order
|
||||
*/
|
||||
sk_X509_REVOKED_sort(c->crl->revoked);
|
||||
for (i = 0; i < sk_X509_REVOKED_num(c->crl->revoked); i++) {
|
||||
r = sk_X509_REVOKED_value(c->crl->revoked, i);
|
||||
sk_X509_REVOKED_sort(c->crl.revoked);
|
||||
for (i = 0; i < sk_X509_REVOKED_num(c->crl.revoked); i++) {
|
||||
r = sk_X509_REVOKED_value(c->crl.revoked, i);
|
||||
r->sequence = i;
|
||||
}
|
||||
c->crl->enc.modified = 1;
|
||||
c->crl.enc.modified = 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int X509_CRL_up_ref(X509_CRL *crl)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (CRYPTO_atomic_add(&crl->references, 1, &i, crl->lock) <= 0)
|
||||
return 0;
|
||||
|
||||
REF_PRINT_COUNT("X509_CRL", crl);
|
||||
REF_ASSERT_ISNT(i < 2);
|
||||
return ((i > 1) ? 1 : 0);
|
||||
}
|
||||
|
||||
long X509_CRL_get_version(const X509_CRL *crl)
|
||||
{
|
||||
return ASN1_INTEGER_get(crl->crl.version);
|
||||
}
|
||||
|
||||
const ASN1_TIME *X509_CRL_get0_lastUpdate(const X509_CRL *crl)
|
||||
{
|
||||
return crl->crl.lastUpdate;
|
||||
}
|
||||
|
||||
const ASN1_TIME *X509_CRL_get0_nextUpdate(const X509_CRL *crl)
|
||||
{
|
||||
return crl->crl.nextUpdate;
|
||||
}
|
||||
|
||||
#if OPENSSL_API_COMPAT < 0x10100000L
|
||||
ASN1_TIME *X509_CRL_get_lastUpdate(X509_CRL *crl)
|
||||
{
|
||||
return crl->crl.lastUpdate;
|
||||
}
|
||||
|
||||
ASN1_TIME *X509_CRL_get_nextUpdate(X509_CRL *crl)
|
||||
{
|
||||
return crl->crl.nextUpdate;
|
||||
}
|
||||
#endif
|
||||
|
||||
X509_NAME *X509_CRL_get_issuer(const X509_CRL *crl)
|
||||
{
|
||||
return crl->crl.issuer;
|
||||
}
|
||||
|
||||
const STACK_OF(X509_EXTENSION) *X509_CRL_get0_extensions(const X509_CRL *crl)
|
||||
{
|
||||
return crl->crl.extensions;
|
||||
}
|
||||
|
||||
STACK_OF(X509_REVOKED) *X509_CRL_get_REVOKED(X509_CRL *crl)
|
||||
{
|
||||
return crl->crl.revoked;
|
||||
}
|
||||
|
||||
void X509_CRL_get0_signature(const X509_CRL *crl, const ASN1_BIT_STRING **psig,
|
||||
const X509_ALGOR **palg)
|
||||
{
|
||||
if (psig != NULL)
|
||||
*psig = &crl->signature;
|
||||
if (palg != NULL)
|
||||
*palg = &crl->sig_alg;
|
||||
}
|
||||
|
||||
int X509_CRL_get_signature_nid(const X509_CRL *crl)
|
||||
{
|
||||
return OBJ_obj2nid(crl->sig_alg.algorithm);
|
||||
}
|
||||
|
||||
const ASN1_TIME *X509_REVOKED_get0_revocationDate(const X509_REVOKED *x)
|
||||
{
|
||||
return x->revocationDate;
|
||||
}
|
||||
|
||||
int X509_REVOKED_set_revocationDate(X509_REVOKED *x, ASN1_TIME *tm)
|
||||
{
|
||||
ASN1_TIME *in;
|
||||
@@ -140,28 +144,39 @@ int X509_REVOKED_set_revocationDate(X509_REVOKED *x, ASN1_TIME *tm)
|
||||
return (0);
|
||||
in = x->revocationDate;
|
||||
if (in != tm) {
|
||||
in = M_ASN1_TIME_dup(tm);
|
||||
in = ASN1_STRING_dup(tm);
|
||||
if (in != NULL) {
|
||||
M_ASN1_TIME_free(x->revocationDate);
|
||||
ASN1_TIME_free(x->revocationDate);
|
||||
x->revocationDate = in;
|
||||
}
|
||||
}
|
||||
return (in != NULL);
|
||||
}
|
||||
|
||||
const ASN1_INTEGER *X509_REVOKED_get0_serialNumber(const X509_REVOKED *x)
|
||||
{
|
||||
return &x->serialNumber;
|
||||
}
|
||||
|
||||
int X509_REVOKED_set_serialNumber(X509_REVOKED *x, ASN1_INTEGER *serial)
|
||||
{
|
||||
ASN1_INTEGER *in;
|
||||
|
||||
if (x == NULL)
|
||||
return (0);
|
||||
in = x->serialNumber;
|
||||
if (in != serial) {
|
||||
in = M_ASN1_INTEGER_dup(serial);
|
||||
if (in != NULL) {
|
||||
M_ASN1_INTEGER_free(x->serialNumber);
|
||||
x->serialNumber = in;
|
||||
}
|
||||
}
|
||||
return (in != NULL);
|
||||
in = &x->serialNumber;
|
||||
if (in != serial)
|
||||
return ASN1_STRING_copy(in, serial);
|
||||
return 1;
|
||||
}
|
||||
|
||||
const STACK_OF(X509_EXTENSION) *X509_REVOKED_get0_extensions(const X509_REVOKED *r)
|
||||
{
|
||||
return r->extensions;
|
||||
}
|
||||
|
||||
int i2d_re_X509_CRL_tbs(X509_CRL *crl, unsigned char **pp)
|
||||
{
|
||||
crl->crl.enc.modified = 1;
|
||||
return i2d_X509_CRL_INFO(&crl->crl, pp);
|
||||
}
|
||||
|
||||
@@ -1,68 +1,20 @@
|
||||
/* crypto/x509/x509name.c */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
/*
|
||||
* Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
* 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/stack.h>
|
||||
#include "cryptlib.h"
|
||||
#include "internal/cryptlib.h"
|
||||
#include <openssl/asn1.h>
|
||||
#include <openssl/objects.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/x509.h>
|
||||
#include "internal/x509_int.h"
|
||||
|
||||
int X509_NAME_get_text_by_NID(X509_NAME *name, int nid, char *buf, int len)
|
||||
{
|
||||
@@ -74,11 +26,11 @@ int X509_NAME_get_text_by_NID(X509_NAME *name, int nid, char *buf, int len)
|
||||
return (X509_NAME_get_text_by_OBJ(name, obj, buf, len));
|
||||
}
|
||||
|
||||
int X509_NAME_get_text_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, char *buf,
|
||||
int X509_NAME_get_text_by_OBJ(X509_NAME *name, const ASN1_OBJECT *obj, char *buf,
|
||||
int len)
|
||||
{
|
||||
int i;
|
||||
ASN1_STRING *data;
|
||||
const ASN1_STRING *data;
|
||||
|
||||
i = X509_NAME_get_index_by_OBJ(name, obj, -1);
|
||||
if (i < 0)
|
||||
@@ -92,7 +44,7 @@ int X509_NAME_get_text_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, char *buf,
|
||||
return (i);
|
||||
}
|
||||
|
||||
int X509_NAME_entry_count(X509_NAME *name)
|
||||
int X509_NAME_entry_count(const X509_NAME *name)
|
||||
{
|
||||
if (name == NULL)
|
||||
return (0);
|
||||
@@ -109,8 +61,8 @@ int X509_NAME_get_index_by_NID(X509_NAME *name, int nid, int lastpos)
|
||||
return (X509_NAME_get_index_by_OBJ(name, obj, lastpos));
|
||||
}
|
||||
|
||||
/* NOTE: you should be passsing -1, not 0 as lastpos */
|
||||
int X509_NAME_get_index_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, int lastpos)
|
||||
/* NOTE: you should be passing -1, not 0 as lastpos */
|
||||
int X509_NAME_get_index_by_OBJ(X509_NAME *name, const ASN1_OBJECT *obj, int lastpos)
|
||||
{
|
||||
int n;
|
||||
X509_NAME_ENTRY *ne;
|
||||
@@ -130,7 +82,7 @@ int X509_NAME_get_index_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, int lastpos)
|
||||
return (-1);
|
||||
}
|
||||
|
||||
X509_NAME_ENTRY *X509_NAME_get_entry(X509_NAME *name, int loc)
|
||||
X509_NAME_ENTRY *X509_NAME_get_entry(const X509_NAME *name, int loc)
|
||||
{
|
||||
if (name == NULL || sk_X509_NAME_ENTRY_num(name->entries) <= loc
|
||||
|| loc < 0)
|
||||
@@ -178,8 +130,8 @@ X509_NAME_ENTRY *X509_NAME_delete_entry(X509_NAME *name, int loc)
|
||||
return (ret);
|
||||
}
|
||||
|
||||
int X509_NAME_add_entry_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, int type,
|
||||
unsigned char *bytes, int len, int loc,
|
||||
int X509_NAME_add_entry_by_OBJ(X509_NAME *name, const ASN1_OBJECT *obj, int type,
|
||||
const unsigned char *bytes, int len, int loc,
|
||||
int set)
|
||||
{
|
||||
X509_NAME_ENTRY *ne;
|
||||
@@ -193,7 +145,7 @@ int X509_NAME_add_entry_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, int type,
|
||||
}
|
||||
|
||||
int X509_NAME_add_entry_by_NID(X509_NAME *name, int nid, int type,
|
||||
unsigned char *bytes, int len, int loc,
|
||||
const unsigned char *bytes, int len, int loc,
|
||||
int set)
|
||||
{
|
||||
X509_NAME_ENTRY *ne;
|
||||
@@ -224,7 +176,7 @@ int X509_NAME_add_entry_by_txt(X509_NAME *name, const char *field, int type,
|
||||
* if set is -1, append to previous set, 0 'a new one', and 1, prepend to the
|
||||
* guy we are about to stomp on.
|
||||
*/
|
||||
int X509_NAME_add_entry(X509_NAME *name, X509_NAME_ENTRY *ne, int loc,
|
||||
int X509_NAME_add_entry(X509_NAME *name, const X509_NAME_ENTRY *ne, int loc,
|
||||
int set)
|
||||
{
|
||||
X509_NAME_ENTRY *new_name = NULL;
|
||||
@@ -262,7 +214,11 @@ int X509_NAME_add_entry(X509_NAME *name, X509_NAME_ENTRY *ne, int loc,
|
||||
inc = (set == 0) ? 1 : 0;
|
||||
}
|
||||
|
||||
if ((new_name = X509_NAME_ENTRY_dup(ne)) == NULL)
|
||||
/*
|
||||
* X509_NAME_ENTRY_dup is ASN1 generated code, that can't be easily
|
||||
* const'ified; harmless cast as dup() don't modify its input.
|
||||
*/
|
||||
if ((new_name = X509_NAME_ENTRY_dup((X509_NAME_ENTRY *)ne)) == NULL)
|
||||
goto err;
|
||||
new_name->set = set;
|
||||
if (!sk_X509_NAME_ENTRY_insert(sk, new_name, loc)) {
|
||||
@@ -276,8 +232,7 @@ int X509_NAME_add_entry(X509_NAME *name, X509_NAME_ENTRY *ne, int loc,
|
||||
}
|
||||
return (1);
|
||||
err:
|
||||
if (new_name != NULL)
|
||||
X509_NAME_ENTRY_free(new_name);
|
||||
X509_NAME_ENTRY_free(new_name);
|
||||
return (0);
|
||||
}
|
||||
|
||||
@@ -302,7 +257,8 @@ X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_txt(X509_NAME_ENTRY **ne,
|
||||
}
|
||||
|
||||
X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_NID(X509_NAME_ENTRY **ne, int nid,
|
||||
int type, unsigned char *bytes,
|
||||
int type,
|
||||
const unsigned char *bytes,
|
||||
int len)
|
||||
{
|
||||
ASN1_OBJECT *obj;
|
||||
@@ -319,7 +275,7 @@ X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_NID(X509_NAME_ENTRY **ne, int nid,
|
||||
}
|
||||
|
||||
X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ(X509_NAME_ENTRY **ne,
|
||||
ASN1_OBJECT *obj, int type,
|
||||
const ASN1_OBJECT *obj, int type,
|
||||
const unsigned char *bytes,
|
||||
int len)
|
||||
{
|
||||
@@ -345,7 +301,7 @@ X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ(X509_NAME_ENTRY **ne,
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
int X509_NAME_ENTRY_set_object(X509_NAME_ENTRY *ne, ASN1_OBJECT *obj)
|
||||
int X509_NAME_ENTRY_set_object(X509_NAME_ENTRY *ne, const ASN1_OBJECT *obj)
|
||||
{
|
||||
if ((ne == NULL) || (obj == NULL)) {
|
||||
X509err(X509_F_X509_NAME_ENTRY_SET_OBJECT,
|
||||
@@ -382,16 +338,21 @@ int X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *ne, int type,
|
||||
return (1);
|
||||
}
|
||||
|
||||
ASN1_OBJECT *X509_NAME_ENTRY_get_object(X509_NAME_ENTRY *ne)
|
||||
ASN1_OBJECT *X509_NAME_ENTRY_get_object(const X509_NAME_ENTRY *ne)
|
||||
{
|
||||
if (ne == NULL)
|
||||
return (NULL);
|
||||
return (ne->object);
|
||||
}
|
||||
|
||||
ASN1_STRING *X509_NAME_ENTRY_get_data(X509_NAME_ENTRY *ne)
|
||||
ASN1_STRING *X509_NAME_ENTRY_get_data(const X509_NAME_ENTRY *ne)
|
||||
{
|
||||
if (ne == NULL)
|
||||
return (NULL);
|
||||
return (ne->value);
|
||||
}
|
||||
|
||||
int X509_NAME_ENTRY_set(const X509_NAME_ENTRY *ne)
|
||||
{
|
||||
return ne->set;
|
||||
}
|
||||
|
||||
@@ -1,85 +1,40 @@
|
||||
/* crypto/x509/x509rset.c */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
/*
|
||||
* Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
* 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 "cryptlib.h"
|
||||
#include "internal/cryptlib.h"
|
||||
#include <openssl/asn1.h>
|
||||
#include <openssl/objects.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/x509.h>
|
||||
#include "internal/x509_int.h"
|
||||
|
||||
int X509_REQ_set_version(X509_REQ *x, long version)
|
||||
{
|
||||
if (x == NULL)
|
||||
return (0);
|
||||
return (ASN1_INTEGER_set(x->req_info->version, version));
|
||||
x->req_info.enc.modified = 1;
|
||||
return (ASN1_INTEGER_set(x->req_info.version, version));
|
||||
}
|
||||
|
||||
int X509_REQ_set_subject_name(X509_REQ *x, X509_NAME *name)
|
||||
{
|
||||
if ((x == NULL) || (x->req_info == NULL))
|
||||
if (x == NULL)
|
||||
return (0);
|
||||
return (X509_NAME_set(&x->req_info->subject, name));
|
||||
x->req_info.enc.modified = 1;
|
||||
return (X509_NAME_set(&x->req_info.subject, name));
|
||||
}
|
||||
|
||||
int X509_REQ_set_pubkey(X509_REQ *x, EVP_PKEY *pkey)
|
||||
{
|
||||
if ((x == NULL) || (x->req_info == NULL))
|
||||
if (x == NULL)
|
||||
return (0);
|
||||
return (X509_PUBKEY_set(&x->req_info->pubkey, pkey));
|
||||
x->req_info.enc.modified = 1;
|
||||
return (X509_PUBKEY_set(&x->req_info.pubkey, pkey));
|
||||
}
|
||||
|
||||
@@ -1,64 +1,14 @@
|
||||
/* x509spki.c */
|
||||
/*
|
||||
* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project
|
||||
* 1999.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1999 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).
|
||||
* 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 "cryptlib.h"
|
||||
#include "internal/cryptlib.h"
|
||||
#include <openssl/x509.h>
|
||||
|
||||
int NETSCAPE_SPKI_set_pubkey(NETSCAPE_SPKI *x, EVP_PKEY *pkey)
|
||||
@@ -85,7 +35,7 @@ NETSCAPE_SPKI *NETSCAPE_SPKI_b64_decode(const char *str, int len)
|
||||
NETSCAPE_SPKI *spki;
|
||||
if (len <= 0)
|
||||
len = strlen(str);
|
||||
if (!(spki_der = OPENSSL_malloc(len + 1))) {
|
||||
if ((spki_der = OPENSSL_malloc(len + 1)) == NULL) {
|
||||
X509err(X509_F_NETSCAPE_SPKI_B64_DECODE, ERR_R_MALLOC_FAILURE);
|
||||
return NULL;
|
||||
}
|
||||
@@ -111,8 +61,10 @@ char *NETSCAPE_SPKI_b64_encode(NETSCAPE_SPKI *spki)
|
||||
der_len = i2d_NETSCAPE_SPKI(spki, NULL);
|
||||
der_spki = OPENSSL_malloc(der_len);
|
||||
b64_str = OPENSSL_malloc(der_len * 2);
|
||||
if (!der_spki || !b64_str) {
|
||||
if (der_spki == NULL || b64_str == NULL) {
|
||||
X509err(X509_F_NETSCAPE_SPKI_B64_ENCODE, ERR_R_MALLOC_FAILURE);
|
||||
OPENSSL_free(der_spki);
|
||||
OPENSSL_free(b64_str);
|
||||
return NULL;
|
||||
}
|
||||
p = der_spki;
|
||||
|
||||
@@ -1,84 +1,35 @@
|
||||
/* crypto/x509/x509type.c */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
/*
|
||||
* Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
* 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 "cryptlib.h"
|
||||
#include "internal/cryptlib.h"
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/objects.h>
|
||||
#include <openssl/x509.h>
|
||||
|
||||
int X509_certificate_type(X509 *x, EVP_PKEY *pkey)
|
||||
int X509_certificate_type(const X509 *x, const EVP_PKEY *pkey)
|
||||
{
|
||||
EVP_PKEY *pk;
|
||||
const EVP_PKEY *pk;
|
||||
int ret = 0, i;
|
||||
|
||||
if (x == NULL)
|
||||
return (0);
|
||||
|
||||
if (pkey == NULL)
|
||||
pk = X509_get_pubkey(x);
|
||||
pk = X509_get0_pubkey(x);
|
||||
else
|
||||
pk = pkey;
|
||||
|
||||
if (pk == NULL)
|
||||
return (0);
|
||||
|
||||
switch (pk->type) {
|
||||
switch (EVP_PKEY_id(pk)) {
|
||||
case EVP_PKEY_RSA:
|
||||
ret = EVP_PK_RSA | EVP_PKT_SIGN;
|
||||
/* if (!sign only extension) */
|
||||
@@ -93,15 +44,16 @@ int X509_certificate_type(X509 *x, EVP_PKEY *pkey)
|
||||
case EVP_PKEY_DH:
|
||||
ret = EVP_PK_DH | EVP_PKT_EXCH;
|
||||
break;
|
||||
case NID_id_GostR3410_94:
|
||||
case NID_id_GostR3410_2001:
|
||||
case NID_id_GostR3410_2012_256:
|
||||
case NID_id_GostR3410_2012_512:
|
||||
ret = EVP_PKT_EXCH | EVP_PKT_SIGN;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
i = OBJ_obj2nid(x->sig_alg->algorithm);
|
||||
i = X509_get_signature_nid(x);
|
||||
if (i && OBJ_find_sigid_algs(i, NULL, &i)) {
|
||||
|
||||
switch (i) {
|
||||
@@ -121,7 +73,5 @@ int X509_certificate_type(X509 *x, EVP_PKEY *pkey)
|
||||
}
|
||||
}
|
||||
|
||||
if (pkey == NULL)
|
||||
EVP_PKEY_free(pk);
|
||||
return (ret);
|
||||
}
|
||||
|
||||
@@ -1,159 +1,113 @@
|
||||
/* crypto/x509/x_all.c */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
/*
|
||||
* Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* 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 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 acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS 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 AUTHOR OR 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.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.]
|
||||
* 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/stack.h>
|
||||
#include "cryptlib.h"
|
||||
#include "internal/cryptlib.h"
|
||||
#include <openssl/buffer.h>
|
||||
#include <openssl/asn1.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/x509.h>
|
||||
#include "internal/x509_int.h"
|
||||
#include <openssl/ocsp.h>
|
||||
#ifndef OPENSSL_NO_RSA
|
||||
# include <openssl/rsa.h>
|
||||
#endif
|
||||
#ifndef OPENSSL_NO_DSA
|
||||
# include <openssl/dsa.h>
|
||||
#endif
|
||||
#include <openssl/rsa.h>
|
||||
#include <openssl/dsa.h>
|
||||
#include <openssl/x509v3.h>
|
||||
|
||||
int X509_verify(X509 *a, EVP_PKEY *r)
|
||||
{
|
||||
if (X509_ALGOR_cmp(a->sig_alg, a->cert_info->signature))
|
||||
if (X509_ALGOR_cmp(&a->sig_alg, &a->cert_info.signature))
|
||||
return 0;
|
||||
return (ASN1_item_verify(ASN1_ITEM_rptr(X509_CINF), a->sig_alg,
|
||||
a->signature, a->cert_info, r));
|
||||
return (ASN1_item_verify(ASN1_ITEM_rptr(X509_CINF), &a->sig_alg,
|
||||
&a->signature, &a->cert_info, r));
|
||||
}
|
||||
|
||||
int X509_REQ_verify(X509_REQ *a, EVP_PKEY *r)
|
||||
{
|
||||
return (ASN1_item_verify(ASN1_ITEM_rptr(X509_REQ_INFO),
|
||||
a->sig_alg, a->signature, a->req_info, r));
|
||||
&a->sig_alg, a->signature, &a->req_info, r));
|
||||
}
|
||||
|
||||
int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *a, EVP_PKEY *r)
|
||||
{
|
||||
return (ASN1_item_verify(ASN1_ITEM_rptr(NETSCAPE_SPKAC),
|
||||
a->sig_algor, a->signature, a->spkac, r));
|
||||
&a->sig_algor, a->signature, a->spkac, r));
|
||||
}
|
||||
|
||||
int X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md)
|
||||
{
|
||||
x->cert_info->enc.modified = 1;
|
||||
return (ASN1_item_sign(ASN1_ITEM_rptr(X509_CINF), x->cert_info->signature,
|
||||
x->sig_alg, x->signature, x->cert_info, pkey, md));
|
||||
x->cert_info.enc.modified = 1;
|
||||
return (ASN1_item_sign(ASN1_ITEM_rptr(X509_CINF), &x->cert_info.signature,
|
||||
&x->sig_alg, &x->signature, &x->cert_info, pkey,
|
||||
md));
|
||||
}
|
||||
|
||||
int X509_sign_ctx(X509 *x, EVP_MD_CTX *ctx)
|
||||
{
|
||||
x->cert_info->enc.modified = 1;
|
||||
x->cert_info.enc.modified = 1;
|
||||
return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_CINF),
|
||||
x->cert_info->signature,
|
||||
x->sig_alg, x->signature, x->cert_info, ctx);
|
||||
&x->cert_info.signature,
|
||||
&x->sig_alg, &x->signature, &x->cert_info, ctx);
|
||||
}
|
||||
|
||||
#ifndef OPENSSL_NO_OCSP
|
||||
int X509_http_nbio(OCSP_REQ_CTX *rctx, X509 **pcert)
|
||||
{
|
||||
return OCSP_REQ_CTX_nbio_d2i(rctx,
|
||||
(ASN1_VALUE **)pcert, ASN1_ITEM_rptr(X509));
|
||||
}
|
||||
#endif
|
||||
|
||||
int X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md)
|
||||
{
|
||||
return (ASN1_item_sign(ASN1_ITEM_rptr(X509_REQ_INFO), x->sig_alg, NULL,
|
||||
x->signature, x->req_info, pkey, md));
|
||||
return (ASN1_item_sign(ASN1_ITEM_rptr(X509_REQ_INFO), &x->sig_alg, NULL,
|
||||
x->signature, &x->req_info, pkey, md));
|
||||
}
|
||||
|
||||
int X509_REQ_sign_ctx(X509_REQ *x, EVP_MD_CTX *ctx)
|
||||
{
|
||||
return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_REQ_INFO),
|
||||
x->sig_alg, NULL, x->signature, x->req_info,
|
||||
&x->sig_alg, NULL, x->signature, &x->req_info,
|
||||
ctx);
|
||||
}
|
||||
|
||||
int X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md)
|
||||
{
|
||||
x->crl->enc.modified = 1;
|
||||
return (ASN1_item_sign(ASN1_ITEM_rptr(X509_CRL_INFO), x->crl->sig_alg,
|
||||
x->sig_alg, x->signature, x->crl, pkey, md));
|
||||
x->crl.enc.modified = 1;
|
||||
return (ASN1_item_sign(ASN1_ITEM_rptr(X509_CRL_INFO), &x->crl.sig_alg,
|
||||
&x->sig_alg, &x->signature, &x->crl, pkey, md));
|
||||
}
|
||||
|
||||
int X509_CRL_sign_ctx(X509_CRL *x, EVP_MD_CTX *ctx)
|
||||
{
|
||||
x->crl->enc.modified = 1;
|
||||
x->crl.enc.modified = 1;
|
||||
return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_CRL_INFO),
|
||||
x->crl->sig_alg, x->sig_alg, x->signature,
|
||||
x->crl, ctx);
|
||||
&x->crl.sig_alg, &x->sig_alg, &x->signature,
|
||||
&x->crl, ctx);
|
||||
}
|
||||
|
||||
#ifndef OPENSSL_NO_OCSP
|
||||
int X509_CRL_http_nbio(OCSP_REQ_CTX *rctx, X509_CRL **pcrl)
|
||||
{
|
||||
return OCSP_REQ_CTX_nbio_d2i(rctx,
|
||||
(ASN1_VALUE **)pcrl,
|
||||
ASN1_ITEM_rptr(X509_CRL));
|
||||
}
|
||||
#endif
|
||||
|
||||
int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *x, EVP_PKEY *pkey, const EVP_MD *md)
|
||||
{
|
||||
return (ASN1_item_sign(ASN1_ITEM_rptr(NETSCAPE_SPKAC), x->sig_algor, NULL,
|
||||
return (ASN1_item_sign(ASN1_ITEM_rptr(NETSCAPE_SPKAC), &x->sig_algor, NULL,
|
||||
x->signature, x->spkac, pkey, md));
|
||||
}
|
||||
|
||||
#ifndef OPENSSL_NO_FP_API
|
||||
#ifndef OPENSSL_NO_STDIO
|
||||
X509 *d2i_X509_fp(FILE *fp, X509 **x509)
|
||||
{
|
||||
return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509), fp, x509);
|
||||
@@ -175,7 +129,7 @@ int i2d_X509_bio(BIO *bp, X509 *x509)
|
||||
return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509), bp, x509);
|
||||
}
|
||||
|
||||
#ifndef OPENSSL_NO_FP_API
|
||||
#ifndef OPENSSL_NO_STDIO
|
||||
X509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl)
|
||||
{
|
||||
return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509_CRL), fp, crl);
|
||||
@@ -197,7 +151,7 @@ int i2d_X509_CRL_bio(BIO *bp, X509_CRL *crl)
|
||||
return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509_CRL), bp, crl);
|
||||
}
|
||||
|
||||
#ifndef OPENSSL_NO_FP_API
|
||||
#ifndef OPENSSL_NO_STDIO
|
||||
PKCS7 *d2i_PKCS7_fp(FILE *fp, PKCS7 **p7)
|
||||
{
|
||||
return ASN1_item_d2i_fp(ASN1_ITEM_rptr(PKCS7), fp, p7);
|
||||
@@ -219,7 +173,7 @@ int i2d_PKCS7_bio(BIO *bp, PKCS7 *p7)
|
||||
return ASN1_item_i2d_bio(ASN1_ITEM_rptr(PKCS7), bp, p7);
|
||||
}
|
||||
|
||||
#ifndef OPENSSL_NO_FP_API
|
||||
#ifndef OPENSSL_NO_STDIO
|
||||
X509_REQ *d2i_X509_REQ_fp(FILE *fp, X509_REQ **req)
|
||||
{
|
||||
return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509_REQ), fp, req);
|
||||
@@ -243,7 +197,7 @@ int i2d_X509_REQ_bio(BIO *bp, X509_REQ *req)
|
||||
|
||||
#ifndef OPENSSL_NO_RSA
|
||||
|
||||
# ifndef OPENSSL_NO_FP_API
|
||||
# ifndef OPENSSL_NO_STDIO
|
||||
RSA *d2i_RSAPrivateKey_fp(FILE *fp, RSA **rsa)
|
||||
{
|
||||
return ASN1_item_d2i_fp(ASN1_ITEM_rptr(RSAPrivateKey), fp, rsa);
|
||||
@@ -309,7 +263,7 @@ int i2d_RSA_PUBKEY_bio(BIO *bp, RSA *rsa)
|
||||
#endif
|
||||
|
||||
#ifndef OPENSSL_NO_DSA
|
||||
# ifndef OPENSSL_NO_FP_API
|
||||
# ifndef OPENSSL_NO_STDIO
|
||||
DSA *d2i_DSAPrivateKey_fp(FILE *fp, DSA **dsa)
|
||||
{
|
||||
return ASN1_d2i_fp_of(DSA, DSA_new, d2i_DSAPrivateKey, fp, dsa);
|
||||
@@ -354,7 +308,7 @@ int i2d_DSA_PUBKEY_bio(BIO *bp, DSA *dsa)
|
||||
#endif
|
||||
|
||||
#ifndef OPENSSL_NO_EC
|
||||
# ifndef OPENSSL_NO_FP_API
|
||||
# ifndef OPENSSL_NO_STDIO
|
||||
EC_KEY *d2i_EC_PUBKEY_fp(FILE *fp, EC_KEY **eckey)
|
||||
{
|
||||
return ASN1_d2i_fp_of(EC_KEY, EC_KEY_new, d2i_EC_PUBKEY, fp, eckey);
|
||||
@@ -409,6 +363,13 @@ int X509_pubkey_digest(const X509 *data, const EVP_MD *type,
|
||||
int X509_digest(const X509 *data, const EVP_MD *type, unsigned char *md,
|
||||
unsigned int *len)
|
||||
{
|
||||
if (type == EVP_sha1() && (data->ex_flags & EXFLAG_SET) != 0) {
|
||||
/* Asking for SHA1 and we already computed it. */
|
||||
if (len != NULL)
|
||||
*len = sizeof(data->sha1_hash);
|
||||
memcpy(md, data->sha1_hash, sizeof(data->sha1_hash));
|
||||
return 1;
|
||||
}
|
||||
return (ASN1_item_digest
|
||||
(ASN1_ITEM_rptr(X509), type, (char *)data, md, len));
|
||||
}
|
||||
@@ -416,6 +377,13 @@ int X509_digest(const X509 *data, const EVP_MD *type, unsigned char *md,
|
||||
int X509_CRL_digest(const X509_CRL *data, const EVP_MD *type,
|
||||
unsigned char *md, unsigned int *len)
|
||||
{
|
||||
if (type == EVP_sha1()) {
|
||||
/* Asking for SHA1; always computed in CRL d2i. */
|
||||
if (len != NULL)
|
||||
*len = sizeof(data->sha1_hash);
|
||||
memcpy(md, data->sha1_hash, sizeof(data->sha1_hash));
|
||||
return 1;
|
||||
}
|
||||
return (ASN1_item_digest
|
||||
(ASN1_ITEM_rptr(X509_CRL), type, (char *)data, md, len));
|
||||
}
|
||||
@@ -442,7 +410,7 @@ int PKCS7_ISSUER_AND_SERIAL_digest(PKCS7_ISSUER_AND_SERIAL *data,
|
||||
(char *)data, md, len));
|
||||
}
|
||||
|
||||
#ifndef OPENSSL_NO_FP_API
|
||||
#ifndef OPENSSL_NO_STDIO
|
||||
X509_SIG *d2i_PKCS8_fp(FILE *fp, X509_SIG **p8)
|
||||
{
|
||||
return ASN1_d2i_fp_of(X509_SIG, X509_SIG_new, d2i_X509_SIG, fp, p8);
|
||||
@@ -464,7 +432,7 @@ int i2d_PKCS8_bio(BIO *bp, X509_SIG *p8)
|
||||
return ASN1_i2d_bio_of(X509_SIG, i2d_X509_SIG, bp, p8);
|
||||
}
|
||||
|
||||
#ifndef OPENSSL_NO_FP_API
|
||||
#ifndef OPENSSL_NO_STDIO
|
||||
PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_fp(FILE *fp,
|
||||
PKCS8_PRIV_KEY_INFO **p8inf)
|
||||
{
|
||||
|
||||
55
crypto/x509/x_attrib.c
Normal file
55
crypto/x509/x_attrib.c
Normal file
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Copyright 1995-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/objects.h>
|
||||
#include <openssl/asn1t.h>
|
||||
#include <openssl/x509.h>
|
||||
#include "x509_lcl.h"
|
||||
|
||||
/*-
|
||||
* X509_ATTRIBUTE: this has the following form:
|
||||
*
|
||||
* typedef struct x509_attributes_st
|
||||
* {
|
||||
* ASN1_OBJECT *object;
|
||||
* STACK_OF(ASN1_TYPE) *set;
|
||||
* } X509_ATTRIBUTE;
|
||||
*
|
||||
*/
|
||||
|
||||
ASN1_SEQUENCE(X509_ATTRIBUTE) = {
|
||||
ASN1_SIMPLE(X509_ATTRIBUTE, object, ASN1_OBJECT),
|
||||
ASN1_SET_OF(X509_ATTRIBUTE, set, ASN1_ANY)
|
||||
} ASN1_SEQUENCE_END(X509_ATTRIBUTE)
|
||||
|
||||
IMPLEMENT_ASN1_FUNCTIONS(X509_ATTRIBUTE)
|
||||
IMPLEMENT_ASN1_DUP_FUNCTION(X509_ATTRIBUTE)
|
||||
|
||||
X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int atrtype, void *value)
|
||||
{
|
||||
X509_ATTRIBUTE *ret = NULL;
|
||||
ASN1_TYPE *val = NULL;
|
||||
|
||||
if ((ret = X509_ATTRIBUTE_new()) == NULL)
|
||||
return (NULL);
|
||||
ret->object = OBJ_nid2obj(nid);
|
||||
if ((val = ASN1_TYPE_new()) == NULL)
|
||||
goto err;
|
||||
if (!sk_ASN1_TYPE_push(ret->set, val))
|
||||
goto err;
|
||||
|
||||
ASN1_TYPE_set(val, atrtype, value);
|
||||
return (ret);
|
||||
err:
|
||||
X509_ATTRIBUTE_free(ret);
|
||||
ASN1_TYPE_free(val);
|
||||
return (NULL);
|
||||
}
|
||||
457
crypto/x509/x_crl.c
Normal file
457
crypto/x509/x_crl.c
Normal file
@@ -0,0 +1,457 @@
|
||||
/*
|
||||
* Copyright 1995-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/asn1t.h>
|
||||
#include <openssl/x509.h>
|
||||
#include "internal/x509_int.h"
|
||||
#include <openssl/x509v3.h>
|
||||
#include "x509_lcl.h"
|
||||
|
||||
static int X509_REVOKED_cmp(const X509_REVOKED *const *a,
|
||||
const X509_REVOKED *const *b);
|
||||
static void setup_idp(X509_CRL *crl, ISSUING_DIST_POINT *idp);
|
||||
|
||||
ASN1_SEQUENCE(X509_REVOKED) = {
|
||||
ASN1_EMBED(X509_REVOKED,serialNumber, ASN1_INTEGER),
|
||||
ASN1_SIMPLE(X509_REVOKED,revocationDate, ASN1_TIME),
|
||||
ASN1_SEQUENCE_OF_OPT(X509_REVOKED,extensions, X509_EXTENSION)
|
||||
} ASN1_SEQUENCE_END(X509_REVOKED)
|
||||
|
||||
static int def_crl_verify(X509_CRL *crl, EVP_PKEY *r);
|
||||
static int def_crl_lookup(X509_CRL *crl,
|
||||
X509_REVOKED **ret, ASN1_INTEGER *serial,
|
||||
X509_NAME *issuer);
|
||||
|
||||
static X509_CRL_METHOD int_crl_meth = {
|
||||
0,
|
||||
0, 0,
|
||||
def_crl_lookup,
|
||||
def_crl_verify
|
||||
};
|
||||
|
||||
static const X509_CRL_METHOD *default_crl_method = &int_crl_meth;
|
||||
|
||||
/*
|
||||
* The X509_CRL_INFO structure needs a bit of customisation. Since we cache
|
||||
* the original encoding the signature won't be affected by reordering of the
|
||||
* revoked field.
|
||||
*/
|
||||
static int crl_inf_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
|
||||
void *exarg)
|
||||
{
|
||||
X509_CRL_INFO *a = (X509_CRL_INFO *)*pval;
|
||||
|
||||
if (!a || !a->revoked)
|
||||
return 1;
|
||||
switch (operation) {
|
||||
/*
|
||||
* Just set cmp function here. We don't sort because that would
|
||||
* affect the output of X509_CRL_print().
|
||||
*/
|
||||
case ASN1_OP_D2I_POST:
|
||||
(void)sk_X509_REVOKED_set_cmp_func(a->revoked, X509_REVOKED_cmp);
|
||||
break;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
ASN1_SEQUENCE_enc(X509_CRL_INFO, enc, crl_inf_cb) = {
|
||||
ASN1_OPT(X509_CRL_INFO, version, ASN1_INTEGER),
|
||||
ASN1_EMBED(X509_CRL_INFO, sig_alg, X509_ALGOR),
|
||||
ASN1_SIMPLE(X509_CRL_INFO, issuer, X509_NAME),
|
||||
ASN1_SIMPLE(X509_CRL_INFO, lastUpdate, ASN1_TIME),
|
||||
ASN1_OPT(X509_CRL_INFO, nextUpdate, ASN1_TIME),
|
||||
ASN1_SEQUENCE_OF_OPT(X509_CRL_INFO, revoked, X509_REVOKED),
|
||||
ASN1_EXP_SEQUENCE_OF_OPT(X509_CRL_INFO, extensions, X509_EXTENSION, 0)
|
||||
} ASN1_SEQUENCE_END_enc(X509_CRL_INFO, X509_CRL_INFO)
|
||||
|
||||
/*
|
||||
* Set CRL entry issuer according to CRL certificate issuer extension. Check
|
||||
* for unhandled critical CRL entry extensions.
|
||||
*/
|
||||
|
||||
static int crl_set_issuers(X509_CRL *crl)
|
||||
{
|
||||
|
||||
int i, j;
|
||||
GENERAL_NAMES *gens, *gtmp;
|
||||
STACK_OF(X509_REVOKED) *revoked;
|
||||
|
||||
revoked = X509_CRL_get_REVOKED(crl);
|
||||
|
||||
gens = NULL;
|
||||
for (i = 0; i < sk_X509_REVOKED_num(revoked); i++) {
|
||||
X509_REVOKED *rev = sk_X509_REVOKED_value(revoked, i);
|
||||
STACK_OF(X509_EXTENSION) *exts;
|
||||
ASN1_ENUMERATED *reason;
|
||||
X509_EXTENSION *ext;
|
||||
gtmp = X509_REVOKED_get_ext_d2i(rev,
|
||||
NID_certificate_issuer, &j, NULL);
|
||||
if (!gtmp && (j != -1)) {
|
||||
crl->flags |= EXFLAG_INVALID;
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (gtmp) {
|
||||
gens = gtmp;
|
||||
if (!crl->issuers) {
|
||||
crl->issuers = sk_GENERAL_NAMES_new_null();
|
||||
if (!crl->issuers)
|
||||
return 0;
|
||||
}
|
||||
if (!sk_GENERAL_NAMES_push(crl->issuers, gtmp))
|
||||
return 0;
|
||||
}
|
||||
rev->issuer = gens;
|
||||
|
||||
reason = X509_REVOKED_get_ext_d2i(rev, NID_crl_reason, &j, NULL);
|
||||
if (!reason && (j != -1)) {
|
||||
crl->flags |= EXFLAG_INVALID;
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (reason) {
|
||||
rev->reason = ASN1_ENUMERATED_get(reason);
|
||||
ASN1_ENUMERATED_free(reason);
|
||||
} else
|
||||
rev->reason = CRL_REASON_NONE;
|
||||
|
||||
/* Check for critical CRL entry extensions */
|
||||
|
||||
exts = rev->extensions;
|
||||
|
||||
for (j = 0; j < sk_X509_EXTENSION_num(exts); j++) {
|
||||
ext = sk_X509_EXTENSION_value(exts, j);
|
||||
if (X509_EXTENSION_get_critical(ext)) {
|
||||
if (OBJ_obj2nid(X509_EXTENSION_get_object(ext)) == NID_certificate_issuer)
|
||||
continue;
|
||||
crl->flags |= EXFLAG_CRITICAL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return 1;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* The X509_CRL structure needs a bit of customisation. Cache some extensions
|
||||
* and hash of the whole CRL.
|
||||
*/
|
||||
static int crl_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
|
||||
void *exarg)
|
||||
{
|
||||
X509_CRL *crl = (X509_CRL *)*pval;
|
||||
STACK_OF(X509_EXTENSION) *exts;
|
||||
X509_EXTENSION *ext;
|
||||
int idx;
|
||||
|
||||
switch (operation) {
|
||||
case ASN1_OP_NEW_POST:
|
||||
crl->idp = NULL;
|
||||
crl->akid = NULL;
|
||||
crl->flags = 0;
|
||||
crl->idp_flags = 0;
|
||||
crl->idp_reasons = CRLDP_ALL_REASONS;
|
||||
crl->meth = default_crl_method;
|
||||
crl->meth_data = NULL;
|
||||
crl->issuers = NULL;
|
||||
crl->crl_number = NULL;
|
||||
crl->base_crl_number = NULL;
|
||||
break;
|
||||
|
||||
case ASN1_OP_D2I_POST:
|
||||
X509_CRL_digest(crl, EVP_sha1(), crl->sha1_hash, NULL);
|
||||
crl->idp = X509_CRL_get_ext_d2i(crl,
|
||||
NID_issuing_distribution_point, NULL,
|
||||
NULL);
|
||||
if (crl->idp)
|
||||
setup_idp(crl, crl->idp);
|
||||
|
||||
crl->akid = X509_CRL_get_ext_d2i(crl,
|
||||
NID_authority_key_identifier, NULL,
|
||||
NULL);
|
||||
|
||||
crl->crl_number = X509_CRL_get_ext_d2i(crl,
|
||||
NID_crl_number, NULL, NULL);
|
||||
|
||||
crl->base_crl_number = X509_CRL_get_ext_d2i(crl,
|
||||
NID_delta_crl, NULL,
|
||||
NULL);
|
||||
/* Delta CRLs must have CRL number */
|
||||
if (crl->base_crl_number && !crl->crl_number)
|
||||
crl->flags |= EXFLAG_INVALID;
|
||||
|
||||
/*
|
||||
* See if we have any unhandled critical CRL extensions and indicate
|
||||
* this in a flag. We only currently handle IDP so anything else
|
||||
* critical sets the flag. This code accesses the X509_CRL structure
|
||||
* directly: applications shouldn't do this.
|
||||
*/
|
||||
|
||||
exts = crl->crl.extensions;
|
||||
|
||||
for (idx = 0; idx < sk_X509_EXTENSION_num(exts); idx++) {
|
||||
int nid;
|
||||
ext = sk_X509_EXTENSION_value(exts, idx);
|
||||
nid = OBJ_obj2nid(X509_EXTENSION_get_object(ext));
|
||||
if (nid == NID_freshest_crl)
|
||||
crl->flags |= EXFLAG_FRESHEST;
|
||||
if (X509_EXTENSION_get_critical(ext)) {
|
||||
/* We handle IDP and deltas */
|
||||
if ((nid == NID_issuing_distribution_point)
|
||||
|| (nid == NID_authority_key_identifier)
|
||||
|| (nid == NID_delta_crl))
|
||||
continue;
|
||||
crl->flags |= EXFLAG_CRITICAL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!crl_set_issuers(crl))
|
||||
return 0;
|
||||
|
||||
if (crl->meth->crl_init) {
|
||||
if (crl->meth->crl_init(crl) == 0)
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case ASN1_OP_FREE_POST:
|
||||
if (crl->meth->crl_free) {
|
||||
if (!crl->meth->crl_free(crl))
|
||||
return 0;
|
||||
}
|
||||
AUTHORITY_KEYID_free(crl->akid);
|
||||
ISSUING_DIST_POINT_free(crl->idp);
|
||||
ASN1_INTEGER_free(crl->crl_number);
|
||||
ASN1_INTEGER_free(crl->base_crl_number);
|
||||
sk_GENERAL_NAMES_pop_free(crl->issuers, GENERAL_NAMES_free);
|
||||
break;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Convert IDP into a more convenient form */
|
||||
|
||||
static void setup_idp(X509_CRL *crl, ISSUING_DIST_POINT *idp)
|
||||
{
|
||||
int idp_only = 0;
|
||||
/* Set various flags according to IDP */
|
||||
crl->idp_flags |= IDP_PRESENT;
|
||||
if (idp->onlyuser > 0) {
|
||||
idp_only++;
|
||||
crl->idp_flags |= IDP_ONLYUSER;
|
||||
}
|
||||
if (idp->onlyCA > 0) {
|
||||
idp_only++;
|
||||
crl->idp_flags |= IDP_ONLYCA;
|
||||
}
|
||||
if (idp->onlyattr > 0) {
|
||||
idp_only++;
|
||||
crl->idp_flags |= IDP_ONLYATTR;
|
||||
}
|
||||
|
||||
if (idp_only > 1)
|
||||
crl->idp_flags |= IDP_INVALID;
|
||||
|
||||
if (idp->indirectCRL > 0)
|
||||
crl->idp_flags |= IDP_INDIRECT;
|
||||
|
||||
if (idp->onlysomereasons) {
|
||||
crl->idp_flags |= IDP_REASONS;
|
||||
if (idp->onlysomereasons->length > 0)
|
||||
crl->idp_reasons = idp->onlysomereasons->data[0];
|
||||
if (idp->onlysomereasons->length > 1)
|
||||
crl->idp_reasons |= (idp->onlysomereasons->data[1] << 8);
|
||||
crl->idp_reasons &= CRLDP_ALL_REASONS;
|
||||
}
|
||||
|
||||
DIST_POINT_set_dpname(idp->distpoint, X509_CRL_get_issuer(crl));
|
||||
}
|
||||
|
||||
ASN1_SEQUENCE_ref(X509_CRL, crl_cb) = {
|
||||
ASN1_EMBED(X509_CRL, crl, X509_CRL_INFO),
|
||||
ASN1_EMBED(X509_CRL, sig_alg, X509_ALGOR),
|
||||
ASN1_EMBED(X509_CRL, signature, ASN1_BIT_STRING)
|
||||
} ASN1_SEQUENCE_END_ref(X509_CRL, X509_CRL)
|
||||
|
||||
IMPLEMENT_ASN1_FUNCTIONS(X509_REVOKED)
|
||||
|
||||
IMPLEMENT_ASN1_DUP_FUNCTION(X509_REVOKED)
|
||||
|
||||
IMPLEMENT_ASN1_FUNCTIONS(X509_CRL_INFO)
|
||||
|
||||
IMPLEMENT_ASN1_FUNCTIONS(X509_CRL)
|
||||
|
||||
IMPLEMENT_ASN1_DUP_FUNCTION(X509_CRL)
|
||||
|
||||
static int X509_REVOKED_cmp(const X509_REVOKED *const *a,
|
||||
const X509_REVOKED *const *b)
|
||||
{
|
||||
return (ASN1_STRING_cmp((ASN1_STRING *)&(*a)->serialNumber,
|
||||
(ASN1_STRING *)&(*b)->serialNumber));
|
||||
}
|
||||
|
||||
int X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev)
|
||||
{
|
||||
X509_CRL_INFO *inf;
|
||||
inf = &crl->crl;
|
||||
if (inf->revoked == NULL)
|
||||
inf->revoked = sk_X509_REVOKED_new(X509_REVOKED_cmp);
|
||||
if (inf->revoked == NULL || !sk_X509_REVOKED_push(inf->revoked, rev)) {
|
||||
ASN1err(ASN1_F_X509_CRL_ADD0_REVOKED, ERR_R_MALLOC_FAILURE);
|
||||
return 0;
|
||||
}
|
||||
inf->enc.modified = 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int X509_CRL_verify(X509_CRL *crl, EVP_PKEY *r)
|
||||
{
|
||||
if (crl->meth->crl_verify)
|
||||
return crl->meth->crl_verify(crl, r);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int X509_CRL_get0_by_serial(X509_CRL *crl,
|
||||
X509_REVOKED **ret, ASN1_INTEGER *serial)
|
||||
{
|
||||
if (crl->meth->crl_lookup)
|
||||
return crl->meth->crl_lookup(crl, ret, serial, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int X509_CRL_get0_by_cert(X509_CRL *crl, X509_REVOKED **ret, X509 *x)
|
||||
{
|
||||
if (crl->meth->crl_lookup)
|
||||
return crl->meth->crl_lookup(crl, ret,
|
||||
X509_get_serialNumber(x),
|
||||
X509_get_issuer_name(x));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int def_crl_verify(X509_CRL *crl, EVP_PKEY *r)
|
||||
{
|
||||
return (ASN1_item_verify(ASN1_ITEM_rptr(X509_CRL_INFO),
|
||||
&crl->sig_alg, &crl->signature, &crl->crl, r));
|
||||
}
|
||||
|
||||
static int crl_revoked_issuer_match(X509_CRL *crl, X509_NAME *nm,
|
||||
X509_REVOKED *rev)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!rev->issuer) {
|
||||
if (!nm)
|
||||
return 1;
|
||||
if (!X509_NAME_cmp(nm, X509_CRL_get_issuer(crl)))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!nm)
|
||||
nm = X509_CRL_get_issuer(crl);
|
||||
|
||||
for (i = 0; i < sk_GENERAL_NAME_num(rev->issuer); i++) {
|
||||
GENERAL_NAME *gen = sk_GENERAL_NAME_value(rev->issuer, i);
|
||||
if (gen->type != GEN_DIRNAME)
|
||||
continue;
|
||||
if (!X509_NAME_cmp(nm, gen->d.directoryName))
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
static int def_crl_lookup(X509_CRL *crl,
|
||||
X509_REVOKED **ret, ASN1_INTEGER *serial,
|
||||
X509_NAME *issuer)
|
||||
{
|
||||
X509_REVOKED rtmp, *rev;
|
||||
int idx;
|
||||
rtmp.serialNumber = *serial;
|
||||
/*
|
||||
* Sort revoked into serial number order if not already sorted. Do this
|
||||
* under a lock to avoid race condition.
|
||||
*/
|
||||
if (!sk_X509_REVOKED_is_sorted(crl->crl.revoked)) {
|
||||
CRYPTO_THREAD_write_lock(crl->lock);
|
||||
sk_X509_REVOKED_sort(crl->crl.revoked);
|
||||
CRYPTO_THREAD_unlock(crl->lock);
|
||||
}
|
||||
idx = sk_X509_REVOKED_find(crl->crl.revoked, &rtmp);
|
||||
if (idx < 0)
|
||||
return 0;
|
||||
/* Need to look for matching name */
|
||||
for (; idx < sk_X509_REVOKED_num(crl->crl.revoked); idx++) {
|
||||
rev = sk_X509_REVOKED_value(crl->crl.revoked, idx);
|
||||
if (ASN1_INTEGER_cmp(&rev->serialNumber, serial))
|
||||
return 0;
|
||||
if (crl_revoked_issuer_match(crl, issuer, rev)) {
|
||||
if (ret)
|
||||
*ret = rev;
|
||||
if (rev->reason == CRL_REASON_REMOVE_FROM_CRL)
|
||||
return 2;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void X509_CRL_set_default_method(const X509_CRL_METHOD *meth)
|
||||
{
|
||||
if (meth == NULL)
|
||||
default_crl_method = &int_crl_meth;
|
||||
else
|
||||
default_crl_method = meth;
|
||||
}
|
||||
|
||||
X509_CRL_METHOD *X509_CRL_METHOD_new(int (*crl_init) (X509_CRL *crl),
|
||||
int (*crl_free) (X509_CRL *crl),
|
||||
int (*crl_lookup) (X509_CRL *crl,
|
||||
X509_REVOKED **ret,
|
||||
ASN1_INTEGER *ser,
|
||||
X509_NAME *issuer),
|
||||
int (*crl_verify) (X509_CRL *crl,
|
||||
EVP_PKEY *pk))
|
||||
{
|
||||
X509_CRL_METHOD *m;
|
||||
m = OPENSSL_malloc(sizeof(*m));
|
||||
if (m == NULL)
|
||||
return NULL;
|
||||
m->crl_init = crl_init;
|
||||
m->crl_free = crl_free;
|
||||
m->crl_lookup = crl_lookup;
|
||||
m->crl_verify = crl_verify;
|
||||
m->flags = X509_CRL_METHOD_DYNAMIC;
|
||||
return m;
|
||||
}
|
||||
|
||||
void X509_CRL_METHOD_free(X509_CRL_METHOD *m)
|
||||
{
|
||||
if (m == NULL || !(m->flags & X509_CRL_METHOD_DYNAMIC))
|
||||
return;
|
||||
OPENSSL_free(m);
|
||||
}
|
||||
|
||||
void X509_CRL_set_meth_data(X509_CRL *crl, void *dat)
|
||||
{
|
||||
crl->meth_data = dat;
|
||||
}
|
||||
|
||||
void *X509_CRL_get_meth_data(X509_CRL *crl)
|
||||
{
|
||||
return crl->meth_data;
|
||||
}
|
||||
28
crypto/x509/x_exten.c
Normal file
28
crypto/x509/x_exten.c
Normal file
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* Copyright 2000-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 <stddef.h>
|
||||
#include <openssl/x509.h>
|
||||
#include <openssl/asn1.h>
|
||||
#include <openssl/asn1t.h>
|
||||
#include "x509_lcl.h"
|
||||
|
||||
ASN1_SEQUENCE(X509_EXTENSION) = {
|
||||
ASN1_SIMPLE(X509_EXTENSION, object, ASN1_OBJECT),
|
||||
ASN1_OPT(X509_EXTENSION, critical, ASN1_BOOLEAN),
|
||||
ASN1_EMBED(X509_EXTENSION, value, ASN1_OCTET_STRING)
|
||||
} ASN1_SEQUENCE_END(X509_EXTENSION)
|
||||
|
||||
ASN1_ITEM_TEMPLATE(X509_EXTENSIONS) =
|
||||
ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, Extension, X509_EXTENSION)
|
||||
ASN1_ITEM_TEMPLATE_END(X509_EXTENSIONS)
|
||||
|
||||
IMPLEMENT_ASN1_FUNCTIONS(X509_EXTENSION)
|
||||
IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(X509_EXTENSIONS, X509_EXTENSIONS, X509_EXTENSIONS)
|
||||
IMPLEMENT_ASN1_DUP_FUNCTION(X509_EXTENSION)
|
||||
567
crypto/x509/x_name.c
Normal file
567
crypto/x509/x_name.c
Normal file
@@ -0,0 +1,567 @@
|
||||
/*
|
||||
* Copyright 1995-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 <ctype.h>
|
||||
#include "internal/cryptlib.h"
|
||||
#include <openssl/asn1t.h>
|
||||
#include <openssl/x509.h>
|
||||
#include "internal/x509_int.h"
|
||||
#include "internal/asn1_int.h"
|
||||
#include "x509_lcl.h"
|
||||
|
||||
/*
|
||||
* Maximum length of X509_NAME: much larger than anything we should
|
||||
* ever see in practice.
|
||||
*/
|
||||
|
||||
#define X509_NAME_MAX (1024 * 1024)
|
||||
|
||||
static int x509_name_ex_d2i(ASN1_VALUE **val,
|
||||
const unsigned char **in, long len,
|
||||
const ASN1_ITEM *it,
|
||||
int tag, int aclass, char opt, ASN1_TLC *ctx);
|
||||
|
||||
static int x509_name_ex_i2d(ASN1_VALUE **val, unsigned char **out,
|
||||
const ASN1_ITEM *it, int tag, int aclass);
|
||||
static int x509_name_ex_new(ASN1_VALUE **val, const ASN1_ITEM *it);
|
||||
static void x509_name_ex_free(ASN1_VALUE **val, const ASN1_ITEM *it);
|
||||
|
||||
static int x509_name_encode(X509_NAME *a);
|
||||
static int x509_name_canon(X509_NAME *a);
|
||||
static int asn1_string_canon(ASN1_STRING *out, const ASN1_STRING *in);
|
||||
static int i2d_name_canon(STACK_OF(STACK_OF_X509_NAME_ENTRY) * intname,
|
||||
unsigned char **in);
|
||||
|
||||
static int x509_name_ex_print(BIO *out, ASN1_VALUE **pval,
|
||||
int indent,
|
||||
const char *fname, const ASN1_PCTX *pctx);
|
||||
|
||||
ASN1_SEQUENCE(X509_NAME_ENTRY) = {
|
||||
ASN1_SIMPLE(X509_NAME_ENTRY, object, ASN1_OBJECT),
|
||||
ASN1_SIMPLE(X509_NAME_ENTRY, value, ASN1_PRINTABLE)
|
||||
} ASN1_SEQUENCE_END(X509_NAME_ENTRY)
|
||||
|
||||
IMPLEMENT_ASN1_FUNCTIONS(X509_NAME_ENTRY)
|
||||
IMPLEMENT_ASN1_DUP_FUNCTION(X509_NAME_ENTRY)
|
||||
|
||||
/*
|
||||
* For the "Name" type we need a SEQUENCE OF { SET OF X509_NAME_ENTRY } so
|
||||
* declare two template wrappers for this
|
||||
*/
|
||||
|
||||
ASN1_ITEM_TEMPLATE(X509_NAME_ENTRIES) =
|
||||
ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SET_OF, 0, RDNS, X509_NAME_ENTRY)
|
||||
static_ASN1_ITEM_TEMPLATE_END(X509_NAME_ENTRIES)
|
||||
|
||||
ASN1_ITEM_TEMPLATE(X509_NAME_INTERNAL) =
|
||||
ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, Name, X509_NAME_ENTRIES)
|
||||
static_ASN1_ITEM_TEMPLATE_END(X509_NAME_INTERNAL)
|
||||
|
||||
/*
|
||||
* Normally that's where it would end: we'd have two nested STACK structures
|
||||
* representing the ASN1. Unfortunately X509_NAME uses a completely different
|
||||
* form and caches encodings so we have to process the internal form and
|
||||
* convert to the external form.
|
||||
*/
|
||||
|
||||
static const ASN1_EXTERN_FUNCS x509_name_ff = {
|
||||
NULL,
|
||||
x509_name_ex_new,
|
||||
x509_name_ex_free,
|
||||
0, /* Default clear behaviour is OK */
|
||||
x509_name_ex_d2i,
|
||||
x509_name_ex_i2d,
|
||||
x509_name_ex_print
|
||||
};
|
||||
|
||||
IMPLEMENT_EXTERN_ASN1(X509_NAME, V_ASN1_SEQUENCE, x509_name_ff)
|
||||
|
||||
IMPLEMENT_ASN1_FUNCTIONS(X509_NAME)
|
||||
|
||||
IMPLEMENT_ASN1_DUP_FUNCTION(X509_NAME)
|
||||
|
||||
static int x509_name_ex_new(ASN1_VALUE **val, const ASN1_ITEM *it)
|
||||
{
|
||||
X509_NAME *ret = OPENSSL_zalloc(sizeof(*ret));
|
||||
|
||||
if (ret == NULL)
|
||||
goto memerr;
|
||||
if ((ret->entries = sk_X509_NAME_ENTRY_new_null()) == NULL)
|
||||
goto memerr;
|
||||
if ((ret->bytes = BUF_MEM_new()) == NULL)
|
||||
goto memerr;
|
||||
ret->modified = 1;
|
||||
*val = (ASN1_VALUE *)ret;
|
||||
return 1;
|
||||
|
||||
memerr:
|
||||
ASN1err(ASN1_F_X509_NAME_EX_NEW, ERR_R_MALLOC_FAILURE);
|
||||
if (ret) {
|
||||
sk_X509_NAME_ENTRY_free(ret->entries);
|
||||
OPENSSL_free(ret);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void x509_name_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it)
|
||||
{
|
||||
X509_NAME *a;
|
||||
|
||||
if (!pval || !*pval)
|
||||
return;
|
||||
a = (X509_NAME *)*pval;
|
||||
|
||||
BUF_MEM_free(a->bytes);
|
||||
sk_X509_NAME_ENTRY_pop_free(a->entries, X509_NAME_ENTRY_free);
|
||||
OPENSSL_free(a->canon_enc);
|
||||
OPENSSL_free(a);
|
||||
*pval = NULL;
|
||||
}
|
||||
|
||||
static void name_entry_stack_free(STACK_OF(X509_NAME_ENTRY) *ents)
|
||||
{
|
||||
sk_X509_NAME_ENTRY_pop_free(ents, X509_NAME_ENTRY_free);
|
||||
}
|
||||
|
||||
static int x509_name_ex_d2i(ASN1_VALUE **val,
|
||||
const unsigned char **in, long len,
|
||||
const ASN1_ITEM *it, int tag, int aclass,
|
||||
char opt, ASN1_TLC *ctx)
|
||||
{
|
||||
const unsigned char *p = *in, *q;
|
||||
union {
|
||||
STACK_OF(STACK_OF_X509_NAME_ENTRY) *s;
|
||||
ASN1_VALUE *a;
|
||||
} intname = {
|
||||
NULL
|
||||
};
|
||||
union {
|
||||
X509_NAME *x;
|
||||
ASN1_VALUE *a;
|
||||
} nm = {
|
||||
NULL
|
||||
};
|
||||
int i, j, ret;
|
||||
STACK_OF(X509_NAME_ENTRY) *entries;
|
||||
X509_NAME_ENTRY *entry;
|
||||
if (len > X509_NAME_MAX)
|
||||
len = X509_NAME_MAX;
|
||||
q = p;
|
||||
|
||||
/* Get internal representation of Name */
|
||||
ret = ASN1_item_ex_d2i(&intname.a,
|
||||
&p, len, ASN1_ITEM_rptr(X509_NAME_INTERNAL),
|
||||
tag, aclass, opt, ctx);
|
||||
|
||||
if (ret <= 0)
|
||||
return ret;
|
||||
|
||||
if (*val)
|
||||
x509_name_ex_free(val, NULL);
|
||||
if (!x509_name_ex_new(&nm.a, NULL))
|
||||
goto err;
|
||||
/* We've decoded it: now cache encoding */
|
||||
if (!BUF_MEM_grow(nm.x->bytes, p - q))
|
||||
goto err;
|
||||
memcpy(nm.x->bytes->data, q, p - q);
|
||||
|
||||
/* Convert internal representation to X509_NAME structure */
|
||||
for (i = 0; i < sk_STACK_OF_X509_NAME_ENTRY_num(intname.s); i++) {
|
||||
entries = sk_STACK_OF_X509_NAME_ENTRY_value(intname.s, i);
|
||||
for (j = 0; j < sk_X509_NAME_ENTRY_num(entries); j++) {
|
||||
entry = sk_X509_NAME_ENTRY_value(entries, j);
|
||||
entry->set = i;
|
||||
if (!sk_X509_NAME_ENTRY_push(nm.x->entries, entry))
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* All entries have now been pushed to nm->x.entries
|
||||
* free up the stacks in intname.s but not the entries
|
||||
* themselves.
|
||||
*/
|
||||
sk_STACK_OF_X509_NAME_ENTRY_pop_free(intname.s, sk_X509_NAME_ENTRY_free);
|
||||
intname.s = NULL;
|
||||
ret = x509_name_canon(nm.x);
|
||||
if (!ret)
|
||||
goto err;
|
||||
nm.x->modified = 0;
|
||||
*val = nm.a;
|
||||
*in = p;
|
||||
return ret;
|
||||
|
||||
err:
|
||||
/* If intname.s is not NULL only some entries exist in nm->x.entries:
|
||||
* zero references in nm->x.entries list. Since all entries exist
|
||||
* in intname.s we can free them all there
|
||||
*/
|
||||
if (intname.s != NULL) {
|
||||
sk_X509_NAME_ENTRY_zero(nm.x->entries);
|
||||
sk_STACK_OF_X509_NAME_ENTRY_pop_free(intname.s, name_entry_stack_free);
|
||||
}
|
||||
X509_NAME_free(nm.x);
|
||||
ASN1err(ASN1_F_X509_NAME_EX_D2I, ERR_R_NESTED_ASN1_ERROR);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int x509_name_ex_i2d(ASN1_VALUE **val, unsigned char **out,
|
||||
const ASN1_ITEM *it, int tag, int aclass)
|
||||
{
|
||||
int ret;
|
||||
X509_NAME *a = (X509_NAME *)*val;
|
||||
if (a->modified) {
|
||||
ret = x509_name_encode(a);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
ret = x509_name_canon(a);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
ret = a->bytes->length;
|
||||
if (out != NULL) {
|
||||
memcpy(*out, a->bytes->data, ret);
|
||||
*out += ret;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void local_sk_X509_NAME_ENTRY_free(STACK_OF(X509_NAME_ENTRY) *ne)
|
||||
{
|
||||
sk_X509_NAME_ENTRY_free(ne);
|
||||
}
|
||||
|
||||
static void local_sk_X509_NAME_ENTRY_pop_free(STACK_OF(X509_NAME_ENTRY) *ne)
|
||||
{
|
||||
sk_X509_NAME_ENTRY_pop_free(ne, X509_NAME_ENTRY_free);
|
||||
}
|
||||
|
||||
static int x509_name_encode(X509_NAME *a)
|
||||
{
|
||||
union {
|
||||
STACK_OF(STACK_OF_X509_NAME_ENTRY) *s;
|
||||
ASN1_VALUE *a;
|
||||
} intname = {
|
||||
NULL
|
||||
};
|
||||
int len;
|
||||
unsigned char *p;
|
||||
STACK_OF(X509_NAME_ENTRY) *entries = NULL;
|
||||
X509_NAME_ENTRY *entry;
|
||||
int i, set = -1;
|
||||
intname.s = sk_STACK_OF_X509_NAME_ENTRY_new_null();
|
||||
if (!intname.s)
|
||||
goto memerr;
|
||||
for (i = 0; i < sk_X509_NAME_ENTRY_num(a->entries); i++) {
|
||||
entry = sk_X509_NAME_ENTRY_value(a->entries, i);
|
||||
if (entry->set != set) {
|
||||
entries = sk_X509_NAME_ENTRY_new_null();
|
||||
if (!entries)
|
||||
goto memerr;
|
||||
if (!sk_STACK_OF_X509_NAME_ENTRY_push(intname.s, entries))
|
||||
goto memerr;
|
||||
set = entry->set;
|
||||
}
|
||||
if (!sk_X509_NAME_ENTRY_push(entries, entry))
|
||||
goto memerr;
|
||||
}
|
||||
len = ASN1_item_ex_i2d(&intname.a, NULL,
|
||||
ASN1_ITEM_rptr(X509_NAME_INTERNAL), -1, -1);
|
||||
if (!BUF_MEM_grow(a->bytes, len))
|
||||
goto memerr;
|
||||
p = (unsigned char *)a->bytes->data;
|
||||
ASN1_item_ex_i2d(&intname.a,
|
||||
&p, ASN1_ITEM_rptr(X509_NAME_INTERNAL), -1, -1);
|
||||
sk_STACK_OF_X509_NAME_ENTRY_pop_free(intname.s,
|
||||
local_sk_X509_NAME_ENTRY_free);
|
||||
a->modified = 0;
|
||||
return len;
|
||||
memerr:
|
||||
sk_STACK_OF_X509_NAME_ENTRY_pop_free(intname.s,
|
||||
local_sk_X509_NAME_ENTRY_free);
|
||||
ASN1err(ASN1_F_X509_NAME_ENCODE, ERR_R_MALLOC_FAILURE);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int x509_name_ex_print(BIO *out, ASN1_VALUE **pval,
|
||||
int indent,
|
||||
const char *fname, const ASN1_PCTX *pctx)
|
||||
{
|
||||
if (X509_NAME_print_ex(out, (const X509_NAME *)*pval,
|
||||
indent, pctx->nm_flags) <= 0)
|
||||
return 0;
|
||||
return 2;
|
||||
}
|
||||
|
||||
/*
|
||||
* This function generates the canonical encoding of the Name structure. In
|
||||
* it all strings are converted to UTF8, leading, trailing and multiple
|
||||
* spaces collapsed, converted to lower case and the leading SEQUENCE header
|
||||
* removed. In future we could also normalize the UTF8 too. By doing this
|
||||
* comparison of Name structures can be rapidly performed by just using
|
||||
* memcmp() of the canonical encoding. By omitting the leading SEQUENCE name
|
||||
* constraints of type dirName can also be checked with a simple memcmp().
|
||||
*/
|
||||
|
||||
static int x509_name_canon(X509_NAME *a)
|
||||
{
|
||||
unsigned char *p;
|
||||
STACK_OF(STACK_OF_X509_NAME_ENTRY) *intname = NULL;
|
||||
STACK_OF(X509_NAME_ENTRY) *entries = NULL;
|
||||
X509_NAME_ENTRY *entry, *tmpentry = NULL;
|
||||
int i, set = -1, ret = 0, len;
|
||||
|
||||
OPENSSL_free(a->canon_enc);
|
||||
a->canon_enc = NULL;
|
||||
/* Special case: empty X509_NAME => null encoding */
|
||||
if (sk_X509_NAME_ENTRY_num(a->entries) == 0) {
|
||||
a->canon_enclen = 0;
|
||||
return 1;
|
||||
}
|
||||
intname = sk_STACK_OF_X509_NAME_ENTRY_new_null();
|
||||
if (!intname)
|
||||
goto err;
|
||||
for (i = 0; i < sk_X509_NAME_ENTRY_num(a->entries); i++) {
|
||||
entry = sk_X509_NAME_ENTRY_value(a->entries, i);
|
||||
if (entry->set != set) {
|
||||
entries = sk_X509_NAME_ENTRY_new_null();
|
||||
if (!entries)
|
||||
goto err;
|
||||
if (!sk_STACK_OF_X509_NAME_ENTRY_push(intname, entries))
|
||||
goto err;
|
||||
set = entry->set;
|
||||
}
|
||||
tmpentry = X509_NAME_ENTRY_new();
|
||||
if (tmpentry == NULL)
|
||||
goto err;
|
||||
tmpentry->object = OBJ_dup(entry->object);
|
||||
if (tmpentry->object == NULL)
|
||||
goto err;
|
||||
if (!asn1_string_canon(tmpentry->value, entry->value))
|
||||
goto err;
|
||||
if (!sk_X509_NAME_ENTRY_push(entries, tmpentry))
|
||||
goto err;
|
||||
tmpentry = NULL;
|
||||
}
|
||||
|
||||
/* Finally generate encoding */
|
||||
|
||||
len = i2d_name_canon(intname, NULL);
|
||||
if (len < 0)
|
||||
goto err;
|
||||
a->canon_enclen = len;
|
||||
|
||||
p = OPENSSL_malloc(a->canon_enclen);
|
||||
|
||||
if (p == NULL)
|
||||
goto err;
|
||||
|
||||
a->canon_enc = p;
|
||||
|
||||
i2d_name_canon(intname, &p);
|
||||
|
||||
ret = 1;
|
||||
|
||||
err:
|
||||
|
||||
X509_NAME_ENTRY_free(tmpentry);
|
||||
sk_STACK_OF_X509_NAME_ENTRY_pop_free(intname,
|
||||
local_sk_X509_NAME_ENTRY_pop_free);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Bitmap of all the types of string that will be canonicalized. */
|
||||
|
||||
#define ASN1_MASK_CANON \
|
||||
(B_ASN1_UTF8STRING | B_ASN1_BMPSTRING | B_ASN1_UNIVERSALSTRING \
|
||||
| B_ASN1_PRINTABLESTRING | B_ASN1_T61STRING | B_ASN1_IA5STRING \
|
||||
| B_ASN1_VISIBLESTRING)
|
||||
|
||||
static int asn1_string_canon(ASN1_STRING *out, const ASN1_STRING *in)
|
||||
{
|
||||
unsigned char *to, *from;
|
||||
int len, i;
|
||||
|
||||
/* If type not in bitmask just copy string across */
|
||||
if (!(ASN1_tag2bit(in->type) & ASN1_MASK_CANON)) {
|
||||
if (!ASN1_STRING_copy(out, in))
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
out->type = V_ASN1_UTF8STRING;
|
||||
out->length = ASN1_STRING_to_UTF8(&out->data, in);
|
||||
if (out->length == -1)
|
||||
return 0;
|
||||
|
||||
to = out->data;
|
||||
from = to;
|
||||
|
||||
len = out->length;
|
||||
|
||||
/*
|
||||
* Convert string in place to canonical form. Ultimately we may need to
|
||||
* handle a wider range of characters but for now ignore anything with
|
||||
* MSB set and rely on the isspace() and tolower() functions.
|
||||
*/
|
||||
|
||||
/* Ignore leading spaces */
|
||||
while ((len > 0) && !(*from & 0x80) && isspace(*from)) {
|
||||
from++;
|
||||
len--;
|
||||
}
|
||||
|
||||
to = from + len;
|
||||
|
||||
/* Ignore trailing spaces */
|
||||
while ((len > 0) && !(to[-1] & 0x80) && isspace(to[-1])) {
|
||||
to--;
|
||||
len--;
|
||||
}
|
||||
|
||||
to = out->data;
|
||||
|
||||
i = 0;
|
||||
while (i < len) {
|
||||
/* If MSB set just copy across */
|
||||
if (*from & 0x80) {
|
||||
*to++ = *from++;
|
||||
i++;
|
||||
}
|
||||
/* Collapse multiple spaces */
|
||||
else if (isspace(*from)) {
|
||||
/* Copy one space across */
|
||||
*to++ = ' ';
|
||||
/*
|
||||
* Ignore subsequent spaces. Note: don't need to check len here
|
||||
* because we know the last character is a non-space so we can't
|
||||
* overflow.
|
||||
*/
|
||||
do {
|
||||
from++;
|
||||
i++;
|
||||
}
|
||||
while (!(*from & 0x80) && isspace(*from));
|
||||
} else {
|
||||
*to++ = tolower(*from);
|
||||
from++;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
out->length = to - out->data;
|
||||
|
||||
return 1;
|
||||
|
||||
}
|
||||
|
||||
static int i2d_name_canon(STACK_OF(STACK_OF_X509_NAME_ENTRY) * _intname,
|
||||
unsigned char **in)
|
||||
{
|
||||
int i, len, ltmp;
|
||||
ASN1_VALUE *v;
|
||||
STACK_OF(ASN1_VALUE) *intname = (STACK_OF(ASN1_VALUE) *)_intname;
|
||||
|
||||
len = 0;
|
||||
for (i = 0; i < sk_ASN1_VALUE_num(intname); i++) {
|
||||
v = sk_ASN1_VALUE_value(intname, i);
|
||||
ltmp = ASN1_item_ex_i2d(&v, in,
|
||||
ASN1_ITEM_rptr(X509_NAME_ENTRIES), -1, -1);
|
||||
if (ltmp < 0)
|
||||
return ltmp;
|
||||
len += ltmp;
|
||||
}
|
||||
return len;
|
||||
}
|
||||
|
||||
int X509_NAME_set(X509_NAME **xn, X509_NAME *name)
|
||||
{
|
||||
X509_NAME *in;
|
||||
|
||||
if (!xn || !name)
|
||||
return (0);
|
||||
|
||||
if (*xn != name) {
|
||||
in = X509_NAME_dup(name);
|
||||
if (in != NULL) {
|
||||
X509_NAME_free(*xn);
|
||||
*xn = in;
|
||||
}
|
||||
}
|
||||
return (*xn != NULL);
|
||||
}
|
||||
|
||||
int X509_NAME_print(BIO *bp, const X509_NAME *name, int obase)
|
||||
{
|
||||
char *s, *c, *b;
|
||||
int l, i;
|
||||
|
||||
l = 80 - 2 - obase;
|
||||
|
||||
b = X509_NAME_oneline(name, NULL, 0);
|
||||
if (!b)
|
||||
return 0;
|
||||
if (!*b) {
|
||||
OPENSSL_free(b);
|
||||
return 1;
|
||||
}
|
||||
s = b + 1; /* skip the first slash */
|
||||
|
||||
c = s;
|
||||
for (;;) {
|
||||
#ifndef CHARSET_EBCDIC
|
||||
if (((*s == '/') &&
|
||||
((s[1] >= 'A') && (s[1] <= 'Z') && ((s[2] == '=') ||
|
||||
((s[2] >= 'A')
|
||||
&& (s[2] <= 'Z')
|
||||
&& (s[3] == '='))
|
||||
))) || (*s == '\0'))
|
||||
#else
|
||||
if (((*s == '/') &&
|
||||
(isupper(s[1]) && ((s[2] == '=') ||
|
||||
(isupper(s[2]) && (s[3] == '='))
|
||||
))) || (*s == '\0'))
|
||||
#endif
|
||||
{
|
||||
i = s - c;
|
||||
if (BIO_write(bp, c, i) != i)
|
||||
goto err;
|
||||
c = s + 1; /* skip following slash */
|
||||
if (*s != '\0') {
|
||||
if (BIO_write(bp, ", ", 2) != 2)
|
||||
goto err;
|
||||
}
|
||||
l--;
|
||||
}
|
||||
if (*s == '\0')
|
||||
break;
|
||||
s++;
|
||||
l--;
|
||||
}
|
||||
|
||||
OPENSSL_free(b);
|
||||
return 1;
|
||||
err:
|
||||
X509err(X509_F_X509_NAME_PRINT, ERR_R_BUF_LIB);
|
||||
OPENSSL_free(b);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int X509_NAME_get0_der(X509_NAME *nm, const unsigned char **pder,
|
||||
size_t *pderlen)
|
||||
{
|
||||
/* Make sure encoding is valid */
|
||||
if (i2d_X509_NAME(nm, NULL) <= 0)
|
||||
return 0;
|
||||
if (pder != NULL)
|
||||
*pder = (unsigned char *)nm->bytes->data;
|
||||
if (pderlen != NULL)
|
||||
*pderlen = nm->bytes->length;
|
||||
return 1;
|
||||
}
|
||||
374
crypto/x509/x_pubkey.c
Normal file
374
crypto/x509/x_pubkey.c
Normal file
@@ -0,0 +1,374 @@
|
||||
/*
|
||||
* Copyright 1995-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/asn1t.h>
|
||||
#include <openssl/x509.h>
|
||||
#include "internal/asn1_int.h"
|
||||
#include "internal/evp_int.h"
|
||||
#include "internal/x509_int.h"
|
||||
#include <openssl/rsa.h>
|
||||
#include <openssl/dsa.h>
|
||||
|
||||
struct X509_pubkey_st {
|
||||
X509_ALGOR *algor;
|
||||
ASN1_BIT_STRING *public_key;
|
||||
EVP_PKEY *pkey;
|
||||
};
|
||||
|
||||
static int x509_pubkey_decode(EVP_PKEY **pk, X509_PUBKEY *key);
|
||||
|
||||
/* Minor tweak to operation: free up EVP_PKEY */
|
||||
static int pubkey_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
|
||||
void *exarg)
|
||||
{
|
||||
if (operation == ASN1_OP_FREE_POST) {
|
||||
X509_PUBKEY *pubkey = (X509_PUBKEY *)*pval;
|
||||
EVP_PKEY_free(pubkey->pkey);
|
||||
} else if (operation == ASN1_OP_D2I_POST) {
|
||||
/* Attempt to decode public key and cache in pubkey structure. */
|
||||
X509_PUBKEY *pubkey = (X509_PUBKEY *)*pval;
|
||||
EVP_PKEY_free(pubkey->pkey);
|
||||
/*
|
||||
* Opportunistically decode the key but remove any non fatal errors
|
||||
* from the queue. Subsequent explicit attempts to decode/use the key
|
||||
* will return an appropriate error.
|
||||
*/
|
||||
ERR_set_mark();
|
||||
if (x509_pubkey_decode(&pubkey->pkey, pubkey) == -1)
|
||||
return 0;
|
||||
ERR_pop_to_mark();
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
ASN1_SEQUENCE_cb(X509_PUBKEY, pubkey_cb) = {
|
||||
ASN1_SIMPLE(X509_PUBKEY, algor, X509_ALGOR),
|
||||
ASN1_SIMPLE(X509_PUBKEY, public_key, ASN1_BIT_STRING)
|
||||
} ASN1_SEQUENCE_END_cb(X509_PUBKEY, X509_PUBKEY)
|
||||
|
||||
IMPLEMENT_ASN1_FUNCTIONS(X509_PUBKEY)
|
||||
|
||||
int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey)
|
||||
{
|
||||
X509_PUBKEY *pk = NULL;
|
||||
|
||||
if (x == NULL)
|
||||
return (0);
|
||||
|
||||
if ((pk = X509_PUBKEY_new()) == NULL)
|
||||
goto error;
|
||||
|
||||
if (pkey->ameth) {
|
||||
if (pkey->ameth->pub_encode) {
|
||||
if (!pkey->ameth->pub_encode(pk, pkey)) {
|
||||
X509err(X509_F_X509_PUBKEY_SET,
|
||||
X509_R_PUBLIC_KEY_ENCODE_ERROR);
|
||||
goto error;
|
||||
}
|
||||
} else {
|
||||
X509err(X509_F_X509_PUBKEY_SET, X509_R_METHOD_NOT_SUPPORTED);
|
||||
goto error;
|
||||
}
|
||||
} else {
|
||||
X509err(X509_F_X509_PUBKEY_SET, X509_R_UNSUPPORTED_ALGORITHM);
|
||||
goto error;
|
||||
}
|
||||
|
||||
X509_PUBKEY_free(*x);
|
||||
*x = pk;
|
||||
pk->pkey = pkey;
|
||||
EVP_PKEY_up_ref(pkey);
|
||||
return 1;
|
||||
|
||||
error:
|
||||
X509_PUBKEY_free(pk);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Attempt to decode a public key.
|
||||
* Returns 1 on success, 0 for a decode failure and -1 for a fatal
|
||||
* error e.g. malloc failure.
|
||||
*/
|
||||
|
||||
|
||||
static int x509_pubkey_decode(EVP_PKEY **ppkey, X509_PUBKEY *key)
|
||||
{
|
||||
EVP_PKEY *pkey = EVP_PKEY_new();
|
||||
|
||||
if (pkey == NULL) {
|
||||
X509err(X509_F_X509_PUBKEY_DECODE, ERR_R_MALLOC_FAILURE);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!EVP_PKEY_set_type(pkey, OBJ_obj2nid(key->algor->algorithm))) {
|
||||
X509err(X509_F_X509_PUBKEY_DECODE, X509_R_UNSUPPORTED_ALGORITHM);
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (pkey->ameth->pub_decode) {
|
||||
/*
|
||||
* Treat any failure of pub_decode as a decode error. In
|
||||
* future we could have different return codes for decode
|
||||
* errors and fatal errors such as malloc failure.
|
||||
*/
|
||||
if (!pkey->ameth->pub_decode(pkey, key)) {
|
||||
X509err(X509_F_X509_PUBKEY_DECODE, X509_R_PUBLIC_KEY_DECODE_ERROR);
|
||||
goto error;
|
||||
}
|
||||
} else {
|
||||
X509err(X509_F_X509_PUBKEY_DECODE, X509_R_METHOD_NOT_SUPPORTED);
|
||||
goto error;
|
||||
}
|
||||
|
||||
*ppkey = pkey;
|
||||
return 1;
|
||||
|
||||
error:
|
||||
EVP_PKEY_free(pkey);
|
||||
return 0;
|
||||
}
|
||||
|
||||
EVP_PKEY *X509_PUBKEY_get0(X509_PUBKEY *key)
|
||||
{
|
||||
EVP_PKEY *ret = NULL;
|
||||
|
||||
if (key == NULL || key->public_key == NULL)
|
||||
return NULL;
|
||||
|
||||
if (key->pkey != NULL)
|
||||
return key->pkey;
|
||||
|
||||
/*
|
||||
* When the key ASN.1 is initially parsed an attempt is made to
|
||||
* decode the public key and cache the EVP_PKEY structure. If this
|
||||
* operation fails the cached value will be NULL. Parsing continues
|
||||
* to allow parsing of unknown key types or unsupported forms.
|
||||
* We repeat the decode operation so the appropriate errors are left
|
||||
* in the queue.
|
||||
*/
|
||||
x509_pubkey_decode(&ret, key);
|
||||
/* If decode doesn't fail something bad happened */
|
||||
if (ret != NULL) {
|
||||
X509err(X509_F_X509_PUBKEY_GET0, ERR_R_INTERNAL_ERROR);
|
||||
EVP_PKEY_free(ret);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
EVP_PKEY *X509_PUBKEY_get(X509_PUBKEY *key)
|
||||
{
|
||||
EVP_PKEY *ret = X509_PUBKEY_get0(key);
|
||||
if (ret != NULL)
|
||||
EVP_PKEY_up_ref(ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Now two pseudo ASN1 routines that take an EVP_PKEY structure and encode or
|
||||
* decode as X509_PUBKEY
|
||||
*/
|
||||
|
||||
EVP_PKEY *d2i_PUBKEY(EVP_PKEY **a, const unsigned char **pp, long length)
|
||||
{
|
||||
X509_PUBKEY *xpk;
|
||||
EVP_PKEY *pktmp;
|
||||
const unsigned char *q;
|
||||
q = *pp;
|
||||
xpk = d2i_X509_PUBKEY(NULL, &q, length);
|
||||
if (!xpk)
|
||||
return NULL;
|
||||
pktmp = X509_PUBKEY_get(xpk);
|
||||
X509_PUBKEY_free(xpk);
|
||||
if (!pktmp)
|
||||
return NULL;
|
||||
*pp = q;
|
||||
if (a) {
|
||||
EVP_PKEY_free(*a);
|
||||
*a = pktmp;
|
||||
}
|
||||
return pktmp;
|
||||
}
|
||||
|
||||
int i2d_PUBKEY(EVP_PKEY *a, unsigned char **pp)
|
||||
{
|
||||
X509_PUBKEY *xpk = NULL;
|
||||
int ret;
|
||||
if (!a)
|
||||
return 0;
|
||||
if (!X509_PUBKEY_set(&xpk, a))
|
||||
return 0;
|
||||
ret = i2d_X509_PUBKEY(xpk, pp);
|
||||
X509_PUBKEY_free(xpk);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* The following are equivalents but which return RSA and DSA keys
|
||||
*/
|
||||
#ifndef OPENSSL_NO_RSA
|
||||
RSA *d2i_RSA_PUBKEY(RSA **a, const unsigned char **pp, long length)
|
||||
{
|
||||
EVP_PKEY *pkey;
|
||||
RSA *key;
|
||||
const unsigned char *q;
|
||||
q = *pp;
|
||||
pkey = d2i_PUBKEY(NULL, &q, length);
|
||||
if (!pkey)
|
||||
return NULL;
|
||||
key = EVP_PKEY_get1_RSA(pkey);
|
||||
EVP_PKEY_free(pkey);
|
||||
if (!key)
|
||||
return NULL;
|
||||
*pp = q;
|
||||
if (a) {
|
||||
RSA_free(*a);
|
||||
*a = key;
|
||||
}
|
||||
return key;
|
||||
}
|
||||
|
||||
int i2d_RSA_PUBKEY(RSA *a, unsigned char **pp)
|
||||
{
|
||||
EVP_PKEY *pktmp;
|
||||
int ret;
|
||||
if (!a)
|
||||
return 0;
|
||||
pktmp = EVP_PKEY_new();
|
||||
if (pktmp == NULL) {
|
||||
ASN1err(ASN1_F_I2D_RSA_PUBKEY, ERR_R_MALLOC_FAILURE);
|
||||
return 0;
|
||||
}
|
||||
EVP_PKEY_set1_RSA(pktmp, a);
|
||||
ret = i2d_PUBKEY(pktmp, pp);
|
||||
EVP_PKEY_free(pktmp);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef OPENSSL_NO_DSA
|
||||
DSA *d2i_DSA_PUBKEY(DSA **a, const unsigned char **pp, long length)
|
||||
{
|
||||
EVP_PKEY *pkey;
|
||||
DSA *key;
|
||||
const unsigned char *q;
|
||||
q = *pp;
|
||||
pkey = d2i_PUBKEY(NULL, &q, length);
|
||||
if (!pkey)
|
||||
return NULL;
|
||||
key = EVP_PKEY_get1_DSA(pkey);
|
||||
EVP_PKEY_free(pkey);
|
||||
if (!key)
|
||||
return NULL;
|
||||
*pp = q;
|
||||
if (a) {
|
||||
DSA_free(*a);
|
||||
*a = key;
|
||||
}
|
||||
return key;
|
||||
}
|
||||
|
||||
int i2d_DSA_PUBKEY(DSA *a, unsigned char **pp)
|
||||
{
|
||||
EVP_PKEY *pktmp;
|
||||
int ret;
|
||||
if (!a)
|
||||
return 0;
|
||||
pktmp = EVP_PKEY_new();
|
||||
if (pktmp == NULL) {
|
||||
ASN1err(ASN1_F_I2D_DSA_PUBKEY, ERR_R_MALLOC_FAILURE);
|
||||
return 0;
|
||||
}
|
||||
EVP_PKEY_set1_DSA(pktmp, a);
|
||||
ret = i2d_PUBKEY(pktmp, pp);
|
||||
EVP_PKEY_free(pktmp);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef OPENSSL_NO_EC
|
||||
EC_KEY *d2i_EC_PUBKEY(EC_KEY **a, const unsigned char **pp, long length)
|
||||
{
|
||||
EVP_PKEY *pkey;
|
||||
EC_KEY *key;
|
||||
const unsigned char *q;
|
||||
q = *pp;
|
||||
pkey = d2i_PUBKEY(NULL, &q, length);
|
||||
if (!pkey)
|
||||
return (NULL);
|
||||
key = EVP_PKEY_get1_EC_KEY(pkey);
|
||||
EVP_PKEY_free(pkey);
|
||||
if (!key)
|
||||
return (NULL);
|
||||
*pp = q;
|
||||
if (a) {
|
||||
EC_KEY_free(*a);
|
||||
*a = key;
|
||||
}
|
||||
return (key);
|
||||
}
|
||||
|
||||
int i2d_EC_PUBKEY(EC_KEY *a, unsigned char **pp)
|
||||
{
|
||||
EVP_PKEY *pktmp;
|
||||
int ret;
|
||||
if (!a)
|
||||
return (0);
|
||||
if ((pktmp = EVP_PKEY_new()) == NULL) {
|
||||
ASN1err(ASN1_F_I2D_EC_PUBKEY, ERR_R_MALLOC_FAILURE);
|
||||
return (0);
|
||||
}
|
||||
EVP_PKEY_set1_EC_KEY(pktmp, a);
|
||||
ret = i2d_PUBKEY(pktmp, pp);
|
||||
EVP_PKEY_free(pktmp);
|
||||
return (ret);
|
||||
}
|
||||
#endif
|
||||
|
||||
int X509_PUBKEY_set0_param(X509_PUBKEY *pub, ASN1_OBJECT *aobj,
|
||||
int ptype, void *pval,
|
||||
unsigned char *penc, int penclen)
|
||||
{
|
||||
if (!X509_ALGOR_set0(pub->algor, aobj, ptype, pval))
|
||||
return 0;
|
||||
if (penc) {
|
||||
OPENSSL_free(pub->public_key->data);
|
||||
pub->public_key->data = penc;
|
||||
pub->public_key->length = penclen;
|
||||
/* Set number of unused bits to zero */
|
||||
pub->public_key->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07);
|
||||
pub->public_key->flags |= ASN1_STRING_FLAG_BITS_LEFT;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
int X509_PUBKEY_get0_param(ASN1_OBJECT **ppkalg,
|
||||
const unsigned char **pk, int *ppklen,
|
||||
X509_ALGOR **pa, X509_PUBKEY *pub)
|
||||
{
|
||||
if (ppkalg)
|
||||
*ppkalg = pub->algor->algorithm;
|
||||
if (pk) {
|
||||
*pk = pub->public_key->data;
|
||||
*ppklen = pub->public_key->length;
|
||||
}
|
||||
if (pa)
|
||||
*pa = pub->algor;
|
||||
return 1;
|
||||
}
|
||||
|
||||
ASN1_BIT_STRING *X509_get0_pubkey_bitstr(const X509 *x)
|
||||
{
|
||||
if (x == NULL)
|
||||
return NULL;
|
||||
return x->cert_info.key->public_key;
|
||||
}
|
||||
68
crypto/x509/x_req.c
Normal file
68
crypto/x509/x_req.c
Normal file
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
* Copyright 1995-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/asn1t.h>
|
||||
#include <openssl/x509.h>
|
||||
#include "internal/x509_int.h"
|
||||
|
||||
/*-
|
||||
* X509_REQ_INFO is handled in an unusual way to get round
|
||||
* invalid encodings. Some broken certificate requests don't
|
||||
* encode the attributes field if it is empty. This is in
|
||||
* violation of PKCS#10 but we need to tolerate it. We do
|
||||
* this by making the attributes field OPTIONAL then using
|
||||
* the callback to initialise it to an empty STACK.
|
||||
*
|
||||
* This means that the field will be correctly encoded unless
|
||||
* we NULL out the field.
|
||||
*
|
||||
* As a result we no longer need the req_kludge field because
|
||||
* the information is now contained in the attributes field:
|
||||
* 1. If it is NULL then it's the invalid omission.
|
||||
* 2. If it is empty it is the correct encoding.
|
||||
* 3. If it is not empty then some attributes are present.
|
||||
*
|
||||
*/
|
||||
|
||||
static int rinf_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
|
||||
void *exarg)
|
||||
{
|
||||
X509_REQ_INFO *rinf = (X509_REQ_INFO *)*pval;
|
||||
|
||||
if (operation == ASN1_OP_NEW_POST) {
|
||||
rinf->attributes = sk_X509_ATTRIBUTE_new_null();
|
||||
if (!rinf->attributes)
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
ASN1_SEQUENCE_enc(X509_REQ_INFO, enc, rinf_cb) = {
|
||||
ASN1_SIMPLE(X509_REQ_INFO, version, ASN1_INTEGER),
|
||||
ASN1_SIMPLE(X509_REQ_INFO, subject, X509_NAME),
|
||||
ASN1_SIMPLE(X509_REQ_INFO, pubkey, X509_PUBKEY),
|
||||
/* This isn't really OPTIONAL but it gets round invalid
|
||||
* encodings
|
||||
*/
|
||||
ASN1_IMP_SET_OF_OPT(X509_REQ_INFO, attributes, X509_ATTRIBUTE, 0)
|
||||
} ASN1_SEQUENCE_END_enc(X509_REQ_INFO, X509_REQ_INFO)
|
||||
|
||||
IMPLEMENT_ASN1_FUNCTIONS(X509_REQ_INFO)
|
||||
|
||||
ASN1_SEQUENCE_ref(X509_REQ, 0) = {
|
||||
ASN1_EMBED(X509_REQ, req_info, X509_REQ_INFO),
|
||||
ASN1_EMBED(X509_REQ, sig_alg, X509_ALGOR),
|
||||
ASN1_SIMPLE(X509_REQ, signature, ASN1_BIT_STRING)
|
||||
} ASN1_SEQUENCE_END_ref(X509_REQ, X509_REQ)
|
||||
|
||||
IMPLEMENT_ASN1_FUNCTIONS(X509_REQ)
|
||||
|
||||
IMPLEMENT_ASN1_DUP_FUNCTION(X509_REQ)
|
||||
224
crypto/x509/x_x509.c
Normal file
224
crypto/x509/x_x509.c
Normal file
@@ -0,0 +1,224 @@
|
||||
/*
|
||||
* Copyright 1995-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/evp.h>
|
||||
#include <openssl/asn1t.h>
|
||||
#include <openssl/x509.h>
|
||||
#include <openssl/x509v3.h>
|
||||
#include "internal/x509_int.h"
|
||||
|
||||
ASN1_SEQUENCE_enc(X509_CINF, enc, 0) = {
|
||||
ASN1_EXP_OPT(X509_CINF, version, ASN1_INTEGER, 0),
|
||||
ASN1_EMBED(X509_CINF, serialNumber, ASN1_INTEGER),
|
||||
ASN1_EMBED(X509_CINF, signature, X509_ALGOR),
|
||||
ASN1_SIMPLE(X509_CINF, issuer, X509_NAME),
|
||||
ASN1_EMBED(X509_CINF, validity, X509_VAL),
|
||||
ASN1_SIMPLE(X509_CINF, subject, X509_NAME),
|
||||
ASN1_SIMPLE(X509_CINF, key, X509_PUBKEY),
|
||||
ASN1_IMP_OPT(X509_CINF, issuerUID, ASN1_BIT_STRING, 1),
|
||||
ASN1_IMP_OPT(X509_CINF, subjectUID, ASN1_BIT_STRING, 2),
|
||||
ASN1_EXP_SEQUENCE_OF_OPT(X509_CINF, extensions, X509_EXTENSION, 3)
|
||||
} ASN1_SEQUENCE_END_enc(X509_CINF, X509_CINF)
|
||||
|
||||
IMPLEMENT_ASN1_FUNCTIONS(X509_CINF)
|
||||
/* X509 top level structure needs a bit of customisation */
|
||||
|
||||
extern void policy_cache_free(X509_POLICY_CACHE *cache);
|
||||
|
||||
static int x509_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
|
||||
void *exarg)
|
||||
{
|
||||
X509 *ret = (X509 *)*pval;
|
||||
|
||||
switch (operation) {
|
||||
|
||||
case ASN1_OP_NEW_POST:
|
||||
ret->ex_flags = 0;
|
||||
ret->ex_pathlen = -1;
|
||||
ret->ex_pcpathlen = -1;
|
||||
ret->skid = NULL;
|
||||
ret->akid = NULL;
|
||||
#ifndef OPENSSL_NO_RFC3779
|
||||
ret->rfc3779_addr = NULL;
|
||||
ret->rfc3779_asid = NULL;
|
||||
#endif
|
||||
ret->aux = NULL;
|
||||
ret->crldp = NULL;
|
||||
if (!CRYPTO_new_ex_data(CRYPTO_EX_INDEX_X509, ret, &ret->ex_data))
|
||||
return 0;
|
||||
break;
|
||||
|
||||
case ASN1_OP_FREE_POST:
|
||||
CRYPTO_free_ex_data(CRYPTO_EX_INDEX_X509, ret, &ret->ex_data);
|
||||
X509_CERT_AUX_free(ret->aux);
|
||||
ASN1_OCTET_STRING_free(ret->skid);
|
||||
AUTHORITY_KEYID_free(ret->akid);
|
||||
CRL_DIST_POINTS_free(ret->crldp);
|
||||
policy_cache_free(ret->policy_cache);
|
||||
GENERAL_NAMES_free(ret->altname);
|
||||
NAME_CONSTRAINTS_free(ret->nc);
|
||||
#ifndef OPENSSL_NO_RFC3779
|
||||
sk_IPAddressFamily_pop_free(ret->rfc3779_addr, IPAddressFamily_free);
|
||||
ASIdentifiers_free(ret->rfc3779_asid);
|
||||
#endif
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
return 1;
|
||||
|
||||
}
|
||||
|
||||
ASN1_SEQUENCE_ref(X509, x509_cb) = {
|
||||
ASN1_EMBED(X509, cert_info, X509_CINF),
|
||||
ASN1_EMBED(X509, sig_alg, X509_ALGOR),
|
||||
ASN1_EMBED(X509, signature, ASN1_BIT_STRING)
|
||||
} ASN1_SEQUENCE_END_ref(X509, X509)
|
||||
|
||||
IMPLEMENT_ASN1_FUNCTIONS(X509)
|
||||
|
||||
IMPLEMENT_ASN1_DUP_FUNCTION(X509)
|
||||
|
||||
int X509_set_ex_data(X509 *r, int idx, void *arg)
|
||||
{
|
||||
return (CRYPTO_set_ex_data(&r->ex_data, idx, arg));
|
||||
}
|
||||
|
||||
void *X509_get_ex_data(X509 *r, int idx)
|
||||
{
|
||||
return (CRYPTO_get_ex_data(&r->ex_data, idx));
|
||||
}
|
||||
|
||||
/*
|
||||
* X509_AUX ASN1 routines. X509_AUX is the name given to a certificate with
|
||||
* extra info tagged on the end. Since these functions set how a certificate
|
||||
* is trusted they should only be used when the certificate comes from a
|
||||
* reliable source such as local storage.
|
||||
*/
|
||||
|
||||
X509 *d2i_X509_AUX(X509 **a, const unsigned char **pp, long length)
|
||||
{
|
||||
const unsigned char *q;
|
||||
X509 *ret;
|
||||
int freeret = 0;
|
||||
|
||||
/* Save start position */
|
||||
q = *pp;
|
||||
|
||||
if (a == NULL || *a == NULL)
|
||||
freeret = 1;
|
||||
ret = d2i_X509(a, &q, length);
|
||||
/* If certificate unreadable then forget it */
|
||||
if (ret == NULL)
|
||||
return NULL;
|
||||
/* update length */
|
||||
length -= q - *pp;
|
||||
if (length > 0 && !d2i_X509_CERT_AUX(&ret->aux, &q, length))
|
||||
goto err;
|
||||
*pp = q;
|
||||
return ret;
|
||||
err:
|
||||
if (freeret) {
|
||||
X509_free(ret);
|
||||
if (a)
|
||||
*a = NULL;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Serialize trusted certificate to *pp or just return the required buffer
|
||||
* length if pp == NULL. We ultimately want to avoid modifying *pp in the
|
||||
* error path, but that depends on similar hygiene in lower-level functions.
|
||||
* Here we avoid compounding the problem.
|
||||
*/
|
||||
static int i2d_x509_aux_internal(X509 *a, unsigned char **pp)
|
||||
{
|
||||
int length, tmplen;
|
||||
unsigned char *start = pp != NULL ? *pp : NULL;
|
||||
|
||||
OPENSSL_assert(pp == NULL || *pp != NULL);
|
||||
|
||||
/*
|
||||
* This might perturb *pp on error, but fixing that belongs in i2d_X509()
|
||||
* not here. It should be that if a == NULL length is zero, but we check
|
||||
* both just in case.
|
||||
*/
|
||||
length = i2d_X509(a, pp);
|
||||
if (length <= 0 || a == NULL)
|
||||
return length;
|
||||
|
||||
tmplen = i2d_X509_CERT_AUX(a->aux, pp);
|
||||
if (tmplen < 0) {
|
||||
if (start != NULL)
|
||||
*pp = start;
|
||||
return tmplen;
|
||||
}
|
||||
length += tmplen;
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
/*
|
||||
* Serialize trusted certificate to *pp, or just return the required buffer
|
||||
* length if pp == NULL.
|
||||
*
|
||||
* When pp is not NULL, but *pp == NULL, we allocate the buffer, but since
|
||||
* we're writing two ASN.1 objects back to back, we can't have i2d_X509() do
|
||||
* the allocation, nor can we allow i2d_X509_CERT_AUX() to increment the
|
||||
* allocated buffer.
|
||||
*/
|
||||
int i2d_X509_AUX(X509 *a, unsigned char **pp)
|
||||
{
|
||||
int length;
|
||||
unsigned char *tmp;
|
||||
|
||||
/* Buffer provided by caller */
|
||||
if (pp == NULL || *pp != NULL)
|
||||
return i2d_x509_aux_internal(a, pp);
|
||||
|
||||
/* Obtain the combined length */
|
||||
if ((length = i2d_x509_aux_internal(a, NULL)) <= 0)
|
||||
return length;
|
||||
|
||||
/* Allocate requisite combined storage */
|
||||
*pp = tmp = OPENSSL_malloc(length);
|
||||
if (tmp == NULL)
|
||||
return -1; /* Push error onto error stack? */
|
||||
|
||||
/* Encode, but keep *pp at the originally malloced pointer */
|
||||
length = i2d_x509_aux_internal(a, &tmp);
|
||||
if (length <= 0) {
|
||||
OPENSSL_free(*pp);
|
||||
*pp = NULL;
|
||||
}
|
||||
return length;
|
||||
}
|
||||
|
||||
int i2d_re_X509_tbs(X509 *x, unsigned char **pp)
|
||||
{
|
||||
x->cert_info.enc.modified = 1;
|
||||
return i2d_X509_CINF(&x->cert_info, pp);
|
||||
}
|
||||
|
||||
void X509_get0_signature(const ASN1_BIT_STRING **psig,
|
||||
const X509_ALGOR **palg, const X509 *x)
|
||||
{
|
||||
if (psig)
|
||||
*psig = &x->signature;
|
||||
if (palg)
|
||||
*palg = &x->sig_alg;
|
||||
}
|
||||
|
||||
int X509_get_signature_nid(const X509 *x)
|
||||
{
|
||||
return OBJ_obj2nid(x->sig_alg.algorithm);
|
||||
}
|
||||
169
crypto/x509/x_x509a.c
Normal file
169
crypto/x509/x_x509a.c
Normal file
@@ -0,0 +1,169 @@
|
||||
/*
|
||||
* 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/evp.h>
|
||||
#include <openssl/asn1t.h>
|
||||
#include <openssl/x509.h>
|
||||
#include "internal/x509_int.h"
|
||||
|
||||
/*
|
||||
* X509_CERT_AUX routines. These are used to encode additional user
|
||||
* modifiable data about a certificate. This data is appended to the X509
|
||||
* encoding when the *_X509_AUX routines are used. This means that the
|
||||
* "traditional" X509 routines will simply ignore the extra data.
|
||||
*/
|
||||
|
||||
static X509_CERT_AUX *aux_get(X509 *x);
|
||||
|
||||
ASN1_SEQUENCE(X509_CERT_AUX) = {
|
||||
ASN1_SEQUENCE_OF_OPT(X509_CERT_AUX, trust, ASN1_OBJECT),
|
||||
ASN1_IMP_SEQUENCE_OF_OPT(X509_CERT_AUX, reject, ASN1_OBJECT, 0),
|
||||
ASN1_OPT(X509_CERT_AUX, alias, ASN1_UTF8STRING),
|
||||
ASN1_OPT(X509_CERT_AUX, keyid, ASN1_OCTET_STRING),
|
||||
ASN1_IMP_SEQUENCE_OF_OPT(X509_CERT_AUX, other, X509_ALGOR, 1)
|
||||
} ASN1_SEQUENCE_END(X509_CERT_AUX)
|
||||
|
||||
IMPLEMENT_ASN1_FUNCTIONS(X509_CERT_AUX)
|
||||
|
||||
int X509_trusted(const X509 *x)
|
||||
{
|
||||
return x->aux ? 1 : 0;
|
||||
}
|
||||
|
||||
static X509_CERT_AUX *aux_get(X509 *x)
|
||||
{
|
||||
if (x == NULL)
|
||||
return NULL;
|
||||
if (x->aux == NULL && (x->aux = X509_CERT_AUX_new()) == NULL)
|
||||
return NULL;
|
||||
return x->aux;
|
||||
}
|
||||
|
||||
int X509_alias_set1(X509 *x, const unsigned char *name, int len)
|
||||
{
|
||||
X509_CERT_AUX *aux;
|
||||
if (!name) {
|
||||
if (!x || !x->aux || !x->aux->alias)
|
||||
return 1;
|
||||
ASN1_UTF8STRING_free(x->aux->alias);
|
||||
x->aux->alias = NULL;
|
||||
return 1;
|
||||
}
|
||||
if ((aux = aux_get(x)) == NULL)
|
||||
return 0;
|
||||
if (aux->alias == NULL && (aux->alias = ASN1_UTF8STRING_new()) == NULL)
|
||||
return 0;
|
||||
return ASN1_STRING_set(aux->alias, name, len);
|
||||
}
|
||||
|
||||
int X509_keyid_set1(X509 *x, const unsigned char *id, int len)
|
||||
{
|
||||
X509_CERT_AUX *aux;
|
||||
if (!id) {
|
||||
if (!x || !x->aux || !x->aux->keyid)
|
||||
return 1;
|
||||
ASN1_OCTET_STRING_free(x->aux->keyid);
|
||||
x->aux->keyid = NULL;
|
||||
return 1;
|
||||
}
|
||||
if ((aux = aux_get(x)) == NULL)
|
||||
return 0;
|
||||
if (aux->keyid == NULL
|
||||
&& (aux->keyid = ASN1_OCTET_STRING_new()) == NULL)
|
||||
return 0;
|
||||
return ASN1_STRING_set(aux->keyid, id, len);
|
||||
}
|
||||
|
||||
unsigned char *X509_alias_get0(X509 *x, int *len)
|
||||
{
|
||||
if (!x->aux || !x->aux->alias)
|
||||
return NULL;
|
||||
if (len)
|
||||
*len = x->aux->alias->length;
|
||||
return x->aux->alias->data;
|
||||
}
|
||||
|
||||
unsigned char *X509_keyid_get0(X509 *x, int *len)
|
||||
{
|
||||
if (!x->aux || !x->aux->keyid)
|
||||
return NULL;
|
||||
if (len)
|
||||
*len = x->aux->keyid->length;
|
||||
return x->aux->keyid->data;
|
||||
}
|
||||
|
||||
int X509_add1_trust_object(X509 *x, const ASN1_OBJECT *obj)
|
||||
{
|
||||
X509_CERT_AUX *aux;
|
||||
ASN1_OBJECT *objtmp = NULL;
|
||||
if (obj) {
|
||||
objtmp = OBJ_dup(obj);
|
||||
if (!objtmp)
|
||||
return 0;
|
||||
}
|
||||
if ((aux = aux_get(x)) == NULL)
|
||||
goto err;
|
||||
if (aux->trust == NULL
|
||||
&& (aux->trust = sk_ASN1_OBJECT_new_null()) == NULL)
|
||||
goto err;
|
||||
if (!objtmp || sk_ASN1_OBJECT_push(aux->trust, objtmp))
|
||||
return 1;
|
||||
err:
|
||||
ASN1_OBJECT_free(objtmp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int X509_add1_reject_object(X509 *x, const ASN1_OBJECT *obj)
|
||||
{
|
||||
X509_CERT_AUX *aux;
|
||||
ASN1_OBJECT *objtmp;
|
||||
if ((objtmp = OBJ_dup(obj)) == NULL)
|
||||
return 0;
|
||||
if ((aux = aux_get(x)) == NULL)
|
||||
goto err;
|
||||
if (aux->reject == NULL
|
||||
&& (aux->reject = sk_ASN1_OBJECT_new_null()) == NULL)
|
||||
goto err;
|
||||
return sk_ASN1_OBJECT_push(aux->reject, objtmp);
|
||||
err:
|
||||
ASN1_OBJECT_free(objtmp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void X509_trust_clear(X509 *x)
|
||||
{
|
||||
if (x->aux) {
|
||||
sk_ASN1_OBJECT_pop_free(x->aux->trust, ASN1_OBJECT_free);
|
||||
x->aux->trust = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void X509_reject_clear(X509 *x)
|
||||
{
|
||||
if (x->aux) {
|
||||
sk_ASN1_OBJECT_pop_free(x->aux->reject, ASN1_OBJECT_free);
|
||||
x->aux->reject = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
STACK_OF(ASN1_OBJECT) *X509_get0_trust_objects(X509 *x)
|
||||
{
|
||||
if (x->aux != NULL)
|
||||
return x->aux->trust;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
STACK_OF(ASN1_OBJECT) *X509_get0_reject_objects(X509 *x)
|
||||
{
|
||||
if (x->aux != NULL)
|
||||
return x->aux->reject;
|
||||
return NULL;
|
||||
}
|
||||
Reference in New Issue
Block a user