[PATCH resend 04/10] dssenh: refactor rsaenh - move map_key_spec_to_permissions_name, store_key_permissions from rsaenh/rsaenh.c to rsaenh/cryptoprovutils.c

Zhang Shuai wxsxsdz at gmail.com
Sun Nov 17 13:01:29 CST 2019


---
 dlls/rsaenh/cryptoprovconfig.h |  14 ++++
 dlls/rsaenh/cryptoprovutils.c  |  87 +++++++++++++++++++++
 dlls/rsaenh/cryptoprovutils.h  |  35 +++++++++
 dlls/rsaenh/rsaenh.c           | 133 +--------------------------------
 4 files changed, 139 insertions(+), 130 deletions(-)

diff --git a/dlls/rsaenh/cryptoprovconfig.h b/dlls/rsaenh/cryptoprovconfig.h
index d282d0db1e..10cbc31b8b 100644
--- a/dlls/rsaenh/cryptoprovconfig.h
+++ b/dlls/rsaenh/cryptoprovconfig.h
@@ -29,6 +29,7 @@
 #ifndef __WINE_CRYPTOPROVCONFIG_H
 #define __WINE_CRYPTOPROVCONFIG_H
 #include "wincrypt.h"
+#include "implglue.h"
 
 /******************************************************************************
  * KEYCONTAINER - key containers
@@ -62,9 +63,22 @@ static const PROVNAMEPERSONALITYPAIR aProvNamePersonalityPairs[6] =
     {MS_ENH_RSA_AES_PROV_XP_A, RSAENH_PERSONALITY_AES}
 };
 
+/******************************************************************************
+ * CRYPTKEY - key objects
+ */
+#define RSAENH_MAGIC_KEY           0x73620457u
+#define RSAENH_KEYSTATE_IDLE       0
+#define RSAENH_KEYSTATE_ENCRYPTING 1
+#define RSAENH_KEYSTATE_MASTERKEY  2
+
 /******************************************************************************
  * Some magic constants
  */
 #define RSAENH_REGKEY "Software\\Wine\\Crypto\\RSA\\%s"
 
+/******************************************************************************
+ * Definitions concerning prefix.
+ */
+#define RSAENH_SCHANNEL_INFO SCHANNEL_INFO
+
 #endif /* __WINE_CRYPTOPROVCONFIG_H */
diff --git a/dlls/rsaenh/cryptoprovutils.c b/dlls/rsaenh/cryptoprovutils.c
index 23e0e11626..9f774bad1d 100644
--- a/dlls/rsaenh/cryptoprovutils.c
+++ b/dlls/rsaenh/cryptoprovutils.c
@@ -33,6 +33,13 @@
 #include "cryptoprovutils.h"
 #include "wine/debug.h"
 
