1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* crypto/store/str_mem.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/err.h>
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "str_locl.h"
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* The memory store is currently highly experimental.  It's meant to become
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   a base store used by other stores for internal caching (for full caching
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   support, aging needs to be added).
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   The database use is meant to support as much attribute association as
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   possible, while providing for as small search ranges as possible.
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   This is currently provided for by sorting the entries by numbers that
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   are composed of bits set at the positions indicated by attribute type
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   codes.  This provides for ranges determined by the highest attribute
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   type code value.  A better idea might be to sort by values computed
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   from the range of attributes associated with the object (basically,
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   the difference between the highest and lowest attribute type code)
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   and it's distance from a base (basically, the lowest associated
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   attribute type code).
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project*/
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
79221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromtypedef struct mem_object_data_st
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT *object;
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_ATTR_INFO *attr_info;
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int references;
84221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	} MEM_OBJECT_DATA;
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
86221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromDECLARE_STACK_OF(MEM_OBJECT_DATA)
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstruct mem_data_st
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
89221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	STACK_OF(MEM_OBJECT_DATA) *data; /* sorted with
90221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom					  * STORE_ATTR_INFO_compare(). */
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned int compute_components : 1; /* Currently unused, but can
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						be used to add attributes
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						from parts of the data. */
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	};
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
96221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromDECLARE_STACK_OF(STORE_ATTR_INFO)
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstruct mem_ctx_st
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int type;		/* The type we're searching for */
100221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	STACK_OF(STORE_ATTR_INFO) *search_attributes; /* Sets of
101221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				     attributes to search for.  Each
102221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				     element is a STORE_ATTR_INFO. */
103221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	int search_index;	/* which of the search attributes we
104221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				   found a match for, -1 when we still
105221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				   haven't found any */
106221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	int index;		/* -1 as long as we're searching for
107221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                                    the first */
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	};
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int mem_init(STORE *s);
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void mem_clean(STORE *s);
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic STORE_OBJECT *mem_generate(STORE *s, STORE_OBJECT_TYPES type,
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM attributes[], OPENSSL_ITEM parameters[]);
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic STORE_OBJECT *mem_get(STORE *s, STORE_OBJECT_TYPES type,
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM attributes[], OPENSSL_ITEM parameters[]);
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int mem_store(STORE *s, STORE_OBJECT_TYPES type,
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT *data, OPENSSL_ITEM attributes[],
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[]);
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int mem_modify(STORE *s, STORE_OBJECT_TYPES type,
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM search_attributes[], OPENSSL_ITEM add_attributes[],
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM modify_attributes[], OPENSSL_ITEM delete_attributes[],
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[]);
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int mem_delete(STORE *s, STORE_OBJECT_TYPES type,
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM attributes[], OPENSSL_ITEM parameters[]);
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void *mem_list_start(STORE *s, STORE_OBJECT_TYPES type,
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM attributes[], OPENSSL_ITEM parameters[]);
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic STORE_OBJECT *mem_list_next(STORE *s, void *handle);
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int mem_list_end(STORE *s, void *handle);
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int mem_list_endp(STORE *s, void *handle);
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int mem_lock(STORE *s, OPENSSL_ITEM attributes[],
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[]);
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int mem_unlock(STORE *s, OPENSSL_ITEM attributes[],
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[]);
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int mem_ctrl(STORE *s, int cmd, long l, void *p, void (*f)(void));
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic STORE_METHOD store_memory =
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	"OpenSSL memory store interface",
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mem_init,
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mem_clean,
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mem_generate,
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mem_get,
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mem_store,
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mem_modify,
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	NULL, /* revoke */
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mem_delete,
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mem_list_start,
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mem_list_next,
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mem_list_end,
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mem_list_endp,
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	NULL, /* update */
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mem_lock,
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mem_unlock,
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mem_ctrl
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	};
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst STORE_METHOD *STORE_Memory(void)
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return &store_memory;
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int mem_init(STORE *s)
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void mem_clean(STORE *s)
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return;
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic STORE_OBJECT *mem_generate(STORE *s, STORE_OBJECT_TYPES type,
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM attributes[], OPENSSL_ITEM parameters[])
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STOREerr(STORE_F_MEM_GENERATE, STORE_R_NOT_IMPLEMENTED);
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic STORE_OBJECT *mem_get(STORE *s, STORE_OBJECT_TYPES type,
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM attributes[], OPENSSL_ITEM parameters[])
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	void *context = mem_list_start(s, type, attributes, parameters);
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (context)
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STORE_OBJECT *object = mem_list_next(s, context);
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (mem_list_end(s, context))
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return object;
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return NULL;
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int mem_store(STORE *s, STORE_OBJECT_TYPES type,
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_OBJECT *data, OPENSSL_ITEM attributes[],
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STOREerr(STORE_F_MEM_STORE, STORE_R_NOT_IMPLEMENTED);
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int mem_modify(STORE *s, STORE_OBJECT_TYPES type,
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM search_attributes[], OPENSSL_ITEM add_attributes[],
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM modify_attributes[], OPENSSL_ITEM delete_attributes[],
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STOREerr(STORE_F_MEM_MODIFY, STORE_R_NOT_IMPLEMENTED);
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int mem_delete(STORE *s, STORE_OBJECT_TYPES type,
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM attributes[], OPENSSL_ITEM parameters[])
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STOREerr(STORE_F_MEM_DELETE, STORE_R_NOT_IMPLEMENTED);
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* The list functions may be the hardest to understand.  Basically,
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   mem_list_start compiles a stack of attribute info elements, and
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   puts that stack into the context to be returned.  mem_list_next
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   will then find the first matching element in the store, and then
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   walk all the way to the end of the store (since any combination
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   of attribute bits above the starting point may match the searched
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   for bit pattern...). */
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void *mem_list_start(STORE *s, STORE_OBJECT_TYPES type,
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM attributes[], OPENSSL_ITEM parameters[])
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct mem_ctx_st *context =
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(struct mem_ctx_st *)OPENSSL_malloc(sizeof(struct mem_ctx_st));
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	void *attribute_context = NULL;
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_ATTR_INFO *attrs = NULL;
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!context)
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_MEM_LIST_START, ERR_R_MALLOC_FAILURE);
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memset(context, 0, sizeof(struct mem_ctx_st));
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	attribute_context = STORE_parse_attrs_start(attributes);
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!attribute_context)
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_MEM_LIST_START, ERR_R_STORE_LIB);
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	while((attrs = STORE_parse_attrs_next(attribute_context)))
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (context->search_attributes == NULL)
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			context->search_attributes =
248221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				sk_STORE_ATTR_INFO_new(STORE_ATTR_INFO_compare);
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!context->search_attributes)
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				STOREerr(STORE_F_MEM_LIST_START,
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					ERR_R_MALLOC_FAILURE);
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				goto err;
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
256221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		sk_STORE_ATTR_INFO_push(context->search_attributes,attrs);
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!STORE_parse_attrs_endp(attribute_context))
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		goto err;
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STORE_parse_attrs_end(attribute_context);
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	context->search_index = -1;
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	context->index = -1;
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return context;
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project err:
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (attribute_context) STORE_parse_attrs_end(attribute_context);
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mem_list_end(s, context);
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return NULL;
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic STORE_OBJECT *mem_list_next(STORE *s, void *handle)
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct mem_ctx_st *context = (struct mem_ctx_st *)handle;
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct mem_object_data_st key = { 0, 0, 1 };
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct mem_data_st *store =
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(struct mem_data_st *)STORE_get_ex_data(s, 1);
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int srch;
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int cres = 0;
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!context)
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_MEM_LIST_NEXT, ERR_R_PASSED_NULL_PARAMETER);
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!store)
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_MEM_LIST_NEXT, STORE_R_NO_STORE);
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (context->search_index == -1)
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
292221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		for (i = 0;
293221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		     i < sk_STORE_ATTR_INFO_num(context->search_attributes);
294221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		     i++)
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
296221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			key.attr_info
297221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			  = sk_STORE_ATTR_INFO_value(context->search_attributes,
298221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom						     i);
299221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			srch = sk_MEM_OBJECT_DATA_find_ex(store->data, &key);
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (srch >= 0)
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				context->search_index = srch;
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				break;
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (context->search_index < 0)
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return NULL;
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	key.attr_info =
312221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		sk_STORE_ATTR_INFO_value(context->search_attributes,
313221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom					 context->search_index);
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for(srch = context->search_index;
315221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	    srch < sk_MEM_OBJECT_DATA_num(store->data)
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		    && STORE_ATTR_INFO_in_range(key.attr_info,
317221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			    sk_MEM_OBJECT_DATA_value(store->data, srch)->attr_info)
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		    && !(cres = STORE_ATTR_INFO_in_ex(key.attr_info,
319221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				 sk_MEM_OBJECT_DATA_value(store->data, srch)->attr_info));
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    srch++)
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		;
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	context->search_index = srch;
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (cres)
325221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return (sk_MEM_OBJECT_DATA_value(store->data, srch))->object;
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return NULL;
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int mem_list_end(STORE *s, void *handle)
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct mem_ctx_st *context = (struct mem_ctx_st *)handle;
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!context)
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		STOREerr(STORE_F_MEM_LIST_END, ERR_R_PASSED_NULL_PARAMETER);
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (context && context->search_attributes)
338221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		sk_STORE_ATTR_INFO_free(context->search_attributes);
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (context) OPENSSL_free(context);
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int mem_list_endp(STORE *s, void *handle)
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	struct mem_ctx_st *context = (struct mem_ctx_st *)handle;
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!context
347221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	    || context->search_index
348221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	       == sk_STORE_ATTR_INFO_num(context->search_attributes))
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 1;
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int mem_lock(STORE *s, OPENSSL_ITEM attributes[],
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int mem_unlock(STORE *s, OPENSSL_ITEM attributes[],
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_ITEM parameters[])
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int mem_ctrl(STORE *s, int cmd, long l, void *p, void (*f)(void))
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
366