| 
									
										
										
										
											2019-02-20 06:07:57 +08:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2020-06-04 21:33:57 +08:00
										 |  |  |  * Copyright 2019-2020 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
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #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"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-15 17:55:50 +08:00
										 |  |  | OSSL_PROVIDER *OSSL_PROVIDER_try_load(OSSL_LIB_CTX *libctx, const char *name) | 
					
						
							| 
									
										
										
										
											2019-02-20 06:07:57 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     OSSL_PROVIDER *prov = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Find it or create it */ | 
					
						
							| 
									
										
										
										
											2019-07-30 23:42:53 +08:00
										 |  |  |     if ((prov = ossl_provider_find(libctx, name, 0)) == NULL | 
					
						
							|  |  |  |         && (prov = ossl_provider_new(libctx, name, NULL, 0)) == NULL) | 
					
						
							| 
									
										
										
										
											2019-02-20 06:07:57 +08:00
										 |  |  |         return NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!ossl_provider_activate(prov)) { | 
					
						
							|  |  |  |         ossl_provider_free(prov); | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return prov; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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)) | 
					
						
							|  |  |  |         return OSSL_PROVIDER_try_load(libctx, name); | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-20 06:07:57 +08:00
										 |  |  | int OSSL_PROVIDER_unload(OSSL_PROVIDER *prov) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     ossl_provider_free(prov); | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-15 17:55:50 +08:00
										 |  |  | int OSSL_PROVIDER_available(OSSL_LIB_CTX *libctx, const char *name) | 
					
						
							| 
									
										
										
										
											2019-07-17 17:29:04 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     OSSL_PROVIDER *prov = NULL; | 
					
						
							|  |  |  |     int available = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Find it or create it */ | 
					
						
							| 
									
										
										
										
											2019-07-30 23:42:53 +08:00
										 |  |  |     prov = ossl_provider_find(libctx, name, 0); | 
					
						
							| 
									
										
										
										
											2019-07-17 17:29:04 +08:00
										 |  |  |     available = ossl_provider_available(prov); | 
					
						
							|  |  |  |     ossl_provider_free(prov); | 
					
						
							|  |  |  |     return available; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-15 17:55:50 +08:00
										 |  |  | int OSSL_PROVIDER_add_builtin(OSSL_LIB_CTX *libctx, const char *name, | 
					
						
							| 
									
										
										
										
											2019-02-20 06:07:57 +08:00
										 |  |  |                               OSSL_provider_init_fn *init_fn) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     OSSL_PROVIDER *prov = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (name == NULL || init_fn == NULL) { | 
					
						
							|  |  |  |         CRYPTOerr(CRYPTO_F_OSSL_PROVIDER_ADD_BUILTIN, | 
					
						
							|  |  |  |                   ERR_R_PASSED_NULL_PARAMETER); | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Create it */ | 
					
						
							| 
									
										
										
										
											2019-07-30 23:42:53 +08:00
										 |  |  |     if ((prov = ossl_provider_new(libctx, name, init_fn, 0)) == NULL) | 
					
						
							| 
									
										
										
										
											2019-02-20 06:07:57 +08:00
										 |  |  |         return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /*
 | 
					
						
							|  |  |  |      * It's safely stored in the internal store at this point, | 
					
						
							|  |  |  |      * free the returned extra reference | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     ossl_provider_free(prov); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2019-07-11 05:00:22 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | const char *OSSL_PROVIDER_name(const OSSL_PROVIDER *prov) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     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) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return ossl_provider_forall_loaded(ctx, cb, cbdata); | 
					
						
							|  |  |  | } |