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 42 tds5_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);