+WINE_DEFAULT_DEBUG_CHANNEL(crypt);
+
+/******************************************************************************
+ * CSP's handle table (used by all acquired key containers)
+ */
+extern struct handle_table handle_table;
+
 /******************************************************************************
  * create_container_key [Internal]
  *
@@ -121,3 +128,83 @@ BOOL delete_container_key(LPCSTR pszContainerName, DWORD dwFlags)
     }
 }
 
+/******************************************************************************
+ * map_key_spec_to_key_pair_name [Internal]
+ *
+ * Returns the name of the registry value associated with a key spec.
+ *
+ * PARAMS
+ *  dwKeySpec     [I] AT_KEYEXCHANGE or AT_SIGNATURE
+ *
+ * RETURNS
+ *  Success: Name of registry value.
+ *  Failure: NULL
+ */
+LPCSTR map_key_spec_to_key_pair_name(DWORD dwKeySpec)
+{
+    LPCSTR szValueName;
+
+    switch (dwKeySpec)
+    {
+    case AT_KEYEXCHANGE:
+        szValueName = "KeyExchangeKeyPair";
+        break;
+    case AT_SIGNATURE:
+        szValueName = "SignatureKeyPair";
+        break;
+    default:
+        WARN("invalid key spec %d\n", dwKeySpec);
+        szValueName = NULL;
+    }
+    return szValueName;
+}
+
+/******************************************************************************
+ * store_key_pair [Internal]
+ *
+ * Stores a key pair to the registry
+ * 
+ * PARAMS
+ *  hCryptKey     [I] Handle to the key to be stored
+ *  hKey          [I] Registry key where the key pair is to be stored
+ *  dwKeySpec     [I] AT_KEYEXCHANGE or AT_SIGNATURE
+ *  dwFlags       [I] Flags for protecting the key
+ */
+void store_key_pair(HCRYPTKEY hCryptKey, HKEY hKey, DWORD dwKeySpec, DWORD dwFlags)
+{
+    LPCSTR szValueName;
+    DATA_BLOB blobIn, blobOut;
+    CRYPTKEY *pKey;
+    DWORD dwLen;
+    BYTE *pbKey;
+
+    if (!(szValueName = map_key_spec_to_key_pair_name(dwKeySpec)))
+        return;
+    if (lookup_handle(&handle_table, hCryptKey, RSAENH_MAGIC_KEY,
+                      (OBJECTHDR**)&pKey))
+    {
+        if (crypt_export_key(pKey, 0, PRIVATEKEYBLOB, 0, TRUE, 0, &dwLen))
+        {
+            pbKey = HeapAlloc(GetProcessHeap(), 0, dwLen);
+            if (pbKey)
+            {
+                if (crypt_export_key(pKey, 0, PRIVATEKEYBLOB, 0, TRUE, pbKey,
+                    &dwLen))
+                {
+                    blobIn.pbData = pbKey;
+                    blobIn.cbData = dwLen;
+
+                    if (CryptProtectData(&blobIn, NULL, NULL, NULL, NULL,
+                        dwFlags, &blobOut))
+                    {
+                        RegSetValueExA(hKey, szValueName, 0, REG_BINARY,
+                                       blobOut.pbData, blobOut.cbData);
+                        LocalFree(blobOut.pbData);
+                    }
+                }
+                HeapFree(GetProcessHeap(), 0, pbKey);
+            }
+        }
+    }
+}
+
diff --git a/dlls/rsaenh/cryptoprovutils.h b/dlls/rsaenh/cryptoprovutils.h
index 17d665e398..499b0b8140 100644
--- a/dlls/rsaenh/cryptoprovutils.h
+++ b/dlls/rsaenh/cryptoprovutils.h
@@ -39,7 +39,42 @@ typedef struct tagKEYCONTAINER
     HCRYPTKEY    hSignatureKeyPair;
 } KEYCONTAINER;
 
+typedef struct _SCHANNEL_INFO 
+{
+    SCHANNEL_ALG saEncAlg;
+    SCHANNEL_ALG saMACAlg;
+    CRYPT_DATA_BLOB blobClientRandom;
+    CRYPT_DATA_BLOB blobServerRandom;
+} SCHANNEL_INFO;
+
+#define RSAENH_MAX_KEY_SIZE     64
+#define RSAENH_MAX_BLOCK_SIZE   24
+typedef struct tagCRYPTKEY
+{
+    OBJECTHDR   header;
+    ALG_ID      aiAlgid;
+    HCRYPTPROV  hProv;
+    DWORD       dwMode;
+    DWORD       dwModeBits;
+    DWORD       dwPermissions;
+    DWORD       dwKeyLen;
+    DWORD       dwEffectiveKeyLen;
+    DWORD       dwSaltLen;
+    DWORD       dwBlockLen;
+    DWORD       dwState;
+    KEY_CONTEXT context;    
+    BYTE        abKeyValue[RSAENH_MAX_KEY_SIZE];
+    BYTE        abInitVector[RSAENH_MAX_BLOCK_SIZE];
+    BYTE        abChainVector[RSAENH_MAX_BLOCK_SIZE];
+    SCHANNEL_INFO siSChannelInfo;
+    CRYPT_DATA_BLOB blobHmacKey;
+} CRYPTKEY;
+
 BOOL create_container_key(KEYCONTAINER *pKeyContainer, REGSAM sam, HKEY *phKey);
 BOOL open_container_key(LPCSTR pszContainerName, DWORD dwFlags, REGSAM access, HKEY *phKey);
 BOOL delete_container_key(LPCSTR pszContainerName, DWORD dwFlags);
