[PATCH 10/10] dssenh: implement CPAcquireContext and CPReleaseContext for dssenh.

shuai zhang wxsxsdz at gmail.com
Sun Nov 17 09:29:42 CST 2019


Signed-off-by: Zhang Shuai <wxsxsdz at gmail.com>
---
 dlls/dssenh/Makefile.in        |   4 +-
 dlls/dssenh/cryptoprovconfig.h |  86 ++++++++++++++++
 dlls/dssenh/dssenh.c           | 181 +++++++++++++++++++++++++++++++++
 dlls/dssenh/dssenh.spec        |   4 +-
 dlls/dssenh/main.c             |  59 -----------
 5 files changed, 272 insertions(+), 62 deletions(-)
 create mode 100644 dlls/dssenh/cryptoprovconfig.h
 create mode 100644 dlls/dssenh/dssenh.c
 delete mode 100644 dlls/dssenh/main.c

diff --git a/dlls/dssenh/Makefile.in b/dlls/dssenh/Makefile.in
index 132ad755ee..cb34ad3ae2 100644
--- a/dlls/dssenh/Makefile.in
+++ b/dlls/dssenh/Makefile.in
@@ -6,6 +6,8 @@ EXTRAINCL = -I$(top_srcdir)/dlls/
 EXTRADLLFLAGS = -mno-cygwin

 C_SRCS = \
- main.c
+ dssenh.c \
+ ../rsaenh/cryptoprovutils.c \
+ ../rsaenh/handle.c

 RC_SRCS = rsrc.rc
