Alexandre Julliard : bcrypt: Move the public key initialization to the generic code.

Alexandre Julliard julliard at winehq.org
Tue Sep 29 15:20:38 CDT 2020


Module: wine
Branch: master
Commit: 54c1b0ac267abd0e52f23a60143999af2cd49b03
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=54c1b0ac267abd0e52f23a60143999af2cd49b03

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Sep 29 13:41:52 2020 +0200

bcrypt: Move the public key initialization to the generic code.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/bcrypt/bcrypt_internal.h | 10 +++++++++-
 dlls/bcrypt/bcrypt_main.c     | 18 +++++++++++++++---
 dlls/bcrypt/gnutls.c          | 20 ++++----------------
 dlls/bcrypt/macos.c           |  3 +--
 4 files changed, 29 insertions(+), 22 deletions(-)

diff --git a/dlls/bcrypt/bcrypt_internal.h b/dlls/bcrypt/bcrypt_internal.h
index 43be170d77..4caaf3307e 100644
--- a/dlls/bcrypt/bcrypt_internal.h
+++ b/dlls/bcrypt/bcrypt_internal.h
@@ -229,6 +229,13 @@ struct key_symmetric
     enum mode_id mode;
 };
 
+struct key_asymmetric
+{
+    ULONG             bitlen;     /* ignored for ECC keys */
+    UCHAR            *pubkey;
+    ULONG             pubkey_len;
+};
+
 struct key
 {
     struct object hdr;
@@ -236,6 +243,7 @@ struct key
     union
     {
         struct key_symmetric s;
+        struct key_asymmetric a;
     } u;
 };
 #endif
@@ -254,7 +262,7 @@ NTSTATUS key_symmetric_set_auth_data( struct key *, UCHAR *, ULONG ) DECLSPEC_HI
 NTSTATUS key_symmetric_encrypt( struct key *, const UCHAR *, ULONG, UCHAR *, ULONG ) DECLSPEC_HIDDEN;
 NTSTATUS key_symmetric_decrypt( struct key *, const UCHAR *, ULONG, UCHAR *, ULONG ) DECLSPEC_HIDDEN;
 NTSTATUS key_symmetric_get_tag( struct key *, UCHAR *, ULONG ) DECLSPEC_HIDDEN;
-NTSTATUS key_asymmetric_init( struct key *, struct algorithm *, ULONG, const UCHAR *, ULONG ) DECLSPEC_HIDDEN;
+NTSTATUS key_asymmetric_init( struct key * ) DECLSPEC_HIDDEN;
 NTSTATUS key_asymmetric_generate( struct key * ) DECLSPEC_HIDDEN;
 NTSTATUS key_asymmetric_sign( struct key *, void *, UCHAR *, ULONG, UCHAR *, ULONG, ULONG *, ULONG ) DECLSPEC_HIDDEN;
 NTSTATUS key_asymmetric_verify( struct key *, void *, UCHAR *, ULONG, UCHAR *, ULONG, DWORD ) DECLSPEC_HIDDEN;
diff --git a/dlls/bcrypt/bcrypt_main.c b/dlls/bcrypt/bcrypt_main.c
index 5413d486ed..30a1acfc0c 100644
--- a/dlls/bcrypt/bcrypt_main.c
+++ b/dlls/bcrypt/bcrypt_main.c
@@ -862,9 +862,22 @@ static NTSTATUS key_asymmetric_create( struct key **ret_key, struct algorithm *a
 
     if (!(key = heap_alloc_zero( sizeof(*key) ))) return STATUS_NO_MEMORY;
     key->hdr.magic  = MAGIC_KEY;
+    key->alg_id     = alg->id;
+    key->u.a.bitlen = bitlen;
 
-    if ((status = key_asymmetric_init( key, alg, bitlen, pubkey, pubkey_len )))
+    if (pubkey_len)
     {
+        if (!(key->u.a.pubkey = heap_alloc( pubkey_len )))
+        {
+            heap_free( key );
+            return STATUS_NO_MEMORY;
+        }
+        memcpy( key->u.a.pubkey, pubkey, pubkey_len );
+        key->u.a.pubkey_len = pubkey_len;
+    }
+    if ((status = key_asymmetric_init( key )))
+    {
+        heap_free( key->u.a.pubkey );
         heap_free( key );
         return status;
     }
@@ -1321,8 +1334,7 @@ static NTSTATUS key_duplicate( struct key *key_orig, struct key *key_copy )
     return STATUS_NOT_IMPLEMENTED;
 }
 