+BOOL crypt_export_key(CRYPTKEY *pCryptKey, HCRYPTKEY hPubKey, DWORD dwBlobType, 
+    DWORD dwFlags, BOOL force, BYTE *pbData, DWORD *pdwDataLen);
+LPCSTR map_key_spec_to_key_pair_name(DWORD dwKeySpec);
+void store_key_pair(HCRYPTKEY hCryptKey, HKEY hKey, DWORD dwKeySpec, DWORD dwFlags);
 #endif /* __WINE_CRYPTOPROVUTILS_H */
diff --git a/dlls/rsaenh/rsaenh.c b/dlls/rsaenh/rsaenh.c
index 069aee569f..8925abefab 100644
--- a/dlls/rsaenh/rsaenh.c
+++ b/dlls/rsaenh/rsaenh.c
@@ -67,44 +67,6 @@ typedef struct tagCRYPTHASH
     RSAENH_TLS1PRF_PARAMS tpPRFParams;
 } CRYPTHASH;
 
-/******************************************************************************
- * CRYPTKEY - key objects
- */
-#define RSAENH_MAGIC_KEY           0x73620457u
-#define RSAENH_MAX_KEY_SIZE        64
-#define RSAENH_MAX_BLOCK_SIZE      24
-#define RSAENH_KEYSTATE_IDLE       0
-#define RSAENH_KEYSTATE_ENCRYPTING 1
-#define RSAENH_KEYSTATE_MASTERKEY  2
-typedef struct _RSAENH_SCHANNEL_INFO 
-{
-    SCHANNEL_ALG saEncAlg;
-    SCHANNEL_ALG saMACAlg;
-    CRYPT_DATA_BLOB blobClientRandom;
-    CRYPT_DATA_BLOB blobServerRandom;
-} RSAENH_SCHANNEL_INFO;
-
-typedef struct tagCRYPTKEY
-{
-    OBJECTHDR   header;
-    ALG_ID      aiAlgid;
-    HCRYPTPROV  hProv;
-    DWORD       dwMode;
-    DWORD       dwModeBits;
-    DWORD       dwPermissions;
-    DWORD       dwKeyLen;
-    DWORD       dwEffectiveKeyLen;
-    DWORD       dwSaltLen;
-    DWORD       dwBlockLen;
-    DWORD       dwState;
-    KEY_CONTEXT context;    
-    BYTE        abKeyValue[RSAENH_MAX_KEY_SIZE];
-    BYTE        abInitVector[RSAENH_MAX_BLOCK_SIZE];
-    BYTE        abChainVector[RSAENH_MAX_BLOCK_SIZE];
-    RSAENH_SCHANNEL_INFO siSChannelInfo;
-    CRYPT_DATA_BLOB blobHmacKey;
-} CRYPTKEY;
-
 /******************************************************************************
  * Some magic constants
  */
@@ -293,16 +255,6 @@ RSAENH_CPDestroyHash(
     HCRYPTHASH hHash
 );
 
