15c87c606SMark Murray /* crypto/engine/eng_pkey.c */ 25c87c606SMark Murray /* ==================================================================== 35c87c606SMark Murray * Copyright (c) 1999-2001 The OpenSSL Project. All rights reserved. 45c87c606SMark Murray * 55c87c606SMark Murray * Redistribution and use in source and binary forms, with or without 65c87c606SMark Murray * modification, are permitted provided that the following conditions 75c87c606SMark Murray * are met: 85c87c606SMark Murray * 95c87c606SMark Murray * 1. Redistributions of source code must retain the above copyright 105c87c606SMark Murray * notice, this list of conditions and the following disclaimer. 115c87c606SMark Murray * 125c87c606SMark Murray * 2. Redistributions in binary form must reproduce the above copyright 135c87c606SMark Murray * notice, this list of conditions and the following disclaimer in 145c87c606SMark Murray * the documentation and/or other materials provided with the 155c87c606SMark Murray * distribution. 165c87c606SMark Murray * 175c87c606SMark Murray * 3. All advertising materials mentioning features or use of this 185c87c606SMark Murray * software must display the following acknowledgment: 195c87c606SMark Murray * "This product includes software developed by the OpenSSL Project 205c87c606SMark Murray * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 215c87c606SMark Murray * 225c87c606SMark Murray * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 235c87c606SMark Murray * endorse or promote products derived from this software without 245c87c606SMark Murray * prior written permission. For written permission, please contact 255c87c606SMark Murray * licensing@OpenSSL.org. 265c87c606SMark Murray * 275c87c606SMark Murray * 5. Products derived from this software may not be called "OpenSSL" 285c87c606SMark Murray * nor may "OpenSSL" appear in their names without prior written 295c87c606SMark Murray * permission of the OpenSSL Project. 305c87c606SMark Murray * 315c87c606SMark Murray * 6. Redistributions of any form whatsoever must retain the following 325c87c606SMark Murray * acknowledgment: 335c87c606SMark Murray * "This product includes software developed by the OpenSSL Project 345c87c606SMark Murray * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 355c87c606SMark Murray * 365c87c606SMark Murray * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 375c87c606SMark Murray * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 385c87c606SMark Murray * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 395c87c606SMark Murray * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 405c87c606SMark Murray * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 415c87c606SMark Murray * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 425c87c606SMark Murray * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 435c87c606SMark Murray * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 445c87c606SMark Murray * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 455c87c606SMark Murray * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 465c87c606SMark Murray * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 475c87c606SMark Murray * OF THE POSSIBILITY OF SUCH DAMAGE. 485c87c606SMark Murray * ==================================================================== 495c87c606SMark Murray * 505c87c606SMark Murray * This product includes cryptographic software written by Eric Young 515c87c606SMark Murray * (eay@cryptsoft.com). This product includes software written by Tim 525c87c606SMark Murray * Hudson (tjh@cryptsoft.com). 535c87c606SMark Murray * 545c87c606SMark Murray */ 555c87c606SMark Murray 565c87c606SMark Murray #include <openssl/crypto.h> 575c87c606SMark Murray #include "cryptlib.h" 585c87c606SMark Murray #include "eng_int.h" 595c87c606SMark Murray #include <openssl/engine.h> 605c87c606SMark Murray 615c87c606SMark Murray /* Basic get/set stuff */ 625c87c606SMark Murray 635c87c606SMark Murray int ENGINE_set_load_privkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpriv_f) 645c87c606SMark Murray { 655c87c606SMark Murray e->load_privkey = loadpriv_f; 665c87c606SMark Murray return 1; 675c87c606SMark Murray } 685c87c606SMark Murray 695c87c606SMark Murray int ENGINE_set_load_pubkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpub_f) 705c87c606SMark Murray { 715c87c606SMark Murray e->load_pubkey = loadpub_f; 725c87c606SMark Murray return 1; 735c87c606SMark Murray } 745c87c606SMark Murray 755c87c606SMark Murray ENGINE_LOAD_KEY_PTR ENGINE_get_load_privkey_function(const ENGINE *e) 765c87c606SMark Murray { 775c87c606SMark Murray return e->load_privkey; 785c87c606SMark Murray } 795c87c606SMark Murray 805c87c606SMark Murray ENGINE_LOAD_KEY_PTR ENGINE_get_load_pubkey_function(const ENGINE *e) 815c87c606SMark Murray { 825c87c606SMark Murray return e->load_pubkey; 835c87c606SMark Murray } 845c87c606SMark Murray 855c87c606SMark Murray /* API functions to load public/private keys */ 865c87c606SMark Murray 875c87c606SMark Murray EVP_PKEY *ENGINE_load_private_key(ENGINE *e, const char *key_id, 885c87c606SMark Murray UI_METHOD *ui_method, void *callback_data) 895c87c606SMark Murray { 905c87c606SMark Murray EVP_PKEY *pkey; 915c87c606SMark Murray 925c87c606SMark Murray if(e == NULL) 935c87c606SMark Murray { 945c87c606SMark Murray ENGINEerr(ENGINE_F_ENGINE_LOAD_PRIVATE_KEY, 955c87c606SMark Murray ERR_R_PASSED_NULL_PARAMETER); 965c87c606SMark Murray return 0; 975c87c606SMark Murray } 985c87c606SMark Murray CRYPTO_w_lock(CRYPTO_LOCK_ENGINE); 995c87c606SMark Murray if(e->funct_ref == 0) 1005c87c606SMark Murray { 1015c87c606SMark Murray CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE); 1025c87c606SMark Murray ENGINEerr(ENGINE_F_ENGINE_LOAD_PRIVATE_KEY, 1035c87c606SMark Murray ENGINE_R_NOT_INITIALISED); 1045c87c606SMark Murray return 0; 1055c87c606SMark Murray } 1065c87c606SMark Murray CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE); 1075c87c606SMark Murray if (!e->load_privkey) 1085c87c606SMark Murray { 1095c87c606SMark Murray ENGINEerr(ENGINE_F_ENGINE_LOAD_PRIVATE_KEY, 1105c87c606SMark Murray ENGINE_R_NO_LOAD_FUNCTION); 1115c87c606SMark Murray return 0; 1125c87c606SMark Murray } 1135c87c606SMark Murray pkey = e->load_privkey(e, key_id, ui_method, callback_data); 1145c87c606SMark Murray if (!pkey) 1155c87c606SMark Murray { 1165c87c606SMark Murray ENGINEerr(ENGINE_F_ENGINE_LOAD_PRIVATE_KEY, 1175c87c606SMark Murray ENGINE_R_FAILED_LOADING_PRIVATE_KEY); 1185c87c606SMark Murray return 0; 1195c87c606SMark Murray } 1205c87c606SMark Murray return pkey; 1215c87c606SMark Murray } 1225c87c606SMark Murray 1235c87c606SMark Murray EVP_PKEY *ENGINE_load_public_key(ENGINE *e, const char *key_id, 1245c87c606SMark Murray UI_METHOD *ui_method, void *callback_data) 1255c87c606SMark Murray { 1265c87c606SMark Murray EVP_PKEY *pkey; 1275c87c606SMark Murray 1285c87c606SMark Murray if(e == NULL) 1295c87c606SMark Murray { 1305c87c606SMark Murray ENGINEerr(ENGINE_F_ENGINE_LOAD_PUBLIC_KEY, 1315c87c606SMark Murray ERR_R_PASSED_NULL_PARAMETER); 1325c87c606SMark Murray return 0; 1335c87c606SMark Murray } 1345c87c606SMark Murray CRYPTO_w_lock(CRYPTO_LOCK_ENGINE); 1355c87c606SMark Murray if(e->funct_ref == 0) 1365c87c606SMark Murray { 1375c87c606SMark Murray CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE); 1385c87c606SMark Murray ENGINEerr(ENGINE_F_ENGINE_LOAD_PUBLIC_KEY, 1395c87c606SMark Murray ENGINE_R_NOT_INITIALISED); 1405c87c606SMark Murray return 0; 1415c87c606SMark Murray } 1425c87c606SMark Murray CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE); 1435c87c606SMark Murray if (!e->load_pubkey) 1445c87c606SMark Murray { 1455c87c606SMark Murray ENGINEerr(ENGINE_F_ENGINE_LOAD_PUBLIC_KEY, 1465c87c606SMark Murray ENGINE_R_NO_LOAD_FUNCTION); 1475c87c606SMark Murray return 0; 1485c87c606SMark Murray } 1495c87c606SMark Murray pkey = e->load_pubkey(e, key_id, ui_method, callback_data); 1505c87c606SMark Murray if (!pkey) 1515c87c606SMark Murray { 1525c87c606SMark Murray ENGINEerr(ENGINE_F_ENGINE_LOAD_PUBLIC_KEY, 1535c87c606SMark Murray ENGINE_R_FAILED_LOADING_PUBLIC_KEY); 1545c87c606SMark Murray return 0; 1555c87c606SMark Murray } 1565c87c606SMark Murray return pkey; 1575c87c606SMark Murray } 158