2 * Copyright 2001-2016 The OpenSSL Project Authors. All Rights Reserved.
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
10 #include "eng_local.h"
12 /* Basic get/set stuff */
14 int ENGINE_set_load_privkey_function(ENGINE
*e
,
15 ENGINE_LOAD_KEY_PTR loadpriv_f
)
17 e
->load_privkey
= loadpriv_f
;
21 int ENGINE_set_load_pubkey_function(ENGINE
*e
, ENGINE_LOAD_KEY_PTR loadpub_f
)
23 e
->load_pubkey
= loadpub_f
;
27 int ENGINE_set_load_ssl_client_cert_function(ENGINE
*e
,
28 ENGINE_SSL_CLIENT_CERT_PTR
31 e
->load_ssl_client_cert
= loadssl_f
;
35 ENGINE_LOAD_KEY_PTR
ENGINE_get_load_privkey_function(const ENGINE
*e
)
37 return e
->load_privkey
;
40 ENGINE_LOAD_KEY_PTR
ENGINE_get_load_pubkey_function(const ENGINE
*e
)
42 return e
->load_pubkey
;
45 ENGINE_SSL_CLIENT_CERT_PTR
ENGINE_get_ssl_client_cert_function(const ENGINE
48 return e
->load_ssl_client_cert
;
51 /* API functions to load public/private keys */
53 EVP_PKEY
*ENGINE_load_private_key(ENGINE
*e
, const char *key_id
,
54 UI_METHOD
*ui_method
, void *callback_data
)
59 ENGINEerr(ENGINE_F_ENGINE_LOAD_PRIVATE_KEY
,
60 ERR_R_PASSED_NULL_PARAMETER
);
63 CRYPTO_THREAD_write_lock(global_engine_lock
);
64 if (e
->funct_ref
== 0) {
65 CRYPTO_THREAD_unlock(global_engine_lock
);
66 ENGINEerr(ENGINE_F_ENGINE_LOAD_PRIVATE_KEY
, ENGINE_R_NOT_INITIALISED
);
69 CRYPTO_THREAD_unlock(global_engine_lock
);
70 if (!e
->load_privkey
) {
71 ENGINEerr(ENGINE_F_ENGINE_LOAD_PRIVATE_KEY
,
72 ENGINE_R_NO_LOAD_FUNCTION
);
75 pkey
= e
->load_privkey(e
, key_id
, ui_method
, callback_data
);
77 ENGINEerr(ENGINE_F_ENGINE_LOAD_PRIVATE_KEY
,
78 ENGINE_R_FAILED_LOADING_PRIVATE_KEY
);
84 EVP_PKEY
*ENGINE_load_public_key(ENGINE
*e
, const char *key_id
,
85 UI_METHOD
*ui_method
, void *callback_data
)
90 ENGINEerr(ENGINE_F_ENGINE_LOAD_PUBLIC_KEY
,
91 ERR_R_PASSED_NULL_PARAMETER
);
94 CRYPTO_THREAD_write_lock(global_engine_lock
);
95 if (e
->funct_ref
== 0) {
96 CRYPTO_THREAD_unlock(global_engine_lock
);
97 ENGINEerr(ENGINE_F_ENGINE_LOAD_PUBLIC_KEY
, ENGINE_R_NOT_INITIALISED
);
100 CRYPTO_THREAD_unlock(global_engine_lock
);
101 if (!e
->load_pubkey
) {
102 ENGINEerr(ENGINE_F_ENGINE_LOAD_PUBLIC_KEY
, ENGINE_R_NO_LOAD_FUNCTION
);
105 pkey
= e
->load_pubkey(e
, key_id
, ui_method
, callback_data
);
107 ENGINEerr(ENGINE_F_ENGINE_LOAD_PUBLIC_KEY
,
108 ENGINE_R_FAILED_LOADING_PUBLIC_KEY
);
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
)
121 ENGINEerr(ENGINE_F_ENGINE_LOAD_SSL_CLIENT_CERT
,
122 ERR_R_PASSED_NULL_PARAMETER
);
125 CRYPTO_THREAD_write_lock(global_engine_lock
);
126 if (e
->funct_ref
== 0) {
127 CRYPTO_THREAD_unlock(global_engine_lock
);
128 ENGINEerr(ENGINE_F_ENGINE_LOAD_SSL_CLIENT_CERT
,
129 ENGINE_R_NOT_INITIALISED
);
132 CRYPTO_THREAD_unlock(global_engine_lock
);
133 if (!e
->load_ssl_client_cert
) {
134 ENGINEerr(ENGINE_F_ENGINE_LOAD_SSL_CLIENT_CERT
,
135 ENGINE_R_NO_LOAD_FUNCTION
);
138 return e
->load_ssl_client_cert(e
, s
, ca_dn
, pcert
, ppkey
, pother
,
139 ui_method
, callback_data
);