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