2 * Written by Richard Levitte (richard@levitte.org) for the OpenSSL project
5 /* ====================================================================
6 * Copyright (c) 2003 The OpenSSL Project. All rights reserved.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in
17 * the documentation and/or other materials provided with the
20 * 3. All advertising materials mentioning features or use of this
21 * software must display the following acknowledgment:
22 * "This product includes software developed by the OpenSSL Project
23 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
25 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26 * endorse or promote products derived from this software without
27 * prior written permission. For written permission, please contact
28 * openssl-core@openssl.org.
30 * 5. Products derived from this software may not be called "OpenSSL"
31 * nor may "OpenSSL" appear in their names without prior written
32 * permission of the OpenSSL Project.
34 * 6. Redistributions of any form whatsoever must retain the following
36 * "This product includes software developed by the OpenSSL Project
37 * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
39 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
43 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50 * OF THE POSSIBILITY OF SUCH DAMAGE.
51 * ====================================================================
53 * This product includes cryptographic software written by Eric Young
54 * (eay@cryptsoft.com). This product includes software written by Tim
55 * Hudson (tjh@cryptsoft.com).
60 #include <openssl/bn.h>
61 #include <openssl/err.h>
62 #ifndef OPENSSL_NO_ENGINE
63 # include <openssl/engine.h>
65 #include <openssl/sha.h>
66 #include <openssl/x509.h>
69 const char *const STORE_object_type_string[STORE_OBJECT_TYPE_NUM + 1] = {
79 const int STORE_param_sizes[STORE_PARAM_TYPE_NUM + 1] = {
81 sizeof(int), /* EVP_TYPE */
82 sizeof(size_t), /* BITS */
83 -1, /* KEY_PARAMETERS */
84 0 /* KEY_NO_PARAMETERS */
87 const int STORE_attr_sizes[STORE_ATTR_TYPE_NUM + 1] = {
89 -1, /* FRIENDLYNAME: C string */
90 SHA_DIGEST_LENGTH, /* KEYID: SHA1 digest, 160 bits */
91 SHA_DIGEST_LENGTH, /* ISSUERKEYID: SHA1 digest, 160 bits */
92 SHA_DIGEST_LENGTH, /* SUBJECTKEYID: SHA1 digest, 160 bits */
93 SHA_DIGEST_LENGTH, /* ISSUERSERIALHASH: SHA1 digest, 160 bits */
94 sizeof(X509_NAME *), /* ISSUER: X509_NAME * */
95 sizeof(BIGNUM *), /* SERIAL: BIGNUM * */
96 sizeof(X509_NAME *), /* SUBJECT: X509_NAME * */
97 SHA_DIGEST_LENGTH, /* CERTHASH: SHA1 digest, 160 bits */
98 -1, /* EMAIL: C string */
99 -1, /* FILENAME: C string */
102 STORE *STORE_new_method(const STORE_METHOD *method)
106 if (method == NULL) {
107 STOREerr(STORE_F_STORE_NEW_METHOD, ERR_R_PASSED_NULL_PARAMETER);
111 ret = OPENSSL_malloc(sizeof(*ret));
113 STOREerr(STORE_F_STORE_NEW_METHOD, ERR_R_MALLOC_FAILURE);
119 CRYPTO_new_ex_data(CRYPTO_EX_INDEX_STORE, ret, &ret->ex_data);
120 if (ret->meth->init && !ret->meth->init(ret)) {
127 STORE *STORE_new_engine(ENGINE *engine)
131 const STORE_METHOD *meth = 0;
133 #ifdef OPENSSL_NO_ENGINE
137 if (!ENGINE_init(engine)) {
138 STOREerr(STORE_F_STORE_NEW_ENGINE, ERR_R_ENGINE_LIB);
143 STOREerr(STORE_F_STORE_NEW_ENGINE, ERR_R_PASSED_NULL_PARAMETER);
147 meth = ENGINE_get_STORE(e);
149 STOREerr(STORE_F_STORE_NEW_ENGINE, ERR_R_ENGINE_LIB);
156 ret = STORE_new_method(meth);
158 STOREerr(STORE_F_STORE_NEW_ENGINE, ERR_R_STORE_LIB);
167 void STORE_free(STORE *store)
171 if (store->meth->clean)
172 store->meth->clean(store);
173 CRYPTO_free_ex_data(CRYPTO_EX_INDEX_STORE, store, &store->ex_data);
177 int STORE_ctrl(STORE *store, int cmd, long i, void *p, void (*f) (void))
180 STOREerr(STORE_F_STORE_CTRL, ERR_R_PASSED_NULL_PARAMETER);
183 if (store->meth->ctrl)
184 return store->meth->ctrl(store, cmd, i, p, f);
185 STOREerr(STORE_F_STORE_CTRL, STORE_R_NO_CONTROL_FUNCTION);
189 int STORE_set_ex_data(STORE *r, int idx, void *arg)
191 return (CRYPTO_set_ex_data(&r->ex_data, idx, arg));
194 void *STORE_get_ex_data(STORE *r, int idx)
196 return (CRYPTO_get_ex_data(&r->ex_data, idx));
199 const STORE_METHOD *STORE_get_method(STORE *store)
204 const STORE_METHOD *STORE_set_method(STORE *store, const STORE_METHOD *meth)
212 #define check_store(s,fncode,fnname,fnerrcode) \
215 if ((s) == NULL || (s)->meth == NULL) \
217 STOREerr((fncode), ERR_R_PASSED_NULL_PARAMETER); \
220 if ((s)->meth->fnname == NULL) \
222 STOREerr((fncode), (fnerrcode)); \
230 X509 *STORE_get_certificate(STORE *s, OPENSSL_ITEM attributes[],
231 OPENSSL_ITEM parameters[])
233 STORE_OBJECT *object;
236 check_store(s, STORE_F_STORE_GET_CERTIFICATE,
237 get_object, STORE_R_NO_GET_OBJECT_FUNCTION);
239 object = s->meth->get_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE,
240 attributes, parameters);
241 if (!object || !object->data.x509.certificate) {
242 STOREerr(STORE_F_STORE_GET_CERTIFICATE,
243 STORE_R_FAILED_GETTING_CERTIFICATE);
246 X509_up_ref(object->data.x509.certificate);
248 REF_PRINT("X509", data);
250 x = object->data.x509.certificate;
251 STORE_OBJECT_free(object);
255 int STORE_store_certificate(STORE *s, X509 *data, OPENSSL_ITEM attributes[],
256 OPENSSL_ITEM parameters[])
258 STORE_OBJECT *object;
261 check_store(s, STORE_F_STORE_STORE_CERTIFICATE,
262 store_object, STORE_R_NO_STORE_OBJECT_FUNCTION);
264 object = STORE_OBJECT_new();
265 if (object == NULL) {
266 STOREerr(STORE_F_STORE_STORE_CERTIFICATE, ERR_R_MALLOC_FAILURE);
272 REF_PRINT("X509", data);
274 object->data.x509.certificate = data;
276 i = s->meth->store_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE,
277 object, attributes, parameters);
279 STORE_OBJECT_free(object);
282 STOREerr(STORE_F_STORE_STORE_CERTIFICATE,
283 STORE_R_FAILED_STORING_CERTIFICATE);
289 int STORE_modify_certificate(STORE *s, OPENSSL_ITEM search_attributes[],
290 OPENSSL_ITEM add_attributes[],
291 OPENSSL_ITEM modify_attributes[],
292 OPENSSL_ITEM delete_attributes[],
293 OPENSSL_ITEM parameters[])
295 check_store(s, STORE_F_STORE_MODIFY_CERTIFICATE,
296 modify_object, STORE_R_NO_MODIFY_OBJECT_FUNCTION);
298 if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE,
299 search_attributes, add_attributes,
300 modify_attributes, delete_attributes,
302 STOREerr(STORE_F_STORE_MODIFY_CERTIFICATE,
303 STORE_R_FAILED_MODIFYING_CERTIFICATE);
309 int STORE_revoke_certificate(STORE *s, OPENSSL_ITEM attributes[],
310 OPENSSL_ITEM parameters[])
312 check_store(s, STORE_F_STORE_REVOKE_CERTIFICATE,
313 revoke_object, STORE_R_NO_REVOKE_OBJECT_FUNCTION);
315 if (!s->meth->revoke_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE,
316 attributes, parameters)) {
317 STOREerr(STORE_F_STORE_REVOKE_CERTIFICATE,
318 STORE_R_FAILED_REVOKING_CERTIFICATE);
324 int STORE_delete_certificate(STORE *s, OPENSSL_ITEM attributes[],
325 OPENSSL_ITEM parameters[])
327 check_store(s, STORE_F_STORE_DELETE_CERTIFICATE,
328 delete_object, STORE_R_NO_DELETE_OBJECT_FUNCTION);
330 if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_X509_CERTIFICATE,
331 attributes, parameters)) {
332 STOREerr(STORE_F_STORE_DELETE_CERTIFICATE,
333 STORE_R_FAILED_DELETING_CERTIFICATE);
339 void *STORE_list_certificate_start(STORE *s, OPENSSL_ITEM attributes[],
340 OPENSSL_ITEM parameters[])
344 check_store(s, STORE_F_STORE_LIST_CERTIFICATE_START,
345 list_object_start, STORE_R_NO_LIST_OBJECT_START_FUNCTION);
347 handle = s->meth->list_object_start(s,
348 STORE_OBJECT_TYPE_X509_CERTIFICATE,
349 attributes, parameters);
351 STOREerr(STORE_F_STORE_LIST_CERTIFICATE_START,
352 STORE_R_FAILED_LISTING_CERTIFICATES);
358 X509 *STORE_list_certificate_next(STORE *s, void *handle)
360 STORE_OBJECT *object;
363 check_store(s, STORE_F_STORE_LIST_CERTIFICATE_NEXT,
364 list_object_next, STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION);
366 object = s->meth->list_object_next(s, handle);
367 if (!object || !object->data.x509.certificate) {
368 STOREerr(STORE_F_STORE_LIST_CERTIFICATE_NEXT,
369 STORE_R_FAILED_LISTING_CERTIFICATES);
372 X509_up_ref(object->data.x509.certificate);
374 REF_PRINT("X509", data);
376 x = object->data.x509.certificate;
377 STORE_OBJECT_free(object);
381 int STORE_list_certificate_end(STORE *s, void *handle)
383 check_store(s, STORE_F_STORE_LIST_CERTIFICATE_END,
384 list_object_end, STORE_R_NO_LIST_OBJECT_END_FUNCTION);
386 if (!s->meth->list_object_end(s, handle)) {
387 STOREerr(STORE_F_STORE_LIST_CERTIFICATE_END,
388 STORE_R_FAILED_LISTING_CERTIFICATES);
394 int STORE_list_certificate_endp(STORE *s, void *handle)
396 check_store(s, STORE_F_STORE_LIST_CERTIFICATE_ENDP,
397 list_object_endp, STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION);
399 if (!s->meth->list_object_endp(s, handle)) {
400 STOREerr(STORE_F_STORE_LIST_CERTIFICATE_ENDP,
401 STORE_R_FAILED_LISTING_CERTIFICATES);
407 EVP_PKEY *STORE_generate_key(STORE *s, OPENSSL_ITEM attributes[],
408 OPENSSL_ITEM parameters[])
410 STORE_OBJECT *object;
413 check_store(s, STORE_F_STORE_GENERATE_KEY,
414 generate_object, STORE_R_NO_GENERATE_OBJECT_FUNCTION);
416 object = s->meth->generate_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY,
417 attributes, parameters);
418 if (!object || !object->data.key) {
419 STOREerr(STORE_F_STORE_GENERATE_KEY, STORE_R_FAILED_GENERATING_KEY);
422 EVP_PKEY_up_ref(object->data.key);
424 REF_PRINT("EVP_PKEY", data);
426 pkey = object->data.key;
427 STORE_OBJECT_free(object);
431 EVP_PKEY *STORE_get_private_key(STORE *s, OPENSSL_ITEM attributes[],
432 OPENSSL_ITEM parameters[])
434 STORE_OBJECT *object;
437 check_store(s, STORE_F_STORE_GET_PRIVATE_KEY,
438 get_object, STORE_R_NO_GET_OBJECT_FUNCTION);
440 object = s->meth->get_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY,
441 attributes, parameters);
442 if (!object || !object->data.key || !object->data.key) {
443 STOREerr(STORE_F_STORE_GET_PRIVATE_KEY, STORE_R_FAILED_GETTING_KEY);
446 EVP_PKEY_up_ref(object->data.key);
448 REF_PRINT("EVP_PKEY", data);
450 pkey = object->data.key;
451 STORE_OBJECT_free(object);
455 int STORE_store_private_key(STORE *s, EVP_PKEY *data,
456 OPENSSL_ITEM attributes[],
457 OPENSSL_ITEM parameters[])
459 STORE_OBJECT *object;
462 check_store(s, STORE_F_STORE_STORE_PRIVATE_KEY,
463 store_object, STORE_R_NO_STORE_OBJECT_FUNCTION);
465 object = STORE_OBJECT_new();
466 if (object == NULL) {
467 STOREerr(STORE_F_STORE_STORE_PRIVATE_KEY, ERR_R_MALLOC_FAILURE);
470 object->data.key = EVP_PKEY_new();
471 if (object->data.key == NULL) {
472 STOREerr(STORE_F_STORE_STORE_PRIVATE_KEY, ERR_R_MALLOC_FAILURE);
476 EVP_PKEY_up_ref(data);
478 REF_PRINT("EVP_PKEY", data);
480 object->data.key = data;
482 i = s->meth->store_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY, object,
483 attributes, parameters);
485 STORE_OBJECT_free(object);
488 STOREerr(STORE_F_STORE_STORE_PRIVATE_KEY, STORE_R_FAILED_STORING_KEY);
494 int STORE_modify_private_key(STORE *s, OPENSSL_ITEM search_attributes[],
495 OPENSSL_ITEM add_attributes[],
496 OPENSSL_ITEM modify_attributes[],
497 OPENSSL_ITEM delete_attributes[],
498 OPENSSL_ITEM parameters[])
500 check_store(s, STORE_F_STORE_MODIFY_PRIVATE_KEY,
501 modify_object, STORE_R_NO_MODIFY_OBJECT_FUNCTION);
503 if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY,
504 search_attributes, add_attributes,
505 modify_attributes, delete_attributes,
507 STOREerr(STORE_F_STORE_MODIFY_PRIVATE_KEY,
508 STORE_R_FAILED_MODIFYING_PRIVATE_KEY);
514 int STORE_revoke_private_key(STORE *s, OPENSSL_ITEM attributes[],
515 OPENSSL_ITEM parameters[])
519 check_store(s, STORE_F_STORE_REVOKE_PRIVATE_KEY,
520 revoke_object, STORE_R_NO_REVOKE_OBJECT_FUNCTION);
522 i = s->meth->revoke_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY,
523 attributes, parameters);
526 STOREerr(STORE_F_STORE_REVOKE_PRIVATE_KEY,
527 STORE_R_FAILED_REVOKING_KEY);
533 int STORE_delete_private_key(STORE *s, OPENSSL_ITEM attributes[],
534 OPENSSL_ITEM parameters[])
536 check_store(s, STORE_F_STORE_DELETE_PRIVATE_KEY,
537 delete_object, STORE_R_NO_DELETE_OBJECT_FUNCTION);
539 if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_PRIVATE_KEY,
540 attributes, parameters)) {
541 STOREerr(STORE_F_STORE_DELETE_PRIVATE_KEY,
542 STORE_R_FAILED_DELETING_KEY);
548 void *STORE_list_private_key_start(STORE *s, OPENSSL_ITEM attributes[],
549 OPENSSL_ITEM parameters[])
553 check_store(s, STORE_F_STORE_LIST_PRIVATE_KEY_START,
554 list_object_start, STORE_R_NO_LIST_OBJECT_START_FUNCTION);
556 handle = s->meth->list_object_start(s, STORE_OBJECT_TYPE_PRIVATE_KEY,
557 attributes, parameters);
559 STOREerr(STORE_F_STORE_LIST_PRIVATE_KEY_START,
560 STORE_R_FAILED_LISTING_KEYS);
566 EVP_PKEY *STORE_list_private_key_next(STORE *s, void *handle)
568 STORE_OBJECT *object;
571 check_store(s, STORE_F_STORE_LIST_PRIVATE_KEY_NEXT,
572 list_object_next, STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION);
574 object = s->meth->list_object_next(s, handle);
575 if (!object || !object->data.key || !object->data.key) {
576 STOREerr(STORE_F_STORE_LIST_PRIVATE_KEY_NEXT,
577 STORE_R_FAILED_LISTING_KEYS);
580 EVP_PKEY_up_ref(object->data.key);
582 REF_PRINT("EVP_PKEY", data);
584 pkey = object->data.key;
585 STORE_OBJECT_free(object);
589 int STORE_list_private_key_end(STORE *s, void *handle)
591 check_store(s, STORE_F_STORE_LIST_PRIVATE_KEY_END,
592 list_object_end, STORE_R_NO_LIST_OBJECT_END_FUNCTION);
594 if (!s->meth->list_object_end(s, handle)) {
595 STOREerr(STORE_F_STORE_LIST_PRIVATE_KEY_END,
596 STORE_R_FAILED_LISTING_KEYS);
602 int STORE_list_private_key_endp(STORE *s, void *handle)
604 check_store(s, STORE_F_STORE_LIST_PRIVATE_KEY_ENDP,
605 list_object_endp, STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION);
607 if (!s->meth->list_object_endp(s, handle)) {
608 STOREerr(STORE_F_STORE_LIST_PRIVATE_KEY_ENDP,
609 STORE_R_FAILED_LISTING_KEYS);
615 EVP_PKEY *STORE_get_public_key(STORE *s, OPENSSL_ITEM attributes[],
616 OPENSSL_ITEM parameters[])
618 STORE_OBJECT *object;
621 check_store(s, STORE_F_STORE_GET_PUBLIC_KEY,
622 get_object, STORE_R_NO_GET_OBJECT_FUNCTION);
624 object = s->meth->get_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY,
625 attributes, parameters);
626 if (!object || !object->data.key || !object->data.key) {
627 STOREerr(STORE_F_STORE_GET_PUBLIC_KEY, STORE_R_FAILED_GETTING_KEY);
630 EVP_PKEY_up_ref(object->data.key);
632 REF_PRINT("EVP_PKEY", data);
634 pkey = object->data.key;
635 STORE_OBJECT_free(object);
639 int STORE_store_public_key(STORE *s, EVP_PKEY *data,
640 OPENSSL_ITEM attributes[],
641 OPENSSL_ITEM parameters[])
643 STORE_OBJECT *object;
646 check_store(s, STORE_F_STORE_STORE_PUBLIC_KEY,
647 store_object, STORE_R_NO_STORE_OBJECT_FUNCTION);
649 object = STORE_OBJECT_new();
650 if (object == NULL) {
651 STOREerr(STORE_F_STORE_STORE_PUBLIC_KEY, ERR_R_MALLOC_FAILURE);
654 object->data.key = EVP_PKEY_new();
655 if (object->data.key == NULL) {
656 STOREerr(STORE_F_STORE_STORE_PUBLIC_KEY, ERR_R_MALLOC_FAILURE);
660 EVP_PKEY_up_ref(data);
662 REF_PRINT("EVP_PKEY", data);
664 object->data.key = data;
666 i = s->meth->store_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY, object,
667 attributes, parameters);
669 STORE_OBJECT_free(object);
672 STOREerr(STORE_F_STORE_STORE_PUBLIC_KEY, STORE_R_FAILED_STORING_KEY);
678 int STORE_modify_public_key(STORE *s, OPENSSL_ITEM search_attributes[],
679 OPENSSL_ITEM add_attributes[],
680 OPENSSL_ITEM modify_attributes[],
681 OPENSSL_ITEM delete_attributes[],
682 OPENSSL_ITEM parameters[])
684 check_store(s, STORE_F_STORE_MODIFY_PUBLIC_KEY,
685 modify_object, STORE_R_NO_MODIFY_OBJECT_FUNCTION);
687 if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY,
688 search_attributes, add_attributes,
689 modify_attributes, delete_attributes,
691 STOREerr(STORE_F_STORE_MODIFY_PUBLIC_KEY,
692 STORE_R_FAILED_MODIFYING_PUBLIC_KEY);
698 int STORE_revoke_public_key(STORE *s, OPENSSL_ITEM attributes[],
699 OPENSSL_ITEM parameters[])
703 check_store(s, STORE_F_STORE_REVOKE_PUBLIC_KEY,
704 revoke_object, STORE_R_NO_REVOKE_OBJECT_FUNCTION);
706 i = s->meth->revoke_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY,
707 attributes, parameters);
710 STOREerr(STORE_F_STORE_REVOKE_PUBLIC_KEY,
711 STORE_R_FAILED_REVOKING_KEY);
717 int STORE_delete_public_key(STORE *s, OPENSSL_ITEM attributes[],
718 OPENSSL_ITEM parameters[])
720 check_store(s, STORE_F_STORE_DELETE_PUBLIC_KEY,
721 delete_object, STORE_R_NO_DELETE_OBJECT_FUNCTION);
723 if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_PUBLIC_KEY,
724 attributes, parameters)) {
725 STOREerr(STORE_F_STORE_DELETE_PUBLIC_KEY,
726 STORE_R_FAILED_DELETING_KEY);
732 void *STORE_list_public_key_start(STORE *s, OPENSSL_ITEM attributes[],
733 OPENSSL_ITEM parameters[])
737 check_store(s, STORE_F_STORE_LIST_PUBLIC_KEY_START,
738 list_object_start, STORE_R_NO_LIST_OBJECT_START_FUNCTION);
740 handle = s->meth->list_object_start(s, STORE_OBJECT_TYPE_PUBLIC_KEY,
741 attributes, parameters);
743 STOREerr(STORE_F_STORE_LIST_PUBLIC_KEY_START,
744 STORE_R_FAILED_LISTING_KEYS);
750 EVP_PKEY *STORE_list_public_key_next(STORE *s, void *handle)
752 STORE_OBJECT *object;
755 check_store(s, STORE_F_STORE_LIST_PUBLIC_KEY_NEXT,
756 list_object_next, STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION);
758 object = s->meth->list_object_next(s, handle);
759 if (!object || !object->data.key || !object->data.key) {
760 STOREerr(STORE_F_STORE_LIST_PUBLIC_KEY_NEXT,
761 STORE_R_FAILED_LISTING_KEYS);
764 EVP_PKEY_up_ref(object->data.key);
766 REF_PRINT("EVP_PKEY", data);
768 pkey = object->data.key;
769 STORE_OBJECT_free(object);
773 int STORE_list_public_key_end(STORE *s, void *handle)
775 check_store(s, STORE_F_STORE_LIST_PUBLIC_KEY_END,
776 list_object_end, STORE_R_NO_LIST_OBJECT_END_FUNCTION);
778 if (!s->meth->list_object_end(s, handle)) {
779 STOREerr(STORE_F_STORE_LIST_PUBLIC_KEY_END,
780 STORE_R_FAILED_LISTING_KEYS);
786 int STORE_list_public_key_endp(STORE *s, void *handle)
788 check_store(s, STORE_F_STORE_LIST_PUBLIC_KEY_ENDP,
789 list_object_endp, STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION);
791 if (!s->meth->list_object_endp(s, handle)) {
792 STOREerr(STORE_F_STORE_LIST_PUBLIC_KEY_ENDP,
793 STORE_R_FAILED_LISTING_KEYS);
799 X509_CRL *STORE_generate_crl(STORE *s, OPENSSL_ITEM attributes[],
800 OPENSSL_ITEM parameters[])
802 STORE_OBJECT *object;
805 check_store(s, STORE_F_STORE_GENERATE_CRL,
806 generate_object, STORE_R_NO_GENERATE_CRL_FUNCTION);
808 object = s->meth->generate_object(s, STORE_OBJECT_TYPE_X509_CRL,
809 attributes, parameters);
810 if (!object || !object->data.crl) {
811 STOREerr(STORE_F_STORE_GENERATE_CRL, STORE_R_FAILED_GENERATING_CRL);
814 X509_CRL_up_ref(object->data.crl);
816 REF_PRINT("X509_CRL", data);
818 crl = object->data.crl;
819 STORE_OBJECT_free(object);
823 X509_CRL *STORE_get_crl(STORE *s, OPENSSL_ITEM attributes[],
824 OPENSSL_ITEM parameters[])
826 STORE_OBJECT *object;
829 check_store(s, STORE_F_STORE_GET_CRL,
830 get_object, STORE_R_NO_GET_OBJECT_FUNCTION);
832 object = s->meth->get_object(s, STORE_OBJECT_TYPE_X509_CRL,
833 attributes, parameters);
834 if (!object || !object->data.crl) {
835 STOREerr(STORE_F_STORE_GET_CRL, STORE_R_FAILED_GETTING_KEY);
838 X509_CRL_up_ref(object->data.crl);
840 REF_PRINT("X509_CRL", data);
842 crl = object->data.crl;
843 STORE_OBJECT_free(object);
847 int STORE_store_crl(STORE *s, X509_CRL *data, OPENSSL_ITEM attributes[],
848 OPENSSL_ITEM parameters[])
850 STORE_OBJECT *object;
853 check_store(s, STORE_F_STORE_STORE_CRL,
854 store_object, STORE_R_NO_STORE_OBJECT_FUNCTION);
856 object = STORE_OBJECT_new();
857 if (object == NULL) {
858 STOREerr(STORE_F_STORE_STORE_CRL, ERR_R_MALLOC_FAILURE);
862 X509_CRL_up_ref(data);
864 REF_PRINT("X509_CRL", data);
866 object->data.crl = data;
868 i = s->meth->store_object(s, STORE_OBJECT_TYPE_X509_CRL, object,
869 attributes, parameters);
871 STORE_OBJECT_free(object);
874 STOREerr(STORE_F_STORE_STORE_CRL, STORE_R_FAILED_STORING_KEY);
880 int STORE_modify_crl(STORE *s, OPENSSL_ITEM search_attributes[],
881 OPENSSL_ITEM add_attributes[],
882 OPENSSL_ITEM modify_attributes[],
883 OPENSSL_ITEM delete_attributes[],
884 OPENSSL_ITEM parameters[])
886 check_store(s, STORE_F_STORE_MODIFY_CRL,
887 modify_object, STORE_R_NO_MODIFY_OBJECT_FUNCTION);
889 if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_X509_CRL,
890 search_attributes, add_attributes,
891 modify_attributes, delete_attributes,
893 STOREerr(STORE_F_STORE_MODIFY_CRL, STORE_R_FAILED_MODIFYING_CRL);
899 int STORE_delete_crl(STORE *s, OPENSSL_ITEM attributes[],
900 OPENSSL_ITEM parameters[])
902 check_store(s, STORE_F_STORE_DELETE_CRL,
903 delete_object, STORE_R_NO_DELETE_OBJECT_FUNCTION);
905 if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_X509_CRL,
906 attributes, parameters)) {
907 STOREerr(STORE_F_STORE_DELETE_CRL, STORE_R_FAILED_DELETING_KEY);
913 void *STORE_list_crl_start(STORE *s, OPENSSL_ITEM attributes[],
914 OPENSSL_ITEM parameters[])
918 check_store(s, STORE_F_STORE_LIST_CRL_START,
919 list_object_start, STORE_R_NO_LIST_OBJECT_START_FUNCTION);
921 handle = s->meth->list_object_start(s, STORE_OBJECT_TYPE_X509_CRL,
922 attributes, parameters);
924 STOREerr(STORE_F_STORE_LIST_CRL_START, STORE_R_FAILED_LISTING_KEYS);
930 X509_CRL *STORE_list_crl_next(STORE *s, void *handle)
932 STORE_OBJECT *object;
935 check_store(s, STORE_F_STORE_LIST_CRL_NEXT,
936 list_object_next, STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION);
938 object = s->meth->list_object_next(s, handle);
939 if (!object || !object->data.crl) {
940 STOREerr(STORE_F_STORE_LIST_CRL_NEXT, STORE_R_FAILED_LISTING_KEYS);
943 X509_CRL_up_ref(object->data.crl);
945 REF_PRINT("X509_CRL", data);
947 crl = object->data.crl;
948 STORE_OBJECT_free(object);
952 int STORE_list_crl_end(STORE *s, void *handle)
954 check_store(s, STORE_F_STORE_LIST_CRL_END,
955 list_object_end, STORE_R_NO_LIST_OBJECT_END_FUNCTION);
957 if (!s->meth->list_object_end(s, handle)) {
958 STOREerr(STORE_F_STORE_LIST_CRL_END, STORE_R_FAILED_LISTING_KEYS);
964 int STORE_list_crl_endp(STORE *s, void *handle)
966 check_store(s, STORE_F_STORE_LIST_CRL_ENDP,
967 list_object_endp, STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION);
969 if (!s->meth->list_object_endp(s, handle)) {
970 STOREerr(STORE_F_STORE_LIST_CRL_ENDP, STORE_R_FAILED_LISTING_KEYS);
976 int STORE_store_number(STORE *s, BIGNUM *data, OPENSSL_ITEM attributes[],
977 OPENSSL_ITEM parameters[])
979 STORE_OBJECT *object;
982 check_store(s, STORE_F_STORE_STORE_NUMBER,
983 store_object, STORE_R_NO_STORE_OBJECT_NUMBER_FUNCTION);
985 object = STORE_OBJECT_new();
986 if (object == NULL) {
987 STOREerr(STORE_F_STORE_STORE_NUMBER, ERR_R_MALLOC_FAILURE);
991 object->data.number = data;
993 i = s->meth->store_object(s, STORE_OBJECT_TYPE_NUMBER, object,
994 attributes, parameters);
996 STORE_OBJECT_free(object);
999 STOREerr(STORE_F_STORE_STORE_NUMBER, STORE_R_FAILED_STORING_NUMBER);
1005 int STORE_modify_number(STORE *s, OPENSSL_ITEM search_attributes[],
1006 OPENSSL_ITEM add_attributes[],
1007 OPENSSL_ITEM modify_attributes[],
1008 OPENSSL_ITEM delete_attributes[],
1009 OPENSSL_ITEM parameters[])
1011 check_store(s, STORE_F_STORE_MODIFY_NUMBER,
1012 modify_object, STORE_R_NO_MODIFY_OBJECT_FUNCTION);
1014 if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_NUMBER,
1015 search_attributes, add_attributes,
1016 modify_attributes, delete_attributes,
1018 STOREerr(STORE_F_STORE_MODIFY_NUMBER,
1019 STORE_R_FAILED_MODIFYING_NUMBER);
1025 BIGNUM *STORE_get_number(STORE *s, OPENSSL_ITEM attributes[],
1026 OPENSSL_ITEM parameters[])
1028 STORE_OBJECT *object;
1031 check_store(s, STORE_F_STORE_GET_NUMBER,
1032 get_object, STORE_R_NO_GET_OBJECT_NUMBER_FUNCTION);
1034 object = s->meth->get_object(s, STORE_OBJECT_TYPE_NUMBER, attributes,
1036 if (!object || !object->data.number) {
1037 STOREerr(STORE_F_STORE_GET_NUMBER, STORE_R_FAILED_GETTING_NUMBER);
1040 n = object->data.number;
1041 object->data.number = NULL;
1042 STORE_OBJECT_free(object);
1046 int STORE_delete_number(STORE *s, OPENSSL_ITEM attributes[],
1047 OPENSSL_ITEM parameters[])
1049 check_store(s, STORE_F_STORE_DELETE_NUMBER,
1050 delete_object, STORE_R_NO_DELETE_NUMBER_FUNCTION);
1052 if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_NUMBER, attributes,
1054 STOREerr(STORE_F_STORE_DELETE_NUMBER, STORE_R_FAILED_DELETING_NUMBER);
1060 int STORE_store_arbitrary(STORE *s, BUF_MEM *data, OPENSSL_ITEM attributes[],
1061 OPENSSL_ITEM parameters[])
1063 STORE_OBJECT *object;
1066 check_store(s, STORE_F_STORE_STORE_ARBITRARY,
1067 store_object, STORE_R_NO_STORE_OBJECT_ARBITRARY_FUNCTION);
1069 object = STORE_OBJECT_new();
1070 if (object == NULL) {
1071 STOREerr(STORE_F_STORE_STORE_ARBITRARY, ERR_R_MALLOC_FAILURE);
1075 object->data.arbitrary = data;
1077 i = s->meth->store_object(s, STORE_OBJECT_TYPE_ARBITRARY, object,
1078 attributes, parameters);
1080 STORE_OBJECT_free(object);
1083 STOREerr(STORE_F_STORE_STORE_ARBITRARY,
1084 STORE_R_FAILED_STORING_ARBITRARY);
1090 int STORE_modify_arbitrary(STORE *s, OPENSSL_ITEM search_attributes[],
1091 OPENSSL_ITEM add_attributes[],
1092 OPENSSL_ITEM modify_attributes[],
1093 OPENSSL_ITEM delete_attributes[],
1094 OPENSSL_ITEM parameters[])
1096 check_store(s, STORE_F_STORE_MODIFY_ARBITRARY,
1097 modify_object, STORE_R_NO_MODIFY_OBJECT_FUNCTION);
1099 if (!s->meth->modify_object(s, STORE_OBJECT_TYPE_ARBITRARY,
1100 search_attributes, add_attributes,
1101 modify_attributes, delete_attributes,
1103 STOREerr(STORE_F_STORE_MODIFY_ARBITRARY,
1104 STORE_R_FAILED_MODIFYING_ARBITRARY);
1110 BUF_MEM *STORE_get_arbitrary(STORE *s, OPENSSL_ITEM attributes[],
1111 OPENSSL_ITEM parameters[])
1113 STORE_OBJECT *object;
1116 check_store(s, STORE_F_STORE_GET_ARBITRARY,
1117 get_object, STORE_R_NO_GET_OBJECT_ARBITRARY_FUNCTION);
1119 object = s->meth->get_object(s, STORE_OBJECT_TYPE_ARBITRARY,
1120 attributes, parameters);
1121 if (!object || !object->data.arbitrary) {
1122 STOREerr(STORE_F_STORE_GET_ARBITRARY,
1123 STORE_R_FAILED_GETTING_ARBITRARY);
1126 b = object->data.arbitrary;
1127 object->data.arbitrary = NULL;
1128 STORE_OBJECT_free(object);
1132 int STORE_delete_arbitrary(STORE *s, OPENSSL_ITEM attributes[],
1133 OPENSSL_ITEM parameters[])
1135 check_store(s, STORE_F_STORE_DELETE_ARBITRARY,
1136 delete_object, STORE_R_NO_DELETE_ARBITRARY_FUNCTION);
1138 if (!s->meth->delete_object(s, STORE_OBJECT_TYPE_ARBITRARY, attributes,
1140 STOREerr(STORE_F_STORE_DELETE_ARBITRARY,
1141 STORE_R_FAILED_DELETING_ARBITRARY);
1147 STORE_OBJECT *STORE_OBJECT_new(void)
1149 STORE_OBJECT *object = OPENSSL_zalloc(sizeof(*object));
1153 void STORE_OBJECT_free(STORE_OBJECT *data)
1157 switch (data->type) {
1158 case STORE_OBJECT_TYPE_X509_CERTIFICATE:
1159 X509_free(data->data.x509.certificate);
1161 case STORE_OBJECT_TYPE_X509_CRL:
1162 X509_CRL_free(data->data.crl);
1164 case STORE_OBJECT_TYPE_PRIVATE_KEY:
1165 case STORE_OBJECT_TYPE_PUBLIC_KEY:
1166 EVP_PKEY_free(data->data.key);
1168 case STORE_OBJECT_TYPE_NUMBER:
1169 BN_free(data->data.number);
1171 case STORE_OBJECT_TYPE_ARBITRARY:
1172 BUF_MEM_free(data->data.arbitrary);
1178 struct STORE_attr_info_st {
1179 unsigned char set[(STORE_ATTR_TYPE_NUM + 8) / 8];
1182 unsigned char *sha1string;
1186 } values[STORE_ATTR_TYPE_NUM + 1];
1187 size_t value_sizes[STORE_ATTR_TYPE_NUM + 1];
1190 #define ATTR_IS_SET(a,i) ((i) > 0 && (i) < STORE_ATTR_TYPE_NUM \
1191 && ((a)->set[(i) / 8] & (1 << ((i) % 8))))
1192 #define SET_ATTRBIT(a,i) ((a)->set[(i) / 8] |= (1 << ((i) % 8)))
1193 #define CLEAR_ATTRBIT(a,i) ((a)->set[(i) / 8] &= ~(1 << ((i) % 8)))
1195 STORE_ATTR_INFO *STORE_ATTR_INFO_new(void)
1197 STORE_ATTR_INFO *p = OPENSSL_malloc(sizeof(*p));
1202 static void STORE_ATTR_INFO_attr_free(STORE_ATTR_INFO *attrs,
1203 STORE_ATTR_TYPES code)
1205 if (ATTR_IS_SET(attrs, code)) {
1207 case STORE_ATTR_FRIENDLYNAME:
1208 case STORE_ATTR_EMAIL:
1209 case STORE_ATTR_FILENAME:
1210 STORE_ATTR_INFO_modify_cstr(attrs, code, NULL, 0);
1212 case STORE_ATTR_KEYID:
1213 case STORE_ATTR_ISSUERKEYID:
1214 case STORE_ATTR_SUBJECTKEYID:
1215 case STORE_ATTR_ISSUERSERIALHASH:
1216 case STORE_ATTR_CERTHASH:
1217 STORE_ATTR_INFO_modify_sha1str(attrs, code, NULL, 0);
1219 case STORE_ATTR_ISSUER:
1220 case STORE_ATTR_SUBJECT:
1221 STORE_ATTR_INFO_modify_dn(attrs, code, NULL);
1223 case STORE_ATTR_SERIAL:
1224 STORE_ATTR_INFO_modify_number(attrs, code, NULL);
1232 int STORE_ATTR_INFO_free(STORE_ATTR_INFO *attrs)
1236 for (i = 0; i++ < STORE_ATTR_TYPE_NUM;)
1237 STORE_ATTR_INFO_attr_free(attrs, i);
1238 OPENSSL_free(attrs);
1243 char *STORE_ATTR_INFO_get0_cstr(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code)
1246 STOREerr(STORE_F_STORE_ATTR_INFO_GET0_CSTR,
1247 ERR_R_PASSED_NULL_PARAMETER);
1250 if (ATTR_IS_SET(attrs, code))
1251 return attrs->values[code].cstring;
1252 STOREerr(STORE_F_STORE_ATTR_INFO_GET0_CSTR, STORE_R_NO_VALUE);
1256 unsigned char *STORE_ATTR_INFO_get0_sha1str(STORE_ATTR_INFO *attrs,
1257 STORE_ATTR_TYPES code)
1260 STOREerr(STORE_F_STORE_ATTR_INFO_GET0_SHA1STR,
1261 ERR_R_PASSED_NULL_PARAMETER);
1264 if (ATTR_IS_SET(attrs, code))
1265 return attrs->values[code].sha1string;
1266 STOREerr(STORE_F_STORE_ATTR_INFO_GET0_SHA1STR, STORE_R_NO_VALUE);
1270 X509_NAME *STORE_ATTR_INFO_get0_dn(STORE_ATTR_INFO *attrs,
1271 STORE_ATTR_TYPES code)
1274 STOREerr(STORE_F_STORE_ATTR_INFO_GET0_DN,
1275 ERR_R_PASSED_NULL_PARAMETER);
1278 if (ATTR_IS_SET(attrs, code))
1279 return attrs->values[code].dn;
1280 STOREerr(STORE_F_STORE_ATTR_INFO_GET0_DN, STORE_R_NO_VALUE);
1284 BIGNUM *STORE_ATTR_INFO_get0_number(STORE_ATTR_INFO *attrs,
1285 STORE_ATTR_TYPES code)
1288 STOREerr(STORE_F_STORE_ATTR_INFO_GET0_NUMBER,
1289 ERR_R_PASSED_NULL_PARAMETER);
1292 if (ATTR_IS_SET(attrs, code))
1293 return attrs->values[code].number;
1294 STOREerr(STORE_F_STORE_ATTR_INFO_GET0_NUMBER, STORE_R_NO_VALUE);
1298 int STORE_ATTR_INFO_set_cstr(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
1299 char *cstr, size_t cstr_size)
1302 STOREerr(STORE_F_STORE_ATTR_INFO_SET_CSTR,
1303 ERR_R_PASSED_NULL_PARAMETER);
1306 if (!ATTR_IS_SET(attrs, code)) {
1307 if ((attrs->values[code].cstring = OPENSSL_strndup(cstr, cstr_size)))
1309 STOREerr(STORE_F_STORE_ATTR_INFO_SET_CSTR, ERR_R_MALLOC_FAILURE);
1312 STOREerr(STORE_F_STORE_ATTR_INFO_SET_CSTR, STORE_R_ALREADY_HAS_A_VALUE);
1316 int STORE_ATTR_INFO_set_sha1str(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
1317 unsigned char *sha1str, size_t sha1str_size)
1320 STOREerr(STORE_F_STORE_ATTR_INFO_SET_SHA1STR,
1321 ERR_R_PASSED_NULL_PARAMETER);
1324 if (!ATTR_IS_SET(attrs, code)) {
1325 if ((attrs->values[code].sha1string =
1326 (unsigned char *)OPENSSL_memdup(sha1str, sha1str_size)))
1328 STOREerr(STORE_F_STORE_ATTR_INFO_SET_SHA1STR, ERR_R_MALLOC_FAILURE);
1331 STOREerr(STORE_F_STORE_ATTR_INFO_SET_SHA1STR,
1332 STORE_R_ALREADY_HAS_A_VALUE);
1336 int STORE_ATTR_INFO_set_dn(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
1340 STOREerr(STORE_F_STORE_ATTR_INFO_SET_DN, ERR_R_PASSED_NULL_PARAMETER);
1343 if (!ATTR_IS_SET(attrs, code)) {
1344 if ((attrs->values[code].dn = X509_NAME_dup(dn)))
1346 STOREerr(STORE_F_STORE_ATTR_INFO_SET_DN, ERR_R_MALLOC_FAILURE);
1349 STOREerr(STORE_F_STORE_ATTR_INFO_SET_DN, STORE_R_ALREADY_HAS_A_VALUE);
1353 int STORE_ATTR_INFO_set_number(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
1357 STOREerr(STORE_F_STORE_ATTR_INFO_SET_NUMBER,
1358 ERR_R_PASSED_NULL_PARAMETER);
1361 if (!ATTR_IS_SET(attrs, code)) {
1362 if ((attrs->values[code].number = BN_dup(number)))
1364 STOREerr(STORE_F_STORE_ATTR_INFO_SET_NUMBER, ERR_R_MALLOC_FAILURE);
1367 STOREerr(STORE_F_STORE_ATTR_INFO_SET_NUMBER, STORE_R_ALREADY_HAS_A_VALUE);
1371 int STORE_ATTR_INFO_modify_cstr(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
1372 char *cstr, size_t cstr_size)
1375 STOREerr(STORE_F_STORE_ATTR_INFO_MODIFY_CSTR,
1376 ERR_R_PASSED_NULL_PARAMETER);
1379 if (ATTR_IS_SET(attrs, code)) {
1380 OPENSSL_free(attrs->values[code].cstring);
1381 attrs->values[code].cstring = NULL;
1382 CLEAR_ATTRBIT(attrs, code);
1384 return STORE_ATTR_INFO_set_cstr(attrs, code, cstr, cstr_size);
1387 int STORE_ATTR_INFO_modify_sha1str(STORE_ATTR_INFO *attrs,
1388 STORE_ATTR_TYPES code,
1389 unsigned char *sha1str,
1390 size_t sha1str_size)
1393 STOREerr(STORE_F_STORE_ATTR_INFO_MODIFY_SHA1STR,
1394 ERR_R_PASSED_NULL_PARAMETER);
1397 if (ATTR_IS_SET(attrs, code)) {
1398 OPENSSL_free(attrs->values[code].sha1string);
1399 attrs->values[code].sha1string = NULL;
1400 CLEAR_ATTRBIT(attrs, code);
1402 return STORE_ATTR_INFO_set_sha1str(attrs, code, sha1str, sha1str_size);
1405 int STORE_ATTR_INFO_modify_dn(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
1409 STOREerr(STORE_F_STORE_ATTR_INFO_MODIFY_DN,
1410 ERR_R_PASSED_NULL_PARAMETER);
1413 if (ATTR_IS_SET(attrs, code)) {
1414 OPENSSL_free(attrs->values[code].dn);
1415 attrs->values[code].dn = NULL;
1416 CLEAR_ATTRBIT(attrs, code);
1418 return STORE_ATTR_INFO_set_dn(attrs, code, dn);
1421 int STORE_ATTR_INFO_modify_number(STORE_ATTR_INFO *attrs,
1422 STORE_ATTR_TYPES code, BIGNUM *number)
1425 STOREerr(STORE_F_STORE_ATTR_INFO_MODIFY_NUMBER,
1426 ERR_R_PASSED_NULL_PARAMETER);
1429 if (ATTR_IS_SET(attrs, code)) {
1430 OPENSSL_free(attrs->values[code].number);
1431 attrs->values[code].number = NULL;
1432 CLEAR_ATTRBIT(attrs, code);
1434 return STORE_ATTR_INFO_set_number(attrs, code, number);
1437 struct attr_list_ctx_st {
1438 OPENSSL_ITEM *attributes;
1440 void *STORE_parse_attrs_start(OPENSSL_ITEM *attributes)
1443 struct attr_list_ctx_st *context = OPENSSL_malloc(sizeof(*context));
1444 if (context != NULL)
1445 context->attributes = attributes;
1447 STOREerr(STORE_F_STORE_PARSE_ATTRS_START, ERR_R_MALLOC_FAILURE);
1450 STOREerr(STORE_F_STORE_PARSE_ATTRS_START, ERR_R_PASSED_NULL_PARAMETER);
1454 STORE_ATTR_INFO *STORE_parse_attrs_next(void *handle)
1456 struct attr_list_ctx_st *context = (struct attr_list_ctx_st *)handle;
1458 if (context && context->attributes) {
1459 STORE_ATTR_INFO *attrs = NULL;
1461 while (context->attributes
1462 && context->attributes->code != STORE_ATTR_OR
1463 && context->attributes->code != STORE_ATTR_END) {
1464 switch (context->attributes->code) {
1465 case STORE_ATTR_FRIENDLYNAME:
1466 case STORE_ATTR_EMAIL:
1467 case STORE_ATTR_FILENAME:
1469 attrs = STORE_ATTR_INFO_new();
1470 if (attrs == NULL) {
1471 STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT,
1472 ERR_R_MALLOC_FAILURE);
1475 STORE_ATTR_INFO_set_cstr(attrs,
1476 context->attributes->code,
1477 context->attributes->value,
1478 context->attributes->value_size);
1480 case STORE_ATTR_KEYID:
1481 case STORE_ATTR_ISSUERKEYID:
1482 case STORE_ATTR_SUBJECTKEYID:
1483 case STORE_ATTR_ISSUERSERIALHASH:
1484 case STORE_ATTR_CERTHASH:
1486 attrs = STORE_ATTR_INFO_new();
1487 if (attrs == NULL) {
1488 STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT,
1489 ERR_R_MALLOC_FAILURE);
1492 STORE_ATTR_INFO_set_sha1str(attrs,
1493 context->attributes->code,
1494 context->attributes->value,
1495 context->attributes->value_size);
1497 case STORE_ATTR_ISSUER:
1498 case STORE_ATTR_SUBJECT:
1500 attrs = STORE_ATTR_INFO_new();
1501 if (attrs == NULL) {
1502 STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT,
1503 ERR_R_MALLOC_FAILURE);
1506 STORE_ATTR_INFO_modify_dn(attrs,
1507 context->attributes->code,
1508 context->attributes->value);
1510 case STORE_ATTR_SERIAL:
1512 attrs = STORE_ATTR_INFO_new();
1513 if (attrs == NULL) {
1514 STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT,
1515 ERR_R_MALLOC_FAILURE);
1518 STORE_ATTR_INFO_modify_number(attrs,
1519 context->attributes->code,
1520 context->attributes->value);
1523 context->attributes++;
1525 if (context->attributes->code == STORE_ATTR_OR)
1526 context->attributes++;
1529 while (context->attributes
1530 && context->attributes->code != STORE_ATTR_OR
1531 && context->attributes->code != STORE_ATTR_END)
1532 context->attributes++;
1533 if (context->attributes->code == STORE_ATTR_OR)
1534 context->attributes++;
1537 STOREerr(STORE_F_STORE_PARSE_ATTRS_NEXT, ERR_R_PASSED_NULL_PARAMETER);
1541 int STORE_parse_attrs_end(void *handle)
1543 struct attr_list_ctx_st *context = (struct attr_list_ctx_st *)handle;
1545 if (context && context->attributes) {
1547 OPENSSL_ITEM *attributes = context->attributes;
1549 OPENSSL_free(context);
1552 STOREerr(STORE_F_STORE_PARSE_ATTRS_END, ERR_R_PASSED_NULL_PARAMETER);
1556 int STORE_parse_attrs_endp(void *handle)
1558 struct attr_list_ctx_st *context = (struct attr_list_ctx_st *)handle;
1560 if (context && context->attributes) {
1561 return context->attributes->code == STORE_ATTR_END;
1563 STOREerr(STORE_F_STORE_PARSE_ATTRS_ENDP, ERR_R_PASSED_NULL_PARAMETER);
1567 static int attr_info_compare_compute_range(const unsigned char *abits,
1568 const unsigned char *bbits,
1569 unsigned int *alowp,
1570 unsigned int *ahighp,
1571 unsigned int *blowp,
1572 unsigned int *bhighp)
1574 unsigned int alow = (unsigned int)-1, ahigh = 0;
1575 unsigned int blow = (unsigned int)-1, bhigh = 0;
1578 for (i = 0; i < (STORE_ATTR_TYPE_NUM + 8) / 8; i++, abits++, bbits++) {
1580 if (*abits < *bbits)
1582 if (*abits > *bbits)
1586 if (alow == (unsigned int)-1) {
1588 if (!(*abits & 0x01))
1590 if (!(*abits & 0x02))
1592 if (!(*abits & 0x04))
1594 if (!(*abits & 0x08))
1596 if (!(*abits & 0x10))
1598 if (!(*abits & 0x20))
1600 if (!(*abits & 0x40))
1604 if (!(*abits & 0x80))
1606 if (!(*abits & 0x40))
1608 if (!(*abits & 0x20))
1610 if (!(*abits & 0x10))
1612 if (!(*abits & 0x08))
1614 if (!(*abits & 0x04))
1616 if (!(*abits & 0x02))
1620 if (blow == (unsigned int)-1) {
1622 if (!(*bbits & 0x01))
1624 if (!(*bbits & 0x02))
1626 if (!(*bbits & 0x04))
1628 if (!(*bbits & 0x08))
1630 if (!(*bbits & 0x10))
1632 if (!(*bbits & 0x20))
1634 if (!(*bbits & 0x40))
1638 if (!(*bbits & 0x80))
1640 if (!(*bbits & 0x40))
1642 if (!(*bbits & 0x20))
1644 if (!(*bbits & 0x10))
1646 if (!(*bbits & 0x08))
1648 if (!(*bbits & 0x04))
1650 if (!(*bbits & 0x02))
1654 if (ahigh + alow < bhigh + blow)
1656 if (ahigh + alow > bhigh + blow)
1669 int STORE_ATTR_INFO_compare(const STORE_ATTR_INFO *const *a,
1670 const STORE_ATTR_INFO *const *b)
1678 return attr_info_compare_compute_range((*a)->set, (*b)->set, 0, 0, 0, 0);
1681 int STORE_ATTR_INFO_in_range(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b)
1683 unsigned int alow, ahigh, blow, bhigh;
1691 attr_info_compare_compute_range(a->set, b->set,
1692 &alow, &ahigh, &blow, &bhigh);
1693 if (alow >= blow && ahigh <= bhigh)
1698 int STORE_ATTR_INFO_in(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b)
1700 unsigned char *abits, *bbits;
1711 for (i = 0; i < (STORE_ATTR_TYPE_NUM + 8) / 8; i++, abits++, bbits++) {
1712 if (*abits && (*bbits & *abits) != *abits)
1718 int STORE_ATTR_INFO_in_ex(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b)
1724 if (!STORE_ATTR_INFO_in(a, b))
1726 for (i = 1; i < STORE_ATTR_TYPE_NUM; i++)
1727 if (ATTR_IS_SET(a, i)) {
1729 case STORE_ATTR_FRIENDLYNAME:
1730 case STORE_ATTR_EMAIL:
1731 case STORE_ATTR_FILENAME:
1732 if (strcmp(a->values[i].cstring, b->values[i].cstring))
1735 case STORE_ATTR_KEYID:
1736 case STORE_ATTR_ISSUERKEYID:
1737 case STORE_ATTR_SUBJECTKEYID:
1738 case STORE_ATTR_ISSUERSERIALHASH:
1739 case STORE_ATTR_CERTHASH:
1740 if (memcmp(a->values[i].sha1string,
1741 b->values[i].sha1string, a->value_sizes[i]))
1744 case STORE_ATTR_ISSUER:
1745 case STORE_ATTR_SUBJECT:
1746 if (X509_NAME_cmp(a->values[i].dn, b->values[i].dn))
1749 case STORE_ATTR_SERIAL:
1750 if (BN_cmp(a->values[i].number, b->values[i].number))