Signed-off-by: Zhang Shuai <wxsxsdz(a)gmail.com>
---
dlls/rsaenh/cryptoprovconfig.h | 14 ++++
dlls/rsaenh/cryptoprovutils.c | 87 +++++++++++++++++++++
dlls/rsaenh/cryptoprovutils.h | 35 +++++++++
dlls/rsaenh/rsaenh.c | 133 +--------------------------------
4 files changed, 139 insertions(+), 130 deletions(-)
diff --git a/dlls/rsaenh/cryptoprovconfig.h b/dlls/rsaenh/cryptoprovconfig.h
index d282d0db1e..10cbc31b8b 100644
--- a/dlls/rsaenh/cryptoprovconfig.h
+++ b/dlls/rsaenh/cryptoprovconfig.h
@@ -29,6 +29,7 @@
#ifndef __WINE_CRYPTOPROVCONFIG_H
#define __WINE_CRYPTOPROVCONFIG_H
#include "wincrypt.h"
+#include "implglue.h"
/******************************************************************************
* KEYCONTAINER - key containers
@@ -62,9 +63,22 @@ static const PROVNAMEPERSONALITYPAIR
aProvNamePersonalityPairs[6] =
{MS_ENH_RSA_AES_PROV_XP_A, RSAENH_PERSONALITY_AES}
};
+/******************************************************************************
+ * CRYPTKEY - key objects
+ */
+#define RSAENH_MAGIC_KEY 0x73620457u
+#define RSAENH_KEYSTATE_IDLE 0
+#define RSAENH_KEYSTATE_ENCRYPTING 1
+#define RSAENH_KEYSTATE_MASTERKEY 2
+
/******************************************************************************
* Some magic constants
*/
#define RSAENH_REGKEY "Software\\Wine\\Crypto\\RSA\\%s"
+/******************************************************************************
+ * Definitions concerning prefix.
+ */
+#define RSAENH_SCHANNEL_INFO SCHANNEL_INFO
+
#endif /* __WINE_CRYPTOPROVCONFIG_H */
diff --git a/dlls/rsaenh/cryptoprovutils.c b/dlls/rsaenh/cryptoprovutils.c
index 23e0e11626..9f774bad1d 100644
--- a/dlls/rsaenh/cryptoprovutils.c
+++ b/dlls/rsaenh/cryptoprovutils.c
@@ -33,6 +33,13 @@
#include "cryptoprovutils.h"
#include "wine/debug.h"
+WINE_DEFAULT_DEBUG_CHANNEL(crypt);
+
+/******************************************************************************
+ * CSP's handle table (used by all acquired key containers)
+ */
+extern struct handle_table handle_table;
+
/******************************************************************************
* create_container_key [Internal]
*
@@ -121,3 +128,83 @@ BOOL delete_container_key(LPCSTR
pszContainerName, DWORD dwFlags)
}
}
+/******************************************************************************
+ * map_key_spec_to_key_pair_name [Internal]
+ *
+ * Returns the name of the registry value associated with a key spec.
+ *
+ * PARAMS
+ * dwKeySpec [I] AT_KEYEXCHANGE or AT_SIGNATURE
+ *
+ * RETURNS
+ * Success: Name of registry value.
+ * Failure: NULL
+ */
+LPCSTR map_key_spec_to_key_pair_name(DWORD dwKeySpec)
+{
+ LPCSTR szValueName;
+
+ switch (dwKeySpec)
+ {
+ case AT_KEYEXCHANGE:
+ szValueName = "KeyExchangeKeyPair";
+ break;
+ case AT_SIGNATURE:
+ szValueName = "SignatureKeyPair";
+ break;
+ default:
+ WARN("invalid key spec %d\n", dwKeySpec);
+ szValueName = NULL;
+ }
+ return szValueName;
+}
+
+/******************************************************************************
+ * store_key_pair [Internal]
+ *
+ * Stores a key pair to the registry
+ *
+ * PARAMS
+ * hCryptKey [I] Handle to the key to be stored
+ * hKey [I] Registry key where the key pair is to be stored
+ * dwKeySpec [I] AT_KEYEXCHANGE or AT_SIGNATURE
+ * dwFlags [I] Flags for protecting the key
+ */
+void store_key_pair(HCRYPTKEY hCryptKey, HKEY hKey, DWORD dwKeySpec,
DWORD dwFlags)
+{
+ LPCSTR szValueName;
+ DATA_BLOB blobIn, blobOut;
+ CRYPTKEY *pKey;
+ DWORD dwLen;
+ BYTE *pbKey;
+
+ if (!(szValueName = map_key_spec_to_key_pair_name(dwKeySpec)))
+ return;
+ if (lookup_handle(&handle_table, hCryptKey, RSAENH_MAGIC_KEY,
+ (OBJECTHDR**)&pKey))
+ {
+ if (crypt_export_key(pKey, 0, PRIVATEKEYBLOB, 0, TRUE, 0, &dwLen))
+ {
+ pbKey = HeapAlloc(GetProcessHeap(), 0, dwLen);
+ if (pbKey)
+ {
+ if (crypt_export_key(pKey, 0, PRIVATEKEYBLOB, 0, TRUE, pbKey,
+ &dwLen))
+ {
+ blobIn.pbData = pbKey;
+ blobIn.cbData = dwLen;
+
+ if (CryptProtectData(&blobIn, NULL, NULL, NULL, NULL,
+ dwFlags, &blobOut))
+ {
+ RegSetValueExA(hKey, szValueName, 0, REG_BINARY,
+ blobOut.pbData, blobOut.cbData);
+ LocalFree(blobOut.pbData);
+ }
+ }
+ HeapFree(GetProcessHeap(), 0, pbKey);
+ }
+ }
+ }
+}
+
diff --git a/dlls/rsaenh/cryptoprovutils.h b/dlls/rsaenh/cryptoprovutils.h
index 17d665e398..499b0b8140 100644
--- a/dlls/rsaenh/cryptoprovutils.h
+++ b/dlls/rsaenh/cryptoprovutils.h
@@ -39,7 +39,42 @@ typedef struct tagKEYCONTAINER
HCRYPTKEY hSignatureKeyPair;
} KEYCONTAINER;
+typedef struct _SCHANNEL_INFO
+{
+ SCHANNEL_ALG saEncAlg;
+ SCHANNEL_ALG saMACAlg;
+ CRYPT_DATA_BLOB blobClientRandom;
+ CRYPT_DATA_BLOB blobServerRandom;
+} SCHANNEL_INFO;
+
+#define RSAENH_MAX_KEY_SIZE 64
+#define RSAENH_MAX_BLOCK_SIZE 24
+typedef struct tagCRYPTKEY
+{
+ OBJECTHDR header;
+ ALG_ID aiAlgid;
+ HCRYPTPROV hProv;
+ DWORD dwMode;
+ DWORD dwModeBits;
+ DWORD dwPermissions;
+ DWORD dwKeyLen;
+ DWORD dwEffectiveKeyLen;
+ DWORD dwSaltLen;
+ DWORD dwBlockLen;
+ DWORD dwState;
+ KEY_CONTEXT context;
+ BYTE abKeyValue[RSAENH_MAX_KEY_SIZE];
+ BYTE abInitVector[RSAENH_MAX_BLOCK_SIZE];
+ BYTE abChainVector[RSAENH_MAX_BLOCK_SIZE];
+ SCHANNEL_INFO siSChannelInfo;
+ CRYPT_DATA_BLOB blobHmacKey;
+} CRYPTKEY;
+
BOOL create_container_key(KEYCONTAINER *pKeyContainer, REGSAM sam,
HKEY *phKey);
BOOL open_container_key(LPCSTR pszContainerName, DWORD dwFlags,
REGSAM access, HKEY *phKey);
BOOL delete_container_key(LPCSTR pszContainerName, DWORD dwFlags);
+BOOL crypt_export_key(CRYPTKEY *pCryptKey, HCRYPTKEY hPubKey, DWORD dwBlobType,
+ DWORD dwFlags, BOOL force, BYTE *pbData, DWORD *pdwDataLen);
+LPCSTR map_key_spec_to_key_pair_name(DWORD dwKeySpec);
+void store_key_pair(HCRYPTKEY hCryptKey, HKEY hKey, DWORD dwKeySpec,
DWORD dwFlags);
#endif /* __WINE_CRYPTOPROVUTILS_H */
diff --git a/dlls/rsaenh/rsaenh.c b/dlls/rsaenh/rsaenh.c
index 069aee569f..8925abefab 100644
--- a/dlls/rsaenh/rsaenh.c
+++ b/dlls/rsaenh/rsaenh.c
@@ -67,44 +67,6 @@ typedef struct tagCRYPTHASH
RSAENH_TLS1PRF_PARAMS tpPRFParams;
} CRYPTHASH;
-/******************************************************************************
- * CRYPTKEY - key objects
- */
-#define RSAENH_MAGIC_KEY 0x73620457u
-#define RSAENH_MAX_KEY_SIZE 64
-#define RSAENH_MAX_BLOCK_SIZE 24
-#define RSAENH_KEYSTATE_IDLE 0
-#define RSAENH_KEYSTATE_ENCRYPTING 1
-#define RSAENH_KEYSTATE_MASTERKEY 2
-typedef struct _RSAENH_SCHANNEL_INFO
-{
- SCHANNEL_ALG saEncAlg;
- SCHANNEL_ALG saMACAlg;
- CRYPT_DATA_BLOB blobClientRandom;
- CRYPT_DATA_BLOB blobServerRandom;
-} RSAENH_SCHANNEL_INFO;
-
-typedef struct tagCRYPTKEY
-{
- OBJECTHDR header;
- ALG_ID aiAlgid;
- HCRYPTPROV hProv;
- DWORD dwMode;
- DWORD dwModeBits;
- DWORD dwPermissions;
- DWORD dwKeyLen;
- DWORD dwEffectiveKeyLen;
- DWORD dwSaltLen;
- DWORD dwBlockLen;
- DWORD dwState;
- KEY_CONTEXT context;
- BYTE abKeyValue[RSAENH_MAX_KEY_SIZE];
- BYTE abInitVector[RSAENH_MAX_BLOCK_SIZE];
- BYTE abChainVector[RSAENH_MAX_BLOCK_SIZE];
- RSAENH_SCHANNEL_INFO siSChannelInfo;
- CRYPT_DATA_BLOB blobHmacKey;
-} CRYPTKEY;
-
/******************************************************************************
* Some magic constants
*/
@@ -293,16 +255,6 @@ RSAENH_CPDestroyHash(
HCRYPTHASH hHash
);
-static BOOL crypt_export_key(
- CRYPTKEY *pCryptKey,
- HCRYPTKEY hPubKey,
- DWORD dwBlobType,
- DWORD dwFlags,
- BOOL force,
- BYTE *pbData,
- DWORD *pdwDataLen
-);
-
static BOOL import_key(
HCRYPTPROV hProv,
const BYTE *pbData,
@@ -325,7 +277,7 @@ RSAENH_CPHashData(
/******************************************************************************
* CSP's handle table (used by all acquired key containers)
*/
-static struct handle_table handle_table;
+struct handle_table handle_table;
/******************************************************************************
* DllMain (RSAENH.@)
@@ -910,86 +862,6 @@ static HCRYPTKEY new_key(HCRYPTPROV hProv, ALG_ID
aiAlgid, DWORD dwFlags, CRYPTK
return hCryptKey;
}
-/******************************************************************************
- * map_key_spec_to_key_pair_name [Internal]
- *
- * Returns the name of the registry value associated with a key spec.
- *
- * PARAMS
- * dwKeySpec [I] AT_KEYEXCHANGE or AT_SIGNATURE
- *
- * RETURNS
- * Success: Name of registry value.
- * Failure: NULL
- */
-static LPCSTR map_key_spec_to_key_pair_name(DWORD dwKeySpec)
-{
- LPCSTR szValueName;
-
- switch (dwKeySpec)
- {
- case AT_KEYEXCHANGE:
- szValueName = "KeyExchangeKeyPair";
- break;
- case AT_SIGNATURE:
- szValueName = "SignatureKeyPair";
- break;
- default:
- WARN("invalid key spec %d\n", dwKeySpec);
- szValueName = NULL;
- }
- return szValueName;
-}
-
-/******************************************************************************
- * store_key_pair [Internal]
- *
- * Stores a key pair to the registry
- *
- * PARAMS
- * hCryptKey [I] Handle to the key to be stored
- * hKey [I] Registry key where the key pair is to be stored
- * dwKeySpec [I] AT_KEYEXCHANGE or AT_SIGNATURE
- * dwFlags [I] Flags for protecting the key
- */
-static void store_key_pair(HCRYPTKEY hCryptKey, HKEY hKey, DWORD
dwKeySpec, DWORD dwFlags)
-{
- LPCSTR szValueName;
- DATA_BLOB blobIn, blobOut;
- CRYPTKEY *pKey;
- DWORD dwLen;
- BYTE *pbKey;
-
- if (!(szValueName = map_key_spec_to_key_pair_name(dwKeySpec)))
- return;
- if (lookup_handle(&handle_table, hCryptKey, RSAENH_MAGIC_KEY,
- (OBJECTHDR**)&pKey))
- {
- if (crypt_export_key(pKey, 0, PRIVATEKEYBLOB, 0, TRUE, 0, &dwLen))
- {
- pbKey = HeapAlloc(GetProcessHeap(), 0, dwLen);
- if (pbKey)
- {
- if (crypt_export_key(pKey, 0, PRIVATEKEYBLOB, 0, TRUE, pbKey,
- &dwLen))
- {
- blobIn.pbData = pbKey;
- blobIn.cbData = dwLen;
-
- if (CryptProtectData(&blobIn, NULL, NULL, NULL, NULL,
- dwFlags, &blobOut))
- {
- RegSetValueExA(hKey, szValueName, 0, REG_BINARY,
- blobOut.pbData, blobOut.cbData);
- LocalFree(blobOut.pbData);
- }
- }
- HeapFree(GetProcessHeap(), 0, pbKey);
- }
- }
- }
-}
-
/******************************************************************************
* map_key_spec_to_permissions_name [Internal]
*
@@ -2773,6 +2645,7 @@ static BOOL crypt_export_plaintext_key(CRYPTKEY
*pCryptKey, BYTE *pbData,
*pdwDataLen = dwDataLen;
return TRUE;
}
+
/******************************************************************************
* crypt_export_key [Internal]
*
@@ -2794,7 +2667,7 @@ static BOOL crypt_export_plaintext_key(CRYPTKEY
*pCryptKey, BYTE *pbData,
* Success: TRUE.
* Failure: FALSE.
*/
-static BOOL crypt_export_key(CRYPTKEY *pCryptKey, HCRYPTKEY hPubKey,
+BOOL crypt_export_key(CRYPTKEY *pCryptKey, HCRYPTKEY hPubKey,
DWORD dwBlobType, DWORD dwFlags, BOOL force,
BYTE *pbData, DWORD *pdwDataLen)
{
--
2.21.0