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