Module: wine Branch: master Commit: b3073dc14a967fcc7fac38de4a347b46e6e6de82 URL: https://source.winehq.org/git/wine.git/?a=commit;h=b3073dc14a967fcc7fac38de4...
Author: Santino Mazza mazzasantino1206@gmail.com Date: Fri Mar 4 08:45:17 2022 +0100
bcrypt: Add support for PUBLICKEY blob types.
Signed-off-by: Santino Mazza mazzasantino1206@gmail.com Signed-off-by: Hans Leidekker hans@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/bcrypt/bcrypt_main.c | 28 ++++++++++++++++++++++++++++ dlls/bcrypt/tests/bcrypt.c | 16 ++++++++++++++++ 2 files changed, 44 insertions(+)
diff --git a/dlls/bcrypt/bcrypt_main.c b/dlls/bcrypt/bcrypt_main.c index 9fb9b6adf87..0fb78ce39a5 100644 --- a/dlls/bcrypt/bcrypt_main.c +++ b/dlls/bcrypt/bcrypt_main.c @@ -1775,6 +1775,34 @@ NTSTATUS WINAPI BCryptImportKeyPair( BCRYPT_ALG_HANDLE algorithm, BCRYPT_KEY_HAN return STATUS_NOT_IMPLEMENTED; }
+ if (!wcscmp( type, BCRYPT_PUBLIC_KEY_BLOB )) + { + BCRYPT_KEY_BLOB *key_blob = (BCRYPT_KEY_BLOB *)input; + + if (input_len < sizeof(*key_blob)) return STATUS_INVALID_PARAMETER; + + switch (key_blob->Magic) + { + case BCRYPT_ECDH_PUBLIC_P256_MAGIC: + case BCRYPT_ECDSA_PUBLIC_P256_MAGIC: + case BCRYPT_ECDSA_PUBLIC_P384_MAGIC: + type = BCRYPT_ECCPUBLIC_BLOB; + break; + + case BCRYPT_RSAPUBLIC_MAGIC: + type = BCRYPT_RSAPUBLIC_BLOB; + break; + + case BCRYPT_DSA_PUBLIC_MAGIC: + type = BCRYPT_DSA_PUBLIC_BLOB; + break; + + default: + FIXME( "unsupported key magic %#lx\n", key_blob->Magic ); + return STATUS_NOT_SUPPORTED; + } + } + return key_import_pair( alg, type, ret_key, input, input_len ); }
diff --git a/dlls/bcrypt/tests/bcrypt.c b/dlls/bcrypt/tests/bcrypt.c index 1588b72c3fd..5fb29a0e0ff 100644 --- a/dlls/bcrypt/tests/bcrypt.c +++ b/dlls/bcrypt/tests/bcrypt.c @@ -1845,6 +1845,10 @@ static void test_ECDSA(void)
ecckey->dwMagic = BCRYPT_ECDSA_PUBLIC_P256_MAGIC; ecckey->cbKey = 32; + status = BCryptImportKeyPair(alg, NULL, BCRYPT_PUBLIC_KEY_BLOB, &key, buffer, size, 0); + ok(!status, "BCryptImportKeyPair failed: %#lx\n", status); + BCryptDestroyKey(key); + status = BCryptImportKeyPair(alg, NULL, BCRYPT_ECCPUBLIC_BLOB, &key, buffer, size, 0); ok(!status, "BCryptImportKeyPair failed: %#lx\n", status);
@@ -2015,6 +2019,10 @@ static void test_RSA(void) ok(schemes, "schemes not set\n"); ok(size == sizeof(schemes), "got %lu\n", size);
+ ret = BCryptImportKeyPair(alg, NULL, BCRYPT_PUBLIC_KEY_BLOB, &key, rsaPublicBlob, sizeof(rsaPublicBlob), 0); + ok(!ret, "BCryptImportKeyPair failed: %#lx\n", ret); + BCryptDestroyKey(key); + ret = BCryptImportKeyPair(alg, NULL, BCRYPT_RSAPUBLIC_BLOB, &key, rsaPublicBlob, sizeof(rsaPublicBlob), 0); ok(!ret, "BCryptImportKeyPair failed: %#lx\n", ret);
@@ -2341,6 +2349,10 @@ static void test_ECDH(void) ok(ecckey->cbKey == 32, "got %lu\n", ecckey->cbKey); ok(size == sizeof(*ecckey) + ecckey->cbKey * 2, "got %lu\n", size);
+ status = BCryptImportKeyPair(alg, NULL, BCRYPT_PUBLIC_KEY_BLOB, &pubkey, buf, size, 0); + ok(status == STATUS_SUCCESS, "got %#lx\n", status); + BCryptDestroyKey(pubkey); + status = BCryptImportKeyPair(alg, NULL, BCRYPT_ECCPUBLIC_BLOB, &pubkey, buf, size, 0); ok(status == STATUS_SUCCESS, "got %#lx\n", status); HeapFree(GetProcessHeap(), 0, buf); @@ -2842,6 +2854,10 @@ static void test_DSA(void) ret = BCryptGetProperty(alg, L"PaddingSchemes", (UCHAR *)&schemes, sizeof(schemes), &size, 0); ok(ret == STATUS_NOT_SUPPORTED, "got %#lx\n", ret);
+ ret = BCryptImportKeyPair(alg, NULL, BCRYPT_PUBLIC_KEY_BLOB, &key, dsaPublicBlob, sizeof(dsaPublicBlob), 0); + ok(!ret, "got %#lx\n", ret); + BCryptDestroyKey(key); + ret = BCryptImportKeyPair(alg, NULL, BCRYPT_DSA_PUBLIC_BLOB, &key, dsaPublicBlob, sizeof(dsaPublicBlob), 0); ok(!ret, "got %#lx\n", ret);