| 
									
										
										
										
											2019-02-20 06:07:57 +08:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2021-03-11 21:27:36 +08:00
										 |  |  |  * Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2019-02-20 06:07:57 +08:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Licensed under the Apache License 2.0 (the "License").  You may not use | 
					
						
							|  |  |  |  * this file except in compliance with the License.  You can obtain a copy | 
					
						
							|  |  |  |  * in the file LICENSE in the source distribution or at | 
					
						
							|  |  |  |  * https://www.openssl.org/source/license.html
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-22 19:07:48 +08:00
										 |  |  | #include <string.h>
 | 
					
						
							| 
									
										
										
										
											2019-02-20 06:07:57 +08:00
										 |  |  | #include <openssl/err.h>
 | 
					
						
							|  |  |  | #include <openssl/cryptoerr.h>
 | 
					
						
							|  |  |  | #include <openssl/provider.h>
 | 
					
						
							| 
									
										
										
										
											2020-08-09 16:06:52 +08:00
										 |  |  | #include <openssl/core_names.h>
 | 
					
						
							| 
									
										
										
										
											2019-02-20 06:07:57 +08:00
										 |  |  | #include "internal/provider.h"
 | 
					
						
							| 
									
										
										
										
											2021-06-22 19:07:48 +08:00
										 |  |  | #include "provider_local.h"
 | 
					
						
							| 
									
										
										
										
											2019-02-20 06:07:57 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-18 07:16:26 +08:00
										 |  |  | OSSL_PROVIDER *OSSL_PROVIDER_try_load(OSSL_LIB_CTX *libctx, const char *name, | 
					
						
							|  |  |  |                                       int retain_fallbacks) | 
					
						
							| 
									
										
										
										
											2019-02-20 06:07:57 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-06-22 22:39:40 +08:00
										 |  |  |     OSSL_PROVIDER *prov = NULL, *actual; | 
					
						
							| 
									
										
										
										
											2021-06-21 16:23:30 +08:00
										 |  |  |     int isnew = 0; | 
					
						
							| 
									
										
										
										
											2019-02-20 06:07:57 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* Find it or create it */ | 
					
						
							| 
									
										
										
										
											2021-06-21 16:23:30 +08:00
										 |  |  |     if ((prov = ossl_provider_find(libctx, name, 0)) == NULL) { | 
					
						
							|  |  |  |         if ((prov = ossl_provider_new(libctx, name, NULL, 0)) == NULL) | 
					
						
							|  |  |  |             return NULL; | 
					
						
							|  |  |  |         isnew = 1; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-02-20 06:07:57 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-21 19:08:39 +08:00
										 |  |  |     if (!ossl_provider_activate(prov, 1, 0)) { | 
					
						
							| 
									
										
										
										
											2019-02-20 06:07:57 +08:00
										 |  |  |         ossl_provider_free(prov); | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-22 22:39:40 +08:00
										 |  |  |     actual = prov; | 
					
						
							|  |  |  |     if (isnew && !ossl_provider_add_to_store(prov, &actual, retain_fallbacks)) { | 
					
						
							| 
									
										
										
										
											2021-11-05 21:42:40 +08:00
										 |  |  |         ossl_provider_deactivate(prov, 1); | 
					
						
							| 
									
										
										
										
											2021-06-21 16:23:30 +08:00
										 |  |  |         ossl_provider_free(prov); | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-11-09 22:20:31 +08:00
										 |  |  |     if (actual != prov) { | 
					
						
							|  |  |  |         if (!ossl_provider_activate(actual, 1, 0)) { | 
					
						
							|  |  |  |             ossl_provider_free(actual); | 
					
						
							|  |  |  |             return NULL; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-06-21 16:23:30 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-22 22:39:40 +08:00
										 |  |  |     return actual; | 
					
						
							| 
									
										
										
										
											2019-02-20 06:07:57 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-15 17:55:50 +08:00
										 |  |  | OSSL_PROVIDER *OSSL_PROVIDER_load(OSSL_LIB_CTX *libctx, const char *name) | 
					
						
							| 
									
										
										
										
											2020-08-13 08:02:01 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     /* Any attempt to load a provider disables auto-loading of defaults */ | 
					
						
							|  |  |  |     if (ossl_provider_disable_fallback_loading(libctx)) | 
					
						
							| 
									
										
										
										
											2021-02-18 07:16:26 +08:00
										 |  |  |         return OSSL_PROVIDER_try_load(libctx, name, 0); | 
					
						
							| 
									
										
										
										
											2020-08-13 08:02:01 +08:00
										 |  |  |     return NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-20 06:07:57 +08:00
										 |  |  | int OSSL_PROVIDER_unload(OSSL_PROVIDER *prov) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2021-11-05 21:42:40 +08:00
										 |  |  |     if (!ossl_provider_deactivate(prov, 1)) | 
					
						
							| 
									
										
										
										
											2020-12-16 22:15:06 +08:00
										 |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2019-02-20 06:07:57 +08:00
										 |  |  |     ossl_provider_free(prov); | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-15 02:17:39 +08:00
										 |  |  | const OSSL_PARAM *OSSL_PROVIDER_gettable_params(const OSSL_PROVIDER *prov) | 
					
						
							| 
									
										
										
										
											2019-02-20 06:07:57 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-08-15 02:17:39 +08:00
										 |  |  |     return ossl_provider_gettable_params(prov); | 
					
						
							| 
									
										
										
										
											2019-02-20 06:07:57 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-24 12:43:55 +08:00
										 |  |  | int OSSL_PROVIDER_get_params(const OSSL_PROVIDER *prov, OSSL_PARAM params[]) | 
					
						
							| 
									
										
										
										
											2019-02-20 06:07:57 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     return ossl_provider_get_params(prov, params); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-04 22:28:15 +08:00
										 |  |  | const OSSL_ALGORITHM *OSSL_PROVIDER_query_operation(const OSSL_PROVIDER *prov, | 
					
						
							|  |  |  |                                                     int operation_id, | 
					
						
							|  |  |  |                                                     int *no_cache) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return ossl_provider_query_operation(prov, operation_id, no_cache); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-25 08:19:19 +08:00
										 |  |  | void OSSL_PROVIDER_unquery_operation(const OSSL_PROVIDER *prov, | 
					
						
							|  |  |  |                                      int operation_id, | 
					
						
							|  |  |  |                                      const OSSL_ALGORITHM *algs) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     ossl_provider_unquery_operation(prov, operation_id, algs); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-08 23:44:02 +08:00
										 |  |  | void *OSSL_PROVIDER_get0_provider_ctx(const OSSL_PROVIDER *prov) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return ossl_provider_prov_ctx(prov); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2020-05-04 22:28:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-21 23:51:41 +08:00
										 |  |  | const OSSL_DISPATCH *OSSL_PROVIDER_get0_dispatch(const OSSL_PROVIDER *prov) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return ossl_provider_get0_dispatch(prov); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-09 16:06:52 +08:00
										 |  |  | int OSSL_PROVIDER_self_test(const OSSL_PROVIDER *prov) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return ossl_provider_self_test(prov); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-18 22:13:09 +08:00
										 |  |  | int OSSL_PROVIDER_get_capabilities(const OSSL_PROVIDER *prov, | 
					
						
							|  |  |  |                                    const char *capability, | 
					
						
							|  |  |  |                                    OSSL_CALLBACK *cb, | 
					
						
							|  |  |  |                                    void *arg) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return ossl_provider_get_capabilities(prov, capability, cb, arg); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-22 19:07:48 +08:00
										 |  |  | int OSSL_PROVIDER_add_builtin(OSSL_LIB_CTX *libctx, const char *name, | 
					
						
							|  |  |  |                               OSSL_provider_init_fn *init_fn) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     OSSL_PROVIDER_INFO entry; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (name == NULL || init_fn == NULL) { | 
					
						
							|  |  |  |         ERR_raise(ERR_LIB_CRYPTO, ERR_R_PASSED_NULL_PARAMETER); | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     memset(&entry, 0, sizeof(entry)); | 
					
						
							|  |  |  |     entry.name = OPENSSL_strdup(name); | 
					
						
							| 
									
										
										
										
											2022-09-29 19:57:34 +08:00
										 |  |  |     if (entry.name == NULL) | 
					
						
							| 
									
										
										
										
											2021-06-22 19:07:48 +08:00
										 |  |  |         return 0; | 
					
						
							|  |  |  |     entry.init = init_fn; | 
					
						
							|  |  |  |     if (!ossl_provider_info_add_to_store(libctx, &entry)) { | 
					
						
							|  |  |  |         ossl_provider_info_clear(&entry); | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-28 22:57:22 +08:00
										 |  |  | const char *OSSL_PROVIDER_get0_name(const OSSL_PROVIDER *prov) | 
					
						
							| 
									
										
										
										
											2019-07-11 05:00:22 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     return ossl_provider_name(prov); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2020-05-18 18:43:12 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-15 17:55:50 +08:00
										 |  |  | int OSSL_PROVIDER_do_all(OSSL_LIB_CTX *ctx, | 
					
						
							| 
									
										
										
										
											2020-05-18 18:43:12 +08:00
										 |  |  |                          int (*cb)(OSSL_PROVIDER *provider, | 
					
						
							|  |  |  |                                    void *cbdata), | 
					
						
							|  |  |  |                          void *cbdata) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2021-03-10 17:37:02 +08:00
										 |  |  |     return ossl_provider_doall_activated(ctx, cb, cbdata); | 
					
						
							| 
									
										
										
										
											2020-05-18 18:43:12 +08:00
										 |  |  | } |