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
))