20#include <openssl/rand.h>
21#include <openssl/bio.h>
22#include <openssl/pem.h>
23#include <openssl/err.h>
24#include <openssl/rsa.h>
38#error HAVE_OPENSSL not defines, this file should not be included
42tds5_rsa_encrypt(
const void *pem_key,
size_t pem_key_len,
const void *nonce,
size_t nonce_len,
const char *pwd,
size_t *em_size)
46 EVP_PKEY_CTX *ctx = NULL;
49#if OPENSSL_VERSION_NUMBER < 0x3000000FL
53 uint8_t *message = NULL;
54 size_t message_len, pwd_len;
57 keybio = BIO_new_mem_buf((
void *) pem_key, pem_key_len);
61#if OPENSSL_VERSION_NUMBER < 0x3000000FL
67 rsa = PEM_read_bio_RSAPublicKey(keybio, &rsa, NULL, NULL);
71 EVP_PKEY_set1_RSA(key, rsa);
73 key = PEM_read_bio_PUBKEY(keybio, &key, NULL, NULL);
78 pwd_len = strlen(pwd);
79 message_len = nonce_len + pwd_len;
80 message = tds_new(uint8_t, message_len);
83 memcpy(message, nonce, nonce_len);
84 memcpy(message + nonce_len, pwd, pwd_len);
86 *em_size = EVP_PKEY_size(key);
87 em = tds_new(uint8_t, *em_size);
91 ctx = EVP_PKEY_CTX_new(key, NULL);
94 if (EVP_PKEY_encrypt_init(ctx) <= 0
95 || EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_RSA, -1, EVP_PKEY_CTRL_RSA_PADDING, RSA_PKCS1_OAEP_PADDING, NULL) <= 0)
98 if (EVP_PKEY_encrypt(ctx, em, em_size, message, message_len) <= 0)
104#if OPENSSL_VERSION_NUMBER < 0x3000000FL
107 EVP_PKEY_CTX_free(ctx);