-static BOOL crypt_export_key(
-    CRYPTKEY *pCryptKey,
-    HCRYPTKEY hPubKey, 
-    DWORD dwBlobType, 
-    DWORD dwFlags, 
-    BOOL force,
-    BYTE *pbData, 
-    DWORD *pdwDataLen
-);
-
 static BOOL import_key(
     HCRYPTPROV hProv, 
     const BYTE *pbData,
@@ -325,7 +277,7 @@ RSAENH_CPHashData(
 /******************************************************************************
  * CSP's handle table (used by all acquired key containers)
  */
-static struct handle_table handle_table;
+struct handle_table handle_table;
 
 /******************************************************************************
  * DllMain (RSAENH.@)
@@ -910,86 +862,6 @@ static HCRYPTKEY new_key(HCRYPTPROV hProv, ALG_ID aiAlgid, DWORD dwFlags, CRYPTK
     return hCryptKey;
 }
 
-/******************************************************************************
- * map_key_spec_to_key_pair_name [Internal]
- *
- * Returns the name of the registry value associated with a key spec.
- *
- * PARAMS
- *  dwKeySpec     [I] AT_KEYEXCHANGE or AT_SIGNATURE
- *
- * RETURNS
- *  Success: Name of registry value.
- *  Failure: NULL
- */
-static LPCSTR map_key_spec_to_key_pair_name(DWORD dwKeySpec)
-{
-    LPCSTR szValueName;
-
-    switch (dwKeySpec)
-    {
-    case AT_KEYEXCHANGE:
-        szValueName = "KeyExchangeKeyPair";
-        break;
-    case AT_SIGNATURE:
-        szValueName = "SignatureKeyPair";
-        break;
-    default:
-        WARN("invalid key spec %d\n", dwKeySpec);
-        szValueName = NULL;
-    }
-    return szValueName;
-}
-
-/******************************************************************************
- * store_key_pair [Internal]
- *
- * Stores a key pair to the registry
- * 
- * PARAMS
- *  hCryptKey     [I] Handle to the key to be stored
- *  hKey          [I] Registry key where the key pair is to be stored
- *  dwKeySpec     [I] AT_KEYEXCHANGE or AT_SIGNATURE
- *  dwFlags       [I] Flags for protecting the key
- */
-static void store_key_pair(HCRYPTKEY hCryptKey, HKEY hKey, DWORD dwKeySpec, DWORD dwFlags)
-{
-    LPCSTR szValueName;
-    DATA_BLOB blobIn, blobOut;
-    CRYPTKEY *pKey;
-    DWORD dwLen;
-    BYTE *pbKey;
-
-    if (!(szValueName = map_key_spec_to_key_pair_name(dwKeySpec)))
-        return;
-    if (lookup_handle(&handle_table, hCryptKey, RSAENH_MAGIC_KEY,
-                      (OBJECTHDR**)&pKey))
-    {
-        if (crypt_export_key(pKey, 0, PRIVATEKEYBLOB, 0, TRUE, 0, &dwLen))
-        {
-            pbKey = HeapAlloc(GetProcessHeap(), 0, dwLen);
-            if (pbKey)
-            {
-                if (crypt_export_key(pKey, 0, PRIVATEKEYBLOB, 0, TRUE, pbKey,
-                    &dwLen))
-                {
-                    blobIn.pbData = pbKey;
-                    blobIn.cbData = dwLen;
-
-                    if (CryptProtectData(&blobIn, NULL, NULL, NULL, NULL,
-                        dwFlags, &blobOut))
-                    {
-                        RegSetValueExA(hKey, szValueName, 0, REG_BINARY,
-                                       blobOut.pbData, blobOut.cbData);
-                        LocalFree(blobOut.pbData);
-                    }
-                }
-                HeapFree(GetProcessHeap(), 0, pbKey);
-            }
-        }
-    }
-}
-
 /******************************************************************************
  * map_key_spec_to_permissions_name [Internal]
  *
@@ -2773,6 +2645,7 @@ static BOOL crypt_export_plaintext_key(CRYPTKEY *pCryptKey, BYTE *pbData,
     *pdwDataLen = dwDataLen;
     return TRUE;
 }
+
 /******************************************************************************
  * crypt_export_key [Internal]
  *
@@ -2794,7 +2667,7 @@ static BOOL crypt_export_plaintext_key(CRYPTKEY *pCryptKey, BYTE *pbData,
  *  Success: TRUE.
  *  Failure: FALSE.
  */
-static BOOL crypt_export_key(CRYPTKEY *pCryptKey, HCRYPTKEY hPubKey,
+BOOL crypt_export_key(CRYPTKEY *pCryptKey, HCRYPTKEY hPubKey,
                              DWORD dwBlobType, DWORD dwFlags, BOOL force,
                              BYTE *pbData, DWORD *pdwDataLen)
 {
-- 
2.21.0




More information about the wine-devel mailing list