1295016Sjkim/* crypto/store/str_lib.c */
2280304Sjkim/*
3280304Sjkim * Written by Richard Levitte (richard@levitte.org) for the OpenSSL project
4280304Sjkim * 2003.
5160814Ssimon */
6160814Ssimon/* ====================================================================
7160814Ssimon * Copyright (c) 2003 The OpenSSL Project.  All rights reserved.
8160814Ssimon *
9160814Ssimon * Redistribution and use in source and binary forms, with or without
10160814Ssimon * modification, are permitted provided that the following conditions
11160814Ssimon * are met:
12160814Ssimon *
13160814Ssimon * 1. Redistributions of source code must retain the above copyright
14280304Sjkim *    notice, this list of conditions and the following disclaimer.
15160814Ssimon *
16160814Ssimon * 2. Redistributions in binary form must reproduce the above copyright
17160814Ssimon *    notice, this list of conditions and the following disclaimer in
18160814Ssimon *    the documentation and/or other materials provided with the
19160814Ssimon *    distribution.
20160814Ssimon *
21160814Ssimon * 3. All advertising materials mentioning features or use of this
22160814Ssimon *    software must display the following acknowledgment:
23160814Ssimon *    "This product includes software developed by the OpenSSL Project
24160814Ssimon *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
25160814Ssimon *
26160814Ssimon * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
27160814Ssimon *    endorse or promote products derived from this software without
28160814Ssimon *    prior written permission. For written permission, please contact
29160814Ssimon *    openssl-core@openssl.org.
30160814Ssimon *
31160814Ssimon * 5. Products derived from this software may not be called "OpenSSL"
32160814Ssimon *    nor may "OpenSSL" appear in their names without prior written
33160814Ssimon *    permission of the OpenSSL Project.
34160814Ssimon *
35160814Ssimon * 6. Redistributions of any form whatsoever must retain the following
36160814Ssimon *    acknowledgment:
37160814Ssimon *    "This product includes software developed by the OpenSSL Project
38160814Ssimon *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
39160814Ssimon *
40160814Ssimon * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
41160814Ssimon * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42160814Ssimon * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
43160814Ssimon * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
44160814Ssimon * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
45160814Ssimon * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
46160814Ssimon * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
47160814Ssimon * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48160814Ssimon * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
49160814Ssimon * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
50160814Ssimon * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
51160814Ssimon * OF THE POSSIBILITY OF SUCH DAMAGE.
52160814Ssimon * ====================================================================
53160814Ssimon *
54160814Ssimon * This product includes cryptographic software written by Eric Young
55160814Ssimon * (eay@cryptsoft.com).  This product includes software written by Tim
56160814Ssimon * Hudson (tjh@cryptsoft.com).
57160814Ssimon *
58160814Ssimon */
59160814Ssimon
60160814Ssimon#include <string.h>
61160814Ssimon#include <openssl/bn.h>
62160814Ssimon#include <openssl/err.h>
63160814Ssimon#ifndef OPENSSL_NO_ENGINE
64280304Sjkim# include <openssl/engine.h>
65160814Ssimon#endif
66160814Ssimon#include <openssl/sha.h>
67160814Ssimon#include <openssl/x509.h>
68160814Ssimon#include "str_locl.h"
69160814Ssimon
70280304Sjkimconst char *const STORE_object_type_string[STORE_OBJECT_TYPE_NUM + 1] = {
71280304Sjkim    0,
72280304Sjkim    "X.509 Certificate",
73280304Sjkim    "X.509 CRL",
74280304Sjkim    "Private Key",
75280304Sjkim    "Public Key",
76280304Sjkim    "Number",
77280304Sjkim    "Arbitrary Data"
78280304Sjkim};
79160814Ssimon
80280304Sjkimconst int STORE_param_sizes[STORE_PARAM_TYPE_NUM + 1] = {
81280304Sjkim    0,
82280304Sjkim    sizeof(int),                /* EVP_TYPE */
83280304Sjkim    sizeof(size_t),             /* BITS */
84280304Sjkim    -1,                         /* KEY_PARAMETERS */
85280304Sjkim    0                           /* KEY_NO_PARAMETERS */
86280304Sjkim};
87160814Ssimon
88280304Sjkimconst int STORE_attr_sizes[STORE_ATTR_TYPE_NUM + 1] = {
89280304Sjkim    0,
90280304Sjkim    -1,                         /* FRIENDLYNAME: C string */
91280304Sjkim    SHA_DIGEST_LENGTH,          /* KEYID: SHA1 digest, 160 bits */
92280304Sjkim    SHA_DIGEST_LENGTH,          /* ISSUERKEYID: SHA1 digest, 160 bits */
93280304Sjkim    SHA_DIGEST_LENGTH,          /* SUBJECTKEYID: SHA1 digest, 160 bits */
94280304Sjkim    SHA_DIGEST_LENGTH,          /* ISSUERSERIALHASH: SHA1 digest, 160 bits */
95280304Sjkim    sizeof(X509_NAME *),        /* ISSUER: X509_NAME * */
96280304Sjkim    sizeof(BIGNUM *),           /* SERIAL: BIGNUM * */
97280304Sjkim    sizeof(X509_NAME *),        /* SUBJECT: X509_NAME * */
98280304Sjkim    SHA_DIGEST_LENGTH,          /* CERTHASH: SHA1 digest, 160 bits */
99280304Sjkim    -1,                         /* EMAIL: C string */
100280304Sjkim    -1,                         /* FILENAME: C string */
101280304Sjkim};
102160814Ssimon
103160814SsimonSTORE *STORE_new_method(const STORE_METHOD *method)
104280304Sjkim{
105280304Sjkim    STORE *ret;
106160814Ssimon
107280304Sjkim    if (method == NULL) {
108280304Sjkim        STOREerr(STORE_F_STORE_NEW_METHOD, ERR_R_PASSED_NULL_PARAMETER);
109280304Sjkim        return NULL;
110280304Sjkim    }
111160814Ssimon
112280304Sjkim    ret = (STORE *)OPENSSL_malloc(sizeof(STORE));
113280304Sjkim    if (ret == NULL) {
114280304Sjkim        STOREerr(STORE_F_STORE_NEW_METHOD, ERR_R_MALLOC_FAILURE);
115280304Sjkim        return NULL;
116280304Sjkim    }
117160814Ssimon
118280304Sjkim    ret->meth = method;
119160814Ssimon
120280304Sjkim    CRYPTO_new_ex_data(CRYPTO_EX_INDEX_STORE, ret, &ret->ex_data);
121280304Sjkim    if (ret->meth->init && !ret->meth->init(ret)) {
122280304Sjkim        STORE_free(ret);
123280304Sjkim        ret = NULL;
124280304Sjkim    }
125280304Sjkim    return ret;
126280304Sjkim}
127160814Ssimon
128160814SsimonSTORE *STORE_new_engine(ENGINE *engine)
129280304Sjkim{
130280304Sjkim    STORE *ret = NULL;
131280304Sjkim    ENGINE *e = engine;
132280304Sjkim    const STORE_METHOD *meth = 0;
133160814Ssimon
134160814Ssimon#ifdef OPENSSL_NO_ENGINE
135280304Sjkim    e = NULL;
136160814Ssimon#else
137280304Sjkim    if (engine) {
138280304Sjkim        if (!ENGINE_init(engine)) {
139280304Sjkim            STOREerr(STORE_F_STORE_NEW_ENGINE, ERR_R_ENGINE_LIB);
140280304Sjkim            return NULL;
141280304Sjkim        }
142280304Sjkim        e = engine;
143280304Sjkim    } else {
144280304Sjkim        STOREerr(STORE_F_STORE_NEW_ENGINE, ERR_R_PASSED_NULL_PARAMETER);
145280304Sjkim        return NULL;
146280304Sjkim    }
147280304Sjkim    if (e) {
148280304Sjkim        meth = ENGINE_get_STORE(e);
149280304Sjkim        if (!meth) {
150280304Sjkim            STOREerr(STORE_F_STORE_NEW_ENGINE, ERR_R_ENGINE_LIB);
151280304Sjkim            ENGINE_finish(e);
152280304Sjkim            return NULL;
153280304Sjkim        }
154280304Sjkim    }
155160814Ssimon#endif
156160814Ssimon
157280304Sjkim    ret = STORE_new_method(meth);
158280304Sjkim    if (ret == NULL) {
159280304Sjkim        STOREerr(STORE_F_STORE_NEW_ENGINE, ERR_R_STORE_LIB);
160280304Sjkim        return NULL;
161280304Sjkim    }
162160814Ssimon
163280304Sjkim    ret->engine = e;
164160814Ssimon
165280304Sjkim    return (ret);
166280304Sjkim}
167160814Ssimon
168160814Ssimonvoid STORE_free(STORE *store)
169280304Sjkim{
170280304Sjkim    if (store == NULL)
171280304Sjkim        return;
172280304Sjkim    if (store->meth->clean)
173280304Sjkim        store->meth->clean(store);
174280304Sjkim    CRYPTO_free_ex_data(CRYPTO_EX_INDEX_STORE, store, &store->ex_data);
175280304Sjkim    OPENSSL_free(store);
176280304Sjkim}
177160814Ssimon
178280304Sjkimint STORE_ctrl(STORE *store, int cmd, long i, void *p, void (*f) (void))
179280304Sjkim{
180280304Sjkim    if (store == NULL) {
181280304Sjkim        STOREerr(STORE_F_STORE_CTRL, ERR_R_PASSED_NULL_PARAMETER);
182280304Sjkim        return 0;
183280304Sjkim    }
184280304Sjkim    if (store->meth->ctrl)
185280304Sjkim        return store->meth->ctrl(store, cmd, i, p, f);
186280304Sjkim    STOREerr(STORE_F_STORE_CTRL, STORE_R_NO_CONTROL_FUNCTION);
187280304Sjkim    return 0;
188280304Sjkim}
189160814Ssimon
190160814Ssimonint STORE_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
191280304Sjkim                           CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func)
192280304Sjkim{
193280304Sjkim    return CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_STORE, argl, argp,
194280304Sjkim                                   new_func, dup_func, free_func);
195280304Sjkim}
196160814Ssimon
197160814Ssimonint STORE_set_ex_data(STORE *r, int idx, void *arg)
198280304Sjkim{
199280304Sjkim    return (CRYPTO_set_ex_data(&r->ex_data, idx, arg));
200280304Sjkim}
201160814Ssimon
202160814Ssimonvoid *STORE_get_ex_data(STORE *r, int idx)
203280304Sjkim{
204280304Sjkim    return (CRYPTO_get_ex_data(&r->ex_data, idx));
205280304Sjkim}
206160814Ssimon
207160814Ssimonconst STORE_METHOD *STORE_get_method(STORE *store)
208280304Sjkim{
209280304Sjkim    return store->meth;
210280304Sjkim}
211160814Ssimon
212160814Ssimonconst STORE_METHOD *STORE_set_method(STORE *store, const STORE_METHOD *meth)
213280304Sjkim{
214280304Sjkim    store->meth = meth;
215280304Sjkim    return store->meth;
216280304Sjkim}
217160814Ssimon
218160814Ssimon/* API helpers */
219160814Ssimon
220160814Ssimon#define check_store(s,fncode,fnname,fnerrcode) \
221280304Sjkim        do \
222280304Sjkim                { \
223280304Sjkim                if ((s) == NULL || (s)->meth == NULL) \
224280304Sjkim                        { \
225280304Sjkim                        STOREerr((fncode), ERR_R_PASSED_NULL_PARAMETER); \
226280304Sjkim                        return 0; \
227280304Sjkim                        } \
228280304Sjkim                if ((s)->meth->fnname == NULL) \
229280304Sjkim                        { \
230280304Sjkim                        STOREerr((fncode), (fnerrcode)); \
231280304Sjkim                        return 0; \
232280304Sjkim                        } \
233280304Sjkim                } \
234280304Sjkim        while(0)
235160814Ssimon
236160814Ssimon/* API functions */
237160814Ssimon
238160814SsimonX509 *STORE_get_certificate(STORE *s, OPENSSL_ITEM attributes[],
239280304Sjkim                            OPENSSL_ITEM parameters[])
240280304Sjkim{
241280304Sjkim    STORE_OBJECT *object;
242280304Sjkim    X509 *x;
243160814Ssimon
244280304Sjkim    check_store(s, STORE_F_STORE_GET_CERTIFICATE,
245280304Sjkim                get_object, STORE_R_NO_GET_OBJECT_FUNCTION);
246160814Ssimon
247280304Sjkim    object = s->meth->get_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE,
248280304Sjkim                                 attributes, parameters);
249280304Sjkim    if (!object || !object->data.x509.certificate) {
250280304Sjkim        STOREerr(STORE_F_STORE_GET_CERTIFICATE,
251280304Sjkim                 STORE_R_FAILED_GETTING_CERTIFICATE);
252280304Sjkim        return 0;
253280304Sjkim    }
254280304Sjkim    CRYPTO_add(&object->data.x509.certificate->references, 1,
255280304Sjkim               CRYPTO_LOCK_X509);
256160814Ssimon#ifdef REF_PRINT
257280304Sjkim    REF_PRINT("X509", data);
258160814Ssimon#endif
259280304Sjkim    x = object->data.x509.certificate;
260280304Sjkim    STORE_OBJECT_free(object);
261280304Sjkim    return x;
262280304Sjkim}
263160814Ssimon
264160814Ssimonint STORE_store_certificate(STORE *s, X509 *data, OPENSSL_ITEM attributes[],
265280304Sjkim                            OPENSSL_ITEM parameters[])
266280304Sjkim{
267280304Sjkim    STORE_OBJECT *object;
268280304Sjkim    int i;
269160814Ssimon
270280304Sjkim    check_store(s, STORE_F_STORE_CERTIFICATE,
271280304Sjkim                store_object, STORE_R_NO_STORE_OBJECT_FUNCTION);
272160814Ssimon
273280304Sjkim    object = STORE_OBJECT_new();
274280304Sjkim    if (!object) {
275280304Sjkim        STOREerr(STORE_F_STORE_STORE_CERTIFICATE, ERR_R_MALLOC_FAILURE);
276280304Sjkim        return 0;
277280304Sjkim    }
278280304Sjkim
279280304Sjkim    CRYPTO_add(&data->references, 1, CRYPTO_LOCK_X509);
280160814Ssimon#ifdef REF_PRINT
281280304Sjkim    REF_PRINT("X509", data);
282160814Ssimon#endif
283280304Sjkim    object->data.x509.certificate = data;
284160814Ssimon
285280304Sjkim    i = s->meth->store_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE,
286280304Sjkim                              object, attributes, parameters);
287160814Ssimon
288280304Sjkim    STORE_OBJECT_free(object);
289160814Ssimon
290280304Sjkim    if (!i) {
291280304Sjkim        STOREerr(STORE_F_STORE_STORE_CERTIFICATE,
292280304Sjkim                 STORE_R_FAILED_STORING_CERTIFICATE);
293280304Sjkim        return 0;
294280304Sjkim    }
295280304Sjkim    return 1;
296280304Sjkim}
297160814Ssimon
298160814Ssimonint STORE_modify_certificate(STORE *s, OPENSSL_ITEM search_attributes[],
299280304Sjkim                             OPENSSL_ITEM add_attributes[],
300280304Sjkim                             OPENSSL_ITEM modify_attributes[],
301280304Sjkim                             OPENSSL_ITEM delete_attributes[],
302280304Sjkim                             OPENSSL_ITEM parameters[])
303280304Sjkim{
304280304Sjkim    check_store(s, STORE_F_STORE_MODIFY_CERTIFICATE,
305280304Sjkim                modify_object, STORE_R_NO_MODIFY_OBJECT_FUNCTION);
306160814Ssimon
307280304Sjkim    if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE,
308280304Sjkim                                search_attributes, add_attributes,
309280304Sjkim                                modify_attributes, delete_attributes,
310280304Sjkim                                parameters)) {
311280304Sjkim        STOREerr(STORE_F_STORE_MODIFY_CERTIFICATE,
312280304Sjkim                 STORE_R_FAILED_MODIFYING_CERTIFICATE);
313280304Sjkim        return 0;
314280304Sjkim    }
315280304Sjkim    return 1;
316280304Sjkim}
317160814Ssimon
318160814Ssimonint STORE_revoke_certificate(STORE *s, OPENSSL_ITEM attributes[],
319280304Sjkim                             OPENSSL_ITEM parameters[])
320280304Sjkim{
321280304Sjkim    check_store(s, STORE_F_STORE_REVOKE_CERTIFICATE,
322280304Sjkim                revoke_object, STORE_R_NO_REVOKE_OBJECT_FUNCTION);
323160814Ssimon
324280304Sjkim    if (!s->meth->revoke_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE,
325280304Sjkim                                attributes, parameters)) {
326280304Sjkim        STOREerr(STORE_F_STORE_REVOKE_CERTIFICATE,
327280304Sjkim                 STORE_R_FAILED_REVOKING_CERTIFICATE);
328280304Sjkim        return 0;
329280304Sjkim    }
330280304Sjkim    return 1;
331280304Sjkim}
332160814Ssimon
333160814Ssimonint STORE_delete_certificate(STORE *s, OPENSSL_ITEM attributes[],
334280304Sjkim                             OPENSSL_ITEM parameters[])
335280304Sjkim{
336280304Sjkim    check_store(s, STORE_F_STORE_DELETE_CERTIFICATE,
337280304Sjkim                delete_object, STORE_R_NO_DELETE_OBJECT_FUNCTION);
338160814Ssimon
339280304Sjkim    if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE,
340280304Sjkim                                attributes, parameters)) {
341280304Sjkim        STOREerr(STORE_F_STORE_DELETE_CERTIFICATE,
342280304Sjkim                 STORE_R_FAILED_DELETING_CERTIFICATE);
343280304Sjkim        return 0;
344280304Sjkim    }
345280304Sjkim    return 1;
346280304Sjkim}
347160814Ssimon
348160814Ssimonvoid *STORE_list_certificate_start(STORE *s, OPENSSL_ITEM attributes[],
349280304Sjkim                                   OPENSSL_ITEM parameters[])
350280304Sjkim{
351280304Sjkim    void *handle;
352160814Ssimon
353280304Sjkim    check_store(s, STORE_F_STORE_LIST_CERTIFICATE_START,
354280304Sjkim                list_object_start, STORE_R_NO_LIST_OBJECT_START_FUNCTION);
355160814Ssimon
356280304Sjkim    handle = s->meth->list_object_start(s,
357280304Sjkim                                        STORE_OBJECT_TYPE_X509_CERTIFICATE,
358280304Sjkim                                        attributes, parameters);
359280304Sjkim    if (!handle) {
360280304Sjkim        STOREerr(STORE_F_STORE_LIST_CERTIFICATE_START,
361280304Sjkim                 STORE_R_FAILED_LISTING_CERTIFICATES);
362280304Sjkim        return 0;
363280304Sjkim    }
364280304Sjkim    return handle;
365280304Sjkim}
366160814Ssimon
367160814SsimonX509 *STORE_list_certificate_next(STORE *s, void *handle)
368280304Sjkim{
369280304Sjkim    STORE_OBJECT *object;
370280304Sjkim    X509 *x;
371160814Ssimon
372280304Sjkim    check_store(s, STORE_F_STORE_LIST_CERTIFICATE_NEXT,
373280304Sjkim                list_object_next, STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION);
374160814Ssimon
375280304Sjkim    object = s->meth->list_object_next(s, handle);
376280304Sjkim    if (!object || !object->data.x509.certificate) {
377280304Sjkim        STOREerr(STORE_F_STORE_LIST_CERTIFICATE_NEXT,
378280304Sjkim                 STORE_R_FAILED_LISTING_CERTIFICATES);
379280304Sjkim        return 0;
380280304Sjkim    }
381280304Sjkim    CRYPTO_add(&object->data.x509.certificate->references, 1,
382280304Sjkim               CRYPTO_LOCK_X509);
383160814Ssimon#ifdef REF_PRINT
384280304Sjkim    REF_PRINT("X509", data);
385160814Ssimon#endif
386280304Sjkim    x = object->data.x509.certificate;
387280304Sjkim    STORE_OBJECT_free(object);
388280304Sjkim    return x;
389280304Sjkim}
390160814Ssimon
391160814Ssimonint STORE_list_certificate_end(STORE *s, void *handle)
392280304Sjkim{
393280304Sjkim    check_store(s, STORE_F_STORE_LIST_CERTIFICATE_END,
394280304Sjkim                list_object_end, STORE_R_NO_LIST_OBJECT_END_FUNCTION);
395160814Ssimon
396280304Sjkim    if (!s->meth->list_object_end(s, handle)) {
397280304Sjkim        STOREerr(STORE_F_STORE_LIST_CERTIFICATE_END,
398280304Sjkim                 STORE_R_FAILED_LISTING_CERTIFICATES);
399280304Sjkim        return 0;
400280304Sjkim    }
401280304Sjkim    return 1;
402280304Sjkim}
403160814Ssimon
404160814Ssimonint STORE_list_certificate_endp(STORE *s, void *handle)
405280304Sjkim{
406280304Sjkim    check_store(s, STORE_F_STORE_LIST_CERTIFICATE_ENDP,
407280304Sjkim                list_object_endp, STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION);
408160814Ssimon
409280304Sjkim    if (!s->meth->list_object_endp(s, handle)) {
410280304Sjkim        STOREerr(STORE_F_STORE_LIST_CERTIFICATE_ENDP,
411280304Sjkim                 STORE_R_FAILED_LISTING_CERTIFICATES);
412280304Sjkim        return 0;
413280304Sjkim    }
414280304Sjkim    return 1;
415280304Sjkim}
416160814Ssimon
417160814SsimonEVP_PKEY *STORE_generate_key(STORE *s, OPENSSL_ITEM attributes[],
418280304Sjkim                             OPENSSL_ITEM parameters[])
419280304Sjkim{
420280304Sjkim    STORE_OBJECT *object;
421280304Sjkim    EVP_PKEY *pkey;
422160814Ssimon
423280304Sjkim    check_store(s, STORE_F_STORE_GENERATE_KEY,
424280304Sjkim                generate_object, STORE_R_NO_GENERATE_OBJECT_FUNCTION);
425160814Ssimon
426280304Sjkim    object = s->meth->generate_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY,
427280304Sjkim                                      attributes, parameters);
428280304Sjkim    if (!object || !object->data.key) {
429280304Sjkim        STOREerr(STORE_F_STORE_GENERATE_KEY, STORE_R_FAILED_GENERATING_KEY);
430280304Sjkim        return 0;
431280304Sjkim    }
432280304Sjkim    CRYPTO_add(&object->data.key->references, 1, CRYPTO_LOCK_EVP_PKEY);
433160814Ssimon#ifdef REF_PRINT
434280304Sjkim    REF_PRINT("EVP_PKEY", data);
435160814Ssimon#endif
436280304Sjkim    pkey = object->data.key;
437280304Sjkim    STORE_OBJECT_free(object);
438280304Sjkim    return pkey;
439280304Sjkim}
440160814Ssimon
441160814SsimonEVP_PKEY *STORE_get_private_key(STORE *s, OPENSSL_ITEM attributes[],
442280304Sjkim                                OPENSSL_ITEM parameters[])
443280304Sjkim{
444280304Sjkim    STORE_OBJECT *object;
445280304Sjkim    EVP_PKEY *pkey;
446160814Ssimon
447280304Sjkim    check_store(s, STORE_F_STORE_GET_PRIVATE_KEY,
448280304Sjkim                get_object, STORE_R_NO_GET_OBJECT_FUNCTION);
449160814Ssimon
450280304Sjkim    object = s->meth->get_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY,
451280304Sjkim                                 attributes, parameters);
452280304Sjkim    if (!object || !object->data.key || !object->data.key) {
453280304Sjkim        STOREerr(STORE_F_STORE_GET_PRIVATE_KEY, STORE_R_FAILED_GETTING_KEY);
454280304Sjkim        return 0;
455280304Sjkim    }
456280304Sjkim    CRYPTO_add(&object->data.key->references, 1, CRYPTO_LOCK_EVP_PKEY);
457160814Ssimon#ifdef REF_PRINT
458280304Sjkim    REF_PRINT("EVP_PKEY", data);
459160814Ssimon#endif
460280304Sjkim    pkey = object->data.key;
461280304Sjkim    STORE_OBJECT_free(object);
462280304Sjkim    return pkey;
463280304Sjkim}
464160814Ssimon
465280304Sjkimint STORE_store_private_key(STORE *s, EVP_PKEY *data,
466280304Sjkim                            OPENSSL_ITEM attributes[],
467280304Sjkim                            OPENSSL_ITEM parameters[])
468280304Sjkim{
469280304Sjkim    STORE_OBJECT *object;
470280304Sjkim    int i;
471160814Ssimon
472280304Sjkim    check_store(s, STORE_F_STORE_STORE_PRIVATE_KEY,
473280304Sjkim                store_object, STORE_R_NO_STORE_OBJECT_FUNCTION);
474160814Ssimon
475280304Sjkim    object = STORE_OBJECT_new();
476280304Sjkim    if (!object) {
477280304Sjkim        STOREerr(STORE_F_STORE_STORE_PRIVATE_KEY, ERR_R_MALLOC_FAILURE);
478280304Sjkim        return 0;
479280304Sjkim    }
480280304Sjkim    object->data.key = EVP_PKEY_new();
481280304Sjkim    if (!object->data.key) {
482280304Sjkim        STOREerr(STORE_F_STORE_STORE_PRIVATE_KEY, ERR_R_MALLOC_FAILURE);
483280304Sjkim        return 0;
484280304Sjkim    }
485280304Sjkim
486280304Sjkim    CRYPTO_add(&data->references, 1, CRYPTO_LOCK_EVP_PKEY);
487160814Ssimon#ifdef REF_PRINT
488280304Sjkim    REF_PRINT("EVP_PKEY", data);
489160814Ssimon#endif
490280304Sjkim    object->data.key = data;
491160814Ssimon
492280304Sjkim    i = s->meth->store_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY, object,
493280304Sjkim                              attributes, parameters);
494160814Ssimon
495280304Sjkim    STORE_OBJECT_free(object);
496160814Ssimon
497280304Sjkim    if (!i) {
498280304Sjkim        STOREerr(STORE_F_STORE_STORE_PRIVATE_KEY, STORE_R_FAILED_STORING_KEY);
499280304Sjkim        return 0;
500280304Sjkim    }
501280304Sjkim    return i;
502280304Sjkim}
503160814Ssimon
504160814Ssimonint STORE_modify_private_key(STORE *s, OPENSSL_ITEM search_attributes[],
505280304Sjkim                             OPENSSL_ITEM add_attributes[],
506280304Sjkim                             OPENSSL_ITEM modify_attributes[],
507280304Sjkim                             OPENSSL_ITEM delete_attributes[],
508280304Sjkim                             OPENSSL_ITEM parameters[])
509280304Sjkim{
510280304Sjkim    check_store(s, STORE_F_STORE_MODIFY_PRIVATE_KEY,
511280304Sjkim                modify_object, STORE_R_NO_MODIFY_OBJECT_FUNCTION);
512160814Ssimon
513280304Sjkim    if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY,
514280304Sjkim                                search_attributes, add_attributes,
515280304Sjkim                                modify_attributes, delete_attributes,
516280304Sjkim                                parameters)) {
517280304Sjkim        STOREerr(STORE_F_STORE_MODIFY_PRIVATE_KEY,
518280304Sjkim                 STORE_R_FAILED_MODIFYING_PRIVATE_KEY);
519280304Sjkim        return 0;
520280304Sjkim    }
521280304Sjkim    return 1;
522280304Sjkim}
523160814Ssimon
524160814Ssimonint STORE_revoke_private_key(STORE *s, OPENSSL_ITEM attributes[],
525280304Sjkim                             OPENSSL_ITEM parameters[])
526280304Sjkim{
527280304Sjkim    int i;
528160814Ssimon
529280304Sjkim    check_store(s, STORE_F_STORE_REVOKE_PRIVATE_KEY,
530280304Sjkim                revoke_object, STORE_R_NO_REVOKE_OBJECT_FUNCTION);
531160814Ssimon
532280304Sjkim    i = s->meth->revoke_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY,
533280304Sjkim                               attributes, parameters);
534160814Ssimon
535280304Sjkim    if (!i) {
536280304Sjkim        STOREerr(STORE_F_STORE_REVOKE_PRIVATE_KEY,
537280304Sjkim                 STORE_R_FAILED_REVOKING_KEY);
538280304Sjkim        return 0;
539280304Sjkim    }
540280304Sjkim    return i;
541280304Sjkim}
542160814Ssimon
543160814Ssimonint STORE_delete_private_key(STORE *s, OPENSSL_ITEM attributes[],
544280304Sjkim                             OPENSSL_ITEM parameters[])
545280304Sjkim{
546280304Sjkim    check_store(s, STORE_F_STORE_DELETE_PRIVATE_KEY,
547280304Sjkim                delete_object, STORE_R_NO_DELETE_OBJECT_FUNCTION);
548160814Ssimon
549280304Sjkim    if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY,
550280304Sjkim                                attributes, parameters)) {
551280304Sjkim        STOREerr(STORE_F_STORE_DELETE_PRIVATE_KEY,
552280304Sjkim                 STORE_R_FAILED_DELETING_KEY);
553280304Sjkim        return 0;
554280304Sjkim    }
555280304Sjkim    return 1;
556280304Sjkim}
557280304Sjkim
558160814Ssimonvoid *STORE_list_private_key_start(STORE *s, OPENSSL_ITEM attributes[],
559280304Sjkim                                   OPENSSL_ITEM parameters[])
560280304Sjkim{
561280304Sjkim    void *handle;
562160814Ssimon
563280304Sjkim    check_store(s, STORE_F_STORE_LIST_PRIVATE_KEY_START,
564280304Sjkim                list_object_start, STORE_R_NO_LIST_OBJECT_START_FUNCTION);
565160814Ssimon
566280304Sjkim    handle = s->meth->list_object_start(s, STORE_OBJECT_TYPE_PRIVATE_KEY,
567280304Sjkim                                        attributes, parameters);
568280304Sjkim    if (!handle) {
569280304Sjkim        STOREerr(STORE_F_STORE_LIST_PRIVATE_KEY_START,
570280304Sjkim                 STORE_R_FAILED_LISTING_KEYS);
571280304Sjkim        return 0;
572280304Sjkim    }
573280304Sjkim    return handle;
574280304Sjkim}
575160814Ssimon
576160814SsimonEVP_PKEY *STORE_list_private_key_next(STORE *s, void *handle)
577280304Sjkim{
578280304Sjkim    STORE_OBJECT *object;
579280304Sjkim    EVP_PKEY *pkey;
580160814Ssimon
581280304Sjkim    check_store(s, STORE_F_STORE_LIST_PRIVATE_KEY_NEXT,
582280304Sjkim                list_object_next, STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION);
583160814Ssimon
584280304Sjkim    object = s->meth->list_object_next(s, handle);
585280304Sjkim    if (!object || !object->data.key || !object->data.key) {
586280304Sjkim        STOREerr(STORE_F_STORE_LIST_PRIVATE_KEY_NEXT,
587280304Sjkim                 STORE_R_FAILED_LISTING_KEYS);
588280304Sjkim        return 0;
589280304Sjkim    }
590280304Sjkim    CRYPTO_add(&object->data.key->references, 1, CRYPTO_LOCK_EVP_PKEY);
591160814Ssimon#ifdef REF_PRINT
592280304Sjkim    REF_PRINT("EVP_PKEY", data);
593160814Ssimon#endif
594280304Sjkim    pkey = object->data.key;
595280304Sjkim    STORE_OBJECT_free(object);
596280304Sjkim    return pkey;
597280304Sjkim}
598160814Ssimon
599160814Ssimonint STORE_list_private_key_end(STORE *s, void *handle)
600280304Sjkim{
601280304Sjkim    check_store(s, STORE_F_STORE_LIST_PRIVATE_KEY_END,
602280304Sjkim                list_object_end, STORE_R_NO_LIST_OBJECT_END_FUNCTION);
603160814Ssimon
604280304Sjkim    if (!s->meth->list_object_end(s, handle)) {
605280304Sjkim        STOREerr(STORE_F_STORE_LIST_PRIVATE_KEY_END,
606280304Sjkim                 STORE_R_FAILED_LISTING_KEYS);
607280304Sjkim        return 0;
608280304Sjkim    }
609280304Sjkim    return 1;
610280304Sjkim}
611160814Ssimon
612160814Ssimonint STORE_list_private_key_endp(STORE *s, void *handle)
613280304Sjkim{
614280304Sjkim    check_store(s, STORE_F_STORE_LIST_PRIVATE_KEY_ENDP,
615280304Sjkim                list_object_endp, STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION);
616160814Ssimon
617280304Sjkim    if (!s->meth->list_object_endp(s, handle)) {
618280304Sjkim        STOREerr(STORE_F_STORE_LIST_PRIVATE_KEY_ENDP,
619280304Sjkim                 STORE_R_FAILED_LISTING_KEYS);
620280304Sjkim        return 0;
621280304Sjkim    }
622280304Sjkim    return 1;
623280304Sjkim}
624160814Ssimon
625160814SsimonEVP_PKEY *STORE_get_public_key(STORE *s, OPENSSL_ITEM attributes[],
626280304Sjkim                               OPENSSL_ITEM parameters[])
627280304Sjkim{
628280304Sjkim    STORE_OBJECT *object;
629280304Sjkim    EVP_PKEY *pkey;
630160814Ssimon
631280304Sjkim    check_store(s, STORE_F_STORE_GET_PUBLIC_KEY,
632280304Sjkim                get_object, STORE_R_NO_GET_OBJECT_FUNCTION);
633160814Ssimon
634280304Sjkim    object = s->meth->get_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY,
635280304Sjkim                                 attributes, parameters);
636280304Sjkim    if (!object || !object->data.key || !object->data.key) {
637280304Sjkim        STOREerr(STORE_F_STORE_GET_PUBLIC_KEY, STORE_R_FAILED_GETTING_KEY);
638280304Sjkim        return 0;
639280304Sjkim    }
640280304Sjkim    CRYPTO_add(&object->data.key->references, 1, CRYPTO_LOCK_EVP_PKEY);
641160814Ssimon#ifdef REF_PRINT
642280304Sjkim    REF_PRINT("EVP_PKEY", data);
643160814Ssimon#endif
644280304Sjkim    pkey = object->data.key;
645280304Sjkim    STORE_OBJECT_free(object);
646280304Sjkim    return pkey;
647280304Sjkim}
648160814Ssimon
649280304Sjkimint STORE_store_public_key(STORE *s, EVP_PKEY *data,
650280304Sjkim                           OPENSSL_ITEM attributes[],
651280304Sjkim                           OPENSSL_ITEM parameters[])
652280304Sjkim{
653280304Sjkim    STORE_OBJECT *object;
654280304Sjkim    int i;
655160814Ssimon
656280304Sjkim    check_store(s, STORE_F_STORE_STORE_PUBLIC_KEY,
657280304Sjkim                store_object, STORE_R_NO_STORE_OBJECT_FUNCTION);
658160814Ssimon
659280304Sjkim    object = STORE_OBJECT_new();
660280304Sjkim    if (!object) {
661280304Sjkim        STOREerr(STORE_F_STORE_STORE_PUBLIC_KEY, ERR_R_MALLOC_FAILURE);
662280304Sjkim        return 0;
663280304Sjkim    }
664280304Sjkim    object->data.key = EVP_PKEY_new();
665280304Sjkim    if (!object->data.key) {
666280304Sjkim        STOREerr(STORE_F_STORE_STORE_PUBLIC_KEY, ERR_R_MALLOC_FAILURE);
667280304Sjkim        return 0;
668280304Sjkim    }
669280304Sjkim
670280304Sjkim    CRYPTO_add(&data->references, 1, CRYPTO_LOCK_EVP_PKEY);
671160814Ssimon#ifdef REF_PRINT
672280304Sjkim    REF_PRINT("EVP_PKEY", data);
673160814Ssimon#endif
674280304Sjkim    object->data.key = data;
675160814Ssimon
676280304Sjkim    i = s->meth->store_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY, object,
677280304Sjkim                              attributes, parameters);
678160814Ssimon
679280304Sjkim    STORE_OBJECT_free(object);
680160814Ssimon
681280304Sjkim    if (!i) {
682280304Sjkim        STOREerr(STORE_F_STORE_STORE_PUBLIC_KEY, STORE_R_FAILED_STORING_KEY);
683280304Sjkim        return 0;
684280304Sjkim    }
685280304Sjkim    return i;
686280304Sjkim}
687160814Ssimon
688160814Ssimonint STORE_modify_public_key(STORE *s, OPENSSL_ITEM search_attributes[],
689280304Sjkim                            OPENSSL_ITEM add_attributes[],
690280304Sjkim                            OPENSSL_ITEM modify_attributes[],
691280304Sjkim                            OPENSSL_ITEM delete_attributes[],
692280304Sjkim                            OPENSSL_ITEM parameters[])
693280304Sjkim{
694280304Sjkim    check_store(s, STORE_F_STORE_MODIFY_PUBLIC_KEY,
695280304Sjkim                modify_object, STORE_R_NO_MODIFY_OBJECT_FUNCTION);
696160814Ssimon
697280304Sjkim    if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY,
698280304Sjkim                                search_attributes, add_attributes,
699280304Sjkim                                modify_attributes, delete_attributes,
700280304Sjkim                                parameters)) {
701280304Sjkim        STOREerr(STORE_F_STORE_MODIFY_PUBLIC_KEY,
702280304Sjkim                 STORE_R_FAILED_MODIFYING_PUBLIC_KEY);
703280304Sjkim        return 0;
704280304Sjkim    }
705280304Sjkim    return 1;
706280304Sjkim}
707160814Ssimon
708160814Ssimonint STORE_revoke_public_key(STORE *s, OPENSSL_ITEM attributes[],
709280304Sjkim                            OPENSSL_ITEM parameters[])
710280304Sjkim{
711280304Sjkim    int i;
712160814Ssimon
713280304Sjkim    check_store(s, STORE_F_STORE_REVOKE_PUBLIC_KEY,
714280304Sjkim                revoke_object, STORE_R_NO_REVOKE_OBJECT_FUNCTION);
715160814Ssimon
716280304Sjkim    i = s->meth->revoke_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY,
717280304Sjkim                               attributes, parameters);
718160814Ssimon
719280304Sjkim    if (!i) {
720280304Sjkim        STOREerr(STORE_F_STORE_REVOKE_PUBLIC_KEY,
721280304Sjkim                 STORE_R_FAILED_REVOKING_KEY);
722280304Sjkim        return 0;
723280304Sjkim    }
724280304Sjkim    return i;
725280304Sjkim}
726160814Ssimon
727160814Ssimonint STORE_delete_public_key(STORE *s, OPENSSL_ITEM attributes[],
728280304Sjkim                            OPENSSL_ITEM parameters[])
729280304Sjkim{
730280304Sjkim    check_store(s, STORE_F_STORE_DELETE_PUBLIC_KEY,
731280304Sjkim                delete_object, STORE_R_NO_DELETE_OBJECT_FUNCTION);
732160814Ssimon
733280304Sjkim    if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY,
734280304Sjkim                                attributes, parameters)) {
735280304Sjkim        STOREerr(STORE_F_STORE_DELETE_PUBLIC_KEY,
736280304Sjkim                 STORE_R_FAILED_DELETING_KEY);
737280304Sjkim        return 0;
738280304Sjkim    }
739280304Sjkim    return 1;
740280304Sjkim}
741280304Sjkim
742160814Ssimonvoid *STORE_list_public_key_start(STORE *s, OPENSSL_ITEM attributes[],
743280304Sjkim                                  OPENSSL_ITEM parameters[])
744280304Sjkim{
745280304Sjkim    void *handle;
746160814Ssimon
747280304Sjkim    check_store(s, STORE_F_STORE_LIST_PUBLIC_KEY_START,
748280304Sjkim                list_object_start, STORE_R_NO_LIST_OBJECT_START_FUNCTION);
749160814Ssimon
750280304Sjkim    handle = s->meth->list_object_start(s, STORE_OBJECT_TYPE_PUBLIC_KEY,
751280304Sjkim                                        attributes, parameters);
752280304Sjkim    if (!handle) {
753280304Sjkim        STOREerr(STORE_F_STORE_LIST_PUBLIC_KEY_START,
754280304Sjkim                 STORE_R_FAILED_LISTING_KEYS);
755280304Sjkim        return 0;
756280304Sjkim    }
757280304Sjkim    return handle;
758280304Sjkim}
759160814Ssimon
760160814SsimonEVP_PKEY *STORE_list_public_key_next(STORE *s, void *handle)
761280304Sjkim{
762280304Sjkim    STORE_OBJECT *object;
763280304Sjkim    EVP_PKEY *pkey;
764160814Ssimon
765280304Sjkim    check_store(s, STORE_F_STORE_LIST_PUBLIC_KEY_NEXT,
766280304Sjkim                list_object_next, STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION);
767160814Ssimon
768280304Sjkim    object = s->meth->list_object_next(s, handle);
769280304Sjkim    if (!object || !object->data.key || !object->data.key) {
770280304Sjkim        STOREerr(STORE_F_STORE_LIST_PUBLIC_KEY_NEXT,
771280304Sjkim                 STORE_R_FAILED_LISTING_KEYS);
772280304Sjkim        return 0;
773280304Sjkim    }
774280304Sjkim    CRYPTO_add(&object->data.key->references, 1, CRYPTO_LOCK_EVP_PKEY);
775160814Ssimon#ifdef REF_PRINT
776280304Sjkim    REF_PRINT("EVP_PKEY", data);
777160814Ssimon#endif
778280304Sjkim    pkey = object->data.key;
779280304Sjkim    STORE_OBJECT_free(object);
780280304Sjkim    return pkey;
781280304Sjkim}
782160814Ssimon
783160814Ssimonint STORE_list_public_key_end(STORE *s, void *handle)
784280304Sjkim{
785280304Sjkim    check_store(s, STORE_F_STORE_LIST_PUBLIC_KEY_END,
786280304Sjkim                list_object_end, STORE_R_NO_LIST_OBJECT_END_FUNCTION);
787160814Ssimon
788280304Sjkim    if (!s->meth->list_object_end(s, handle)) {
789280304Sjkim        STOREerr(STORE_F_STORE_LIST_PUBLIC_KEY_END,
790280304Sjkim                 STORE_R_FAILED_LISTING_KEYS);
791280304Sjkim        return 0;
792280304Sjkim    }
793280304Sjkim    return 1;
794280304Sjkim}
795160814Ssimon
796160814Ssimonint STORE_list_public_key_endp(STORE *s, void *handle)
797280304Sjkim{
798280304Sjkim    check_store(s, STORE_F_STORE_LIST_PUBLIC_KEY_ENDP,
799280304Sjkim                list_object_endp, STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION);
800160814Ssimon
801280304Sjkim    if (!s->meth->list_object_endp(s, handle)) {
802280304Sjkim        STOREerr(STORE_F_STORE_LIST_PUBLIC_KEY_ENDP,
803280304Sjkim                 STORE_R_FAILED_LISTING_KEYS);
804280304Sjkim        return 0;
805280304Sjkim    }
806280304Sjkim    return 1;
807280304Sjkim}
808160814Ssimon
809160814SsimonX509_CRL *STORE_generate_crl(STORE *s, OPENSSL_ITEM attributes[],
810280304Sjkim                             OPENSSL_ITEM parameters[])
811280304Sjkim{
812280304Sjkim    STORE_OBJECT *object;
813280304Sjkim    X509_CRL *crl;
814160814Ssimon
815280304Sjkim    check_store(s, STORE_F_STORE_GENERATE_CRL,
816280304Sjkim                generate_object, STORE_R_NO_GENERATE_CRL_FUNCTION);
817160814Ssimon
818280304Sjkim    object = s->meth->generate_object(s, STORE_OBJECT_TYPE_X509_CRL,
819280304Sjkim                                      attributes, parameters);
820280304Sjkim    if (!object || !object->data.crl) {
821280304Sjkim        STOREerr(STORE_F_STORE_GENERATE_CRL, STORE_R_FAILED_GENERATING_CRL);
822280304Sjkim        return 0;
823280304Sjkim    }
824280304Sjkim    CRYPTO_add(&object->data.crl->references, 1, CRYPTO_LOCK_X509_CRL);
825160814Ssimon#ifdef REF_PRINT
826280304Sjkim    REF_PRINT("X509_CRL", data);
827160814Ssimon#endif
828280304Sjkim    crl = object->data.crl;
829280304Sjkim    STORE_OBJECT_free(object);
830280304Sjkim    return crl;
831280304Sjkim}
832160814Ssimon
833160814SsimonX509_CRL *STORE_get_crl(STORE *s, OPENSSL_ITEM attributes[],
834280304Sjkim                        OPENSSL_ITEM parameters[])
835280304Sjkim{
836280304Sjkim    STORE_OBJECT *object;
837280304Sjkim    X509_CRL *crl;
838160814Ssimon
839280304Sjkim    check_store(s, STORE_F_STORE_GET_CRL,
840280304Sjkim                get_object, STORE_R_NO_GET_OBJECT_FUNCTION);
841160814Ssimon
842280304Sjkim    object = s->meth->get_object(s, STORE_OBJECT_TYPE_X509_CRL,
843280304Sjkim                                 attributes, parameters);
844280304Sjkim    if (!object || !object->data.crl) {
845280304Sjkim        STOREerr(STORE_F_STORE_GET_CRL, STORE_R_FAILED_GETTING_KEY);
846280304Sjkim        return 0;
847280304Sjkim    }
848280304Sjkim    CRYPTO_add(&object->data.crl->references, 1, CRYPTO_LOCK_X509_CRL);
849160814Ssimon#ifdef REF_PRINT
850280304Sjkim    REF_PRINT("X509_CRL", data);
851160814Ssimon#endif
852280304Sjkim    crl = object->data.crl;
853280304Sjkim    STORE_OBJECT_free(object);
854280304Sjkim    return crl;
855280304Sjkim}
856160814Ssimon
857160814Ssimonint STORE_store_crl(STORE *s, X509_CRL *data, OPENSSL_ITEM attributes[],
858280304Sjkim                    OPENSSL_ITEM parameters[])
859280304Sjkim{
860280304Sjkim    STORE_OBJECT *object;
861280304Sjkim    int i;
862160814Ssimon
863280304Sjkim    check_store(s, STORE_F_STORE_STORE_CRL,
864280304Sjkim                store_object, STORE_R_NO_STORE_OBJECT_FUNCTION);
865160814Ssimon
866280304Sjkim    object = STORE_OBJECT_new();
867280304Sjkim    if (!object) {
868280304Sjkim        STOREerr(STORE_F_STORE_STORE_CRL, ERR_R_MALLOC_FAILURE);
869280304Sjkim        return 0;
870280304Sjkim    }
871280304Sjkim
872280304Sjkim    CRYPTO_add(&data->references, 1, CRYPTO_LOCK_X509_CRL);
873160814Ssimon#ifdef REF_PRINT
874280304Sjkim    REF_PRINT("X509_CRL", data);
875160814Ssimon#endif
876280304Sjkim    object->data.crl = data;
877160814Ssimon
878280304Sjkim    i = s->meth->store_object(s, STORE_OBJECT_TYPE_X509_CRL, object,
879280304Sjkim                              attributes, parameters);
880160814Ssimon
881280304Sjkim    STORE_OBJECT_free(object);
882160814Ssimon
883280304Sjkim    if (!i) {
884280304Sjkim        STOREerr(STORE_F_STORE_STORE_CRL, STORE_R_FAILED_STORING_KEY);
885280304Sjkim        return 0;
886280304Sjkim    }
887280304Sjkim    return i;
888280304Sjkim}
889160814Ssimon
890160814Ssimonint STORE_modify_crl(STORE *s, OPENSSL_ITEM search_attributes[],
891280304Sjkim                     OPENSSL_ITEM add_attributes[],
892280304Sjkim                     OPENSSL_ITEM modify_attributes[],
893280304Sjkim                     OPENSSL_ITEM delete_attributes[],
894280304Sjkim                     OPENSSL_ITEM parameters[])
895280304Sjkim{
896280304Sjkim    check_store(s, STORE_F_STORE_MODIFY_CRL,
897280304Sjkim                modify_object, STORE_R_NO_MODIFY_OBJECT_FUNCTION);
898160814Ssimon
899280304Sjkim    if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_X509_CRL,
900280304Sjkim                                search_attributes, add_attributes,
901280304Sjkim                                modify_attributes, delete_attributes,
902280304Sjkim                                parameters)) {
903280304Sjkim        STOREerr(STORE_F_STORE_MODIFY_CRL, STORE_R_FAILED_MODIFYING_CRL);
904280304Sjkim        return 0;
905280304Sjkim    }
906280304Sjkim    return 1;
907280304Sjkim}
908160814Ssimon
909160814Ssimonint STORE_delete_crl(STORE *s, OPENSSL_ITEM attributes[],
910280304Sjkim                     OPENSSL_ITEM parameters[])
911280304Sjkim{
912280304Sjkim    check_store(s, STORE_F_STORE_DELETE_CRL,
913280304Sjkim                delete_object, STORE_R_NO_DELETE_OBJECT_FUNCTION);
914160814Ssimon
915280304Sjkim    if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_X509_CRL,
916280304Sjkim                                attributes, parameters)) {
917280304Sjkim        STOREerr(STORE_F_STORE_DELETE_CRL, STORE_R_FAILED_DELETING_KEY);
918280304Sjkim        return 0;
919280304Sjkim    }
920280304Sjkim    return 1;
921280304Sjkim}
922280304Sjkim
923160814Ssimonvoid *STORE_list_crl_start(STORE *s, OPENSSL_ITEM attributes[],
924280304Sjkim                           OPENSSL_ITEM parameters[])
925280304Sjkim{
926280304Sjkim    void *handle;
927160814Ssimon
928280304Sjkim    check_store(s, STORE_F_STORE_LIST_CRL_START,
929280304Sjkim                list_object_start, STORE_R_NO_LIST_OBJECT_START_FUNCTION);
930160814Ssimon
931280304Sjkim    handle = s->meth->list_object_start(s, STORE_OBJECT_TYPE_X509_CRL,
932280304Sjkim                                        attributes, parameters);
933280304Sjkim    if (!handle) {
934280304Sjkim        STOREerr(STORE_F_STORE_LIST_CRL_START, STORE_R_FAILED_LISTING_KEYS);
935280304Sjkim        return 0;
936280304Sjkim    }
937280304Sjkim    return handle;
938280304Sjkim}
939160814Ssimon
940160814SsimonX509_CRL *STORE_list_crl_next(STORE *s, void *handle)
941280304Sjkim{
942280304Sjkim    STORE_OBJECT *object;
943280304Sjkim    X509_CRL *crl;
944160814Ssimon
945280304Sjkim    check_store(s, STORE_F_STORE_LIST_CRL_NEXT,
946280304Sjkim                list_object_next, STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION);
947160814Ssimon
948280304Sjkim    object = s->meth->list_object_next(s, handle);
949280304Sjkim    if (!object || !object->data.crl) {
950280304Sjkim        STOREerr(STORE_F_STORE_LIST_CRL_NEXT, STORE_R_FAILED_LISTING_KEYS);
951280304Sjkim        return 0;
952280304Sjkim    }
953280304Sjkim    CRYPTO_add(&object->data.crl->references, 1, CRYPTO_LOCK_X509_CRL);
954160814Ssimon#ifdef REF_PRINT
955280304Sjkim    REF_PRINT("X509_CRL", data);
956160814Ssimon#endif
957280304Sjkim    crl = object->data.crl;
958280304Sjkim    STORE_OBJECT_free(object);
959280304Sjkim    return crl;
960280304Sjkim}
961160814Ssimon
962160814Ssimonint STORE_list_crl_end(STORE *s, void *handle)
963280304Sjkim{
964280304Sjkim    check_store(s, STORE_F_STORE_LIST_CRL_END,
965280304Sjkim                list_object_end, STORE_R_NO_LIST_OBJECT_END_FUNCTION);
966160814Ssimon
967280304Sjkim    if (!s->meth->list_object_end(s, handle)) {
968280304Sjkim        STOREerr(STORE_F_STORE_LIST_CRL_END, STORE_R_FAILED_LISTING_KEYS);
969280304Sjkim        return 0;
970280304Sjkim    }
971280304Sjkim    return 1;
972280304Sjkim}
973160814Ssimon
974160814Ssimonint STORE_list_crl_endp(STORE *s, void *handle)
975280304Sjkim{
976280304Sjkim    check_store(s, STORE_F_STORE_LIST_CRL_ENDP,
977280304Sjkim                list_object_endp, STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION);
978160814Ssimon
979280304Sjkim    if (!s->meth->list_object_endp(s, handle)) {
980280304Sjkim        STOREerr(STORE_F_STORE_LIST_CRL_ENDP, STORE_R_FAILED_LISTING_KEYS);
981280304Sjkim        return 0;
982280304Sjkim    }
983280304Sjkim    return 1;
984280304Sjkim}
985160814Ssimon
986160814Ssimonint STORE_store_number(STORE *s, BIGNUM *data, OPENSSL_ITEM attributes[],
987280304Sjkim                       OPENSSL_ITEM parameters[])
988280304Sjkim{
989280304Sjkim    STORE_OBJECT *object;
990280304Sjkim    int i;
991160814Ssimon
992280304Sjkim    check_store(s, STORE_F_STORE_STORE_NUMBER,
993280304Sjkim                store_object, STORE_R_NO_STORE_OBJECT_NUMBER_FUNCTION);
994160814Ssimon
995280304Sjkim    object = STORE_OBJECT_new();
996280304Sjkim    if (!object) {
997280304Sjkim        STOREerr(STORE_F_STORE_STORE_NUMBER, ERR_R_MALLOC_FAILURE);
998280304Sjkim        return 0;
999280304Sjkim    }
1000160814Ssimon
1001280304Sjkim    object->data.number = data;
1002160814Ssimon
1003280304Sjkim    i = s->meth->store_object(s, STORE_OBJECT_TYPE_NUMBER, object,
1004280304Sjkim                              attributes, parameters);
1005160814Ssimon
1006280304Sjkim    STORE_OBJECT_free(object);
1007160814Ssimon
1008280304Sjkim    if (!i) {
1009280304Sjkim        STOREerr(STORE_F_STORE_STORE_NUMBER, STORE_R_FAILED_STORING_NUMBER);
1010280304Sjkim        return 0;
1011280304Sjkim    }
1012280304Sjkim    return 1;
1013280304Sjkim}
1014280304Sjkim
1015160814Ssimonint STORE_modify_number(STORE *s, OPENSSL_ITEM search_attributes[],
1016280304Sjkim                        OPENSSL_ITEM add_attributes[],
1017280304Sjkim                        OPENSSL_ITEM modify_attributes[],
1018280304Sjkim                        OPENSSL_ITEM delete_attributes[],
1019280304Sjkim                        OPENSSL_ITEM parameters[])
1020280304Sjkim{
1021280304Sjkim    check_store(s, STORE_F_STORE_MODIFY_NUMBER,
1022280304Sjkim                modify_object, STORE_R_NO_MODIFY_OBJECT_FUNCTION);
1023160814Ssimon
1024280304Sjkim    if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_NUMBER,
1025280304Sjkim                                search_attributes, add_attributes,
1026280304Sjkim                                modify_attributes, delete_attributes,
1027280304Sjkim                                parameters)) {
1028280304Sjkim        STOREerr(STORE_F_STORE_MODIFY_NUMBER,
1029280304Sjkim                 STORE_R_FAILED_MODIFYING_NUMBER);
1030280304Sjkim        return 0;
1031280304Sjkim    }
1032280304Sjkim    return 1;
1033280304Sjkim}
1034160814Ssimon
1035160814SsimonBIGNUM *STORE_get_number(STORE *s, OPENSSL_ITEM attributes[],
1036280304Sjkim                         OPENSSL_ITEM parameters[])
1037280304Sjkim{
1038280304Sjkim    STORE_OBJECT *object;
1039280304Sjkim    BIGNUM *n;
1040160814Ssimon
1041280304Sjkim    check_store(s, STORE_F_STORE_GET_NUMBER,
1042280304Sjkim                get_object, STORE_R_NO_GET_OBJECT_NUMBER_FUNCTION);
1043160814Ssimon
1044280304Sjkim    object = s->meth->get_object(s, STORE_OBJECT_TYPE_NUMBER, attributes,
1045280304Sjkim                                 parameters);
1046280304Sjkim    if (!object || !object->data.number) {
1047280304Sjkim        STOREerr(STORE_F_STORE_GET_NUMBER, STORE_R_FAILED_GETTING_NUMBER);
1048280304Sjkim        return 0;
1049280304Sjkim    }
1050280304Sjkim    n = object->data.number;
1051280304Sjkim    object->data.number = NULL;
1052280304Sjkim    STORE_OBJECT_free(object);
1053280304Sjkim    return n;
1054280304Sjkim}
1055160814Ssimon
1056160814Ssimonint STORE_delete_number(STORE *s, OPENSSL_ITEM attributes[],
1057280304Sjkim                        OPENSSL_ITEM parameters[])
1058280304Sjkim{
1059280304Sjkim    check_store(s, STORE_F_STORE_DELETE_NUMBER,
1060280304Sjkim                delete_object, STORE_R_NO_DELETE_NUMBER_FUNCTION);
1061160814Ssimon
1062280304Sjkim    if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_NUMBER, attributes,
1063280304Sjkim                                parameters)) {
1064280304Sjkim        STOREerr(STORE_F_STORE_DELETE_NUMBER, STORE_R_FAILED_DELETING_NUMBER);
1065280304Sjkim        return 0;
1066280304Sjkim    }
1067280304Sjkim    return 1;
1068280304Sjkim}
1069160814Ssimon
1070160814Ssimonint STORE_store_arbitrary(STORE *s, BUF_MEM *data, OPENSSL_ITEM attributes[],
1071280304Sjkim                          OPENSSL_ITEM parameters[])
1072280304Sjkim{
1073280304Sjkim    STORE_OBJECT *object;
1074280304Sjkim    int i;
1075160814Ssimon
1076280304Sjkim    check_store(s, STORE_F_STORE_STORE_ARBITRARY,
1077280304Sjkim                store_object, STORE_R_NO_STORE_OBJECT_ARBITRARY_FUNCTION);
1078160814Ssimon
1079280304Sjkim    object = STORE_OBJECT_new();
1080280304Sjkim    if (!object) {
1081280304Sjkim        STOREerr(STORE_F_STORE_STORE_ARBITRARY, ERR_R_MALLOC_FAILURE);
1082280304Sjkim        return 0;
1083280304Sjkim    }
1084160814Ssimon
1085280304Sjkim    object->data.arbitrary = data;
1086160814Ssimon
1087280304Sjkim    i = s->meth->store_object(s, STORE_OBJECT_TYPE_ARBITRARY, object,
1088280304Sjkim                              attributes, parameters);
1089160814Ssimon
1090280304Sjkim    STORE_OBJECT_free(object);
1091160814Ssimon
1092280304Sjkim    if (!i) {
1093280304Sjkim        STOREerr(STORE_F_STORE_STORE_ARBITRARY,
1094280304Sjkim                 STORE_R_FAILED_STORING_ARBITRARY);
1095280304Sjkim        return 0;
1096280304Sjkim    }
1097280304Sjkim    return 1;
1098280304Sjkim}
1099280304Sjkim
1100160814Ssimonint STORE_modify_arbitrary(STORE *s, OPENSSL_ITEM search_attributes[],
1101280304Sjkim                           OPENSSL_ITEM add_attributes[],
1102280304Sjkim                           OPENSSL_ITEM modify_attributes[],
1103280304Sjkim                           OPENSSL_ITEM delete_attributes[],
1104280304Sjkim                           OPENSSL_ITEM parameters[])
1105280304Sjkim{
1106280304Sjkim    check_store(s, STORE_F_STORE_MODIFY_ARBITRARY,
1107280304Sjkim                modify_object, STORE_R_NO_MODIFY_OBJECT_FUNCTION);
1108160814Ssimon
1109280304Sjkim    if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_ARBITRARY,
1110280304Sjkim                                search_attributes, add_attributes,
1111280304Sjkim                                modify_attributes, delete_attributes,
1112280304Sjkim                                parameters)) {
1113280304Sjkim        STOREerr(STORE_F_STORE_MODIFY_ARBITRARY,
1114280304Sjkim                 STORE_R_FAILED_MODIFYING_ARBITRARY);
1115280304Sjkim        return 0;
1116280304Sjkim    }
1117280304Sjkim    return 1;
1118280304Sjkim}
1119160814Ssimon
1120160814SsimonBUF_MEM *STORE_get_arbitrary(STORE *s, OPENSSL_ITEM attributes[],
1121280304Sjkim                             OPENSSL_ITEM parameters[])
1122280304Sjkim{
1123280304Sjkim    STORE_OBJECT *object;
1124280304Sjkim    BUF_MEM *b;
1125160814Ssimon
1126280304Sjkim    check_store(s, STORE_F_STORE_GET_ARBITRARY,
1127280304Sjkim                get_object, STORE_R_NO_GET_OBJECT_ARBITRARY_FUNCTION);
1128160814Ssimon
1129280304Sjkim    object = s->meth->get_object(s, STORE_OBJECT_TYPE_ARBITRARY,
1130280304Sjkim                                 attributes, parameters);
1131280304Sjkim    if (!object || !object->data.arbitrary) {
1132280304Sjkim        STOREerr(STORE_F_STORE_GET_ARBITRARY,
1133280304Sjkim                 STORE_R_FAILED_GETTING_ARBITRARY);
1134280304Sjkim        return 0;
1135280304Sjkim    }
1136280304Sjkim    b = object->data.arbitrary;
1137280304Sjkim    object->data.arbitrary = NULL;
1138280304Sjkim    STORE_OBJECT_free(object);
1139280304Sjkim    return b;
1140280304Sjkim}
1141160814Ssimon
1142160814Ssimonint STORE_delete_arbitrary(STORE *s, OPENSSL_ITEM attributes[],
1143280304Sjkim                           OPENSSL_ITEM parameters[])
1144280304Sjkim{
1145280304Sjkim    check_store(s, STORE_F_STORE_DELETE_ARBITRARY,
1146280304Sjkim                delete_object, STORE_R_NO_DELETE_ARBITRARY_FUNCTION);
1147160814Ssimon
1148280304Sjkim    if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_ARBITRARY, attributes,
1149280304Sjkim                                parameters)) {
1150280304Sjkim        STOREerr(STORE_F_STORE_DELETE_ARBITRARY,
1151280304Sjkim                 STORE_R_FAILED_DELETING_ARBITRARY);
1152280304Sjkim        return 0;
1153280304Sjkim    }
1154280304Sjkim    return 1;
1155280304Sjkim}
1156160814Ssimon
1157160814SsimonSTORE_OBJECT *STORE_OBJECT_new(void)
1158280304Sjkim{
1159280304Sjkim    STORE_OBJECT *object = OPENSSL_malloc(sizeof(STORE_OBJECT));
1160280304Sjkim    if (object)
1161280304Sjkim        memset(object, 0, sizeof(STORE_OBJECT));
1162280304Sjkim    return object;
1163280304Sjkim}
1164280304Sjkim
1165160814Ssimonvoid STORE_OBJECT_free(STORE_OBJECT *data)
1166280304Sjkim{
1167280304Sjkim    if (!data)
1168280304Sjkim        return;
1169280304Sjkim    switch (data->type) {
1170280304Sjkim    case STORE_OBJECT_TYPE_X509_CERTIFICATE:
1171280304Sjkim        X509_free(data->data.x509.certificate);
1172280304Sjkim        break;
1173280304Sjkim    case STORE_OBJECT_TYPE_X509_CRL:
1174280304Sjkim        X509_CRL_free(data->data.crl);
1175280304Sjkim        break;
1176280304Sjkim    case STORE_OBJECT_TYPE_PRIVATE_KEY:
1177280304Sjkim    case STORE_OBJECT_TYPE_PUBLIC_KEY:
1178280304Sjkim        EVP_PKEY_free(data->data.key);
1179280304Sjkim        break;
1180280304Sjkim    case STORE_OBJECT_TYPE_NUMBER:
1181280304Sjkim        BN_free(data->data.number);
1182280304Sjkim        break;
1183280304Sjkim    case STORE_OBJECT_TYPE_ARBITRARY:
1184280304Sjkim        BUF_MEM_free(data->data.arbitrary);
1185280304Sjkim        break;
1186280304Sjkim    }
1187280304Sjkim    OPENSSL_free(data);
1188280304Sjkim}
1189160814Ssimon
1190160814SsimonIMPLEMENT_STACK_OF(STORE_OBJECT*)
1191160814Ssimon
1192280304Sjkimstruct STORE_attr_info_st {
1193280304Sjkim    unsigned char set[(STORE_ATTR_TYPE_NUM + 8) / 8];
1194280304Sjkim    union {
1195280304Sjkim        char *cstring;
1196280304Sjkim        unsigned char *sha1string;
1197280304Sjkim        X509_NAME *dn;
1198280304Sjkim        BIGNUM *number;
1199280304Sjkim        void *any;
1200280304Sjkim    } values[STORE_ATTR_TYPE_NUM + 1];
1201280304Sjkim    size_t value_sizes[STORE_ATTR_TYPE_NUM + 1];
1202280304Sjkim};
1203160814Ssimon
1204280304Sjkim#define ATTR_IS_SET(a,i)        ((i) > 0 && (i) < STORE_ATTR_TYPE_NUM \
1205280304Sjkim                                && ((a)->set[(i) / 8] & (1 << ((i) % 8))))
1206280304Sjkim#define SET_ATTRBIT(a,i)        ((a)->set[(i) / 8] |= (1 << ((i) % 8)))
1207280304Sjkim#define CLEAR_ATTRBIT(a,i)      ((a)->set[(i) / 8] &= ~(1 << ((i) % 8)))
1208160814Ssimon
1209280304SjkimSTORE_ATTR_INFO *STORE_ATTR_INFO_new(void)
1210280304Sjkim{
1211280304Sjkim    return (STORE_ATTR_INFO *)OPENSSL_malloc(sizeof(STORE_ATTR_INFO));
1212280304Sjkim}
1213160814Ssimon
1214160814Ssimonstatic void STORE_ATTR_INFO_attr_free(STORE_ATTR_INFO *attrs,
1215280304Sjkim                                      STORE_ATTR_TYPES code)
1216280304Sjkim{
1217280304Sjkim    if (ATTR_IS_SET(attrs, code)) {
1218280304Sjkim        switch (code) {
1219280304Sjkim        case STORE_ATTR_FRIENDLYNAME:
1220280304Sjkim        case STORE_ATTR_EMAIL:
1221280304Sjkim        case STORE_ATTR_FILENAME:
1222280304Sjkim            STORE_ATTR_INFO_modify_cstr(attrs, code, NULL, 0);
1223280304Sjkim            break;
1224280304Sjkim        case STORE_ATTR_KEYID:
1225280304Sjkim        case STORE_ATTR_ISSUERKEYID:
1226280304Sjkim        case STORE_ATTR_SUBJECTKEYID:
1227280304Sjkim        case STORE_ATTR_ISSUERSERIALHASH:
1228280304Sjkim        case STORE_ATTR_CERTHASH:
1229280304Sjkim            STORE_ATTR_INFO_modify_sha1str(attrs, code, NULL, 0);
1230280304Sjkim            break;
1231280304Sjkim        case STORE_ATTR_ISSUER:
1232280304Sjkim        case STORE_ATTR_SUBJECT:
1233280304Sjkim            STORE_ATTR_INFO_modify_dn(attrs, code, NULL);
1234280304Sjkim            break;
1235280304Sjkim        case STORE_ATTR_SERIAL:
1236280304Sjkim            STORE_ATTR_INFO_modify_number(attrs, code, NULL);
1237280304Sjkim            break;
1238280304Sjkim        default:
1239280304Sjkim            break;
1240280304Sjkim        }
1241280304Sjkim    }
1242280304Sjkim}
1243280304Sjkim
1244160814Ssimonint STORE_ATTR_INFO_free(STORE_ATTR_INFO *attrs)
1245280304Sjkim{
1246280304Sjkim    if (attrs) {
1247280304Sjkim        STORE_ATTR_TYPES i;
1248280304Sjkim        for (i = 0; i++ < STORE_ATTR_TYPE_NUM;)
1249280304Sjkim            STORE_ATTR_INFO_attr_free(attrs, i);
1250280304Sjkim        OPENSSL_free(attrs);
1251280304Sjkim    }
1252280304Sjkim    return 1;
1253280304Sjkim}
1254280304Sjkim
1255160814Ssimonchar *STORE_ATTR_INFO_get0_cstr(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code)
1256280304Sjkim{
1257280304Sjkim    if (!attrs) {
1258280304Sjkim        STOREerr(STORE_F_STORE_ATTR_INFO_GET0_CSTR,
1259280304Sjkim                 ERR_R_PASSED_NULL_PARAMETER);
1260280304Sjkim        return NULL;
1261280304Sjkim    }
1262280304Sjkim    if (ATTR_IS_SET(attrs, code))
1263280304Sjkim        return attrs->values[code].cstring;
1264280304Sjkim    STOREerr(STORE_F_STORE_ATTR_INFO_GET0_CSTR, STORE_R_NO_VALUE);
1265280304Sjkim    return NULL;
1266280304Sjkim}
1267280304Sjkim
1268160814Ssimonunsigned char *STORE_ATTR_INFO_get0_sha1str(STORE_ATTR_INFO *attrs,
1269280304Sjkim                                            STORE_ATTR_TYPES code)
1270280304Sjkim{
1271280304Sjkim    if (!attrs) {
1272280304Sjkim        STOREerr(STORE_F_STORE_ATTR_INFO_GET0_SHA1STR,
1273280304Sjkim                 ERR_R_PASSED_NULL_PARAMETER);
1274280304Sjkim        return NULL;
1275280304Sjkim    }
1276280304Sjkim    if (ATTR_IS_SET(attrs, code))
1277280304Sjkim        return attrs->values[code].sha1string;
1278280304Sjkim    STOREerr(STORE_F_STORE_ATTR_INFO_GET0_SHA1STR, STORE_R_NO_VALUE);
1279280304Sjkim    return NULL;
1280280304Sjkim}
1281280304Sjkim
1282280304SjkimX509_NAME *STORE_ATTR_INFO_get0_dn(STORE_ATTR_INFO *attrs,
1283280304Sjkim                                   STORE_ATTR_TYPES code)
1284280304Sjkim{
1285280304Sjkim    if (!attrs) {
1286280304Sjkim        STOREerr(STORE_F_STORE_ATTR_INFO_GET0_DN,
1287280304Sjkim                 ERR_R_PASSED_NULL_PARAMETER);
1288280304Sjkim        return NULL;
1289280304Sjkim    }
1290280304Sjkim    if (ATTR_IS_SET(attrs, code))
1291280304Sjkim        return attrs->values[code].dn;
1292280304Sjkim    STOREerr(STORE_F_STORE_ATTR_INFO_GET0_DN, STORE_R_NO_VALUE);
1293280304Sjkim    return NULL;
1294280304Sjkim}
1295280304Sjkim
1296280304SjkimBIGNUM *STORE_ATTR_INFO_get0_number(STORE_ATTR_INFO *attrs,
1297280304Sjkim                                    STORE_ATTR_TYPES code)
1298280304Sjkim{
1299280304Sjkim    if (!attrs) {
1300280304Sjkim        STOREerr(STORE_F_STORE_ATTR_INFO_GET0_NUMBER,
1301280304Sjkim                 ERR_R_PASSED_NULL_PARAMETER);
1302280304Sjkim        return NULL;
1303280304Sjkim    }
1304280304Sjkim    if (ATTR_IS_SET(attrs, code))
1305280304Sjkim        return attrs->values[code].number;
1306280304Sjkim    STOREerr(STORE_F_STORE_ATTR_INFO_GET0_NUMBER, STORE_R_NO_VALUE);
1307280304Sjkim    return NULL;
1308280304Sjkim}
1309280304Sjkim
1310160814Ssimonint STORE_ATTR_INFO_set_cstr(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
1311280304Sjkim                             char *cstr, size_t cstr_size)
1312280304Sjkim{
1313280304Sjkim    if (!attrs) {
1314280304Sjkim        STOREerr(STORE_F_STORE_ATTR_INFO_SET_CSTR,
1315280304Sjkim                 ERR_R_PASSED_NULL_PARAMETER);
1316280304Sjkim        return 0;
1317280304Sjkim    }
1318280304Sjkim    if (!ATTR_IS_SET(attrs, code)) {
1319280304Sjkim        if ((attrs->values[code].cstring = BUF_strndup(cstr, cstr_size)))
1320280304Sjkim            return 1;
1321280304Sjkim        STOREerr(STORE_F_STORE_ATTR_INFO_SET_CSTR, ERR_R_MALLOC_FAILURE);
1322280304Sjkim        return 0;
1323280304Sjkim    }
1324280304Sjkim    STOREerr(STORE_F_STORE_ATTR_INFO_SET_CSTR, STORE_R_ALREADY_HAS_A_VALUE);
1325280304Sjkim    return 0;
1326280304Sjkim}
1327280304Sjkim
1328160814Ssimonint STORE_ATTR_INFO_set_sha1str(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
1329280304Sjkim                                unsigned char *sha1str, size_t sha1str_size)
1330280304Sjkim{
1331280304Sjkim    if (!attrs) {
1332280304Sjkim        STOREerr(STORE_F_STORE_ATTR_INFO_SET_SHA1STR,
1333280304Sjkim                 ERR_R_PASSED_NULL_PARAMETER);
1334280304Sjkim        return 0;
1335280304Sjkim    }
1336280304Sjkim    if (!ATTR_IS_SET(attrs, code)) {
1337280304Sjkim        if ((attrs->values[code].sha1string =
1338280304Sjkim             (unsigned char *)BUF_memdup(sha1str, sha1str_size)))
1339280304Sjkim            return 1;
1340280304Sjkim        STOREerr(STORE_F_STORE_ATTR_INFO_SET_SHA1STR, ERR_R_MALLOC_FAILURE);
1341280304Sjkim        return 0;
1342280304Sjkim    }
1343280304Sjkim    STOREerr(STORE_F_STORE_ATTR_INFO_SET_SHA1STR,
1344280304Sjkim             STORE_R_ALREADY_HAS_A_VALUE);
1345280304Sjkim    return 0;
1346280304Sjkim}
1347280304Sjkim
1348160814Ssimonint STORE_ATTR_INFO_set_dn(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
1349280304Sjkim                           X509_NAME *dn)
1350280304Sjkim{
1351280304Sjkim    if (!attrs) {
1352280304Sjkim        STOREerr(STORE_F_STORE_ATTR_INFO_SET_DN, ERR_R_PASSED_NULL_PARAMETER);
1353280304Sjkim        return 0;
1354280304Sjkim    }
1355280304Sjkim    if (!ATTR_IS_SET(attrs, code)) {
1356280304Sjkim        if ((attrs->values[code].dn = X509_NAME_dup(dn)))
1357280304Sjkim            return 1;
1358280304Sjkim        STOREerr(STORE_F_STORE_ATTR_INFO_SET_DN, ERR_R_MALLOC_FAILURE);
1359280304Sjkim        return 0;
1360280304Sjkim    }
1361280304Sjkim    STOREerr(STORE_F_STORE_ATTR_INFO_SET_DN, STORE_R_ALREADY_HAS_A_VALUE);
1362280304Sjkim    return 0;
1363280304Sjkim}
1364280304Sjkim
1365160814Ssimonint STORE_ATTR_INFO_set_number(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
1366280304Sjkim                               BIGNUM *number)
1367280304Sjkim{
1368280304Sjkim    if (!attrs) {
1369280304Sjkim        STOREerr(STORE_F_STORE_ATTR_INFO_SET_NUMBER,
1370280304Sjkim                 ERR_R_PASSED_NULL_PARAMETER);
1371280304Sjkim        return 0;
1372280304Sjkim    }
1373280304Sjkim    if (!ATTR_IS_SET(attrs, code)) {
1374280304Sjkim        if ((attrs->values[code].number = BN_dup(number)))
1375280304Sjkim            return 1;
1376280304Sjkim        STOREerr(STORE_F_STORE_ATTR_INFO_SET_NUMBER, ERR_R_MALLOC_FAILURE);
1377280304Sjkim        return 0;
1378280304Sjkim    }
1379280304Sjkim    STOREerr(STORE_F_STORE_ATTR_INFO_SET_NUMBER, STORE_R_ALREADY_HAS_A_VALUE);
1380280304Sjkim    return 0;
1381280304Sjkim}
1382280304Sjkim
1383160814Ssimonint STORE_ATTR_INFO_modify_cstr(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
1384280304Sjkim                                char *cstr, size_t cstr_size)
1385280304Sjkim{
1386280304Sjkim    if (!attrs) {
1387280304Sjkim        STOREerr(STORE_F_STORE_ATTR_INFO_MODIFY_CSTR,
1388280304Sjkim                 ERR_R_PASSED_NULL_PARAMETER);
1389280304Sjkim        return 0;
1390280304Sjkim    }
1391280304Sjkim    if (ATTR_IS_SET(attrs, code)) {
1392280304Sjkim        OPENSSL_free(attrs->values[code].cstring);
1393280304Sjkim        attrs->values[code].cstring = NULL;
1394280304Sjkim        CLEAR_ATTRBIT(attrs, code);
1395280304Sjkim    }
1396280304Sjkim    return STORE_ATTR_INFO_set_cstr(attrs, code, cstr, cstr_size);
1397280304Sjkim}
1398280304Sjkim
1399280304Sjkimint STORE_ATTR_INFO_modify_sha1str(STORE_ATTR_INFO *attrs,
1400280304Sjkim                                   STORE_ATTR_TYPES code,
1401280304Sjkim                                   unsigned char *sha1str,
1402280304Sjkim                                   size_t sha1str_size)
1403280304Sjkim{
1404280304Sjkim    if (!attrs) {
1405280304Sjkim        STOREerr(STORE_F_STORE_ATTR_INFO_MODIFY_SHA1STR,
1406280304Sjkim                 ERR_R_PASSED_NULL_PARAMETER);
1407280304Sjkim        return 0;
1408280304Sjkim    }
1409280304Sjkim    if (ATTR_IS_SET(attrs, code)) {
1410280304Sjkim        OPENSSL_free(attrs->values[code].sha1string);
1411280304Sjkim        attrs->values[code].sha1string = NULL;
1412280304Sjkim        CLEAR_ATTRBIT(attrs, code);
1413280304Sjkim    }
1414280304Sjkim    return STORE_ATTR_INFO_set_sha1str(attrs, code, sha1str, sha1str_size);
1415280304Sjkim}
1416280304Sjkim
1417160814Ssimonint STORE_ATTR_INFO_modify_dn(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
1418280304Sjkim                              X509_NAME *dn)
1419280304Sjkim{
1420280304Sjkim    if (!attrs) {
1421280304Sjkim        STOREerr(STORE_F_STORE_ATTR_INFO_MODIFY_DN,
1422280304Sjkim                 ERR_R_PASSED_NULL_PARAMETER);
1423280304Sjkim        return 0;
1424280304Sjkim    }
1425280304Sjkim    if (ATTR_IS_SET(attrs, code)) {
1426280304Sjkim        OPENSSL_free(attrs->values[code].dn);
1427280304Sjkim        attrs->values[code].dn = NULL;
1428280304Sjkim        CLEAR_ATTRBIT(attrs, code);
1429280304Sjkim    }
1430280304Sjkim    return STORE_ATTR_INFO_set_dn(attrs, code, dn);
1431280304Sjkim}
1432160814Ssimon
1433280304Sjkimint STORE_ATTR_INFO_modify_number(STORE_ATTR_INFO *attrs,
1434280304Sjkim                                  STORE_ATTR_TYPES code, BIGNUM *number)
1435280304Sjkim{
1436280304Sjkim    if (!attrs) {
1437280304Sjkim        STOREerr(STORE_F_STORE_ATTR_INFO_MODIFY_NUMBER,
1438280304Sjkim                 ERR_R_PASSED_NULL_PARAMETER);
1439280304Sjkim        return 0;
1440280304Sjkim    }
1441280304Sjkim    if (ATTR_IS_SET(attrs, code)) {
1442280304Sjkim        OPENSSL_free(attrs->values[code].number);
1443280304Sjkim        attrs->values[code].number = NULL;
1444280304Sjkim        CLEAR_ATTRBIT(attrs, code);
1445280304Sjkim    }
1446280304Sjkim    return STORE_ATTR_INFO_set_number(attrs, code, number);
1447280304Sjkim}
1448280304Sjkim
1449280304Sjkimstruct attr_list_ctx_st {
1450280304Sjkim    OPENSSL_ITEM *attributes;
1451280304Sjkim};
1452160814Ssimonvoid *STORE_parse_attrs_start(OPENSSL_ITEM *attributes)
1453280304Sjkim{
1454280304Sjkim    if (attributes) {
1455280304Sjkim        struct attr_list_ctx_st *context = (struct attr_list_ctx_st *)
1456280304Sjkim            OPENSSL_malloc(sizeof(struct attr_list_ctx_st));
1457280304Sjkim        if (context)
1458280304Sjkim            context->attributes = attributes;
1459280304Sjkim        else
1460280304Sjkim            STOREerr(STORE_F_STORE_PARSE_ATTRS_START, ERR_R_MALLOC_FAILURE);
1461280304Sjkim        return context;
1462280304Sjkim    }
1463280304Sjkim    STOREerr(STORE_F_STORE_PARSE_ATTRS_START, ERR_R_PASSED_NULL_PARAMETER);
1464280304Sjkim    return 0;
1465280304Sjkim}
1466280304Sjkim
1467160814SsimonSTORE_ATTR_INFO *STORE_parse_attrs_next(void *handle)
1468280304Sjkim{
1469280304Sjkim    struct attr_list_ctx_st *context = (struct attr_list_ctx_st *)handle;
1470160814Ssimon
1471280304Sjkim    if (context && context->attributes) {
1472280304Sjkim        STORE_ATTR_INFO *attrs = NULL;
1473160814Ssimon
1474280304Sjkim        while (context->attributes
1475280304Sjkim               && context->attributes->code != STORE_ATTR_OR
1476280304Sjkim               && context->attributes->code != STORE_ATTR_END) {
1477280304Sjkim            switch (context->attributes->code) {
1478280304Sjkim            case STORE_ATTR_FRIENDLYNAME:
1479280304Sjkim            case STORE_ATTR_EMAIL:
1480280304Sjkim            case STORE_ATTR_FILENAME:
1481280304Sjkim                if (!attrs)
1482280304Sjkim                    attrs = STORE_ATTR_INFO_new();
1483280304Sjkim                if (attrs == NULL) {
1484280304Sjkim                    STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT,
1485280304Sjkim                             ERR_R_MALLOC_FAILURE);
1486280304Sjkim                    goto err;
1487280304Sjkim                }
1488280304Sjkim                STORE_ATTR_INFO_set_cstr(attrs,
1489280304Sjkim                                         context->attributes->code,
1490280304Sjkim                                         context->attributes->value,
1491280304Sjkim                                         context->attributes->value_size);
1492280304Sjkim                break;
1493280304Sjkim            case STORE_ATTR_KEYID:
1494280304Sjkim            case STORE_ATTR_ISSUERKEYID:
1495280304Sjkim            case STORE_ATTR_SUBJECTKEYID:
1496280304Sjkim            case STORE_ATTR_ISSUERSERIALHASH:
1497280304Sjkim            case STORE_ATTR_CERTHASH:
1498280304Sjkim                if (!attrs)
1499280304Sjkim                    attrs = STORE_ATTR_INFO_new();
1500280304Sjkim                if (attrs == NULL) {
1501280304Sjkim                    STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT,
1502280304Sjkim                             ERR_R_MALLOC_FAILURE);
1503280304Sjkim                    goto err;
1504280304Sjkim                }
1505280304Sjkim                STORE_ATTR_INFO_set_sha1str(attrs,
1506280304Sjkim                                            context->attributes->code,
1507280304Sjkim                                            context->attributes->value,
1508280304Sjkim                                            context->attributes->value_size);
1509280304Sjkim                break;
1510280304Sjkim            case STORE_ATTR_ISSUER:
1511280304Sjkim            case STORE_ATTR_SUBJECT:
1512280304Sjkim                if (!attrs)
1513280304Sjkim                    attrs = STORE_ATTR_INFO_new();
1514280304Sjkim                if (attrs == NULL) {
1515280304Sjkim                    STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT,
1516280304Sjkim                             ERR_R_MALLOC_FAILURE);
1517280304Sjkim                    goto err;
1518280304Sjkim                }
1519280304Sjkim                STORE_ATTR_INFO_modify_dn(attrs,
1520280304Sjkim                                          context->attributes->code,
1521280304Sjkim                                          context->attributes->value);
1522280304Sjkim                break;
1523280304Sjkim            case STORE_ATTR_SERIAL:
1524280304Sjkim                if (!attrs)
1525280304Sjkim                    attrs = STORE_ATTR_INFO_new();
1526280304Sjkim                if (attrs == NULL) {
1527280304Sjkim                    STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT,
1528280304Sjkim                             ERR_R_MALLOC_FAILURE);
1529280304Sjkim                    goto err;
1530280304Sjkim                }
1531280304Sjkim                STORE_ATTR_INFO_modify_number(attrs,
1532280304Sjkim                                              context->attributes->code,
1533280304Sjkim                                              context->attributes->value);
1534280304Sjkim                break;
1535280304Sjkim            }
1536280304Sjkim            context->attributes++;
1537280304Sjkim        }
1538280304Sjkim        if (context->attributes->code == STORE_ATTR_OR)
1539280304Sjkim            context->attributes++;
1540280304Sjkim        return attrs;
1541280304Sjkim err:
1542280304Sjkim        while (context->attributes
1543280304Sjkim               && context->attributes->code != STORE_ATTR_OR
1544280304Sjkim               && context->attributes->code != STORE_ATTR_END)
1545280304Sjkim            context->attributes++;
1546280304Sjkim        if (context->attributes->code == STORE_ATTR_OR)
1547280304Sjkim            context->attributes++;
1548280304Sjkim        return NULL;
1549280304Sjkim    }
1550280304Sjkim    STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT, ERR_R_PASSED_NULL_PARAMETER);
1551280304Sjkim    return NULL;
1552280304Sjkim}
1553280304Sjkim
1554160814Ssimonint STORE_parse_attrs_end(void *handle)
1555280304Sjkim{
1556280304Sjkim    struct attr_list_ctx_st *context = (struct attr_list_ctx_st *)handle;
1557160814Ssimon
1558280304Sjkim    if (context && context->attributes) {
1559160814Ssimon#if 0
1560280304Sjkim        OPENSSL_ITEM *attributes = context->attributes;
1561160814Ssimon#endif
1562280304Sjkim        OPENSSL_free(context);
1563280304Sjkim        return 1;
1564280304Sjkim    }
1565280304Sjkim    STOREerr(STORE_F_STORE_PARSE_ATTRS_END, ERR_R_PASSED_NULL_PARAMETER);
1566280304Sjkim    return 0;
1567280304Sjkim}
1568160814Ssimon
1569160814Ssimonint STORE_parse_attrs_endp(void *handle)
1570280304Sjkim{
1571280304Sjkim    struct attr_list_ctx_st *context = (struct attr_list_ctx_st *)handle;
1572160814Ssimon
1573280304Sjkim    if (context && context->attributes) {
1574280304Sjkim        return context->attributes->code == STORE_ATTR_END;
1575280304Sjkim    }
1576280304Sjkim    STOREerr(STORE_F_STORE_PARSE_ATTRS_ENDP, ERR_R_PASSED_NULL_PARAMETER);
1577280304Sjkim    return 0;
1578280304Sjkim}
1579160814Ssimon
1580280304Sjkimstatic int attr_info_compare_compute_range(const unsigned char *abits,
1581280304Sjkim                                           const unsigned char *bbits,
1582280304Sjkim                                           unsigned int *alowp,
1583280304Sjkim                                           unsigned int *ahighp,
1584280304Sjkim                                           unsigned int *blowp,
1585280304Sjkim                                           unsigned int *bhighp)
1586280304Sjkim{
1587280304Sjkim    unsigned int alow = (unsigned int)-1, ahigh = 0;
1588280304Sjkim    unsigned int blow = (unsigned int)-1, bhigh = 0;
1589280304Sjkim    int i, res = 0;
1590160814Ssimon
1591280304Sjkim    for (i = 0; i < (STORE_ATTR_TYPE_NUM + 8) / 8; i++, abits++, bbits++) {
1592280304Sjkim        if (res == 0) {
1593280304Sjkim            if (*abits < *bbits)
1594280304Sjkim                res = -1;
1595280304Sjkim            if (*abits > *bbits)
1596280304Sjkim                res = 1;
1597280304Sjkim        }
1598280304Sjkim        if (*abits) {
1599280304Sjkim            if (alow == (unsigned int)-1) {
1600280304Sjkim                alow = i * 8;
1601280304Sjkim                if (!(*abits & 0x01))
1602280304Sjkim                    alow++;
1603280304Sjkim                if (!(*abits & 0x02))
1604280304Sjkim                    alow++;
1605280304Sjkim                if (!(*abits & 0x04))
1606280304Sjkim                    alow++;
1607280304Sjkim                if (!(*abits & 0x08))
1608280304Sjkim                    alow++;
1609280304Sjkim                if (!(*abits & 0x10))
1610280304Sjkim                    alow++;
1611280304Sjkim                if (!(*abits & 0x20))
1612280304Sjkim                    alow++;
1613280304Sjkim                if (!(*abits & 0x40))
1614280304Sjkim                    alow++;
1615280304Sjkim            }
1616280304Sjkim            ahigh = i * 8 + 7;
1617280304Sjkim            if (!(*abits & 0x80))
1618280304Sjkim                ahigh++;
1619280304Sjkim            if (!(*abits & 0x40))
1620280304Sjkim                ahigh++;
1621280304Sjkim            if (!(*abits & 0x20))
1622280304Sjkim                ahigh++;
1623280304Sjkim            if (!(*abits & 0x10))
1624280304Sjkim                ahigh++;
1625280304Sjkim            if (!(*abits & 0x08))
1626280304Sjkim                ahigh++;
1627280304Sjkim            if (!(*abits & 0x04))
1628280304Sjkim                ahigh++;
1629280304Sjkim            if (!(*abits & 0x02))
1630280304Sjkim                ahigh++;
1631280304Sjkim        }
1632280304Sjkim        if (*bbits) {
1633280304Sjkim            if (blow == (unsigned int)-1) {
1634280304Sjkim                blow = i * 8;
1635280304Sjkim                if (!(*bbits & 0x01))
1636280304Sjkim                    blow++;
1637280304Sjkim                if (!(*bbits & 0x02))
1638280304Sjkim                    blow++;
1639280304Sjkim                if (!(*bbits & 0x04))
1640280304Sjkim                    blow++;
1641280304Sjkim                if (!(*bbits & 0x08))
1642280304Sjkim                    blow++;
1643280304Sjkim                if (!(*bbits & 0x10))
1644280304Sjkim                    blow++;
1645280304Sjkim                if (!(*bbits & 0x20))
1646280304Sjkim                    blow++;
1647280304Sjkim                if (!(*bbits & 0x40))
1648280304Sjkim                    blow++;
1649280304Sjkim            }
1650280304Sjkim            bhigh = i * 8 + 7;
1651280304Sjkim            if (!(*bbits & 0x80))
1652280304Sjkim                bhigh++;
1653280304Sjkim            if (!(*bbits & 0x40))
1654280304Sjkim                bhigh++;
1655280304Sjkim            if (!(*bbits & 0x20))
1656280304Sjkim                bhigh++;
1657280304Sjkim            if (!(*bbits & 0x10))
1658280304Sjkim                bhigh++;
1659280304Sjkim            if (!(*bbits & 0x08))
1660280304Sjkim                bhigh++;
1661280304Sjkim            if (!(*bbits & 0x04))
1662280304Sjkim                bhigh++;
1663280304Sjkim            if (!(*bbits & 0x02))
1664280304Sjkim                bhigh++;
1665280304Sjkim        }
1666280304Sjkim    }
1667280304Sjkim    if (ahigh + alow < bhigh + blow)
1668280304Sjkim        res = -1;
1669280304Sjkim    if (ahigh + alow > bhigh + blow)
1670280304Sjkim        res = 1;
1671280304Sjkim    if (alowp)
1672280304Sjkim        *alowp = alow;
1673280304Sjkim    if (ahighp)
1674280304Sjkim        *ahighp = ahigh;
1675280304Sjkim    if (blowp)
1676280304Sjkim        *blowp = blow;
1677280304Sjkim    if (bhighp)
1678280304Sjkim        *bhighp = bhigh;
1679280304Sjkim    return res;
1680280304Sjkim}
1681160814Ssimon
1682280304Sjkimint STORE_ATTR_INFO_compare(const STORE_ATTR_INFO *const *a,
1683280304Sjkim                            const STORE_ATTR_INFO *const *b)
1684280304Sjkim{
1685280304Sjkim    if (a == b)
1686280304Sjkim        return 0;
1687280304Sjkim    if (!a)
1688280304Sjkim        return -1;
1689280304Sjkim    if (!b)
1690280304Sjkim        return 1;
1691280304Sjkim    return attr_info_compare_compute_range((*a)->set, (*b)->set, 0, 0, 0, 0);
1692280304Sjkim}
1693238405Sjkim
1694160814Ssimonint STORE_ATTR_INFO_in_range(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b)
1695280304Sjkim{
1696280304Sjkim    unsigned int alow, ahigh, blow, bhigh;
1697160814Ssimon
1698280304Sjkim    if (a == b)
1699280304Sjkim        return 1;
1700280304Sjkim    if (!a)
1701280304Sjkim        return 0;
1702280304Sjkim    if (!b)
1703280304Sjkim        return 0;
1704280304Sjkim    attr_info_compare_compute_range(a->set, b->set,
1705280304Sjkim                                    &alow, &ahigh, &blow, &bhigh);
1706280304Sjkim    if (alow >= blow && ahigh <= bhigh)
1707280304Sjkim        return 1;
1708280304Sjkim    return 0;
1709280304Sjkim}
1710238405Sjkim
1711160814Ssimonint STORE_ATTR_INFO_in(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b)
1712280304Sjkim{
1713280304Sjkim    unsigned char *abits, *bbits;
1714280304Sjkim    int i;
1715160814Ssimon
1716280304Sjkim    if (a == b)
1717280304Sjkim        return 1;
1718280304Sjkim    if (!a)
1719280304Sjkim        return 0;
1720280304Sjkim    if (!b)
1721280304Sjkim        return 0;
1722280304Sjkim    abits = a->set;
1723280304Sjkim    bbits = b->set;
1724280304Sjkim    for (i = 0; i < (STORE_ATTR_TYPE_NUM + 8) / 8; i++, abits++, bbits++) {
1725280304Sjkim        if (*abits && (*bbits & *abits) != *abits)
1726280304Sjkim            return 0;
1727280304Sjkim    }
1728280304Sjkim    return 1;
1729280304Sjkim}
1730238405Sjkim
1731160814Ssimonint STORE_ATTR_INFO_in_ex(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b)
1732280304Sjkim{
1733280304Sjkim    STORE_ATTR_TYPES i;
1734160814Ssimon
1735280304Sjkim    if (a == b)
1736280304Sjkim        return 1;
1737280304Sjkim    if (!STORE_ATTR_INFO_in(a, b))
1738280304Sjkim        return 0;
1739280304Sjkim    for (i = 1; i < STORE_ATTR_TYPE_NUM; i++)
1740280304Sjkim        if (ATTR_IS_SET(a, i)) {
1741280304Sjkim            switch (i) {
1742280304Sjkim            case STORE_ATTR_FRIENDLYNAME:
1743280304Sjkim            case STORE_ATTR_EMAIL:
1744280304Sjkim            case STORE_ATTR_FILENAME:
1745280304Sjkim                if (strcmp(a->values[i].cstring, b->values[i].cstring))
1746280304Sjkim                    return 0;
1747280304Sjkim                break;
1748280304Sjkim            case STORE_ATTR_KEYID:
1749280304Sjkim            case STORE_ATTR_ISSUERKEYID:
1750280304Sjkim            case STORE_ATTR_SUBJECTKEYID:
1751280304Sjkim            case STORE_ATTR_ISSUERSERIALHASH:
1752280304Sjkim            case STORE_ATTR_CERTHASH:
1753280304Sjkim                if (memcmp(a->values[i].sha1string,
1754280304Sjkim                           b->values[i].sha1string, a->value_sizes[i]))
1755280304Sjkim                    return 0;
1756280304Sjkim                break;
1757280304Sjkim            case STORE_ATTR_ISSUER:
1758280304Sjkim            case STORE_ATTR_SUBJECT:
1759280304Sjkim                if (X509_NAME_cmp(a->values[i].dn, b->values[i].dn))
1760280304Sjkim                    return 0;
1761280304Sjkim                break;
1762280304Sjkim            case STORE_ATTR_SERIAL:
1763280304Sjkim                if (BN_cmp(a->values[i].number, b->values[i].number))
1764280304Sjkim                    return 0;
1765280304Sjkim                break;
1766280304Sjkim            default:
1767280304Sjkim                break;
1768280304Sjkim            }
1769280304Sjkim        }
1770160814Ssimon
1771280304Sjkim    return 1;
1772280304Sjkim}
1773