1 /* 2 * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. 3 * 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 8 */ 9 10 /* 11 * Legacy EVP_PKEY assign/set/get APIs are deprecated for public use, but 12 * still ok for internal use, particularly in providers. 13 */ 14 #include "internal/deprecated.h" 15 16 #include <openssl/types.h> 17 #include <openssl/evp.h> 18 #include <openssl/err.h> 19 #include <openssl/rsa.h> 20 #include <openssl/ec.h> 21 #include "crypto/types.h" 22 #include "crypto/evp.h" 23 #include "evp_local.h" 24 25 int EVP_PKEY_set1_RSA(EVP_PKEY *pkey, RSA *key) 26 { 27 int ret = EVP_PKEY_assign_RSA(pkey, key); 28 29 if (ret) 30 RSA_up_ref(key); 31 return ret; 32 } 33 34 RSA *evp_pkey_get0_RSA_int(const EVP_PKEY *pkey) 35 { 36 if (pkey->type != EVP_PKEY_RSA && pkey->type != EVP_PKEY_RSA_PSS) { 37 ERR_raise(ERR_LIB_EVP, EVP_R_EXPECTING_AN_RSA_KEY); 38 return NULL; 39 } 40 return evp_pkey_get_legacy((EVP_PKEY *)pkey); 41 } 42 43 const RSA *EVP_PKEY_get0_RSA(const EVP_PKEY *pkey) 44 { 45 return evp_pkey_get0_RSA_int(pkey); 46 } 47 48 RSA *EVP_PKEY_get1_RSA(EVP_PKEY *pkey) 49 { 50 RSA *ret = evp_pkey_get0_RSA_int(pkey); 51 52 if (ret != NULL) 53 RSA_up_ref(ret); 54 return ret; 55 } 56 57 #ifndef OPENSSL_NO_EC 58 int EVP_PKEY_set1_EC_KEY(EVP_PKEY *pkey, EC_KEY *key) 59 { 60 if (!EC_KEY_up_ref(key)) 61 return 0; 62 if (!EVP_PKEY_assign_EC_KEY(pkey, key)) { 63 EC_KEY_free(key); 64 return 0; 65 } 66 return 1; 67 } 68 69 EC_KEY *evp_pkey_get0_EC_KEY_int(const EVP_PKEY *pkey) 70 { 71 if (EVP_PKEY_get_base_id(pkey) != EVP_PKEY_EC) { 72 ERR_raise(ERR_LIB_EVP, EVP_R_EXPECTING_A_EC_KEY); 73 return NULL; 74 } 75 return evp_pkey_get_legacy((EVP_PKEY *)pkey); 76 } 77 78 const EC_KEY *EVP_PKEY_get0_EC_KEY(const EVP_PKEY *pkey) 79 { 80 return evp_pkey_get0_EC_KEY_int(pkey); 81 } 82 83 EC_KEY *EVP_PKEY_get1_EC_KEY(EVP_PKEY *pkey) 84 { 85 EC_KEY *ret = evp_pkey_get0_EC_KEY_int(pkey); 86 87 if (ret != NULL && !EC_KEY_up_ref(ret)) 88 ret = NULL; 89 return ret; 90 } 91 #endif /* OPENSSL_NO_EC */ 92