Paul Gofman : rsaenh: Factor out alloc_key() function.

Alexandre Julliard julliard at winehq.org
Mon May 16 15:37:59 CDT 2022


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

Author: Paul Gofman <pgofman at codeweavers.com>
Date:   Mon May 16 12:22:06 2022 -0500

rsaenh: Factor out alloc_key() function.

Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/rsaenh/rsaenh.c | 166 +++++++++++++++++++++++++++------------------------
 1 file changed, 87 insertions(+), 79 deletions(-)

diff --git a/dlls/rsaenh/rsaenh.c b/dlls/rsaenh/rsaenh.c
index fd39a5b125e..8a11da5f3f8 100644
--- a/dlls/rsaenh/rsaenh.c
+++ b/dlls/rsaenh/rsaenh.c
@@ -876,6 +876,92 @@ static inline void setup_key(CRYPTKEY *pCryptKey) {
                    pCryptKey->abKeyValue);
 }
 
+/******************************************************************************
+ * alloc_key [Internal]
+ *
+ */
+static HCRYPTKEY alloc_key(HCRYPTPROV hprov, ALG_ID alg_id, DWORD flags, DWORD key_len, CRYPTKEY **ret_key)
+{
+    KEYCONTAINER *key_container = get_key_container(hprov);
+    HCRYPTKEY hkey;
+    CRYPTKEY *key;
+
+    hkey = new_object(&handle_table, sizeof(CRYPTKEY), RSAENH_MAGIC_KEY,
+                      destroy_key, (OBJECTHDR**)&key);
+    if (hkey == (HCRYPTKEY)INVALID_HANDLE_VALUE)
+        return hkey;
+
+    key->aiAlgid = alg_id;
+    key->hProv = hprov;
+    key->dwModeBits = 0;
+    key->dwPermissions = CRYPT_ENCRYPT | CRYPT_DECRYPT | CRYPT_READ | CRYPT_WRITE | CRYPT_MAC;
+    if (flags & CRYPT_EXPORTABLE)
+        key->dwPermissions |= CRYPT_EXPORT;
+    key->dwKeyLen = key_len >> 3;
+    key->dwEffectiveKeyLen = 0;
+
+    /*
+     * For compatibility reasons a 40 bit key on the Enhanced
+     * provider will not have salt
+     */
+    if (key_container->dwPersonality == RSAENH_PERSONALITY_ENHANCED
+        && (alg_id == CALG_RC2 || alg_id == CALG_RC4)
+        && (flags & CRYPT_CREATE_SALT) && key_len == 40)
+        key->dwSaltLen = 0;
+    else if ((flags & CRYPT_CREATE_SALT) || (key_len == 40 && !(flags & CRYPT_NO_SALT)))
+        key->dwSaltLen = 16 /*FIXME*/ - key->dwKeyLen;
+    else
+        key->dwSaltLen = 0;
+    memset(key->abKeyValue, 0, sizeof(key->abKeyValue));
+    memset(key->abInitVector, 0, sizeof(key->abInitVector));
+    memset(&key->siSChannelInfo.saEncAlg, 0, sizeof(key->siSChannelInfo.saEncAlg));
+    memset(&key->siSChannelInfo.saMACAlg, 0, sizeof(key->siSChannelInfo.saMACAlg));
+    init_data_blob(&key->siSChannelInfo.blobClientRandom);
+    init_data_blob(&key->siSChannelInfo.blobServerRandom);
+    init_data_blob(&key->blobHmacKey);
+
+    switch(alg_id)
+    {
+        case CALG_PCT1_MASTER:
+        case CALG_SSL2_MASTER:
+        case CALG_SSL3_MASTER:
+        case CALG_TLS1_MASTER:
+        case CALG_RC4:
+            key->dwBlockLen = 0;
+            key->dwMode = 0;
+            break;
+
+        case CALG_RC2:
+        case CALG_DES:
+        case CALG_3DES_112:
+        case CALG_3DES:
+            key->dwBlockLen = 8;
+            key->dwMode = CRYPT_MODE_CBC;
+            break;
+
+        case CALG_AES_128:
+        case CALG_AES_192:
+        case CALG_AES_256:
+            key->dwBlockLen = 16;
+            key->dwMode = CRYPT_MODE_CBC;
+            break;
+
+        case CALG_RSA_KEYX:
+        case CALG_RSA_SIGN:
+            key->dwBlockLen = key_len >> 3;
+            key->dwMode = 0;
+            break;
+
+        case CALG_HMAC:
+            key->dwBlockLen = 0;
+            key->dwMode = 0;
+            break;
+    }
+
+    *ret_key = key;
+    return hkey;
+}
+
 /******************************************************************************
  * new_key [Internal]
  *
@@ -896,8 +982,6 @@ static inline void setup_key(CRYPTKEY *pCryptKey) {
  */
 static HCRYPTKEY new_key(HCRYPTPROV hProv, ALG_ID aiAlgid, DWORD dwFlags, CRYPTKEY **ppCryptKey)
 {
-    HCRYPTKEY hCryptKey;
-    CRYPTKEY *pCryptKey;
     DWORD dwKeyLen = HIWORD(dwFlags);
     const PROV_ENUMALGS_EX *peaAlgidInfo;
 
@@ -969,83 +1053,7 @@ static HCRYPTKEY new_key(HCRYPTPROV hProv, ALG_ID aiAlgid, DWORD dwFlags, CRYPTK
             }
     }
 
