| 
									
										
										
										
											2019-02-21 05:55:43 +08:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2023-09-07 16:59:15 +08:00
										 |  |  |  * Copyright 2019-2023 The OpenSSL Project Authors. All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2019-02-21 05:55:43 +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
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * This is a very simple provider that does absolutely nothing except respond | 
					
						
							|  |  |  |  * to provider global parameter requests.  It does this by simply echoing back | 
					
						
							|  |  |  |  * a parameter request it makes to the loading library. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-25 03:24:39 +08:00
										 |  |  | #include <stdarg.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-21 05:55:43 +08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * When built as an object file to link the application with, we get the | 
					
						
							|  |  |  |  * init function name through the macro PROVIDER_INIT_FUNCTION_NAME.  If | 
					
						
							|  |  |  |  * not defined, we use the standard init function name for the shared | 
					
						
							|  |  |  |  * object form. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #ifdef PROVIDER_INIT_FUNCTION_NAME
 | 
					
						
							|  |  |  | # define OSSL_provider_init PROVIDER_INIT_FUNCTION_NAME
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-04 22:13:01 +08:00
										 |  |  | #include "internal/e_os.h"
 | 
					
						
							| 
									
										
										
										
											2019-02-21 05:55:43 +08:00
										 |  |  | #include <openssl/core.h>
 | 
					
						
							| 
									
										
										
										
											2020-06-21 07:21:19 +08:00
										 |  |  | #include <openssl/core_dispatch.h>
 | 
					
						
							| 
									
										
										
										
											2021-02-16 18:10:26 +08:00
										 |  |  | #include <openssl/err.h>
 | 
					
						
							| 
									
										
										
										
											2021-04-22 22:58:50 +08:00
										 |  |  | #include <openssl/evp.h>
 | 
					
						
							|  |  |  | #include <openssl/crypto.h>
 | 
					
						
							| 
									
										
										
										
											2021-05-05 00:38:10 +08:00
										 |  |  | #include <openssl/provider.h>
 | 
					
						
							| 
									
										
										
										
											2021-02-16 18:10:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | typedef struct p_test_ctx { | 
					
						
							|  |  |  |     char *thisfile; | 
					
						
							|  |  |  |     char *thisfunc; | 
					
						
							|  |  |  |     const OSSL_CORE_HANDLE *handle; | 
					
						
							| 
									
										
										
										
											2021-04-22 22:58:50 +08:00
										 |  |  |     OSSL_LIB_CTX *libctx; | 
					
						
							| 
									
										
										
										
											2021-02-16 18:10:26 +08:00
										 |  |  | } P_TEST_CTX; | 
					
						
							| 
									
										
										
										
											2019-02-21 05:55:43 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-21 07:19:16 +08:00
										 |  |  | static OSSL_FUNC_core_gettable_params_fn *c_gettable_params = NULL; | 
					
						
							|  |  |  | static OSSL_FUNC_core_get_params_fn *c_get_params = NULL; | 
					
						
							| 
									
										
										
										
											2021-02-16 18:10:26 +08:00
										 |  |  | static OSSL_FUNC_core_new_error_fn *c_new_error; | 
					
						
							|  |  |  | static OSSL_FUNC_core_set_error_debug_fn *c_set_error_debug; | 
					
						
							|  |  |  | static OSSL_FUNC_core_vset_error_fn *c_vset_error; | 
					
						
							| 
									
										
										
										
											2024-09-25 03:24:39 +08:00
										 |  |  | static OSSL_FUNC_BIO_vsnprintf_fn *c_BIO_vsnprintf; | 
					
						
							| 
									
										
										
										
											2019-02-21 05:55:43 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* Tell the core what params we provide and what type they are */ | 
					
						
							| 
									
										
										
										
											2019-07-11 18:19:33 +08:00
										 |  |  | static const OSSL_PARAM p_param_types[] = { | 
					
						
							|  |  |  |     { "greeting", OSSL_PARAM_UTF8_STRING, NULL, 0, 0 }, | 
					
						
							| 
									
										
										
										
											2021-04-22 22:58:50 +08:00
										 |  |  |     { "digest-check", OSSL_PARAM_UNSIGNED_INTEGER, NULL, 0, 0}, | 
					
						
							| 
									
										
										
										
											2019-07-11 18:19:33 +08:00
										 |  |  |     { NULL, 0, NULL, 0, 0 } | 
					
						
							| 
									
										
										
										
											2019-02-21 05:55:43 +08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-30 19:41:51 +08:00
										 |  |  | /* This is a trick to ensure we define the provider functions correctly */ | 
					
						
							| 
									
										
										
										
											2020-06-21 07:19:16 +08:00
										 |  |  | static OSSL_FUNC_provider_gettable_params_fn p_gettable_params; | 
					
						
							|  |  |  | static OSSL_FUNC_provider_get_params_fn p_get_params; | 
					
						
							|  |  |  | static OSSL_FUNC_provider_get_reason_strings_fn p_get_reason_strings; | 
					
						
							| 
									
										
										
										
											2021-02-16 18:10:26 +08:00
										 |  |  | static OSSL_FUNC_provider_teardown_fn p_teardown; | 
					
						
							| 
									
										
										
										
											2019-04-30 19:41:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-25 03:24:39 +08:00
										 |  |  | static int local_snprintf(char *buf, size_t n, const char *format, ...) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     va_list args; | 
					
						
							|  |  |  |     int ret; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     va_start(args, format); | 
					
						
							|  |  |  |     ret = (*c_BIO_vsnprintf)(buf, n, format, args); | 
					
						
							|  |  |  |     va_end(args); | 
					
						
							|  |  |  |     return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-13 22:52:19 +08:00
										 |  |  | static void p_set_error(int lib, int reason, const char *file, int line, | 
					
						
							|  |  |  |                         const char *func, const char *fmt, ...) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     va_list ap; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     va_start(ap, fmt); | 
					
						
							|  |  |  |     c_new_error(NULL); | 
					
						
							|  |  |  |     c_set_error_debug(NULL, file, line, func); | 
					
						
							|  |  |  |     c_vset_error(NULL, ERR_PACK(lib, 0, reason), fmt, ap); | 
					
						
							|  |  |  |     va_end(ap); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-15 02:17:39 +08:00
										 |  |  | static const OSSL_PARAM *p_gettable_params(void *_) | 
					
						
							| 
									
										
										
										
											2019-02-21 05:55:43 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     return p_param_types; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-16 18:10:26 +08:00
										 |  |  | static int p_get_params(void *provctx, OSSL_PARAM params[]) | 
					
						
							| 
									
										
										
										
											2019-02-21 05:55:43 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-02-16 18:10:26 +08:00
										 |  |  |     P_TEST_CTX *ctx = (P_TEST_CTX *)provctx; | 
					
						
							|  |  |  |     const OSSL_CORE_HANDLE *hand = ctx->handle; | 
					
						
							| 
									
										
										
										
											2019-06-24 12:43:55 +08:00
										 |  |  |     OSSL_PARAM *p = params; | 
					
						
							| 
									
										
										
										
											2019-02-21 05:55:43 +08:00
										 |  |  |     int ok = 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (; ok && p->key != NULL; p++) { | 
					
						
							|  |  |  |         if (strcmp(p->key, "greeting") == 0) { | 
					
						
							| 
									
										
										
										
											2019-04-30 21:24:06 +08:00
										 |  |  |             static char *opensslv; | 
					
						
							|  |  |  |             static char *provname; | 
					
						
							|  |  |  |             static char *greeting; | 
					
						
							| 
									
										
										
										
											2019-06-24 12:43:55 +08:00
										 |  |  |             static OSSL_PARAM counter_request[] = { | 
					
						
							| 
									
										
										
										
											2019-03-31 05:10:39 +08:00
										 |  |  |                 /* Known libcrypto provided parameters */ | 
					
						
							| 
									
										
										
										
											2019-03-12 04:49:54 +08:00
										 |  |  |                 { "openssl-version", OSSL_PARAM_UTF8_PTR, | 
					
						
							| 
									
										
										
										
											2019-06-24 12:43:55 +08:00
										 |  |  |                   &opensslv, sizeof(&opensslv), 0 }, | 
					
						
							| 
									
										
										
										
											2019-03-12 04:49:54 +08:00
										 |  |  |                 { "provider-name", OSSL_PARAM_UTF8_PTR, | 
					
						
							| 
									
										
										
										
											2019-06-24 12:43:55 +08:00
										 |  |  |                   &provname, sizeof(&provname), 0}, | 
					
						
							| 
									
										
										
										
											2019-03-31 05:10:39 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 /* This might be present, if there's such a configuration */ | 
					
						
							|  |  |  |                 { "greeting", OSSL_PARAM_UTF8_PTR, | 
					
						
							| 
									
										
										
										
											2019-06-24 12:43:55 +08:00
										 |  |  |                   &greeting, sizeof(&greeting), 0 }, | 
					
						
							| 
									
										
										
										
											2019-03-31 05:10:39 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-24 12:43:55 +08:00
										 |  |  |                 { NULL, 0, NULL, 0, 0 } | 
					
						
							| 
									
										
										
										
											2019-02-21 05:55:43 +08:00
										 |  |  |             }; | 
					
						
							|  |  |  |             char buf[256]; | 
					
						
							|  |  |  |             size_t buf_l; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-30 21:24:06 +08:00
										 |  |  |             opensslv = provname = greeting = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-06 19:29:57 +08:00
										 |  |  |             if (c_get_params(hand, counter_request)) { | 
					
						
							| 
									
										
										
										
											2019-03-31 05:10:39 +08:00
										 |  |  |                 if (greeting) { | 
					
						
							|  |  |  |                     strcpy(buf, greeting); | 
					
						
							|  |  |  |                 } else { | 
					
						
							|  |  |  |                     const char *versionp = *(void **)counter_request[0].data; | 
					
						
							|  |  |  |                     const char *namep = *(void **)counter_request[1].data; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-25 03:24:39 +08:00
										 |  |  |                     local_snprintf(buf, sizeof(buf), "Hello OpenSSL %.20s, greetings from %s!", | 
					
						
							|  |  |  |                                    versionp, namep); | 
					
						
							| 
									
										
										
										
											2019-03-31 05:10:39 +08:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2019-02-21 05:55:43 +08:00
										 |  |  |             } else { | 
					
						
							| 
									
										
										
										
											2024-09-25 03:24:39 +08:00
										 |  |  |                 local_snprintf(buf, sizeof(buf), "Howdy stranger..."); | 
					
						
							| 
									
										
										
										
											2019-02-21 05:55:43 +08:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-24 12:43:55 +08:00
										 |  |  |             p->return_size = buf_l = strlen(buf) + 1; | 
					
						
							| 
									
										
										
										
											2019-03-12 04:51:01 +08:00
										 |  |  |             if (p->data_size >= buf_l) | 
					
						
							| 
									
										
										
										
											2019-07-02 00:09:16 +08:00
										 |  |  |                 strcpy(p->data, buf); | 
					
						
							| 
									
										
										
										
											2019-02-21 05:55:43 +08:00
										 |  |  |             else | 
					
						
							|  |  |  |                 ok = 0; | 
					
						
							| 
									
										
										
										
											2021-04-22 22:58:50 +08:00
										 |  |  |         } else if (strcmp(p->key, "digest-check") == 0) { | 
					
						
							|  |  |  |             unsigned int digestsuccess = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             /*
 | 
					
						
							|  |  |  |              * Test we can use an algorithm from another provider. We're using | 
					
						
							|  |  |  |              * legacy to check that legacy is actually available and we haven't | 
					
						
							|  |  |  |              * just fallen back to default. | 
					
						
							|  |  |  |              */ | 
					
						
							|  |  |  | #ifdef PROVIDER_INIT_FUNCTION_NAME
 | 
					
						
							|  |  |  |             EVP_MD *md4 = EVP_MD_fetch(ctx->libctx, "MD4", NULL); | 
					
						
							|  |  |  |             EVP_MD_CTX *mdctx = EVP_MD_CTX_new(); | 
					
						
							|  |  |  |             const char *msg = "Hello world"; | 
					
						
							|  |  |  |             unsigned char out[16]; | 
					
						
							| 
									
										
										
										
											2021-05-13 22:52:19 +08:00
										 |  |  |             OSSL_PROVIDER *deflt; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             /*
 | 
					
						
							|  |  |  |             * "default" has not been loaded into the parent libctx. We should be able | 
					
						
							|  |  |  |             * to explicitly load it as a non-child provider. | 
					
						
							|  |  |  |             */ | 
					
						
							|  |  |  |             deflt = OSSL_PROVIDER_load(ctx->libctx, "default"); | 
					
						
							|  |  |  |             if (deflt == NULL | 
					
						
							|  |  |  |                     || !OSSL_PROVIDER_available(ctx->libctx, "default")) { | 
					
						
							|  |  |  |                 /* We set error "3" for a failure to load the default provider */ | 
					
						
							|  |  |  |                 p_set_error(ERR_LIB_PROV, 3, ctx->thisfile, OPENSSL_LINE, | 
					
						
							|  |  |  |                             ctx->thisfunc, NULL); | 
					
						
							|  |  |  |                 ok = 0; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-04-22 22:58:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-05 00:38:10 +08:00
										 |  |  |             /*
 | 
					
						
							|  |  |  |              * We should have the default provider available that we loaded | 
					
						
							|  |  |  |              * ourselves, and the base and legacy providers which we inherit | 
					
						
							|  |  |  |              * from the parent libctx. We should also have "this" provider | 
					
						
							|  |  |  |              * available. | 
					
						
							|  |  |  |              */ | 
					
						
							| 
									
										
										
										
											2021-05-13 22:52:19 +08:00
										 |  |  |             if (ok | 
					
						
							|  |  |  |                     && OSSL_PROVIDER_available(ctx->libctx, "default") | 
					
						
							| 
									
										
										
										
											2021-05-05 00:38:10 +08:00
										 |  |  |                     && OSSL_PROVIDER_available(ctx->libctx, "base") | 
					
						
							|  |  |  |                     && OSSL_PROVIDER_available(ctx->libctx, "legacy") | 
					
						
							|  |  |  |                     && OSSL_PROVIDER_available(ctx->libctx, "p_test") | 
					
						
							|  |  |  |                     && md4 != NULL | 
					
						
							|  |  |  |                     && mdctx != NULL) { | 
					
						
							| 
									
										
										
										
											2021-04-22 22:58:50 +08:00
										 |  |  |                 if (EVP_DigestInit_ex(mdctx, md4, NULL) | 
					
						
							|  |  |  |                         && EVP_DigestUpdate(mdctx, (const unsigned char *)msg, | 
					
						
							|  |  |  |                                             strlen(msg)) | 
					
						
							| 
									
										
										
										
											2021-05-13 22:52:19 +08:00
										 |  |  |                         && EVP_DigestFinal(mdctx, out, NULL)) | 
					
						
							| 
									
										
										
										
											2021-04-22 22:58:50 +08:00
										 |  |  |                     digestsuccess = 1; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             EVP_MD_CTX_free(mdctx); | 
					
						
							|  |  |  |             EVP_MD_free(md4); | 
					
						
							| 
									
										
										
										
											2021-05-13 22:52:19 +08:00
										 |  |  |             OSSL_PROVIDER_unload(deflt); | 
					
						
							| 
									
										
										
										
											2021-04-22 22:58:50 +08:00
										 |  |  | #endif
 | 
					
						
							|  |  |  |             if (p->data_size >= sizeof(digestsuccess)) { | 
					
						
							|  |  |  |                 *(unsigned int *)p->data = digestsuccess; | 
					
						
							|  |  |  |                 p->return_size = sizeof(digestsuccess); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 ok = 0; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-05-11 23:50:27 +08:00
										 |  |  |         } else if (strcmp(p->key, "stop-property-mirror") == 0) { | 
					
						
							|  |  |  |             /*
 | 
					
						
							|  |  |  |              * Setting the default properties explicitly should stop mirroring | 
					
						
							|  |  |  |              * of properties from the parent libctx. | 
					
						
							|  |  |  |              */ | 
					
						
							|  |  |  |             unsigned int stopsuccess = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef PROVIDER_INIT_FUNCTION_NAME
 | 
					
						
							|  |  |  |             stopsuccess = EVP_set_default_properties(ctx->libctx, NULL); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |             if (p->data_size >= sizeof(stopsuccess)) { | 
					
						
							|  |  |  |                 *(unsigned int *)p->data = stopsuccess; | 
					
						
							|  |  |  |                 p->return_size = sizeof(stopsuccess); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 ok = 0; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2019-02-21 05:55:43 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return ok; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-27 19:02:48 +08:00
										 |  |  | static const OSSL_ITEM *p_get_reason_strings(void *_) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     static const OSSL_ITEM reason_strings[] = { | 
					
						
							|  |  |  |         {1, "dummy reason string"}, | 
					
						
							| 
									
										
										
										
											2021-05-05 00:38:10 +08:00
										 |  |  |         {2, "Can't create child library context"}, | 
					
						
							|  |  |  |         {3, "Can't load default provider"}, | 
					
						
							| 
									
										
										
										
											2020-03-27 19:02:48 +08:00
										 |  |  |         {0, NULL} | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return reason_strings; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-17 23:18:37 +08:00
										 |  |  | static const OSSL_ALGORITHM *p_query(OSSL_PROVIDER *prov, | 
					
						
							|  |  |  |                                      int operation_id, | 
					
						
							|  |  |  |                                      int *no_cache) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     *no_cache = 1; | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-21 05:55:43 +08:00
										 |  |  | static const OSSL_DISPATCH p_test_table[] = { | 
					
						
							| 
									
										
										
										
											2019-08-15 02:17:39 +08:00
										 |  |  |     { OSSL_FUNC_PROVIDER_GETTABLE_PARAMS, (void (*)(void))p_gettable_params }, | 
					
						
							| 
									
										
										
										
											2019-02-21 05:55:43 +08:00
										 |  |  |     { OSSL_FUNC_PROVIDER_GET_PARAMS, (void (*)(void))p_get_params }, | 
					
						
							| 
									
										
										
										
											2020-03-27 19:02:48 +08:00
										 |  |  |     { OSSL_FUNC_PROVIDER_GET_REASON_STRINGS, | 
					
						
							|  |  |  |         (void (*)(void))p_get_reason_strings}, | 
					
						
							| 
									
										
										
										
											2021-02-16 18:10:26 +08:00
										 |  |  |     { OSSL_FUNC_PROVIDER_TEARDOWN, (void (*)(void))p_teardown }, | 
					
						
							| 
									
										
										
										
											2024-12-17 23:18:37 +08:00
										 |  |  |     { OSSL_FUNC_PROVIDER_QUERY_OPERATION, (void (*)(void))p_query }, | 
					
						
							| 
									
										
										
										
											2023-04-19 22:08:22 +08:00
										 |  |  |     OSSL_DISPATCH_END | 
					
						
							| 
									
										
										
										
											2019-02-21 05:55:43 +08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-06 19:29:57 +08:00
										 |  |  | int OSSL_provider_init(const OSSL_CORE_HANDLE *handle, | 
					
						
							| 
									
										
										
										
											2021-04-22 22:58:50 +08:00
										 |  |  |                        const OSSL_DISPATCH *oin, | 
					
						
							| 
									
										
										
										
											2019-04-30 19:41:51 +08:00
										 |  |  |                        const OSSL_DISPATCH **out, | 
					
						
							|  |  |  |                        void **provctx) | 
					
						
							| 
									
										
										
										
											2019-02-21 05:55:43 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-02-16 18:10:26 +08:00
										 |  |  |     P_TEST_CTX *ctx; | 
					
						
							| 
									
										
										
										
											2021-04-22 22:58:50 +08:00
										 |  |  |     const OSSL_DISPATCH *in = oin; | 
					
						
							| 
									
										
										
										
											2021-02-16 18:10:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-21 05:55:43 +08:00
										 |  |  |     for (; in->function_id != 0; in++) { | 
					
						
							|  |  |  |         switch (in->function_id) { | 
					
						
							| 
									
										
										
										
											2019-08-15 02:17:39 +08:00
										 |  |  |         case OSSL_FUNC_CORE_GETTABLE_PARAMS: | 
					
						
							| 
									
										
										
										
											2020-06-21 07:19:16 +08:00
										 |  |  |             c_gettable_params = OSSL_FUNC_core_gettable_params(in); | 
					
						
							| 
									
										
										
										
											2019-02-21 05:55:43 +08:00
										 |  |  |             break; | 
					
						
							|  |  |  |         case OSSL_FUNC_CORE_GET_PARAMS: | 
					
						
							| 
									
										
										
										
											2020-06-21 07:19:16 +08:00
										 |  |  |             c_get_params = OSSL_FUNC_core_get_params(in); | 
					
						
							| 
									
										
										
										
											2019-02-21 05:55:43 +08:00
										 |  |  |             break; | 
					
						
							| 
									
										
										
										
											2021-02-16 18:10:26 +08:00
										 |  |  |         case OSSL_FUNC_CORE_NEW_ERROR: | 
					
						
							|  |  |  |             c_new_error = OSSL_FUNC_core_new_error(in); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case OSSL_FUNC_CORE_SET_ERROR_DEBUG: | 
					
						
							|  |  |  |             c_set_error_debug = OSSL_FUNC_core_set_error_debug(in); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case OSSL_FUNC_CORE_VSET_ERROR: | 
					
						
							|  |  |  |             c_vset_error = OSSL_FUNC_core_vset_error(in); | 
					
						
							|  |  |  |             break; | 
					
						
							| 
									
										
										
										
											2024-09-25 03:24:39 +08:00
										 |  |  |         case OSSL_FUNC_BIO_VSNPRINTF: | 
					
						
							|  |  |  |             c_BIO_vsnprintf = OSSL_FUNC_BIO_vsnprintf(in); | 
					
						
							|  |  |  |             break; | 
					
						
							| 
									
										
										
										
											2019-02-21 05:55:43 +08:00
										 |  |  |         default: | 
					
						
							|  |  |  |             /* Just ignore anything we don't understand */ | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-16 18:10:26 +08:00
										 |  |  |     /*
 | 
					
						
							|  |  |  |      * We want to test that libcrypto doesn't use the file and func pointers | 
					
						
							|  |  |  |      * that we provide to it via c_set_error_debug beyond the time that they | 
					
						
							|  |  |  |      * are valid for. Therefore we dynamically allocate these strings now and | 
					
						
							|  |  |  |      * free them again when the provider is torn down. If anything tries to | 
					
						
							|  |  |  |      * use those strings after that point there will be a use-after-free and | 
					
						
							|  |  |  |      * asan will complain (and hence the tests will fail). | 
					
						
							|  |  |  |      * This file isn't linked against libcrypto, so we use malloc and strdup | 
					
						
							|  |  |  |      * instead of OPENSSL_malloc and OPENSSL_strdup | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     ctx = malloc(sizeof(*ctx)); | 
					
						
							|  |  |  |     if (ctx == NULL) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     ctx->thisfile = strdup(OPENSSL_FILE); | 
					
						
							|  |  |  |     ctx->thisfunc = strdup(OPENSSL_FUNC); | 
					
						
							|  |  |  |     ctx->handle = handle; | 
					
						
							| 
									
										
										
										
											2021-04-22 22:58:50 +08:00
										 |  |  | #ifdef PROVIDER_INIT_FUNCTION_NAME
 | 
					
						
							|  |  |  |     /* We only do this if we are linked with libcrypto */ | 
					
						
							|  |  |  |     ctx->libctx = OSSL_LIB_CTX_new_child(handle, oin); | 
					
						
							|  |  |  |     if (ctx->libctx == NULL) { | 
					
						
							| 
									
										
										
										
											2021-05-05 00:38:10 +08:00
										 |  |  |         /* We set error "2" for a failure to create the child libctx*/ | 
					
						
							|  |  |  |         p_set_error(ERR_LIB_PROV, 2, ctx->thisfile, OPENSSL_LINE, ctx->thisfunc, | 
					
						
							|  |  |  |                     NULL); | 
					
						
							|  |  |  |         p_teardown(ctx); | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-05-11 18:44:43 +08:00
										 |  |  |     /*
 | 
					
						
							|  |  |  |      * The default provider is loaded - but the default properties should not | 
					
						
							|  |  |  |      * allow its use. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         EVP_MD *sha256 = EVP_MD_fetch(ctx->libctx, "SHA2-256", NULL); | 
					
						
							|  |  |  |         if (sha256 != NULL) { | 
					
						
							|  |  |  |             EVP_MD_free(sha256); | 
					
						
							|  |  |  |             p_teardown(ctx); | 
					
						
							|  |  |  |             return 0; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-04-22 22:58:50 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2021-02-16 18:10:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /*
 | 
					
						
							|  |  |  |      * Set a spurious error to check error handling works correctly. This will | 
					
						
							|  |  |  |      * be ignored | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-02-25 16:21:56 +08:00
										 |  |  |     p_set_error(ERR_LIB_PROV, 1, ctx->thisfile, OPENSSL_LINE, ctx->thisfunc, NULL); | 
					
						
							| 
									
										
										
										
											2021-02-16 18:10:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     *provctx = (void *)ctx; | 
					
						
							| 
									
										
										
										
											2019-02-21 05:55:43 +08:00
										 |  |  |     *out = p_test_table; | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2021-02-16 18:10:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | static void p_teardown(void *provctx) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     P_TEST_CTX *ctx = (P_TEST_CTX *)provctx; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-22 22:58:50 +08:00
										 |  |  | #ifdef PROVIDER_INIT_FUNCTION_NAME
 | 
					
						
							|  |  |  |     OSSL_LIB_CTX_free(ctx->libctx); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2021-02-16 18:10:26 +08:00
										 |  |  |     free(ctx->thisfile); | 
					
						
							|  |  |  |     free(ctx->thisfunc); | 
					
						
							|  |  |  |     free(ctx); | 
					
						
							|  |  |  | } |