diff --git a/dlls/dssenh/cryptoprovconfig.h b/dlls/dssenh/cryptoprovconfig.h
new file mode 100644
index 0000000000..25c1237006
--- /dev/null
+++ b/dlls/dssenh/cryptoprovconfig.h
@@ -0,0 +1,86 @@
+/*
+ * dlls/dssenh/cryptoprovconfig.h
+ * Definitions of some constants used by crypto provider.
+ * It is copied to build dir then included by cryptoprovutils.h,
+ * the build dir comes first in include search paths.
+ * So a new provider implementation only needs to provide its own
+ * cryptoprovconfig.h.
+ *
+ * Copyright 2002 TransGaming Technologies (David Hammerton)
+ * Copyright 2004 Mike McCormack for CodeWeavers
+ * Copyright 2004, 2005 Michael Jung
+ * Copyright 2007 Vijay Kiran Kamuju
+ *
+ * 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
+ */
+
+#ifndef __WINE_CRYPTOPROVCONFIG_H
+#define __WINE_CRYPTOPROVCONFIG_H
+#define DSSENH_MAGIC_KEY           0x73620457u
+#define DSSENH_MAX_KEY_SIZE        64
+#define DSSENH_MAX_BLOCK_SIZE      24
+#define DSSENH_MAGIC_CONTAINER     0x26384993u
+#define DSSENH_REGKEY              "Software\\Wine\\Crypto\\DSS\\%s"
+
+/******************************************************************************
+ * CRYPTKEY - key objects
+ */
+#define DSSENH_KEYSTATE_IDLE       0
+#define DSSENH_KEYSTATE_ENCRYPTING 1
+#define DSSENH_KEYSTATE_MASTERKEY  2
+typedef struct _DSSENH_SCHANNEL_INFO
+{
+    SCHANNEL_ALG saEncAlg;
+    SCHANNEL_ALG saMACAlg;
+    CRYPT_DATA_BLOB blobClientRandom;
+    CRYPT_DATA_BLOB blobServerRandom;
+} DSSENH_SCHANNEL_INFO;
+#define CRYPTO_PROV_SCHANNEL_INFO       DSSENH_SCHANNEL_INFO
+
+/******************************************************************************
+ * KEYCONTAINER - key containers
+ */
+#define DSSENH_PERSONALITY_BASE        0u
+#define DSSENH_PERSONALITY_BASE_DH     1u
+#define DSSENH_PERSONALITY_ENHANCED    2u
+#define DSSENH_PERSONALITY_SCHANNEL    3u
+
+/******************************************************************************
+ * 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 = 0;
+static const PROVNAMEPERSONALITYPAIR aProvNamePersonalityPairs[6] =
+{
+    {"", DSSENH_PERSONALITY_ENHANCED},
+    {MS_DEF_DSS_PROV_A, DSSENH_PERSONALITY_BASE},
+    {MS_DEF_DSS_DH_PROV_A, DSSENH_PERSONALITY_BASE_DH},
+    {MS_DEF_DH_SCHANNEL_PROV_A, DSSENH_PERSONALITY_SCHANNEL}
+};
+
+/******************************************************************************
+ * Define constants with CRYPTO_PROV prefix
+ */
+#define CRYPTO_PROV_REGKEY              DSSENH_REGKEY
+#define CRYPTO_PROV_MAGIC_KEY           DSSENH_MAGIC_KEY
+#define CRYPTO_PROV_MAGIC_CONTAINER     DSSENH_MAGIC_CONTAINER
+
+#endif /* __WINE_CRYPTOPROVCONFIG_H */
diff --git a/dlls/dssenh/dssenh.c b/dlls/dssenh/dssenh.c
new file mode 100644
index 0000000000..a029158672
--- /dev/null
+++ b/dlls/dssenh/dssenh.c
@@ -0,0 +1,181 @@
+/*
+ * Copyright 2019 Zhang Shuai
+ *
+ * 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
+ */
+
+
+#include <stdarg.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "winreg.h"
+#include "wincrypt.h"
+#include "objbase.h"
+#include "rpcproxy.h"
+#include "rsaenh/handle.h"
+#include "rsaenh/cryptoprovutils.h"
+#include "wine/debug.h"
+
+
+WINE_DEFAULT_DEBUG_CHANNEL(dssenh);
+
+static HINSTANCE instance;
+
+/******************************************************************************
+ * CSP's handle table (used by all acquired key containers)
+ */
+struct handle_table handle_table;
+
+BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, LPVOID reserved)
+{
+    TRACE("(0x%p, %d, %p)\n", hInstance, fdwReason, reserved);
+
+    switch (fdwReason)
+    {
+        case DLL_PROCESS_ATTACH:
+            instance = hInstance;
+            DisableThreadLibraryCalls(hInstance);
+            init_handle_table(&handle_table);
+            break;
+
+        case DLL_PROCESS_DETACH:
+            if (reserved) break;
+            destroy_handle_table(&handle_table);
+            break;
+    }
+    return TRUE;
+}
+
+/*****************************************************
+ *    DllRegisterServer (DSSENH.@)
+ */
+HRESULT WINAPI DllRegisterServer(void)
+{
+    return __wine_register_resources( instance );
+}
+
+/*****************************************************
+ *    DllUnregisterServer (DSSENH.@)
+ */
+HRESULT WINAPI DllUnregisterServer(void)
+{
+    return __wine_unregister_resources( instance );
+}
+
+/******************************************************************************
+ * crypt_export_key [Internal]
+ *
+ * Export a key into a binary large object (BLOB).  Called by CPExportKey and
+ * by store_key_pair.
+ *
+ * PARAMS
+ *  pCryptKey  [I]   Key to be exported.
+ *  hPubKey    [I]   Key used to encrypt sensitive BLOB data.
+ *  dwBlobType [I]   SIMPLEBLOB, PUBLICKEYBLOB or PRIVATEKEYBLOB.
+ *  dwFlags    [I]   Currently none defined.
+ *  force      [I]   If TRUE, the key is written no matter what the key's
+ *                   permissions are.  Otherwise the key's permissions are
+ *                   checked before exporting.
+ *  pbData     [O]   Pointer to a buffer where the BLOB will be written to.
+ *  pdwDataLen [I/O] I: Size of buffer at pbData, O: Size of BLOB
+ *
+ * RETURNS
+ *  Success: TRUE.
+ *  Failure: FALSE.
+ */
+BOOL crypt_export_key(CRYPTKEY *pCryptKey, HCRYPTKEY hPubKey,
+                             DWORD dwBlobType, DWORD dwFlags, BOOL force,
+                             BYTE *pbData, DWORD *pdwDataLen)
+{
+    FIXME("stub\n");
+    return FALSE;
+}
+
+/******************************************************************************
+ * import_key [Internal]
+ *
+ * Import a BLOB'ed key into a key container, optionally storing the key's
+ * value to the registry.
+ *
+ * PARAMS
+ *  hProv     [I] Key container into which the key is to be imported.
+ *  pbData    [I] Pointer to a buffer which holds the BLOB.
+ *  dwDataLen [I] Length of data in buffer at pbData.
+ *  hPubKey   [I] Key used to decrypt sensitive BLOB data.
+ *  dwFlags   [I] One of:
+ *                CRYPT_EXPORTABLE: the imported key is marked exportable
+ *  fStoreKey [I] If TRUE, the imported key is stored to the registry.
+ *  phKey     [O] Handle to the imported key.
+ *
+ * RETURNS
+ *  Success: TRUE.
+ *  Failure: FALSE.
+ */
+BOOL import_key(HCRYPTPROV hProv, const BYTE *pbData, DWORD
dwDataLen, HCRYPTKEY hPubKey,
+                       DWORD dwFlags, BOOL fStoreKey, HCRYPTKEY *phKey)
+{
+    FIXME("stub\n");
+    return FALSE;
+}
+
+/******************************************************************************
+ * CPAcquireContext (DSSENH.@)
+ *
+ * Acquire a handle to the key container specified by pszContainer
+ *
+ * PARAMS
+ *  phProv       [O] Pointer to the location the acquired handle will
be written to.
+ *  pszContainer [I] Name of the desired key container. See Notes
+ *  dwFlags      [I] Flags. See Notes.
+ *  pVTable      [I] Pointer to a VTableProvStruc containing callbacks.
+ *
+ * RETURNS
+ *  Success: TRUE
+ *  Failure: FALSE
+ *
+ * NOTES
+ *  If pszContainer is NULL or points to a zero length string the user's login
+ *  name will be used as the key container name.
+ *
+ *  If the CRYPT_NEW_KEYSET flag is set in dwFlags a new keyset will
be created.
+ *  If a keyset with the given name already exists, the function fails and sets
+ *  last error to NTE_EXISTS. If CRYPT_NEW_KEYSET is not set and the specified
+ *  key container does not exist, function fails and sets last error to
+ *  NTE_BAD_KEYSET.
+ */
+BOOL WINAPI DSSENH_CPAcquireContext(HCRYPTPROV *phProv, LPSTR pszContainer,
+                   DWORD dwFlags, PVTableProvStruc pVTable)
+{
+    return CRYPTO_PROV_CPAcquireContext(phProv, pszContainer,
dwFlags, pVTable);
+}
+
+/******************************************************************************
+ * CPReleaseContext (DSSENH.@)
+ *
+ * Release a key container.
+ *
+ * PARAMS
+ *  hProv   [I] Key container to be released.
+ *  dwFlags [I] Currently none defined.
+ *
+ * RETURNS
+ *  Success: TRUE
+ *  Failure: FALSE
+ */
+BOOL WINAPI DSSENH_CPReleaseContext(HCRYPTPROV hProv, DWORD dwFlags)
+{
+    return CRYPTO_PROV_CPReleaseContext(hProv, dwFlags);
+}
diff --git a/dlls/dssenh/dssenh.spec b/dlls/dssenh/dssenh.spec
index c5c2545281..42768f48ae 100644
--- a/dlls/dssenh/dssenh.spec
+++ b/dlls/dssenh/dssenh.spec
@@ -1,4 +1,4 @@
-@ stub CPAcquireContext
+@ stdcall CPAcquireContext(ptr str long ptr) DSSENH_CPAcquireContext
 @ stub CPCreateHash
 @ stub CPDecrypt
 @ stub CPDeriveKey
