[PATCH 1/2] dssenh: Stubs, registries.

shuai zhang wxsxsdz at gmail.com
Sat Nov 16 04:24:44 CST 2019


Hello everybody,
I'm looking to implement dssenh for wine. I think more than 65% of
code from rsaenh can be reused. So I am trying to figure out how to do
it.
My idea goes as follows: move the functions from rsaenh.c that can be
reused into rsaenh/cryptoprovutils.c, and keep the functions specific
to rsaenh.dll in rsaenh.c. When implementing dssenh.dll, link dssenh.c
together with rsaenh/cryptoprovutils.c. create
rsaenh/cryptoprovconfig.h and dssenh/cryptoprovconfig.h, put the
rsa/dss specific constant/struct definitions in them, and
cryptoprovconfig.h is included in cryptoprovutils.c. In this way, we
can reuse the functions from rsaenh.c. Patch 2/2 illustrated how I
implemented DSSENH_CPAcquireContext and DSSENH_CPReleaseContext.
These patches passes rsaenh/tests and test_acquire_context in
dssenh/tests. Other functions are to be implemented.
Looking forward to any suggestions.

---
 dlls/dssenh/Makefile.in |   6 +-
 dlls/dssenh/dssenh.c    | 706 ++++++++++++++++++++++++++++++++++++++++
 dlls/dssenh/dssenh.rgs  |  32 ++
 dlls/dssenh/dssenh.spec |  50 +--
 dlls/dssenh/main.c      |  59 ----
 dlls/dssenh/rsrc.rc     |  31 ++
 6 files changed, 799 insertions(+), 85 deletions(-)
 create mode 100644 dlls/dssenh/dssenh.c
 create mode 100644 dlls/dssenh/dssenh.rgs
 delete mode 100644 dlls/dssenh/main.c
 create mode 100644 dlls/dssenh/rsrc.rc

diff --git a/dlls/dssenh/Makefile.in b/dlls/dssenh/Makefile.in
index 4f05beee51..54295f99ba 100644
--- a/dlls/dssenh/Makefile.in
+++ b/dlls/dssenh/Makefile.in
@@ -1,6 +1,10 @@
 MODULE    = dssenh.dll
+IMPORTLIB = dssenh
+IMPORTS   = bcrypt crypt32 advapi32

 EXTRADLLFLAGS = -mno-cygwin

 C_SRCS = \