-    hCryptKey = new_object(&handle_table, sizeof(CRYPTKEY), RSAENH_MAGIC_KEY,
-                           destroy_key, (OBJECTHDR**)&pCryptKey);
-    if (hCryptKey != (HCRYPTKEY)INVALID_HANDLE_VALUE)
-    {
-        KEYCONTAINER *pKeyContainer = get_key_container(hProv);
-        pCryptKey->aiAlgid = aiAlgid;
-        pCryptKey->hProv = hProv;
-        pCryptKey->dwModeBits = 0;
-        pCryptKey->dwPermissions = CRYPT_ENCRYPT | CRYPT_DECRYPT | CRYPT_READ | CRYPT_WRITE | 
-                                   CRYPT_MAC;
-        if (dwFlags & CRYPT_EXPORTABLE)
-            pCryptKey->dwPermissions |= CRYPT_EXPORT;
-        pCryptKey->dwKeyLen = dwKeyLen >> 3;
-        pCryptKey->dwEffectiveKeyLen = 0;
-
-        /*
-         * For compatibility reasons a 40 bit key on the Enhanced
-         * provider will not have salt
-         */
-        if (pKeyContainer->dwPersonality == RSAENH_PERSONALITY_ENHANCED
-            && (aiAlgid == CALG_RC2 || aiAlgid == CALG_RC4)
-            && (dwFlags & CRYPT_CREATE_SALT) && dwKeyLen == 40)
-            pCryptKey->dwSaltLen = 0;
-        else if ((dwFlags & CRYPT_CREATE_SALT) || (dwKeyLen == 40 && !(dwFlags & CRYPT_NO_SALT)))
-            pCryptKey->dwSaltLen = 16 /*FIXME*/ - pCryptKey->dwKeyLen;
-        else
-            pCryptKey->dwSaltLen = 0;
-        memset(pCryptKey->abKeyValue, 0, sizeof(pCryptKey->abKeyValue));
-        memset(pCryptKey->abInitVector, 0, sizeof(pCryptKey->abInitVector));
-        memset(&pCryptKey->siSChannelInfo.saEncAlg, 0, sizeof(pCryptKey->siSChannelInfo.saEncAlg));
-        memset(&pCryptKey->siSChannelInfo.saMACAlg, 0, sizeof(pCryptKey->siSChannelInfo.saMACAlg));
-        init_data_blob(&pCryptKey->siSChannelInfo.blobClientRandom);
-        init_data_blob(&pCryptKey->siSChannelInfo.blobServerRandom);
-        init_data_blob(&pCryptKey->blobHmacKey);
-            
-        switch(aiAlgid)
-        {
-            case CALG_PCT1_MASTER:
-            case CALG_SSL2_MASTER:
-            case CALG_SSL3_MASTER:
-            case CALG_TLS1_MASTER:
-            case CALG_RC4:
-                pCryptKey->dwBlockLen = 0;
-                pCryptKey->dwMode = 0;
-                break;
-
-            case CALG_RC2:
-            case CALG_DES:
-            case CALG_3DES_112:
-            case CALG_3DES:
-                pCryptKey->dwBlockLen = 8;
-                pCryptKey->dwMode = CRYPT_MODE_CBC;
-                break;
-
-            case CALG_AES_128:
-            case CALG_AES_192:
-            case CALG_AES_256:
-                pCryptKey->dwBlockLen = 16;
-                pCryptKey->dwMode = CRYPT_MODE_CBC;
-                break;
-
-            case CALG_RSA_KEYX:
-            case CALG_RSA_SIGN:
-                pCryptKey->dwBlockLen = dwKeyLen >> 3;
-                pCryptKey->dwMode = 0;
-                break;
-
-            case CALG_HMAC:
-                pCryptKey->dwBlockLen = 0;
-                pCryptKey->dwMode = 0;
-                break;
-        }
-
-        *ppCryptKey = pCryptKey;
-    }
-
-    return hCryptKey;
+    return alloc_key(hProv, aiAlgid, dwFlags, dwKeyLen, ppCryptKey);
 }
 
 /******************************************************************************




More information about the wine-cvs mailing list