-NTSTATUS key_asymmetric_init( struct key *key, struct algorithm *alg, ULONG bitlen, const UCHAR *pubkey,
-                              ULONG pubkey_len )
+NTSTATUS key_asymmetric_init( struct key *key )
 {
     ERR( "support for keys not available at build time\n" );
     return STATUS_NOT_IMPLEMENTED;
diff --git a/dlls/bcrypt/gnutls.c b/dlls/bcrypt/gnutls.c
index 7acf819862..66c8f0f3e5 100644
--- a/dlls/bcrypt/gnutls.c
+++ b/dlls/bcrypt/gnutls.c
@@ -1121,12 +1121,11 @@ NTSTATUS key_import_dsa_capi( struct key *key, UCHAR *buf, ULONG len )
     return STATUS_SUCCESS;
 }
 
-NTSTATUS key_asymmetric_init( struct key *key, struct algorithm *alg, ULONG bitlen, const UCHAR *pubkey,
-                              ULONG pubkey_len )
+NTSTATUS key_asymmetric_init( struct key *key )
 {
     if (!libgnutls_handle) return STATUS_INTERNAL_ERROR;
 
-    switch (alg->id)
+    switch (key->alg_id)
     {
     case ALG_ID_ECDH_P256:
     case ALG_ID_ECDSA_P256:
@@ -1134,23 +1133,12 @@ NTSTATUS key_asymmetric_init( struct key *key, struct algorithm *alg, ULONG bitl
     case ALG_ID_RSA:
     case ALG_ID_RSA_SIGN:
     case ALG_ID_DSA:
-        break;
+        return STATUS_SUCCESS;
 
     default:
-        FIXME( "algorithm %u not supported\n", alg->id );
+        FIXME( "algorithm %u not supported\n", key->alg_id );
         return STATUS_NOT_SUPPORTED;
     }
-
-    if (pubkey_len)
-    {
-        if (!(key->u.a.pubkey = heap_alloc( pubkey_len ))) return STATUS_NO_MEMORY;
-        memcpy( key->u.a.pubkey, pubkey, pubkey_len );
-        key->u.a.pubkey_len = pubkey_len;
-    }
-    key->alg_id     = alg->id;
-    key->u.a.bitlen = bitlen;
-
-    return STATUS_SUCCESS;
 }
 
 static NTSTATUS import_gnutls_pubkey_ecc( struct key *key, gnutls_pubkey_t *gnutls_key )
diff --git a/dlls/bcrypt/macos.c b/dlls/bcrypt/macos.c
index 7f902535b8..8da67dc993 100644
--- a/dlls/bcrypt/macos.c
+++ b/dlls/bcrypt/macos.c
@@ -219,8 +219,7 @@ NTSTATUS key_symmetric_get_tag( struct key *key, UCHAR *tag, ULONG len )
     return STATUS_NOT_IMPLEMENTED;
 }
 
-NTSTATUS key_asymmetric_init( struct key *key, struct algorithm *alg, ULONG bitlen, const UCHAR *pubkey,
-                              ULONG pubkey_len )
+NTSTATUS key_asymmetric_init( struct key *key )
 {
     FIXME( "not implemented on Mac\n" );
     return STATUS_NOT_IMPLEMENTED;




More information about the wine-cvs mailing list