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