Signed-off-by: Zhang Shuai wxsxsdz@gmail.com --- 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; + } } }