[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