From: Paul Gofman pgofman@codeweavers.com
--- dlls/bcrypt/gnutls.c | 25 ++++++++++++++++++++++++- dlls/bcrypt/tests/bcrypt.c | 2 +- 2 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/dlls/bcrypt/gnutls.c b/dlls/bcrypt/gnutls.c index bb79e885652..d3f91608ad9 100644 --- a/dlls/bcrypt/gnutls.c +++ b/dlls/bcrypt/gnutls.c @@ -2203,11 +2203,34 @@ static NTSTATUS key_asymmetric_encrypt( void *args ) const struct key_asymmetric_encrypt_params *params = args; gnutls_datum_t d, e = { 0 }; NTSTATUS status = STATUS_SUCCESS; + gnutls_pubkey_t pubkey; int ret;
d.data = params->input; d.size = params->input_len; - if ((ret = pgnutls_pubkey_encrypt_data(key_data(params->key)->a.pubkey, 0, &d, &e))) + + if (!(pubkey = key_data(params->key)->a.pubkey)) + { + if (!key_data(params->key)->a.privkey) return STATUS_INVALID_HANDLE; + + if ((ret = pgnutls_pubkey_init( &pubkey ))) + { + pgnutls_perror( ret ); + return STATUS_INTERNAL_ERROR; + } + if ((ret = pgnutls_pubkey_import_privkey( pubkey, key_data(params->key)->a.privkey, 0, 0 ))) + { + pgnutls_perror( ret ); + pgnutls_pubkey_deinit( pubkey ); + return STATUS_INTERNAL_ERROR; + } + } + + ret = pgnutls_pubkey_encrypt_data(pubkey, 0, &d, &e); + if (pubkey != key_data(params->key)->a.pubkey) + pgnutls_pubkey_deinit( pubkey ); + + if (ret) { pgnutls_perror( ret ); return STATUS_INTERNAL_ERROR; diff --git a/dlls/bcrypt/tests/bcrypt.c b/dlls/bcrypt/tests/bcrypt.c index 39cdd015c90..3bcdda0cf47 100644 --- a/dlls/bcrypt/tests/bcrypt.c +++ b/dlls/bcrypt/tests/bcrypt.c @@ -2284,12 +2284,12 @@ static void test_rsa_encrypt(void) ret = BCryptGenerateKeyPair(rsa, &key, 512, 0); ok(ret == STATUS_SUCCESS, "got %lx\n", ret);
- todo_wine { /* Not finalized key */ ret = BCryptEncrypt(key, input, sizeof(input), NULL, NULL, 0, NULL, 0, &encrypted_size, 0); ok(ret == STATUS_INVALID_HANDLE, "got %lx\n", ret); BCryptFinalizeKeyPair(key, 0);
+ todo_wine { /* No padding */ memset(input_no_padding, 0, sizeof(input_no_padding)); strcpy((char *)input_no_padding, "Hello World");