1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* crypto/engine/eng_pkey.c */ 2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* ==================================================================== 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright (c) 1999-2001 The OpenSSL Project. All rights reserved. 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met: 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the above copyright 10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer. 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer in 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the documentation and/or other materials provided with the 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * distribution. 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * software must display the following acknowledgment: 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software developed by the OpenSSL Project 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * endorse or promote products derived from this software without 24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * prior written permission. For written permission, please contact 25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * licensing@OpenSSL.org. 26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5. Products derived from this software may not be called "OpenSSL" 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * nor may "OpenSSL" appear in their names without prior written 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * permission of the OpenSSL Project. 30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 6. Redistributions of any form whatsoever must retain the following 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * acknowledgment: 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software developed by the OpenSSL Project 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OF THE POSSIBILITY OF SUCH DAMAGE. 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ==================================================================== 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This product includes cryptographic software written by Eric Young 51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * (eay@cryptsoft.com). This product includes software written by Tim 52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Hudson (tjh@cryptsoft.com). 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "eng_int.h" 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Basic get/set stuff */ 59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint ENGINE_set_load_privkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpriv_f) 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project e->load_privkey = loadpriv_f; 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint ENGINE_set_load_pubkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpub_f) 67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project e->load_pubkey = loadpub_f; 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 72e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modaduguint ENGINE_set_load_ssl_client_cert_function(ENGINE *e, 73e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu ENGINE_SSL_CLIENT_CERT_PTR loadssl_f) 74e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu { 75e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu e->load_ssl_client_cert = loadssl_f; 76e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu return 1; 77e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu } 78e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu 79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectENGINE_LOAD_KEY_PTR ENGINE_get_load_privkey_function(const ENGINE *e) 80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return e->load_privkey; 82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectENGINE_LOAD_KEY_PTR ENGINE_get_load_pubkey_function(const ENGINE *e) 85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return e->load_pubkey; 87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 89e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra ModaduguENGINE_SSL_CLIENT_CERT_PTR ENGINE_get_ssl_client_cert_function(const ENGINE *e) 90e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu { 91e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu return e->load_ssl_client_cert; 92e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu } 93e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu 94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* API functions to load public/private keys */ 95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectEVP_PKEY *ENGINE_load_private_key(ENGINE *e, const char *key_id, 97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project UI_METHOD *ui_method, void *callback_data) 98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_PKEY *pkey; 100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(e == NULL) 102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ENGINEerr(ENGINE_F_ENGINE_LOAD_PRIVATE_KEY, 104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_R_PASSED_NULL_PARAMETER); 105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_w_lock(CRYPTO_LOCK_ENGINE); 108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(e->funct_ref == 0) 109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE); 111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ENGINEerr(ENGINE_F_ENGINE_LOAD_PRIVATE_KEY, 112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ENGINE_R_NOT_INITIALISED); 113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE); 116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!e->load_privkey) 117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ENGINEerr(ENGINE_F_ENGINE_LOAD_PRIVATE_KEY, 119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ENGINE_R_NO_LOAD_FUNCTION); 120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pkey = e->load_privkey(e, key_id, ui_method, callback_data); 123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!pkey) 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ENGINEerr(ENGINE_F_ENGINE_LOAD_PRIVATE_KEY, 126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ENGINE_R_FAILED_LOADING_PRIVATE_KEY); 127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return pkey; 130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectEVP_PKEY *ENGINE_load_public_key(ENGINE *e, const char *key_id, 133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project UI_METHOD *ui_method, void *callback_data) 134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_PKEY *pkey; 136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(e == NULL) 138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ENGINEerr(ENGINE_F_ENGINE_LOAD_PUBLIC_KEY, 140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_R_PASSED_NULL_PARAMETER); 141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_w_lock(CRYPTO_LOCK_ENGINE); 144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(e->funct_ref == 0) 145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE); 147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ENGINEerr(ENGINE_F_ENGINE_LOAD_PUBLIC_KEY, 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ENGINE_R_NOT_INITIALISED); 149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE); 152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!e->load_pubkey) 153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ENGINEerr(ENGINE_F_ENGINE_LOAD_PUBLIC_KEY, 155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ENGINE_R_NO_LOAD_FUNCTION); 156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pkey = e->load_pubkey(e, key_id, ui_method, callback_data); 159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!pkey) 160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ENGINEerr(ENGINE_F_ENGINE_LOAD_PUBLIC_KEY, 162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ENGINE_R_FAILED_LOADING_PUBLIC_KEY); 163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return pkey; 166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 167e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu 168e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modaduguint ENGINE_load_ssl_client_cert(ENGINE *e, SSL *s, 169e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu STACK_OF(X509_NAME) *ca_dn, X509 **pcert, EVP_PKEY **ppkey, 170e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu STACK_OF(X509) **pother, UI_METHOD *ui_method, void *callback_data) 171e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu { 172e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu 173e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu if(e == NULL) 174e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu { 175e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu ENGINEerr(ENGINE_F_ENGINE_LOAD_SSL_CLIENT_CERT, 176e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu ERR_R_PASSED_NULL_PARAMETER); 177e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu return 0; 178e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu } 179e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu CRYPTO_w_lock(CRYPTO_LOCK_ENGINE); 180e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu if(e->funct_ref == 0) 181e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu { 182e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE); 183e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu ENGINEerr(ENGINE_F_ENGINE_LOAD_SSL_CLIENT_CERT, 184e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu ENGINE_R_NOT_INITIALISED); 185e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu return 0; 186e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu } 187e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE); 188e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu if (!e->load_ssl_client_cert) 189e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu { 190e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu ENGINEerr(ENGINE_F_ENGINE_LOAD_SSL_CLIENT_CERT, 191e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu ENGINE_R_NO_LOAD_FUNCTION); 192e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu return 0; 193e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu } 194e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu return e->load_ssl_client_cert(e, s, ca_dn, pcert, ppkey, pother, 195e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu ui_method, callback_data); 196e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu } 197