Home | History | Annotate | Download | only in engine
      1 /* crypto/engine/eng_pkey.c */
      2 /* ====================================================================
      3  * Copyright (c) 1999-2001 The OpenSSL Project.  All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  *
      9  * 1. Redistributions of source code must retain the above copyright
     10  *    notice, this list of conditions and the following disclaimer.
     11  *
     12  * 2. Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in
     14  *    the documentation and/or other materials provided with the
     15  *    distribution.
     16  *
     17  * 3. All advertising materials mentioning features or use of this
     18  *    software must display the following acknowledgment:
     19  *    "This product includes software developed by the OpenSSL Project
     20  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
     21  *
     22  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
     23  *    endorse or promote products derived from this software without
     24  *    prior written permission. For written permission, please contact
     25  *    licensing (at) OpenSSL.org.
     26  *
     27  * 5. Products derived from this software may not be called "OpenSSL"
     28  *    nor may "OpenSSL" appear in their names without prior written
     29  *    permission of the OpenSSL Project.
     30  *
     31  * 6. Redistributions of any form whatsoever must retain the following
     32  *    acknowledgment:
     33  *    "This product includes software developed by the OpenSSL Project
     34  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
     35  *
     36  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
     37  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     38  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     39  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
     40  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     41  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     42  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     43  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     44  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     45  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     46  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
     47  * OF THE POSSIBILITY OF SUCH DAMAGE.
     48  * ====================================================================
     49  *
     50  * This product includes cryptographic software written by Eric Young
     51  * (eay (at) cryptsoft.com).  This product includes software written by Tim
     52  * Hudson (tjh (at) cryptsoft.com).
     53  *
     54  */
     55 
     56 #include "eng_int.h"
     57 
     58 /* Basic get/set stuff */
     59 
     60 int ENGINE_set_load_privkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpriv_f)
     61 	{
     62 	e->load_privkey = loadpriv_f;
     63 	return 1;
     64 	}
     65 
     66 int ENGINE_set_load_pubkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpub_f)
     67 	{
     68 	e->load_pubkey = loadpub_f;
     69 	return 1;
     70 	}
     71 
     72 int ENGINE_set_load_ssl_client_cert_function(ENGINE *e,
     73 				ENGINE_SSL_CLIENT_CERT_PTR loadssl_f)
     74 	{
     75 	e->load_ssl_client_cert = loadssl_f;
     76 	return 1;
     77 	}
     78 
     79 ENGINE_LOAD_KEY_PTR ENGINE_get_load_privkey_function(const ENGINE *e)
     80 	{
     81 	return e->load_privkey;
     82 	}
     83 
     84 ENGINE_LOAD_KEY_PTR ENGINE_get_load_pubkey_function(const ENGINE *e)
     85 	{
     86 	return e->load_pubkey;
     87 	}
     88 
     89 ENGINE_SSL_CLIENT_CERT_PTR ENGINE_get_ssl_client_cert_function(const ENGINE *e)
     90 	{
     91 	return e->load_ssl_client_cert;
     92 	}
     93 
     94 /* API functions to load public/private keys */
     95 
     96 EVP_PKEY *ENGINE_load_private_key(ENGINE *e, const char *key_id,
     97 	UI_METHOD *ui_method, void *callback_data)
     98 	{
     99 	EVP_PKEY *pkey;
    100 
    101 	if(e == NULL)
    102 		{
    103 		ENGINEerr(ENGINE_F_ENGINE_LOAD_PRIVATE_KEY,
    104 			ERR_R_PASSED_NULL_PARAMETER);
    105 		return 0;
    106 		}
    107 	CRYPTO_w_lock(CRYPTO_LOCK_ENGINE);
    108 	if(e->funct_ref == 0)
    109 		{
    110 		CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE);
    111 		ENGINEerr(ENGINE_F_ENGINE_LOAD_PRIVATE_KEY,
    112 			ENGINE_R_NOT_INITIALISED);
    113 		return 0;
    114 		}
    115 	CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE);
    116 	if (!e->load_privkey)
    117 		{
    118 		ENGINEerr(ENGINE_F_ENGINE_LOAD_PRIVATE_KEY,
    119 			ENGINE_R_NO_LOAD_FUNCTION);
    120 		return 0;
    121 		}
    122 	pkey = e->load_privkey(e, key_id, ui_method, callback_data);
    123 	if (!pkey)
    124 		{
    125 		ENGINEerr(ENGINE_F_ENGINE_LOAD_PRIVATE_KEY,
    126 			ENGINE_R_FAILED_LOADING_PRIVATE_KEY);
    127 		return 0;
    128 		}
    129 	return pkey;
    130 	}
    131 
    132 EVP_PKEY *ENGINE_load_public_key(ENGINE *e, const char *key_id,
    133 	UI_METHOD *ui_method, void *callback_data)
    134 	{
    135 	EVP_PKEY *pkey;
    136 
    137 	if(e == NULL)
    138 		{
    139 		ENGINEerr(ENGINE_F_ENGINE_LOAD_PUBLIC_KEY,
    140 			ERR_R_PASSED_NULL_PARAMETER);
    141 		return 0;
    142 		}
    143 	CRYPTO_w_lock(CRYPTO_LOCK_ENGINE);
    144 	if(e->funct_ref == 0)
    145 		{
    146 		CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE);
    147 		ENGINEerr(ENGINE_F_ENGINE_LOAD_PUBLIC_KEY,
    148 			ENGINE_R_NOT_INITIALISED);
    149 		return 0;
    150 		}
    151 	CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE);
    152 	if (!e->load_pubkey)
    153 		{
    154 		ENGINEerr(ENGINE_F_ENGINE_LOAD_PUBLIC_KEY,
    155 			ENGINE_R_NO_LOAD_FUNCTION);
    156 		return 0;
    157 		}
    158 	pkey = e->load_pubkey(e, key_id, ui_method, callback_data);
    159 	if (!pkey)
    160 		{
    161 		ENGINEerr(ENGINE_F_ENGINE_LOAD_PUBLIC_KEY,
    162 			ENGINE_R_FAILED_LOADING_PUBLIC_KEY);
    163 		return 0;
    164 		}
    165 	return pkey;
    166 	}
    167 
    168 int ENGINE_load_ssl_client_cert(ENGINE *e, SSL *s,
    169 	STACK_OF(X509_NAME) *ca_dn, X509 **pcert, EVP_PKEY **ppkey,
    170 	STACK_OF(X509) **pother, UI_METHOD *ui_method, void *callback_data)
    171 	{
    172 
    173 	if(e == NULL)
    174 		{
    175 		ENGINEerr(ENGINE_F_ENGINE_LOAD_SSL_CLIENT_CERT,
    176 			ERR_R_PASSED_NULL_PARAMETER);
    177 		return 0;
    178 		}
    179 	CRYPTO_w_lock(CRYPTO_LOCK_ENGINE);
    180 	if(e->funct_ref == 0)
    181 		{
    182 		CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE);
    183 		ENGINEerr(ENGINE_F_ENGINE_LOAD_SSL_CLIENT_CERT,
    184 			ENGINE_R_NOT_INITIALISED);
    185 		return 0;
    186 		}
    187 	CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE);
    188 	if (!e->load_ssl_client_cert)
    189 		{
    190 		ENGINEerr(ENGINE_F_ENGINE_LOAD_SSL_CLIENT_CERT,
    191 			ENGINE_R_NO_LOAD_FUNCTION);
    192 		return 0;
    193 		}
    194 	return e->load_ssl_client_cert(e, s, ca_dn, pcert, ppkey, pother,
    195 					ui_method, callback_data);
    196 	}
    197