| 
									
										
										
										
											2019-02-20 06:07:57 +08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright 2019 The OpenSSL Project Authors. All Rights Reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 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>
 | 
					
						
							|  |  |  | #include "internal/provider.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | OSSL_PROVIDER *OSSL_PROVIDER_load(OPENSSL_CTX *libctx, const char *name) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     OSSL_PROVIDER *prov = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Find it or create it */ | 
					
						
							|  |  |  |     if ((prov = ossl_provider_find(libctx, name)) == NULL | 
					
						
							|  |  |  |         && (prov = ossl_provider_new(libctx, name, NULL)) == NULL) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!ossl_provider_activate(prov)) { | 
					
						
							|  |  |  |         ossl_provider_free(prov); | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return prov; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int OSSL_PROVIDER_unload(OSSL_PROVIDER *prov) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     ossl_provider_free(prov); | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-17 17:29:04 +08:00
										 |  |  | int OSSL_PROVIDER_available(OPENSSL_CTX *libctx, const char *name) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     OSSL_PROVIDER *prov = NULL; | 
					
						
							|  |  |  |     int available = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Find it or create it */ | 
					
						
							|  |  |  |     prov = ossl_provider_find(libctx, name); | 
					
						
							|  |  |  |     available = ossl_provider_available(prov); | 
					
						
							|  |  |  |     ossl_provider_free(prov); | 
					
						
							|  |  |  |     return available; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-11 18:19:33 +08:00
										 |  |  | const OSSL_PARAM *OSSL_PROVIDER_get_param_types(const OSSL_PROVIDER *prov) | 
					
						
							| 
									
										
										
										
											2019-02-20 06:07:57 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     return ossl_provider_get_param_types(prov); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int OSSL_PROVIDER_add_builtin(OPENSSL_CTX *libctx, const char *name, | 
					
						
							|  |  |  |                               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 */ | 
					
						
							|  |  |  |     if ((prov = ossl_provider_new(libctx, name, init_fn)) == NULL) | 
					
						
							|  |  |  |         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); | 
					
						
							|  |  |  | } |