- main.c
+ dssenh.c
+
+RC_SRCS = rsrc.rc
diff --git a/dlls/dssenh/dssenh.c b/dlls/dssenh/dssenh.c
new file mode 100644
index 0000000000..5dc5464724
--- /dev/null
+++ b/dlls/dssenh/dssenh.c
@@ -0,0 +1,706 @@
+/*
+ * 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 "wincrypt.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;
+}
+
+/******************************************************************************
+ * 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)
+{
+    FIXME("stub\n");
+    return FALSE;
+}
+
+/******************************************************************************
+ * CPCreateHash (DSSENH.@)
+ *
+ * CPCreateHash creates and initializes a new hash object.
+ *
+ * PARAMS
+ *  hProv   [I] Handle to the key container to which the new hash will belong.
+ *  Algid   [I] Identifies the hash algorithm, which will be used for the hash.
+ *  hKey    [I] Handle to a session key applied for keyed hashes.
+ *  dwFlags [I] Currently no flags defined. Must be zero.
+ *  phHash  [O] Points to the location where a handle to the new hash
will be stored.
+ *
+ * RETURNS
+ *  Success: TRUE
+ *  Failure: FALSE
+ *
+ * NOTES
+ *  hKey is a handle to a session key applied in keyed hashes like
MAC and HMAC.
+ *  If a normal hash object is to be created (like e.g. MD2 or SHA1)
hKey must be zero.
+ */
+BOOL WINAPI DSSENH_CPCreateHash(HCRYPTPROV hProv, ALG_ID Algid,
HCRYPTKEY hKey, DWORD dwFlags,
+                                HCRYPTHASH *phHash)
+{
+    FIXME("stub\n");
+    return FALSE;
+}
+
+/******************************************************************************
+ * CPDecrypt (DSSENH.@)
+ *
+ * Decrypt data.
+ *
+ * PARAMS
+ *  hProv      [I]   The key container hKey and hHash belong to.
+ *  hKey       [I]   The key used to decrypt the data.
+ *  hHash      [I]   An optional hash object for parallel hashing. See notes.
+ *  Final      [I]   Indicates if this is the last block of data to decrypt.
+ *  dwFlags    [I]   Must be zero or CRYPT_OAEP
+ *  pbData     [I/O] Pointer to the data to decrypt. Plaintext will
also be stored there.
+ *  pdwDataLen [I/O] I: Length of ciphertext, O: Length of plaintext.
+ *
+ * RETURNS
+ *  Success: TRUE.
+ *  Failure: FALSE.
+ *
+ * NOTES
+ *  If a hash object handle is provided in hHash, it will be updated
with the plaintext.
+ *  This is useful for message signatures.
+ *
+ *  This function uses the standard WINAPI protocol for querying data
of dynamic length.
+ */
+BOOL WINAPI DSSENH_CPDecrypt(HCRYPTPROV hProv, HCRYPTKEY hKey,
HCRYPTHASH hHash, BOOL Final,
+                             DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen)
+{
+    FIXME("stub\n");
+    return FALSE;
+}
+
+/******************************************************************************
+ * CPDeriveKey (DSSENH.@)
+ *
+ * Derives a key from a hash value.
+ *
+ * PARAMS
+ *  hProv     [I] Key container for which a key is to be generated.
+ *  Algid     [I] Crypto algorithm identifier for the key to be generated.
+ *  hBaseData [I] Hash from whose value the key will be derived.
+ *  dwFlags   [I] See Notes.
+ *  phKey     [O] The generated key.
+ *
+ * RETURNS
+ *  Success: TRUE
+ *  Failure: FALSE
+ *
+ * NOTES
+ *  Defined flags:
+ *   - CRYPT_EXPORTABLE: Key can be exported.
+ *   - CRYPT_NO_SALT: No salt is used for 40 bit keys.
+ *   - CRYPT_CREATE_SALT: Use remaining bits as salt value.
+ */
+BOOL WINAPI DSSENH_CPDeriveKey(HCRYPTPROV hProv, ALG_ID Algid,
HCRYPTHASH hBaseData,
+                               DWORD dwFlags, HCRYPTKEY *phKey)
+{
+    FIXME("stub\n");
+    return FALSE;
+}
+
+/******************************************************************************
+ * CPDestroyHash (DSSENH.@)
+ *
+ * Releases the handle to a hash object. The object is destroyed if
its reference
+ * count reaches zero.
+ *
+ * PARAMS
+ *  hProv [I] Handle to the key container to which the hash object belongs.
+ *  hHash [I] Handle to the hash object to be released.
+ *
+ * RETURNS
+ *  Success: TRUE
+ *  Failure: FALSE
+ */
+BOOL WINAPI DSSENH_CPDestroyHash(HCRYPTPROV hProv, HCRYPTHASH hHash)
+{
+    FIXME("stub\n");
+    return FALSE;
+}
+
+/******************************************************************************
+ * CPDestroyKey (DSSENH.@)
+ *
+ * Releases the handle to a key object. The object is destroyed if
its reference
+ * count reaches zero.
+ *
+ * PARAMS
+ *  hProv [I] Handle to the key container to which the key object belongs.
+ *  hKey  [I] Handle to the key object to be released.
+ *
+ * RETURNS
+ *  Success: TRUE
+ *  Failure: FALSE
+ */
+BOOL WINAPI DSSENH_CPDestroyKey(HCRYPTPROV hProv, HCRYPTKEY hKey)
+{
+    FIXME("stub\n");
+    return FALSE;
+}
+
+/******************************************************************************
+ * CPDuplicateHash (DSSENH.@)
+ *
+ * Clones a hash object including its current state.
+ *
+ * PARAMS
+ *  hUID        [I] Handle to the key container the hash belongs to.
+ *  hHash       [I] Handle to the hash object to be cloned.
+ *  pdwReserved [I] Reserved. Must be NULL.
+ *  dwFlags     [I] No flags are currently defined. Must be 0.
+ *  phHash      [O] Handle to the cloned hash object.
+ *
+ * RETURNS
+ *  Success: TRUE.
+ *  Failure: FALSE.
+ */
+BOOL WINAPI DSSENH_CPDuplicateHash(HCRYPTPROV hUID, HCRYPTHASH hHash,
DWORD *pdwReserved,
+                                   DWORD dwFlags, HCRYPTHASH *phHash)
+{
+    FIXME("stub\n");
+    return FALSE;
+}
+
+/******************************************************************************
+ * CPDuplicateKey (DSSENH.@)
+ *
+ * Clones a key object including its current state.
+ *
+ * PARAMS
+ *  hUID        [I] Handle to the key container the hash belongs to.
+ *  hKey        [I] Handle to the key object to be cloned.
+ *  pdwReserved [I] Reserved. Must be NULL.
+ *  dwFlags     [I] No flags are currently defined. Must be 0.
+ *  phHash      [O] Handle to the cloned key object.
+ *
+ * RETURNS
+ *  Success: TRUE.
+ *  Failure: FALSE.
+ */
+BOOL WINAPI DSSENH_CPDuplicateKey(HCRYPTPROV hUID, HCRYPTKEY hKey,
DWORD *pdwReserved,
+                                  DWORD dwFlags, HCRYPTKEY *phKey)
+{
+    FIXME("stub\n");
+    return FALSE;
+}
+
+/******************************************************************************
+ * CPEncrypt (DSSENH.@)
+ *
+ * Encrypt data.
+ *
+ * PARAMS
+ *  hProv      [I]   The key container hKey and hHash belong to.
+ *  hKey       [I]   The key used to encrypt the data.
+ *  hHash      [I]   An optional hash object for parallel hashing. See notes.
+ *  Final      [I]   Indicates if this is the last block of data to encrypt.
+ *  dwFlags    [I]   Must be zero or CRYPT_OAEP
+ *  pbData     [I/O] Pointer to the data to encrypt. Encrypted data
will also be stored there.
+ *  pdwDataLen [I/O] I: Length of data to encrypt, O: Length of encrypted data.
+ *  dwBufLen   [I]   Size of the buffer at pbData.
+ *
+ * RETURNS
+ *  Success: TRUE.
+ *  Failure: FALSE.
+ *
+ * NOTES
+ *  If a hash object handle is provided in hHash, it will be updated
with the plaintext.
+ *  This is useful for message signatures.
+ *
+ *  This function uses the standard WINAPI protocol for querying data
of dynamic length.
+ */
+BOOL WINAPI DSSENH_CPEncrypt(HCRYPTPROV hProv, HCRYPTKEY hKey,
HCRYPTHASH hHash, BOOL Final,
+                             DWORD dwFlags, BYTE *pbData, DWORD
*pdwDataLen, DWORD dwBufLen)
+{
+    FIXME("stub\n");
+    return FALSE;
+}
+
+/******************************************************************************
+ * CPExportKey (DSSENH.@)
+ *
+ * Export a key into a binary large object (BLOB).
+ *
+ * PARAMS
+ *  hProv      [I]   Key container from which a key is to be exported.
+ *  hKey       [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.
+ *  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 WINAPI DSSENH_CPExportKey(HCRYPTPROV hProv, HCRYPTKEY hKey,
HCRYPTKEY hPubKey,
+                               DWORD dwBlobType, DWORD dwFlags, BYTE
*pbData, DWORD *pdwDataLen)
+{
+    FIXME("stub\n");
+    return FALSE;
+}
+
+/******************************************************************************
+ * CPGenKey (DSSENH.@)
+ *
+ * Generate a key in the key container
+ *
+ * PARAMS
+ *  hProv   [I] Key container for which a key is to be generated.
+ *  Algid   [I] Crypto algorithm identifier for the key to be generated.
+ *  dwFlags [I] Upper 16 bits: Binary length of key. Lower 16 bits:
Flags. See Notes
+ *  phKey   [O] Handle to the generated key.
+ *
+ * RETURNS
+ *  Success: TRUE.
+ *  Failure: FALSE.
+ *
+ * NOTES
+ *  Private key-exchange- and signature-keys can be generated with
Algid AT_KEYEXCHANGE
+ *  and AT_SIGNATURE values.
+ */
+BOOL WINAPI DSSENH_CPGenKey(HCRYPTPROV hProv, ALG_ID Algid, DWORD
dwFlags, HCRYPTKEY *phKey)
+{
+    FIXME("stub\n");
+    return FALSE;
+}
+
+/******************************************************************************
+ * CPGenRandom (DSSENH.@)
+ *
+ * Generate a random byte stream.
+ *
+ * PARAMS
+ *  hProv    [I] Key container that is used to generate random bytes.
+ *  dwLen    [I] Specifies the number of requested random data bytes.
+ *  pbBuffer [O] Random bytes will be stored here.
+ *
+ * RETURNS
+ *  Success: TRUE
+ *  Failure: FALSE
+ */
+BOOL WINAPI DSSENH_CPGenRandom(HCRYPTPROV hProv, DWORD dwLen, BYTE *pbBuffer)
+{
+    FIXME("stub\n");
+    return FALSE;
+}
+
+/******************************************************************************
+ * CPGetHashParam (DSSENH.@)
+ *
+ * Query parameters of an hash object.
+ *
+ * PARAMS
+ *  hProv      [I]   The key container, which the hash belongs to.
+ *  hHash      [I]   The hash object that is to be queried.
+ *  dwParam    [I]   Specifies the parameter that is to be queried.
+ *  pbData     [I]   Pointer to the buffer where the parameter value
will be stored.
+ *  pdwDataLen [I/O] I: Buffer length at pbData, O: Length of the
parameter value.
+ *  dwFlags    [I]   None currently defined.
+ *
+ * RETURNS
+ *  Success: TRUE
+ *  Failure: FALSE
+ *
+ * NOTES
+ *  Valid dwParams are: HP_ALGID, HP_HASHSIZE, HP_HASHVALUE. The hash will be
+ *  finalized if HP_HASHVALUE is queried.
+ */
+BOOL WINAPI DSSENH_CPGetHashParam(HCRYPTPROV hProv, HCRYPTHASH hHash,
DWORD dwParam, BYTE *pbData,
+                                  DWORD *pdwDataLen, DWORD dwFlags)
+{
+    FIXME("stub\n");
+    return FALSE;
+}
+
+/******************************************************************************
+ * CPGetKeyParam (DSSENH.@)
+ *
+ * Query a key parameter.
+ *
+ * PARAMS
+ *  hProv      [I]   The key container, which the key belongs to.
+ *  hHash      [I]   The key object that is to be queried.
+ *  dwParam    [I]   Specifies the parameter that is to be queried.
+ *  pbData     [I]   Pointer to the buffer where the parameter value
will be stored.
+ *  pdwDataLen [I/O] I: Buffer length at pbData, O: Length of the
parameter value.
+ *  dwFlags    [I]   None currently defined.
+ *
+ * RETURNS
+ *  Success: TRUE
+ *  Failure: FALSE
+ *
+ * NOTES
+ *  Defined dwParam types are:
+ *   - KP_MODE: Values MODE_CBC, MODE_ECB, MODE_CFB.
+ *   - KP_MODE_BITS: Shift width for cipher feedback mode.
+ *                   (Currently ignored by MS CSP's - always eight)
+ *   - KP_PERMISSIONS: Or'ed combination of CRYPT_ENCRYPT, CRYPT_DECRYPT,
+ *                     CRYPT_EXPORT, CRYPT_READ, CRYPT_WRITE, CRYPT_MAC
+ *   - KP_IV: Initialization vector.
+ *   - KP_KEYLEN: Bitwidth of the key.
+ *   - KP_BLOCKLEN: Size of a block cipher block.
+ *   - KP_SALT: Salt value.
+ */
+BOOL WINAPI DSSENH_CPGetKeyParam(HCRYPTPROV hProv, HCRYPTKEY hKey,
DWORD dwParam, BYTE *pbData,
+                                 DWORD *pdwDataLen, DWORD dwFlags)
+{
+    FIXME("stub\n");
+    return FALSE;
+}
+
+/******************************************************************************
+ * CPGetProvParam (DSSENH.@)
+ *
+ * Query a CSP parameter.
+ *
+ * PARAMS
+ *  hProv      [I]   The key container that is to be queried.
+ *  dwParam    [I]   Specifies the parameter that is to be queried.
+ *  pbData     [I]   Pointer to the buffer where the parameter value
will be stored.
+ *  pdwDataLen [I/O] I: Buffer length at pbData, O: Length of the
parameter value.
+ *  dwFlags    [I]   CRYPT_FIRST: Start enumeration (for PP_ENUMALGS{_EX}).
+ *
+ * RETURNS
+ *  Success: TRUE
+ *  Failure: FALSE
+ * NOTES:
+ *  Defined dwParam types:
+ *   - PP_CONTAINER: Name of the key container.
+ *   - PP_NAME: Name of the cryptographic service provider.
+ *   - PP_SIG_KEYSIZE_INC: RSA signature keywidth granularity in bits.
+ *   - PP_KEYX_KEYSIZE_INC: RSA key-exchange keywidth granularity in bits.
+ *   - PP_ENUMALGS{_EX}: Query provider capabilities.
+ *   - PP_KEYSET_SEC_DESCR: Retrieve security descriptor on container.
+ */
+BOOL WINAPI DSSENH_CPGetProvParam(HCRYPTPROV hProv, DWORD dwParam,
BYTE *pbData,
+                                  DWORD *pdwDataLen, DWORD dwFlags)
+{
+    FIXME("stub\n");
+    return FALSE;
+}
+
+/******************************************************************************
+ * CPGetUserKey (DSSENH.@)
+ *
+ * Returns a handle to the user's private key-exchange- or signature-key.
+ *
+ * PARAMS
+ *  hProv     [I] The key container from which a user key is requested.
+ *  dwKeySpec [I] AT_KEYEXCHANGE or AT_SIGNATURE
+ *  phUserKey [O] Handle to the requested key or INVALID_HANDLE_VALUE
in case of failure.
+ *
+ * RETURNS
+ *  Success: TRUE.
+ *  Failure: FALSE.
+ *
+ * NOTE
+ *  A newly created key container does not contain private user key.
Create them with CPGenKey.
+ */
+BOOL WINAPI DSSENH_CPGetUserKey(HCRYPTPROV hProv, DWORD dwKeySpec,
HCRYPTKEY *phUserKey)
+{
+    FIXME("stub\n");
+    return FALSE;
+}
+
+/******************************************************************************
+ * CPHashData (DSSENH.@)
+ *
+ * Updates a hash object with the given data.
+ *
+ * PARAMS
+ *  hProv     [I] Key container to which the hash object belongs.
+ *  hHash     [I] Hash object which is to be updated.
+ *  pbData    [I] Pointer to data with which the hash object is to be updated.
+ *  dwDataLen [I] Length of the data.
+ *  dwFlags   [I] Currently none defined.
+ *
+ * RETURNS
+ *  Success: TRUE.
+ *  Failure: FALSE.
+ *
+ * NOTES
+ *  The actual hash value is queried with CPGetHashParam, which will finalize
+ *  the hash. Updating a finalized hash will fail with a last error
NTE_BAD_HASH_STATE.
+ */
+BOOL WINAPI DSSENH_CPHashData(HCRYPTPROV hProv, HCRYPTHASH hHash,
const BYTE *pbData,
+                              DWORD dwDataLen, DWORD dwFlags)
+{
+    FIXME("stub\n");
+    return FALSE;
+}
+
+/******************************************************************************
+ * CPHashSessionKey (DSSENH.@)
+ *
+ * Updates a hash object with the binary representation of a symmetric key.
+ *
+ * PARAMS
+ *  hProv     [I] Key container to which the hash object belongs.
+ *  hHash     [I] Hash object which is to be updated.
+ *  hKey      [I] The symmetric key, whose binary value will be added
to the hash.
+ *  dwFlags   [I] CRYPT_LITTLE_ENDIAN, if the binary key value shall
be interpreted as little endian.
+ *
+ * RETURNS
+ *  Success: TRUE.
+ *  Failure: FALSE.
+ */
+BOOL WINAPI DSSENH_CPHashSessionKey(HCRYPTPROV hProv, HCRYPTHASH
hHash, HCRYPTKEY hKey,
+                                    DWORD dwFlags)
+{
+    FIXME("stub\n");
+    return FALSE;
+}
+
+/******************************************************************************
+ * CPImportKey (DSSENH.@)
+ *
+ * Import a BLOB'ed key into a key container.
+ *
+ * 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
+ *  phKey     [O] Handle to the imported key.
+ *
+ * RETURNS
+ *  Success: TRUE.
+ *  Failure: FALSE.
+ */
+BOOL WINAPI DSSENH_CPImportKey(HCRYPTPROV hProv, const BYTE *pbData,
DWORD dwDataLen,
+                               HCRYPTKEY hPubKey, DWORD dwFlags,
HCRYPTKEY *phKey)
+{
+    FIXME("stub\n");
+    return FALSE;
+}
+
+/******************************************************************************
+ * 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)
+{
+    FIXME("stub\n");
+    return FALSE;
+}
+
+/******************************************************************************
+ * CPSetHashParam (DSSENH.@)
+ *
+ * Set a parameter of a hash object.
+ *
+ * PARAMS
+ *  hProv   [I] The key container to which the key belongs.
+ *  hHash   [I] The hash object for which a parameter is to be set.
+ *  dwParam [I] Parameter type. See Notes.
+ *  pbData  [I] Pointer to the parameter value.
+ *  dwFlags [I] Currently none defined.
+ *
+ * RETURNS
+ *  Success: TRUE.
+ *  Failure: FALSE.
+ *
+ * NOTES
+ *  Currently only the HP_HMAC_INFO dwParam type is defined.
+ *  The HMAC_INFO struct will be deep copied into the hash object.
+ *  See Internet RFC 2104 for details on the HMAC algorithm.
+ */
+BOOL WINAPI DSSENH_CPSetHashParam(HCRYPTPROV hProv, HCRYPTHASH hHash,
DWORD dwParam,
+                                  BYTE *pbData, DWORD dwFlags)
+{
+    FIXME("stub\n");
+    return FALSE;
+}
+
+/******************************************************************************
+ * CPSetKeyParam (DSSENH.@)
+ *
+ * Set a parameter of a key object.
+ *
+ * PARAMS
+ *  hProv   [I] The key container to which the key belongs.
+ *  hKey    [I] The key for which a parameter is to be set.
+ *  dwParam [I] Parameter type. See Notes.
+ *  pbData  [I] Pointer to the parameter value.
+ *  dwFlags [I] Currently none defined.
+ *
+ * RETURNS
+ *  Success: TRUE.
+ *  Failure: FALSE.
+ *
+ * NOTES:
+ */
+BOOL WINAPI DSSENH_CPSetKeyParam(HCRYPTPROV hProv, HCRYPTKEY hKey,
DWORD dwParam, BYTE *pbData,
+                                 DWORD dwFlags)
+{
+    FIXME("stub\n");
+    return FALSE;
+}
+
+/******************************************************************************
+ * CPSetProvParam (DSSENH.@)
+ *
+ * Set a parameter of a provider.
+ *
+ * PARAMS
+ *  hProv   [I] The key container for which to set parameters.
+ *  dwParam [I] Parameter type. See Notes.
+ *  pbData  [I] Pointer to the parameter value
+ *  dwFlags [I] Currently none defined.
+ *
+ * RETURNS:
+ *  Success: TRUE.
+ *  Failure: FALSE.
+ *
+ * NOTES:
+ */
+BOOL WINAPI DSSENH_CPSetProvParam(HCRYPTPROV hProv, DWORD dwParam,
BYTE *pbData, DWORD dwFlags)
+{
+    FIXME("stub\n");
+    return FALSE;
+}
+
+/******************************************************************************
+ * CPSignHash (DSSENH.@)
+ *
+ * Sign a hash object
+ *
+ * PARAMS
+ *  hProv        [I]   The key container, to which the hash object belongs.
+ *  hHash        [I]   The hash object to be signed.
+ *  dwKeySpec    [I]   AT_SIGNATURE or AT_KEYEXCHANGE: Key used to
generate the signature.
+ *  sDescription [I]   Should be NULL for security reasons.
+ *  dwFlags      [I]   0, CRYPT_NOHASHOID or CRYPT_X931_FORMAT:
Format of the signature.
+ *  pbSignature  [O]   Buffer, to which the signature will be stored.
May be NULL to query SigLen.
+ *  pdwSigLen    [I/O] Size of the buffer (in), Length of the signature (out)
+ *
+ * RETURNS
+ *  Success: TRUE
+ *  Failure: FALSE
+ */
+BOOL WINAPI DSSENH_CPSignHash(HCRYPTPROV hProv, HCRYPTHASH hHash,
DWORD dwKeySpec,
+                              LPCWSTR sDescription, DWORD dwFlags,
BYTE *pbSignature,
+                              DWORD *pdwSigLen)
+{
+    FIXME("stub\n");
+    return FALSE;
+}
+
+/******************************************************************************
+ * CPVerifySignature (DSSENH.@)
+ *
+ * Verify the signature of a hash object.
+ *
+ * PARAMS
+ *  hProv        [I] The key container, to which the hash belongs.
+ *  hHash        [I] The hash for which the signature is verified.
+ *  pbSignature  [I] The binary signature.
+ *  dwSigLen     [I] Length of the signature BLOB.
+ *  hPubKey      [I] Public key used to verify the signature.
+ *  sDescription [I] Should be NULL for security reasons.
+ *  dwFlags      [I] 0, CRYPT_NOHASHOID or CRYPT_X931_FORMAT: Format
of the signature.
+ *
+ * RETURNS
+ *  Success: TRUE  (Signature is valid)
+ *  Failure: FALSE (GetLastError() == NTE_BAD_SIGNATURE, if signature
is invalid)
+ */
+BOOL WINAPI DSSENH_CPVerifySignature(HCRYPTPROV hProv, HCRYPTHASH
hHash, const BYTE *pbSignature,
+                                     DWORD dwSigLen, HCRYPTKEY
hPubKey, LPCWSTR sDescription,
+                                     DWORD dwFlags)
+{
+    FIXME("stub\n");
+    return FALSE;
+}
diff --git a/dlls/dssenh/dssenh.rgs b/dlls/dssenh/dssenh.rgs
new file mode 100644
index 0000000000..19899cb516
--- /dev/null
+++ b/dlls/dssenh/dssenh.rgs
@@ -0,0 +1,32 @@
+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
+                        }
+                    }
+                    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'
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/dlls/dssenh/dssenh.spec b/dlls/dssenh/dssenh.spec
index c5c2545281..330b8914b3 100644
--- a/dlls/dssenh/dssenh.spec
+++ b/dlls/dssenh/dssenh.spec
@@ -1,27 +1,27 @@
-@ stub CPAcquireContext
-@ stub CPCreateHash
-@ stub CPDecrypt
-@ stub CPDeriveKey
-@ stub CPDestroyHash
-@ stub CPDestroyKey
-@ stub CPDuplicateHash
-@ stub CPDuplicateKey
-@ stub CPEncrypt
-@ stub CPExportKey
-@ stub CPGenKey
-@ stub CPGenRandom
-@ stub CPGetHashParam
-@ stub CPGetKeyParam
-@ stub CPGetProvParam
-@ stub CPGetUserKey
-@ stub CPHashData
-@ stub CPHashSessionKey
-@ stub CPImportKey
-@ stub CPReleaseContext
-@ stub CPSetHashParam
-@ stub CPSetKeyParam
-@ stub CPSetProvParam
-@ stub CPSignHash
-@ stub CPVerifySignature
+@ stdcall CPAcquireContext(ptr str long ptr) DSSENH_CPAcquireContext
+@ stdcall CPCreateHash(long long ptr long ptr) DSSENH_CPCreateHash
+@ stdcall CPDecrypt(long long long long long ptr ptr) DSSENH_CPDecrypt
+@ stdcall CPDeriveKey(long long long long ptr) DSSENH_CPDeriveKey
+@ stdcall CPDestroyHash(long long) DSSENH_CPDestroyHash
+@ stdcall CPDestroyKey(long long) DSSENH_CPDestroyKey
+@ stdcall CPDuplicateHash(long long ptr long ptr) DSSENH_CPDuplicateHash
+@ stdcall CPDuplicateKey(long long ptr long ptr) DSSENH_CPDuplicateKey
+@ stdcall CPEncrypt(long long long long long ptr ptr long) DSSENH_CPEncrypt
+@ stdcall CPExportKey(long long long long long ptr ptr) DSSENH_CPExportKey
+@ stdcall CPGenKey(long long long ptr) DSSENH_CPGenKey
+@ stdcall CPGenRandom(long long ptr) DSSENH_CPGenRandom
+@ stdcall CPGetHashParam(long long long ptr ptr long) DSSENH_CPGetHashParam
+@ stdcall CPGetKeyParam(long long long ptr ptr long) DSSENH_CPGetKeyParam
+@ stdcall CPGetProvParam(long long ptr ptr long) DSSENH_CPGetProvParam
+@ stdcall CPGetUserKey(long long ptr) DSSENH_CPGetUserKey
+@ stdcall CPHashData(long long ptr long long) DSSENH_CPHashData
+@ stdcall CPHashSessionKey(long long long long) DSSENH_CPHashSessionKey
+@ stdcall CPImportKey(long ptr long long long ptr) DSSENH_CPImportKey
+@ stdcall CPReleaseContext(long long) DSSENH_CPReleaseContext
+@ stdcall CPSetHashParam(long long long ptr long) DSSENH_CPSetHashParam
+@ stdcall CPSetKeyParam(long long long ptr long) DSSENH_CPSetKeyParam
+@ stdcall CPSetProvParam(long long ptr long) DSSENH_CPSetProvParam
+@ stdcall CPSignHash(long long long wstr long ptr ptr) DSSENH_CPSignHash
+@ stdcall CPVerifySignature(long long ptr long long wstr long)
DSSENH_CPVerifySignature
 @ stdcall -private DllRegisterServer()
 @ stdcall -private DllUnregisterServer()
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;
-}
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"
-- 
2.21.0



More information about the wine-devel mailing list