diff options
author | William Joye <wjoye@cfa.harvard.edu> | 2017-05-02 16:41:35 (GMT) |
---|---|---|
committer | William Joye <wjoye@cfa.harvard.edu> | 2017-05-02 16:41:35 (GMT) |
commit | 3d328008deedc58cd7a11c79063cefa7d662d4fc (patch) | |
tree | cb41a048885ce7b493f406360cf5f6edf689c468 /openssl/crypto/store | |
parent | 0a2b8b8e0bc2e91a9f10659b30e2e4f5b79ce692 (diff) | |
download | blt-3d328008deedc58cd7a11c79063cefa7d662d4fc.zip blt-3d328008deedc58cd7a11c79063cefa7d662d4fc.tar.gz blt-3d328008deedc58cd7a11c79063cefa7d662d4fc.tar.bz2 |
inital commit
Diffstat (limited to 'openssl/crypto/store')
-rw-r--r-- | openssl/crypto/store/Makefile | 114 | ||||
-rw-r--r-- | openssl/crypto/store/README | 95 | ||||
-rw-r--r-- | openssl/crypto/store/store.h | 658 | ||||
-rw-r--r-- | openssl/crypto/store/str_err.c | 258 | ||||
-rw-r--r-- | openssl/crypto/store/str_lib.c | 1772 | ||||
-rw-r--r-- | openssl/crypto/store/str_locl.h | 125 | ||||
-rw-r--r-- | openssl/crypto/store/str_mem.c | 383 | ||||
-rw-r--r-- | openssl/crypto/store/str_meth.c | 280 |
8 files changed, 3685 insertions, 0 deletions
diff --git a/openssl/crypto/store/Makefile b/openssl/crypto/store/Makefile new file mode 100644 index 0000000..5bc7ca7 --- /dev/null +++ b/openssl/crypto/store/Makefile @@ -0,0 +1,114 @@ +# +# OpenSSL/crypto/store/Makefile +# + +DIR= store +TOP= ../.. +CC= cc +INCLUDES= -I.. -I$(TOP) -I../../include +CFLAG=-g +MAKEFILE= Makefile +AR= ar r + +CFLAGS= $(INCLUDES) $(CFLAG) + +GENERAL=Makefile +#TEST= storetest.c +TEST= +APPS= + +LIB=$(TOP)/libcrypto.a +LIBSRC= str_err.c str_lib.c str_meth.c str_mem.c +LIBOBJ= str_err.o str_lib.o str_meth.o str_mem.o + +SRC= $(LIBSRC) + +#EXHEADER= store.h str_compat.h +EXHEADER= store.h +HEADER= $(EXHEADER) str_locl.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 */*.o *.obj lib tags core .pure .nfs* *.old *.bak fluff + +# DO NOT DELETE THIS LINE -- make depend depends on it. + +str_err.o: ../../include/openssl/bio.h ../../include/openssl/crypto.h +str_err.o: ../../include/openssl/e_os2.h ../../include/openssl/err.h +str_err.o: ../../include/openssl/lhash.h ../../include/openssl/opensslconf.h +str_err.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h +str_err.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h +str_err.o: ../../include/openssl/store.h ../../include/openssl/symhacks.h +str_err.o: str_err.c +str_lib.o: ../../include/openssl/asn1.h ../../include/openssl/bio.h +str_lib.o: ../../include/openssl/bn.h ../../include/openssl/buffer.h +str_lib.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h +str_lib.o: ../../include/openssl/ec.h ../../include/openssl/ecdh.h +str_lib.o: ../../include/openssl/ecdsa.h ../../include/openssl/engine.h +str_lib.o: ../../include/openssl/err.h ../../include/openssl/evp.h +str_lib.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h +str_lib.o: ../../include/openssl/objects.h ../../include/openssl/opensslconf.h +str_lib.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h +str_lib.o: ../../include/openssl/pkcs7.h ../../include/openssl/safestack.h +str_lib.o: ../../include/openssl/sha.h ../../include/openssl/stack.h +str_lib.o: ../../include/openssl/store.h ../../include/openssl/symhacks.h +str_lib.o: ../../include/openssl/x509.h ../../include/openssl/x509_vfy.h +str_lib.o: str_lib.c str_locl.h +str_mem.o: ../../include/openssl/bio.h ../../include/openssl/crypto.h +str_mem.o: ../../include/openssl/e_os2.h ../../include/openssl/err.h +str_mem.o: ../../include/openssl/lhash.h ../../include/openssl/opensslconf.h +str_mem.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h +str_mem.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h +str_mem.o: ../../include/openssl/store.h ../../include/openssl/symhacks.h +str_mem.o: str_locl.h str_mem.c +str_meth.o: ../../include/openssl/buffer.h ../../include/openssl/crypto.h +str_meth.o: ../../include/openssl/e_os2.h ../../include/openssl/opensslconf.h +str_meth.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h +str_meth.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h +str_meth.o: ../../include/openssl/store.h ../../include/openssl/symhacks.h +str_meth.o: str_locl.h str_meth.c diff --git a/openssl/crypto/store/README b/openssl/crypto/store/README new file mode 100644 index 0000000..966168f --- /dev/null +++ b/openssl/crypto/store/README @@ -0,0 +1,95 @@ +The STORE type +============== + +A STORE, as defined in this code section, is really a rather simple +thing which stores objects and per-object associations to a number +of attributes. What attributes are supported entirely depends on +the particular implementation of a STORE. It has some support for +generation of certain objects (for example, keys and CRLs). + + +Supported object types +---------------------- + +For now, the objects that are supported are the following: + +X.509 certificate +X.509 CRL +private key +public key +number +arbitrary (application) data + +The intention is that a STORE should be able to store everything +needed by an application that wants a cert/key store, as well as +the data a CA might need to store (this includes the serial number +counter, which explains the support for numbers). + + +Supported attribute types +------------------------- + +For now, the following attributes are supported: + +Friendly Name - the value is a normal C string +Key ID - the value is a 160 bit SHA1 hash +Issuer Key ID - the value is a 160 bit SHA1 hash +Subject Key ID - the value is a 160 bit SHA1 hash +Issuer/Serial Hash - the value is a 160 bit SHA1 hash +Issuer - the value is a X509_NAME +Serial - the value is a BIGNUM +Subject - the value is a X509_NAME +Certificate Hash - the value is a 160 bit SHA1 hash +Email - the value is a normal C string +Filename - the value is a normal C string + +It is expected that these attributes should be enough to support +the need from most, if not all, current applications. Applications +that need to do certificate verification would typically use Subject +Key ID, Issuer/Serial Hash or Subject to look up issuer certificates. +S/MIME applications would typically use Email to look up recipient +and signer certificates. + +There's added support for combined sets of attributes to search for, +with the special OR attribute. + + +Supported basic functionality +----------------------------- + +The functions that are supported through the STORE type are these: + +generate_object - for example to generate keys and CRLs +get_object - to look up one object + NOTE: this function is really rather + redundant and probably of lesser usage + than the list functions +store_object - store an object and the attributes + associated with it +modify_object - modify the attributes associated with + a specific object +revoke_object - revoke an object + NOTE: this only marks an object as + invalid, it doesn't remove the object + from the database +delete_object - remove an object from the database +list_object - list objects associated with a given + set of attributes + NOTE: this is really four functions: + list_start, list_next, list_end and + list_endp +update_store - update the internal data of the store +lock_store - lock the store +unlock_store - unlock the store + +The list functions need some extra explanation: list_start is +used to set up a lookup. That's where the attributes to use in +the search are set up. It returns a search context. list_next +returns the next object searched for. list_end closes the search. +list_endp is used to check if we have reached the end. + +A few words on the store functions as well: update_store is +typically used by a CA application to update the internal +structure of a database. This may for example involve automatic +removal of expired certificates. lock_store and unlock_store +are used for locking a store to allow exclusive writes. diff --git a/openssl/crypto/store/store.h b/openssl/crypto/store/store.h new file mode 100644 index 0000000..ce3709d --- /dev/null +++ b/openssl/crypto/store/store.h @@ -0,0 +1,658 @@ +/* crypto/store/store.h */ +/* + * Written by Richard Levitte (richard@levitte.org) for the OpenSSL project + * 2003. + */ +/* ==================================================================== + * Copyright (c) 2003 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). + * + */ + +#ifndef HEADER_STORE_H +# define HEADER_STORE_H + +# include <openssl/opensslconf.h> + +# ifdef OPENSSL_NO_STORE +# error STORE is disabled. +# endif + +# include <openssl/ossl_typ.h> +# ifndef OPENSSL_NO_DEPRECATED +# include <openssl/evp.h> +# include <openssl/bn.h> +# include <openssl/x509.h> +# endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Already defined in ossl_typ.h */ +/* typedef struct store_st STORE; */ +/* typedef struct store_method_st STORE_METHOD; */ + +/* + * All the following functions return 0, a negative number or NULL on error. + * When everything is fine, they return a positive value or a non-NULL + * pointer, all depending on their purpose. + */ + +/* Creators and destructor. */ +STORE *STORE_new_method(const STORE_METHOD *method); +STORE *STORE_new_engine(ENGINE *engine); +void STORE_free(STORE *ui); + +/* + * Give a user interface parametrised control commands. This can be used to + * send down an integer, a data pointer or a function pointer, as well as be + * used to get information from a STORE. + */ +int STORE_ctrl(STORE *store, int cmd, long i, void *p, void (*f) (void)); + +/* + * A control to set the directory with keys and certificates. Used by the + * built-in directory level method. + */ +# define STORE_CTRL_SET_DIRECTORY 0x0001 +/* + * A control to set a file to load. Used by the built-in file level method. + */ +# define STORE_CTRL_SET_FILE 0x0002 +/* + * A control to set a configuration file to load. Can be used by any method + * that wishes to load a configuration file. + */ +# define STORE_CTRL_SET_CONF_FILE 0x0003 +/* + * A control to set a the section of the loaded configuration file. Can be + * used by any method that wishes to load a configuration file. + */ +# define STORE_CTRL_SET_CONF_SECTION 0x0004 + +/* Some methods may use extra data */ +# define STORE_set_app_data(s,arg) STORE_set_ex_data(s,0,arg) +# define STORE_get_app_data(s) STORE_get_ex_data(s,0) +int STORE_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, + CRYPTO_EX_free *free_func); +int STORE_set_ex_data(STORE *r, int idx, void *arg); +void *STORE_get_ex_data(STORE *r, int idx); + +/* Use specific methods instead of the built-in one */ +const STORE_METHOD *STORE_get_method(STORE *store); +const STORE_METHOD *STORE_set_method(STORE *store, const STORE_METHOD *meth); + +/* The standard OpenSSL methods. */ +/* + * This is the in-memory method. It does everything except revoking and + * updating, and is of course volatile. It's used by other methods that have + * an in-memory cache. + */ +const STORE_METHOD *STORE_Memory(void); +# if 0 /* Not yet implemented */ +/* + * This is the directory store. It does everything except revoking and + * updating, and uses STORE_Memory() to cache things in memory. + */ +const STORE_METHOD *STORE_Directory(void); +/* + * This is the file store. It does everything except revoking and updating, + * and uses STORE_Memory() to cache things in memory. Certificates are added + * to it with the store operation, and it will only get cached certificates. + */ +const STORE_METHOD *STORE_File(void); +# endif + +/* + * Store functions take a type code for the type of data they should store or + * fetch + */ +typedef enum STORE_object_types { + STORE_OBJECT_TYPE_X509_CERTIFICATE = 0x01, /* X509 * */ + STORE_OBJECT_TYPE_X509_CRL = 0x02, /* X509_CRL * */ + STORE_OBJECT_TYPE_PRIVATE_KEY = 0x03, /* EVP_PKEY * */ + STORE_OBJECT_TYPE_PUBLIC_KEY = 0x04, /* EVP_PKEY * */ + STORE_OBJECT_TYPE_NUMBER = 0x05, /* BIGNUM * */ + STORE_OBJECT_TYPE_ARBITRARY = 0x06, /* BUF_MEM * */ + STORE_OBJECT_TYPE_NUM = 0x06 /* The amount of known object types */ +} STORE_OBJECT_TYPES; +/* List of text strings corresponding to the object types. */ +extern const char *const STORE_object_type_string[STORE_OBJECT_TYPE_NUM + 1]; + +/* + * Some store functions take a parameter list. Those parameters come with + * one of the following codes. The comments following the codes below + * indicate what type the value should be a pointer to. + */ +typedef enum STORE_params { + STORE_PARAM_EVP_TYPE = 0x01, /* int */ + STORE_PARAM_BITS = 0x02, /* size_t */ + STORE_PARAM_KEY_PARAMETERS = 0x03, /* ??? */ + STORE_PARAM_KEY_NO_PARAMETERS = 0x04, /* N/A */ + STORE_PARAM_AUTH_PASSPHRASE = 0x05, /* char * */ + STORE_PARAM_AUTH_KRB5_TICKET = 0x06, /* void * */ + STORE_PARAM_TYPE_NUM = 0x06 /* The amount of known parameter types */ +} STORE_PARAM_TYPES; +/* + * Parameter value sizes. -1 means unknown, anything else is the required + * size. + */ +extern const int STORE_param_sizes[STORE_PARAM_TYPE_NUM + 1]; + +/* + * Store functions take attribute lists. Those attributes come with codes. + * The comments following the codes below indicate what type the value should + * be a pointer to. + */ +typedef enum STORE_attribs { + STORE_ATTR_END = 0x00, + STORE_ATTR_FRIENDLYNAME = 0x01, /* C string */ + STORE_ATTR_KEYID = 0x02, /* 160 bit string (SHA1) */ + STORE_ATTR_ISSUERKEYID = 0x03, /* 160 bit string (SHA1) */ + STORE_ATTR_SUBJECTKEYID = 0x04, /* 160 bit string (SHA1) */ + STORE_ATTR_ISSUERSERIALHASH = 0x05, /* 160 bit string (SHA1) */ + STORE_ATTR_ISSUER = 0x06, /* X509_NAME * */ + STORE_ATTR_SERIAL = 0x07, /* BIGNUM * */ + STORE_ATTR_SUBJECT = 0x08, /* X509_NAME * */ + STORE_ATTR_CERTHASH = 0x09, /* 160 bit string (SHA1) */ + STORE_ATTR_EMAIL = 0x0a, /* C string */ + STORE_ATTR_FILENAME = 0x0b, /* C string */ + STORE_ATTR_TYPE_NUM = 0x0b, /* The amount of known attribute types */ + STORE_ATTR_OR = 0xff /* This is a special separator, which + * expresses the OR operation. */ +} STORE_ATTR_TYPES; +/* + * Attribute value sizes. -1 means unknown, anything else is the required + * size. + */ +extern const int STORE_attr_sizes[STORE_ATTR_TYPE_NUM + 1]; + +typedef enum STORE_certificate_status { + STORE_X509_VALID = 0x00, + STORE_X509_EXPIRED = 0x01, + STORE_X509_SUSPENDED = 0x02, + STORE_X509_REVOKED = 0x03 +} STORE_CERTIFICATE_STATUS; + +/* + * Engine store functions will return a structure that contains all the + * necessary information, including revokation status for certificates. This + * is really not needed for application authors, as the ENGINE framework + * functions will extract the OpenSSL-specific information when at all + * possible. However, for engine authors, it's crucial to know this + * structure. + */ +typedef struct STORE_OBJECT_st { + STORE_OBJECT_TYPES type; + union { + struct { + STORE_CERTIFICATE_STATUS status; + X509 *certificate; + } x509; + X509_CRL *crl; + EVP_PKEY *key; + BIGNUM *number; + BUF_MEM *arbitrary; + } data; +} STORE_OBJECT; +DECLARE_STACK_OF(STORE_OBJECT) +STORE_OBJECT *STORE_OBJECT_new(void); +void STORE_OBJECT_free(STORE_OBJECT *data); + +/* + * The following functions handle the storage. They return 0, a negative + * number or NULL on error, anything else on success. + */ +X509 *STORE_get_certificate(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_store_certificate(STORE *e, X509 *data, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_modify_certificate(STORE *e, OPENSSL_ITEM search_attributes[], + OPENSSL_ITEM add_attributes[], + OPENSSL_ITEM modify_attributes[], + OPENSSL_ITEM delete_attributes[], + OPENSSL_ITEM parameters[]); +int STORE_revoke_certificate(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_delete_certificate(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +void *STORE_list_certificate_start(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +X509 *STORE_list_certificate_next(STORE *e, void *handle); +int STORE_list_certificate_end(STORE *e, void *handle); +int STORE_list_certificate_endp(STORE *e, void *handle); +EVP_PKEY *STORE_generate_key(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +EVP_PKEY *STORE_get_private_key(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_store_private_key(STORE *e, EVP_PKEY *data, + OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_modify_private_key(STORE *e, OPENSSL_ITEM search_attributes[], + OPENSSL_ITEM add_sttributes[], + OPENSSL_ITEM modify_attributes[], + OPENSSL_ITEM delete_attributes[], + OPENSSL_ITEM parameters[]); +int STORE_revoke_private_key(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_delete_private_key(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +void *STORE_list_private_key_start(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +EVP_PKEY *STORE_list_private_key_next(STORE *e, void *handle); +int STORE_list_private_key_end(STORE *e, void *handle); +int STORE_list_private_key_endp(STORE *e, void *handle); +EVP_PKEY *STORE_get_public_key(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_store_public_key(STORE *e, EVP_PKEY *data, + OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_modify_public_key(STORE *e, OPENSSL_ITEM search_attributes[], + OPENSSL_ITEM add_sttributes[], + OPENSSL_ITEM modify_attributes[], + OPENSSL_ITEM delete_attributes[], + OPENSSL_ITEM parameters[]); +int STORE_revoke_public_key(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_delete_public_key(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +void *STORE_list_public_key_start(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +EVP_PKEY *STORE_list_public_key_next(STORE *e, void *handle); +int STORE_list_public_key_end(STORE *e, void *handle); +int STORE_list_public_key_endp(STORE *e, void *handle); +X509_CRL *STORE_generate_crl(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +X509_CRL *STORE_get_crl(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_store_crl(STORE *e, X509_CRL *data, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_modify_crl(STORE *e, OPENSSL_ITEM search_attributes[], + OPENSSL_ITEM add_sttributes[], + OPENSSL_ITEM modify_attributes[], + OPENSSL_ITEM delete_attributes[], + OPENSSL_ITEM parameters[]); +int STORE_delete_crl(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +void *STORE_list_crl_start(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +X509_CRL *STORE_list_crl_next(STORE *e, void *handle); +int STORE_list_crl_end(STORE *e, void *handle); +int STORE_list_crl_endp(STORE *e, void *handle); +int STORE_store_number(STORE *e, BIGNUM *data, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_modify_number(STORE *e, OPENSSL_ITEM search_attributes[], + OPENSSL_ITEM add_sttributes[], + OPENSSL_ITEM modify_attributes[], + OPENSSL_ITEM delete_attributes[], + OPENSSL_ITEM parameters[]); +BIGNUM *STORE_get_number(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_delete_number(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_store_arbitrary(STORE *e, BUF_MEM *data, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_modify_arbitrary(STORE *e, OPENSSL_ITEM search_attributes[], + OPENSSL_ITEM add_sttributes[], + OPENSSL_ITEM modify_attributes[], + OPENSSL_ITEM delete_attributes[], + OPENSSL_ITEM parameters[]); +BUF_MEM *STORE_get_arbitrary(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +int STORE_delete_arbitrary(STORE *e, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); + +/* Create and manipulate methods */ +STORE_METHOD *STORE_create_method(char *name); +void STORE_destroy_method(STORE_METHOD *store_method); + +/* These callback types are use for store handlers */ +typedef int (*STORE_INITIALISE_FUNC_PTR) (STORE *); +typedef void (*STORE_CLEANUP_FUNC_PTR) (STORE *); +typedef STORE_OBJECT *(*STORE_GENERATE_OBJECT_FUNC_PTR)(STORE *, + STORE_OBJECT_TYPES + type, + OPENSSL_ITEM + attributes[], + OPENSSL_ITEM + parameters[]); +typedef STORE_OBJECT *(*STORE_GET_OBJECT_FUNC_PTR)(STORE *, + STORE_OBJECT_TYPES type, + OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +typedef void *(*STORE_START_OBJECT_FUNC_PTR)(STORE *, STORE_OBJECT_TYPES type, + OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +typedef STORE_OBJECT *(*STORE_NEXT_OBJECT_FUNC_PTR)(STORE *, void *handle); +typedef int (*STORE_END_OBJECT_FUNC_PTR) (STORE *, void *handle); +typedef int (*STORE_HANDLE_OBJECT_FUNC_PTR) (STORE *, STORE_OBJECT_TYPES type, + OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +typedef int (*STORE_STORE_OBJECT_FUNC_PTR) (STORE *, STORE_OBJECT_TYPES type, + STORE_OBJECT *data, + OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +typedef int (*STORE_MODIFY_OBJECT_FUNC_PTR) (STORE *, STORE_OBJECT_TYPES type, + OPENSSL_ITEM search_attributes[], + OPENSSL_ITEM add_attributes[], + OPENSSL_ITEM modify_attributes[], + OPENSSL_ITEM delete_attributes[], + OPENSSL_ITEM parameters[]); +typedef int (*STORE_GENERIC_FUNC_PTR) (STORE *, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +typedef int (*STORE_CTRL_FUNC_PTR) (STORE *, int cmd, long l, void *p, + void (*f) (void)); + +int STORE_method_set_initialise_function(STORE_METHOD *sm, + STORE_INITIALISE_FUNC_PTR init_f); +int STORE_method_set_cleanup_function(STORE_METHOD *sm, + STORE_CLEANUP_FUNC_PTR clean_f); +int STORE_method_set_generate_function(STORE_METHOD *sm, + STORE_GENERATE_OBJECT_FUNC_PTR + generate_f); +int STORE_method_set_get_function(STORE_METHOD *sm, + STORE_GET_OBJECT_FUNC_PTR get_f); +int STORE_method_set_store_function(STORE_METHOD *sm, + STORE_STORE_OBJECT_FUNC_PTR store_f); +int STORE_method_set_modify_function(STORE_METHOD *sm, + STORE_MODIFY_OBJECT_FUNC_PTR store_f); +int STORE_method_set_revoke_function(STORE_METHOD *sm, + STORE_HANDLE_OBJECT_FUNC_PTR revoke_f); +int STORE_method_set_delete_function(STORE_METHOD *sm, + STORE_HANDLE_OBJECT_FUNC_PTR delete_f); +int STORE_method_set_list_start_function(STORE_METHOD *sm, + STORE_START_OBJECT_FUNC_PTR + list_start_f); +int STORE_method_set_list_next_function(STORE_METHOD *sm, + STORE_NEXT_OBJECT_FUNC_PTR + list_next_f); +int STORE_method_set_list_end_function(STORE_METHOD *sm, + STORE_END_OBJECT_FUNC_PTR list_end_f); +int STORE_method_set_update_store_function(STORE_METHOD *sm, + STORE_GENERIC_FUNC_PTR); +int STORE_method_set_lock_store_function(STORE_METHOD *sm, + STORE_GENERIC_FUNC_PTR); +int STORE_method_set_unlock_store_function(STORE_METHOD *sm, + STORE_GENERIC_FUNC_PTR); +int STORE_method_set_ctrl_function(STORE_METHOD *sm, + STORE_CTRL_FUNC_PTR ctrl_f); + +STORE_INITIALISE_FUNC_PTR STORE_method_get_initialise_function(STORE_METHOD + *sm); +STORE_CLEANUP_FUNC_PTR STORE_method_get_cleanup_function(STORE_METHOD *sm); +STORE_GENERATE_OBJECT_FUNC_PTR STORE_method_get_generate_function(STORE_METHOD + *sm); +STORE_GET_OBJECT_FUNC_PTR STORE_method_get_get_function(STORE_METHOD *sm); +STORE_STORE_OBJECT_FUNC_PTR STORE_method_get_store_function(STORE_METHOD *sm); +STORE_MODIFY_OBJECT_FUNC_PTR STORE_method_get_modify_function(STORE_METHOD + *sm); +STORE_HANDLE_OBJECT_FUNC_PTR STORE_method_get_revoke_function(STORE_METHOD + *sm); +STORE_HANDLE_OBJECT_FUNC_PTR STORE_method_get_delete_function(STORE_METHOD + *sm); +STORE_START_OBJECT_FUNC_PTR STORE_method_get_list_start_function(STORE_METHOD + *sm); +STORE_NEXT_OBJECT_FUNC_PTR STORE_method_get_list_next_function(STORE_METHOD + *sm); +STORE_END_OBJECT_FUNC_PTR STORE_method_get_list_end_function(STORE_METHOD + *sm); +STORE_GENERIC_FUNC_PTR STORE_method_get_update_store_function(STORE_METHOD + *sm); +STORE_GENERIC_FUNC_PTR STORE_method_get_lock_store_function(STORE_METHOD *sm); +STORE_GENERIC_FUNC_PTR STORE_method_get_unlock_store_function(STORE_METHOD + *sm); +STORE_CTRL_FUNC_PTR STORE_method_get_ctrl_function(STORE_METHOD *sm); + +/* Method helper structures and functions. */ + +/* + * This structure is the result of parsing through the information in a list + * of OPENSSL_ITEMs. It stores all the necessary information in a structured + * way. + */ +typedef struct STORE_attr_info_st STORE_ATTR_INFO; + +/* + * Parse a list of OPENSSL_ITEMs and return a pointer to a STORE_ATTR_INFO. + * Note that we do this in the list form, since the list of OPENSSL_ITEMs can + * come in blocks separated with STORE_ATTR_OR. Note that the value returned + * by STORE_parse_attrs_next() must be freed with STORE_ATTR_INFO_free(). + */ +void *STORE_parse_attrs_start(OPENSSL_ITEM *attributes); +STORE_ATTR_INFO *STORE_parse_attrs_next(void *handle); +int STORE_parse_attrs_end(void *handle); +int STORE_parse_attrs_endp(void *handle); + +/* Creator and destructor */ +STORE_ATTR_INFO *STORE_ATTR_INFO_new(void); +int STORE_ATTR_INFO_free(STORE_ATTR_INFO *attrs); + +/* Manipulators */ +char *STORE_ATTR_INFO_get0_cstr(STORE_ATTR_INFO *attrs, + STORE_ATTR_TYPES code); +unsigned char *STORE_ATTR_INFO_get0_sha1str(STORE_ATTR_INFO *attrs, + STORE_ATTR_TYPES code); +X509_NAME *STORE_ATTR_INFO_get0_dn(STORE_ATTR_INFO *attrs, + STORE_ATTR_TYPES code); +BIGNUM *STORE_ATTR_INFO_get0_number(STORE_ATTR_INFO *attrs, + STORE_ATTR_TYPES code); +int STORE_ATTR_INFO_set_cstr(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, + char *cstr, size_t cstr_size); +int STORE_ATTR_INFO_set_sha1str(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, + unsigned char *sha1str, size_t sha1str_size); +int STORE_ATTR_INFO_set_dn(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, + X509_NAME *dn); +int STORE_ATTR_INFO_set_number(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, + BIGNUM *number); +int STORE_ATTR_INFO_modify_cstr(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, + char *cstr, size_t cstr_size); +int STORE_ATTR_INFO_modify_sha1str(STORE_ATTR_INFO *attrs, + STORE_ATTR_TYPES code, + unsigned char *sha1str, + size_t sha1str_size); +int STORE_ATTR_INFO_modify_dn(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, + X509_NAME *dn); +int STORE_ATTR_INFO_modify_number(STORE_ATTR_INFO *attrs, + STORE_ATTR_TYPES code, BIGNUM *number); + +/* + * Compare on basis of a bit pattern formed by the STORE_ATTR_TYPES values in + * each contained attribute. + */ +int STORE_ATTR_INFO_compare(const STORE_ATTR_INFO *const *a, + const STORE_ATTR_INFO *const *b); +/* + * Check if the set of attributes in a is within the range of attributes set + * in b. + */ +int STORE_ATTR_INFO_in_range(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b); +/* Check if the set of attributes in a are also set in b. */ +int STORE_ATTR_INFO_in(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b); +/* Same as STORE_ATTR_INFO_in(), but also checks the attribute values. */ +int STORE_ATTR_INFO_in_ex(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b); + +/* BEGIN ERROR CODES */ +/* + * The following lines are auto generated by the script mkerr.pl. Any changes + * made after this point may be overwritten when the script is next run. + */ +void ERR_load_STORE_strings(void); + +/* Error codes for the STORE functions. */ + +/* Function codes. */ +# define STORE_F_MEM_DELETE 134 +# define STORE_F_MEM_GENERATE 135 +# define STORE_F_MEM_LIST_END 168 +# define STORE_F_MEM_LIST_NEXT 136 +# define STORE_F_MEM_LIST_START 137 +# define STORE_F_MEM_MODIFY 169 +# define STORE_F_MEM_STORE 138 +# define STORE_F_STORE_ATTR_INFO_GET0_CSTR 139 +# define STORE_F_STORE_ATTR_INFO_GET0_DN 140 +# define STORE_F_STORE_ATTR_INFO_GET0_NUMBER 141 +# define STORE_F_STORE_ATTR_INFO_GET0_SHA1STR 142 +# define STORE_F_STORE_ATTR_INFO_MODIFY_CSTR 143 +# define STORE_F_STORE_ATTR_INFO_MODIFY_DN 144 +# define STORE_F_STORE_ATTR_INFO_MODIFY_NUMBER 145 +# define STORE_F_STORE_ATTR_INFO_MODIFY_SHA1STR 146 +# define STORE_F_STORE_ATTR_INFO_SET_CSTR 147 +# define STORE_F_STORE_ATTR_INFO_SET_DN 148 +# define STORE_F_STORE_ATTR_INFO_SET_NUMBER 149 +# define STORE_F_STORE_ATTR_INFO_SET_SHA1STR 150 +# define STORE_F_STORE_CERTIFICATE 170 +# define STORE_F_STORE_CTRL 161 +# define STORE_F_STORE_DELETE_ARBITRARY 158 +# define STORE_F_STORE_DELETE_CERTIFICATE 102 +# define STORE_F_STORE_DELETE_CRL 103 +# define STORE_F_STORE_DELETE_NUMBER 104 +# define STORE_F_STORE_DELETE_PRIVATE_KEY 105 +# define STORE_F_STORE_DELETE_PUBLIC_KEY 106 +# define STORE_F_STORE_GENERATE_CRL 107 +# define STORE_F_STORE_GENERATE_KEY 108 +# define STORE_F_STORE_GET_ARBITRARY 159 +# define STORE_F_STORE_GET_CERTIFICATE 109 +# define STORE_F_STORE_GET_CRL 110 +# define STORE_F_STORE_GET_NUMBER 111 +# define STORE_F_STORE_GET_PRIVATE_KEY 112 +# define STORE_F_STORE_GET_PUBLIC_KEY 113 +# define STORE_F_STORE_LIST_CERTIFICATE_END 114 +# define STORE_F_STORE_LIST_CERTIFICATE_ENDP 153 +# define STORE_F_STORE_LIST_CERTIFICATE_NEXT 115 +# define STORE_F_STORE_LIST_CERTIFICATE_START 116 +# define STORE_F_STORE_LIST_CRL_END 117 +# define STORE_F_STORE_LIST_CRL_ENDP 154 +# define STORE_F_STORE_LIST_CRL_NEXT 118 +# define STORE_F_STORE_LIST_CRL_START 119 +# define STORE_F_STORE_LIST_PRIVATE_KEY_END 120 +# define STORE_F_STORE_LIST_PRIVATE_KEY_ENDP 155 +# define STORE_F_STORE_LIST_PRIVATE_KEY_NEXT 121 +# define STORE_F_STORE_LIST_PRIVATE_KEY_START 122 +# define STORE_F_STORE_LIST_PUBLIC_KEY_END 123 +# define STORE_F_STORE_LIST_PUBLIC_KEY_ENDP 156 +# define STORE_F_STORE_LIST_PUBLIC_KEY_NEXT 124 +# define STORE_F_STORE_LIST_PUBLIC_KEY_START 125 +# define STORE_F_STORE_MODIFY_ARBITRARY 162 +# define STORE_F_STORE_MODIFY_CERTIFICATE 163 +# define STORE_F_STORE_MODIFY_CRL 164 +# define STORE_F_STORE_MODIFY_NUMBER 165 +# define STORE_F_STORE_MODIFY_PRIVATE_KEY 166 +# define STORE_F_STORE_MODIFY_PUBLIC_KEY 167 +# define STORE_F_STORE_NEW_ENGINE 133 +# define STORE_F_STORE_NEW_METHOD 132 +# define STORE_F_STORE_PARSE_ATTRS_END 151 +# define STORE_F_STORE_PARSE_ATTRS_ENDP 172 +# define STORE_F_STORE_PARSE_ATTRS_NEXT 152 +# define STORE_F_STORE_PARSE_ATTRS_START 171 +# define STORE_F_STORE_REVOKE_CERTIFICATE 129 +# define STORE_F_STORE_REVOKE_PRIVATE_KEY 130 +# define STORE_F_STORE_REVOKE_PUBLIC_KEY 131 +# define STORE_F_STORE_STORE_ARBITRARY 157 +# define STORE_F_STORE_STORE_CERTIFICATE 100 +# define STORE_F_STORE_STORE_CRL 101 +# define STORE_F_STORE_STORE_NUMBER 126 +# define STORE_F_STORE_STORE_PRIVATE_KEY 127 +# define STORE_F_STORE_STORE_PUBLIC_KEY 128 + +/* Reason codes. */ +# define STORE_R_ALREADY_HAS_A_VALUE 127 +# define STORE_R_FAILED_DELETING_ARBITRARY 132 +# define STORE_R_FAILED_DELETING_CERTIFICATE 100 +# define STORE_R_FAILED_DELETING_KEY 101 +# define STORE_R_FAILED_DELETING_NUMBER 102 +# define STORE_R_FAILED_GENERATING_CRL 103 +# define STORE_R_FAILED_GENERATING_KEY 104 +# define STORE_R_FAILED_GETTING_ARBITRARY 133 +# define STORE_R_FAILED_GETTING_CERTIFICATE 105 +# define STORE_R_FAILED_GETTING_KEY 106 +# define STORE_R_FAILED_GETTING_NUMBER 107 +# define STORE_R_FAILED_LISTING_CERTIFICATES 108 +# define STORE_R_FAILED_LISTING_KEYS 109 +# define STORE_R_FAILED_MODIFYING_ARBITRARY 138 +# define STORE_R_FAILED_MODIFYING_CERTIFICATE 139 +# define STORE_R_FAILED_MODIFYING_CRL 140 +# define STORE_R_FAILED_MODIFYING_NUMBER 141 +# define STORE_R_FAILED_MODIFYING_PRIVATE_KEY 142 +# define STORE_R_FAILED_MODIFYING_PUBLIC_KEY 143 +# define STORE_R_FAILED_REVOKING_CERTIFICATE 110 +# define STORE_R_FAILED_REVOKING_KEY 111 +# define STORE_R_FAILED_STORING_ARBITRARY 134 +# define STORE_R_FAILED_STORING_CERTIFICATE 112 +# define STORE_R_FAILED_STORING_KEY 113 +# define STORE_R_FAILED_STORING_NUMBER 114 +# define STORE_R_NOT_IMPLEMENTED 128 +# define STORE_R_NO_CONTROL_FUNCTION 144 +# define STORE_R_NO_DELETE_ARBITRARY_FUNCTION 135 +# define STORE_R_NO_DELETE_NUMBER_FUNCTION 115 +# define STORE_R_NO_DELETE_OBJECT_FUNCTION 116 +# define STORE_R_NO_GENERATE_CRL_FUNCTION 117 +# define STORE_R_NO_GENERATE_OBJECT_FUNCTION 118 +# define STORE_R_NO_GET_OBJECT_ARBITRARY_FUNCTION 136 +# define STORE_R_NO_GET_OBJECT_FUNCTION 119 +# define STORE_R_NO_GET_OBJECT_NUMBER_FUNCTION 120 +# define STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION 131 +# define STORE_R_NO_LIST_OBJECT_END_FUNCTION 121 +# define STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION 122 +# define STORE_R_NO_LIST_OBJECT_START_FUNCTION 123 +# define STORE_R_NO_MODIFY_OBJECT_FUNCTION 145 +# define STORE_R_NO_REVOKE_OBJECT_FUNCTION 124 +# define STORE_R_NO_STORE 129 +# define STORE_R_NO_STORE_OBJECT_ARBITRARY_FUNCTION 137 +# define STORE_R_NO_STORE_OBJECT_FUNCTION 125 +# define STORE_R_NO_STORE_OBJECT_NUMBER_FUNCTION 126 +# define STORE_R_NO_VALUE 130 + +#ifdef __cplusplus +} +#endif +#endif diff --git a/openssl/crypto/store/str_err.c b/openssl/crypto/store/str_err.c new file mode 100644 index 0000000..9858e60 --- /dev/null +++ b/openssl/crypto/store/str_err.c @@ -0,0 +1,258 @@ +/* crypto/store/str_err.c */ +/* ==================================================================== + * Copyright (c) 1999-2006 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. + */ + +#include <stdio.h> +#include <openssl/err.h> +#include <openssl/store.h> + +/* BEGIN ERROR CODES */ +#ifndef OPENSSL_NO_ERR + +# define ERR_FUNC(func) ERR_PACK(ERR_LIB_STORE,func,0) +# define ERR_REASON(reason) ERR_PACK(ERR_LIB_STORE,0,reason) + +static ERR_STRING_DATA STORE_str_functs[] = { + {ERR_FUNC(STORE_F_MEM_DELETE), "MEM_DELETE"}, + {ERR_FUNC(STORE_F_MEM_GENERATE), "MEM_GENERATE"}, + {ERR_FUNC(STORE_F_MEM_LIST_END), "MEM_LIST_END"}, + {ERR_FUNC(STORE_F_MEM_LIST_NEXT), "MEM_LIST_NEXT"}, + {ERR_FUNC(STORE_F_MEM_LIST_START), "MEM_LIST_START"}, + {ERR_FUNC(STORE_F_MEM_MODIFY), "MEM_MODIFY"}, + {ERR_FUNC(STORE_F_MEM_STORE), "MEM_STORE"}, + {ERR_FUNC(STORE_F_STORE_ATTR_INFO_GET0_CSTR), + "STORE_ATTR_INFO_get0_cstr"}, + {ERR_FUNC(STORE_F_STORE_ATTR_INFO_GET0_DN), "STORE_ATTR_INFO_get0_dn"}, + {ERR_FUNC(STORE_F_STORE_ATTR_INFO_GET0_NUMBER), + "STORE_ATTR_INFO_get0_number"}, + {ERR_FUNC(STORE_F_STORE_ATTR_INFO_GET0_SHA1STR), + "STORE_ATTR_INFO_get0_sha1str"}, + {ERR_FUNC(STORE_F_STORE_ATTR_INFO_MODIFY_CSTR), + "STORE_ATTR_INFO_modify_cstr"}, + {ERR_FUNC(STORE_F_STORE_ATTR_INFO_MODIFY_DN), + "STORE_ATTR_INFO_modify_dn"}, + {ERR_FUNC(STORE_F_STORE_ATTR_INFO_MODIFY_NUMBER), + "STORE_ATTR_INFO_modify_number"}, + {ERR_FUNC(STORE_F_STORE_ATTR_INFO_MODIFY_SHA1STR), + "STORE_ATTR_INFO_modify_sha1str"}, + {ERR_FUNC(STORE_F_STORE_ATTR_INFO_SET_CSTR), "STORE_ATTR_INFO_set_cstr"}, + {ERR_FUNC(STORE_F_STORE_ATTR_INFO_SET_DN), "STORE_ATTR_INFO_set_dn"}, + {ERR_FUNC(STORE_F_STORE_ATTR_INFO_SET_NUMBER), + "STORE_ATTR_INFO_set_number"}, + {ERR_FUNC(STORE_F_STORE_ATTR_INFO_SET_SHA1STR), + "STORE_ATTR_INFO_set_sha1str"}, + {ERR_FUNC(STORE_F_STORE_CERTIFICATE), "STORE_CERTIFICATE"}, + {ERR_FUNC(STORE_F_STORE_CTRL), "STORE_ctrl"}, + {ERR_FUNC(STORE_F_STORE_DELETE_ARBITRARY), "STORE_delete_arbitrary"}, + {ERR_FUNC(STORE_F_STORE_DELETE_CERTIFICATE), "STORE_delete_certificate"}, + {ERR_FUNC(STORE_F_STORE_DELETE_CRL), "STORE_delete_crl"}, + {ERR_FUNC(STORE_F_STORE_DELETE_NUMBER), "STORE_delete_number"}, + {ERR_FUNC(STORE_F_STORE_DELETE_PRIVATE_KEY), "STORE_delete_private_key"}, + {ERR_FUNC(STORE_F_STORE_DELETE_PUBLIC_KEY), "STORE_delete_public_key"}, + {ERR_FUNC(STORE_F_STORE_GENERATE_CRL), "STORE_generate_crl"}, + {ERR_FUNC(STORE_F_STORE_GENERATE_KEY), "STORE_generate_key"}, + {ERR_FUNC(STORE_F_STORE_GET_ARBITRARY), "STORE_get_arbitrary"}, + {ERR_FUNC(STORE_F_STORE_GET_CERTIFICATE), "STORE_get_certificate"}, + {ERR_FUNC(STORE_F_STORE_GET_CRL), "STORE_get_crl"}, + {ERR_FUNC(STORE_F_STORE_GET_NUMBER), "STORE_get_number"}, + {ERR_FUNC(STORE_F_STORE_GET_PRIVATE_KEY), "STORE_get_private_key"}, + {ERR_FUNC(STORE_F_STORE_GET_PUBLIC_KEY), "STORE_get_public_key"}, + {ERR_FUNC(STORE_F_STORE_LIST_CERTIFICATE_END), + "STORE_list_certificate_end"}, + {ERR_FUNC(STORE_F_STORE_LIST_CERTIFICATE_ENDP), + "STORE_list_certificate_endp"}, + {ERR_FUNC(STORE_F_STORE_LIST_CERTIFICATE_NEXT), + "STORE_list_certificate_next"}, + {ERR_FUNC(STORE_F_STORE_LIST_CERTIFICATE_START), + "STORE_list_certificate_start"}, + {ERR_FUNC(STORE_F_STORE_LIST_CRL_END), "STORE_list_crl_end"}, + {ERR_FUNC(STORE_F_STORE_LIST_CRL_ENDP), "STORE_list_crl_endp"}, + {ERR_FUNC(STORE_F_STORE_LIST_CRL_NEXT), "STORE_list_crl_next"}, + {ERR_FUNC(STORE_F_STORE_LIST_CRL_START), "STORE_list_crl_start"}, + {ERR_FUNC(STORE_F_STORE_LIST_PRIVATE_KEY_END), + "STORE_list_private_key_end"}, + {ERR_FUNC(STORE_F_STORE_LIST_PRIVATE_KEY_ENDP), + "STORE_list_private_key_endp"}, + {ERR_FUNC(STORE_F_STORE_LIST_PRIVATE_KEY_NEXT), + "STORE_list_private_key_next"}, + {ERR_FUNC(STORE_F_STORE_LIST_PRIVATE_KEY_START), + "STORE_list_private_key_start"}, + {ERR_FUNC(STORE_F_STORE_LIST_PUBLIC_KEY_END), + "STORE_list_public_key_end"}, + {ERR_FUNC(STORE_F_STORE_LIST_PUBLIC_KEY_ENDP), + "STORE_list_public_key_endp"}, + {ERR_FUNC(STORE_F_STORE_LIST_PUBLIC_KEY_NEXT), + "STORE_list_public_key_next"}, + {ERR_FUNC(STORE_F_STORE_LIST_PUBLIC_KEY_START), + "STORE_list_public_key_start"}, + {ERR_FUNC(STORE_F_STORE_MODIFY_ARBITRARY), "STORE_modify_arbitrary"}, + {ERR_FUNC(STORE_F_STORE_MODIFY_CERTIFICATE), "STORE_modify_certificate"}, + {ERR_FUNC(STORE_F_STORE_MODIFY_CRL), "STORE_modify_crl"}, + {ERR_FUNC(STORE_F_STORE_MODIFY_NUMBER), "STORE_modify_number"}, + {ERR_FUNC(STORE_F_STORE_MODIFY_PRIVATE_KEY), "STORE_modify_private_key"}, + {ERR_FUNC(STORE_F_STORE_MODIFY_PUBLIC_KEY), "STORE_modify_public_key"}, + {ERR_FUNC(STORE_F_STORE_NEW_ENGINE), "STORE_new_engine"}, + {ERR_FUNC(STORE_F_STORE_NEW_METHOD), "STORE_new_method"}, + {ERR_FUNC(STORE_F_STORE_PARSE_ATTRS_END), "STORE_parse_attrs_end"}, + {ERR_FUNC(STORE_F_STORE_PARSE_ATTRS_ENDP), "STORE_parse_attrs_endp"}, + {ERR_FUNC(STORE_F_STORE_PARSE_ATTRS_NEXT), "STORE_parse_attrs_next"}, + {ERR_FUNC(STORE_F_STORE_PARSE_ATTRS_START), "STORE_parse_attrs_start"}, + {ERR_FUNC(STORE_F_STORE_REVOKE_CERTIFICATE), "STORE_revoke_certificate"}, + {ERR_FUNC(STORE_F_STORE_REVOKE_PRIVATE_KEY), "STORE_revoke_private_key"}, + {ERR_FUNC(STORE_F_STORE_REVOKE_PUBLIC_KEY), "STORE_revoke_public_key"}, + {ERR_FUNC(STORE_F_STORE_STORE_ARBITRARY), "STORE_store_arbitrary"}, + {ERR_FUNC(STORE_F_STORE_STORE_CERTIFICATE), "STORE_store_certificate"}, + {ERR_FUNC(STORE_F_STORE_STORE_CRL), "STORE_store_crl"}, + {ERR_FUNC(STORE_F_STORE_STORE_NUMBER), "STORE_store_number"}, + {ERR_FUNC(STORE_F_STORE_STORE_PRIVATE_KEY), "STORE_store_private_key"}, + {ERR_FUNC(STORE_F_STORE_STORE_PUBLIC_KEY), "STORE_store_public_key"}, + {0, NULL} +}; + +static ERR_STRING_DATA STORE_str_reasons[] = { + {ERR_REASON(STORE_R_ALREADY_HAS_A_VALUE), "already has a value"}, + {ERR_REASON(STORE_R_FAILED_DELETING_ARBITRARY), + "failed deleting arbitrary"}, + {ERR_REASON(STORE_R_FAILED_DELETING_CERTIFICATE), + "failed deleting certificate"}, + {ERR_REASON(STORE_R_FAILED_DELETING_KEY), "failed deleting key"}, + {ERR_REASON(STORE_R_FAILED_DELETING_NUMBER), "failed deleting number"}, + {ERR_REASON(STORE_R_FAILED_GENERATING_CRL), "failed generating crl"}, + {ERR_REASON(STORE_R_FAILED_GENERATING_KEY), "failed generating key"}, + {ERR_REASON(STORE_R_FAILED_GETTING_ARBITRARY), + "failed getting arbitrary"}, + {ERR_REASON(STORE_R_FAILED_GETTING_CERTIFICATE), + "failed getting certificate"}, + {ERR_REASON(STORE_R_FAILED_GETTING_KEY), "failed getting key"}, + {ERR_REASON(STORE_R_FAILED_GETTING_NUMBER), "failed getting number"}, + {ERR_REASON(STORE_R_FAILED_LISTING_CERTIFICATES), + "failed listing certificates"}, + {ERR_REASON(STORE_R_FAILED_LISTING_KEYS), "failed listing keys"}, + {ERR_REASON(STORE_R_FAILED_MODIFYING_ARBITRARY), + "failed modifying arbitrary"}, + {ERR_REASON(STORE_R_FAILED_MODIFYING_CERTIFICATE), + "failed modifying certificate"}, + {ERR_REASON(STORE_R_FAILED_MODIFYING_CRL), "failed modifying crl"}, + {ERR_REASON(STORE_R_FAILED_MODIFYING_NUMBER), "failed modifying number"}, + {ERR_REASON(STORE_R_FAILED_MODIFYING_PRIVATE_KEY), + "failed modifying private key"}, + {ERR_REASON(STORE_R_FAILED_MODIFYING_PUBLIC_KEY), + "failed modifying public key"}, + {ERR_REASON(STORE_R_FAILED_REVOKING_CERTIFICATE), + "failed revoking certificate"}, + {ERR_REASON(STORE_R_FAILED_REVOKING_KEY), "failed revoking key"}, + {ERR_REASON(STORE_R_FAILED_STORING_ARBITRARY), + "failed storing arbitrary"}, + {ERR_REASON(STORE_R_FAILED_STORING_CERTIFICATE), + "failed storing certificate"}, + {ERR_REASON(STORE_R_FAILED_STORING_KEY), "failed storing key"}, + {ERR_REASON(STORE_R_FAILED_STORING_NUMBER), "failed storing number"}, + {ERR_REASON(STORE_R_NOT_IMPLEMENTED), "not implemented"}, + {ERR_REASON(STORE_R_NO_CONTROL_FUNCTION), "no control function"}, + {ERR_REASON(STORE_R_NO_DELETE_ARBITRARY_FUNCTION), + "no delete arbitrary function"}, + {ERR_REASON(STORE_R_NO_DELETE_NUMBER_FUNCTION), + "no delete number function"}, + {ERR_REASON(STORE_R_NO_DELETE_OBJECT_FUNCTION), + "no delete object function"}, + {ERR_REASON(STORE_R_NO_GENERATE_CRL_FUNCTION), + "no generate crl function"}, + {ERR_REASON(STORE_R_NO_GENERATE_OBJECT_FUNCTION), + "no generate object function"}, + {ERR_REASON(STORE_R_NO_GET_OBJECT_ARBITRARY_FUNCTION), + "no get object arbitrary function"}, + {ERR_REASON(STORE_R_NO_GET_OBJECT_FUNCTION), "no get object function"}, + {ERR_REASON(STORE_R_NO_GET_OBJECT_NUMBER_FUNCTION), + "no get object number function"}, + {ERR_REASON(STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION), + "no list object endp function"}, + {ERR_REASON(STORE_R_NO_LIST_OBJECT_END_FUNCTION), + "no list object end function"}, + {ERR_REASON(STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION), + "no list object next function"}, + {ERR_REASON(STORE_R_NO_LIST_OBJECT_START_FUNCTION), + "no list object start function"}, + {ERR_REASON(STORE_R_NO_MODIFY_OBJECT_FUNCTION), + "no modify object function"}, + {ERR_REASON(STORE_R_NO_REVOKE_OBJECT_FUNCTION), + "no revoke object function"}, + {ERR_REASON(STORE_R_NO_STORE), "no store"}, + {ERR_REASON(STORE_R_NO_STORE_OBJECT_ARBITRARY_FUNCTION), + "no store object arbitrary function"}, + {ERR_REASON(STORE_R_NO_STORE_OBJECT_FUNCTION), + "no store object function"}, + {ERR_REASON(STORE_R_NO_STORE_OBJECT_NUMBER_FUNCTION), + "no store object number function"}, + {ERR_REASON(STORE_R_NO_VALUE), "no value"}, + {0, NULL} +}; + +#endif + +void ERR_load_STORE_strings(void) +{ +#ifndef OPENSSL_NO_ERR + + if (ERR_func_error_string(STORE_str_functs[0].error) == NULL) { + ERR_load_strings(0, STORE_str_functs); + ERR_load_strings(0, STORE_str_reasons); + } +#endif +} diff --git a/openssl/crypto/store/str_lib.c b/openssl/crypto/store/str_lib.c new file mode 100644 index 0000000..e3d5da9 --- /dev/null +++ b/openssl/crypto/store/str_lib.c @@ -0,0 +1,1772 @@ +/* crypto/store/str_lib.c */ +/* + * Written by Richard Levitte (richard@levitte.org) for the OpenSSL project + * 2003. + */ +/* ==================================================================== + * Copyright (c) 2003 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 <string.h> +#include <openssl/bn.h> +#include <openssl/err.h> +#ifndef OPENSSL_NO_ENGINE +# include <openssl/engine.h> +#endif +#include <openssl/sha.h> +#include <openssl/x509.h> +#include "str_locl.h" + +const char *const STORE_object_type_string[STORE_OBJECT_TYPE_NUM + 1] = { + 0, + "X.509 Certificate", + "X.509 CRL", + "Private Key", + "Public Key", + "Number", + "Arbitrary Data" +}; + +const int STORE_param_sizes[STORE_PARAM_TYPE_NUM + 1] = { + 0, + sizeof(int), /* EVP_TYPE */ + sizeof(size_t), /* BITS */ + -1, /* KEY_PARAMETERS */ + 0 /* KEY_NO_PARAMETERS */ +}; + +const int STORE_attr_sizes[STORE_ATTR_TYPE_NUM + 1] = { + 0, + -1, /* FRIENDLYNAME: C string */ + SHA_DIGEST_LENGTH, /* KEYID: SHA1 digest, 160 bits */ + SHA_DIGEST_LENGTH, /* ISSUERKEYID: SHA1 digest, 160 bits */ + SHA_DIGEST_LENGTH, /* SUBJECTKEYID: SHA1 digest, 160 bits */ + SHA_DIGEST_LENGTH, /* ISSUERSERIALHASH: SHA1 digest, 160 bits */ + sizeof(X509_NAME *), /* ISSUER: X509_NAME * */ + sizeof(BIGNUM *), /* SERIAL: BIGNUM * */ + sizeof(X509_NAME *), /* SUBJECT: X509_NAME * */ + SHA_DIGEST_LENGTH, /* CERTHASH: SHA1 digest, 160 bits */ + -1, /* EMAIL: C string */ + -1, /* FILENAME: C string */ +}; + +STORE *STORE_new_method(const STORE_METHOD *method) +{ + STORE *ret; + + if (method == NULL) { + STOREerr(STORE_F_STORE_NEW_METHOD, ERR_R_PASSED_NULL_PARAMETER); + return NULL; + } + + ret = (STORE *)OPENSSL_malloc(sizeof(STORE)); + if (ret == NULL) { + STOREerr(STORE_F_STORE_NEW_METHOD, ERR_R_MALLOC_FAILURE); + return NULL; + } + + ret->meth = method; + + CRYPTO_new_ex_data(CRYPTO_EX_INDEX_STORE, ret, &ret->ex_data); + if (ret->meth->init && !ret->meth->init(ret)) { + STORE_free(ret); + ret = NULL; + } + return ret; +} + +STORE *STORE_new_engine(ENGINE *engine) +{ + STORE *ret = NULL; + ENGINE *e = engine; + const STORE_METHOD *meth = 0; + +#ifdef OPENSSL_NO_ENGINE + e = NULL; +#else + if (engine) { + if (!ENGINE_init(engine)) { + STOREerr(STORE_F_STORE_NEW_ENGINE, ERR_R_ENGINE_LIB); + return NULL; + } + e = engine; + } else { + STOREerr(STORE_F_STORE_NEW_ENGINE, ERR_R_PASSED_NULL_PARAMETER); + return NULL; + } + if (e) { + meth = ENGINE_get_STORE(e); + if (!meth) { + STOREerr(STORE_F_STORE_NEW_ENGINE, ERR_R_ENGINE_LIB); + ENGINE_finish(e); + return NULL; + } + } +#endif + + ret = STORE_new_method(meth); + if (ret == NULL) { + STOREerr(STORE_F_STORE_NEW_ENGINE, ERR_R_STORE_LIB); + return NULL; + } + + ret->engine = e; + + return (ret); +} + +void STORE_free(STORE *store) +{ + if (store == NULL) + return; + if (store->meth->clean) + store->meth->clean(store); + CRYPTO_free_ex_data(CRYPTO_EX_INDEX_STORE, store, &store->ex_data); + OPENSSL_free(store); +} + +int STORE_ctrl(STORE *store, int cmd, long i, void *p, void (*f) (void)) +{ + if (store == NULL) { + STOREerr(STORE_F_STORE_CTRL, ERR_R_PASSED_NULL_PARAMETER); + return 0; + } + if (store->meth->ctrl) + return store->meth->ctrl(store, cmd, i, p, f); + STOREerr(STORE_F_STORE_CTRL, STORE_R_NO_CONTROL_FUNCTION); + return 0; +} + +int STORE_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, + CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) +{ + return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_STORE, argl, argp, + new_func, dup_func, free_func); +} + +int STORE_set_ex_data(STORE *r, int idx, void *arg) +{ + return (CRYPTO_set_ex_data(&r->ex_data, idx, arg)); +} + +void *STORE_get_ex_data(STORE *r, int idx) +{ + return (CRYPTO_get_ex_data(&r->ex_data, idx)); +} + +const STORE_METHOD *STORE_get_method(STORE *store) +{ + return store->meth; +} + +const STORE_METHOD *STORE_set_method(STORE *store, const STORE_METHOD *meth) +{ + store->meth = meth; + return store->meth; +} + +/* API helpers */ + +#define check_store(s,fncode,fnname,fnerrcode) \ + do \ + { \ + if ((s) == NULL || (s)->meth == NULL) \ + { \ + STOREerr((fncode), ERR_R_PASSED_NULL_PARAMETER); \ + return 0; \ + } \ + if ((s)->meth->fnname == NULL) \ + { \ + STOREerr((fncode), (fnerrcode)); \ + return 0; \ + } \ + } \ + while(0) + +/* API functions */ + +X509 *STORE_get_certificate(STORE *s, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + STORE_OBJECT *object; + X509 *x; + + check_store(s, STORE_F_STORE_GET_CERTIFICATE, + get_object, STORE_R_NO_GET_OBJECT_FUNCTION); + + object = s->meth->get_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE, + attributes, parameters); + if (!object || !object->data.x509.certificate) { + STOREerr(STORE_F_STORE_GET_CERTIFICATE, + STORE_R_FAILED_GETTING_CERTIFICATE); + return 0; + } + CRYPTO_add(&object->data.x509.certificate->references, 1, + CRYPTO_LOCK_X509); +#ifdef REF_PRINT + REF_PRINT("X509", data); +#endif + x = object->data.x509.certificate; + STORE_OBJECT_free(object); + return x; +} + +int STORE_store_certificate(STORE *s, X509 *data, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + STORE_OBJECT *object; + int i; + + check_store(s, STORE_F_STORE_CERTIFICATE, + store_object, STORE_R_NO_STORE_OBJECT_FUNCTION); + + object = STORE_OBJECT_new(); + if (!object) { + STOREerr(STORE_F_STORE_STORE_CERTIFICATE, ERR_R_MALLOC_FAILURE); + return 0; + } + + CRYPTO_add(&data->references, 1, CRYPTO_LOCK_X509); +#ifdef REF_PRINT + REF_PRINT("X509", data); +#endif + object->data.x509.certificate = data; + + i = s->meth->store_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE, + object, attributes, parameters); + + STORE_OBJECT_free(object); + + if (!i) { + STOREerr(STORE_F_STORE_STORE_CERTIFICATE, + STORE_R_FAILED_STORING_CERTIFICATE); + return 0; + } + return 1; +} + +int STORE_modify_certificate(STORE *s, OPENSSL_ITEM search_attributes[], + OPENSSL_ITEM add_attributes[], + OPENSSL_ITEM modify_attributes[], + OPENSSL_ITEM delete_attributes[], + OPENSSL_ITEM parameters[]) +{ + check_store(s, STORE_F_STORE_MODIFY_CERTIFICATE, + modify_object, STORE_R_NO_MODIFY_OBJECT_FUNCTION); + + if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE, + search_attributes, add_attributes, + modify_attributes, delete_attributes, + parameters)) { + STOREerr(STORE_F_STORE_MODIFY_CERTIFICATE, + STORE_R_FAILED_MODIFYING_CERTIFICATE); + return 0; + } + return 1; +} + +int STORE_revoke_certificate(STORE *s, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + check_store(s, STORE_F_STORE_REVOKE_CERTIFICATE, + revoke_object, STORE_R_NO_REVOKE_OBJECT_FUNCTION); + + if (!s->meth->revoke_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE, + attributes, parameters)) { + STOREerr(STORE_F_STORE_REVOKE_CERTIFICATE, + STORE_R_FAILED_REVOKING_CERTIFICATE); + return 0; + } + return 1; +} + +int STORE_delete_certificate(STORE *s, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + check_store(s, STORE_F_STORE_DELETE_CERTIFICATE, + delete_object, STORE_R_NO_DELETE_OBJECT_FUNCTION); + + if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE, + attributes, parameters)) { + STOREerr(STORE_F_STORE_DELETE_CERTIFICATE, + STORE_R_FAILED_DELETING_CERTIFICATE); + return 0; + } + return 1; +} + +void *STORE_list_certificate_start(STORE *s, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + void *handle; + + check_store(s, STORE_F_STORE_LIST_CERTIFICATE_START, + list_object_start, STORE_R_NO_LIST_OBJECT_START_FUNCTION); + + handle = s->meth->list_object_start(s, + STORE_OBJECT_TYPE_X509_CERTIFICATE, + attributes, parameters); + if (!handle) { + STOREerr(STORE_F_STORE_LIST_CERTIFICATE_START, + STORE_R_FAILED_LISTING_CERTIFICATES); + return 0; + } + return handle; +} + +X509 *STORE_list_certificate_next(STORE *s, void *handle) +{ + STORE_OBJECT *object; + X509 *x; + + check_store(s, STORE_F_STORE_LIST_CERTIFICATE_NEXT, + list_object_next, STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION); + + object = s->meth->list_object_next(s, handle); + if (!object || !object->data.x509.certificate) { + STOREerr(STORE_F_STORE_LIST_CERTIFICATE_NEXT, + STORE_R_FAILED_LISTING_CERTIFICATES); + return 0; + } + CRYPTO_add(&object->data.x509.certificate->references, 1, + CRYPTO_LOCK_X509); +#ifdef REF_PRINT + REF_PRINT("X509", data); +#endif + x = object->data.x509.certificate; + STORE_OBJECT_free(object); + return x; +} + +int STORE_list_certificate_end(STORE *s, void *handle) +{ + check_store(s, STORE_F_STORE_LIST_CERTIFICATE_END, + list_object_end, STORE_R_NO_LIST_OBJECT_END_FUNCTION); + + if (!s->meth->list_object_end(s, handle)) { + STOREerr(STORE_F_STORE_LIST_CERTIFICATE_END, + STORE_R_FAILED_LISTING_CERTIFICATES); + return 0; + } + return 1; +} + +int STORE_list_certificate_endp(STORE *s, void *handle) +{ + check_store(s, STORE_F_STORE_LIST_CERTIFICATE_ENDP, + list_object_endp, STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION); + + if (!s->meth->list_object_endp(s, handle)) { + STOREerr(STORE_F_STORE_LIST_CERTIFICATE_ENDP, + STORE_R_FAILED_LISTING_CERTIFICATES); + return 0; + } + return 1; +} + +EVP_PKEY *STORE_generate_key(STORE *s, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + STORE_OBJECT *object; + EVP_PKEY *pkey; + + check_store(s, STORE_F_STORE_GENERATE_KEY, + generate_object, STORE_R_NO_GENERATE_OBJECT_FUNCTION); + + object = s->meth->generate_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY, + attributes, parameters); + if (!object || !object->data.key) { + STOREerr(STORE_F_STORE_GENERATE_KEY, STORE_R_FAILED_GENERATING_KEY); + return 0; + } + CRYPTO_add(&object->data.key->references, 1, CRYPTO_LOCK_EVP_PKEY); +#ifdef REF_PRINT + REF_PRINT("EVP_PKEY", data); +#endif + pkey = object->data.key; + STORE_OBJECT_free(object); + return pkey; +} + +EVP_PKEY *STORE_get_private_key(STORE *s, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + STORE_OBJECT *object; + EVP_PKEY *pkey; + + check_store(s, STORE_F_STORE_GET_PRIVATE_KEY, + get_object, STORE_R_NO_GET_OBJECT_FUNCTION); + + object = s->meth->get_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY, + attributes, parameters); + if (!object || !object->data.key || !object->data.key) { + STOREerr(STORE_F_STORE_GET_PRIVATE_KEY, STORE_R_FAILED_GETTING_KEY); + return 0; + } + CRYPTO_add(&object->data.key->references, 1, CRYPTO_LOCK_EVP_PKEY); +#ifdef REF_PRINT + REF_PRINT("EVP_PKEY", data); +#endif + pkey = object->data.key; + STORE_OBJECT_free(object); + return pkey; +} + +int STORE_store_private_key(STORE *s, EVP_PKEY *data, + OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + STORE_OBJECT *object; + int i; + + check_store(s, STORE_F_STORE_STORE_PRIVATE_KEY, + store_object, STORE_R_NO_STORE_OBJECT_FUNCTION); + + object = STORE_OBJECT_new(); + if (!object) { + STOREerr(STORE_F_STORE_STORE_PRIVATE_KEY, ERR_R_MALLOC_FAILURE); + return 0; + } + object->data.key = EVP_PKEY_new(); + if (!object->data.key) { + STOREerr(STORE_F_STORE_STORE_PRIVATE_KEY, ERR_R_MALLOC_FAILURE); + return 0; + } + + CRYPTO_add(&data->references, 1, CRYPTO_LOCK_EVP_PKEY); +#ifdef REF_PRINT + REF_PRINT("EVP_PKEY", data); +#endif + object->data.key = data; + + i = s->meth->store_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY, object, + attributes, parameters); + + STORE_OBJECT_free(object); + + if (!i) { + STOREerr(STORE_F_STORE_STORE_PRIVATE_KEY, STORE_R_FAILED_STORING_KEY); + return 0; + } + return i; +} + +int STORE_modify_private_key(STORE *s, OPENSSL_ITEM search_attributes[], + OPENSSL_ITEM add_attributes[], + OPENSSL_ITEM modify_attributes[], + OPENSSL_ITEM delete_attributes[], + OPENSSL_ITEM parameters[]) +{ + check_store(s, STORE_F_STORE_MODIFY_PRIVATE_KEY, + modify_object, STORE_R_NO_MODIFY_OBJECT_FUNCTION); + + if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY, + search_attributes, add_attributes, + modify_attributes, delete_attributes, + parameters)) { + STOREerr(STORE_F_STORE_MODIFY_PRIVATE_KEY, + STORE_R_FAILED_MODIFYING_PRIVATE_KEY); + return 0; + } + return 1; +} + +int STORE_revoke_private_key(STORE *s, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + int i; + + check_store(s, STORE_F_STORE_REVOKE_PRIVATE_KEY, + revoke_object, STORE_R_NO_REVOKE_OBJECT_FUNCTION); + + i = s->meth->revoke_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY, + attributes, parameters); + + if (!i) { + STOREerr(STORE_F_STORE_REVOKE_PRIVATE_KEY, + STORE_R_FAILED_REVOKING_KEY); + return 0; + } + return i; +} + +int STORE_delete_private_key(STORE *s, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + check_store(s, STORE_F_STORE_DELETE_PRIVATE_KEY, + delete_object, STORE_R_NO_DELETE_OBJECT_FUNCTION); + + if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY, + attributes, parameters)) { + STOREerr(STORE_F_STORE_DELETE_PRIVATE_KEY, + STORE_R_FAILED_DELETING_KEY); + return 0; + } + return 1; +} + +void *STORE_list_private_key_start(STORE *s, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + void *handle; + + check_store(s, STORE_F_STORE_LIST_PRIVATE_KEY_START, + list_object_start, STORE_R_NO_LIST_OBJECT_START_FUNCTION); + + handle = s->meth->list_object_start(s, STORE_OBJECT_TYPE_PRIVATE_KEY, + attributes, parameters); + if (!handle) { + STOREerr(STORE_F_STORE_LIST_PRIVATE_KEY_START, + STORE_R_FAILED_LISTING_KEYS); + return 0; + } + return handle; +} + +EVP_PKEY *STORE_list_private_key_next(STORE *s, void *handle) +{ + STORE_OBJECT *object; + EVP_PKEY *pkey; + + check_store(s, STORE_F_STORE_LIST_PRIVATE_KEY_NEXT, + list_object_next, STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION); + + object = s->meth->list_object_next(s, handle); + if (!object || !object->data.key || !object->data.key) { + STOREerr(STORE_F_STORE_LIST_PRIVATE_KEY_NEXT, + STORE_R_FAILED_LISTING_KEYS); + return 0; + } + CRYPTO_add(&object->data.key->references, 1, CRYPTO_LOCK_EVP_PKEY); +#ifdef REF_PRINT + REF_PRINT("EVP_PKEY", data); +#endif + pkey = object->data.key; + STORE_OBJECT_free(object); + return pkey; +} + +int STORE_list_private_key_end(STORE *s, void *handle) +{ + check_store(s, STORE_F_STORE_LIST_PRIVATE_KEY_END, + list_object_end, STORE_R_NO_LIST_OBJECT_END_FUNCTION); + + if (!s->meth->list_object_end(s, handle)) { + STOREerr(STORE_F_STORE_LIST_PRIVATE_KEY_END, + STORE_R_FAILED_LISTING_KEYS); + return 0; + } + return 1; +} + +int STORE_list_private_key_endp(STORE *s, void *handle) +{ + check_store(s, STORE_F_STORE_LIST_PRIVATE_KEY_ENDP, + list_object_endp, STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION); + + if (!s->meth->list_object_endp(s, handle)) { + STOREerr(STORE_F_STORE_LIST_PRIVATE_KEY_ENDP, + STORE_R_FAILED_LISTING_KEYS); + return 0; + } + return 1; +} + +EVP_PKEY *STORE_get_public_key(STORE *s, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + STORE_OBJECT *object; + EVP_PKEY *pkey; + + check_store(s, STORE_F_STORE_GET_PUBLIC_KEY, + get_object, STORE_R_NO_GET_OBJECT_FUNCTION); + + object = s->meth->get_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY, + attributes, parameters); + if (!object || !object->data.key || !object->data.key) { + STOREerr(STORE_F_STORE_GET_PUBLIC_KEY, STORE_R_FAILED_GETTING_KEY); + return 0; + } + CRYPTO_add(&object->data.key->references, 1, CRYPTO_LOCK_EVP_PKEY); +#ifdef REF_PRINT + REF_PRINT("EVP_PKEY", data); +#endif + pkey = object->data.key; + STORE_OBJECT_free(object); + return pkey; +} + +int STORE_store_public_key(STORE *s, EVP_PKEY *data, + OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + STORE_OBJECT *object; + int i; + + check_store(s, STORE_F_STORE_STORE_PUBLIC_KEY, + store_object, STORE_R_NO_STORE_OBJECT_FUNCTION); + + object = STORE_OBJECT_new(); + if (!object) { + STOREerr(STORE_F_STORE_STORE_PUBLIC_KEY, ERR_R_MALLOC_FAILURE); + return 0; + } + object->data.key = EVP_PKEY_new(); + if (!object->data.key) { + STOREerr(STORE_F_STORE_STORE_PUBLIC_KEY, ERR_R_MALLOC_FAILURE); + return 0; + } + + CRYPTO_add(&data->references, 1, CRYPTO_LOCK_EVP_PKEY); +#ifdef REF_PRINT + REF_PRINT("EVP_PKEY", data); +#endif + object->data.key = data; + + i = s->meth->store_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY, object, + attributes, parameters); + + STORE_OBJECT_free(object); + + if (!i) { + STOREerr(STORE_F_STORE_STORE_PUBLIC_KEY, STORE_R_FAILED_STORING_KEY); + return 0; + } + return i; +} + +int STORE_modify_public_key(STORE *s, OPENSSL_ITEM search_attributes[], + OPENSSL_ITEM add_attributes[], + OPENSSL_ITEM modify_attributes[], + OPENSSL_ITEM delete_attributes[], + OPENSSL_ITEM parameters[]) +{ + check_store(s, STORE_F_STORE_MODIFY_PUBLIC_KEY, + modify_object, STORE_R_NO_MODIFY_OBJECT_FUNCTION); + + if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY, + search_attributes, add_attributes, + modify_attributes, delete_attributes, + parameters)) { + STOREerr(STORE_F_STORE_MODIFY_PUBLIC_KEY, + STORE_R_FAILED_MODIFYING_PUBLIC_KEY); + return 0; + } + return 1; +} + +int STORE_revoke_public_key(STORE *s, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + int i; + + check_store(s, STORE_F_STORE_REVOKE_PUBLIC_KEY, + revoke_object, STORE_R_NO_REVOKE_OBJECT_FUNCTION); + + i = s->meth->revoke_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY, + attributes, parameters); + + if (!i) { + STOREerr(STORE_F_STORE_REVOKE_PUBLIC_KEY, + STORE_R_FAILED_REVOKING_KEY); + return 0; + } + return i; +} + +int STORE_delete_public_key(STORE *s, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + check_store(s, STORE_F_STORE_DELETE_PUBLIC_KEY, + delete_object, STORE_R_NO_DELETE_OBJECT_FUNCTION); + + if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY, + attributes, parameters)) { + STOREerr(STORE_F_STORE_DELETE_PUBLIC_KEY, + STORE_R_FAILED_DELETING_KEY); + return 0; + } + return 1; +} + +void *STORE_list_public_key_start(STORE *s, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + void *handle; + + check_store(s, STORE_F_STORE_LIST_PUBLIC_KEY_START, + list_object_start, STORE_R_NO_LIST_OBJECT_START_FUNCTION); + + handle = s->meth->list_object_start(s, STORE_OBJECT_TYPE_PUBLIC_KEY, + attributes, parameters); + if (!handle) { + STOREerr(STORE_F_STORE_LIST_PUBLIC_KEY_START, + STORE_R_FAILED_LISTING_KEYS); + return 0; + } + return handle; +} + +EVP_PKEY *STORE_list_public_key_next(STORE *s, void *handle) +{ + STORE_OBJECT *object; + EVP_PKEY *pkey; + + check_store(s, STORE_F_STORE_LIST_PUBLIC_KEY_NEXT, + list_object_next, STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION); + + object = s->meth->list_object_next(s, handle); + if (!object || !object->data.key || !object->data.key) { + STOREerr(STORE_F_STORE_LIST_PUBLIC_KEY_NEXT, + STORE_R_FAILED_LISTING_KEYS); + return 0; + } + CRYPTO_add(&object->data.key->references, 1, CRYPTO_LOCK_EVP_PKEY); +#ifdef REF_PRINT + REF_PRINT("EVP_PKEY", data); +#endif + pkey = object->data.key; + STORE_OBJECT_free(object); + return pkey; +} + +int STORE_list_public_key_end(STORE *s, void *handle) +{ + check_store(s, STORE_F_STORE_LIST_PUBLIC_KEY_END, + list_object_end, STORE_R_NO_LIST_OBJECT_END_FUNCTION); + + if (!s->meth->list_object_end(s, handle)) { + STOREerr(STORE_F_STORE_LIST_PUBLIC_KEY_END, + STORE_R_FAILED_LISTING_KEYS); + return 0; + } + return 1; +} + +int STORE_list_public_key_endp(STORE *s, void *handle) +{ + check_store(s, STORE_F_STORE_LIST_PUBLIC_KEY_ENDP, + list_object_endp, STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION); + + if (!s->meth->list_object_endp(s, handle)) { + STOREerr(STORE_F_STORE_LIST_PUBLIC_KEY_ENDP, + STORE_R_FAILED_LISTING_KEYS); + return 0; + } + return 1; +} + +X509_CRL *STORE_generate_crl(STORE *s, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + STORE_OBJECT *object; + X509_CRL *crl; + + check_store(s, STORE_F_STORE_GENERATE_CRL, + generate_object, STORE_R_NO_GENERATE_CRL_FUNCTION); + + object = s->meth->generate_object(s, STORE_OBJECT_TYPE_X509_CRL, + attributes, parameters); + if (!object || !object->data.crl) { + STOREerr(STORE_F_STORE_GENERATE_CRL, STORE_R_FAILED_GENERATING_CRL); + return 0; + } + CRYPTO_add(&object->data.crl->references, 1, CRYPTO_LOCK_X509_CRL); +#ifdef REF_PRINT + REF_PRINT("X509_CRL", data); +#endif + crl = object->data.crl; + STORE_OBJECT_free(object); + return crl; +} + +X509_CRL *STORE_get_crl(STORE *s, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + STORE_OBJECT *object; + X509_CRL *crl; + + check_store(s, STORE_F_STORE_GET_CRL, + get_object, STORE_R_NO_GET_OBJECT_FUNCTION); + + object = s->meth->get_object(s, STORE_OBJECT_TYPE_X509_CRL, + attributes, parameters); + if (!object || !object->data.crl) { + STOREerr(STORE_F_STORE_GET_CRL, STORE_R_FAILED_GETTING_KEY); + return 0; + } + CRYPTO_add(&object->data.crl->references, 1, CRYPTO_LOCK_X509_CRL); +#ifdef REF_PRINT + REF_PRINT("X509_CRL", data); +#endif + crl = object->data.crl; + STORE_OBJECT_free(object); + return crl; +} + +int STORE_store_crl(STORE *s, X509_CRL *data, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + STORE_OBJECT *object; + int i; + + check_store(s, STORE_F_STORE_STORE_CRL, + store_object, STORE_R_NO_STORE_OBJECT_FUNCTION); + + object = STORE_OBJECT_new(); + if (!object) { + STOREerr(STORE_F_STORE_STORE_CRL, ERR_R_MALLOC_FAILURE); + return 0; + } + + CRYPTO_add(&data->references, 1, CRYPTO_LOCK_X509_CRL); +#ifdef REF_PRINT + REF_PRINT("X509_CRL", data); +#endif + object->data.crl = data; + + i = s->meth->store_object(s, STORE_OBJECT_TYPE_X509_CRL, object, + attributes, parameters); + + STORE_OBJECT_free(object); + + if (!i) { + STOREerr(STORE_F_STORE_STORE_CRL, STORE_R_FAILED_STORING_KEY); + return 0; + } + return i; +} + +int STORE_modify_crl(STORE *s, OPENSSL_ITEM search_attributes[], + OPENSSL_ITEM add_attributes[], + OPENSSL_ITEM modify_attributes[], + OPENSSL_ITEM delete_attributes[], + OPENSSL_ITEM parameters[]) +{ + check_store(s, STORE_F_STORE_MODIFY_CRL, + modify_object, STORE_R_NO_MODIFY_OBJECT_FUNCTION); + + if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_X509_CRL, + search_attributes, add_attributes, + modify_attributes, delete_attributes, + parameters)) { + STOREerr(STORE_F_STORE_MODIFY_CRL, STORE_R_FAILED_MODIFYING_CRL); + return 0; + } + return 1; +} + +int STORE_delete_crl(STORE *s, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + check_store(s, STORE_F_STORE_DELETE_CRL, + delete_object, STORE_R_NO_DELETE_OBJECT_FUNCTION); + + if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_X509_CRL, + attributes, parameters)) { + STOREerr(STORE_F_STORE_DELETE_CRL, STORE_R_FAILED_DELETING_KEY); + return 0; + } + return 1; +} + +void *STORE_list_crl_start(STORE *s, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + void *handle; + + check_store(s, STORE_F_STORE_LIST_CRL_START, + list_object_start, STORE_R_NO_LIST_OBJECT_START_FUNCTION); + + handle = s->meth->list_object_start(s, STORE_OBJECT_TYPE_X509_CRL, + attributes, parameters); + if (!handle) { + STOREerr(STORE_F_STORE_LIST_CRL_START, STORE_R_FAILED_LISTING_KEYS); + return 0; + } + return handle; +} + +X509_CRL *STORE_list_crl_next(STORE *s, void *handle) +{ + STORE_OBJECT *object; + X509_CRL *crl; + + check_store(s, STORE_F_STORE_LIST_CRL_NEXT, + list_object_next, STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION); + + object = s->meth->list_object_next(s, handle); + if (!object || !object->data.crl) { + STOREerr(STORE_F_STORE_LIST_CRL_NEXT, STORE_R_FAILED_LISTING_KEYS); + return 0; + } + CRYPTO_add(&object->data.crl->references, 1, CRYPTO_LOCK_X509_CRL); +#ifdef REF_PRINT + REF_PRINT("X509_CRL", data); +#endif + crl = object->data.crl; + STORE_OBJECT_free(object); + return crl; +} + +int STORE_list_crl_end(STORE *s, void *handle) +{ + check_store(s, STORE_F_STORE_LIST_CRL_END, + list_object_end, STORE_R_NO_LIST_OBJECT_END_FUNCTION); + + if (!s->meth->list_object_end(s, handle)) { + STOREerr(STORE_F_STORE_LIST_CRL_END, STORE_R_FAILED_LISTING_KEYS); + return 0; + } + return 1; +} + +int STORE_list_crl_endp(STORE *s, void *handle) +{ + check_store(s, STORE_F_STORE_LIST_CRL_ENDP, + list_object_endp, STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION); + + if (!s->meth->list_object_endp(s, handle)) { + STOREerr(STORE_F_STORE_LIST_CRL_ENDP, STORE_R_FAILED_LISTING_KEYS); + return 0; + } + return 1; +} + +int STORE_store_number(STORE *s, BIGNUM *data, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + STORE_OBJECT *object; + int i; + + check_store(s, STORE_F_STORE_STORE_NUMBER, + store_object, STORE_R_NO_STORE_OBJECT_NUMBER_FUNCTION); + + object = STORE_OBJECT_new(); + if (!object) { + STOREerr(STORE_F_STORE_STORE_NUMBER, ERR_R_MALLOC_FAILURE); + return 0; + } + + object->data.number = data; + + i = s->meth->store_object(s, STORE_OBJECT_TYPE_NUMBER, object, + attributes, parameters); + + STORE_OBJECT_free(object); + + if (!i) { + STOREerr(STORE_F_STORE_STORE_NUMBER, STORE_R_FAILED_STORING_NUMBER); + return 0; + } + return 1; +} + +int STORE_modify_number(STORE *s, OPENSSL_ITEM search_attributes[], + OPENSSL_ITEM add_attributes[], + OPENSSL_ITEM modify_attributes[], + OPENSSL_ITEM delete_attributes[], + OPENSSL_ITEM parameters[]) +{ + check_store(s, STORE_F_STORE_MODIFY_NUMBER, + modify_object, STORE_R_NO_MODIFY_OBJECT_FUNCTION); + + if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_NUMBER, + search_attributes, add_attributes, + modify_attributes, delete_attributes, + parameters)) { + STOREerr(STORE_F_STORE_MODIFY_NUMBER, + STORE_R_FAILED_MODIFYING_NUMBER); + return 0; + } + return 1; +} + +BIGNUM *STORE_get_number(STORE *s, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + STORE_OBJECT *object; + BIGNUM *n; + + check_store(s, STORE_F_STORE_GET_NUMBER, + get_object, STORE_R_NO_GET_OBJECT_NUMBER_FUNCTION); + + object = s->meth->get_object(s, STORE_OBJECT_TYPE_NUMBER, attributes, + parameters); + if (!object || !object->data.number) { + STOREerr(STORE_F_STORE_GET_NUMBER, STORE_R_FAILED_GETTING_NUMBER); + return 0; + } + n = object->data.number; + object->data.number = NULL; + STORE_OBJECT_free(object); + return n; +} + +int STORE_delete_number(STORE *s, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + check_store(s, STORE_F_STORE_DELETE_NUMBER, + delete_object, STORE_R_NO_DELETE_NUMBER_FUNCTION); + + if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_NUMBER, attributes, + parameters)) { + STOREerr(STORE_F_STORE_DELETE_NUMBER, STORE_R_FAILED_DELETING_NUMBER); + return 0; + } + return 1; +} + +int STORE_store_arbitrary(STORE *s, BUF_MEM *data, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + STORE_OBJECT *object; + int i; + + check_store(s, STORE_F_STORE_STORE_ARBITRARY, + store_object, STORE_R_NO_STORE_OBJECT_ARBITRARY_FUNCTION); + + object = STORE_OBJECT_new(); + if (!object) { + STOREerr(STORE_F_STORE_STORE_ARBITRARY, ERR_R_MALLOC_FAILURE); + return 0; + } + + object->data.arbitrary = data; + + i = s->meth->store_object(s, STORE_OBJECT_TYPE_ARBITRARY, object, + attributes, parameters); + + STORE_OBJECT_free(object); + + if (!i) { + STOREerr(STORE_F_STORE_STORE_ARBITRARY, + STORE_R_FAILED_STORING_ARBITRARY); + return 0; + } + return 1; +} + +int STORE_modify_arbitrary(STORE *s, OPENSSL_ITEM search_attributes[], + OPENSSL_ITEM add_attributes[], + OPENSSL_ITEM modify_attributes[], + OPENSSL_ITEM delete_attributes[], + OPENSSL_ITEM parameters[]) +{ + check_store(s, STORE_F_STORE_MODIFY_ARBITRARY, + modify_object, STORE_R_NO_MODIFY_OBJECT_FUNCTION); + + if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_ARBITRARY, + search_attributes, add_attributes, + modify_attributes, delete_attributes, + parameters)) { + STOREerr(STORE_F_STORE_MODIFY_ARBITRARY, + STORE_R_FAILED_MODIFYING_ARBITRARY); + return 0; + } + return 1; +} + +BUF_MEM *STORE_get_arbitrary(STORE *s, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + STORE_OBJECT *object; + BUF_MEM *b; + + check_store(s, STORE_F_STORE_GET_ARBITRARY, + get_object, STORE_R_NO_GET_OBJECT_ARBITRARY_FUNCTION); + + object = s->meth->get_object(s, STORE_OBJECT_TYPE_ARBITRARY, + attributes, parameters); + if (!object || !object->data.arbitrary) { + STOREerr(STORE_F_STORE_GET_ARBITRARY, + STORE_R_FAILED_GETTING_ARBITRARY); + return 0; + } + b = object->data.arbitrary; + object->data.arbitrary = NULL; + STORE_OBJECT_free(object); + return b; +} + +int STORE_delete_arbitrary(STORE *s, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + check_store(s, STORE_F_STORE_DELETE_ARBITRARY, + delete_object, STORE_R_NO_DELETE_ARBITRARY_FUNCTION); + + if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_ARBITRARY, attributes, + parameters)) { + STOREerr(STORE_F_STORE_DELETE_ARBITRARY, + STORE_R_FAILED_DELETING_ARBITRARY); + return 0; + } + return 1; +} + +STORE_OBJECT *STORE_OBJECT_new(void) +{ + STORE_OBJECT *object = OPENSSL_malloc(sizeof(STORE_OBJECT)); + if (object) + memset(object, 0, sizeof(STORE_OBJECT)); + return object; +} + +void STORE_OBJECT_free(STORE_OBJECT *data) +{ + if (!data) + return; + switch (data->type) { + case STORE_OBJECT_TYPE_X509_CERTIFICATE: + X509_free(data->data.x509.certificate); + break; + case STORE_OBJECT_TYPE_X509_CRL: + X509_CRL_free(data->data.crl); + break; + case STORE_OBJECT_TYPE_PRIVATE_KEY: + case STORE_OBJECT_TYPE_PUBLIC_KEY: + EVP_PKEY_free(data->data.key); + break; + case STORE_OBJECT_TYPE_NUMBER: + BN_free(data->data.number); + break; + case STORE_OBJECT_TYPE_ARBITRARY: + BUF_MEM_free(data->data.arbitrary); + break; + } + OPENSSL_free(data); +} + +IMPLEMENT_STACK_OF(STORE_OBJECT*) + +struct STORE_attr_info_st { + unsigned char set[(STORE_ATTR_TYPE_NUM + 8) / 8]; + union { + char *cstring; + unsigned char *sha1string; + X509_NAME *dn; + BIGNUM *number; + void *any; + } values[STORE_ATTR_TYPE_NUM + 1]; + size_t value_sizes[STORE_ATTR_TYPE_NUM + 1]; +}; + +#define ATTR_IS_SET(a,i) ((i) > 0 && (i) < STORE_ATTR_TYPE_NUM \ + && ((a)->set[(i) / 8] & (1 << ((i) % 8)))) +#define SET_ATTRBIT(a,i) ((a)->set[(i) / 8] |= (1 << ((i) % 8))) +#define CLEAR_ATTRBIT(a,i) ((a)->set[(i) / 8] &= ~(1 << ((i) % 8))) + +STORE_ATTR_INFO *STORE_ATTR_INFO_new(void) +{ + return (STORE_ATTR_INFO *)OPENSSL_malloc(sizeof(STORE_ATTR_INFO)); +} + +static void STORE_ATTR_INFO_attr_free(STORE_ATTR_INFO *attrs, + STORE_ATTR_TYPES code) +{ + if (ATTR_IS_SET(attrs, code)) { + switch (code) { + case STORE_ATTR_FRIENDLYNAME: + case STORE_ATTR_EMAIL: + case STORE_ATTR_FILENAME: + STORE_ATTR_INFO_modify_cstr(attrs, code, NULL, 0); + break; + case STORE_ATTR_KEYID: + case STORE_ATTR_ISSUERKEYID: + case STORE_ATTR_SUBJECTKEYID: + case STORE_ATTR_ISSUERSERIALHASH: + case STORE_ATTR_CERTHASH: + STORE_ATTR_INFO_modify_sha1str(attrs, code, NULL, 0); + break; + case STORE_ATTR_ISSUER: + case STORE_ATTR_SUBJECT: + STORE_ATTR_INFO_modify_dn(attrs, code, NULL); + break; + case STORE_ATTR_SERIAL: + STORE_ATTR_INFO_modify_number(attrs, code, NULL); + break; + default: + break; + } + } +} + +int STORE_ATTR_INFO_free(STORE_ATTR_INFO *attrs) +{ + if (attrs) { + STORE_ATTR_TYPES i; + for (i = 0; i++ < STORE_ATTR_TYPE_NUM;) + STORE_ATTR_INFO_attr_free(attrs, i); + OPENSSL_free(attrs); + } + return 1; +} + +char *STORE_ATTR_INFO_get0_cstr(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code) +{ + if (!attrs) { + STOREerr(STORE_F_STORE_ATTR_INFO_GET0_CSTR, + ERR_R_PASSED_NULL_PARAMETER); + return NULL; + } + if (ATTR_IS_SET(attrs, code)) + return attrs->values[code].cstring; + STOREerr(STORE_F_STORE_ATTR_INFO_GET0_CSTR, STORE_R_NO_VALUE); + return NULL; +} + +unsigned char *STORE_ATTR_INFO_get0_sha1str(STORE_ATTR_INFO *attrs, + STORE_ATTR_TYPES code) +{ + if (!attrs) { + STOREerr(STORE_F_STORE_ATTR_INFO_GET0_SHA1STR, + ERR_R_PASSED_NULL_PARAMETER); + return NULL; + } + if (ATTR_IS_SET(attrs, code)) + return attrs->values[code].sha1string; + STOREerr(STORE_F_STORE_ATTR_INFO_GET0_SHA1STR, STORE_R_NO_VALUE); + return NULL; +} + +X509_NAME *STORE_ATTR_INFO_get0_dn(STORE_ATTR_INFO *attrs, + STORE_ATTR_TYPES code) +{ + if (!attrs) { + STOREerr(STORE_F_STORE_ATTR_INFO_GET0_DN, + ERR_R_PASSED_NULL_PARAMETER); + return NULL; + } + if (ATTR_IS_SET(attrs, code)) + return attrs->values[code].dn; + STOREerr(STORE_F_STORE_ATTR_INFO_GET0_DN, STORE_R_NO_VALUE); + return NULL; +} + +BIGNUM *STORE_ATTR_INFO_get0_number(STORE_ATTR_INFO *attrs, + STORE_ATTR_TYPES code) +{ + if (!attrs) { + STOREerr(STORE_F_STORE_ATTR_INFO_GET0_NUMBER, + ERR_R_PASSED_NULL_PARAMETER); + return NULL; + } + if (ATTR_IS_SET(attrs, code)) + return attrs->values[code].number; + STOREerr(STORE_F_STORE_ATTR_INFO_GET0_NUMBER, STORE_R_NO_VALUE); + return NULL; +} + +int STORE_ATTR_INFO_set_cstr(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, + char *cstr, size_t cstr_size) +{ + if (!attrs) { + STOREerr(STORE_F_STORE_ATTR_INFO_SET_CSTR, + ERR_R_PASSED_NULL_PARAMETER); + return 0; + } + if (!ATTR_IS_SET(attrs, code)) { + if ((attrs->values[code].cstring = BUF_strndup(cstr, cstr_size))) + return 1; + STOREerr(STORE_F_STORE_ATTR_INFO_SET_CSTR, ERR_R_MALLOC_FAILURE); + return 0; + } + STOREerr(STORE_F_STORE_ATTR_INFO_SET_CSTR, STORE_R_ALREADY_HAS_A_VALUE); + return 0; +} + +int STORE_ATTR_INFO_set_sha1str(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, + unsigned char *sha1str, size_t sha1str_size) +{ + if (!attrs) { + STOREerr(STORE_F_STORE_ATTR_INFO_SET_SHA1STR, + ERR_R_PASSED_NULL_PARAMETER); + return 0; + } + if (!ATTR_IS_SET(attrs, code)) { + if ((attrs->values[code].sha1string = + (unsigned char *)BUF_memdup(sha1str, sha1str_size))) + return 1; + STOREerr(STORE_F_STORE_ATTR_INFO_SET_SHA1STR, ERR_R_MALLOC_FAILURE); + return 0; + } + STOREerr(STORE_F_STORE_ATTR_INFO_SET_SHA1STR, + STORE_R_ALREADY_HAS_A_VALUE); + return 0; +} + +int STORE_ATTR_INFO_set_dn(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, + X509_NAME *dn) +{ + if (!attrs) { + STOREerr(STORE_F_STORE_ATTR_INFO_SET_DN, ERR_R_PASSED_NULL_PARAMETER); + return 0; + } + if (!ATTR_IS_SET(attrs, code)) { + if ((attrs->values[code].dn = X509_NAME_dup(dn))) + return 1; + STOREerr(STORE_F_STORE_ATTR_INFO_SET_DN, ERR_R_MALLOC_FAILURE); + return 0; + } + STOREerr(STORE_F_STORE_ATTR_INFO_SET_DN, STORE_R_ALREADY_HAS_A_VALUE); + return 0; +} + +int STORE_ATTR_INFO_set_number(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, + BIGNUM *number) +{ + if (!attrs) { + STOREerr(STORE_F_STORE_ATTR_INFO_SET_NUMBER, + ERR_R_PASSED_NULL_PARAMETER); + return 0; + } + if (!ATTR_IS_SET(attrs, code)) { + if ((attrs->values[code].number = BN_dup(number))) + return 1; + STOREerr(STORE_F_STORE_ATTR_INFO_SET_NUMBER, ERR_R_MALLOC_FAILURE); + return 0; + } + STOREerr(STORE_F_STORE_ATTR_INFO_SET_NUMBER, STORE_R_ALREADY_HAS_A_VALUE); + return 0; +} + +int STORE_ATTR_INFO_modify_cstr(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, + char *cstr, size_t cstr_size) +{ + if (!attrs) { + STOREerr(STORE_F_STORE_ATTR_INFO_MODIFY_CSTR, + ERR_R_PASSED_NULL_PARAMETER); + return 0; + } + if (ATTR_IS_SET(attrs, code)) { + OPENSSL_free(attrs->values[code].cstring); + attrs->values[code].cstring = NULL; + CLEAR_ATTRBIT(attrs, code); + } + return STORE_ATTR_INFO_set_cstr(attrs, code, cstr, cstr_size); +} + +int STORE_ATTR_INFO_modify_sha1str(STORE_ATTR_INFO *attrs, + STORE_ATTR_TYPES code, + unsigned char *sha1str, + size_t sha1str_size) +{ + if (!attrs) { + STOREerr(STORE_F_STORE_ATTR_INFO_MODIFY_SHA1STR, + ERR_R_PASSED_NULL_PARAMETER); + return 0; + } + if (ATTR_IS_SET(attrs, code)) { + OPENSSL_free(attrs->values[code].sha1string); + attrs->values[code].sha1string = NULL; + CLEAR_ATTRBIT(attrs, code); + } + return STORE_ATTR_INFO_set_sha1str(attrs, code, sha1str, sha1str_size); +} + +int STORE_ATTR_INFO_modify_dn(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, + X509_NAME *dn) +{ + if (!attrs) { + STOREerr(STORE_F_STORE_ATTR_INFO_MODIFY_DN, + ERR_R_PASSED_NULL_PARAMETER); + return 0; + } + if (ATTR_IS_SET(attrs, code)) { + OPENSSL_free(attrs->values[code].dn); + attrs->values[code].dn = NULL; + CLEAR_ATTRBIT(attrs, code); + } + return STORE_ATTR_INFO_set_dn(attrs, code, dn); +} + +int STORE_ATTR_INFO_modify_number(STORE_ATTR_INFO *attrs, + STORE_ATTR_TYPES code, BIGNUM *number) +{ + if (!attrs) { + STOREerr(STORE_F_STORE_ATTR_INFO_MODIFY_NUMBER, + ERR_R_PASSED_NULL_PARAMETER); + return 0; + } + if (ATTR_IS_SET(attrs, code)) { + OPENSSL_free(attrs->values[code].number); + attrs->values[code].number = NULL; + CLEAR_ATTRBIT(attrs, code); + } + return STORE_ATTR_INFO_set_number(attrs, code, number); +} + +struct attr_list_ctx_st { + OPENSSL_ITEM *attributes; +}; +void *STORE_parse_attrs_start(OPENSSL_ITEM *attributes) +{ + if (attributes) { + struct attr_list_ctx_st *context = (struct attr_list_ctx_st *) + OPENSSL_malloc(sizeof(struct attr_list_ctx_st)); + if (context) + context->attributes = attributes; + else + STOREerr(STORE_F_STORE_PARSE_ATTRS_START, ERR_R_MALLOC_FAILURE); + return context; + } + STOREerr(STORE_F_STORE_PARSE_ATTRS_START, ERR_R_PASSED_NULL_PARAMETER); + return 0; +} + +STORE_ATTR_INFO *STORE_parse_attrs_next(void *handle) +{ + struct attr_list_ctx_st *context = (struct attr_list_ctx_st *)handle; + + if (context && context->attributes) { + STORE_ATTR_INFO *attrs = NULL; + + while (context->attributes + && context->attributes->code != STORE_ATTR_OR + && context->attributes->code != STORE_ATTR_END) { + switch (context->attributes->code) { + case STORE_ATTR_FRIENDLYNAME: + case STORE_ATTR_EMAIL: + case STORE_ATTR_FILENAME: + if (!attrs) + attrs = STORE_ATTR_INFO_new(); + if (attrs == NULL) { + STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT, + ERR_R_MALLOC_FAILURE); + goto err; + } + STORE_ATTR_INFO_set_cstr(attrs, + context->attributes->code, + context->attributes->value, + context->attributes->value_size); + break; + case STORE_ATTR_KEYID: + case STORE_ATTR_ISSUERKEYID: + case STORE_ATTR_SUBJECTKEYID: + case STORE_ATTR_ISSUERSERIALHASH: + case STORE_ATTR_CERTHASH: + if (!attrs) + attrs = STORE_ATTR_INFO_new(); + if (attrs == NULL) { + STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT, + ERR_R_MALLOC_FAILURE); + goto err; + } + STORE_ATTR_INFO_set_sha1str(attrs, + context->attributes->code, + context->attributes->value, + context->attributes->value_size); + break; + case STORE_ATTR_ISSUER: + case STORE_ATTR_SUBJECT: + if (!attrs) + attrs = STORE_ATTR_INFO_new(); + if (attrs == NULL) { + STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT, + ERR_R_MALLOC_FAILURE); + goto err; + } + STORE_ATTR_INFO_modify_dn(attrs, + context->attributes->code, + context->attributes->value); + break; + case STORE_ATTR_SERIAL: + if (!attrs) + attrs = STORE_ATTR_INFO_new(); + if (attrs == NULL) { + STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT, + ERR_R_MALLOC_FAILURE); + goto err; + } + STORE_ATTR_INFO_modify_number(attrs, + context->attributes->code, + context->attributes->value); + break; + } + context->attributes++; + } + if (context->attributes->code == STORE_ATTR_OR) + context->attributes++; + return attrs; + err: + while (context->attributes + && context->attributes->code != STORE_ATTR_OR + && context->attributes->code != STORE_ATTR_END) + context->attributes++; + if (context->attributes->code == STORE_ATTR_OR) + context->attributes++; + return NULL; + } + STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT, ERR_R_PASSED_NULL_PARAMETER); + return NULL; +} + +int STORE_parse_attrs_end(void *handle) +{ + struct attr_list_ctx_st *context = (struct attr_list_ctx_st *)handle; + + if (context && context->attributes) { +#if 0 + OPENSSL_ITEM *attributes = context->attributes; +#endif + OPENSSL_free(context); + return 1; + } + STOREerr(STORE_F_STORE_PARSE_ATTRS_END, ERR_R_PASSED_NULL_PARAMETER); + return 0; +} + +int STORE_parse_attrs_endp(void *handle) +{ + struct attr_list_ctx_st *context = (struct attr_list_ctx_st *)handle; + + if (context && context->attributes) { + return context->attributes->code == STORE_ATTR_END; + } + STOREerr(STORE_F_STORE_PARSE_ATTRS_ENDP, ERR_R_PASSED_NULL_PARAMETER); + return 0; +} + +static int attr_info_compare_compute_range(const unsigned char *abits, + const unsigned char *bbits, + unsigned int *alowp, + unsigned int *ahighp, + unsigned int *blowp, + unsigned int *bhighp) +{ + unsigned int alow = (unsigned int)-1, ahigh = 0; + unsigned int blow = (unsigned int)-1, bhigh = 0; + int i, res = 0; + + for (i = 0; i < (STORE_ATTR_TYPE_NUM + 8) / 8; i++, abits++, bbits++) { + if (res == 0) { + if (*abits < *bbits) + res = -1; + if (*abits > *bbits) + res = 1; + } + if (*abits) { + if (alow == (unsigned int)-1) { + alow = i * 8; + if (!(*abits & 0x01)) + alow++; + if (!(*abits & 0x02)) + alow++; + if (!(*abits & 0x04)) + alow++; + if (!(*abits & 0x08)) + alow++; + if (!(*abits & 0x10)) + alow++; + if (!(*abits & 0x20)) + alow++; + if (!(*abits & 0x40)) + alow++; + } + ahigh = i * 8 + 7; + if (!(*abits & 0x80)) + ahigh++; + if (!(*abits & 0x40)) + ahigh++; + if (!(*abits & 0x20)) + ahigh++; + if (!(*abits & 0x10)) + ahigh++; + if (!(*abits & 0x08)) + ahigh++; + if (!(*abits & 0x04)) + ahigh++; + if (!(*abits & 0x02)) + ahigh++; + } + if (*bbits) { + if (blow == (unsigned int)-1) { + blow = i * 8; + if (!(*bbits & 0x01)) + blow++; + if (!(*bbits & 0x02)) + blow++; + if (!(*bbits & 0x04)) + blow++; + if (!(*bbits & 0x08)) + blow++; + if (!(*bbits & 0x10)) + blow++; + if (!(*bbits & 0x20)) + blow++; + if (!(*bbits & 0x40)) + blow++; + } + bhigh = i * 8 + 7; + if (!(*bbits & 0x80)) + bhigh++; + if (!(*bbits & 0x40)) + bhigh++; + if (!(*bbits & 0x20)) + bhigh++; + if (!(*bbits & 0x10)) + bhigh++; + if (!(*bbits & 0x08)) + bhigh++; + if (!(*bbits & 0x04)) + bhigh++; + if (!(*bbits & 0x02)) + bhigh++; + } + } + if (ahigh + alow < bhigh + blow) + res = -1; + if (ahigh + alow > bhigh + blow) + res = 1; + if (alowp) + *alowp = alow; + if (ahighp) + *ahighp = ahigh; + if (blowp) + *blowp = blow; + if (bhighp) + *bhighp = bhigh; + return res; +} + +int STORE_ATTR_INFO_compare(const STORE_ATTR_INFO *const *a, + const STORE_ATTR_INFO *const *b) +{ + if (a == b) + return 0; + if (!a) + return -1; + if (!b) + return 1; + return attr_info_compare_compute_range((*a)->set, (*b)->set, 0, 0, 0, 0); +} + +int STORE_ATTR_INFO_in_range(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b) +{ + unsigned int alow, ahigh, blow, bhigh; + + if (a == b) + return 1; + if (!a) + return 0; + if (!b) + return 0; + attr_info_compare_compute_range(a->set, b->set, + &alow, &ahigh, &blow, &bhigh); + if (alow >= blow && ahigh <= bhigh) + return 1; + return 0; +} + +int STORE_ATTR_INFO_in(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b) +{ + unsigned char *abits, *bbits; + int i; + + if (a == b) + return 1; + if (!a) + return 0; + if (!b) + return 0; + abits = a->set; + bbits = b->set; + for (i = 0; i < (STORE_ATTR_TYPE_NUM + 8) / 8; i++, abits++, bbits++) { + if (*abits && (*bbits & *abits) != *abits) + return 0; + } + return 1; +} + +int STORE_ATTR_INFO_in_ex(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b) +{ + STORE_ATTR_TYPES i; + + if (a == b) + return 1; + if (!STORE_ATTR_INFO_in(a, b)) + return 0; + for (i = 1; i < STORE_ATTR_TYPE_NUM; i++) + if (ATTR_IS_SET(a, i)) { + switch (i) { + case STORE_ATTR_FRIENDLYNAME: + case STORE_ATTR_EMAIL: + case STORE_ATTR_FILENAME: + if (strcmp(a->values[i].cstring, b->values[i].cstring)) + return 0; + break; + case STORE_ATTR_KEYID: + case STORE_ATTR_ISSUERKEYID: + case STORE_ATTR_SUBJECTKEYID: + case STORE_ATTR_ISSUERSERIALHASH: + case STORE_ATTR_CERTHASH: + if (memcmp(a->values[i].sha1string, + b->values[i].sha1string, a->value_sizes[i])) + return 0; + break; + case STORE_ATTR_ISSUER: + case STORE_ATTR_SUBJECT: + if (X509_NAME_cmp(a->values[i].dn, b->values[i].dn)) + return 0; + break; + case STORE_ATTR_SERIAL: + if (BN_cmp(a->values[i].number, b->values[i].number)) + return 0; + break; + default: + break; + } + } + + return 1; +} diff --git a/openssl/crypto/store/str_locl.h b/openssl/crypto/store/str_locl.h new file mode 100644 index 0000000..c0b40f0 --- /dev/null +++ b/openssl/crypto/store/str_locl.h @@ -0,0 +1,125 @@ +/* crypto/store/str_locl.h */ +/* + * Written by Richard Levitte (richard@levitte.org) for the OpenSSL project + * 2003. + */ +/* ==================================================================== + * Copyright (c) 2003 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). + * + */ + +#ifndef HEADER_STORE_LOCL_H +# define HEADER_STORE_LOCL_H + +# include <openssl/crypto.h> +# include <openssl/store.h> + +#ifdef __cplusplus +extern "C" { +#endif + +struct store_method_st { + char *name; + /* + * All the functions return a positive integer or non-NULL for success + * and 0, a negative integer or NULL for failure + */ + /* Initialise the STORE with private data */ + STORE_INITIALISE_FUNC_PTR init; + /* Initialise the STORE with private data */ + STORE_CLEANUP_FUNC_PTR clean; + /* Generate an object of a given type */ + STORE_GENERATE_OBJECT_FUNC_PTR generate_object; + /* + * Get an object of a given type. This function isn't really very useful + * since the listing functions (below) can be used for the same purpose + * and are much more general. + */ + STORE_GET_OBJECT_FUNC_PTR get_object; + /* Store an object of a given type. */ + STORE_STORE_OBJECT_FUNC_PTR store_object; + /* Modify the attributes bound to an object of a given type. */ + STORE_MODIFY_OBJECT_FUNC_PTR modify_object; + /* Revoke an object of a given type. */ + STORE_HANDLE_OBJECT_FUNC_PTR revoke_object; + /* Delete an object of a given type. */ + STORE_HANDLE_OBJECT_FUNC_PTR delete_object; + /* + * List a bunch of objects of a given type and with the associated + * attributes. + */ + STORE_START_OBJECT_FUNC_PTR list_object_start; + STORE_NEXT_OBJECT_FUNC_PTR list_object_next; + STORE_END_OBJECT_FUNC_PTR list_object_end; + STORE_END_OBJECT_FUNC_PTR list_object_endp; + /* Store-level function to make any necessary update operations. */ + STORE_GENERIC_FUNC_PTR update_store; + /* Store-level function to get exclusive access to the store. */ + STORE_GENERIC_FUNC_PTR lock_store; + /* Store-level function to release exclusive access to the store. */ + STORE_GENERIC_FUNC_PTR unlock_store; + /* Generic control function */ + STORE_CTRL_FUNC_PTR ctrl; +}; + +struct store_st { + const STORE_METHOD *meth; + /* functional reference if 'meth' is ENGINE-provided */ + ENGINE *engine; + CRYPTO_EX_DATA ex_data; + int references; +}; +#ifdef __cplusplus +} +#endif + +#endif diff --git a/openssl/crypto/store/str_mem.c b/openssl/crypto/store/str_mem.c new file mode 100644 index 0000000..6eee5bb --- /dev/null +++ b/openssl/crypto/store/str_mem.c @@ -0,0 +1,383 @@ +/* crypto/store/str_mem.c */ +/* + * Written by Richard Levitte (richard@levitte.org) for the OpenSSL project + * 2003. + */ +/* ==================================================================== + * Copyright (c) 2003 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 <string.h> +#include <openssl/err.h> +#include "str_locl.h" + +/* + * The memory store is currently highly experimental. It's meant to become a + * base store used by other stores for internal caching (for full caching + * support, aging needs to be added). + * + * The database use is meant to support as much attribute association as + * possible, while providing for as small search ranges as possible. This is + * currently provided for by sorting the entries by numbers that are composed + * of bits set at the positions indicated by attribute type codes. This + * provides for ranges determined by the highest attribute type code value. + * A better idea might be to sort by values computed from the range of + * attributes associated with the object (basically, the difference between + * the highest and lowest attribute type code) and it's distance from a base + * (basically, the lowest associated attribute type code). + */ + +typedef struct mem_object_data_st { + STORE_OBJECT *object; + STORE_ATTR_INFO *attr_info; + int references; +} MEM_OBJECT_DATA; + +DECLARE_STACK_OF(MEM_OBJECT_DATA) +struct mem_data_st { + /* + * sorted with + * STORE_ATTR_INFO_compare(). + */ + STACK_OF(MEM_OBJECT_DATA) *data; + /* + * Currently unused, but can + * be used to add attributes + * from parts of the data. + */ + unsigned int compute_components:1; +}; + +DECLARE_STACK_OF(STORE_ATTR_INFO) +struct mem_ctx_st { + /* The type we're searching for */ + int type; + /* + * Sets of + * attributes to search for. Each + * element is a STORE_ATTR_INFO. + */ + STACK_OF(STORE_ATTR_INFO) *search_attributes; + /* + * which of the search attributes we + * found a match for, -1 when we still + * haven't found any + */ + int search_index; + /* -1 as long as we're searching for the first */ + int index; +}; + +static int mem_init(STORE *s); +static void mem_clean(STORE *s); +static STORE_OBJECT *mem_generate(STORE *s, STORE_OBJECT_TYPES type, + OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +static STORE_OBJECT *mem_get(STORE *s, STORE_OBJECT_TYPES type, + OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +static int mem_store(STORE *s, STORE_OBJECT_TYPES type, STORE_OBJECT *data, + OPENSSL_ITEM attributes[], OPENSSL_ITEM parameters[]); +static int mem_modify(STORE *s, STORE_OBJECT_TYPES type, + OPENSSL_ITEM search_attributes[], + OPENSSL_ITEM add_attributes[], + OPENSSL_ITEM modify_attributes[], + OPENSSL_ITEM delete_attributes[], + OPENSSL_ITEM parameters[]); +static int mem_delete(STORE *s, STORE_OBJECT_TYPES type, + OPENSSL_ITEM attributes[], OPENSSL_ITEM parameters[]); +static void *mem_list_start(STORE *s, STORE_OBJECT_TYPES type, + OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +static STORE_OBJECT *mem_list_next(STORE *s, void *handle); +static int mem_list_end(STORE *s, void *handle); +static int mem_list_endp(STORE *s, void *handle); +static int mem_lock(STORE *s, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +static int mem_unlock(STORE *s, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]); +static int mem_ctrl(STORE *s, int cmd, long l, void *p, void (*f) (void)); + +static STORE_METHOD store_memory = { + "OpenSSL memory store interface", + mem_init, + mem_clean, + mem_generate, + mem_get, + mem_store, + mem_modify, + NULL, /* revoke */ + mem_delete, + mem_list_start, + mem_list_next, + mem_list_end, + mem_list_endp, + NULL, /* update */ + mem_lock, + mem_unlock, + mem_ctrl +}; + +const STORE_METHOD *STORE_Memory(void) +{ + return &store_memory; +} + +static int mem_init(STORE *s) +{ + return 1; +} + +static void mem_clean(STORE *s) +{ + return; +} + +static STORE_OBJECT *mem_generate(STORE *s, STORE_OBJECT_TYPES type, + OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + STOREerr(STORE_F_MEM_GENERATE, STORE_R_NOT_IMPLEMENTED); + return 0; +} + +static STORE_OBJECT *mem_get(STORE *s, STORE_OBJECT_TYPES type, + OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + void *context = mem_list_start(s, type, attributes, parameters); + + if (context) { + STORE_OBJECT *object = mem_list_next(s, context); + + if (mem_list_end(s, context)) + return object; + } + return NULL; +} + +static int mem_store(STORE *s, STORE_OBJECT_TYPES type, + STORE_OBJECT *data, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + STOREerr(STORE_F_MEM_STORE, STORE_R_NOT_IMPLEMENTED); + return 0; +} + +static int mem_modify(STORE *s, STORE_OBJECT_TYPES type, + OPENSSL_ITEM search_attributes[], + OPENSSL_ITEM add_attributes[], + OPENSSL_ITEM modify_attributes[], + OPENSSL_ITEM delete_attributes[], + OPENSSL_ITEM parameters[]) +{ + STOREerr(STORE_F_MEM_MODIFY, STORE_R_NOT_IMPLEMENTED); + return 0; +} + +static int mem_delete(STORE *s, STORE_OBJECT_TYPES type, + OPENSSL_ITEM attributes[], OPENSSL_ITEM parameters[]) +{ + STOREerr(STORE_F_MEM_DELETE, STORE_R_NOT_IMPLEMENTED); + return 0; +} + +/* + * The list functions may be the hardest to understand. Basically, + * mem_list_start compiles a stack of attribute info elements, and puts that + * stack into the context to be returned. mem_list_next will then find the + * first matching element in the store, and then walk all the way to the end + * of the store (since any combination of attribute bits above the starting + * point may match the searched for bit pattern...). + */ +static void *mem_list_start(STORE *s, STORE_OBJECT_TYPES type, + OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + struct mem_ctx_st *context = + (struct mem_ctx_st *)OPENSSL_malloc(sizeof(struct mem_ctx_st)); + void *attribute_context = NULL; + STORE_ATTR_INFO *attrs = NULL; + + if (!context) { + STOREerr(STORE_F_MEM_LIST_START, ERR_R_MALLOC_FAILURE); + return 0; + } + memset(context, 0, sizeof(struct mem_ctx_st)); + + attribute_context = STORE_parse_attrs_start(attributes); + if (!attribute_context) { + STOREerr(STORE_F_MEM_LIST_START, ERR_R_STORE_LIB); + goto err; + } + + while ((attrs = STORE_parse_attrs_next(attribute_context))) { + if (context->search_attributes == NULL) { + context->search_attributes = + sk_STORE_ATTR_INFO_new(STORE_ATTR_INFO_compare); + if (!context->search_attributes) { + STOREerr(STORE_F_MEM_LIST_START, ERR_R_MALLOC_FAILURE); + goto err; + } + } + sk_STORE_ATTR_INFO_push(context->search_attributes, attrs); + } + if (!STORE_parse_attrs_endp(attribute_context)) + goto err; + STORE_parse_attrs_end(attribute_context); + context->search_index = -1; + context->index = -1; + return context; + err: + if (attribute_context) + STORE_parse_attrs_end(attribute_context); + mem_list_end(s, context); + return NULL; +} + +static STORE_OBJECT *mem_list_next(STORE *s, void *handle) +{ + int i; + struct mem_ctx_st *context = (struct mem_ctx_st *)handle; + struct mem_object_data_st key = { 0, 0, 1 }; + struct mem_data_st *store = (struct mem_data_st *)STORE_get_ex_data(s, 1); + int srch; + int cres = 0; + + if (!context) { + STOREerr(STORE_F_MEM_LIST_NEXT, ERR_R_PASSED_NULL_PARAMETER); + return NULL; + } + if (!store) { + STOREerr(STORE_F_MEM_LIST_NEXT, STORE_R_NO_STORE); + return NULL; + } + + if (context->search_index == -1) { + for (i = 0; + i < sk_STORE_ATTR_INFO_num(context->search_attributes); i++) { + key.attr_info + = sk_STORE_ATTR_INFO_value(context->search_attributes, i); + srch = sk_MEM_OBJECT_DATA_find_ex(store->data, &key); + + if (srch >= 0) { + context->search_index = srch; + break; + } + } + } + if (context->search_index < 0) + return NULL; + + key.attr_info = + sk_STORE_ATTR_INFO_value(context->search_attributes, + context->search_index); + for (srch = context->search_index; + srch < sk_MEM_OBJECT_DATA_num(store->data) + && STORE_ATTR_INFO_in_range(key.attr_info, + sk_MEM_OBJECT_DATA_value(store->data, + srch)->attr_info) + && !(cres = + STORE_ATTR_INFO_in_ex(key.attr_info, + sk_MEM_OBJECT_DATA_value(store->data, + srch)->attr_info)); + srch++) ; + + context->search_index = srch; + if (cres) + return (sk_MEM_OBJECT_DATA_value(store->data, srch))->object; + return NULL; +} + +static int mem_list_end(STORE *s, void *handle) +{ + struct mem_ctx_st *context = (struct mem_ctx_st *)handle; + + if (!context) { + STOREerr(STORE_F_MEM_LIST_END, ERR_R_PASSED_NULL_PARAMETER); + return 0; + } + if (context && context->search_attributes) + sk_STORE_ATTR_INFO_free(context->search_attributes); + if (context) + OPENSSL_free(context); + return 1; +} + +static int mem_list_endp(STORE *s, void *handle) +{ + struct mem_ctx_st *context = (struct mem_ctx_st *)handle; + + if (!context + || context->search_index + == sk_STORE_ATTR_INFO_num(context->search_attributes)) + return 1; + return 0; +} + +static int mem_lock(STORE *s, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + return 1; +} + +static int mem_unlock(STORE *s, OPENSSL_ITEM attributes[], + OPENSSL_ITEM parameters[]) +{ + return 1; +} + +static int mem_ctrl(STORE *s, int cmd, long l, void *p, void (*f) (void)) +{ + return 1; +} diff --git a/openssl/crypto/store/str_meth.c b/openssl/crypto/store/str_meth.c new file mode 100644 index 0000000..c83fbc5 --- /dev/null +++ b/openssl/crypto/store/str_meth.c @@ -0,0 +1,280 @@ +/* crypto/store/str_meth.c */ +/* + * Written by Richard Levitte (richard@levitte.org) for the OpenSSL project + * 2003. + */ +/* ==================================================================== + * Copyright (c) 2003 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 <string.h> +#include <openssl/buffer.h> +#include "str_locl.h" + +STORE_METHOD *STORE_create_method(char *name) +{ + STORE_METHOD *store_method = + (STORE_METHOD *)OPENSSL_malloc(sizeof(STORE_METHOD)); + + if (store_method) { + memset(store_method, 0, sizeof(*store_method)); + store_method->name = BUF_strdup(name); + } + return store_method; +} + +/* + * BIG FSCKING WARNING!!!! If you use this on a statically allocated method + * (that is, it hasn't been allocated using STORE_create_method(), you + * deserve anything Murphy can throw at you and more! You have been warned. + */ +void STORE_destroy_method(STORE_METHOD *store_method) +{ + if (!store_method) + return; + OPENSSL_free(store_method->name); + store_method->name = NULL; + OPENSSL_free(store_method); +} + +int STORE_method_set_initialise_function(STORE_METHOD *sm, + STORE_INITIALISE_FUNC_PTR init_f) +{ + sm->init = init_f; + return 1; +} + +int STORE_method_set_cleanup_function(STORE_METHOD *sm, + STORE_CLEANUP_FUNC_PTR clean_f) +{ + sm->clean = clean_f; + return 1; +} + +int STORE_method_set_generate_function(STORE_METHOD *sm, + STORE_GENERATE_OBJECT_FUNC_PTR + generate_f) +{ + sm->generate_object = generate_f; + return 1; +} + +int STORE_method_set_get_function(STORE_METHOD *sm, + STORE_GET_OBJECT_FUNC_PTR get_f) +{ + sm->get_object = get_f; + return 1; +} + +int STORE_method_set_store_function(STORE_METHOD *sm, + STORE_STORE_OBJECT_FUNC_PTR store_f) +{ + sm->store_object = store_f; + return 1; +} + +int STORE_method_set_modify_function(STORE_METHOD *sm, + STORE_MODIFY_OBJECT_FUNC_PTR modify_f) +{ + sm->modify_object = modify_f; + return 1; +} + +int STORE_method_set_revoke_function(STORE_METHOD *sm, + STORE_HANDLE_OBJECT_FUNC_PTR revoke_f) +{ + sm->revoke_object = revoke_f; + return 1; +} + +int STORE_method_set_delete_function(STORE_METHOD *sm, + STORE_HANDLE_OBJECT_FUNC_PTR delete_f) +{ + sm->delete_object = delete_f; + return 1; +} + +int STORE_method_set_list_start_function(STORE_METHOD *sm, + STORE_START_OBJECT_FUNC_PTR + list_start_f) +{ + sm->list_object_start = list_start_f; + return 1; +} + +int STORE_method_set_list_next_function(STORE_METHOD *sm, + STORE_NEXT_OBJECT_FUNC_PTR + list_next_f) +{ + sm->list_object_next = list_next_f; + return 1; +} + +int STORE_method_set_list_end_function(STORE_METHOD *sm, + STORE_END_OBJECT_FUNC_PTR list_end_f) +{ + sm->list_object_end = list_end_f; + return 1; +} + +int STORE_method_set_update_store_function(STORE_METHOD *sm, + STORE_GENERIC_FUNC_PTR update_f) +{ + sm->update_store = update_f; + return 1; +} + +int STORE_method_set_lock_store_function(STORE_METHOD *sm, + STORE_GENERIC_FUNC_PTR lock_f) +{ + sm->lock_store = lock_f; + return 1; +} + +int STORE_method_set_unlock_store_function(STORE_METHOD *sm, + STORE_GENERIC_FUNC_PTR unlock_f) +{ + sm->unlock_store = unlock_f; + return 1; +} + +int STORE_method_set_ctrl_function(STORE_METHOD *sm, + STORE_CTRL_FUNC_PTR ctrl_f) +{ + sm->ctrl = ctrl_f; + return 1; +} + +STORE_INITIALISE_FUNC_PTR STORE_method_get_initialise_function(STORE_METHOD + *sm) +{ + return sm->init; +} + +STORE_CLEANUP_FUNC_PTR STORE_method_get_cleanup_function(STORE_METHOD *sm) +{ + return sm->clean; +} + +STORE_GENERATE_OBJECT_FUNC_PTR STORE_method_get_generate_function(STORE_METHOD + *sm) +{ + return sm->generate_object; +} + +STORE_GET_OBJECT_FUNC_PTR STORE_method_get_get_function(STORE_METHOD *sm) +{ + return sm->get_object; +} + +STORE_STORE_OBJECT_FUNC_PTR STORE_method_get_store_function(STORE_METHOD *sm) +{ + return sm->store_object; +} + +STORE_MODIFY_OBJECT_FUNC_PTR STORE_method_get_modify_function(STORE_METHOD + *sm) +{ + return sm->modify_object; +} + +STORE_HANDLE_OBJECT_FUNC_PTR STORE_method_get_revoke_function(STORE_METHOD + *sm) +{ + return sm->revoke_object; +} + +STORE_HANDLE_OBJECT_FUNC_PTR STORE_method_get_delete_function(STORE_METHOD + *sm) +{ + return sm->delete_object; +} + +STORE_START_OBJECT_FUNC_PTR STORE_method_get_list_start_function(STORE_METHOD + *sm) +{ + return sm->list_object_start; +} + +STORE_NEXT_OBJECT_FUNC_PTR STORE_method_get_list_next_function(STORE_METHOD + *sm) +{ + return sm->list_object_next; +} + +STORE_END_OBJECT_FUNC_PTR STORE_method_get_list_end_function(STORE_METHOD *sm) +{ + return sm->list_object_end; +} + +STORE_GENERIC_FUNC_PTR STORE_method_get_update_store_function(STORE_METHOD + *sm) +{ + return sm->update_store; +} + +STORE_GENERIC_FUNC_PTR STORE_method_get_lock_store_function(STORE_METHOD *sm) +{ + return sm->lock_store; +} + +STORE_GENERIC_FUNC_PTR STORE_method_get_unlock_store_function(STORE_METHOD + *sm) +{ + return sm->unlock_store; +} + +STORE_CTRL_FUNC_PTR STORE_method_get_ctrl_function(STORE_METHOD *sm) +{ + return sm->ctrl; +} |