|
Added
Link Here
|
| 1 |
#include <dlfcn.h> |
| 2 |
#include <errno.h> |
| 3 |
#include <krb5_locl.h> |
| 4 |
#include <stdio.h> |
| 5 |
#include <openssl/provider.h> |
| 6 |
|
| 7 |
#if defined(OPENSSL_VERSION_MAJOR) && (OPENSSL_VERSION_MAJOR >= 3) |
| 8 |
static void fbsd_ossl_provider_unload(void); |
| 9 |
static void print_dlerror(char *); |
| 10 |
static OSSL_PROVIDER *legacy; |
| 11 |
static OSSL_PROVIDER *deflt; |
| 12 |
static int providers_loaded = 0; |
| 13 |
static OSSL_PROVIDER * (*ossl_provider_load)(OSSL_LIB_CTX *, const char*) = NULL; |
| 14 |
static int (*ossl_provider_unload)(OSSL_PROVIDER *) = NULL; |
| 15 |
static void *lib_handle = NULL; |
| 16 |
|
| 17 |
static void |
| 18 |
fbsd_ossl_provider_unload(void) |
| 19 |
{ |
| 20 |
if (ossl_provider_unload == NULL) { |
| 21 |
if (!(ossl_provider_unload = (int (*)(OSSL_PROVIDER*)) dlsym(lib_handle, "OSSL_PROVIDER_load"))) { |
| 22 |
print_dlerror("Unable to link OSSL_PROVIDER_unload"); |
| 23 |
return; |
| 24 |
} |
| 25 |
} |
| 26 |
if (providers_loaded == 1) { |
| 27 |
(*ossl_provider_unload)(legacy); |
| 28 |
(*ossl_provider_unload)(deflt); |
| 29 |
providers_loaded = 0; |
| 30 |
} |
| 31 |
} |
| 32 |
|
| 33 |
static void |
| 34 |
print_dlerror(char *message) |
| 35 |
{ |
| 36 |
char *errstr; |
| 37 |
|
| 38 |
if ((errstr = dlerror()) != NULL) |
| 39 |
fprintf(stderr, "%s: %s\n", |
| 40 |
message, errstr); |
| 41 |
} |
| 42 |
#endif |
| 43 |
|
| 44 |
int |
| 45 |
fbsd_ossl_provider_load(void) |
| 46 |
{ |
| 47 |
#if defined(OPENSSL_VERSION_MAJOR) && (OPENSSL_VERSION_MAJOR >= 3) |
| 48 |
if (lib_handle == NULL) { |
| 49 |
if (!(lib_handle = dlopen("/usr/lib/libcrypto.so", |
| 50 |
RTLD_LAZY|RTLD_GLOBAL))) { |
| 51 |
print_dlerror("Unable to load libcrypto.so"); |
| 52 |
return (EINVAL); |
| 53 |
} |
| 54 |
} |
| 55 |
if (ossl_provider_load == NULL) { |
| 56 |
if (!(ossl_provider_load = (OSSL_PROVIDER * (*)(OSSL_LIB_CTX*, const char *)) dlsym(lib_handle, "OSSL_PROVIDER_load"))) { |
| 57 |
print_dlerror("Unable to link OSSL_PROVIDER_load"); |
| 58 |
return(ENOENT); |
| 59 |
} |
| 60 |
} |
| 61 |
|
| 62 |
if (providers_loaded == 0) { |
| 63 |
if ((legacy = (*ossl_provider_load)(NULL, "legacy")) == NULL) |
| 64 |
return (EINVAL); |
| 65 |
if ((deflt = (*ossl_provider_load)(NULL, "default")) == NULL) { |
| 66 |
(*ossl_provider_unload)(legacy); |
| 67 |
return (EINVAL); |
| 68 |
} |
| 69 |
if (atexit(fbsd_ossl_provider_unload)) { |
| 70 |
fbsd_ossl_provider_unload(); |
| 71 |
return (errno); |
| 72 |
} |
| 73 |
providers_loaded = 1; |
| 74 |
} |
| 75 |
#endif |
| 76 |
return (0); |
| 77 |
} |