sl@0: /* crypto/store/str_lib.c -*- mode:C; c-file-style: "eay" -*- */ sl@0: /* Written by Richard Levitte (richard@levitte.org) for the OpenSSL sl@0: * project 2003. sl@0: */ sl@0: /* ==================================================================== sl@0: * Copyright (c) 2003 The OpenSSL Project. All rights reserved. sl@0: * sl@0: * Redistribution and use in source and binary forms, with or without sl@0: * modification, are permitted provided that the following conditions sl@0: * are met: sl@0: * sl@0: * 1. Redistributions of source code must retain the above copyright sl@0: * notice, this list of conditions and the following disclaimer. sl@0: * sl@0: * 2. Redistributions in binary form must reproduce the above copyright sl@0: * notice, this list of conditions and the following disclaimer in sl@0: * the documentation and/or other materials provided with the sl@0: * distribution. sl@0: * sl@0: * 3. All advertising materials mentioning features or use of this sl@0: * software must display the following acknowledgment: sl@0: * "This product includes software developed by the OpenSSL Project sl@0: * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" sl@0: * sl@0: * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to sl@0: * endorse or promote products derived from this software without sl@0: * prior written permission. For written permission, please contact sl@0: * openssl-core@openssl.org. sl@0: * sl@0: * 5. Products derived from this software may not be called "OpenSSL" sl@0: * nor may "OpenSSL" appear in their names without prior written sl@0: * permission of the OpenSSL Project. sl@0: * sl@0: * 6. Redistributions of any form whatsoever must retain the following sl@0: * acknowledgment: sl@0: * "This product includes software developed by the OpenSSL Project sl@0: * for use in the OpenSSL Toolkit (http://www.openssl.org/)" sl@0: * sl@0: * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY sl@0: * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE sl@0: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR sl@0: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR sl@0: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, sl@0: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT sl@0: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; sl@0: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) sl@0: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, sl@0: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) sl@0: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED sl@0: * OF THE POSSIBILITY OF SUCH DAMAGE. sl@0: * ==================================================================== sl@0: * sl@0: * This product includes cryptographic software written by Eric Young sl@0: * (eay@cryptsoft.com). This product includes software written by Tim sl@0: * Hudson (tjh@cryptsoft.com). sl@0: * sl@0: */ sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: #ifndef OPENSSL_NO_ENGINE sl@0: #include sl@0: #endif sl@0: #include sl@0: #include sl@0: #include "str_locl.h" sl@0: sl@0: const char * const STORE_object_type_string[STORE_OBJECT_TYPE_NUM+1] = sl@0: { sl@0: 0, sl@0: "X.509 Certificate", sl@0: "X.509 CRL", sl@0: "Private Key", sl@0: "Public Key", sl@0: "Number", sl@0: "Arbitrary Data" sl@0: }; sl@0: sl@0: const int STORE_param_sizes[STORE_PARAM_TYPE_NUM+1] = sl@0: { sl@0: 0, sl@0: sizeof(int), /* EVP_TYPE */ sl@0: sizeof(size_t), /* BITS */ sl@0: -1, /* KEY_PARAMETERS */ sl@0: 0 /* KEY_NO_PARAMETERS */ sl@0: }; sl@0: sl@0: const int STORE_attr_sizes[STORE_ATTR_TYPE_NUM+1] = sl@0: { sl@0: 0, sl@0: -1, /* FRIENDLYNAME: C string */ sl@0: SHA_DIGEST_LENGTH, /* KEYID: SHA1 digest, 160 bits */ sl@0: SHA_DIGEST_LENGTH, /* ISSUERKEYID: SHA1 digest, 160 bits */ sl@0: SHA_DIGEST_LENGTH, /* SUBJECTKEYID: SHA1 digest, 160 bits */ sl@0: SHA_DIGEST_LENGTH, /* ISSUERSERIALHASH: SHA1 digest, 160 bits */ sl@0: sizeof(X509_NAME *), /* ISSUER: X509_NAME * */ sl@0: sizeof(BIGNUM *), /* SERIAL: BIGNUM * */ sl@0: sizeof(X509_NAME *), /* SUBJECT: X509_NAME * */ sl@0: SHA_DIGEST_LENGTH, /* CERTHASH: SHA1 digest, 160 bits */ sl@0: -1, /* EMAIL: C string */ sl@0: -1, /* FILENAME: C string */ sl@0: }; sl@0: sl@0: EXPORT_C STORE *STORE_new_method(const STORE_METHOD *method) sl@0: { sl@0: STORE *ret; sl@0: sl@0: if (method == NULL) sl@0: { sl@0: STOREerr(STORE_F_STORE_NEW_METHOD,ERR_R_PASSED_NULL_PARAMETER); sl@0: return NULL; sl@0: } sl@0: sl@0: ret=(STORE *)OPENSSL_malloc(sizeof(STORE)); sl@0: if (ret == NULL) sl@0: { sl@0: STOREerr(STORE_F_STORE_NEW_METHOD,ERR_R_MALLOC_FAILURE); sl@0: return NULL; sl@0: } sl@0: sl@0: ret->meth=method; sl@0: sl@0: CRYPTO_new_ex_data(CRYPTO_EX_INDEX_STORE, ret, &ret->ex_data); sl@0: if (ret->meth->init && !ret->meth->init(ret)) sl@0: { sl@0: STORE_free(ret); sl@0: ret = NULL; sl@0: } sl@0: return ret; sl@0: } sl@0: sl@0: EXPORT_C STORE *STORE_new_engine(ENGINE *engine) sl@0: { sl@0: STORE *ret = NULL; sl@0: ENGINE *e = engine; sl@0: const STORE_METHOD *meth = 0; sl@0: sl@0: #ifdef OPENSSL_NO_ENGINE sl@0: e = NULL; sl@0: #else sl@0: if (engine) sl@0: { sl@0: if (!ENGINE_init(engine)) sl@0: { sl@0: STOREerr(STORE_F_STORE_NEW_ENGINE, ERR_R_ENGINE_LIB); sl@0: return NULL; sl@0: } sl@0: e = engine; sl@0: } sl@0: else sl@0: { sl@0: STOREerr(STORE_F_STORE_NEW_ENGINE,ERR_R_PASSED_NULL_PARAMETER); sl@0: return NULL; sl@0: } sl@0: if(e) sl@0: { sl@0: meth = ENGINE_get_STORE(e); sl@0: if(!meth) sl@0: { sl@0: STOREerr(STORE_F_STORE_NEW_ENGINE, sl@0: ERR_R_ENGINE_LIB); sl@0: ENGINE_finish(e); sl@0: return NULL; sl@0: } sl@0: } sl@0: #endif sl@0: sl@0: ret = STORE_new_method(meth); sl@0: if (ret == NULL) sl@0: { sl@0: STOREerr(STORE_F_STORE_NEW_ENGINE,ERR_R_STORE_LIB); sl@0: return NULL; sl@0: } sl@0: sl@0: ret->engine = e; sl@0: sl@0: return(ret); sl@0: } sl@0: sl@0: EXPORT_C void STORE_free(STORE *store) sl@0: { sl@0: if (store == NULL) sl@0: return; sl@0: if (store->meth->clean) sl@0: store->meth->clean(store); sl@0: CRYPTO_free_ex_data(CRYPTO_EX_INDEX_STORE, store, &store->ex_data); sl@0: OPENSSL_free(store); sl@0: } sl@0: sl@0: EXPORT_C int STORE_ctrl(STORE *store, int cmd, long i, void *p, void (*f)(void)) sl@0: { sl@0: if (store == NULL) sl@0: { sl@0: STOREerr(STORE_F_STORE_CTRL,ERR_R_PASSED_NULL_PARAMETER); sl@0: return 0; sl@0: } sl@0: if (store->meth->ctrl) sl@0: return store->meth->ctrl(store, cmd, i, p, f); sl@0: STOREerr(STORE_F_STORE_CTRL,STORE_R_NO_CONTROL_FUNCTION); sl@0: return 0; sl@0: } sl@0: sl@0: sl@0: EXPORT_C int STORE_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func, sl@0: CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func) sl@0: { sl@0: return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_STORE, argl, argp, sl@0: new_func, dup_func, free_func); sl@0: } sl@0: sl@0: EXPORT_C int STORE_set_ex_data(STORE *r, int idx, void *arg) sl@0: { sl@0: return(CRYPTO_set_ex_data(&r->ex_data,idx,arg)); sl@0: } sl@0: sl@0: EXPORT_C void *STORE_get_ex_data(STORE *r, int idx) sl@0: { sl@0: return(CRYPTO_get_ex_data(&r->ex_data,idx)); sl@0: } sl@0: sl@0: EXPORT_C const STORE_METHOD *STORE_get_method(STORE *store) sl@0: { sl@0: return store->meth; sl@0: } sl@0: sl@0: EXPORT_C const STORE_METHOD *STORE_set_method(STORE *store, const STORE_METHOD *meth) sl@0: { sl@0: store->meth=meth; sl@0: return store->meth; sl@0: } sl@0: sl@0: sl@0: /* API helpers */ sl@0: sl@0: #define check_store(s,fncode,fnname,fnerrcode) \ sl@0: do \ sl@0: { \ sl@0: if ((s) == NULL || (s)->meth == NULL) \ sl@0: { \ sl@0: STOREerr((fncode), ERR_R_PASSED_NULL_PARAMETER); \ sl@0: return 0; \ sl@0: } \ sl@0: if ((s)->meth->fnname == NULL) \ sl@0: { \ sl@0: STOREerr((fncode), (fnerrcode)); \ sl@0: return 0; \ sl@0: } \ sl@0: } \ sl@0: while(0) sl@0: sl@0: /* API functions */ sl@0: sl@0: EXPORT_C X509 *STORE_get_certificate(STORE *s, OPENSSL_ITEM attributes[], sl@0: OPENSSL_ITEM parameters[]) sl@0: { sl@0: STORE_OBJECT *object; sl@0: X509 *x; sl@0: sl@0: check_store(s,STORE_F_STORE_GET_CERTIFICATE, sl@0: get_object,STORE_R_NO_GET_OBJECT_FUNCTION); sl@0: sl@0: object = s->meth->get_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE, sl@0: attributes, parameters); sl@0: if (!object || !object->data.x509.certificate) sl@0: { sl@0: STOREerr(STORE_F_STORE_GET_CERTIFICATE, sl@0: STORE_R_FAILED_GETTING_CERTIFICATE); sl@0: return 0; sl@0: } sl@0: CRYPTO_add(&object->data.x509.certificate->references,1,CRYPTO_LOCK_X509); sl@0: #ifdef REF_PRINT sl@0: REF_PRINT("X509",data); sl@0: #endif sl@0: x = object->data.x509.certificate; sl@0: STORE_OBJECT_free(object); sl@0: return x; sl@0: } sl@0: sl@0: EXPORT_C int STORE_store_certificate(STORE *s, X509 *data, OPENSSL_ITEM attributes[], sl@0: OPENSSL_ITEM parameters[]) sl@0: { sl@0: STORE_OBJECT *object; sl@0: int i; sl@0: sl@0: check_store(s,STORE_F_STORE_CERTIFICATE, sl@0: store_object,STORE_R_NO_STORE_OBJECT_FUNCTION); sl@0: sl@0: object = STORE_OBJECT_new(); sl@0: if (!object) sl@0: { sl@0: STOREerr(STORE_F_STORE_STORE_CERTIFICATE, sl@0: ERR_R_MALLOC_FAILURE); sl@0: return 0; sl@0: } sl@0: sl@0: CRYPTO_add(&data->references,1,CRYPTO_LOCK_X509); sl@0: #ifdef REF_PRINT sl@0: REF_PRINT("X509",data); sl@0: #endif sl@0: object->data.x509.certificate = data; sl@0: sl@0: i = s->meth->store_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE, sl@0: object, attributes, parameters); sl@0: sl@0: STORE_OBJECT_free(object); sl@0: sl@0: if (!i) sl@0: { sl@0: STOREerr(STORE_F_STORE_STORE_CERTIFICATE, sl@0: STORE_R_FAILED_STORING_CERTIFICATE); sl@0: return 0; sl@0: } sl@0: return 1; sl@0: } sl@0: sl@0: EXPORT_C int STORE_modify_certificate(STORE *s, OPENSSL_ITEM search_attributes[], sl@0: OPENSSL_ITEM add_attributes[], OPENSSL_ITEM modify_attributes[], sl@0: OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[]) sl@0: { sl@0: check_store(s,STORE_F_STORE_MODIFY_CERTIFICATE, sl@0: modify_object,STORE_R_NO_MODIFY_OBJECT_FUNCTION); sl@0: sl@0: if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE, sl@0: search_attributes, add_attributes, modify_attributes, sl@0: delete_attributes, parameters)) sl@0: { sl@0: STOREerr(STORE_F_STORE_MODIFY_CERTIFICATE, sl@0: STORE_R_FAILED_MODIFYING_CERTIFICATE); sl@0: return 0; sl@0: } sl@0: return 1; sl@0: } sl@0: sl@0: EXPORT_C int STORE_revoke_certificate(STORE *s, OPENSSL_ITEM attributes[], sl@0: OPENSSL_ITEM parameters[]) sl@0: { sl@0: check_store(s,STORE_F_STORE_REVOKE_CERTIFICATE, sl@0: revoke_object,STORE_R_NO_REVOKE_OBJECT_FUNCTION); sl@0: sl@0: if (!s->meth->revoke_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE, sl@0: attributes, parameters)) sl@0: { sl@0: STOREerr(STORE_F_STORE_REVOKE_CERTIFICATE, sl@0: STORE_R_FAILED_REVOKING_CERTIFICATE); sl@0: return 0; sl@0: } sl@0: return 1; sl@0: } sl@0: sl@0: EXPORT_C int STORE_delete_certificate(STORE *s, OPENSSL_ITEM attributes[], sl@0: OPENSSL_ITEM parameters[]) sl@0: { sl@0: check_store(s,STORE_F_STORE_DELETE_CERTIFICATE, sl@0: delete_object,STORE_R_NO_DELETE_OBJECT_FUNCTION); sl@0: sl@0: if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE, sl@0: attributes, parameters)) sl@0: { sl@0: STOREerr(STORE_F_STORE_DELETE_CERTIFICATE, sl@0: STORE_R_FAILED_DELETING_CERTIFICATE); sl@0: return 0; sl@0: } sl@0: return 1; sl@0: } sl@0: sl@0: EXPORT_C void *STORE_list_certificate_start(STORE *s, OPENSSL_ITEM attributes[], sl@0: OPENSSL_ITEM parameters[]) sl@0: { sl@0: void *handle; sl@0: sl@0: check_store(s,STORE_F_STORE_LIST_CERTIFICATE_START, sl@0: list_object_start,STORE_R_NO_LIST_OBJECT_START_FUNCTION); sl@0: sl@0: handle = s->meth->list_object_start(s, sl@0: STORE_OBJECT_TYPE_X509_CERTIFICATE, attributes, parameters); sl@0: if (!handle) sl@0: { sl@0: STOREerr(STORE_F_STORE_LIST_CERTIFICATE_START, sl@0: STORE_R_FAILED_LISTING_CERTIFICATES); sl@0: return 0; sl@0: } sl@0: return handle; sl@0: } sl@0: sl@0: EXPORT_C X509 *STORE_list_certificate_next(STORE *s, void *handle) sl@0: { sl@0: STORE_OBJECT *object; sl@0: X509 *x; sl@0: sl@0: check_store(s,STORE_F_STORE_LIST_CERTIFICATE_NEXT, sl@0: list_object_next,STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION); sl@0: sl@0: object = s->meth->list_object_next(s, handle); sl@0: if (!object || !object->data.x509.certificate) sl@0: { sl@0: STOREerr(STORE_F_STORE_LIST_CERTIFICATE_NEXT, sl@0: STORE_R_FAILED_LISTING_CERTIFICATES); sl@0: return 0; sl@0: } sl@0: CRYPTO_add(&object->data.x509.certificate->references,1,CRYPTO_LOCK_X509); sl@0: #ifdef REF_PRINT sl@0: REF_PRINT("X509",data); sl@0: #endif sl@0: x = object->data.x509.certificate; sl@0: STORE_OBJECT_free(object); sl@0: return x; sl@0: } sl@0: sl@0: EXPORT_C int STORE_list_certificate_end(STORE *s, void *handle) sl@0: { sl@0: check_store(s,STORE_F_STORE_LIST_CERTIFICATE_END, sl@0: list_object_end,STORE_R_NO_LIST_OBJECT_END_FUNCTION); sl@0: sl@0: if (!s->meth->list_object_end(s, handle)) sl@0: { sl@0: STOREerr(STORE_F_STORE_LIST_CERTIFICATE_END, sl@0: STORE_R_FAILED_LISTING_CERTIFICATES); sl@0: return 0; sl@0: } sl@0: return 1; sl@0: } sl@0: sl@0: EXPORT_C int STORE_list_certificate_endp(STORE *s, void *handle) sl@0: { sl@0: check_store(s,STORE_F_STORE_LIST_CERTIFICATE_ENDP, sl@0: list_object_endp,STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION); sl@0: sl@0: if (!s->meth->list_object_endp(s, handle)) sl@0: { sl@0: STOREerr(STORE_F_STORE_LIST_CERTIFICATE_ENDP, sl@0: STORE_R_FAILED_LISTING_CERTIFICATES); sl@0: return 0; sl@0: } sl@0: return 1; sl@0: } sl@0: sl@0: EXPORT_C EVP_PKEY *STORE_generate_key(STORE *s, OPENSSL_ITEM attributes[], sl@0: OPENSSL_ITEM parameters[]) sl@0: { sl@0: STORE_OBJECT *object; sl@0: EVP_PKEY *pkey; sl@0: sl@0: check_store(s,STORE_F_STORE_GENERATE_KEY, sl@0: generate_object,STORE_R_NO_GENERATE_OBJECT_FUNCTION); sl@0: sl@0: object = s->meth->generate_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY, sl@0: attributes, parameters); sl@0: if (!object || !object->data.key) sl@0: { sl@0: STOREerr(STORE_F_STORE_GENERATE_KEY, sl@0: STORE_R_FAILED_GENERATING_KEY); sl@0: return 0; sl@0: } sl@0: CRYPTO_add(&object->data.key->references,1,CRYPTO_LOCK_EVP_PKEY); sl@0: #ifdef REF_PRINT sl@0: REF_PRINT("EVP_PKEY",data); sl@0: #endif sl@0: pkey = object->data.key; sl@0: STORE_OBJECT_free(object); sl@0: return pkey; sl@0: } sl@0: sl@0: EXPORT_C EVP_PKEY *STORE_get_private_key(STORE *s, OPENSSL_ITEM attributes[], sl@0: OPENSSL_ITEM parameters[]) sl@0: { sl@0: STORE_OBJECT *object; sl@0: EVP_PKEY *pkey; sl@0: sl@0: check_store(s,STORE_F_STORE_GET_PRIVATE_KEY, sl@0: get_object,STORE_R_NO_GET_OBJECT_FUNCTION); sl@0: sl@0: object = s->meth->get_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY, sl@0: attributes, parameters); sl@0: if (!object || !object->data.key || !object->data.key) sl@0: { sl@0: STOREerr(STORE_F_STORE_GET_PRIVATE_KEY, sl@0: STORE_R_FAILED_GETTING_KEY); sl@0: return 0; sl@0: } sl@0: CRYPTO_add(&object->data.key->references,1,CRYPTO_LOCK_EVP_PKEY); sl@0: #ifdef REF_PRINT sl@0: REF_PRINT("EVP_PKEY",data); sl@0: #endif sl@0: pkey = object->data.key; sl@0: STORE_OBJECT_free(object); sl@0: return pkey; sl@0: } sl@0: sl@0: EXPORT_C int STORE_store_private_key(STORE *s, EVP_PKEY *data, OPENSSL_ITEM attributes[], sl@0: OPENSSL_ITEM parameters[]) sl@0: { sl@0: STORE_OBJECT *object; sl@0: int i; sl@0: sl@0: check_store(s,STORE_F_STORE_STORE_PRIVATE_KEY, sl@0: store_object,STORE_R_NO_STORE_OBJECT_FUNCTION); sl@0: sl@0: object = STORE_OBJECT_new(); sl@0: if (!object) sl@0: { sl@0: STOREerr(STORE_F_STORE_STORE_PRIVATE_KEY, sl@0: ERR_R_MALLOC_FAILURE); sl@0: return 0; sl@0: } sl@0: object->data.key = EVP_PKEY_new(); sl@0: if (!object->data.key) sl@0: { sl@0: STOREerr(STORE_F_STORE_STORE_PRIVATE_KEY, sl@0: ERR_R_MALLOC_FAILURE); sl@0: return 0; sl@0: } sl@0: sl@0: CRYPTO_add(&data->references,1,CRYPTO_LOCK_EVP_PKEY); sl@0: #ifdef REF_PRINT sl@0: REF_PRINT("EVP_PKEY",data); sl@0: #endif sl@0: object->data.key = data; sl@0: sl@0: i = s->meth->store_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY, object, sl@0: attributes, parameters); sl@0: sl@0: STORE_OBJECT_free(object); sl@0: sl@0: if (!i) sl@0: { sl@0: STOREerr(STORE_F_STORE_STORE_PRIVATE_KEY, sl@0: STORE_R_FAILED_STORING_KEY); sl@0: return 0; sl@0: } sl@0: return i; sl@0: } sl@0: sl@0: EXPORT_C int STORE_modify_private_key(STORE *s, OPENSSL_ITEM search_attributes[], sl@0: OPENSSL_ITEM add_attributes[], OPENSSL_ITEM modify_attributes[], sl@0: OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[]) sl@0: { sl@0: check_store(s,STORE_F_STORE_MODIFY_PRIVATE_KEY, sl@0: modify_object,STORE_R_NO_MODIFY_OBJECT_FUNCTION); sl@0: sl@0: if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY, sl@0: search_attributes, add_attributes, modify_attributes, sl@0: delete_attributes, parameters)) sl@0: { sl@0: STOREerr(STORE_F_STORE_MODIFY_PRIVATE_KEY, sl@0: STORE_R_FAILED_MODIFYING_PRIVATE_KEY); sl@0: return 0; sl@0: } sl@0: return 1; sl@0: } sl@0: sl@0: EXPORT_C int STORE_revoke_private_key(STORE *s, OPENSSL_ITEM attributes[], sl@0: OPENSSL_ITEM parameters[]) sl@0: { sl@0: int i; sl@0: sl@0: check_store(s,STORE_F_STORE_REVOKE_PRIVATE_KEY, sl@0: revoke_object,STORE_R_NO_REVOKE_OBJECT_FUNCTION); sl@0: sl@0: i = s->meth->revoke_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY, sl@0: attributes, parameters); sl@0: sl@0: if (!i) sl@0: { sl@0: STOREerr(STORE_F_STORE_REVOKE_PRIVATE_KEY, sl@0: STORE_R_FAILED_REVOKING_KEY); sl@0: return 0; sl@0: } sl@0: return i; sl@0: } sl@0: sl@0: EXPORT_C int STORE_delete_private_key(STORE *s, OPENSSL_ITEM attributes[], sl@0: OPENSSL_ITEM parameters[]) sl@0: { sl@0: check_store(s,STORE_F_STORE_DELETE_PRIVATE_KEY, sl@0: delete_object,STORE_R_NO_DELETE_OBJECT_FUNCTION); sl@0: sl@0: if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY, sl@0: attributes, parameters)) sl@0: { sl@0: STOREerr(STORE_F_STORE_DELETE_PRIVATE_KEY, sl@0: STORE_R_FAILED_DELETING_KEY); sl@0: return 0; sl@0: } sl@0: return 1; sl@0: } sl@0: sl@0: EXPORT_C void *STORE_list_private_key_start(STORE *s, OPENSSL_ITEM attributes[], sl@0: OPENSSL_ITEM parameters[]) sl@0: { sl@0: void *handle; sl@0: sl@0: check_store(s,STORE_F_STORE_LIST_PRIVATE_KEY_START, sl@0: list_object_start,STORE_R_NO_LIST_OBJECT_START_FUNCTION); sl@0: sl@0: handle = s->meth->list_object_start(s, STORE_OBJECT_TYPE_PRIVATE_KEY, sl@0: attributes, parameters); sl@0: if (!handle) sl@0: { sl@0: STOREerr(STORE_F_STORE_LIST_PRIVATE_KEY_START, sl@0: STORE_R_FAILED_LISTING_KEYS); sl@0: return 0; sl@0: } sl@0: return handle; sl@0: } sl@0: sl@0: EXPORT_C EVP_PKEY *STORE_list_private_key_next(STORE *s, void *handle) sl@0: { sl@0: STORE_OBJECT *object; sl@0: EVP_PKEY *pkey; sl@0: sl@0: check_store(s,STORE_F_STORE_LIST_PRIVATE_KEY_NEXT, sl@0: list_object_next,STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION); sl@0: sl@0: object = s->meth->list_object_next(s, handle); sl@0: if (!object || !object->data.key || !object->data.key) sl@0: { sl@0: STOREerr(STORE_F_STORE_LIST_PRIVATE_KEY_NEXT, sl@0: STORE_R_FAILED_LISTING_KEYS); sl@0: return 0; sl@0: } sl@0: CRYPTO_add(&object->data.key->references,1,CRYPTO_LOCK_EVP_PKEY); sl@0: #ifdef REF_PRINT sl@0: REF_PRINT("EVP_PKEY",data); sl@0: #endif sl@0: pkey = object->data.key; sl@0: STORE_OBJECT_free(object); sl@0: return pkey; sl@0: } sl@0: sl@0: EXPORT_C int STORE_list_private_key_end(STORE *s, void *handle) sl@0: { sl@0: check_store(s,STORE_F_STORE_LIST_PRIVATE_KEY_END, sl@0: list_object_end,STORE_R_NO_LIST_OBJECT_END_FUNCTION); sl@0: sl@0: if (!s->meth->list_object_end(s, handle)) sl@0: { sl@0: STOREerr(STORE_F_STORE_LIST_PRIVATE_KEY_END, sl@0: STORE_R_FAILED_LISTING_KEYS); sl@0: return 0; sl@0: } sl@0: return 1; sl@0: } sl@0: sl@0: EXPORT_C int STORE_list_private_key_endp(STORE *s, void *handle) sl@0: { sl@0: check_store(s,STORE_F_STORE_LIST_PRIVATE_KEY_ENDP, sl@0: list_object_endp,STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION); sl@0: sl@0: if (!s->meth->list_object_endp(s, handle)) sl@0: { sl@0: STOREerr(STORE_F_STORE_LIST_PRIVATE_KEY_ENDP, sl@0: STORE_R_FAILED_LISTING_KEYS); sl@0: return 0; sl@0: } sl@0: return 1; sl@0: } sl@0: sl@0: EXPORT_C EVP_PKEY *STORE_get_public_key(STORE *s, OPENSSL_ITEM attributes[], sl@0: OPENSSL_ITEM parameters[]) sl@0: { sl@0: STORE_OBJECT *object; sl@0: EVP_PKEY *pkey; sl@0: sl@0: check_store(s,STORE_F_STORE_GET_PUBLIC_KEY, sl@0: get_object,STORE_R_NO_GET_OBJECT_FUNCTION); sl@0: sl@0: object = s->meth->get_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY, sl@0: attributes, parameters); sl@0: if (!object || !object->data.key || !object->data.key) sl@0: { sl@0: STOREerr(STORE_F_STORE_GET_PUBLIC_KEY, sl@0: STORE_R_FAILED_GETTING_KEY); sl@0: return 0; sl@0: } sl@0: CRYPTO_add(&object->data.key->references,1,CRYPTO_LOCK_EVP_PKEY); sl@0: #ifdef REF_PRINT sl@0: REF_PRINT("EVP_PKEY",data); sl@0: #endif sl@0: pkey = object->data.key; sl@0: STORE_OBJECT_free(object); sl@0: return pkey; sl@0: } sl@0: sl@0: EXPORT_C int STORE_store_public_key(STORE *s, EVP_PKEY *data, OPENSSL_ITEM attributes[], sl@0: OPENSSL_ITEM parameters[]) sl@0: { sl@0: STORE_OBJECT *object; sl@0: int i; sl@0: sl@0: check_store(s,STORE_F_STORE_STORE_PUBLIC_KEY, sl@0: store_object,STORE_R_NO_STORE_OBJECT_FUNCTION); sl@0: sl@0: object = STORE_OBJECT_new(); sl@0: if (!object) sl@0: { sl@0: STOREerr(STORE_F_STORE_STORE_PUBLIC_KEY, sl@0: ERR_R_MALLOC_FAILURE); sl@0: return 0; sl@0: } sl@0: object->data.key = EVP_PKEY_new(); sl@0: if (!object->data.key) sl@0: { sl@0: STOREerr(STORE_F_STORE_STORE_PUBLIC_KEY, sl@0: ERR_R_MALLOC_FAILURE); sl@0: return 0; sl@0: } sl@0: sl@0: CRYPTO_add(&data->references,1,CRYPTO_LOCK_EVP_PKEY); sl@0: #ifdef REF_PRINT sl@0: REF_PRINT("EVP_PKEY",data); sl@0: #endif sl@0: object->data.key = data; sl@0: sl@0: i = s->meth->store_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY, object, sl@0: attributes, parameters); sl@0: sl@0: STORE_OBJECT_free(object); sl@0: sl@0: if (!i) sl@0: { sl@0: STOREerr(STORE_F_STORE_STORE_PUBLIC_KEY, sl@0: STORE_R_FAILED_STORING_KEY); sl@0: return 0; sl@0: } sl@0: return i; sl@0: } sl@0: sl@0: EXPORT_C int STORE_modify_public_key(STORE *s, OPENSSL_ITEM search_attributes[], sl@0: OPENSSL_ITEM add_attributes[], OPENSSL_ITEM modify_attributes[], sl@0: OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[]) sl@0: { sl@0: check_store(s,STORE_F_STORE_MODIFY_PUBLIC_KEY, sl@0: modify_object,STORE_R_NO_MODIFY_OBJECT_FUNCTION); sl@0: sl@0: if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY, sl@0: search_attributes, add_attributes, modify_attributes, sl@0: delete_attributes, parameters)) sl@0: { sl@0: STOREerr(STORE_F_STORE_MODIFY_PUBLIC_KEY, sl@0: STORE_R_FAILED_MODIFYING_PUBLIC_KEY); sl@0: return 0; sl@0: } sl@0: return 1; sl@0: } sl@0: sl@0: EXPORT_C int STORE_revoke_public_key(STORE *s, OPENSSL_ITEM attributes[], sl@0: OPENSSL_ITEM parameters[]) sl@0: { sl@0: int i; sl@0: sl@0: check_store(s,STORE_F_STORE_REVOKE_PUBLIC_KEY, sl@0: revoke_object,STORE_R_NO_REVOKE_OBJECT_FUNCTION); sl@0: sl@0: i = s->meth->revoke_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY, sl@0: attributes, parameters); sl@0: sl@0: if (!i) sl@0: { sl@0: STOREerr(STORE_F_STORE_REVOKE_PUBLIC_KEY, sl@0: STORE_R_FAILED_REVOKING_KEY); sl@0: return 0; sl@0: } sl@0: return i; sl@0: } sl@0: sl@0: EXPORT_C int STORE_delete_public_key(STORE *s, OPENSSL_ITEM attributes[], sl@0: OPENSSL_ITEM parameters[]) sl@0: { sl@0: check_store(s,STORE_F_STORE_DELETE_PUBLIC_KEY, sl@0: delete_object,STORE_R_NO_DELETE_OBJECT_FUNCTION); sl@0: sl@0: if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY, sl@0: attributes, parameters)) sl@0: { sl@0: STOREerr(STORE_F_STORE_DELETE_PUBLIC_KEY, sl@0: STORE_R_FAILED_DELETING_KEY); sl@0: return 0; sl@0: } sl@0: return 1; sl@0: } sl@0: sl@0: EXPORT_C void *STORE_list_public_key_start(STORE *s, OPENSSL_ITEM attributes[], sl@0: OPENSSL_ITEM parameters[]) sl@0: { sl@0: void *handle; sl@0: sl@0: check_store(s,STORE_F_STORE_LIST_PUBLIC_KEY_START, sl@0: list_object_start,STORE_R_NO_LIST_OBJECT_START_FUNCTION); sl@0: sl@0: handle = s->meth->list_object_start(s, STORE_OBJECT_TYPE_PUBLIC_KEY, sl@0: attributes, parameters); sl@0: if (!handle) sl@0: { sl@0: STOREerr(STORE_F_STORE_LIST_PUBLIC_KEY_START, sl@0: STORE_R_FAILED_LISTING_KEYS); sl@0: return 0; sl@0: } sl@0: return handle; sl@0: } sl@0: sl@0: EXPORT_C EVP_PKEY *STORE_list_public_key_next(STORE *s, void *handle) sl@0: { sl@0: STORE_OBJECT *object; sl@0: EVP_PKEY *pkey; sl@0: sl@0: check_store(s,STORE_F_STORE_LIST_PUBLIC_KEY_NEXT, sl@0: list_object_next,STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION); sl@0: sl@0: object = s->meth->list_object_next(s, handle); sl@0: if (!object || !object->data.key || !object->data.key) sl@0: { sl@0: STOREerr(STORE_F_STORE_LIST_PUBLIC_KEY_NEXT, sl@0: STORE_R_FAILED_LISTING_KEYS); sl@0: return 0; sl@0: } sl@0: CRYPTO_add(&object->data.key->references,1,CRYPTO_LOCK_EVP_PKEY); sl@0: #ifdef REF_PRINT sl@0: REF_PRINT("EVP_PKEY",data); sl@0: #endif sl@0: pkey = object->data.key; sl@0: STORE_OBJECT_free(object); sl@0: return pkey; sl@0: } sl@0: sl@0: EXPORT_C int STORE_list_public_key_end(STORE *s, void *handle) sl@0: { sl@0: check_store(s,STORE_F_STORE_LIST_PUBLIC_KEY_END, sl@0: list_object_end,STORE_R_NO_LIST_OBJECT_END_FUNCTION); sl@0: sl@0: if (!s->meth->list_object_end(s, handle)) sl@0: { sl@0: STOREerr(STORE_F_STORE_LIST_PUBLIC_KEY_END, sl@0: STORE_R_FAILED_LISTING_KEYS); sl@0: return 0; sl@0: } sl@0: return 1; sl@0: } sl@0: sl@0: EXPORT_C int STORE_list_public_key_endp(STORE *s, void *handle) sl@0: { sl@0: check_store(s,STORE_F_STORE_LIST_PUBLIC_KEY_ENDP, sl@0: list_object_endp,STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION); sl@0: sl@0: if (!s->meth->list_object_endp(s, handle)) sl@0: { sl@0: STOREerr(STORE_F_STORE_LIST_PUBLIC_KEY_ENDP, sl@0: STORE_R_FAILED_LISTING_KEYS); sl@0: return 0; sl@0: } sl@0: return 1; sl@0: } sl@0: sl@0: EXPORT_C X509_CRL *STORE_generate_crl(STORE *s, OPENSSL_ITEM attributes[], sl@0: OPENSSL_ITEM parameters[]) sl@0: { sl@0: STORE_OBJECT *object; sl@0: X509_CRL *crl; sl@0: sl@0: check_store(s,STORE_F_STORE_GENERATE_CRL, sl@0: generate_object,STORE_R_NO_GENERATE_CRL_FUNCTION); sl@0: sl@0: object = s->meth->generate_object(s, STORE_OBJECT_TYPE_X509_CRL, sl@0: attributes, parameters); sl@0: if (!object || !object->data.crl) sl@0: { sl@0: STOREerr(STORE_F_STORE_GENERATE_CRL, sl@0: STORE_R_FAILED_GENERATING_CRL); sl@0: return 0; sl@0: } sl@0: CRYPTO_add(&object->data.crl->references,1,CRYPTO_LOCK_X509_CRL); sl@0: #ifdef REF_PRINT sl@0: REF_PRINT("X509_CRL",data); sl@0: #endif sl@0: crl = object->data.crl; sl@0: STORE_OBJECT_free(object); sl@0: return crl; sl@0: } sl@0: sl@0: EXPORT_C X509_CRL *STORE_get_crl(STORE *s, OPENSSL_ITEM attributes[], sl@0: OPENSSL_ITEM parameters[]) sl@0: { sl@0: STORE_OBJECT *object; sl@0: X509_CRL *crl; sl@0: sl@0: check_store(s,STORE_F_STORE_GET_CRL, sl@0: get_object,STORE_R_NO_GET_OBJECT_FUNCTION); sl@0: sl@0: object = s->meth->get_object(s, STORE_OBJECT_TYPE_X509_CRL, sl@0: attributes, parameters); sl@0: if (!object || !object->data.crl) sl@0: { sl@0: STOREerr(STORE_F_STORE_GET_CRL, sl@0: STORE_R_FAILED_GETTING_KEY); sl@0: return 0; sl@0: } sl@0: CRYPTO_add(&object->data.crl->references,1,CRYPTO_LOCK_X509_CRL); sl@0: #ifdef REF_PRINT sl@0: REF_PRINT("X509_CRL",data); sl@0: #endif sl@0: crl = object->data.crl; sl@0: STORE_OBJECT_free(object); sl@0: return crl; sl@0: } sl@0: sl@0: EXPORT_C int STORE_store_crl(STORE *s, X509_CRL *data, OPENSSL_ITEM attributes[], sl@0: OPENSSL_ITEM parameters[]) sl@0: { sl@0: STORE_OBJECT *object; sl@0: int i; sl@0: sl@0: check_store(s,STORE_F_STORE_STORE_CRL, sl@0: store_object,STORE_R_NO_STORE_OBJECT_FUNCTION); sl@0: sl@0: object = STORE_OBJECT_new(); sl@0: if (!object) sl@0: { sl@0: STOREerr(STORE_F_STORE_STORE_CRL, sl@0: ERR_R_MALLOC_FAILURE); sl@0: return 0; sl@0: } sl@0: sl@0: CRYPTO_add(&data->references,1,CRYPTO_LOCK_X509_CRL); sl@0: #ifdef REF_PRINT sl@0: REF_PRINT("X509_CRL",data); sl@0: #endif sl@0: object->data.crl = data; sl@0: sl@0: i = s->meth->store_object(s, STORE_OBJECT_TYPE_X509_CRL, object, sl@0: attributes, parameters); sl@0: sl@0: STORE_OBJECT_free(object); sl@0: sl@0: if (!i) sl@0: { sl@0: STOREerr(STORE_F_STORE_STORE_CRL, sl@0: STORE_R_FAILED_STORING_KEY); sl@0: return 0; sl@0: } sl@0: return i; sl@0: } sl@0: sl@0: EXPORT_C int STORE_modify_crl(STORE *s, OPENSSL_ITEM search_attributes[], sl@0: OPENSSL_ITEM add_attributes[], OPENSSL_ITEM modify_attributes[], sl@0: OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[]) sl@0: { sl@0: check_store(s,STORE_F_STORE_MODIFY_CRL, sl@0: modify_object,STORE_R_NO_MODIFY_OBJECT_FUNCTION); sl@0: sl@0: if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_X509_CRL, sl@0: search_attributes, add_attributes, modify_attributes, sl@0: delete_attributes, parameters)) sl@0: { sl@0: STOREerr(STORE_F_STORE_MODIFY_CRL, sl@0: STORE_R_FAILED_MODIFYING_CRL); sl@0: return 0; sl@0: } sl@0: return 1; sl@0: } sl@0: sl@0: EXPORT_C int STORE_delete_crl(STORE *s, OPENSSL_ITEM attributes[], sl@0: OPENSSL_ITEM parameters[]) sl@0: { sl@0: check_store(s,STORE_F_STORE_DELETE_CRL, sl@0: delete_object,STORE_R_NO_DELETE_OBJECT_FUNCTION); sl@0: sl@0: if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_X509_CRL, sl@0: attributes, parameters)) sl@0: { sl@0: STOREerr(STORE_F_STORE_DELETE_CRL, sl@0: STORE_R_FAILED_DELETING_KEY); sl@0: return 0; sl@0: } sl@0: return 1; sl@0: } sl@0: sl@0: EXPORT_C void *STORE_list_crl_start(STORE *s, OPENSSL_ITEM attributes[], sl@0: OPENSSL_ITEM parameters[]) sl@0: { sl@0: void *handle; sl@0: sl@0: check_store(s,STORE_F_STORE_LIST_CRL_START, sl@0: list_object_start,STORE_R_NO_LIST_OBJECT_START_FUNCTION); sl@0: sl@0: handle = s->meth->list_object_start(s, STORE_OBJECT_TYPE_X509_CRL, sl@0: attributes, parameters); sl@0: if (!handle) sl@0: { sl@0: STOREerr(STORE_F_STORE_LIST_CRL_START, sl@0: STORE_R_FAILED_LISTING_KEYS); sl@0: return 0; sl@0: } sl@0: return handle; sl@0: } sl@0: sl@0: EXPORT_C X509_CRL *STORE_list_crl_next(STORE *s, void *handle) sl@0: { sl@0: STORE_OBJECT *object; sl@0: X509_CRL *crl; sl@0: sl@0: check_store(s,STORE_F_STORE_LIST_CRL_NEXT, sl@0: list_object_next,STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION); sl@0: sl@0: object = s->meth->list_object_next(s, handle); sl@0: if (!object || !object->data.crl) sl@0: { sl@0: STOREerr(STORE_F_STORE_LIST_CRL_NEXT, sl@0: STORE_R_FAILED_LISTING_KEYS); sl@0: return 0; sl@0: } sl@0: CRYPTO_add(&object->data.crl->references,1,CRYPTO_LOCK_X509_CRL); sl@0: #ifdef REF_PRINT sl@0: REF_PRINT("X509_CRL",data); sl@0: #endif sl@0: crl = object->data.crl; sl@0: STORE_OBJECT_free(object); sl@0: return crl; sl@0: } sl@0: sl@0: EXPORT_C int STORE_list_crl_end(STORE *s, void *handle) sl@0: { sl@0: check_store(s,STORE_F_STORE_LIST_CRL_END, sl@0: list_object_end,STORE_R_NO_LIST_OBJECT_END_FUNCTION); sl@0: sl@0: if (!s->meth->list_object_end(s, handle)) sl@0: { sl@0: STOREerr(STORE_F_STORE_LIST_CRL_END, sl@0: STORE_R_FAILED_LISTING_KEYS); sl@0: return 0; sl@0: } sl@0: return 1; sl@0: } sl@0: sl@0: EXPORT_C int STORE_list_crl_endp(STORE *s, void *handle) sl@0: { sl@0: check_store(s,STORE_F_STORE_LIST_CRL_ENDP, sl@0: list_object_endp,STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION); sl@0: sl@0: if (!s->meth->list_object_endp(s, handle)) sl@0: { sl@0: STOREerr(STORE_F_STORE_LIST_CRL_ENDP, sl@0: STORE_R_FAILED_LISTING_KEYS); sl@0: return 0; sl@0: } sl@0: return 1; sl@0: } sl@0: sl@0: EXPORT_C int STORE_store_number(STORE *s, BIGNUM *data, OPENSSL_ITEM attributes[], sl@0: OPENSSL_ITEM parameters[]) sl@0: { sl@0: STORE_OBJECT *object; sl@0: int i; sl@0: sl@0: check_store(s,STORE_F_STORE_STORE_NUMBER, sl@0: store_object,STORE_R_NO_STORE_OBJECT_NUMBER_FUNCTION); sl@0: sl@0: object = STORE_OBJECT_new(); sl@0: if (!object) sl@0: { sl@0: STOREerr(STORE_F_STORE_STORE_NUMBER, sl@0: ERR_R_MALLOC_FAILURE); sl@0: return 0; sl@0: } sl@0: sl@0: object->data.number = data; sl@0: sl@0: i = s->meth->store_object(s, STORE_OBJECT_TYPE_NUMBER, object, sl@0: attributes, parameters); sl@0: sl@0: STORE_OBJECT_free(object); sl@0: sl@0: if (!i) sl@0: { sl@0: STOREerr(STORE_F_STORE_STORE_NUMBER, sl@0: STORE_R_FAILED_STORING_NUMBER); sl@0: return 0; sl@0: } sl@0: return 1; sl@0: } sl@0: sl@0: EXPORT_C int STORE_modify_number(STORE *s, OPENSSL_ITEM search_attributes[], sl@0: OPENSSL_ITEM add_attributes[], OPENSSL_ITEM modify_attributes[], sl@0: OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[]) sl@0: { sl@0: check_store(s,STORE_F_STORE_MODIFY_NUMBER, sl@0: modify_object,STORE_R_NO_MODIFY_OBJECT_FUNCTION); sl@0: sl@0: if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_NUMBER, sl@0: search_attributes, add_attributes, modify_attributes, sl@0: delete_attributes, parameters)) sl@0: { sl@0: STOREerr(STORE_F_STORE_MODIFY_NUMBER, sl@0: STORE_R_FAILED_MODIFYING_NUMBER); sl@0: return 0; sl@0: } sl@0: return 1; sl@0: } sl@0: sl@0: EXPORT_C BIGNUM *STORE_get_number(STORE *s, OPENSSL_ITEM attributes[], sl@0: OPENSSL_ITEM parameters[]) sl@0: { sl@0: STORE_OBJECT *object; sl@0: BIGNUM *n; sl@0: sl@0: check_store(s,STORE_F_STORE_GET_NUMBER, sl@0: get_object,STORE_R_NO_GET_OBJECT_NUMBER_FUNCTION); sl@0: sl@0: object = s->meth->get_object(s, STORE_OBJECT_TYPE_NUMBER, attributes, sl@0: parameters); sl@0: if (!object || !object->data.number) sl@0: { sl@0: STOREerr(STORE_F_STORE_GET_NUMBER, sl@0: STORE_R_FAILED_GETTING_NUMBER); sl@0: return 0; sl@0: } sl@0: n = object->data.number; sl@0: object->data.number = NULL; sl@0: STORE_OBJECT_free(object); sl@0: return n; sl@0: } sl@0: sl@0: EXPORT_C int STORE_delete_number(STORE *s, OPENSSL_ITEM attributes[], sl@0: OPENSSL_ITEM parameters[]) sl@0: { sl@0: check_store(s,STORE_F_STORE_DELETE_NUMBER, sl@0: delete_object,STORE_R_NO_DELETE_NUMBER_FUNCTION); sl@0: sl@0: if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_NUMBER, attributes, sl@0: parameters)) sl@0: { sl@0: STOREerr(STORE_F_STORE_DELETE_NUMBER, sl@0: STORE_R_FAILED_DELETING_NUMBER); sl@0: return 0; sl@0: } sl@0: return 1; sl@0: } sl@0: sl@0: EXPORT_C int STORE_store_arbitrary(STORE *s, BUF_MEM *data, OPENSSL_ITEM attributes[], sl@0: OPENSSL_ITEM parameters[]) sl@0: { sl@0: STORE_OBJECT *object; sl@0: int i; sl@0: sl@0: check_store(s,STORE_F_STORE_STORE_ARBITRARY, sl@0: store_object,STORE_R_NO_STORE_OBJECT_ARBITRARY_FUNCTION); sl@0: sl@0: object = STORE_OBJECT_new(); sl@0: if (!object) sl@0: { sl@0: STOREerr(STORE_F_STORE_STORE_ARBITRARY, sl@0: ERR_R_MALLOC_FAILURE); sl@0: return 0; sl@0: } sl@0: sl@0: object->data.arbitrary = data; sl@0: sl@0: i = s->meth->store_object(s, STORE_OBJECT_TYPE_ARBITRARY, object, sl@0: attributes, parameters); sl@0: sl@0: STORE_OBJECT_free(object); sl@0: sl@0: if (!i) sl@0: { sl@0: STOREerr(STORE_F_STORE_STORE_ARBITRARY, sl@0: STORE_R_FAILED_STORING_ARBITRARY); sl@0: return 0; sl@0: } sl@0: return 1; sl@0: } sl@0: sl@0: EXPORT_C int STORE_modify_arbitrary(STORE *s, OPENSSL_ITEM search_attributes[], sl@0: OPENSSL_ITEM add_attributes[], OPENSSL_ITEM modify_attributes[], sl@0: OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[]) sl@0: { sl@0: check_store(s,STORE_F_STORE_MODIFY_ARBITRARY, sl@0: modify_object,STORE_R_NO_MODIFY_OBJECT_FUNCTION); sl@0: sl@0: if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_ARBITRARY, sl@0: search_attributes, add_attributes, modify_attributes, sl@0: delete_attributes, parameters)) sl@0: { sl@0: STOREerr(STORE_F_STORE_MODIFY_ARBITRARY, sl@0: STORE_R_FAILED_MODIFYING_ARBITRARY); sl@0: return 0; sl@0: } sl@0: return 1; sl@0: } sl@0: sl@0: EXPORT_C BUF_MEM *STORE_get_arbitrary(STORE *s, OPENSSL_ITEM attributes[], sl@0: OPENSSL_ITEM parameters[]) sl@0: { sl@0: STORE_OBJECT *object; sl@0: BUF_MEM *b; sl@0: sl@0: check_store(s,STORE_F_STORE_GET_ARBITRARY, sl@0: get_object,STORE_R_NO_GET_OBJECT_ARBITRARY_FUNCTION); sl@0: sl@0: object = s->meth->get_object(s, STORE_OBJECT_TYPE_ARBITRARY, sl@0: attributes, parameters); sl@0: if (!object || !object->data.arbitrary) sl@0: { sl@0: STOREerr(STORE_F_STORE_GET_ARBITRARY, sl@0: STORE_R_FAILED_GETTING_ARBITRARY); sl@0: return 0; sl@0: } sl@0: b = object->data.arbitrary; sl@0: object->data.arbitrary = NULL; sl@0: STORE_OBJECT_free(object); sl@0: return b; sl@0: } sl@0: sl@0: EXPORT_C int STORE_delete_arbitrary(STORE *s, OPENSSL_ITEM attributes[], sl@0: OPENSSL_ITEM parameters[]) sl@0: { sl@0: check_store(s,STORE_F_STORE_DELETE_ARBITRARY, sl@0: delete_object,STORE_R_NO_DELETE_ARBITRARY_FUNCTION); sl@0: sl@0: if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_ARBITRARY, attributes, sl@0: parameters)) sl@0: { sl@0: STOREerr(STORE_F_STORE_DELETE_ARBITRARY, sl@0: STORE_R_FAILED_DELETING_ARBITRARY); sl@0: return 0; sl@0: } sl@0: return 1; sl@0: } sl@0: sl@0: EXPORT_C STORE_OBJECT *STORE_OBJECT_new(void) sl@0: { sl@0: STORE_OBJECT *object = OPENSSL_malloc(sizeof(STORE_OBJECT)); sl@0: if (object) memset(object, 0, sizeof(STORE_OBJECT)); sl@0: return object; sl@0: } sl@0: EXPORT_C void STORE_OBJECT_free(STORE_OBJECT *data) sl@0: { sl@0: if (!data) return; sl@0: switch (data->type) sl@0: { sl@0: case STORE_OBJECT_TYPE_X509_CERTIFICATE: sl@0: X509_free(data->data.x509.certificate); sl@0: break; sl@0: case STORE_OBJECT_TYPE_X509_CRL: sl@0: X509_CRL_free(data->data.crl); sl@0: break; sl@0: case STORE_OBJECT_TYPE_PRIVATE_KEY: sl@0: case STORE_OBJECT_TYPE_PUBLIC_KEY: sl@0: EVP_PKEY_free(data->data.key); sl@0: break; sl@0: case STORE_OBJECT_TYPE_NUMBER: sl@0: BN_free(data->data.number); sl@0: break; sl@0: case STORE_OBJECT_TYPE_ARBITRARY: sl@0: BUF_MEM_free(data->data.arbitrary); sl@0: break; sl@0: } sl@0: OPENSSL_free(data); sl@0: } sl@0: sl@0: IMPLEMENT_STACK_OF(STORE_OBJECT*) sl@0: sl@0: sl@0: struct STORE_attr_info_st sl@0: { sl@0: unsigned char set[(STORE_ATTR_TYPE_NUM + 8) / 8]; sl@0: union sl@0: { sl@0: char *cstring; sl@0: unsigned char *sha1string; sl@0: X509_NAME *dn; sl@0: BIGNUM *number; sl@0: void *any; sl@0: } values[STORE_ATTR_TYPE_NUM+1]; sl@0: size_t value_sizes[STORE_ATTR_TYPE_NUM+1]; sl@0: }; sl@0: sl@0: #define ATTR_IS_SET(a,i) ((i) > 0 && (i) < STORE_ATTR_TYPE_NUM \ sl@0: && ((a)->set[(i) / 8] & (1 << ((i) % 8)))) sl@0: #define SET_ATTRBIT(a,i) ((a)->set[(i) / 8] |= (1 << ((i) % 8))) sl@0: #define CLEAR_ATTRBIT(a,i) ((a)->set[(i) / 8] &= ~(1 << ((i) % 8))) sl@0: sl@0: EXPORT_C STORE_ATTR_INFO *STORE_ATTR_INFO_new(void) sl@0: { sl@0: return (STORE_ATTR_INFO *)OPENSSL_malloc(sizeof(STORE_ATTR_INFO)); sl@0: } sl@0: static void STORE_ATTR_INFO_attr_free(STORE_ATTR_INFO *attrs, sl@0: STORE_ATTR_TYPES code) sl@0: { sl@0: if (ATTR_IS_SET(attrs,code)) sl@0: { sl@0: switch(code) sl@0: { sl@0: case STORE_ATTR_FRIENDLYNAME: sl@0: case STORE_ATTR_EMAIL: sl@0: case STORE_ATTR_FILENAME: sl@0: STORE_ATTR_INFO_modify_cstr(attrs, code, NULL, 0); sl@0: break; sl@0: case STORE_ATTR_KEYID: sl@0: case STORE_ATTR_ISSUERKEYID: sl@0: case STORE_ATTR_SUBJECTKEYID: sl@0: case STORE_ATTR_ISSUERSERIALHASH: sl@0: case STORE_ATTR_CERTHASH: sl@0: STORE_ATTR_INFO_modify_sha1str(attrs, code, NULL, 0); sl@0: break; sl@0: case STORE_ATTR_ISSUER: sl@0: case STORE_ATTR_SUBJECT: sl@0: STORE_ATTR_INFO_modify_dn(attrs, code, NULL); sl@0: break; sl@0: case STORE_ATTR_SERIAL: sl@0: STORE_ATTR_INFO_modify_number(attrs, code, NULL); sl@0: break; sl@0: default: sl@0: break; sl@0: } sl@0: } sl@0: } sl@0: EXPORT_C int STORE_ATTR_INFO_free(STORE_ATTR_INFO *attrs) sl@0: { sl@0: if (attrs) sl@0: { sl@0: STORE_ATTR_TYPES i; sl@0: for(i = 0; i++ < STORE_ATTR_TYPE_NUM;) sl@0: STORE_ATTR_INFO_attr_free(attrs, i); sl@0: OPENSSL_free(attrs); sl@0: } sl@0: return 1; sl@0: } sl@0: EXPORT_C char *STORE_ATTR_INFO_get0_cstr(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code) sl@0: { sl@0: if (!attrs) sl@0: { sl@0: STOREerr(STORE_F_STORE_ATTR_INFO_GET0_CSTR, sl@0: ERR_R_PASSED_NULL_PARAMETER); sl@0: return NULL; sl@0: } sl@0: if (ATTR_IS_SET(attrs,code)) sl@0: return attrs->values[code].cstring; sl@0: STOREerr(STORE_F_STORE_ATTR_INFO_GET0_CSTR, sl@0: STORE_R_NO_VALUE); sl@0: return NULL; sl@0: } sl@0: EXPORT_C unsigned char *STORE_ATTR_INFO_get0_sha1str(STORE_ATTR_INFO *attrs, sl@0: STORE_ATTR_TYPES code) sl@0: { sl@0: if (!attrs) sl@0: { sl@0: STOREerr(STORE_F_STORE_ATTR_INFO_GET0_SHA1STR, sl@0: ERR_R_PASSED_NULL_PARAMETER); sl@0: return NULL; sl@0: } sl@0: if (ATTR_IS_SET(attrs,code)) sl@0: return attrs->values[code].sha1string; sl@0: STOREerr(STORE_F_STORE_ATTR_INFO_GET0_SHA1STR, sl@0: STORE_R_NO_VALUE); sl@0: return NULL; sl@0: } sl@0: EXPORT_C X509_NAME *STORE_ATTR_INFO_get0_dn(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code) sl@0: { sl@0: if (!attrs) sl@0: { sl@0: STOREerr(STORE_F_STORE_ATTR_INFO_GET0_DN, sl@0: ERR_R_PASSED_NULL_PARAMETER); sl@0: return NULL; sl@0: } sl@0: if (ATTR_IS_SET(attrs,code)) sl@0: return attrs->values[code].dn; sl@0: STOREerr(STORE_F_STORE_ATTR_INFO_GET0_DN, sl@0: STORE_R_NO_VALUE); sl@0: return NULL; sl@0: } sl@0: EXPORT_C BIGNUM *STORE_ATTR_INFO_get0_number(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code) sl@0: { sl@0: if (!attrs) sl@0: { sl@0: STOREerr(STORE_F_STORE_ATTR_INFO_GET0_NUMBER, sl@0: ERR_R_PASSED_NULL_PARAMETER); sl@0: return NULL; sl@0: } sl@0: if (ATTR_IS_SET(attrs,code)) sl@0: return attrs->values[code].number; sl@0: STOREerr(STORE_F_STORE_ATTR_INFO_GET0_NUMBER, sl@0: STORE_R_NO_VALUE); sl@0: return NULL; sl@0: } sl@0: EXPORT_C int STORE_ATTR_INFO_set_cstr(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, sl@0: char *cstr, size_t cstr_size) sl@0: { sl@0: if (!attrs) sl@0: { sl@0: STOREerr(STORE_F_STORE_ATTR_INFO_SET_CSTR, sl@0: ERR_R_PASSED_NULL_PARAMETER); sl@0: return 0; sl@0: } sl@0: if (!ATTR_IS_SET(attrs,code)) sl@0: { sl@0: if ((attrs->values[code].cstring = BUF_strndup(cstr, cstr_size))) sl@0: return 1; sl@0: STOREerr(STORE_F_STORE_ATTR_INFO_SET_CSTR, sl@0: ERR_R_MALLOC_FAILURE); sl@0: return 0; sl@0: } sl@0: STOREerr(STORE_F_STORE_ATTR_INFO_SET_CSTR, STORE_R_ALREADY_HAS_A_VALUE); sl@0: return 0; sl@0: } sl@0: EXPORT_C int STORE_ATTR_INFO_set_sha1str(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, sl@0: unsigned char *sha1str, size_t sha1str_size) sl@0: { sl@0: if (!attrs) sl@0: { sl@0: STOREerr(STORE_F_STORE_ATTR_INFO_SET_SHA1STR, sl@0: ERR_R_PASSED_NULL_PARAMETER); sl@0: return 0; sl@0: } sl@0: if (!ATTR_IS_SET(attrs,code)) sl@0: { sl@0: if ((attrs->values[code].sha1string = sl@0: (unsigned char *)BUF_memdup(sha1str, sl@0: sha1str_size))) sl@0: return 1; sl@0: STOREerr(STORE_F_STORE_ATTR_INFO_SET_SHA1STR, sl@0: ERR_R_MALLOC_FAILURE); sl@0: return 0; sl@0: } sl@0: STOREerr(STORE_F_STORE_ATTR_INFO_SET_SHA1STR, STORE_R_ALREADY_HAS_A_VALUE); sl@0: return 0; sl@0: } sl@0: EXPORT_C int STORE_ATTR_INFO_set_dn(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, sl@0: X509_NAME *dn) sl@0: { sl@0: if (!attrs) sl@0: { sl@0: STOREerr(STORE_F_STORE_ATTR_INFO_SET_DN, sl@0: ERR_R_PASSED_NULL_PARAMETER); sl@0: return 0; sl@0: } sl@0: if (!ATTR_IS_SET(attrs,code)) sl@0: { sl@0: if ((attrs->values[code].dn = X509_NAME_dup(dn))) sl@0: return 1; sl@0: STOREerr(STORE_F_STORE_ATTR_INFO_SET_DN, sl@0: ERR_R_MALLOC_FAILURE); sl@0: return 0; sl@0: } sl@0: STOREerr(STORE_F_STORE_ATTR_INFO_SET_DN, STORE_R_ALREADY_HAS_A_VALUE); sl@0: return 0; sl@0: } sl@0: EXPORT_C int STORE_ATTR_INFO_set_number(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, sl@0: BIGNUM *number) sl@0: { sl@0: if (!attrs) sl@0: { sl@0: STOREerr(STORE_F_STORE_ATTR_INFO_SET_NUMBER, sl@0: ERR_R_PASSED_NULL_PARAMETER); sl@0: return 0; sl@0: } sl@0: if (!ATTR_IS_SET(attrs,code)) sl@0: { sl@0: if ((attrs->values[code].number = BN_dup(number))) sl@0: return 1; sl@0: STOREerr(STORE_F_STORE_ATTR_INFO_SET_NUMBER, sl@0: ERR_R_MALLOC_FAILURE); sl@0: return 0; sl@0: } sl@0: STOREerr(STORE_F_STORE_ATTR_INFO_SET_NUMBER, STORE_R_ALREADY_HAS_A_VALUE); sl@0: return 0; sl@0: } sl@0: EXPORT_C int STORE_ATTR_INFO_modify_cstr(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, sl@0: char *cstr, size_t cstr_size) sl@0: { sl@0: if (!attrs) sl@0: { sl@0: STOREerr(STORE_F_STORE_ATTR_INFO_MODIFY_CSTR, sl@0: ERR_R_PASSED_NULL_PARAMETER); sl@0: return 0; sl@0: } sl@0: if (ATTR_IS_SET(attrs,code)) sl@0: { sl@0: OPENSSL_free(attrs->values[code].cstring); sl@0: attrs->values[code].cstring = NULL; sl@0: CLEAR_ATTRBIT(attrs, code); sl@0: } sl@0: return STORE_ATTR_INFO_set_cstr(attrs, code, cstr, cstr_size); sl@0: } sl@0: EXPORT_C int STORE_ATTR_INFO_modify_sha1str(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, sl@0: unsigned char *sha1str, size_t sha1str_size) sl@0: { sl@0: if (!attrs) sl@0: { sl@0: STOREerr(STORE_F_STORE_ATTR_INFO_MODIFY_SHA1STR, sl@0: ERR_R_PASSED_NULL_PARAMETER); sl@0: return 0; sl@0: } sl@0: if (ATTR_IS_SET(attrs,code)) sl@0: { sl@0: OPENSSL_free(attrs->values[code].sha1string); sl@0: attrs->values[code].sha1string = NULL; sl@0: CLEAR_ATTRBIT(attrs, code); sl@0: } sl@0: return STORE_ATTR_INFO_set_sha1str(attrs, code, sha1str, sha1str_size); sl@0: } sl@0: EXPORT_C int STORE_ATTR_INFO_modify_dn(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, sl@0: X509_NAME *dn) sl@0: { sl@0: if (!attrs) sl@0: { sl@0: STOREerr(STORE_F_STORE_ATTR_INFO_MODIFY_DN, sl@0: ERR_R_PASSED_NULL_PARAMETER); sl@0: return 0; sl@0: } sl@0: if (ATTR_IS_SET(attrs,code)) sl@0: { sl@0: OPENSSL_free(attrs->values[code].dn); sl@0: attrs->values[code].dn = NULL; sl@0: CLEAR_ATTRBIT(attrs, code); sl@0: } sl@0: return STORE_ATTR_INFO_set_dn(attrs, code, dn); sl@0: } sl@0: EXPORT_C int STORE_ATTR_INFO_modify_number(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code, sl@0: BIGNUM *number) sl@0: { sl@0: if (!attrs) sl@0: { sl@0: STOREerr(STORE_F_STORE_ATTR_INFO_MODIFY_NUMBER, sl@0: ERR_R_PASSED_NULL_PARAMETER); sl@0: return 0; sl@0: } sl@0: if (ATTR_IS_SET(attrs,code)) sl@0: { sl@0: OPENSSL_free(attrs->values[code].number); sl@0: attrs->values[code].number = NULL; sl@0: CLEAR_ATTRBIT(attrs, code); sl@0: } sl@0: return STORE_ATTR_INFO_set_number(attrs, code, number); sl@0: } sl@0: sl@0: struct attr_list_ctx_st sl@0: { sl@0: OPENSSL_ITEM *attributes; sl@0: }; sl@0: EXPORT_C void *STORE_parse_attrs_start(OPENSSL_ITEM *attributes) sl@0: { sl@0: if (attributes) sl@0: { sl@0: struct attr_list_ctx_st *context = sl@0: (struct attr_list_ctx_st *)OPENSSL_malloc(sizeof(struct attr_list_ctx_st)); sl@0: if (context) sl@0: context->attributes = attributes; sl@0: else sl@0: STOREerr(STORE_F_STORE_PARSE_ATTRS_START, sl@0: ERR_R_MALLOC_FAILURE); sl@0: return context; sl@0: } sl@0: STOREerr(STORE_F_STORE_PARSE_ATTRS_START, ERR_R_PASSED_NULL_PARAMETER); sl@0: return 0; sl@0: } sl@0: EXPORT_C STORE_ATTR_INFO *STORE_parse_attrs_next(void *handle) sl@0: { sl@0: struct attr_list_ctx_st *context = (struct attr_list_ctx_st *)handle; sl@0: sl@0: if (context && context->attributes) sl@0: { sl@0: STORE_ATTR_INFO *attrs = NULL; sl@0: sl@0: while(context->attributes sl@0: && context->attributes->code != STORE_ATTR_OR sl@0: && context->attributes->code != STORE_ATTR_END) sl@0: { sl@0: switch(context->attributes->code) sl@0: { sl@0: case STORE_ATTR_FRIENDLYNAME: sl@0: case STORE_ATTR_EMAIL: sl@0: case STORE_ATTR_FILENAME: sl@0: if (!attrs) attrs = STORE_ATTR_INFO_new(); sl@0: if (attrs == NULL) sl@0: { sl@0: STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT, sl@0: ERR_R_MALLOC_FAILURE); sl@0: goto err; sl@0: } sl@0: STORE_ATTR_INFO_set_cstr(attrs, sl@0: context->attributes->code, sl@0: context->attributes->value, sl@0: context->attributes->value_size); sl@0: break; sl@0: case STORE_ATTR_KEYID: sl@0: case STORE_ATTR_ISSUERKEYID: sl@0: case STORE_ATTR_SUBJECTKEYID: sl@0: case STORE_ATTR_ISSUERSERIALHASH: sl@0: case STORE_ATTR_CERTHASH: sl@0: if (!attrs) attrs = STORE_ATTR_INFO_new(); sl@0: if (attrs == NULL) sl@0: { sl@0: STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT, sl@0: ERR_R_MALLOC_FAILURE); sl@0: goto err; sl@0: } sl@0: STORE_ATTR_INFO_set_sha1str(attrs, sl@0: context->attributes->code, sl@0: context->attributes->value, sl@0: context->attributes->value_size); sl@0: break; sl@0: case STORE_ATTR_ISSUER: sl@0: case STORE_ATTR_SUBJECT: sl@0: if (!attrs) attrs = STORE_ATTR_INFO_new(); sl@0: if (attrs == NULL) sl@0: { sl@0: STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT, sl@0: ERR_R_MALLOC_FAILURE); sl@0: goto err; sl@0: } sl@0: STORE_ATTR_INFO_modify_dn(attrs, sl@0: context->attributes->code, sl@0: context->attributes->value); sl@0: break; sl@0: case STORE_ATTR_SERIAL: sl@0: if (!attrs) attrs = STORE_ATTR_INFO_new(); sl@0: if (attrs == NULL) sl@0: { sl@0: STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT, sl@0: ERR_R_MALLOC_FAILURE); sl@0: goto err; sl@0: } sl@0: STORE_ATTR_INFO_modify_number(attrs, sl@0: context->attributes->code, sl@0: context->attributes->value); sl@0: break; sl@0: } sl@0: context->attributes++; sl@0: } sl@0: if (context->attributes->code == STORE_ATTR_OR) sl@0: context->attributes++; sl@0: return attrs; sl@0: err: sl@0: while(context->attributes sl@0: && context->attributes->code != STORE_ATTR_OR sl@0: && context->attributes->code != STORE_ATTR_END) sl@0: context->attributes++; sl@0: if (context->attributes->code == STORE_ATTR_OR) sl@0: context->attributes++; sl@0: return NULL; sl@0: } sl@0: STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT, ERR_R_PASSED_NULL_PARAMETER); sl@0: return NULL; sl@0: } sl@0: EXPORT_C int STORE_parse_attrs_end(void *handle) sl@0: { sl@0: struct attr_list_ctx_st *context = (struct attr_list_ctx_st *)handle; sl@0: sl@0: if (context && context->attributes) sl@0: { sl@0: #if 0 sl@0: OPENSSL_ITEM *attributes = context->attributes; sl@0: #endif sl@0: OPENSSL_free(context); sl@0: return 1; sl@0: } sl@0: STOREerr(STORE_F_STORE_PARSE_ATTRS_END, ERR_R_PASSED_NULL_PARAMETER); sl@0: return 0; sl@0: } sl@0: sl@0: EXPORT_C int STORE_parse_attrs_endp(void *handle) sl@0: { sl@0: struct attr_list_ctx_st *context = (struct attr_list_ctx_st *)handle; sl@0: sl@0: if (context && context->attributes) sl@0: { sl@0: return context->attributes->code == STORE_ATTR_END; sl@0: } sl@0: STOREerr(STORE_F_STORE_PARSE_ATTRS_ENDP, ERR_R_PASSED_NULL_PARAMETER); sl@0: return 0; sl@0: } sl@0: sl@0: static int attr_info_compare_compute_range( sl@0: unsigned char *abits, unsigned char *bbits, sl@0: unsigned int *alowp, unsigned int *ahighp, sl@0: unsigned int *blowp, unsigned int *bhighp) sl@0: { sl@0: unsigned int alow = (unsigned int)-1, ahigh = 0; sl@0: unsigned int blow = (unsigned int)-1, bhigh = 0; sl@0: int i, res = 0; sl@0: sl@0: for (i = 0; i < (STORE_ATTR_TYPE_NUM + 8) / 8; i++, abits++, bbits++) sl@0: { sl@0: if (res == 0) sl@0: { sl@0: if (*abits < *bbits) res = -1; sl@0: if (*abits > *bbits) res = 1; sl@0: } sl@0: if (*abits) sl@0: { sl@0: if (alow == (unsigned int)-1) sl@0: { sl@0: alow = i * 8; sl@0: if (!(*abits & 0x01)) alow++; sl@0: if (!(*abits & 0x02)) alow++; sl@0: if (!(*abits & 0x04)) alow++; sl@0: if (!(*abits & 0x08)) alow++; sl@0: if (!(*abits & 0x10)) alow++; sl@0: if (!(*abits & 0x20)) alow++; sl@0: if (!(*abits & 0x40)) alow++; sl@0: } sl@0: ahigh = i * 8 + 7; sl@0: if (!(*abits & 0x80)) ahigh++; sl@0: if (!(*abits & 0x40)) ahigh++; sl@0: if (!(*abits & 0x20)) ahigh++; sl@0: if (!(*abits & 0x10)) ahigh++; sl@0: if (!(*abits & 0x08)) ahigh++; sl@0: if (!(*abits & 0x04)) ahigh++; sl@0: if (!(*abits & 0x02)) ahigh++; sl@0: } sl@0: if (*bbits) sl@0: { sl@0: if (blow == (unsigned int)-1) sl@0: { sl@0: blow = i * 8; sl@0: if (!(*bbits & 0x01)) blow++; sl@0: if (!(*bbits & 0x02)) blow++; sl@0: if (!(*bbits & 0x04)) blow++; sl@0: if (!(*bbits & 0x08)) blow++; sl@0: if (!(*bbits & 0x10)) blow++; sl@0: if (!(*bbits & 0x20)) blow++; sl@0: if (!(*bbits & 0x40)) blow++; sl@0: } sl@0: bhigh = i * 8 + 7; sl@0: if (!(*bbits & 0x80)) bhigh++; sl@0: if (!(*bbits & 0x40)) bhigh++; sl@0: if (!(*bbits & 0x20)) bhigh++; sl@0: if (!(*bbits & 0x10)) bhigh++; sl@0: if (!(*bbits & 0x08)) bhigh++; sl@0: if (!(*bbits & 0x04)) bhigh++; sl@0: if (!(*bbits & 0x02)) bhigh++; sl@0: } sl@0: } sl@0: if (ahigh + alow < bhigh + blow) res = -1; sl@0: if (ahigh + alow > bhigh + blow) res = 1; sl@0: if (alowp) *alowp = alow; sl@0: if (ahighp) *ahighp = ahigh; sl@0: if (blowp) *blowp = blow; sl@0: if (bhighp) *bhighp = bhigh; sl@0: return res; sl@0: } sl@0: sl@0: EXPORT_C int STORE_ATTR_INFO_compare(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b) sl@0: { sl@0: if (a == b) return 0; sl@0: if (!a) return -1; sl@0: if (!b) return 1; sl@0: return attr_info_compare_compute_range(a->set, b->set, 0, 0, 0, 0); sl@0: } sl@0: EXPORT_C int STORE_ATTR_INFO_in_range(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b) sl@0: { sl@0: unsigned int alow, ahigh, blow, bhigh; sl@0: sl@0: if (a == b) return 1; sl@0: if (!a) return 0; sl@0: if (!b) return 0; sl@0: attr_info_compare_compute_range(a->set, b->set, sl@0: &alow, &ahigh, &blow, &bhigh); sl@0: if (alow >= blow && ahigh <= bhigh) sl@0: return 1; sl@0: return 0; sl@0: } sl@0: EXPORT_C int STORE_ATTR_INFO_in(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b) sl@0: { sl@0: unsigned char *abits, *bbits; sl@0: int i; sl@0: sl@0: if (a == b) return 1; sl@0: if (!a) return 0; sl@0: if (!b) return 0; sl@0: abits = a->set; sl@0: bbits = b->set; sl@0: for (i = 0; i < (STORE_ATTR_TYPE_NUM + 8) / 8; i++, abits++, bbits++) sl@0: { sl@0: if (*abits && (*bbits & *abits) != *abits) sl@0: return 0; sl@0: } sl@0: return 1; sl@0: } sl@0: EXPORT_C int STORE_ATTR_INFO_in_ex(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b) sl@0: { sl@0: STORE_ATTR_TYPES i; sl@0: sl@0: if (a == b) return 1; sl@0: if (!STORE_ATTR_INFO_in(a, b)) return 0; sl@0: for (i = 1; i < STORE_ATTR_TYPE_NUM; i++) sl@0: if (ATTR_IS_SET(a, i)) sl@0: { sl@0: switch(i) sl@0: { sl@0: case STORE_ATTR_FRIENDLYNAME: sl@0: case STORE_ATTR_EMAIL: sl@0: case STORE_ATTR_FILENAME: sl@0: if (strcmp(a->values[i].cstring, sl@0: b->values[i].cstring)) sl@0: return 0; sl@0: break; sl@0: case STORE_ATTR_KEYID: sl@0: case STORE_ATTR_ISSUERKEYID: sl@0: case STORE_ATTR_SUBJECTKEYID: sl@0: case STORE_ATTR_ISSUERSERIALHASH: sl@0: case STORE_ATTR_CERTHASH: sl@0: if (memcmp(a->values[i].sha1string, sl@0: b->values[i].sha1string, sl@0: a->value_sizes[i])) sl@0: return 0; sl@0: break; sl@0: case STORE_ATTR_ISSUER: sl@0: case STORE_ATTR_SUBJECT: sl@0: if (X509_NAME_cmp(a->values[i].dn, sl@0: b->values[i].dn)) sl@0: return 0; sl@0: break; sl@0: case STORE_ATTR_SERIAL: sl@0: if (BN_cmp(a->values[i].number, sl@0: b->values[i].number)) sl@0: return 0; sl@0: break; sl@0: default: sl@0: break; sl@0: } sl@0: } sl@0: sl@0: return 1; sl@0: }