@@ -17,7 +17,7 @@
 @ stub CPHashData
 @ stub CPHashSessionKey
 @ stub CPImportKey
-@ stub CPReleaseContext
+@ stdcall CPReleaseContext(long long) DSSENH_CPReleaseContext
 @ stub CPSetHashParam
 @ stub CPSetKeyParam
 @ stub CPSetProvParam
diff --git a/dlls/dssenh/main.c b/dlls/dssenh/main.c
deleted file mode 100644
index b60b3447a3..0000000000
--- a/dlls/dssenh/main.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright 2008 Maarten Lankhorst
- *
- * 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
- */
-
-
-#include <stdarg.h>
-
-#include "windef.h"
-#include "winbase.h"
-#include "wine/debug.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(dssenh);
-
-BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
-{
-    TRACE("(0x%p, %d, %p)\n", hinstDLL, fdwReason, lpvReserved);
-
-    switch (fdwReason)
-    {
-        case DLL_WINE_PREATTACH:
-            return FALSE;    /* prefer native version */
-        case DLL_PROCESS_ATTACH:
-            DisableThreadLibraryCalls(hinstDLL);
-            break;
-    }
-    return TRUE;
-}
-
-/*****************************************************
- *    DllRegisterServer (DSSENH.@)
- */
-HRESULT WINAPI DllRegisterServer(void)
-{
-    FIXME("Not implemented.\n");
-    return E_UNEXPECTED;
-}
-
-/*****************************************************
- *    DllUnregisterServer (DSSENH.@)
- */
-HRESULT WINAPI DllUnregisterServer(void)
-{
-    FIXME("Not implemented.\n");
-    return E_UNEXPECTED;
-}
-- 
2.21.0



More information about the wine-devel mailing list