1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* crypto/store/str_lib.c -*- mode:C; c-file-style: "eay" -*- */
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Written by Richard Levitte (richard@levitte.org) for the OpenSSL
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * project 2003.
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* ====================================================================
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright (c) 2003 The OpenSSL Project.  All rights reserved.
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met:
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the above copyright
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer.
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer in
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    the documentation and/or other materials provided with the
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    distribution.
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    software must display the following acknowledgment:
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes software developed by the OpenSSL Project
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    endorse or promote products derived from this software without
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    prior written permission. For written permission, please contact
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    openssl-core@openssl.org.
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5. Products derived from this software may not be called "OpenSSL"
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    nor may "OpenSSL" appear in their names without prior written
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    permission of the OpenSSL Project.
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 6. Redistributions of any form whatsoever must retain the following
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    acknowledgment:
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes software developed by the OpenSSL Project
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OF THE POSSIBILITY OF SUCH DAMAGE.
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ====================================================================
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This product includes cryptographic software written by Eric Young
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * (eay@cryptsoft.com).  This product includes software written by Tim
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Hudson (tjh@cryptsoft.com).
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <string.h>
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/bn.h>
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/err.h>
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/engine.h>
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/sha.h>
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/x509.h>
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "str_locl.h"
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst char * const STORE_object_type_string[STORE_OBJECT_TYPE_NUM+1] =
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0,
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	"X.509 Certificate",
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	"X.509 CRL",
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	"Private Key",
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	"Public Key",
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	"Number",
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	"Arbitrary Data"
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	};
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst int STORE_param_sizes[STORE_PARAM_TYPE_NUM+1] =
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0,
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sizeof(int),		/* EVP_TYPE */
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sizeof(size_t),		/* BITS */
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	-1,			/* KEY_PARAMETERS */
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0			/* KEY_NO_PARAMETERS */
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	};
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst int STORE_attr_sizes[STORE_ATTR_TYPE_NUM+1] =
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0,
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	-1,			/* FRIENDLYNAME:	C string */
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA_DIGEST_LENGTH,	/* KEYID:		SHA1 digest, 160 bits */
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA_DIGEST_LENGTH,	/* ISSUERKEYID:		SHA1 digest, 160 bits */
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA_DIGEST_LENGTH,	/* SUBJECTKEYID:	SHA1 digest, 160 bits */
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA_DIGEST_LENGTH,	/* ISSUERSERIALHASH:	SHA1 digest, 160 bits */
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sizeof(X509_NAME *),	/* ISSUER:		X509_NAME * */
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sizeof(BIGNUM *),	/* SERIAL:		BIGNUM * */
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sizeof(X509_NAME *),	/* SUBJECT:		X509_NAME * */
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SHA_DIGEST_LENGTH,	/* CERTHASH:		SHA1 digest, 160 bits */
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	-1,			/* EMAIL:		C string */
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	-1,			/* FILENAME:		C string */
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	};
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectSTORE *STORE_new_method(const STORE_METHOD *method)
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE *ret;
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (method == NULL)
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_NEW_METHOD,ERR_R_PASSED_NULL_PARAMETER);
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret=(STORE *)OPENSSL_malloc(sizeof(STORE));
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ret == NULL)
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_NEW_METHOD,ERR_R_MALLOC_FAILURE);
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret->meth=method;
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CRYPTO_new_ex_data(CRYPTO_EX_INDEX_STORE, ret, &ret->ex_data);
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ret->meth->init && !ret->meth->init(ret))
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STORE_free(ret);
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ret = NULL;
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectSTORE *STORE_new_engine(ENGINE *engine)
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE *ret = NULL;
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ENGINE *e = engine;
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const STORE_METHOD *meth = 0;
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_NO_ENGINE
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	e = NULL;
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (engine)
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!ENGINE_init(engine))
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STOREerr(STORE_F_STORE_NEW_ENGINE, ERR_R_ENGINE_LIB);
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return NULL;
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		e = engine;
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_NEW_ENGINE,ERR_R_PASSED_NULL_PARAMETER);
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(e)
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		meth = ENGINE_get_STORE(e);
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(!meth)
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STOREerr(STORE_F_STORE_NEW_ENGINE,
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				ERR_R_ENGINE_LIB);
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ENGINE_finish(e);
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return NULL;
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret = STORE_new_method(meth);
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ret == NULL)
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_NEW_ENGINE,ERR_R_STORE_LIB);
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret->engine = e;
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(ret);
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid STORE_free(STORE *store)
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (store == NULL)
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return;
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (store->meth->clean)
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		store->meth->clean(store);
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CRYPTO_free_ex_data(CRYPTO_EX_INDEX_STORE, store, &store->ex_data);
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_free(store);
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_ctrl(STORE *store, int cmd, long i, void *p, void (*f)(void))
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (store == NULL)
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_CTRL,ERR_R_PASSED_NULL_PARAMETER);
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (store->meth->ctrl)
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return store->meth->ctrl(store, cmd, i, p, f);
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STOREerr(STORE_F_STORE_CTRL,STORE_R_NO_CONTROL_FUNCTION);
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	     CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func)
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        {
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_STORE, argl, argp,
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				new_func, dup_func, free_func);
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        }
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_set_ex_data(STORE *r, int idx, void *arg)
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(CRYPTO_set_ex_data(&r->ex_data,idx,arg));
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid *STORE_get_ex_data(STORE *r, int idx)
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(CRYPTO_get_ex_data(&r->ex_data,idx));
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst STORE_METHOD *STORE_get_method(STORE *store)
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return store->meth;
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst STORE_METHOD *STORE_set_method(STORE *store, const STORE_METHOD *meth)
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	store->meth=meth;
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return store->meth;
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* API helpers */
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define check_store(s,fncode,fnname,fnerrcode) \
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	do \
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{ \
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((s) == NULL || (s)->meth == NULL) \
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{ \
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STOREerr((fncode), ERR_R_PASSED_NULL_PARAMETER); \
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return 0; \
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			} \
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((s)->meth->fnname == NULL) \
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{ \
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STOREerr((fncode), (fnerrcode)); \
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return 0; \
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			} \
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		} \
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	while(0)
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* API functions */
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectX509 *STORE_get_certificate(STORE *s, OPENSSL_ITEM attributes[],
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT *object;
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509 *x;
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_GET_CERTIFICATE,
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		get_object,STORE_R_NO_GET_OBJECT_FUNCTION);
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	object = s->meth->get_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE,
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		attributes, parameters);
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!object || !object->data.x509.certificate)
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_GET_CERTIFICATE,
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_GETTING_CERTIFICATE);
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CRYPTO_add(&object->data.x509.certificate->references,1,CRYPTO_LOCK_X509);
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef REF_PRINT
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	REF_PRINT("X509",data);
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	x = object->data.x509.certificate;
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT_free(object);
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return x;
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_store_certificate(STORE *s, X509 *data, OPENSSL_ITEM attributes[],
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT *object;
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_CERTIFICATE,
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		store_object,STORE_R_NO_STORE_OBJECT_FUNCTION);
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	object = STORE_OBJECT_new();
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!object)
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_STORE_CERTIFICATE,
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_R_MALLOC_FAILURE);
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CRYPTO_add(&data->references,1,CRYPTO_LOCK_X509);
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef REF_PRINT
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	REF_PRINT("X509",data);
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	object->data.x509.certificate = data;
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i = s->meth->store_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE,
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		object, attributes, parameters);
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT_free(object);
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!i)
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_STORE_CERTIFICATE,
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_STORING_CERTIFICATE);
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_modify_certificate(STORE *s, OPENSSL_ITEM search_attributes[],
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM add_attributes[], OPENSSL_ITEM modify_attributes[],
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[])
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_MODIFY_CERTIFICATE,
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		modify_object,STORE_R_NO_MODIFY_OBJECT_FUNCTION);
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE,
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		    search_attributes, add_attributes, modify_attributes,
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		    delete_attributes, parameters))
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_MODIFY_CERTIFICATE,
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_MODIFYING_CERTIFICATE);
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_revoke_certificate(STORE *s, OPENSSL_ITEM attributes[],
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_REVOKE_CERTIFICATE,
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		revoke_object,STORE_R_NO_REVOKE_OBJECT_FUNCTION);
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!s->meth->revoke_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE,
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		    attributes, parameters))
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_REVOKE_CERTIFICATE,
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_REVOKING_CERTIFICATE);
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_delete_certificate(STORE *s, OPENSSL_ITEM attributes[],
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_DELETE_CERTIFICATE,
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		delete_object,STORE_R_NO_DELETE_OBJECT_FUNCTION);
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE,
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		    attributes, parameters))
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_DELETE_CERTIFICATE,
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_DELETING_CERTIFICATE);
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid *STORE_list_certificate_start(STORE *s, OPENSSL_ITEM attributes[],
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	void *handle;
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_LIST_CERTIFICATE_START,
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		list_object_start,STORE_R_NO_LIST_OBJECT_START_FUNCTION);
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	handle = s->meth->list_object_start(s,
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STORE_OBJECT_TYPE_X509_CERTIFICATE, attributes, parameters);
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!handle)
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_LIST_CERTIFICATE_START,
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_LISTING_CERTIFICATES);
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return handle;
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectX509 *STORE_list_certificate_next(STORE *s, void *handle)
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT *object;
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509 *x;
390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_LIST_CERTIFICATE_NEXT,
392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		list_object_next,STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION);
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	object = s->meth->list_object_next(s, handle);
395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!object || !object->data.x509.certificate)
396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_LIST_CERTIFICATE_NEXT,
398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_LISTING_CERTIFICATES);
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CRYPTO_add(&object->data.x509.certificate->references,1,CRYPTO_LOCK_X509);
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef REF_PRINT
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	REF_PRINT("X509",data);
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	x = object->data.x509.certificate;
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT_free(object);
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return x;
408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_list_certificate_end(STORE *s, void *handle)
411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_LIST_CERTIFICATE_END,
413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		list_object_end,STORE_R_NO_LIST_OBJECT_END_FUNCTION);
414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!s->meth->list_object_end(s, handle))
416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_LIST_CERTIFICATE_END,
418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_LISTING_CERTIFICATES);
419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_list_certificate_endp(STORE *s, void *handle)
425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_LIST_CERTIFICATE_ENDP,
427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		list_object_endp,STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION);
428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!s->meth->list_object_endp(s, handle))
430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_LIST_CERTIFICATE_ENDP,
432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_LISTING_CERTIFICATES);
433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectEVP_PKEY *STORE_generate_key(STORE *s, OPENSSL_ITEM attributes[],
439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT *object;
442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EVP_PKEY *pkey;
443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_GENERATE_KEY,
445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		generate_object,STORE_R_NO_GENERATE_OBJECT_FUNCTION);
446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	object = s->meth->generate_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY,
448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		attributes, parameters);
449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!object || !object->data.key)
450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_GENERATE_KEY,
452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_GENERATING_KEY);
453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CRYPTO_add(&object->data.key->references,1,CRYPTO_LOCK_EVP_PKEY);
456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef REF_PRINT
457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	REF_PRINT("EVP_PKEY",data);
458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pkey = object->data.key;
460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT_free(object);
461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return pkey;
462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectEVP_PKEY *STORE_get_private_key(STORE *s, OPENSSL_ITEM attributes[],
465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT *object;
468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EVP_PKEY *pkey;
469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_GET_PRIVATE_KEY,
471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		get_object,STORE_R_NO_GET_OBJECT_FUNCTION);
472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	object = s->meth->get_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY,
474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		attributes, parameters);
475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!object || !object->data.key || !object->data.key)
476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_GET_PRIVATE_KEY,
478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_GETTING_KEY);
479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CRYPTO_add(&object->data.key->references,1,CRYPTO_LOCK_EVP_PKEY);
482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef REF_PRINT
483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	REF_PRINT("EVP_PKEY",data);
484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pkey = object->data.key;
486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT_free(object);
487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return pkey;
488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_store_private_key(STORE *s, EVP_PKEY *data, OPENSSL_ITEM attributes[],
491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT *object;
494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_STORE_PRIVATE_KEY,
497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		store_object,STORE_R_NO_STORE_OBJECT_FUNCTION);
498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	object = STORE_OBJECT_new();
500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!object)
501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_STORE_PRIVATE_KEY,
503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_R_MALLOC_FAILURE);
504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	object->data.key = EVP_PKEY_new();
507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!object->data.key)
508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_STORE_PRIVATE_KEY,
510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_R_MALLOC_FAILURE);
511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CRYPTO_add(&data->references,1,CRYPTO_LOCK_EVP_PKEY);
515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef REF_PRINT
516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	REF_PRINT("EVP_PKEY",data);
517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	object->data.key = data;
519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i = s->meth->store_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY, object,
521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		attributes, parameters);
522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT_free(object);
524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!i)
526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_STORE_PRIVATE_KEY,
528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_STORING_KEY);
529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return i;
532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_modify_private_key(STORE *s, OPENSSL_ITEM search_attributes[],
535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM add_attributes[], OPENSSL_ITEM modify_attributes[],
536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[])
537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_MODIFY_PRIVATE_KEY,
539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		modify_object,STORE_R_NO_MODIFY_OBJECT_FUNCTION);
540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY,
542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		    search_attributes, add_attributes, modify_attributes,
543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		    delete_attributes, parameters))
544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_MODIFY_PRIVATE_KEY,
546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_MODIFYING_PRIVATE_KEY);
547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_revoke_private_key(STORE *s, OPENSSL_ITEM attributes[],
553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_REVOKE_PRIVATE_KEY,
558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		revoke_object,STORE_R_NO_REVOKE_OBJECT_FUNCTION);
559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i = s->meth->revoke_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY,
561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		attributes, parameters);
562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!i)
564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_REVOKE_PRIVATE_KEY,
566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_REVOKING_KEY);
567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return i;
570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_delete_private_key(STORE *s, OPENSSL_ITEM attributes[],
573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_DELETE_PRIVATE_KEY,
576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		delete_object,STORE_R_NO_DELETE_OBJECT_FUNCTION);
577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY,
579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		    attributes, parameters))
580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_DELETE_PRIVATE_KEY,
582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_DELETING_KEY);
583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid *STORE_list_private_key_start(STORE *s, OPENSSL_ITEM attributes[],
589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	void *handle;
592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_LIST_PRIVATE_KEY_START,
594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		list_object_start,STORE_R_NO_LIST_OBJECT_START_FUNCTION);
595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	handle = s->meth->list_object_start(s, STORE_OBJECT_TYPE_PRIVATE_KEY,
597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		attributes, parameters);
598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!handle)
599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_LIST_PRIVATE_KEY_START,
601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_LISTING_KEYS);
602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return handle;
605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectEVP_PKEY *STORE_list_private_key_next(STORE *s, void *handle)
608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT *object;
610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EVP_PKEY *pkey;
611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_LIST_PRIVATE_KEY_NEXT,
613656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		list_object_next,STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION);
614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	object = s->meth->list_object_next(s, handle);
616656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!object || !object->data.key || !object->data.key)
617656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
618656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_LIST_PRIVATE_KEY_NEXT,
619656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_LISTING_KEYS);
620656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
621656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
622656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CRYPTO_add(&object->data.key->references,1,CRYPTO_LOCK_EVP_PKEY);
623656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef REF_PRINT
624656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	REF_PRINT("EVP_PKEY",data);
625656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
626656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pkey = object->data.key;
627656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT_free(object);
628656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return pkey;
629656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
630656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
631656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_list_private_key_end(STORE *s, void *handle)
632656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
633656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_LIST_PRIVATE_KEY_END,
634656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		list_object_end,STORE_R_NO_LIST_OBJECT_END_FUNCTION);
635656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
636656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!s->meth->list_object_end(s, handle))
637656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
638656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_LIST_PRIVATE_KEY_END,
639656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_LISTING_KEYS);
640656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
641656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
642656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
643656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
644656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
645656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_list_private_key_endp(STORE *s, void *handle)
646656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
647656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_LIST_PRIVATE_KEY_ENDP,
648656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		list_object_endp,STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION);
649656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
650656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!s->meth->list_object_endp(s, handle))
651656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
652656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_LIST_PRIVATE_KEY_ENDP,
653656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_LISTING_KEYS);
654656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
655656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
656656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
657656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
658656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
659656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectEVP_PKEY *STORE_get_public_key(STORE *s, OPENSSL_ITEM attributes[],
660656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
661656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
662656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT *object;
663656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EVP_PKEY *pkey;
664656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
665656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_GET_PUBLIC_KEY,
666656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		get_object,STORE_R_NO_GET_OBJECT_FUNCTION);
667656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
668656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	object = s->meth->get_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY,
669656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		attributes, parameters);
670656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!object || !object->data.key || !object->data.key)
671656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
672656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_GET_PUBLIC_KEY,
673656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_GETTING_KEY);
674656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
675656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
676656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CRYPTO_add(&object->data.key->references,1,CRYPTO_LOCK_EVP_PKEY);
677656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef REF_PRINT
678656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	REF_PRINT("EVP_PKEY",data);
679656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
680656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pkey = object->data.key;
681656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT_free(object);
682656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return pkey;
683656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
684656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
685656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_store_public_key(STORE *s, EVP_PKEY *data, OPENSSL_ITEM attributes[],
686656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
687656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
688656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT *object;
689656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
690656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
691656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_STORE_PUBLIC_KEY,
692656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		store_object,STORE_R_NO_STORE_OBJECT_FUNCTION);
693656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
694656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	object = STORE_OBJECT_new();
695656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!object)
696656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
697656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_STORE_PUBLIC_KEY,
698656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_R_MALLOC_FAILURE);
699656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
700656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
701656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	object->data.key = EVP_PKEY_new();
702656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!object->data.key)
703656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
704656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_STORE_PUBLIC_KEY,
705656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_R_MALLOC_FAILURE);
706656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
707656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
708656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
709656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CRYPTO_add(&data->references,1,CRYPTO_LOCK_EVP_PKEY);
710656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef REF_PRINT
711656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	REF_PRINT("EVP_PKEY",data);
712656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
713656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	object->data.key = data;
714656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
715656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i = s->meth->store_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY, object,
716656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		attributes, parameters);
717656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
718656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT_free(object);
719656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
720656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!i)
721656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
722656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_STORE_PUBLIC_KEY,
723656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_STORING_KEY);
724656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
725656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
726656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return i;
727656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
728656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
729656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_modify_public_key(STORE *s, OPENSSL_ITEM search_attributes[],
730656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM add_attributes[], OPENSSL_ITEM modify_attributes[],
731656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[])
732656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
733656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_MODIFY_PUBLIC_KEY,
734656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		modify_object,STORE_R_NO_MODIFY_OBJECT_FUNCTION);
735656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
736656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY,
737656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		    search_attributes, add_attributes, modify_attributes,
738656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		    delete_attributes, parameters))
739656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
740656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_MODIFY_PUBLIC_KEY,
741656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_MODIFYING_PUBLIC_KEY);
742656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
743656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
744656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
745656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
746656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
747656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_revoke_public_key(STORE *s, OPENSSL_ITEM attributes[],
748656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
749656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
750656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
751656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
752656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_REVOKE_PUBLIC_KEY,
753656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		revoke_object,STORE_R_NO_REVOKE_OBJECT_FUNCTION);
754656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
755656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i = s->meth->revoke_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY,
756656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		attributes, parameters);
757656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
758656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!i)
759656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
760656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_REVOKE_PUBLIC_KEY,
761656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_REVOKING_KEY);
762656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
763656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
764656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return i;
765656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
766656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
767656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_delete_public_key(STORE *s, OPENSSL_ITEM attributes[],
768656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
769656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
770656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_DELETE_PUBLIC_KEY,
771656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		delete_object,STORE_R_NO_DELETE_OBJECT_FUNCTION);
772656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
773656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY,
774656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		    attributes, parameters))
775656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
776656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_DELETE_PUBLIC_KEY,
777656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_DELETING_KEY);
778656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
779656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
780656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
781656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
782656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
783656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid *STORE_list_public_key_start(STORE *s, OPENSSL_ITEM attributes[],
784656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
785656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
786656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	void *handle;
787656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
788656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_LIST_PUBLIC_KEY_START,
789656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		list_object_start,STORE_R_NO_LIST_OBJECT_START_FUNCTION);
790656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
791656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	handle = s->meth->list_object_start(s, STORE_OBJECT_TYPE_PUBLIC_KEY,
792656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		attributes, parameters);
793656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!handle)
794656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
795656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_LIST_PUBLIC_KEY_START,
796656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_LISTING_KEYS);
797656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
798656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
799656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return handle;
800656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
801656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
802656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectEVP_PKEY *STORE_list_public_key_next(STORE *s, void *handle)
803656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
804656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT *object;
805656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EVP_PKEY *pkey;
806656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
807656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_LIST_PUBLIC_KEY_NEXT,
808656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		list_object_next,STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION);
809656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
810656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	object = s->meth->list_object_next(s, handle);
811656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!object || !object->data.key || !object->data.key)
812656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
813656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_LIST_PUBLIC_KEY_NEXT,
814656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_LISTING_KEYS);
815656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
816656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
817656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CRYPTO_add(&object->data.key->references,1,CRYPTO_LOCK_EVP_PKEY);
818656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef REF_PRINT
819656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	REF_PRINT("EVP_PKEY",data);
820656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
821656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	pkey = object->data.key;
822656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT_free(object);
823656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return pkey;
824656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
825656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
826656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_list_public_key_end(STORE *s, void *handle)
827656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
828656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_LIST_PUBLIC_KEY_END,
829656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		list_object_end,STORE_R_NO_LIST_OBJECT_END_FUNCTION);
830656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
831656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!s->meth->list_object_end(s, handle))
832656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
833656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_LIST_PUBLIC_KEY_END,
834656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_LISTING_KEYS);
835656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
836656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
837656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
838656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
839656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
840656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_list_public_key_endp(STORE *s, void *handle)
841656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
842656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_LIST_PUBLIC_KEY_ENDP,
843656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		list_object_endp,STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION);
844656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
845656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!s->meth->list_object_endp(s, handle))
846656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
847656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_LIST_PUBLIC_KEY_ENDP,
848656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_LISTING_KEYS);
849656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
850656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
851656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
852656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
853656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
854656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectX509_CRL *STORE_generate_crl(STORE *s, OPENSSL_ITEM attributes[],
855656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
856656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
857656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT *object;
858656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509_CRL *crl;
859656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
860656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_GENERATE_CRL,
861656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		generate_object,STORE_R_NO_GENERATE_CRL_FUNCTION);
862656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
863656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	object = s->meth->generate_object(s, STORE_OBJECT_TYPE_X509_CRL,
864656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		attributes, parameters);
865656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!object || !object->data.crl)
866656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
867656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_GENERATE_CRL,
868656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_GENERATING_CRL);
869656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
870656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
871656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CRYPTO_add(&object->data.crl->references,1,CRYPTO_LOCK_X509_CRL);
872656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef REF_PRINT
873656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	REF_PRINT("X509_CRL",data);
874656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
875656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	crl = object->data.crl;
876656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT_free(object);
877656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return crl;
878656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
879656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
880656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectX509_CRL *STORE_get_crl(STORE *s, OPENSSL_ITEM attributes[],
881656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
882656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
883656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT *object;
884656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509_CRL *crl;
885656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
886656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_GET_CRL,
887656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		get_object,STORE_R_NO_GET_OBJECT_FUNCTION);
888656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
889656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	object = s->meth->get_object(s, STORE_OBJECT_TYPE_X509_CRL,
890656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		attributes, parameters);
891656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!object || !object->data.crl)
892656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
893656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_GET_CRL,
894656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_GETTING_KEY);
895656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
896656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
897656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CRYPTO_add(&object->data.crl->references,1,CRYPTO_LOCK_X509_CRL);
898656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef REF_PRINT
899656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	REF_PRINT("X509_CRL",data);
900656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
901656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	crl = object->data.crl;
902656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT_free(object);
903656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return crl;
904656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
905656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
906656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_store_crl(STORE *s, X509_CRL *data, OPENSSL_ITEM attributes[],
907656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
908656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
909656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT *object;
910656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
911656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
912656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_STORE_CRL,
913656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		store_object,STORE_R_NO_STORE_OBJECT_FUNCTION);
914656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
915656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	object = STORE_OBJECT_new();
916656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!object)
917656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
918656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_STORE_CRL,
919656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_R_MALLOC_FAILURE);
920656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
921656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
922656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
923656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CRYPTO_add(&data->references,1,CRYPTO_LOCK_X509_CRL);
924656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef REF_PRINT
925656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	REF_PRINT("X509_CRL",data);
926656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
927656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	object->data.crl = data;
928656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
929656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i = s->meth->store_object(s, STORE_OBJECT_TYPE_X509_CRL, object,
930656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		attributes, parameters);
931656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
932656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT_free(object);
933656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
934656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!i)
935656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
936656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_STORE_CRL,
937656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_STORING_KEY);
938656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
939656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
940656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return i;
941656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
942656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
943656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_modify_crl(STORE *s, OPENSSL_ITEM search_attributes[],
944656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM add_attributes[], OPENSSL_ITEM modify_attributes[],
945656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[])
946656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
947656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_MODIFY_CRL,
948656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		modify_object,STORE_R_NO_MODIFY_OBJECT_FUNCTION);
949656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
950656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_X509_CRL,
951656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		    search_attributes, add_attributes, modify_attributes,
952656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		    delete_attributes, parameters))
953656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
954656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_MODIFY_CRL,
955656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_MODIFYING_CRL);
956656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
957656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
958656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
959656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
960656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
961656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_delete_crl(STORE *s, OPENSSL_ITEM attributes[],
962656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
963656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
964656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_DELETE_CRL,
965656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		delete_object,STORE_R_NO_DELETE_OBJECT_FUNCTION);
966656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
967656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_X509_CRL,
968656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		    attributes, parameters))
969656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
970656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_DELETE_CRL,
971656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_DELETING_KEY);
972656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
973656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
974656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
975656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
976656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
977656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid *STORE_list_crl_start(STORE *s, OPENSSL_ITEM attributes[],
978656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
979656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
980656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	void *handle;
981656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
982656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_LIST_CRL_START,
983656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		list_object_start,STORE_R_NO_LIST_OBJECT_START_FUNCTION);
984656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
985656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	handle = s->meth->list_object_start(s, STORE_OBJECT_TYPE_X509_CRL,
986656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		attributes, parameters);
987656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!handle)
988656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
989656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_LIST_CRL_START,
990656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_LISTING_KEYS);
991656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
992656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
993656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return handle;
994656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
995656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
996656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectX509_CRL *STORE_list_crl_next(STORE *s, void *handle)
997656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
998656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT *object;
999656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509_CRL *crl;
1000656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1001656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_LIST_CRL_NEXT,
1002656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		list_object_next,STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION);
1003656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1004656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	object = s->meth->list_object_next(s, handle);
1005656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!object || !object->data.crl)
1006656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1007656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_LIST_CRL_NEXT,
1008656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_LISTING_KEYS);
1009656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
1010656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1011656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CRYPTO_add(&object->data.crl->references,1,CRYPTO_LOCK_X509_CRL);
1012656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef REF_PRINT
1013656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	REF_PRINT("X509_CRL",data);
1014656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
1015656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	crl = object->data.crl;
1016656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT_free(object);
1017656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return crl;
1018656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1019656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1020656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_list_crl_end(STORE *s, void *handle)
1021656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1022656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_LIST_CRL_END,
1023656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		list_object_end,STORE_R_NO_LIST_OBJECT_END_FUNCTION);
1024656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1025656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!s->meth->list_object_end(s, handle))
1026656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1027656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_LIST_CRL_END,
1028656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_LISTING_KEYS);
1029656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
1030656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1031656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
1032656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1033656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1034656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_list_crl_endp(STORE *s, void *handle)
1035656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1036656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_LIST_CRL_ENDP,
1037656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		list_object_endp,STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION);
1038656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1039656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!s->meth->list_object_endp(s, handle))
1040656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1041656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_LIST_CRL_ENDP,
1042656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_LISTING_KEYS);
1043656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
1044656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1045656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
1046656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1047656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1048656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_store_number(STORE *s, BIGNUM *data, OPENSSL_ITEM attributes[],
1049656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
1050656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1051656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT *object;
1052656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
1053656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1054656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_STORE_NUMBER,
1055656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		store_object,STORE_R_NO_STORE_OBJECT_NUMBER_FUNCTION);
1056656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1057656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	object = STORE_OBJECT_new();
1058656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!object)
1059656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1060656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_STORE_NUMBER,
1061656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_R_MALLOC_FAILURE);
1062656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
1063656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1064656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1065656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	object->data.number = data;
1066656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1067656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i = s->meth->store_object(s, STORE_OBJECT_TYPE_NUMBER, object,
1068656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		attributes, parameters);
1069656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1070656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT_free(object);
1071656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1072656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!i)
1073656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1074656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_STORE_NUMBER,
1075656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_STORING_NUMBER);
1076656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
1077656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1078656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
1079656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1080656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1081656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_modify_number(STORE *s, OPENSSL_ITEM search_attributes[],
1082656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM add_attributes[], OPENSSL_ITEM modify_attributes[],
1083656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[])
1084656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1085656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_MODIFY_NUMBER,
1086656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		modify_object,STORE_R_NO_MODIFY_OBJECT_FUNCTION);
1087656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1088656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_NUMBER,
1089656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		    search_attributes, add_attributes, modify_attributes,
1090656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		    delete_attributes, parameters))
1091656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1092656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_MODIFY_NUMBER,
1093656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_MODIFYING_NUMBER);
1094656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
1095656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1096656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
1097656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1098656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1099656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBIGNUM *STORE_get_number(STORE *s, OPENSSL_ITEM attributes[],
1100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
1101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT *object;
1103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIGNUM *n;
1104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_GET_NUMBER,
1106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		get_object,STORE_R_NO_GET_OBJECT_NUMBER_FUNCTION);
1107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	object = s->meth->get_object(s, STORE_OBJECT_TYPE_NUMBER, attributes,
1109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		parameters);
1110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!object || !object->data.number)
1111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_GET_NUMBER,
1113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_GETTING_NUMBER);
1114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
1115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	n = object->data.number;
1117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	object->data.number = NULL;
1118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT_free(object);
1119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return n;
1120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_delete_number(STORE *s, OPENSSL_ITEM attributes[],
1123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
1124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_DELETE_NUMBER,
1126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		delete_object,STORE_R_NO_DELETE_NUMBER_FUNCTION);
1127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_NUMBER, attributes,
1129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		    parameters))
1130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_DELETE_NUMBER,
1132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_DELETING_NUMBER);
1133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
1134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
1136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_store_arbitrary(STORE *s, BUF_MEM *data, OPENSSL_ITEM attributes[],
1139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
1140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT *object;
1142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
1143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_STORE_ARBITRARY,
1145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		store_object,STORE_R_NO_STORE_OBJECT_ARBITRARY_FUNCTION);
1146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	object = STORE_OBJECT_new();
1148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!object)
1149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_STORE_ARBITRARY,
1151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_R_MALLOC_FAILURE);
1152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
1153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	object->data.arbitrary = data;
1156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i = s->meth->store_object(s, STORE_OBJECT_TYPE_ARBITRARY, object,
1158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		attributes, parameters);
1159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT_free(object);
1161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!i)
1163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_STORE_ARBITRARY,
1165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_STORING_ARBITRARY);
1166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
1167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
1169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_modify_arbitrary(STORE *s, OPENSSL_ITEM search_attributes[],
1172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM add_attributes[], OPENSSL_ITEM modify_attributes[],
1173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[])
1174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_MODIFY_ARBITRARY,
1176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		modify_object,STORE_R_NO_MODIFY_OBJECT_FUNCTION);
1177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_ARBITRARY,
1179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		    search_attributes, add_attributes, modify_attributes,
1180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		    delete_attributes, parameters))
1181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_MODIFY_ARBITRARY,
1183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_MODIFYING_ARBITRARY);
1184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
1185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
1187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBUF_MEM *STORE_get_arbitrary(STORE *s, OPENSSL_ITEM attributes[],
1190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
1191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT *object;
1193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BUF_MEM *b;
1194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_GET_ARBITRARY,
1196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		get_object,STORE_R_NO_GET_OBJECT_ARBITRARY_FUNCTION);
1197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	object = s->meth->get_object(s, STORE_OBJECT_TYPE_ARBITRARY,
1199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		attributes, parameters);
1200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!object || !object->data.arbitrary)
1201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_GET_ARBITRARY,
1203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_GETTING_ARBITRARY);
1204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
1205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	b = object->data.arbitrary;
1207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	object->data.arbitrary = NULL;
1208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT_free(object);
1209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return b;
1210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_delete_arbitrary(STORE *s, OPENSSL_ITEM attributes[],
1213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
1214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	check_store(s,STORE_F_STORE_DELETE_ARBITRARY,
1216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		delete_object,STORE_R_NO_DELETE_ARBITRARY_FUNCTION);
1217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_ARBITRARY, attributes,
1219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		    parameters))
1220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_DELETE_ARBITRARY,
1222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_R_FAILED_DELETING_ARBITRARY);
1223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
1224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
1226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectSTORE_OBJECT *STORE_OBJECT_new(void)
1229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT *object = OPENSSL_malloc(sizeof(STORE_OBJECT));
1231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (object) memset(object, 0, sizeof(STORE_OBJECT));
1232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return object;
1233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid STORE_OBJECT_free(STORE_OBJECT *data)
1235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!data) return;
1237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	switch (data->type)
1238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case STORE_OBJECT_TYPE_X509_CERTIFICATE:
1240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509_free(data->data.x509.certificate);
1241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
1242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case STORE_OBJECT_TYPE_X509_CRL:
1243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509_CRL_free(data->data.crl);
1244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
1245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case STORE_OBJECT_TYPE_PRIVATE_KEY:
1246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case STORE_OBJECT_TYPE_PUBLIC_KEY:
1247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		EVP_PKEY_free(data->data.key);
1248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
1249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case STORE_OBJECT_TYPE_NUMBER:
1250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BN_free(data->data.number);
1251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
1252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case STORE_OBJECT_TYPE_ARBITRARY:
1253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BUF_MEM_free(data->data.arbitrary);
1254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		break;
1255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_free(data);
1257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectIMPLEMENT_STACK_OF(STORE_OBJECT*)
1260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstruct STORE_attr_info_st
1263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char set[(STORE_ATTR_TYPE_NUM + 8) / 8];
1265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	union
1266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		char *cstring;
1268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		unsigned char *sha1string;
1269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		X509_NAME *dn;
1270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		BIGNUM *number;
1271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		void *any;
1272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		} values[STORE_ATTR_TYPE_NUM+1];
1273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	size_t value_sizes[STORE_ATTR_TYPE_NUM+1];
1274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	};
1275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define ATTR_IS_SET(a,i)	((i) > 0 && (i) < STORE_ATTR_TYPE_NUM \
1277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				&& ((a)->set[(i) / 8] & (1 << ((i) % 8))))
1278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define SET_ATTRBIT(a,i)	((a)->set[(i) / 8] |= (1 << ((i) % 8)))
1279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define CLEAR_ATTRBIT(a,i)	((a)->set[(i) / 8] &= ~(1 << ((i) % 8)))
1280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectSTORE_ATTR_INFO *STORE_ATTR_INFO_new(void)
1282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return (STORE_ATTR_INFO *)OPENSSL_malloc(sizeof(STORE_ATTR_INFO));
1284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void STORE_ATTR_INFO_attr_free(STORE_ATTR_INFO *attrs,
1286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_ATTR_TYPES code)
1287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ATTR_IS_SET(attrs,code))
1289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		switch(code)
1291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case STORE_ATTR_FRIENDLYNAME:
1293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case STORE_ATTR_EMAIL:
1294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case STORE_ATTR_FILENAME:
1295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_ATTR_INFO_modify_cstr(attrs, code, NULL, 0);
1296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			break;
1297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case STORE_ATTR_KEYID:
1298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case STORE_ATTR_ISSUERKEYID:
1299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case STORE_ATTR_SUBJECTKEYID:
1300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case STORE_ATTR_ISSUERSERIALHASH:
1301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case STORE_ATTR_CERTHASH:
1302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_ATTR_INFO_modify_sha1str(attrs, code, NULL, 0);
1303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			break;
1304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case STORE_ATTR_ISSUER:
1305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case STORE_ATTR_SUBJECT:
1306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_ATTR_INFO_modify_dn(attrs, code, NULL);
1307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			break;
1308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		case STORE_ATTR_SERIAL:
1309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_ATTR_INFO_modify_number(attrs, code, NULL);
1310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			break;
1311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		default:
1312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			break;
1313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_ATTR_INFO_free(STORE_ATTR_INFO *attrs)
1317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (attrs)
1319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STORE_ATTR_TYPES i;
1321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		for(i = 0; i++ < STORE_ATTR_TYPE_NUM;)
1322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STORE_ATTR_INFO_attr_free(attrs, i);
1323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OPENSSL_free(attrs);
1324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
1326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectchar *STORE_ATTR_INFO_get0_cstr(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code)
1328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!attrs)
1330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_ATTR_INFO_GET0_CSTR,
1332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_R_PASSED_NULL_PARAMETER);
1333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
1334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ATTR_IS_SET(attrs,code))
1336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return attrs->values[code].cstring;
1337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STOREerr(STORE_F_STORE_ATTR_INFO_GET0_CSTR,
1338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STORE_R_NO_VALUE);
1339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return NULL;
1340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectunsigned char *STORE_ATTR_INFO_get0_sha1str(STORE_ATTR_INFO *attrs,
1342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_ATTR_TYPES code)
1343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!attrs)
1345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_ATTR_INFO_GET0_SHA1STR,
1347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_R_PASSED_NULL_PARAMETER);
1348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
1349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ATTR_IS_SET(attrs,code))
1351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return attrs->values[code].sha1string;
1352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STOREerr(STORE_F_STORE_ATTR_INFO_GET0_SHA1STR,
1353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STORE_R_NO_VALUE);
1354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return NULL;
1355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectX509_NAME *STORE_ATTR_INFO_get0_dn(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code)
1357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!attrs)
1359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_ATTR_INFO_GET0_DN,
1361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_R_PASSED_NULL_PARAMETER);
1362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
1363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ATTR_IS_SET(attrs,code))
1365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return attrs->values[code].dn;
1366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STOREerr(STORE_F_STORE_ATTR_INFO_GET0_DN,
1367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STORE_R_NO_VALUE);
1368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return NULL;
1369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBIGNUM *STORE_ATTR_INFO_get0_number(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code)
1371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!attrs)
1373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_ATTR_INFO_GET0_NUMBER,
1375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_R_PASSED_NULL_PARAMETER);
1376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
1377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ATTR_IS_SET(attrs,code))
1379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return attrs->values[code].number;
1380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STOREerr(STORE_F_STORE_ATTR_INFO_GET0_NUMBER,
1381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STORE_R_NO_VALUE);
1382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return NULL;
1383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_ATTR_INFO_set_cstr(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
1385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *cstr, size_t cstr_size)
1386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!attrs)
1388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_ATTR_INFO_SET_CSTR,
1390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_R_PASSED_NULL_PARAMETER);
1391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
1392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!ATTR_IS_SET(attrs,code))
1394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((attrs->values[code].cstring = BUF_strndup(cstr, cstr_size)))
1396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return 1;
1397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_ATTR_INFO_SET_CSTR,
1398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_R_MALLOC_FAILURE);
1399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
1400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STOREerr(STORE_F_STORE_ATTR_INFO_SET_CSTR, STORE_R_ALREADY_HAS_A_VALUE);
1402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
1403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_ATTR_INFO_set_sha1str(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
1405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char *sha1str, size_t sha1str_size)
1406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!attrs)
1408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_ATTR_INFO_SET_SHA1STR,
1410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_R_PASSED_NULL_PARAMETER);
1411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
1412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!ATTR_IS_SET(attrs,code))
1414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((attrs->values[code].sha1string =
1416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			    (unsigned char *)BUF_memdup(sha1str,
1417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				    sha1str_size)))
1418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return 1;
1419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_ATTR_INFO_SET_SHA1STR,
1420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_R_MALLOC_FAILURE);
1421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
1422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STOREerr(STORE_F_STORE_ATTR_INFO_SET_SHA1STR, STORE_R_ALREADY_HAS_A_VALUE);
1424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
1425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_ATTR_INFO_set_dn(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
1427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509_NAME *dn)
1428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!attrs)
1430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_ATTR_INFO_SET_DN,
1432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_R_PASSED_NULL_PARAMETER);
1433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
1434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!ATTR_IS_SET(attrs,code))
1436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((attrs->values[code].dn = X509_NAME_dup(dn)))
1438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return 1;
1439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_ATTR_INFO_SET_DN,
1440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_R_MALLOC_FAILURE);
1441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
1442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STOREerr(STORE_F_STORE_ATTR_INFO_SET_DN, STORE_R_ALREADY_HAS_A_VALUE);
1444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
1445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_ATTR_INFO_set_number(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
1447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIGNUM *number)
1448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!attrs)
1450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_ATTR_INFO_SET_NUMBER,
1452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_R_PASSED_NULL_PARAMETER);
1453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
1454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!ATTR_IS_SET(attrs,code))
1456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((attrs->values[code].number = BN_dup(number)))
1458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return 1;
1459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_ATTR_INFO_SET_NUMBER,
1460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_R_MALLOC_FAILURE);
1461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
1462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STOREerr(STORE_F_STORE_ATTR_INFO_SET_NUMBER, STORE_R_ALREADY_HAS_A_VALUE);
1464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
1465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_ATTR_INFO_modify_cstr(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
1467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *cstr, size_t cstr_size)
1468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!attrs)
1470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_ATTR_INFO_MODIFY_CSTR,
1472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_R_PASSED_NULL_PARAMETER);
1473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
1474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ATTR_IS_SET(attrs,code))
1476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OPENSSL_free(attrs->values[code].cstring);
1478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		attrs->values[code].cstring = NULL;
1479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CLEAR_ATTRBIT(attrs, code);
1480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return STORE_ATTR_INFO_set_cstr(attrs, code, cstr, cstr_size);
1482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_ATTR_INFO_modify_sha1str(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
1484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char *sha1str, size_t sha1str_size)
1485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!attrs)
1487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_ATTR_INFO_MODIFY_SHA1STR,
1489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_R_PASSED_NULL_PARAMETER);
1490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
1491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ATTR_IS_SET(attrs,code))
1493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OPENSSL_free(attrs->values[code].sha1string);
1495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		attrs->values[code].sha1string = NULL;
1496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CLEAR_ATTRBIT(attrs, code);
1497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return STORE_ATTR_INFO_set_sha1str(attrs, code, sha1str, sha1str_size);
1499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_ATTR_INFO_modify_dn(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
1501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	X509_NAME *dn)
1502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!attrs)
1504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_ATTR_INFO_MODIFY_DN,
1506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_R_PASSED_NULL_PARAMETER);
1507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
1508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ATTR_IS_SET(attrs,code))
1510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OPENSSL_free(attrs->values[code].dn);
1512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		attrs->values[code].dn = NULL;
1513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CLEAR_ATTRBIT(attrs, code);
1514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return STORE_ATTR_INFO_set_dn(attrs, code, dn);
1516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_ATTR_INFO_modify_number(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
1518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BIGNUM *number)
1519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!attrs)
1521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_STORE_ATTR_INFO_MODIFY_NUMBER,
1523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ERR_R_PASSED_NULL_PARAMETER);
1524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
1525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ATTR_IS_SET(attrs,code))
1527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OPENSSL_free(attrs->values[code].number);
1529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		attrs->values[code].number = NULL;
1530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		CLEAR_ATTRBIT(attrs, code);
1531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return STORE_ATTR_INFO_set_number(attrs, code, number);
1533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstruct attr_list_ctx_st
1536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM *attributes;
1538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	};
1539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid *STORE_parse_attrs_start(OPENSSL_ITEM *attributes)
1540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (attributes)
1542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		struct attr_list_ctx_st *context =
1544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			(struct attr_list_ctx_st *)OPENSSL_malloc(sizeof(struct attr_list_ctx_st));
1545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (context)
1546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			context->attributes = attributes;
1547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
1548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			STOREerr(STORE_F_STORE_PARSE_ATTRS_START,
1549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				ERR_R_MALLOC_FAILURE);
1550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return context;
1551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STOREerr(STORE_F_STORE_PARSE_ATTRS_START, ERR_R_PASSED_NULL_PARAMETER);
1553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
1554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectSTORE_ATTR_INFO *STORE_parse_attrs_next(void *handle)
1556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct attr_list_ctx_st *context = (struct attr_list_ctx_st *)handle;
1558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (context && context->attributes)
1560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STORE_ATTR_INFO *attrs = NULL;
1562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		while(context->attributes
1564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			&& context->attributes->code != STORE_ATTR_OR
1565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			&& context->attributes->code != STORE_ATTR_END)
1566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			switch(context->attributes->code)
1568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case STORE_ATTR_FRIENDLYNAME:
1570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case STORE_ATTR_EMAIL:
1571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case STORE_ATTR_FILENAME:
1572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (!attrs) attrs = STORE_ATTR_INFO_new();
1573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (attrs == NULL)
1574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
1575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT,
1576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						ERR_R_MALLOC_FAILURE);
1577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto err;
1578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
1579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				STORE_ATTR_INFO_set_cstr(attrs,
1580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					context->attributes->code,
1581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					context->attributes->value,
1582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					context->attributes->value_size);
1583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
1584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case STORE_ATTR_KEYID:
1585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case STORE_ATTR_ISSUERKEYID:
1586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case STORE_ATTR_SUBJECTKEYID:
1587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case STORE_ATTR_ISSUERSERIALHASH:
1588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case STORE_ATTR_CERTHASH:
1589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (!attrs) attrs = STORE_ATTR_INFO_new();
1590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (attrs == NULL)
1591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
1592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT,
1593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						ERR_R_MALLOC_FAILURE);
1594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto err;
1595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
1596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				STORE_ATTR_INFO_set_sha1str(attrs,
1597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					context->attributes->code,
1598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					context->attributes->value,
1599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					context->attributes->value_size);
1600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
1601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case STORE_ATTR_ISSUER:
1602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case STORE_ATTR_SUBJECT:
1603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (!attrs) attrs = STORE_ATTR_INFO_new();
1604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (attrs == NULL)
1605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
1606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT,
1607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						ERR_R_MALLOC_FAILURE);
1608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto err;
1609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
1610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				STORE_ATTR_INFO_modify_dn(attrs,
1611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					context->attributes->code,
1612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					context->attributes->value);
1613656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
1614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case STORE_ATTR_SERIAL:
1615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (!attrs) attrs = STORE_ATTR_INFO_new();
1616656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (attrs == NULL)
1617656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					{
1618656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT,
1619656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						ERR_R_MALLOC_FAILURE);
1620656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					goto err;
1621656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					}
1622656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				STORE_ATTR_INFO_modify_number(attrs,
1623656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					context->attributes->code,
1624656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					context->attributes->value);
1625656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
1626656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1627656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			context->attributes++;
1628656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1629656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (context->attributes->code == STORE_ATTR_OR)
1630656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			context->attributes++;
1631656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return attrs;
1632656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	err:
1633656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		while(context->attributes
1634656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			&& context->attributes->code != STORE_ATTR_OR
1635656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			&& context->attributes->code != STORE_ATTR_END)
1636656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			context->attributes++;
1637656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (context->attributes->code == STORE_ATTR_OR)
1638656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			context->attributes++;
1639656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
1640656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1641656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT, ERR_R_PASSED_NULL_PARAMETER);
1642656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return NULL;
1643656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1644656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_parse_attrs_end(void *handle)
1645656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1646656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct attr_list_ctx_st *context = (struct attr_list_ctx_st *)handle;
1647656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1648656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (context && context->attributes)
1649656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1650656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 0
1651656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OPENSSL_ITEM *attributes = context->attributes;
1652656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
1653656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OPENSSL_free(context);
1654656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 1;
1655656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1656656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STOREerr(STORE_F_STORE_PARSE_ATTRS_END, ERR_R_PASSED_NULL_PARAMETER);
1657656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
1658656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1659656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1660656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_parse_attrs_endp(void *handle)
1661656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1662656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct attr_list_ctx_st *context = (struct attr_list_ctx_st *)handle;
1663656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1664656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (context && context->attributes)
1665656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1666656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return context->attributes->code == STORE_ATTR_END;
1667656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1668656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STOREerr(STORE_F_STORE_PARSE_ATTRS_ENDP, ERR_R_PASSED_NULL_PARAMETER);
1669656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
1670656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1671656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1672656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int attr_info_compare_compute_range(
1673221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	const unsigned char *abits, const unsigned char *bbits,
1674656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned int *alowp, unsigned int *ahighp,
1675656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned int *blowp, unsigned int *bhighp)
1676656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1677656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned int alow = (unsigned int)-1, ahigh = 0;
1678656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned int blow = (unsigned int)-1, bhigh = 0;
1679656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i, res = 0;
1680656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1681656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i = 0; i < (STORE_ATTR_TYPE_NUM + 8) / 8; i++, abits++, bbits++)
1682656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1683656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (res == 0)
1684656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1685656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (*abits < *bbits) res = -1;
1686656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (*abits > *bbits) res = 1;
1687656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1688656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (*abits)
1689656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1690656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (alow == (unsigned int)-1)
1691656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1692656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				alow = i * 8;
1693656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (!(*abits & 0x01)) alow++;
1694656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (!(*abits & 0x02)) alow++;
1695656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (!(*abits & 0x04)) alow++;
1696656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (!(*abits & 0x08)) alow++;
1697656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (!(*abits & 0x10)) alow++;
1698656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (!(*abits & 0x20)) alow++;
1699656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (!(*abits & 0x40)) alow++;
1700656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1701656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ahigh = i * 8 + 7;
1702656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!(*abits & 0x80)) ahigh++;
1703656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!(*abits & 0x40)) ahigh++;
1704656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!(*abits & 0x20)) ahigh++;
1705656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!(*abits & 0x10)) ahigh++;
1706656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!(*abits & 0x08)) ahigh++;
1707656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!(*abits & 0x04)) ahigh++;
1708656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!(*abits & 0x02)) ahigh++;
1709656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1710656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (*bbits)
1711656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1712656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (blow == (unsigned int)-1)
1713656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1714656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				blow = i * 8;
1715656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (!(*bbits & 0x01)) blow++;
1716656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (!(*bbits & 0x02)) blow++;
1717656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (!(*bbits & 0x04)) blow++;
1718656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (!(*bbits & 0x08)) blow++;
1719656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (!(*bbits & 0x10)) blow++;
1720656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (!(*bbits & 0x20)) blow++;
1721656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (!(*bbits & 0x40)) blow++;
1722656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1723656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			bhigh = i * 8 + 7;
1724656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!(*bbits & 0x80)) bhigh++;
1725656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!(*bbits & 0x40)) bhigh++;
1726656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!(*bbits & 0x20)) bhigh++;
1727656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!(*bbits & 0x10)) bhigh++;
1728656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!(*bbits & 0x08)) bhigh++;
1729656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!(*bbits & 0x04)) bhigh++;
1730656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!(*bbits & 0x02)) bhigh++;
1731656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1732656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1733656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ahigh + alow < bhigh + blow) res = -1;
1734656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ahigh + alow > bhigh + blow) res = 1;
1735656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (alowp) *alowp = alow;
1736656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ahighp) *ahighp = ahigh;
1737656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (blowp) *blowp = blow;
1738656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (bhighp) *bhighp = bhigh;
1739656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return res;
1740656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1741656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1742221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint STORE_ATTR_INFO_compare(const STORE_ATTR_INFO * const *a,
1743221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			    const STORE_ATTR_INFO * const *b)
1744656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1745656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (a == b) return 0;
1746656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!a) return -1;
1747656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!b) return 1;
1748221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return attr_info_compare_compute_range((*a)->set, (*b)->set, 0, 0, 0, 0);
1749656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1750221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1751656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_ATTR_INFO_in_range(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b)
1752656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1753656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned int alow, ahigh, blow, bhigh;
1754656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1755656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (a == b) return 1;
1756656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!a) return 0;
1757656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!b) return 0;
1758656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	attr_info_compare_compute_range(a->set, b->set,
1759656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&alow, &ahigh, &blow, &bhigh);
1760656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (alow >= blow && ahigh <= bhigh)
1761656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 1;
1762656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
1763656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1764221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1765656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_ATTR_INFO_in(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b)
1766656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1767656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char *abits, *bbits;
1768656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
1769656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1770656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (a == b) return 1;
1771656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!a) return 0;
1772656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!b) return 0;
1773656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	abits = a->set;
1774656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	bbits = b->set;
1775656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i = 0; i < (STORE_ATTR_TYPE_NUM + 8) / 8; i++, abits++, bbits++)
1776656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
1777656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (*abits && (*bbits & *abits) != *abits)
1778656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return 0;
1779656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
1780656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
1781656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1782221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
1783656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint STORE_ATTR_INFO_in_ex(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b)
1784656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
1785656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_ATTR_TYPES i;
1786656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1787656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (a == b) return 1;
1788656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!STORE_ATTR_INFO_in(a, b)) return 0;
1789656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i = 1; i < STORE_ATTR_TYPE_NUM; i++)
1790656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (ATTR_IS_SET(a, i))
1791656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
1792656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			switch(i)
1793656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
1794656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case STORE_ATTR_FRIENDLYNAME:
1795656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case STORE_ATTR_EMAIL:
1796656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case STORE_ATTR_FILENAME:
1797656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (strcmp(a->values[i].cstring,
1798656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					    b->values[i].cstring))
1799656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					return 0;
1800656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
1801656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case STORE_ATTR_KEYID:
1802656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case STORE_ATTR_ISSUERKEYID:
1803656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case STORE_ATTR_SUBJECTKEYID:
1804656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case STORE_ATTR_ISSUERSERIALHASH:
1805656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case STORE_ATTR_CERTHASH:
1806656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (memcmp(a->values[i].sha1string,
1807656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					    b->values[i].sha1string,
1808656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					    a->value_sizes[i]))
1809656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					return 0;
1810656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
1811656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case STORE_ATTR_ISSUER:
1812656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case STORE_ATTR_SUBJECT:
1813656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (X509_NAME_cmp(a->values[i].dn,
1814656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					    b->values[i].dn))
1815656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					return 0;
1816656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
1817656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			case STORE_ATTR_SERIAL:
1818656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				if (BN_cmp(a->values[i].number,
1819656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					    b->values[i].number))
1820656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					return 0;
1821656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
1822656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			default:
1823656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
1824656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
1825656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
1826656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
1827656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
1828656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
1829