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

Vijay Kiran Kamuju infyquest at gmail.com
Sat Nov 16 04:51:43 CST 2019


On Sat, Nov 16, 2019 at 11:25 AM shuai zhang <wxsxsdz at gmail.com> wrote:
>
> 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
>
Please add a Signed-off line to the patches.
https://wiki.winehq.org/Submitting_Patches#The_commit_message
The patch series needs to be split more into smaller patches with tests.

Thanks,
Vijay



More information about the wine-devel mailing list