1 /* 2 * Copyright 2001-2021 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the Apache License 2.0 (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10 /* We need to use some engine deprecated APIs */ 11 #define OPENSSL_SUPPRESS_DEPRECATED 12 13 #include "eng_local.h" 14 15 /* Basic get/set stuff */ 16 17 int ENGINE_set_load_privkey_function(ENGINE *e, 18 ENGINE_LOAD_KEY_PTR loadpriv_f) 19 { 20 e->load_privkey = loadpriv_f; 21 return 1; 22 } 23 24 int ENGINE_set_load_pubkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpub_f) 25 { 26 e->load_pubkey = loadpub_f; 27 return 1; 28 } 29 30 int ENGINE_set_load_ssl_client_cert_function(ENGINE *e, 31 ENGINE_SSL_CLIENT_CERT_PTR 32 loadssl_f) 33 { 34 e->load_ssl_client_cert = loadssl_f; 35 return 1; 36 } 37 38 ENGINE_LOAD_KEY_PTR ENGINE_get_load_privkey_function(const ENGINE *e) 39 { 40 return e->load_privkey; 41 } 42 43 ENGINE_LOAD_KEY_PTR ENGINE_get_load_pubkey_function(const ENGINE *e) 44 { 45 return e->load_pubkey; 46 } 47 48 ENGINE_SSL_CLIENT_CERT_PTR ENGINE_get_ssl_client_cert_function(const ENGINE 49 *e) 50 { 51 return e->load_ssl_client_cert; 52 } 53 54 /* API functions to load public/private keys */ 55 56 EVP_PKEY *ENGINE_load_private_key(ENGINE *e, const char *key_id, 57 UI_METHOD *ui_method, void *callback_data) 58 { 59 EVP_PKEY *pkey; 60 61 if (e == NULL) { 62 ERR_raise(ERR_LIB_ENGINE, ERR_R_PASSED_NULL_PARAMETER); 63 return NULL; 64 } 65 if (!CRYPTO_THREAD_write_lock(global_engine_lock)) 66 return NULL; 67 if (e->funct_ref == 0) { 68 CRYPTO_THREAD_unlock(global_engine_lock); 69 ERR_raise(ERR_LIB_ENGINE, ENGINE_R_NOT_INITIALISED); 70 return NULL; 71 } 72 CRYPTO_THREAD_unlock(global_engine_lock); 73 if (!e->load_privkey) { 74 ERR_raise(ERR_LIB_ENGINE, ENGINE_R_NO_LOAD_FUNCTION); 75 return NULL; 76 } 77 pkey = e->load_privkey(e, key_id, ui_method, callback_data); 78 if (pkey == NULL) { 79 ERR_raise(ERR_LIB_ENGINE, ENGINE_R_FAILED_LOADING_PRIVATE_KEY); 80 return NULL; 81 } 82 return pkey; 83 } 84 85 EVP_PKEY *ENGINE_load_public_key(ENGINE *e, const char *key_id, 86 UI_METHOD *ui_method, void *callback_data) 87 { 88 EVP_PKEY *pkey; 89 90 if (e == NULL) { 91 ERR_raise(ERR_LIB_ENGINE, ERR_R_PASSED_NULL_PARAMETER); 92 return NULL; 93 } 94 if (!CRYPTO_THREAD_write_lock(global_engine_lock)) 95 return NULL; 96 if (e->funct_ref == 0) { 97 CRYPTO_THREAD_unlock(global_engine_lock); 98 ERR_raise(ERR_LIB_ENGINE, ENGINE_R_NOT_INITIALISED); 99 return NULL; 100 } 101 CRYPTO_THREAD_unlock(global_engine_lock); 102 if (!e->load_pubkey) { 103 ERR_raise(ERR_LIB_ENGINE, ENGINE_R_NO_LOAD_FUNCTION); 104 return NULL; 105 } 106 pkey = e->load_pubkey(e, key_id, ui_method, callback_data); 107 if (pkey == NULL) { 108 ERR_raise(ERR_LIB_ENGINE, ENGINE_R_FAILED_LOADING_PUBLIC_KEY); 109 return NULL; 110 } 111 return pkey; 112 } 113 114 int ENGINE_load_ssl_client_cert(ENGINE *e, SSL *s, 115 STACK_OF(X509_NAME) *ca_dn, X509 **pcert, 116 EVP_PKEY **ppkey, STACK_OF(X509) **pother, 117 UI_METHOD *ui_method, void *callback_data) 118 { 119 120 if (e == NULL) { 121 ERR_raise(ERR_LIB_ENGINE, ERR_R_PASSED_NULL_PARAMETER); 122 return 0; 123 } 124 if (!CRYPTO_THREAD_write_lock(global_engine_lock)) 125 return 0; 126 if (e->funct_ref == 0) { 127 CRYPTO_THREAD_unlock(global_engine_lock); 128 ERR_raise(ERR_LIB_ENGINE, ENGINE_R_NOT_INITIALISED); 129 return 0; 130 } 131 CRYPTO_THREAD_unlock(global_engine_lock); 132 if (!e->load_ssl_client_cert) { 133 ERR_raise(ERR_LIB_ENGINE, ENGINE_R_NO_LOAD_FUNCTION); 134 return 0; 135 } 136 return e->load_ssl_client_cert(e, s, ca_dn, pcert, ppkey, pother, 137 ui_method, callback_data); 138 } 139