[PATCH resend 02/10] dssenh: refactor rsaenh - table driven new_key_container.

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


---
 dlls/rsaenh/cryptoprovconfig.h | 32 ++++++++++++++++++++++++++++++++
 dlls/rsaenh/rsaenh.c           | 27 ++++++++++-----------------
 2 files changed, 42 insertions(+), 17 deletions(-)

diff --git a/dlls/rsaenh/cryptoprovconfig.h b/dlls/rsaenh/cryptoprovconfig.h
index 79a93a85f4..da6d526be2 100644
--- a/dlls/rsaenh/cryptoprovconfig.h
+++ b/dlls/rsaenh/cryptoprovconfig.h
@@ -28,4 +28,36 @@
 
 #ifndef __WINE_CRYPTOPROVCONFIG_H
 #define __WINE_CRYPTOPROVCONFIG_H
+#include "wincrypt.h"
+
+/******************************************************************************
+ * KEYCONTAINER - key containers
+ */
+#define RSAENH_PERSONALITY_BASE        0u
+#define RSAENH_PERSONALITY_STRONG      1u
+#define RSAENH_PERSONALITY_ENHANCED    2u
+#define RSAENH_PERSONALITY_SCHANNEL    3u
+#define RSAENH_PERSONALITY_AES         4u
+
+/******************************************************************************
+ * Used by new_key_container to determine the personality via provider name.
+ * The first entry in aProvNamePersonalityPairs should be the default personality.
+ */
+typedef struct tagPROVNAMEPERSONALITYPAIR
+{
+    LPCSTR pszProvName;
+    DWORD  dwPersonality;
+} PROVNAMEPERSONALITYPAIR;
+
+static const DWORD dwNProvNamePersonalityPairs = 6;
+static const PROVNAMEPERSONALITYPAIR aProvNamePersonalityPairs[6] =
+{
+    {"", RSAENH_PERSONALITY_STRONG},
+    {MS_DEF_PROV_A, RSAENH_PERSONALITY_BASE},
+    {MS_ENHANCED_PROV_A, RSAENH_PERSONALITY_ENHANCED},
+    {MS_DEF_RSA_SCHANNEL_PROV_A, RSAENH_PERSONALITY_SCHANNEL},
+    {MS_ENH_RSA_AES_PROV_A, RSAENH_PERSONALITY_AES},
+    {MS_ENH_RSA_AES_PROV_XP_A, RSAENH_PERSONALITY_AES}
+};
+
 #endif /* __WINE_CRYPTOPROVCONFIG_H */
diff --git a/dlls/rsaenh/rsaenh.c b/dlls/rsaenh/rsaenh.c
index f8fbd8071a..e05785e142 100644
--- a/dlls/rsaenh/rsaenh.c
+++ b/dlls/rsaenh/rsaenh.c
@@ -108,12 +108,6 @@ typedef struct tagCRYPTKEY
 /******************************************************************************
  * KEYCONTAINER - key containers
  */
-#define RSAENH_PERSONALITY_BASE        0u
-#define RSAENH_PERSONALITY_STRONG      1u
-#define RSAENH_PERSONALITY_ENHANCED    2u
-#define RSAENH_PERSONALITY_SCHANNEL    3u
-#define RSAENH_PERSONALITY_AES         4u
-
 #define RSAENH_MAGIC_CONTAINER         0x26384993u
 typedef struct tagKEYCONTAINER
 {
@@ -1270,6 +1264,7 @@ static HCRYPTPROV new_key_container(PCCH pszContainerName, DWORD dwFlags, const
 {
     KEYCONTAINER *pKeyContainer;
     HCRYPTPROV hKeyContainer;
+    DWORD i;
 
     hKeyContainer = new_object(&handle_table, sizeof(KEYCONTAINER), RSAENH_MAGIC_CONTAINER,
                                destroy_key_container, (OBJECTHDR**)&pKeyContainer);
@@ -1282,17 +1277,15 @@ static HCRYPTPROV new_key_container(PCCH pszContainerName, DWORD dwFlags, const
         pKeyContainer->hSignatureKeyPair = (HCRYPTKEY)INVALID_HANDLE_VALUE;
         if (pVTable && pVTable->pszProvName) {
             lstrcpynA(pKeyContainer->szProvName, pVTable->pszProvName, MAX_PATH);
-            if (!strcmp(pVTable->pszProvName, MS_DEF_PROV_A)) {
-                pKeyContainer->dwPersonality = RSAENH_PERSONALITY_BASE;
-            } else if (!strcmp(pVTable->pszProvName, MS_ENHANCED_PROV_A)) {
-                pKeyContainer->dwPersonality = RSAENH_PERSONALITY_ENHANCED;
-            } else if (!strcmp(pVTable->pszProvName, MS_DEF_RSA_SCHANNEL_PROV_A)) { 
-                pKeyContainer->dwPersonality = RSAENH_PERSONALITY_SCHANNEL;
-            } else if (!strcmp(pVTable->pszProvName, MS_ENH_RSA_AES_PROV_A) ||
-                       !strcmp(pVTable->pszProvName, MS_ENH_RSA_AES_PROV_XP_A)) {
-                pKeyContainer->dwPersonality = RSAENH_PERSONALITY_AES;
-            } else {
-                pKeyContainer->dwPersonality = RSAENH_PERSONALITY_STRONG;
+            pKeyContainer->dwPersonality
+                = aProvNamePersonalityPairs[0].dwPersonality;
+            for (i = 1; i < dwNProvNamePersonalityPairs; i++) {
+                if (!strcmp(pVTable->pszProvName,
+                            aProvNamePersonalityPairs[i].pszProvName)) {
+                    pKeyContainer->dwPersonality
+                        = aProvNamePersonalityPairs[i].dwPersonality;
+		    break;
+                }
             }
         }
 
-- 
2.21.0




More information about the wine-devel mailing list