Home | History | Annotate | Download | only in store
      1 /* crypto/store/str_lib.c -*- mode:C; c-file-style: "eay" -*- */
      2 /* Written by Richard Levitte (richard (at) levitte.org) for the OpenSSL
      3  * project 2003.
      4  */
      5 /* ====================================================================
      6  * Copyright (c) 2003 The OpenSSL Project.  All rights reserved.
      7  *
      8  * Redistribution and use in source and binary forms, with or without
      9  * modification, are permitted provided that the following conditions
     10  * are met:
     11  *
     12  * 1. Redistributions of source code must retain the above copyright
     13  *    notice, this list of conditions and the following disclaimer.
     14  *
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in
     17  *    the documentation and/or other materials provided with the
     18  *    distribution.
     19  *
     20  * 3. All advertising materials mentioning features or use of this
     21  *    software must display the following acknowledgment:
     22  *    "This product includes software developed by the OpenSSL Project
     23  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
     24  *
     25  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
     26  *    endorse or promote products derived from this software without
     27  *    prior written permission. For written permission, please contact
     28  *    openssl-core (at) openssl.org.
     29  *
     30  * 5. Products derived from this software may not be called "OpenSSL"
     31  *    nor may "OpenSSL" appear in their names without prior written
     32  *    permission of the OpenSSL Project.
     33  *
     34  * 6. Redistributions of any form whatsoever must retain the following
     35  *    acknowledgment:
     36  *    "This product includes software developed by the OpenSSL Project
     37  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
     38  *
     39  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
     40  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     41  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     42  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
     43  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     44  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     45  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     46  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     48  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     49  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
     50  * OF THE POSSIBILITY OF SUCH DAMAGE.
     51  * ====================================================================
     52  *
     53  * This product includes cryptographic software written by Eric Young
     54  * (eay (at) cryptsoft.com).  This product includes software written by Tim
     55  * Hudson (tjh (at) cryptsoft.com).
     56  *
     57  */
     58 
     59 #include <string.h>
     60 #include <openssl/bn.h>
     61 #include <openssl/err.h>
     62 #ifndef OPENSSL_NO_ENGINE
     63 #include <openssl/engine.h>
     64 #endif
     65 #include <openssl/sha.h>
     66 #include <openssl/x509.h>
     67 #include "str_locl.h"
     68 
     69 const char * const STORE_object_type_string[STORE_OBJECT_TYPE_NUM+1] =
     70 	{
     71 	0,
     72 	"X.509 Certificate",
     73 	"X.509 CRL",
     74 	"Private Key",
     75 	"Public Key",
     76 	"Number",
     77 	"Arbitrary Data"
     78 	};
     79 
     80 const int STORE_param_sizes[STORE_PARAM_TYPE_NUM+1] =
     81 	{
     82 	0,
     83 	sizeof(int),		/* EVP_TYPE */
     84 	sizeof(size_t),		/* BITS */
     85 	-1,			/* KEY_PARAMETERS */
     86 	0			/* KEY_NO_PARAMETERS */
     87 	};
     88 
     89 const int STORE_attr_sizes[STORE_ATTR_TYPE_NUM+1] =
     90 	{
     91 	0,
     92 	-1,			/* FRIENDLYNAME:	C string */
     93 	SHA_DIGEST_LENGTH,	/* KEYID:		SHA1 digest, 160 bits */
     94 	SHA_DIGEST_LENGTH,	/* ISSUERKEYID:		SHA1 digest, 160 bits */
     95 	SHA_DIGEST_LENGTH,	/* SUBJECTKEYID:	SHA1 digest, 160 bits */
     96 	SHA_DIGEST_LENGTH,	/* ISSUERSERIALHASH:	SHA1 digest, 160 bits */
     97 	sizeof(X509_NAME *),	/* ISSUER:		X509_NAME * */
     98 	sizeof(BIGNUM *),	/* SERIAL:		BIGNUM * */
     99 	sizeof(X509_NAME *),	/* SUBJECT:		X509_NAME * */
    100 	SHA_DIGEST_LENGTH,	/* CERTHASH:		SHA1 digest, 160 bits */
    101 	-1,			/* EMAIL:		C string */
    102 	-1,			/* FILENAME:		C string */
    103 	};
    104 
    105 STORE *STORE_new_method(const STORE_METHOD *method)
    106 	{
    107 	STORE *ret;
    108 
    109 	if (method == NULL)
    110 		{
    111 		STOREerr(STORE_F_STORE_NEW_METHOD,ERR_R_PASSED_NULL_PARAMETER);
    112 		return NULL;
    113 		}
    114 
    115 	ret=(STORE *)OPENSSL_malloc(sizeof(STORE));
    116 	if (ret == NULL)
    117 		{
    118 		STOREerr(STORE_F_STORE_NEW_METHOD,ERR_R_MALLOC_FAILURE);
    119 		return NULL;
    120 		}
    121 
    122 	ret->meth=method;
    123 
    124 	CRYPTO_new_ex_data(CRYPTO_EX_INDEX_STORE, ret, &ret->ex_data);
    125 	if (ret->meth->init && !ret->meth->init(ret))
    126 		{
    127 		STORE_free(ret);
    128 		ret = NULL;
    129 		}
    130 	return ret;
    131 	}
    132 
    133 STORE *STORE_new_engine(ENGINE *engine)
    134 	{
    135 	STORE *ret = NULL;
    136 	ENGINE *e = engine;
    137 	const STORE_METHOD *meth = 0;
    138 
    139 #ifdef OPENSSL_NO_ENGINE
    140 	e = NULL;
    141 #else
    142 	if (engine)
    143 		{
    144 		if (!ENGINE_init(engine))
    145 			{
    146 			STOREerr(STORE_F_STORE_NEW_ENGINE, ERR_R_ENGINE_LIB);
    147 			return NULL;
    148 			}
    149 		e = engine;
    150 		}
    151 	else
    152 		{
    153 		STOREerr(STORE_F_STORE_NEW_ENGINE,ERR_R_PASSED_NULL_PARAMETER);
    154 		return NULL;
    155 		}
    156 	if(e)
    157 		{
    158 		meth = ENGINE_get_STORE(e);
    159 		if(!meth)
    160 			{
    161 			STOREerr(STORE_F_STORE_NEW_ENGINE,
    162 				ERR_R_ENGINE_LIB);
    163 			ENGINE_finish(e);
    164 			return NULL;
    165 			}
    166 		}
    167 #endif
    168 
    169 	ret = STORE_new_method(meth);
    170 	if (ret == NULL)
    171 		{
    172 		STOREerr(STORE_F_STORE_NEW_ENGINE,ERR_R_STORE_LIB);
    173 		return NULL;
    174 		}
    175 
    176 	ret->engine = e;
    177 
    178 	return(ret);
    179 	}
    180 
    181 void STORE_free(STORE *store)
    182 	{
    183 	if (store == NULL)
    184 		return;
    185 	if (store->meth->clean)
    186 		store->meth->clean(store);
    187 	CRYPTO_free_ex_data(CRYPTO_EX_INDEX_STORE, store, &store->ex_data);
    188 	OPENSSL_free(store);
    189 	}
    190 
    191 int STORE_ctrl(STORE *store, int cmd, long i, void *p, void (*f)(void))
    192 	{
    193 	if (store == NULL)
    194 		{
    195 		STOREerr(STORE_F_STORE_CTRL,ERR_R_PASSED_NULL_PARAMETER);
    196 		return 0;
    197 		}
    198 	if (store->meth->ctrl)
    199 		return store->meth->ctrl(store, cmd, i, p, f);
    200 	STOREerr(STORE_F_STORE_CTRL,STORE_R_NO_CONTROL_FUNCTION);
    201 	return 0;
    202 	}
    203 
    204 
    205 int STORE_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
    206 	     CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func)
    207         {
    208 	return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_STORE, argl, argp,
    209 				new_func, dup_func, free_func);
    210         }
    211 
    212 int STORE_set_ex_data(STORE *r, int idx, void *arg)
    213 	{
    214 	return(CRYPTO_set_ex_data(&r->ex_data,idx,arg));
    215 	}
    216 
    217 void *STORE_get_ex_data(STORE *r, int idx)
    218 	{
    219 	return(CRYPTO_get_ex_data(&r->ex_data,idx));
    220 	}
    221 
    222 const STORE_METHOD *STORE_get_method(STORE *store)
    223 	{
    224 	return store->meth;
    225 	}
    226 
    227 const STORE_METHOD *STORE_set_method(STORE *store, const STORE_METHOD *meth)
    228 	{
    229 	store->meth=meth;
    230 	return store->meth;
    231 	}
    232 
    233 
    234 /* API helpers */
    235 
    236 #define check_store(s,fncode,fnname,fnerrcode) \
    237 	do \
    238 		{ \
    239 		if ((s) == NULL || (s)->meth == NULL) \
    240 			{ \
    241 			STOREerr((fncode), ERR_R_PASSED_NULL_PARAMETER); \
    242 			return 0; \
    243 			} \
    244 		if ((s)->meth->fnname == NULL) \
    245 			{ \
    246 			STOREerr((fncode), (fnerrcode)); \
    247 			return 0; \
    248 			} \
    249 		} \
    250 	while(0)
    251 
    252 /* API functions */
    253 
    254 X509 *STORE_get_certificate(STORE *s, OPENSSL_ITEM attributes[],
    255 	OPENSSL_ITEM parameters[])
    256 	{
    257 	STORE_OBJECT *object;
    258 	X509 *x;
    259 
    260 	check_store(s,STORE_F_STORE_GET_CERTIFICATE,
    261 		get_object,STORE_R_NO_GET_OBJECT_FUNCTION);
    262 
    263 	object = s->meth->get_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE,
    264 		attributes, parameters);
    265 	if (!object || !object->data.x509.certificate)
    266 		{
    267 		STOREerr(STORE_F_STORE_GET_CERTIFICATE,
    268 			STORE_R_FAILED_GETTING_CERTIFICATE);
    269 		return 0;
    270 		}
    271 	CRYPTO_add(&object->data.x509.certificate->references,1,CRYPTO_LOCK_X509);
    272 #ifdef REF_PRINT
    273 	REF_PRINT("X509",data);
    274 #endif
    275 	x = object->data.x509.certificate;
    276 	STORE_OBJECT_free(object);
    277 	return x;
    278 	}
    279 
    280 int STORE_store_certificate(STORE *s, X509 *data, OPENSSL_ITEM attributes[],
    281 	OPENSSL_ITEM parameters[])
    282 	{
    283 	STORE_OBJECT *object;
    284 	int i;
    285 
    286 	check_store(s,STORE_F_STORE_CERTIFICATE,
    287 		store_object,STORE_R_NO_STORE_OBJECT_FUNCTION);
    288 
    289 	object = STORE_OBJECT_new();
    290 	if (!object)
    291 		{
    292 		STOREerr(STORE_F_STORE_STORE_CERTIFICATE,
    293 			ERR_R_MALLOC_FAILURE);
    294 		return 0;
    295 		}
    296 
    297 	CRYPTO_add(&data->references,1,CRYPTO_LOCK_X509);
    298 #ifdef REF_PRINT
    299 	REF_PRINT("X509",data);
    300 #endif
    301 	object->data.x509.certificate = data;
    302 
    303 	i = s->meth->store_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE,
    304 		object, attributes, parameters);
    305 
    306 	STORE_OBJECT_free(object);
    307 
    308 	if (!i)
    309 		{
    310 		STOREerr(STORE_F_STORE_STORE_CERTIFICATE,
    311 			STORE_R_FAILED_STORING_CERTIFICATE);
    312 		return 0;
    313 		}
    314 	return 1;
    315 	}
    316 
    317 int STORE_modify_certificate(STORE *s, OPENSSL_ITEM search_attributes[],
    318 	OPENSSL_ITEM add_attributes[], OPENSSL_ITEM modify_attributes[],
    319 	OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[])
    320 	{
    321 	check_store(s,STORE_F_STORE_MODIFY_CERTIFICATE,
    322 		modify_object,STORE_R_NO_MODIFY_OBJECT_FUNCTION);
    323 
    324 	if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE,
    325 		    search_attributes, add_attributes, modify_attributes,
    326 		    delete_attributes, parameters))
    327 		{
    328 		STOREerr(STORE_F_STORE_MODIFY_CERTIFICATE,
    329 			STORE_R_FAILED_MODIFYING_CERTIFICATE);
    330 		return 0;
    331 		}
    332 	return 1;
    333 	}
    334 
    335 int STORE_revoke_certificate(STORE *s, OPENSSL_ITEM attributes[],
    336 	OPENSSL_ITEM parameters[])
    337 	{
    338 	check_store(s,STORE_F_STORE_REVOKE_CERTIFICATE,
    339 		revoke_object,STORE_R_NO_REVOKE_OBJECT_FUNCTION);
    340 
    341 	if (!s->meth->revoke_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE,
    342 		    attributes, parameters))
    343 		{
    344 		STOREerr(STORE_F_STORE_REVOKE_CERTIFICATE,
    345 			STORE_R_FAILED_REVOKING_CERTIFICATE);
    346 		return 0;
    347 		}
    348 	return 1;
    349 	}
    350 
    351 int STORE_delete_certificate(STORE *s, OPENSSL_ITEM attributes[],
    352 	OPENSSL_ITEM parameters[])
    353 	{
    354 	check_store(s,STORE_F_STORE_DELETE_CERTIFICATE,
    355 		delete_object,STORE_R_NO_DELETE_OBJECT_FUNCTION);
    356 
    357 	if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE,
    358 		    attributes, parameters))
    359 		{
    360 		STOREerr(STORE_F_STORE_DELETE_CERTIFICATE,
    361 			STORE_R_FAILED_DELETING_CERTIFICATE);
    362 		return 0;
    363 		}
    364 	return 1;
    365 	}
    366 
    367 void *STORE_list_certificate_start(STORE *s, OPENSSL_ITEM attributes[],
    368 	OPENSSL_ITEM parameters[])
    369 	{
    370 	void *handle;
    371 
    372 	check_store(s,STORE_F_STORE_LIST_CERTIFICATE_START,
    373 		list_object_start,STORE_R_NO_LIST_OBJECT_START_FUNCTION);
    374 
    375 	handle = s->meth->list_object_start(s,
    376 		STORE_OBJECT_TYPE_X509_CERTIFICATE, attributes, parameters);
    377 	if (!handle)
    378 		{
    379 		STOREerr(STORE_F_STORE_LIST_CERTIFICATE_START,
    380 			STORE_R_FAILED_LISTING_CERTIFICATES);
    381 		return 0;
    382 		}
    383 	return handle;
    384 	}
    385 
    386 X509 *STORE_list_certificate_next(STORE *s, void *handle)
    387 	{
    388 	STORE_OBJECT *object;
    389 	X509 *x;
    390 
    391 	check_store(s,STORE_F_STORE_LIST_CERTIFICATE_NEXT,
    392 		list_object_next,STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION);
    393 
    394 	object = s->meth->list_object_next(s, handle);
    395 	if (!object || !object->data.x509.certificate)
    396 		{
    397 		STOREerr(STORE_F_STORE_LIST_CERTIFICATE_NEXT,
    398 			STORE_R_FAILED_LISTING_CERTIFICATES);
    399 		return 0;
    400 		}
    401 	CRYPTO_add(&object->data.x509.certificate->references,1,CRYPTO_LOCK_X509);
    402 #ifdef REF_PRINT
    403 	REF_PRINT("X509",data);
    404 #endif
    405 	x = object->data.x509.certificate;
    406 	STORE_OBJECT_free(object);
    407 	return x;
    408 	}
    409 
    410 int STORE_list_certificate_end(STORE *s, void *handle)
    411 	{
    412 	check_store(s,STORE_F_STORE_LIST_CERTIFICATE_END,
    413 		list_object_end,STORE_R_NO_LIST_OBJECT_END_FUNCTION);
    414 
    415 	if (!s->meth->list_object_end(s, handle))
    416 		{
    417 		STOREerr(STORE_F_STORE_LIST_CERTIFICATE_END,
    418 			STORE_R_FAILED_LISTING_CERTIFICATES);
    419 		return 0;
    420 		}
    421 	return 1;
    422 	}
    423 
    424 int STORE_list_certificate_endp(STORE *s, void *handle)
    425 	{
    426 	check_store(s,STORE_F_STORE_LIST_CERTIFICATE_ENDP,
    427 		list_object_endp,STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION);
    428 
    429 	if (!s->meth->list_object_endp(s, handle))
    430 		{
    431 		STOREerr(STORE_F_STORE_LIST_CERTIFICATE_ENDP,
    432 			STORE_R_FAILED_LISTING_CERTIFICATES);
    433 		return 0;
    434 		}
    435 	return 1;
    436 	}
    437 
    438 EVP_PKEY *STORE_generate_key(STORE *s, OPENSSL_ITEM attributes[],
    439 	OPENSSL_ITEM parameters[])
    440 	{
    441 	STORE_OBJECT *object;
    442 	EVP_PKEY *pkey;
    443 
    444 	check_store(s,STORE_F_STORE_GENERATE_KEY,
    445 		generate_object,STORE_R_NO_GENERATE_OBJECT_FUNCTION);
    446 
    447 	object = s->meth->generate_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY,
    448 		attributes, parameters);
    449 	if (!object || !object->data.key)
    450 		{
    451 		STOREerr(STORE_F_STORE_GENERATE_KEY,
    452 			STORE_R_FAILED_GENERATING_KEY);
    453 		return 0;
    454 		}
    455 	CRYPTO_add(&object->data.key->references,1,CRYPTO_LOCK_EVP_PKEY);
    456 #ifdef REF_PRINT
    457 	REF_PRINT("EVP_PKEY",data);
    458 #endif
    459 	pkey = object->data.key;
    460 	STORE_OBJECT_free(object);
    461 	return pkey;
    462 	}
    463 
    464 EVP_PKEY *STORE_get_private_key(STORE *s, OPENSSL_ITEM attributes[],
    465 	OPENSSL_ITEM parameters[])
    466 	{
    467 	STORE_OBJECT *object;
    468 	EVP_PKEY *pkey;
    469 
    470 	check_store(s,STORE_F_STORE_GET_PRIVATE_KEY,
    471 		get_object,STORE_R_NO_GET_OBJECT_FUNCTION);
    472 
    473 	object = s->meth->get_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY,
    474 		attributes, parameters);
    475 	if (!object || !object->data.key || !object->data.key)
    476 		{
    477 		STOREerr(STORE_F_STORE_GET_PRIVATE_KEY,
    478 			STORE_R_FAILED_GETTING_KEY);
    479 		return 0;
    480 		}
    481 	CRYPTO_add(&object->data.key->references,1,CRYPTO_LOCK_EVP_PKEY);
    482 #ifdef REF_PRINT
    483 	REF_PRINT("EVP_PKEY",data);
    484 #endif
    485 	pkey = object->data.key;
    486 	STORE_OBJECT_free(object);
    487 	return pkey;
    488 	}
    489 
    490 int STORE_store_private_key(STORE *s, EVP_PKEY *data, OPENSSL_ITEM attributes[],
    491 	OPENSSL_ITEM parameters[])
    492 	{
    493 	STORE_OBJECT *object;
    494 	int i;
    495 
    496 	check_store(s,STORE_F_STORE_STORE_PRIVATE_KEY,
    497 		store_object,STORE_R_NO_STORE_OBJECT_FUNCTION);
    498 
    499 	object = STORE_OBJECT_new();
    500 	if (!object)
    501 		{
    502 		STOREerr(STORE_F_STORE_STORE_PRIVATE_KEY,
    503 			ERR_R_MALLOC_FAILURE);
    504 		return 0;
    505 		}
    506 	object->data.key = EVP_PKEY_new();
    507 	if (!object->data.key)
    508 		{
    509 		STOREerr(STORE_F_STORE_STORE_PRIVATE_KEY,
    510 			ERR_R_MALLOC_FAILURE);
    511 		return 0;
    512 		}
    513 
    514 	CRYPTO_add(&data->references,1,CRYPTO_LOCK_EVP_PKEY);
    515 #ifdef REF_PRINT
    516 	REF_PRINT("EVP_PKEY",data);
    517 #endif
    518 	object->data.key = data;
    519 
    520 	i = s->meth->store_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY, object,
    521 		attributes, parameters);
    522 
    523 	STORE_OBJECT_free(object);
    524 
    525 	if (!i)
    526 		{
    527 		STOREerr(STORE_F_STORE_STORE_PRIVATE_KEY,
    528 			STORE_R_FAILED_STORING_KEY);
    529 		return 0;
    530 		}
    531 	return i;
    532 	}
    533 
    534 int STORE_modify_private_key(STORE *s, OPENSSL_ITEM search_attributes[],
    535 	OPENSSL_ITEM add_attributes[], OPENSSL_ITEM modify_attributes[],
    536 	OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[])
    537 	{
    538 	check_store(s,STORE_F_STORE_MODIFY_PRIVATE_KEY,
    539 		modify_object,STORE_R_NO_MODIFY_OBJECT_FUNCTION);
    540 
    541 	if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY,
    542 		    search_attributes, add_attributes, modify_attributes,
    543 		    delete_attributes, parameters))
    544 		{
    545 		STOREerr(STORE_F_STORE_MODIFY_PRIVATE_KEY,
    546 			STORE_R_FAILED_MODIFYING_PRIVATE_KEY);
    547 		return 0;
    548 		}
    549 	return 1;
    550 	}
    551 
    552 int STORE_revoke_private_key(STORE *s, OPENSSL_ITEM attributes[],
    553 	OPENSSL_ITEM parameters[])
    554 	{
    555 	int i;
    556 
    557 	check_store(s,STORE_F_STORE_REVOKE_PRIVATE_KEY,
    558 		revoke_object,STORE_R_NO_REVOKE_OBJECT_FUNCTION);
    559 
    560 	i = s->meth->revoke_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY,
    561 		attributes, parameters);
    562 
    563 	if (!i)
    564 		{
    565 		STOREerr(STORE_F_STORE_REVOKE_PRIVATE_KEY,
    566 			STORE_R_FAILED_REVOKING_KEY);
    567 		return 0;
    568 		}
    569 	return i;
    570 	}
    571 
    572 int STORE_delete_private_key(STORE *s, OPENSSL_ITEM attributes[],
    573 	OPENSSL_ITEM parameters[])
    574 	{
    575 	check_store(s,STORE_F_STORE_DELETE_PRIVATE_KEY,
    576 		delete_object,STORE_R_NO_DELETE_OBJECT_FUNCTION);
    577 
    578 	if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY,
    579 		    attributes, parameters))
    580 		{
    581 		STOREerr(STORE_F_STORE_DELETE_PRIVATE_KEY,
    582 			STORE_R_FAILED_DELETING_KEY);
    583 		return 0;
    584 		}
    585 	return 1;
    586 	}
    587 
    588 void *STORE_list_private_key_start(STORE *s, OPENSSL_ITEM attributes[],
    589 	OPENSSL_ITEM parameters[])
    590 	{
    591 	void *handle;
    592 
    593 	check_store(s,STORE_F_STORE_LIST_PRIVATE_KEY_START,
    594 		list_object_start,STORE_R_NO_LIST_OBJECT_START_FUNCTION);
    595 
    596 	handle = s->meth->list_object_start(s, STORE_OBJECT_TYPE_PRIVATE_KEY,
    597 		attributes, parameters);
    598 	if (!handle)
    599 		{
    600 		STOREerr(STORE_F_STORE_LIST_PRIVATE_KEY_START,
    601 			STORE_R_FAILED_LISTING_KEYS);
    602 		return 0;
    603 		}
    604 	return handle;
    605 	}
    606 
    607 EVP_PKEY *STORE_list_private_key_next(STORE *s, void *handle)
    608 	{
    609 	STORE_OBJECT *object;
    610 	EVP_PKEY *pkey;
    611 
    612 	check_store(s,STORE_F_STORE_LIST_PRIVATE_KEY_NEXT,
    613 		list_object_next,STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION);
    614 
    615 	object = s->meth->list_object_next(s, handle);
    616 	if (!object || !object->data.key || !object->data.key)
    617 		{
    618 		STOREerr(STORE_F_STORE_LIST_PRIVATE_KEY_NEXT,
    619 			STORE_R_FAILED_LISTING_KEYS);
    620 		return 0;
    621 		}
    622 	CRYPTO_add(&object->data.key->references,1,CRYPTO_LOCK_EVP_PKEY);
    623 #ifdef REF_PRINT
    624 	REF_PRINT("EVP_PKEY",data);
    625 #endif
    626 	pkey = object->data.key;
    627 	STORE_OBJECT_free(object);
    628 	return pkey;
    629 	}
    630 
    631 int STORE_list_private_key_end(STORE *s, void *handle)
    632 	{
    633 	check_store(s,STORE_F_STORE_LIST_PRIVATE_KEY_END,
    634 		list_object_end,STORE_R_NO_LIST_OBJECT_END_FUNCTION);
    635 
    636 	if (!s->meth->list_object_end(s, handle))
    637 		{
    638 		STOREerr(STORE_F_STORE_LIST_PRIVATE_KEY_END,
    639 			STORE_R_FAILED_LISTING_KEYS);
    640 		return 0;
    641 		}
    642 	return 1;
    643 	}
    644 
    645 int STORE_list_private_key_endp(STORE *s, void *handle)
    646 	{
    647 	check_store(s,STORE_F_STORE_LIST_PRIVATE_KEY_ENDP,
    648 		list_object_endp,STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION);
    649 
    650 	if (!s->meth->list_object_endp(s, handle))
    651 		{
    652 		STOREerr(STORE_F_STORE_LIST_PRIVATE_KEY_ENDP,
    653 			STORE_R_FAILED_LISTING_KEYS);
    654 		return 0;
    655 		}
    656 	return 1;
    657 	}
    658 
    659 EVP_PKEY *STORE_get_public_key(STORE *s, OPENSSL_ITEM attributes[],
    660 	OPENSSL_ITEM parameters[])
    661 	{
    662 	STORE_OBJECT *object;
    663 	EVP_PKEY *pkey;
    664 
    665 	check_store(s,STORE_F_STORE_GET_PUBLIC_KEY,
    666 		get_object,STORE_R_NO_GET_OBJECT_FUNCTION);
    667 
    668 	object = s->meth->get_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY,
    669 		attributes, parameters);
    670 	if (!object || !object->data.key || !object->data.key)
    671 		{
    672 		STOREerr(STORE_F_STORE_GET_PUBLIC_KEY,
    673 			STORE_R_FAILED_GETTING_KEY);
    674 		return 0;
    675 		}
    676 	CRYPTO_add(&object->data.key->references,1,CRYPTO_LOCK_EVP_PKEY);
    677 #ifdef REF_PRINT
    678 	REF_PRINT("EVP_PKEY",data);
    679 #endif
    680 	pkey = object->data.key;
    681 	STORE_OBJECT_free(object);
    682 	return pkey;
    683 	}
    684 
    685 int STORE_store_public_key(STORE *s, EVP_PKEY *data, OPENSSL_ITEM attributes[],
    686 	OPENSSL_ITEM parameters[])
    687 	{
    688 	STORE_OBJECT *object;
    689 	int i;
    690 
    691 	check_store(s,STORE_F_STORE_STORE_PUBLIC_KEY,
    692 		store_object,STORE_R_NO_STORE_OBJECT_FUNCTION);
    693 
    694 	object = STORE_OBJECT_new();
    695 	if (!object)
    696 		{
    697 		STOREerr(STORE_F_STORE_STORE_PUBLIC_KEY,
    698 			ERR_R_MALLOC_FAILURE);
    699 		return 0;
    700 		}
    701 	object->data.key = EVP_PKEY_new();
    702 	if (!object->data.key)
    703 		{
    704 		STOREerr(STORE_F_STORE_STORE_PUBLIC_KEY,
    705 			ERR_R_MALLOC_FAILURE);
    706 		return 0;
    707 		}
    708 
    709 	CRYPTO_add(&data->references,1,CRYPTO_LOCK_EVP_PKEY);
    710 #ifdef REF_PRINT
    711 	REF_PRINT("EVP_PKEY",data);
    712 #endif
    713 	object->data.key = data;
    714 
    715 	i = s->meth->store_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY, object,
    716 		attributes, parameters);
    717 
    718 	STORE_OBJECT_free(object);
    719 
    720 	if (!i)
    721 		{
    722 		STOREerr(STORE_F_STORE_STORE_PUBLIC_KEY,
    723 			STORE_R_FAILED_STORING_KEY);
    724 		return 0;
    725 		}
    726 	return i;
    727 	}
    728 
    729 int STORE_modify_public_key(STORE *s, OPENSSL_ITEM search_attributes[],
    730 	OPENSSL_ITEM add_attributes[], OPENSSL_ITEM modify_attributes[],
    731 	OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[])
    732 	{
    733 	check_store(s,STORE_F_STORE_MODIFY_PUBLIC_KEY,
    734 		modify_object,STORE_R_NO_MODIFY_OBJECT_FUNCTION);
    735 
    736 	if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY,
    737 		    search_attributes, add_attributes, modify_attributes,
    738 		    delete_attributes, parameters))
    739 		{
    740 		STOREerr(STORE_F_STORE_MODIFY_PUBLIC_KEY,
    741 			STORE_R_FAILED_MODIFYING_PUBLIC_KEY);
    742 		return 0;
    743 		}
    744 	return 1;
    745 	}
    746 
    747 int STORE_revoke_public_key(STORE *s, OPENSSL_ITEM attributes[],
    748 	OPENSSL_ITEM parameters[])
    749 	{
    750 	int i;
    751 
    752 	check_store(s,STORE_F_STORE_REVOKE_PUBLIC_KEY,
    753 		revoke_object,STORE_R_NO_REVOKE_OBJECT_FUNCTION);
    754 
    755 	i = s->meth->revoke_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY,
    756 		attributes, parameters);
    757 
    758 	if (!i)
    759 		{
    760 		STOREerr(STORE_F_STORE_REVOKE_PUBLIC_KEY,
    761 			STORE_R_FAILED_REVOKING_KEY);
    762 		return 0;
    763 		}
    764 	return i;
    765 	}
    766 
    767 int STORE_delete_public_key(STORE *s, OPENSSL_ITEM attributes[],
    768 	OPENSSL_ITEM parameters[])
    769 	{
    770 	check_store(s,STORE_F_STORE_DELETE_PUBLIC_KEY,
    771 		delete_object,STORE_R_NO_DELETE_OBJECT_FUNCTION);
    772 
    773 	if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY,
    774 		    attributes, parameters))
    775 		{
    776 		STOREerr(STORE_F_STORE_DELETE_PUBLIC_KEY,
    777 			STORE_R_FAILED_DELETING_KEY);
    778 		return 0;
    779 		}
    780 	return 1;
    781 	}
    782 
    783 void *STORE_list_public_key_start(STORE *s, OPENSSL_ITEM attributes[],
    784 	OPENSSL_ITEM parameters[])
    785 	{
    786 	void *handle;
    787 
    788 	check_store(s,STORE_F_STORE_LIST_PUBLIC_KEY_START,
    789 		list_object_start,STORE_R_NO_LIST_OBJECT_START_FUNCTION);
    790 
    791 	handle = s->meth->list_object_start(s, STORE_OBJECT_TYPE_PUBLIC_KEY,
    792 		attributes, parameters);
    793 	if (!handle)
    794 		{
    795 		STOREerr(STORE_F_STORE_LIST_PUBLIC_KEY_START,
    796 			STORE_R_FAILED_LISTING_KEYS);
    797 		return 0;
    798 		}
    799 	return handle;
    800 	}
    801 
    802 EVP_PKEY *STORE_list_public_key_next(STORE *s, void *handle)
    803 	{
    804 	STORE_OBJECT *object;
    805 	EVP_PKEY *pkey;
    806 
    807 	check_store(s,STORE_F_STORE_LIST_PUBLIC_KEY_NEXT,
    808 		list_object_next,STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION);
    809 
    810 	object = s->meth->list_object_next(s, handle);
    811 	if (!object || !object->data.key || !object->data.key)
    812 		{
    813 		STOREerr(STORE_F_STORE_LIST_PUBLIC_KEY_NEXT,
    814 			STORE_R_FAILED_LISTING_KEYS);
    815 		return 0;
    816 		}
    817 	CRYPTO_add(&object->data.key->references,1,CRYPTO_LOCK_EVP_PKEY);
    818 #ifdef REF_PRINT
    819 	REF_PRINT("EVP_PKEY",data);
    820 #endif
    821 	pkey = object->data.key;
    822 	STORE_OBJECT_free(object);
    823 	return pkey;
    824 	}
    825 
    826 int STORE_list_public_key_end(STORE *s, void *handle)
    827 	{
    828 	check_store(s,STORE_F_STORE_LIST_PUBLIC_KEY_END,
    829 		list_object_end,STORE_R_NO_LIST_OBJECT_END_FUNCTION);
    830 
    831 	if (!s->meth->list_object_end(s, handle))
    832 		{
    833 		STOREerr(STORE_F_STORE_LIST_PUBLIC_KEY_END,
    834 			STORE_R_FAILED_LISTING_KEYS);
    835 		return 0;
    836 		}
    837 	return 1;
    838 	}
    839 
    840 int STORE_list_public_key_endp(STORE *s, void *handle)
    841 	{
    842 	check_store(s,STORE_F_STORE_LIST_PUBLIC_KEY_ENDP,
    843 		list_object_endp,STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION);
    844 
    845 	if (!s->meth->list_object_endp(s, handle))
    846 		{
    847 		STOREerr(STORE_F_STORE_LIST_PUBLIC_KEY_ENDP,
    848 			STORE_R_FAILED_LISTING_KEYS);
    849 		return 0;
    850 		}
    851 	return 1;
    852 	}
    853 
    854 X509_CRL *STORE_generate_crl(STORE *s, OPENSSL_ITEM attributes[],
    855 	OPENSSL_ITEM parameters[])
    856 	{
    857 	STORE_OBJECT *object;
    858 	X509_CRL *crl;
    859 
    860 	check_store(s,STORE_F_STORE_GENERATE_CRL,
    861 		generate_object,STORE_R_NO_GENERATE_CRL_FUNCTION);
    862 
    863 	object = s->meth->generate_object(s, STORE_OBJECT_TYPE_X509_CRL,
    864 		attributes, parameters);
    865 	if (!object || !object->data.crl)
    866 		{
    867 		STOREerr(STORE_F_STORE_GENERATE_CRL,
    868 			STORE_R_FAILED_GENERATING_CRL);
    869 		return 0;
    870 		}
    871 	CRYPTO_add(&object->data.crl->references,1,CRYPTO_LOCK_X509_CRL);
    872 #ifdef REF_PRINT
    873 	REF_PRINT("X509_CRL",data);
    874 #endif
    875 	crl = object->data.crl;
    876 	STORE_OBJECT_free(object);
    877 	return crl;
    878 	}
    879 
    880 X509_CRL *STORE_get_crl(STORE *s, OPENSSL_ITEM attributes[],
    881 	OPENSSL_ITEM parameters[])
    882 	{
    883 	STORE_OBJECT *object;
    884 	X509_CRL *crl;
    885 
    886 	check_store(s,STORE_F_STORE_GET_CRL,
    887 		get_object,STORE_R_NO_GET_OBJECT_FUNCTION);
    888 
    889 	object = s->meth->get_object(s, STORE_OBJECT_TYPE_X509_CRL,
    890 		attributes, parameters);
    891 	if (!object || !object->data.crl)
    892 		{
    893 		STOREerr(STORE_F_STORE_GET_CRL,
    894 			STORE_R_FAILED_GETTING_KEY);
    895 		return 0;
    896 		}
    897 	CRYPTO_add(&object->data.crl->references,1,CRYPTO_LOCK_X509_CRL);
    898 #ifdef REF_PRINT
    899 	REF_PRINT("X509_CRL",data);
    900 #endif
    901 	crl = object->data.crl;
    902 	STORE_OBJECT_free(object);
    903 	return crl;
    904 	}
    905 
    906 int STORE_store_crl(STORE *s, X509_CRL *data, OPENSSL_ITEM attributes[],
    907 	OPENSSL_ITEM parameters[])
    908 	{
    909 	STORE_OBJECT *object;
    910 	int i;
    911 
    912 	check_store(s,STORE_F_STORE_STORE_CRL,
    913 		store_object,STORE_R_NO_STORE_OBJECT_FUNCTION);
    914 
    915 	object = STORE_OBJECT_new();
    916 	if (!object)
    917 		{
    918 		STOREerr(STORE_F_STORE_STORE_CRL,
    919 			ERR_R_MALLOC_FAILURE);
    920 		return 0;
    921 		}
    922 
    923 	CRYPTO_add(&data->references,1,CRYPTO_LOCK_X509_CRL);
    924 #ifdef REF_PRINT
    925 	REF_PRINT("X509_CRL",data);
    926 #endif
    927 	object->data.crl = data;
    928 
    929 	i = s->meth->store_object(s, STORE_OBJECT_TYPE_X509_CRL, object,
    930 		attributes, parameters);
    931 
    932 	STORE_OBJECT_free(object);
    933 
    934 	if (!i)
    935 		{
    936 		STOREerr(STORE_F_STORE_STORE_CRL,
    937 			STORE_R_FAILED_STORING_KEY);
    938 		return 0;
    939 		}
    940 	return i;
    941 	}
    942 
    943 int STORE_modify_crl(STORE *s, OPENSSL_ITEM search_attributes[],
    944 	OPENSSL_ITEM add_attributes[], OPENSSL_ITEM modify_attributes[],
    945 	OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[])
    946 	{
    947 	check_store(s,STORE_F_STORE_MODIFY_CRL,
    948 		modify_object,STORE_R_NO_MODIFY_OBJECT_FUNCTION);
    949 
    950 	if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_X509_CRL,
    951 		    search_attributes, add_attributes, modify_attributes,
    952 		    delete_attributes, parameters))
    953 		{
    954 		STOREerr(STORE_F_STORE_MODIFY_CRL,
    955 			STORE_R_FAILED_MODIFYING_CRL);
    956 		return 0;
    957 		}
    958 	return 1;
    959 	}
    960 
    961 int STORE_delete_crl(STORE *s, OPENSSL_ITEM attributes[],
    962 	OPENSSL_ITEM parameters[])
    963 	{
    964 	check_store(s,STORE_F_STORE_DELETE_CRL,
    965 		delete_object,STORE_R_NO_DELETE_OBJECT_FUNCTION);
    966 
    967 	if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_X509_CRL,
    968 		    attributes, parameters))
    969 		{
    970 		STOREerr(STORE_F_STORE_DELETE_CRL,
    971 			STORE_R_FAILED_DELETING_KEY);
    972 		return 0;
    973 		}
    974 	return 1;
    975 	}
    976 
    977 void *STORE_list_crl_start(STORE *s, OPENSSL_ITEM attributes[],
    978 	OPENSSL_ITEM parameters[])
    979 	{
    980 	void *handle;
    981 
    982 	check_store(s,STORE_F_STORE_LIST_CRL_START,
    983 		list_object_start,STORE_R_NO_LIST_OBJECT_START_FUNCTION);
    984 
    985 	handle = s->meth->list_object_start(s, STORE_OBJECT_TYPE_X509_CRL,
    986 		attributes, parameters);
    987 	if (!handle)
    988 		{
    989 		STOREerr(STORE_F_STORE_LIST_CRL_START,
    990 			STORE_R_FAILED_LISTING_KEYS);
    991 		return 0;
    992 		}
    993 	return handle;
    994 	}
    995 
    996 X509_CRL *STORE_list_crl_next(STORE *s, void *handle)
    997 	{
    998 	STORE_OBJECT *object;
    999 	X509_CRL *crl;
   1000 
   1001 	check_store(s,STORE_F_STORE_LIST_CRL_NEXT,
   1002 		list_object_next,STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION);
   1003 
   1004 	object = s->meth->list_object_next(s, handle);
   1005 	if (!object || !object->data.crl)
   1006 		{
   1007 		STOREerr(STORE_F_STORE_LIST_CRL_NEXT,
   1008 			STORE_R_FAILED_LISTING_KEYS);
   1009 		return 0;
   1010 		}
   1011 	CRYPTO_add(&object->data.crl->references,1,CRYPTO_LOCK_X509_CRL);
   1012 #ifdef REF_PRINT
   1013 	REF_PRINT("X509_CRL",data);
   1014 #endif
   1015 	crl = object->data.crl;
   1016 	STORE_OBJECT_free(object);
   1017 	return crl;
   1018 	}
   1019 
   1020 int STORE_list_crl_end(STORE *s, void *handle)
   1021 	{
   1022 	check_store(s,STORE_F_STORE_LIST_CRL_END,
   1023 		list_object_end,STORE_R_NO_LIST_OBJECT_END_FUNCTION);
   1024 
   1025 	if (!s->meth->list_object_end(s, handle))
   1026 		{
   1027 		STOREerr(STORE_F_STORE_LIST_CRL_END,
   1028 			STORE_R_FAILED_LISTING_KEYS);
   1029 		return 0;
   1030 		}
   1031 	return 1;
   1032 	}
   1033 
   1034 int STORE_list_crl_endp(STORE *s, void *handle)
   1035 	{
   1036 	check_store(s,STORE_F_STORE_LIST_CRL_ENDP,
   1037 		list_object_endp,STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION);
   1038 
   1039 	if (!s->meth->list_object_endp(s, handle))
   1040 		{
   1041 		STOREerr(STORE_F_STORE_LIST_CRL_ENDP,
   1042 			STORE_R_FAILED_LISTING_KEYS);
   1043 		return 0;
   1044 		}
   1045 	return 1;
   1046 	}
   1047 
   1048 int STORE_store_number(STORE *s, BIGNUM *data, OPENSSL_ITEM attributes[],
   1049 	OPENSSL_ITEM parameters[])
   1050 	{
   1051 	STORE_OBJECT *object;
   1052 	int i;
   1053 
   1054 	check_store(s,STORE_F_STORE_STORE_NUMBER,
   1055 		store_object,STORE_R_NO_STORE_OBJECT_NUMBER_FUNCTION);
   1056 
   1057 	object = STORE_OBJECT_new();
   1058 	if (!object)
   1059 		{
   1060 		STOREerr(STORE_F_STORE_STORE_NUMBER,
   1061 			ERR_R_MALLOC_FAILURE);
   1062 		return 0;
   1063 		}
   1064 
   1065 	object->data.number = data;
   1066 
   1067 	i = s->meth->store_object(s, STORE_OBJECT_TYPE_NUMBER, object,
   1068 		attributes, parameters);
   1069 
   1070 	STORE_OBJECT_free(object);
   1071 
   1072 	if (!i)
   1073 		{
   1074 		STOREerr(STORE_F_STORE_STORE_NUMBER,
   1075 			STORE_R_FAILED_STORING_NUMBER);
   1076 		return 0;
   1077 		}
   1078 	return 1;
   1079 	}
   1080 
   1081 int STORE_modify_number(STORE *s, OPENSSL_ITEM search_attributes[],
   1082 	OPENSSL_ITEM add_attributes[], OPENSSL_ITEM modify_attributes[],
   1083 	OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[])
   1084 	{
   1085 	check_store(s,STORE_F_STORE_MODIFY_NUMBER,
   1086 		modify_object,STORE_R_NO_MODIFY_OBJECT_FUNCTION);
   1087 
   1088 	if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_NUMBER,
   1089 		    search_attributes, add_attributes, modify_attributes,
   1090 		    delete_attributes, parameters))
   1091 		{
   1092 		STOREerr(STORE_F_STORE_MODIFY_NUMBER,
   1093 			STORE_R_FAILED_MODIFYING_NUMBER);
   1094 		return 0;
   1095 		}
   1096 	return 1;
   1097 	}
   1098 
   1099 BIGNUM *STORE_get_number(STORE *s, OPENSSL_ITEM attributes[],
   1100 	OPENSSL_ITEM parameters[])
   1101 	{
   1102 	STORE_OBJECT *object;
   1103 	BIGNUM *n;
   1104 
   1105 	check_store(s,STORE_F_STORE_GET_NUMBER,
   1106 		get_object,STORE_R_NO_GET_OBJECT_NUMBER_FUNCTION);
   1107 
   1108 	object = s->meth->get_object(s, STORE_OBJECT_TYPE_NUMBER, attributes,
   1109 		parameters);
   1110 	if (!object || !object->data.number)
   1111 		{
   1112 		STOREerr(STORE_F_STORE_GET_NUMBER,
   1113 			STORE_R_FAILED_GETTING_NUMBER);
   1114 		return 0;
   1115 		}
   1116 	n = object->data.number;
   1117 	object->data.number = NULL;
   1118 	STORE_OBJECT_free(object);
   1119 	return n;
   1120 	}
   1121 
   1122 int STORE_delete_number(STORE *s, OPENSSL_ITEM attributes[],
   1123 	OPENSSL_ITEM parameters[])
   1124 	{
   1125 	check_store(s,STORE_F_STORE_DELETE_NUMBER,
   1126 		delete_object,STORE_R_NO_DELETE_NUMBER_FUNCTION);
   1127 
   1128 	if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_NUMBER, attributes,
   1129 		    parameters))
   1130 		{
   1131 		STOREerr(STORE_F_STORE_DELETE_NUMBER,
   1132 			STORE_R_FAILED_DELETING_NUMBER);
   1133 		return 0;
   1134 		}
   1135 	return 1;
   1136 	}
   1137 
   1138 int STORE_store_arbitrary(STORE *s, BUF_MEM *data, OPENSSL_ITEM attributes[],
   1139 	OPENSSL_ITEM parameters[])
   1140 	{
   1141 	STORE_OBJECT *object;
   1142 	int i;
   1143 
   1144 	check_store(s,STORE_F_STORE_STORE_ARBITRARY,
   1145 		store_object,STORE_R_NO_STORE_OBJECT_ARBITRARY_FUNCTION);
   1146 
   1147 	object = STORE_OBJECT_new();
   1148 	if (!object)
   1149 		{
   1150 		STOREerr(STORE_F_STORE_STORE_ARBITRARY,
   1151 			ERR_R_MALLOC_FAILURE);
   1152 		return 0;
   1153 		}
   1154 
   1155 	object->data.arbitrary = data;
   1156 
   1157 	i = s->meth->store_object(s, STORE_OBJECT_TYPE_ARBITRARY, object,
   1158 		attributes, parameters);
   1159 
   1160 	STORE_OBJECT_free(object);
   1161 
   1162 	if (!i)
   1163 		{
   1164 		STOREerr(STORE_F_STORE_STORE_ARBITRARY,
   1165 			STORE_R_FAILED_STORING_ARBITRARY);
   1166 		return 0;
   1167 		}
   1168 	return 1;
   1169 	}
   1170 
   1171 int STORE_modify_arbitrary(STORE *s, OPENSSL_ITEM search_attributes[],
   1172 	OPENSSL_ITEM add_attributes[], OPENSSL_ITEM modify_attributes[],
   1173 	OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[])
   1174 	{
   1175 	check_store(s,STORE_F_STORE_MODIFY_ARBITRARY,
   1176 		modify_object,STORE_R_NO_MODIFY_OBJECT_FUNCTION);
   1177 
   1178 	if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_ARBITRARY,
   1179 		    search_attributes, add_attributes, modify_attributes,
   1180 		    delete_attributes, parameters))
   1181 		{
   1182 		STOREerr(STORE_F_STORE_MODIFY_ARBITRARY,
   1183 			STORE_R_FAILED_MODIFYING_ARBITRARY);
   1184 		return 0;
   1185 		}
   1186 	return 1;
   1187 	}
   1188 
   1189 BUF_MEM *STORE_get_arbitrary(STORE *s, OPENSSL_ITEM attributes[],
   1190 	OPENSSL_ITEM parameters[])
   1191 	{
   1192 	STORE_OBJECT *object;
   1193 	BUF_MEM *b;
   1194 
   1195 	check_store(s,STORE_F_STORE_GET_ARBITRARY,
   1196 		get_object,STORE_R_NO_GET_OBJECT_ARBITRARY_FUNCTION);
   1197 
   1198 	object = s->meth->get_object(s, STORE_OBJECT_TYPE_ARBITRARY,
   1199 		attributes, parameters);
   1200 	if (!object || !object->data.arbitrary)
   1201 		{
   1202 		STOREerr(STORE_F_STORE_GET_ARBITRARY,
   1203 			STORE_R_FAILED_GETTING_ARBITRARY);
   1204 		return 0;
   1205 		}
   1206 	b = object->data.arbitrary;
   1207 	object->data.arbitrary = NULL;
   1208 	STORE_OBJECT_free(object);
   1209 	return b;
   1210 	}
   1211 
   1212 int STORE_delete_arbitrary(STORE *s, OPENSSL_ITEM attributes[],
   1213 	OPENSSL_ITEM parameters[])
   1214 	{
   1215 	check_store(s,STORE_F_STORE_DELETE_ARBITRARY,
   1216 		delete_object,STORE_R_NO_DELETE_ARBITRARY_FUNCTION);
   1217 
   1218 	if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_ARBITRARY, attributes,
   1219 		    parameters))
   1220 		{
   1221 		STOREerr(STORE_F_STORE_DELETE_ARBITRARY,
   1222 			STORE_R_FAILED_DELETING_ARBITRARY);
   1223 		return 0;
   1224 		}
   1225 	return 1;
   1226 	}
   1227 
   1228 STORE_OBJECT *STORE_OBJECT_new(void)
   1229 	{
   1230 	STORE_OBJECT *object = OPENSSL_malloc(sizeof(STORE_OBJECT));
   1231 	if (object) memset(object, 0, sizeof(STORE_OBJECT));
   1232 	return object;
   1233 	}
   1234 void STORE_OBJECT_free(STORE_OBJECT *data)
   1235 	{
   1236 	if (!data) return;
   1237 	switch (data->type)
   1238 		{
   1239 	case STORE_OBJECT_TYPE_X509_CERTIFICATE:
   1240 		X509_free(data->data.x509.certificate);
   1241 		break;
   1242 	case STORE_OBJECT_TYPE_X509_CRL:
   1243 		X509_CRL_free(data->data.crl);
   1244 		break;
   1245 	case STORE_OBJECT_TYPE_PRIVATE_KEY:
   1246 	case STORE_OBJECT_TYPE_PUBLIC_KEY:
   1247 		EVP_PKEY_free(data->data.key);
   1248 		break;
   1249 	case STORE_OBJECT_TYPE_NUMBER:
   1250 		BN_free(data->data.number);
   1251 		break;
   1252 	case STORE_OBJECT_TYPE_ARBITRARY:
   1253 		BUF_MEM_free(data->data.arbitrary);
   1254 		break;
   1255 		}
   1256 	OPENSSL_free(data);
   1257 	}
   1258 
   1259 IMPLEMENT_STACK_OF(STORE_OBJECT*)
   1260 
   1261 
   1262 struct STORE_attr_info_st
   1263 	{
   1264 	unsigned char set[(STORE_ATTR_TYPE_NUM + 8) / 8];
   1265 	union
   1266 		{
   1267 		char *cstring;
   1268 		unsigned char *sha1string;
   1269 		X509_NAME *dn;
   1270 		BIGNUM *number;
   1271 		void *any;
   1272 		} values[STORE_ATTR_TYPE_NUM+1];
   1273 	size_t value_sizes[STORE_ATTR_TYPE_NUM+1];
   1274 	};
   1275 
   1276 #define ATTR_IS_SET(a,i)	((i) > 0 && (i) < STORE_ATTR_TYPE_NUM \
   1277 				&& ((a)->set[(i) / 8] & (1 << ((i) % 8))))
   1278 #define SET_ATTRBIT(a,i)	((a)->set[(i) / 8] |= (1 << ((i) % 8)))
   1279 #define CLEAR_ATTRBIT(a,i)	((a)->set[(i) / 8] &= ~(1 << ((i) % 8)))
   1280 
   1281 STORE_ATTR_INFO *STORE_ATTR_INFO_new(void)
   1282 	{
   1283 	return (STORE_ATTR_INFO *)OPENSSL_malloc(sizeof(STORE_ATTR_INFO));
   1284 	}
   1285 static void STORE_ATTR_INFO_attr_free(STORE_ATTR_INFO *attrs,
   1286 	STORE_ATTR_TYPES code)
   1287 	{
   1288 	if (ATTR_IS_SET(attrs,code))
   1289 		{
   1290 		switch(code)
   1291 			{
   1292 		case STORE_ATTR_FRIENDLYNAME:
   1293 		case STORE_ATTR_EMAIL:
   1294 		case STORE_ATTR_FILENAME:
   1295 			STORE_ATTR_INFO_modify_cstr(attrs, code, NULL, 0);
   1296 			break;
   1297 		case STORE_ATTR_KEYID:
   1298 		case STORE_ATTR_ISSUERKEYID:
   1299 		case STORE_ATTR_SUBJECTKEYID:
   1300 		case STORE_ATTR_ISSUERSERIALHASH:
   1301 		case STORE_ATTR_CERTHASH:
   1302 			STORE_ATTR_INFO_modify_sha1str(attrs, code, NULL, 0);
   1303 			break;
   1304 		case STORE_ATTR_ISSUER:
   1305 		case STORE_ATTR_SUBJECT:
   1306 			STORE_ATTR_INFO_modify_dn(attrs, code, NULL);
   1307 			break;
   1308 		case STORE_ATTR_SERIAL:
   1309 			STORE_ATTR_INFO_modify_number(attrs, code, NULL);
   1310 			break;
   1311 		default:
   1312 			break;
   1313 			}
   1314 		}
   1315 	}
   1316 int STORE_ATTR_INFO_free(STORE_ATTR_INFO *attrs)
   1317 	{
   1318 	if (attrs)
   1319 		{
   1320 		STORE_ATTR_TYPES i;
   1321 		for(i = 0; i++ < STORE_ATTR_TYPE_NUM;)
   1322 			STORE_ATTR_INFO_attr_free(attrs, i);
   1323 		OPENSSL_free(attrs);
   1324 		}
   1325 	return 1;
   1326 	}
   1327 char *STORE_ATTR_INFO_get0_cstr(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code)
   1328 	{
   1329 	if (!attrs)
   1330 		{
   1331 		STOREerr(STORE_F_STORE_ATTR_INFO_GET0_CSTR,
   1332 			ERR_R_PASSED_NULL_PARAMETER);
   1333 		return NULL;
   1334 		}
   1335 	if (ATTR_IS_SET(attrs,code))
   1336 		return attrs->values[code].cstring;
   1337 	STOREerr(STORE_F_STORE_ATTR_INFO_GET0_CSTR,
   1338 		STORE_R_NO_VALUE);
   1339 	return NULL;
   1340 	}
   1341 unsigned char *STORE_ATTR_INFO_get0_sha1str(STORE_ATTR_INFO *attrs,
   1342 	STORE_ATTR_TYPES code)
   1343 	{
   1344 	if (!attrs)
   1345 		{
   1346 		STOREerr(STORE_F_STORE_ATTR_INFO_GET0_SHA1STR,
   1347 			ERR_R_PASSED_NULL_PARAMETER);
   1348 		return NULL;
   1349 		}
   1350 	if (ATTR_IS_SET(attrs,code))
   1351 		return attrs->values[code].sha1string;
   1352 	STOREerr(STORE_F_STORE_ATTR_INFO_GET0_SHA1STR,
   1353 		STORE_R_NO_VALUE);
   1354 	return NULL;
   1355 	}
   1356 X509_NAME *STORE_ATTR_INFO_get0_dn(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code)
   1357 	{
   1358 	if (!attrs)
   1359 		{
   1360 		STOREerr(STORE_F_STORE_ATTR_INFO_GET0_DN,
   1361 			ERR_R_PASSED_NULL_PARAMETER);
   1362 		return NULL;
   1363 		}
   1364 	if (ATTR_IS_SET(attrs,code))
   1365 		return attrs->values[code].dn;
   1366 	STOREerr(STORE_F_STORE_ATTR_INFO_GET0_DN,
   1367 		STORE_R_NO_VALUE);
   1368 	return NULL;
   1369 	}
   1370 BIGNUM *STORE_ATTR_INFO_get0_number(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code)
   1371 	{
   1372 	if (!attrs)
   1373 		{
   1374 		STOREerr(STORE_F_STORE_ATTR_INFO_GET0_NUMBER,
   1375 			ERR_R_PASSED_NULL_PARAMETER);
   1376 		return NULL;
   1377 		}
   1378 	if (ATTR_IS_SET(attrs,code))
   1379 		return attrs->values[code].number;
   1380 	STOREerr(STORE_F_STORE_ATTR_INFO_GET0_NUMBER,
   1381 		STORE_R_NO_VALUE);
   1382 	return NULL;
   1383 	}
   1384 int STORE_ATTR_INFO_set_cstr(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
   1385 	char *cstr, size_t cstr_size)
   1386 	{
   1387 	if (!attrs)
   1388 		{
   1389 		STOREerr(STORE_F_STORE_ATTR_INFO_SET_CSTR,
   1390 			ERR_R_PASSED_NULL_PARAMETER);
   1391 		return 0;
   1392 		}
   1393 	if (!ATTR_IS_SET(attrs,code))
   1394 		{
   1395 		if ((attrs->values[code].cstring = BUF_strndup(cstr, cstr_size)))
   1396 			return 1;
   1397 		STOREerr(STORE_F_STORE_ATTR_INFO_SET_CSTR,
   1398 			ERR_R_MALLOC_FAILURE);
   1399 		return 0;
   1400 		}
   1401 	STOREerr(STORE_F_STORE_ATTR_INFO_SET_CSTR, STORE_R_ALREADY_HAS_A_VALUE);
   1402 	return 0;
   1403 	}
   1404 int STORE_ATTR_INFO_set_sha1str(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
   1405 	unsigned char *sha1str, size_t sha1str_size)
   1406 	{
   1407 	if (!attrs)
   1408 		{
   1409 		STOREerr(STORE_F_STORE_ATTR_INFO_SET_SHA1STR,
   1410 			ERR_R_PASSED_NULL_PARAMETER);
   1411 		return 0;
   1412 		}
   1413 	if (!ATTR_IS_SET(attrs,code))
   1414 		{
   1415 		if ((attrs->values[code].sha1string =
   1416 			    (unsigned char *)BUF_memdup(sha1str,
   1417 				    sha1str_size)))
   1418 			return 1;
   1419 		STOREerr(STORE_F_STORE_ATTR_INFO_SET_SHA1STR,
   1420 			ERR_R_MALLOC_FAILURE);
   1421 		return 0;
   1422 		}
   1423 	STOREerr(STORE_F_STORE_ATTR_INFO_SET_SHA1STR, STORE_R_ALREADY_HAS_A_VALUE);
   1424 	return 0;
   1425 	}
   1426 int STORE_ATTR_INFO_set_dn(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
   1427 	X509_NAME *dn)
   1428 	{
   1429 	if (!attrs)
   1430 		{
   1431 		STOREerr(STORE_F_STORE_ATTR_INFO_SET_DN,
   1432 			ERR_R_PASSED_NULL_PARAMETER);
   1433 		return 0;
   1434 		}
   1435 	if (!ATTR_IS_SET(attrs,code))
   1436 		{
   1437 		if ((attrs->values[code].dn = X509_NAME_dup(dn)))
   1438 			return 1;
   1439 		STOREerr(STORE_F_STORE_ATTR_INFO_SET_DN,
   1440 			ERR_R_MALLOC_FAILURE);
   1441 		return 0;
   1442 		}
   1443 	STOREerr(STORE_F_STORE_ATTR_INFO_SET_DN, STORE_R_ALREADY_HAS_A_VALUE);
   1444 	return 0;
   1445 	}
   1446 int STORE_ATTR_INFO_set_number(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
   1447 	BIGNUM *number)
   1448 	{
   1449 	if (!attrs)
   1450 		{
   1451 		STOREerr(STORE_F_STORE_ATTR_INFO_SET_NUMBER,
   1452 			ERR_R_PASSED_NULL_PARAMETER);
   1453 		return 0;
   1454 		}
   1455 	if (!ATTR_IS_SET(attrs,code))
   1456 		{
   1457 		if ((attrs->values[code].number = BN_dup(number)))
   1458 			return 1;
   1459 		STOREerr(STORE_F_STORE_ATTR_INFO_SET_NUMBER,
   1460 			ERR_R_MALLOC_FAILURE);
   1461 		return 0;
   1462 		}
   1463 	STOREerr(STORE_F_STORE_ATTR_INFO_SET_NUMBER, STORE_R_ALREADY_HAS_A_VALUE);
   1464 	return 0;
   1465 	}
   1466 int STORE_ATTR_INFO_modify_cstr(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
   1467 	char *cstr, size_t cstr_size)
   1468 	{
   1469 	if (!attrs)
   1470 		{
   1471 		STOREerr(STORE_F_STORE_ATTR_INFO_MODIFY_CSTR,
   1472 			ERR_R_PASSED_NULL_PARAMETER);
   1473 		return 0;
   1474 		}
   1475 	if (ATTR_IS_SET(attrs,code))
   1476 		{
   1477 		OPENSSL_free(attrs->values[code].cstring);
   1478 		attrs->values[code].cstring = NULL;
   1479 		CLEAR_ATTRBIT(attrs, code);
   1480 		}
   1481 	return STORE_ATTR_INFO_set_cstr(attrs, code, cstr, cstr_size);
   1482 	}
   1483 int STORE_ATTR_INFO_modify_sha1str(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
   1484 	unsigned char *sha1str, size_t sha1str_size)
   1485 	{
   1486 	if (!attrs)
   1487 		{
   1488 		STOREerr(STORE_F_STORE_ATTR_INFO_MODIFY_SHA1STR,
   1489 			ERR_R_PASSED_NULL_PARAMETER);
   1490 		return 0;
   1491 		}
   1492 	if (ATTR_IS_SET(attrs,code))
   1493 		{
   1494 		OPENSSL_free(attrs->values[code].sha1string);
   1495 		attrs->values[code].sha1string = NULL;
   1496 		CLEAR_ATTRBIT(attrs, code);
   1497 		}
   1498 	return STORE_ATTR_INFO_set_sha1str(attrs, code, sha1str, sha1str_size);
   1499 	}
   1500 int STORE_ATTR_INFO_modify_dn(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
   1501 	X509_NAME *dn)
   1502 	{
   1503 	if (!attrs)
   1504 		{
   1505 		STOREerr(STORE_F_STORE_ATTR_INFO_MODIFY_DN,
   1506 			ERR_R_PASSED_NULL_PARAMETER);
   1507 		return 0;
   1508 		}
   1509 	if (ATTR_IS_SET(attrs,code))
   1510 		{
   1511 		OPENSSL_free(attrs->values[code].dn);
   1512 		attrs->values[code].dn = NULL;
   1513 		CLEAR_ATTRBIT(attrs, code);
   1514 		}
   1515 	return STORE_ATTR_INFO_set_dn(attrs, code, dn);
   1516 	}
   1517 int STORE_ATTR_INFO_modify_number(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
   1518 	BIGNUM *number)
   1519 	{
   1520 	if (!attrs)
   1521 		{
   1522 		STOREerr(STORE_F_STORE_ATTR_INFO_MODIFY_NUMBER,
   1523 			ERR_R_PASSED_NULL_PARAMETER);
   1524 		return 0;
   1525 		}
   1526 	if (ATTR_IS_SET(attrs,code))
   1527 		{
   1528 		OPENSSL_free(attrs->values[code].number);
   1529 		attrs->values[code].number = NULL;
   1530 		CLEAR_ATTRBIT(attrs, code);
   1531 		}
   1532 	return STORE_ATTR_INFO_set_number(attrs, code, number);
   1533 	}
   1534 
   1535 struct attr_list_ctx_st
   1536 	{
   1537 	OPENSSL_ITEM *attributes;
   1538 	};
   1539 void *STORE_parse_attrs_start(OPENSSL_ITEM *attributes)
   1540 	{
   1541 	if (attributes)
   1542 		{
   1543 		struct attr_list_ctx_st *context =
   1544 			(struct attr_list_ctx_st *)OPENSSL_malloc(sizeof(struct attr_list_ctx_st));
   1545 		if (context)
   1546 			context->attributes = attributes;
   1547 		else
   1548 			STOREerr(STORE_F_STORE_PARSE_ATTRS_START,
   1549 				ERR_R_MALLOC_FAILURE);
   1550 		return context;
   1551 		}
   1552 	STOREerr(STORE_F_STORE_PARSE_ATTRS_START, ERR_R_PASSED_NULL_PARAMETER);
   1553 	return 0;
   1554 	}
   1555 STORE_ATTR_INFO *STORE_parse_attrs_next(void *handle)
   1556 	{
   1557 	struct attr_list_ctx_st *context = (struct attr_list_ctx_st *)handle;
   1558 
   1559 	if (context && context->attributes)
   1560 		{
   1561 		STORE_ATTR_INFO *attrs = NULL;
   1562 
   1563 		while(context->attributes
   1564 			&& context->attributes->code != STORE_ATTR_OR
   1565 			&& context->attributes->code != STORE_ATTR_END)
   1566 			{
   1567 			switch(context->attributes->code)
   1568 				{
   1569 			case STORE_ATTR_FRIENDLYNAME:
   1570 			case STORE_ATTR_EMAIL:
   1571 			case STORE_ATTR_FILENAME:
   1572 				if (!attrs) attrs = STORE_ATTR_INFO_new();
   1573 				if (attrs == NULL)
   1574 					{
   1575 					STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT,
   1576 						ERR_R_MALLOC_FAILURE);
   1577 					goto err;
   1578 					}
   1579 				STORE_ATTR_INFO_set_cstr(attrs,
   1580 					context->attributes->code,
   1581 					context->attributes->value,
   1582 					context->attributes->value_size);
   1583 				break;
   1584 			case STORE_ATTR_KEYID:
   1585 			case STORE_ATTR_ISSUERKEYID:
   1586 			case STORE_ATTR_SUBJECTKEYID:
   1587 			case STORE_ATTR_ISSUERSERIALHASH:
   1588 			case STORE_ATTR_CERTHASH:
   1589 				if (!attrs) attrs = STORE_ATTR_INFO_new();
   1590 				if (attrs == NULL)
   1591 					{
   1592 					STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT,
   1593 						ERR_R_MALLOC_FAILURE);
   1594 					goto err;
   1595 					}
   1596 				STORE_ATTR_INFO_set_sha1str(attrs,
   1597 					context->attributes->code,
   1598 					context->attributes->value,
   1599 					context->attributes->value_size);
   1600 				break;
   1601 			case STORE_ATTR_ISSUER:
   1602 			case STORE_ATTR_SUBJECT:
   1603 				if (!attrs) attrs = STORE_ATTR_INFO_new();
   1604 				if (attrs == NULL)
   1605 					{
   1606 					STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT,
   1607 						ERR_R_MALLOC_FAILURE);
   1608 					goto err;
   1609 					}
   1610 				STORE_ATTR_INFO_modify_dn(attrs,
   1611 					context->attributes->code,
   1612 					context->attributes->value);
   1613 				break;
   1614 			case STORE_ATTR_SERIAL:
   1615 				if (!attrs) attrs = STORE_ATTR_INFO_new();
   1616 				if (attrs == NULL)
   1617 					{
   1618 					STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT,
   1619 						ERR_R_MALLOC_FAILURE);
   1620 					goto err;
   1621 					}
   1622 				STORE_ATTR_INFO_modify_number(attrs,
   1623 					context->attributes->code,
   1624 					context->attributes->value);
   1625 				break;
   1626 				}
   1627 			context->attributes++;
   1628 			}
   1629 		if (context->attributes->code == STORE_ATTR_OR)
   1630 			context->attributes++;
   1631 		return attrs;
   1632 	err:
   1633 		while(context->attributes
   1634 			&& context->attributes->code != STORE_ATTR_OR
   1635 			&& context->attributes->code != STORE_ATTR_END)
   1636 			context->attributes++;
   1637 		if (context->attributes->code == STORE_ATTR_OR)
   1638 			context->attributes++;
   1639 		return NULL;
   1640 		}
   1641 	STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT, ERR_R_PASSED_NULL_PARAMETER);
   1642 	return NULL;
   1643 	}
   1644 int STORE_parse_attrs_end(void *handle)
   1645 	{
   1646 	struct attr_list_ctx_st *context = (struct attr_list_ctx_st *)handle;
   1647 
   1648 	if (context && context->attributes)
   1649 		{
   1650 #if 0
   1651 		OPENSSL_ITEM *attributes = context->attributes;
   1652 #endif
   1653 		OPENSSL_free(context);
   1654 		return 1;
   1655 		}
   1656 	STOREerr(STORE_F_STORE_PARSE_ATTRS_END, ERR_R_PASSED_NULL_PARAMETER);
   1657 	return 0;
   1658 	}
   1659 
   1660 int STORE_parse_attrs_endp(void *handle)
   1661 	{
   1662 	struct attr_list_ctx_st *context = (struct attr_list_ctx_st *)handle;
   1663 
   1664 	if (context && context->attributes)
   1665 		{
   1666 		return context->attributes->code == STORE_ATTR_END;
   1667 		}
   1668 	STOREerr(STORE_F_STORE_PARSE_ATTRS_ENDP, ERR_R_PASSED_NULL_PARAMETER);
   1669 	return 0;
   1670 	}
   1671 
   1672 static int attr_info_compare_compute_range(
   1673 	const unsigned char *abits, const unsigned char *bbits,
   1674 	unsigned int *alowp, unsigned int *ahighp,
   1675 	unsigned int *blowp, unsigned int *bhighp)
   1676 	{
   1677 	unsigned int alow = (unsigned int)-1, ahigh = 0;
   1678 	unsigned int blow = (unsigned int)-1, bhigh = 0;
   1679 	int i, res = 0;
   1680 
   1681 	for (i = 0; i < (STORE_ATTR_TYPE_NUM + 8) / 8; i++, abits++, bbits++)
   1682 		{
   1683 		if (res == 0)
   1684 			{
   1685 			if (*abits < *bbits) res = -1;
   1686 			if (*abits > *bbits) res = 1;
   1687 			}
   1688 		if (*abits)
   1689 			{
   1690 			if (alow == (unsigned int)-1)
   1691 				{
   1692 				alow = i * 8;
   1693 				if (!(*abits & 0x01)) alow++;
   1694 				if (!(*abits & 0x02)) alow++;
   1695 				if (!(*abits & 0x04)) alow++;
   1696 				if (!(*abits & 0x08)) alow++;
   1697 				if (!(*abits & 0x10)) alow++;
   1698 				if (!(*abits & 0x20)) alow++;
   1699 				if (!(*abits & 0x40)) alow++;
   1700 				}
   1701 			ahigh = i * 8 + 7;
   1702 			if (!(*abits & 0x80)) ahigh++;
   1703 			if (!(*abits & 0x40)) ahigh++;
   1704 			if (!(*abits & 0x20)) ahigh++;
   1705 			if (!(*abits & 0x10)) ahigh++;
   1706 			if (!(*abits & 0x08)) ahigh++;
   1707 			if (!(*abits & 0x04)) ahigh++;
   1708 			if (!(*abits & 0x02)) ahigh++;
   1709 			}
   1710 		if (*bbits)
   1711 			{
   1712 			if (blow == (unsigned int)-1)
   1713 				{
   1714 				blow = i * 8;
   1715 				if (!(*bbits & 0x01)) blow++;
   1716 				if (!(*bbits & 0x02)) blow++;
   1717 				if (!(*bbits & 0x04)) blow++;
   1718 				if (!(*bbits & 0x08)) blow++;
   1719 				if (!(*bbits & 0x10)) blow++;
   1720 				if (!(*bbits & 0x20)) blow++;
   1721 				if (!(*bbits & 0x40)) blow++;
   1722 				}
   1723 			bhigh = i * 8 + 7;
   1724 			if (!(*bbits & 0x80)) bhigh++;
   1725 			if (!(*bbits & 0x40)) bhigh++;
   1726 			if (!(*bbits & 0x20)) bhigh++;
   1727 			if (!(*bbits & 0x10)) bhigh++;
   1728 			if (!(*bbits & 0x08)) bhigh++;
   1729 			if (!(*bbits & 0x04)) bhigh++;
   1730 			if (!(*bbits & 0x02)) bhigh++;
   1731 			}
   1732 		}
   1733 	if (ahigh + alow < bhigh + blow) res = -1;
   1734 	if (ahigh + alow > bhigh + blow) res = 1;
   1735 	if (alowp) *alowp = alow;
   1736 	if (ahighp) *ahighp = ahigh;
   1737 	if (blowp) *blowp = blow;
   1738 	if (bhighp) *bhighp = bhigh;
   1739 	return res;
   1740 	}
   1741 
   1742 int STORE_ATTR_INFO_compare(const STORE_ATTR_INFO * const *a,
   1743 			    const STORE_ATTR_INFO * const *b)
   1744 	{
   1745 	if (a == b) return 0;
   1746 	if (!a) return -1;
   1747 	if (!b) return 1;
   1748 	return attr_info_compare_compute_range((*a)->set, (*b)->set, 0, 0, 0, 0);
   1749 	}
   1750 
   1751 int STORE_ATTR_INFO_in_range(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b)
   1752 	{
   1753 	unsigned int alow, ahigh, blow, bhigh;
   1754 
   1755 	if (a == b) return 1;
   1756 	if (!a) return 0;
   1757 	if (!b) return 0;
   1758 	attr_info_compare_compute_range(a->set, b->set,
   1759 		&alow, &ahigh, &blow, &bhigh);
   1760 	if (alow >= blow && ahigh <= bhigh)
   1761 		return 1;
   1762 	return 0;
   1763 	}
   1764 
   1765 int STORE_ATTR_INFO_in(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b)
   1766 	{
   1767 	unsigned char *abits, *bbits;
   1768 	int i;
   1769 
   1770 	if (a == b) return 1;
   1771 	if (!a) return 0;
   1772 	if (!b) return 0;
   1773 	abits = a->set;
   1774 	bbits = b->set;
   1775 	for (i = 0; i < (STORE_ATTR_TYPE_NUM + 8) / 8; i++, abits++, bbits++)
   1776 		{
   1777 		if (*abits && (*bbits & *abits) != *abits)
   1778 			return 0;
   1779 		}
   1780 	return 1;
   1781 	}
   1782 
   1783 int STORE_ATTR_INFO_in_ex(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b)
   1784 	{
   1785 	STORE_ATTR_TYPES i;
   1786 
   1787 	if (a == b) return 1;
   1788 	if (!STORE_ATTR_INFO_in(a, b)) return 0;
   1789 	for (i = 1; i < STORE_ATTR_TYPE_NUM; i++)
   1790 		if (ATTR_IS_SET(a, i))
   1791 			{
   1792 			switch(i)
   1793 				{
   1794 			case STORE_ATTR_FRIENDLYNAME:
   1795 			case STORE_ATTR_EMAIL:
   1796 			case STORE_ATTR_FILENAME:
   1797 				if (strcmp(a->values[i].cstring,
   1798 					    b->values[i].cstring))
   1799 					return 0;
   1800 				break;
   1801 			case STORE_ATTR_KEYID:
   1802 			case STORE_ATTR_ISSUERKEYID:
   1803 			case STORE_ATTR_SUBJECTKEYID:
   1804 			case STORE_ATTR_ISSUERSERIALHASH:
   1805 			case STORE_ATTR_CERTHASH:
   1806 				if (memcmp(a->values[i].sha1string,
   1807 					    b->values[i].sha1string,
   1808 					    a->value_sizes[i]))
   1809 					return 0;
   1810 				break;
   1811 			case STORE_ATTR_ISSUER:
   1812 			case STORE_ATTR_SUBJECT:
   1813 				if (X509_NAME_cmp(a->values[i].dn,
   1814 					    b->values[i].dn))
   1815 					return 0;
   1816 				break;
   1817 			case STORE_ATTR_SERIAL:
   1818 				if (BN_cmp(a->values[i].number,
   1819 					    b->values[i].number))
   1820 					return 0;
   1821 				break;
   1822 			default:
   1823 				break;
   1824 				}
   1825 			}
   1826 
   1827 	return 1;
   1828 	}
   1829