| 
									
										
										
										
											2019-02-21 05:55:43 +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
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * 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>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * 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
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <openssl/core.h>
 | 
					
						
							|  |  |  | #include <openssl/core_numbers.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-15 02:17:39 +08:00
										 |  |  | static OSSL_core_gettable_params_fn *c_gettable_params = NULL; | 
					
						
							| 
									
										
										
										
											2019-02-21 05:55:43 +08:00
										 |  |  | static OSSL_core_get_params_fn *c_get_params = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* 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 }, | 
					
						
							|  |  |  |     { 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 */ | 
					
						
							| 
									
										
										
										
											2019-08-15 02:17:39 +08:00
										 |  |  | static OSSL_provider_gettable_params_fn p_gettable_params; | 
					
						
							| 
									
										
										
										
											2019-04-30 19:41:51 +08:00
										 |  |  | static OSSL_provider_get_params_fn p_get_params; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-24 12:43:55 +08:00
										 |  |  | static int p_get_params(void *vprov, OSSL_PARAM params[]) | 
					
						
							| 
									
										
										
										
											2019-02-21 05:55:43 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-30 19:41:51 +08:00
										 |  |  |     const OSSL_PROVIDER *prov = vprov; | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-21 05:55:43 +08:00
										 |  |  |             if (c_get_params(prov, 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; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     sprintf(buf, "Hello OpenSSL %.20s, greetings from %s!", | 
					
						
							|  |  |  |                             versionp, namep); | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2019-02-21 05:55:43 +08:00
										 |  |  |             } else { | 
					
						
							|  |  |  |                 sprintf(buf, "Howdy stranger..."); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return ok; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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 }, | 
					
						
							|  |  |  |     { 0, NULL } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int OSSL_provider_init(const OSSL_PROVIDER *provider, | 
					
						
							|  |  |  |                        const OSSL_DISPATCH *in, | 
					
						
							| 
									
										
										
										
											2019-04-30 19:41:51 +08:00
										 |  |  |                        const OSSL_DISPATCH **out, | 
					
						
							|  |  |  |                        void **provctx) | 
					
						
							| 
									
										
										
										
											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: | 
					
						
							|  |  |  |             c_gettable_params = OSSL_get_core_gettable_params(in); | 
					
						
							| 
									
										
										
										
											2019-02-21 05:55:43 +08:00
										 |  |  |             break; | 
					
						
							|  |  |  |         case OSSL_FUNC_CORE_GET_PARAMS: | 
					
						
							|  |  |  |             c_get_params = OSSL_get_core_get_params(in); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         default: | 
					
						
							|  |  |  |             /* Just ignore anything we don't understand */ | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-30 19:41:51 +08:00
										 |  |  |     /* Because we use this in get_params, we need to pass it back */ | 
					
						
							|  |  |  |     *provctx = (void *)provider; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-21 05:55:43 +08:00
										 |  |  |     *out = p_test_table; | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } |