[PATCH] dssenh: implement CPAcquireContext and CPReleaseContext

Zhang Shuai wxsxsdz at gmail.com
Thu Nov 21 18:12:30 CST 2019


Signed-off-by: Zhang Shuai <wxsxsdz at gmail.com>
---
 dlls/dssenh/Makefile.in |  14 +++-
 dlls/dssenh/dssenh.rgs  |  60 +++++++++++++++
 dlls/dssenh/dssenh.spec |   4 +-
 dlls/dssenh/rsrc.rc     |  31 ++++++++
 dlls/rsaenh/rsaenh.c    | 161 +++++++++++++++++++++++++++++++++++-----
 5 files changed, 247 insertions(+), 23 deletions(-)
 create mode 100644 dlls/dssenh/dssenh.rgs
 create mode 100644 dlls/dssenh/rsrc.rc

diff --git a/dlls/dssenh/Makefile.in b/dlls/dssenh/Makefile.in
index 4f05beee51..80c904fcab 100644
--- a/dlls/dssenh/Makefile.in
+++ b/dlls/dssenh/Makefile.in
@@ -1,6 +1,18 @@
 MODULE    = dssenh.dll
+IMPORTLIB = dssenh
+IMPORTS   = bcrypt crypt32 advapi32
 
 EXTRADLLFLAGS = -mno-cygwin
 
 C_SRCS = \
-	main.c
+	../rsaenh/aes.c \
+	../rsaenh/des.c \
+	../rsaenh/handle.c \
+	../rsaenh/implglue.c \
+	../rsaenh/mpi.c \
+	../rsaenh/rc2.c \
+	../rsaenh/rc4.c \
+	../rsaenh/rsa.c \
+	../rsaenh/rsaenh.c
+
+RC_SRCS = rsrc.rc
diff --git a/dlls/dssenh/dssenh.rgs b/dlls/dssenh/dssenh.rgs
new file mode 100644
index 0000000000..e16d8e0bc7
--- /dev/null
+++ b/dlls/dssenh/dssenh.rgs
@@ -0,0 +1,60 @@
+HKLM
+{
+    NoRemove Software
+    {
+        NoRemove Microsoft
+        {
+            NoRemove Cryptography
+            {
+                NoRemove Defaults
+                {
+                    NoRemove Provider
+                    {
+                        ForceRemove 'Microsoft Enhanced DSS and Diffie-Hellman Cryptographic Provider'
+                        {
+                            val 'Image Path' = s '%MODULE%'
+                            val 'Signature' = b deadbeef
+                            val 'Type' = d 13
+                        }
+                        ForceRemove 'Microsoft Base DSS and Diffie-Hellman Cryptographic Provider'
+                        {
+                            val 'Image Path' = s '%MODULE%'
+                            val 'Signature' = b deadbeef
+                            val 'Type' = d 13
+                        }
+                        ForceRemove 'Microsoft Base DSS Cryptographic Provider'
+                        {
+                            val 'Image Path' = s '%MODULE%'
+                            val 'Signature' = b deadbeef
+                            val 'Type' = d 3
+                        }
+                        ForceRemove 'Microsoft DH SChannel Cryptographic Provider'
+                        {
+                            val 'Image Path' = s '%MODULE%'
+                            val 'Signature' = b deadbeef
+                            val 'Type' = d 18
+                        }
+                    }
+                    NoRemove 'Provider Types'
+                    {
+                        ForceRemove 'Type 013'
+                        {
+                            val 'Name' = s 'Microsoft Enhanced DSS and Diffie-Hellman Cryptographic Provider'
+                            val 'TypeName' = s 'DSS Signature with Diffe-zhellman Key Exchange'
+                        }
+                        ForceRemove 'Type 003'
+                        {
+                            val 'Name' = s 'Microsoft Base DSS Cryptographic Provider'
+                            val 'TypeName' = s 'DSS Signature'
+                        }
+                        ForceRemove 'Type 018'
+                        {
+                            val 'Name' = s 'Microsoft DH SChannel Cryptographic Provider'
+                            val 'TypeName' = s 'Diffie-Hellman SChannel'
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/dlls/dssenh/dssenh.spec b/dlls/dssenh/dssenh.spec
index c5c2545281..a98b26fc6f 100644
--- a/dlls/dssenh/dssenh.spec
+++ b/dlls/dssenh/dssenh.spec
@@ -1,4 +1,4 @@
-@ stub CPAcquireContext
+@ stdcall CPAcquireContext(ptr str long ptr) RSAENH_CPAcquireContext
 @ stub CPCreateHash
 @ stub CPDecrypt
 @ stub CPDeriveKey
@@ -17,7 +17,7 @@
 @ stub CPHashData
 @ stub CPHashSessionKey
 @ stub CPImportKey
-@ stub CPReleaseContext
+@ stdcall CPReleaseContext(long long) RSAENH_CPReleaseContext
 @ stub CPSetHashParam
 @ stub CPSetKeyParam
 @ stub CPSetProvParam
diff --git a/dlls/dssenh/rsrc.rc b/dlls/dssenh/rsrc.rc
new file mode 100644
index 0000000000..3ec4fc17f1
--- /dev/null
+++ b/dlls/dssenh/rsrc.rc
@@ -0,0 +1,31 @@
+/*
+ * Resources for dssenh
+ *
+ * Copyright (c) 2007 Alexandre Julliard
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+/* @makedep: dssenh.rgs */
+1 WINE_REGISTRY dssenh.rgs
+
+#define WINE_FILEDESCRIPTION_STR "Wine dssenh"
+#define WINE_FILENAME_STR "dssenh.dll"
+#define WINE_FILEVERSION 5,1,2600,2180
+#define WINE_FILEVERSION_STR "5.1.2600.2180"
+#define WINE_PRODUCTVERSION 5,1,2600,2180
+#define WINE_PRODUCTVERSION_STR "5.1.2600.2180"
+
+#include "wine/wine_common_ver.rc"
diff --git a/dlls/rsaenh/rsaenh.c b/dlls/rsaenh/rsaenh.c
index 9119d4be2d..8c0fb20d4b 100644
--- a/dlls/rsaenh/rsaenh.c
+++ b/dlls/rsaenh/rsaenh.c
@@ -39,6 +39,8 @@
 WINE_DEFAULT_DEBUG_CHANNEL(crypt);
 
 static HINSTANCE instance;
+static CHAR szDllName[MAX_PATH];
+#define provider_is_rsa() (szDllName[0] == 'r' && szDllName[1] == 's' && szDllName[2] == 'a')
 
 /******************************************************************************
  * CRYPTHASH - hash objects
@@ -112,6 +114,10 @@ typedef struct tagCRYPTKEY
 #define RSAENH_PERSONALITY_ENHANCED    2u
 #define RSAENH_PERSONALITY_SCHANNEL    3u
 #define RSAENH_PERSONALITY_AES         4u
+#define DSSENH_PERSONALITY_BASE        5u
+#define DSSENH_PERSONALITY_BASE_DH     6u
+#define DSSENH_PERSONALITY_ENHANCED    7u
+#define DSSENH_PERSONALITY_SCHANNEL    8u
 
 #define RSAENH_MAGIC_CONTAINER         0x26384993u
 typedef struct tagKEYCONTAINER
@@ -150,6 +156,7 @@ typedef struct tagKEYCONTAINER
 #define RSAENH_TLS1_VERSION_MAJOR         3
 #define RSAENH_TLS1_VERSION_MINOR         1
 #define RSAENH_REGKEY "Software\\Wine\\Crypto\\RSA\\%s"
+#define DSSENH_REGKEY "Software\\Wine\\Crypto\\DSS\\%s"
 
 #define RSAENH_MIN(a,b) ((a)<(b)?(a):(b))
 /******************************************************************************
@@ -158,7 +165,7 @@ typedef struct tagKEYCONTAINER
 #define RSAENH_MAX_ENUMALGS 24
 #define RSAENH_PCT1_SSL2_SSL3_TLS1 (CRYPT_FLAG_PCT1|CRYPT_FLAG_SSL2|CRYPT_FLAG_SSL3|CRYPT_FLAG_TLS1)
 #define S(s) sizeof(s), s
-static const PROV_ENUMALGS_EX aProvEnumAlgsEx[5][RSAENH_MAX_ENUMALGS+1] =
+static const PROV_ENUMALGS_EX aProvEnumAlgsEx[9][RSAENH_MAX_ENUMALGS+1] =
 {
  {
   {CALG_RC2, 40, 40, 56, 0, S("RC2"), S("RSA Data Security's RC2")},
@@ -254,6 +261,61 @@ static const PROV_ENUMALGS_EX aProvEnumAlgsEx[5][RSAENH_MAX_ENUMALGS+1] =
   {CALG_RSA_KEYX, 1024, 384, 16384, CRYPT_FLAG_SIGNING|CRYPT_FLAG_IPSEC, S("RSA_KEYX"), S("RSA Key Exchange")},
   {CALG_HMAC, 0, 0, 0, 0, S("HMAC"), S("Hugo's MAC (HMAC)")},
   {0, 0, 0, 0, 0, S(""), S("")}
+ },
+ /* MS_DEF_DSS_PROV */
+ {
+  {CALG_SHA, 160, 160, 160, CRYPT_FLAG_SIGNING, S("SHA-1"), S("Secure Hash Algorithm (SHA-1)")},
+  {CALG_MD5, 128, 128, 128, 0, S("MD5"), S("Message Digest 5 (MD5)")},
+  {CALG_DSS_SIGN, 1024, 512, 1024, CRYPT_FLAG_SIGNING, S("DSA_SIGN"), S("Digital Signature Algorithm")},
+  {0, 0, 0, 0, 0, S(""), S("")}
+ },
+ /* MS_DEF_DSS_DH_PROV */
+ {
+  {CALG_CYLINK_MEK, 40, 40, 40, 0, S("CYLINK MEK"), S("CYLINK Message Encryption Algorithm")},
+  {CALG_RC2, 40, 40, 56, 0, S("RC2"), S("RSA Data Security's RC2")},
+  {CALG_RC4, 40, 40, 56, 0, S("RC4"), S("RSA Data Security's RC4")},
+  {CALG_DES, 56, 56, 56, 0, S("DES"), S("Data Encryption Standard (DES)")},
+  {CALG_SHA, 160, 160, 160, CRYPT_FLAG_SIGNING, S("SHA-1"), S("Secure Hash Algorithm (SHA-1)")},
+  {CALG_MD5, 128, 128, 128, 0, S("MD5"), S("Message Digest 5 (MD5)")},
+  {CALG_DSS_SIGN, 1024, 512, 1024, CRYPT_FLAG_SIGNING, S("DSA_SIGN"), S("Digital Signature Algorithm")},
+  {CALG_DH_SF, 512, 512, 1024, 0, S("DH_KEYX"), S("Diffie-Hellman Key Exchange Algorithm")},
+  {CALG_DH_EPHEM, 512, 512, 1024, 0, S("DH_KEYX"), S("Diffie-Hellman Ephemeral Algorithm")},
+  {0, 0, 0, 0, 0, S(""), S("")}
+ },
+ /* MS_ENH_DSS_DH_PROV */
+ {
+  {CALG_CYLINK_MEK, 40, 40, 40, 0, S("CYLINK MEK"), S("CYLINK Message Encryption Algorithm")},
+  {CALG_RC2, 128, 40, 128, 0, S("RC2"), S("RSA Data Security's RC2")},
+  {CALG_RC4, 128, 40, 128, 0, S("RC4"), S("RSA Data Security's RC4")},
+  {CALG_3DES_112, 112, 112, 112, 0, S("3DES TWO KEY"), S("Two Key Triple DES")},
+  {CALG_3DES, 168, 168, 168, 0, S("3DES"), S("Three Key Triple DES")},
+  {CALG_DES, 56, 56, 56, 0, S("DES"), S("Data Encryption Standard (DES)")},
+  {CALG_SHA, 160, 160, 160, CRYPT_FLAG_SIGNING, S("SHA-1"), S("Secure Hash Algorithm (SHA-1)")},
+  {CALG_MD5, 128, 128, 128, 0, S("MD5"), S("Message Digest 5 (MD5)")},
+  {CALG_DSS_SIGN, 1024, 512, 1024, CRYPT_FLAG_SIGNING, S("DSA_SIGN"), S("Digital Signature Algorithm")},
+  {CALG_DH_SF, 512, 512, 1024, 0, S("DH_KEYX"), S("Diffie-Hellman Key Exchange Algorithm")},
+  {CALG_DH_EPHEM, 512, 512, 1024, 0, S("DH_KEYX"), S("Diffie-Hellman Ephemeral Algorithm")},
+  {0, 0, 0, 0, 0, S(""), S("")}
+ },
+ /* MS_DEF_DH_SCHANNEL_PROV */
+ {
+  {CALG_CYLINK_MEK, 40, 40, 40, CRYPT_FLAG_SSL3|CRYPT_FLAG_TLS1, S("CYLINK MEK"), S("CYLINK Message Encryption Algorithm")},
+  {CALG_RC2, 40, 40, 128, CRYPT_FLAG_SSL3|CRYPT_FLAG_TLS1, S("RC2"), S("RSA Data Security's RC2")},
+  {CALG_RC4, 40, 40, 128, CRYPT_FLAG_SSL3|CRYPT_FLAG_TLS1, S("RC4"), S("RSA Data Security's RC4")},
+  {CALG_3DES_112, 112, 112, 112, CRYPT_FLAG_SSL3|CRYPT_FLAG_TLS1, S("3DES TWO KEY"), S("Two Key Triple DES")},
+  {CALG_3DES, 168, 168, 168, CRYPT_FLAG_SSL3|CRYPT_FLAG_TLS1, S("3DES"), S("Three Key Triple DES")},
+  {CALG_DES, 56, 56, 56, CRYPT_FLAG_SSL3|CRYPT_FLAG_TLS1, S("DES"), S("Data Encryption Standard (DES)")},
+  {CALG_SHA, 160, 160, 160, CRYPT_FLAG_SSL3|CRYPT_FLAG_TLS1|CRYPT_FLAG_SIGNING, S("SHA-1"), S("Secure Hash Algorithm (SHA-1)")},
+  {CALG_MD5, 128, 128, 128, CRYPT_FLAG_SSL3|CRYPT_FLAG_TLS1|CRYPT_FLAG_SIGNING, S("MD5"), S("Message Digest 5 (MD5)")},
+  {CALG_DSS_SIGN, 1024, 512, 1024, CRYPT_FLAG_SSL3|CRYPT_FLAG_TLS1|CRYPT_FLAG_SIGNING, S("DSA_SIGN"), S("Digital Signature Algorithm")},
+  {CALG_DH_SF, 512, 512, 4096, CRYPT_FLAG_SSL3|CRYPT_FLAG_TLS1, S("DH_KEYX"), S("Diffie-Hellman Key Exchange Algorithm")},
+  {CALG_DH_EPHEM, 512, 512, 4096, CRYPT_FLAG_SSL3|CRYPT_FLAG_TLS1, S("DH_KEYX"), S("Diffie-Hellman Ephemeral Algorithm")},
+  {CALG_SSL3_MASTER, 384, 384, 384, CRYPT_FLAG_SSL3, S("SSL3 MASTER"), S("SSL3 Master")},
+  {CALG_TLS1_MASTER, 384, 384, 384, CRYPT_FLAG_TLS1, S("TLS1 MASTER"), S("TLS1 Master")},
+  {CALG_SCHANNEL_MASTER_HASH, 0, 0, -1, 0, S("SCH MASTER HASH"), S("SChannel Master Hash")},
+  {CALG_SCHANNEL_MAC_KEY, 0, 0, -1, 0, S("SCH MAC KEY"), S("SChannel MAC Key")},
+  {CALG_SCHANNEL_ENC_KEY, 0, 0, -1, 0, S("SCH ENC KEY"), S("SChannel Encryption Key")},
+  {0, 0, 0, 0, 0, S(""), S("")}
  }
 };
 #undef S
@@ -350,6 +412,40 @@ RSAENH_CPHashData(
  */
 static struct handle_table handle_table;
 
+/******************************************************************************
+ * get_dll_name [Internal]
+ *
+ * Get the dll name by calling GetModuleFileNameA. Use dll name to distinguish
+ * whether we are RSA or DSS.
+ *
+ * RETURNS
+ *  Success: TRUE
+ *  Failure: FALSE
+ *
+ * NOTES
+ *  We assume the filepath returned by GetModuleFileNameA is always of the
+ *  format "C:\windows\system32\xxxxxx.dll".
+ */
+static BOOL get_dll_name(void)
+{
+    DWORD i, dwLastBkslashPos = -1;
+    GetModuleFileNameA(instance, szDllName, sizeof(szDllName));
+    if (GetLastError() != ERROR_SUCCESS) {
+        TRACE("Unable to get dll name: error %08lx", GetLastError());
+        return FALSE;
+    }
+    for (i = 0; szDllName[i]; i++) {
+        if (szDllName[i] == '\\')
+            dwLastBkslashPos = i;
+    }
+    if (dwLastBkslashPos != -1) {
+        for (i = 0; szDllName[i + dwLastBkslashPos]; i++) {
+            szDllName[i] = szDllName[i + dwLastBkslashPos + 1];
+        }
+    }
+    return TRUE;
+}
+
 /******************************************************************************
  * DllMain (RSAENH.@)
  *
@@ -363,6 +459,9 @@ BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID reserved)
             instance = hInstance;
             DisableThreadLibraryCalls(hInstance);
             init_handle_table(&handle_table);
+            if (!get_dll_name()) {
+                return FALSE;
+            }
             break;
 
         case DLL_PROCESS_DETACH:
@@ -1084,15 +1183,18 @@ static BOOL create_container_key(KEYCONTAINER *pKeyContainer, REGSAM sam, HKEY *
     CHAR szRSABase[sizeof(RSAENH_REGKEY) + MAX_PATH];
     HKEY hRootKey;
 
-    sprintf(szRSABase, RSAENH_REGKEY, pKeyContainer->szName);
+    if (provider_is_rsa())
+        sprintf(szRSABase, RSAENH_REGKEY, pKeyContainer->szName);
+    else /* provider_is_dss */
+        sprintf(szRSABase, DSSENH_REGKEY, pKeyContainer->szName);
 
     if (pKeyContainer->dwFlags & CRYPT_MACHINE_KEYSET)
         hRootKey = HKEY_LOCAL_MACHINE;
     else
         hRootKey = HKEY_CURRENT_USER;
 
-    /* @@ Wine registry key: HKLM\Software\Wine\Crypto\RSA */
-    /* @@ Wine registry key: HKCU\Software\Wine\Crypto\RSA */
+    /* @@ Wine registry key: HKLM\Software\Wine\Crypto\RSA|DSS */
+    /* @@ Wine registry key: HKCU\Software\Wine\Crypto\RSA|DSS */
     return RegCreateKeyExA(hRootKey, szRSABase, 0, NULL,
                            REG_OPTION_NON_VOLATILE, sam, NULL, phKey, NULL)
                            == ERROR_SUCCESS;
@@ -1115,15 +1217,18 @@ static BOOL open_container_key(LPCSTR pszContainerName, DWORD dwFlags, REGSAM ac
     CHAR szRSABase[sizeof(RSAENH_REGKEY) + MAX_PATH];
     HKEY hRootKey;
 
-    sprintf(szRSABase, RSAENH_REGKEY, pszContainerName);
+    if (provider_is_rsa())
+        sprintf(szRSABase, RSAENH_REGKEY, pszContainerName);
+    else /* provider_is_dss */
+        sprintf(szRSABase, DSSENH_REGKEY, pszContainerName);
 
     if (dwFlags & CRYPT_MACHINE_KEYSET)
         hRootKey = HKEY_LOCAL_MACHINE;
     else
         hRootKey = HKEY_CURRENT_USER;
 
-    /* @@ Wine registry key: HKLM\Software\Wine\Crypto\RSA */
-    /* @@ Wine registry key: HKCU\Software\Wine\Crypto\RSA */
+    /* @@ Wine registry key: HKLM\Software\Wine\Crypto\RSA|DSS */
+    /* @@ Wine registry key: HKCU\Software\Wine\Crypto\RSA|DSS */
     return RegOpenKeyExA(hRootKey, szRSABase, 0, access, phKey) ==
                          ERROR_SUCCESS;
 }
@@ -1142,7 +1247,10 @@ static BOOL delete_container_key(LPCSTR pszContainerName, DWORD dwFlags)
     CHAR szRegKey[sizeof(RSAENH_REGKEY) + MAX_PATH];
     HKEY hRootKey;
 
-    sprintf(szRegKey, RSAENH_REGKEY, pszContainerName);
+    if (provider_is_rsa())
+        sprintf(szRegKey, RSAENH_REGKEY, pszContainerName);
+    else /* provider_is_dss */
+        sprintf(szRegKey, DSSENH_REGKEY, pszContainerName);
 
     if (dwFlags & CRYPT_MACHINE_KEYSET)
         hRootKey = HKEY_LOCAL_MACHINE;
@@ -1171,7 +1279,7 @@ static void store_key_container_keys(KEYCONTAINER *pKeyContainer)
     DWORD dwFlags;
 
     /* On WinXP, persistent keys are stored in a file located at:
-     * $AppData$\\Microsoft\\Crypto\\RSA\\$SID$\\some_hex_string
+     * $AppData$\\Microsoft\\Crypto\\RSA|DSS\\$SID$\\some_hex_string
      */
 
     if (pKeyContainer->dwFlags & CRYPT_MACHINE_KEYSET)
@@ -1281,17 +1389,30 @@ 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;
+            if (provider_is_rsa()) {
+                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;
+                }
+            }
+            else /* provider_is_dss */ {
+                if (!strcmp(pVTable->pszProvName, MS_DEF_DSS_DH_PROV_A)) {
+                    pKeyContainer->dwPersonality = DSSENH_PERSONALITY_BASE_DH;
+                } else if (!strcmp(pVTable->pszProvName, MS_DEF_DH_SCHANNEL_PROV_A)) {
+                    pKeyContainer->dwPersonality = DSSENH_PERSONALITY_SCHANNEL;
+                } else if (!strcmp(pVTable->pszProvName, MS_DEF_DSS_PROV_A)) { 
+                    pKeyContainer->dwPersonality = DSSENH_PERSONALITY_BASE;
+                } else {
+                    pKeyContainer->dwPersonality = DSSENH_PERSONALITY_ENHANCED;
+                }
             }
         }
 
-- 
2.19.1




More information about the wine-devel mailing list