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