Juan Lang : rsaenh: Use helper function to persist keys.
Alexandre Julliard
julliard at winehq.org
Wed Nov 7 06:46:00 CST 2007
Module: wine
Branch: master
Commit: 58269419e508e1cb8b88420466f0a4daa94d56bc
URL: http://source.winehq.org/git/wine.git/?a=commit;h=58269419e508e1cb8b88420466f0a4daa94d56bc
Author: Juan Lang <juan.lang at gmail.com>
Date: Tue Nov 6 11:27:24 2007 -0800
rsaenh: Use helper function to persist keys.
---
dlls/rsaenh/rsaenh.c | 161 +++++++++++++++++++++++++-------------------------
1 files changed, 80 insertions(+), 81 deletions(-)
diff --git a/dlls/rsaenh/rsaenh.c b/dlls/rsaenh/rsaenh.c
index 3318da6..3561339 100644
--- a/dlls/rsaenh/rsaenh.c
+++ b/dlls/rsaenh/rsaenh.c
@@ -858,108 +858,107 @@ static HCRYPTKEY new_key(HCRYPTPROV hProv, ALG_ID aiAlgid, DWORD dwFlags, CRYPTK
}
/******************************************************************************
- * destroy_key_container [Internal]
+ * store_key_pair [Internal]
*
- * Destructor for key containers.
+ * Stores a key pair to the registry
*
* PARAMS
- * pObjectHdr [I] Pointer to the key container to be destroyed.
+ * hCryptKey [I] Handle to the key to be stored
+ * hKey [I] Registry key where the key pair is to be stored
+ * szValueName [I] Registry value where key pair's value is to be stored
+ * dwFlags [I] Flags for protecting the key
*/
-static void destroy_key_container(OBJECTHDR *pObjectHdr)
+static void store_key_pair(HCRYPTKEY hCryptKey, HKEY hKey, LPCSTR szValueName, DWORD dwFlags)
{
- KEYCONTAINER *pKeyContainer = (KEYCONTAINER*)pObjectHdr;
DATA_BLOB blobIn, blobOut;
CRYPTKEY *pKey;
- CHAR szRSABase[MAX_PATH];
- HKEY hKey, hRootKey;
DWORD dwLen;
BYTE *pbKey;
- if (!(pKeyContainer->dwFlags & CRYPT_VERIFYCONTEXT)) {
- /* On WinXP, persistent keys are stored in a file located at:
- * $AppData$\\Microsoft\\Crypto\\RSA\\$SID$\\some_hex_string
- */
- sprintf(szRSABase, RSAENH_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 */
- if (RegCreateKeyExA(hRootKey, szRSABase, 0, NULL, REG_OPTION_NON_VOLATILE,
- KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS)
+ if (lookup_handle(&handle_table, hCryptKey, RSAENH_MAGIC_KEY,
+ (OBJECTHDR**)&pKey))
+ {
+ if (RSAENH_CPExportKey(pKey->hProv, hCryptKey, 0, PRIVATEKEYBLOB, 0, 0,
+ &dwLen))
{
- if (lookup_handle(&handle_table, pKeyContainer->hKeyExchangeKeyPair, RSAENH_MAGIC_KEY,
- (OBJECTHDR**)&pKey))
+ pbKey = HeapAlloc(GetProcessHeap(), 0, dwLen);
+ if (pbKey)
{
- if (RSAENH_CPExportKey(pKey->hProv, pKeyContainer->hKeyExchangeKeyPair, 0,
- PRIVATEKEYBLOB, 0, 0, &dwLen))
+ if (RSAENH_CPExportKey(pKey->hProv, hCryptKey, 0,
+ PRIVATEKEYBLOB, 0, pbKey, &dwLen))
{
- pbKey = HeapAlloc(GetProcessHeap(), 0, dwLen);
- if (pbKey)
- {
- if (RSAENH_CPExportKey(pKey->hProv, pKeyContainer->hKeyExchangeKeyPair, 0,
- PRIVATEKEYBLOB, 0, pbKey, &dwLen))
- {
- blobIn.pbData = pbKey;
- blobIn.cbData = dwLen;
-
- if (CryptProtectData(&blobIn, NULL, NULL, NULL, NULL,
- (pKeyContainer->dwFlags & CRYPT_MACHINE_KEYSET) ?
- CRYPTPROTECT_LOCAL_MACHINE : 0,
- &blobOut))
- {
- RegSetValueExA(hKey, "KeyExchangeKeyPair", 0, REG_BINARY,
- blobOut.pbData, blobOut.cbData);
- HeapFree(GetProcessHeap(), 0, blobOut.pbData);
- }
- }
- HeapFree(GetProcessHeap(), 0, pbKey);
- }
- }
- release_handle(&handle_table, pKeyContainer->hKeyExchangeKeyPair,
- RSAENH_MAGIC_KEY);
- }
+ blobIn.pbData = pbKey;
+ blobIn.cbData = dwLen;
- if (lookup_handle(&handle_table, pKeyContainer->hSignatureKeyPair, RSAENH_MAGIC_KEY,
- (OBJECTHDR**)&pKey))
- {
- if (RSAENH_CPExportKey(pKey->hProv, pKeyContainer->hSignatureKeyPair, 0,
- PRIVATEKEYBLOB, 0, 0, &dwLen))
- {
- pbKey = HeapAlloc(GetProcessHeap(), 0, dwLen);
- if (pbKey)
+ if (CryptProtectData(&blobIn, NULL, NULL, NULL, NULL,
+ dwFlags, &blobOut))
{
- if (RSAENH_CPExportKey(pKey->hProv, pKeyContainer->hSignatureKeyPair, 0,
- PRIVATEKEYBLOB, 0, pbKey, &dwLen))
- {
- blobIn.pbData = pbKey;
- blobIn.cbData = dwLen;
-
- if (CryptProtectData(&blobIn, NULL, NULL, NULL, NULL,
- (pKeyContainer->dwFlags & CRYPT_MACHINE_KEYSET) ?
- CRYPTPROTECT_LOCAL_MACHINE : 0,
- &blobOut))
- {
- RegSetValueExA(hKey, "SignatureKeyPair", 0, REG_BINARY,
- blobOut.pbData, blobOut.cbData);
- HeapFree(GetProcessHeap(), 0, blobOut.pbData);
- }
- }
- HeapFree(GetProcessHeap(), 0, pbKey);
+ RegSetValueExA(hKey, szValueName, 0, REG_BINARY,
+ blobOut.pbData, blobOut.cbData);
+ HeapFree(GetProcessHeap(), 0, blobOut.pbData);
}
}
- release_handle(&handle_table, pKeyContainer->hSignatureKeyPair,
- RSAENH_MAGIC_KEY);
+ HeapFree(GetProcessHeap(), 0, pbKey);
}
-
- RegCloseKey(hKey);
}
+ release_handle(&handle_table, hCryptKey, RSAENH_MAGIC_KEY);
+ }
+}
+
+/******************************************************************************
+ * store_key_container_keys [Internal]
+ *
+ * Stores key container's keys in a persistent location.
+ *
+ * PARAMS
+ * pKeyContainer [I] Pointer to the key container to be destroyed.
+ */
+static void store_key_container_keys(KEYCONTAINER *pKeyContainer)
+{
+ CHAR szRSABase[MAX_PATH];
+ HKEY hKey, hRootKey;
+ DWORD dwFlags;
+
+ /* On WinXP, persistent keys are stored in a file located at:
+ * $AppData$\\Microsoft\\Crypto\\RSA\\$SID$\\some_hex_string
+ */
+ sprintf(szRSABase, RSAENH_REGKEY, pKeyContainer->szName);
+
+ if (pKeyContainer->dwFlags & CRYPT_MACHINE_KEYSET) {
+ hRootKey = HKEY_LOCAL_MACHINE;
+ dwFlags = CRYPTPROTECT_LOCAL_MACHINE;
+ } else {
+ hRootKey = HKEY_CURRENT_USER;
+ dwFlags = 0;
}
+ /* @@ Wine registry key: HKLM\Software\Wine\Crypto\RSA */
+ /* @@ Wine registry key: HKCU\Software\Wine\Crypto\RSA */
+ if (RegCreateKeyExA(hRootKey, szRSABase, 0, NULL, REG_OPTION_NON_VOLATILE,
+ KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS)
+ {
+ store_key_pair(pKeyContainer->hKeyExchangeKeyPair, hKey,
+ "KeyExchangeKeyPair", dwFlags);
+ store_key_pair(pKeyContainer->hSignatureKeyPair, hKey,
+ "SignatureKeyPair", dwFlags);
+ RegCloseKey(hKey);
+ }
+}
+
+/******************************************************************************
+ * destroy_key_container [Internal]
+ *
+ * Destructor for key containers.
+ *
+ * PARAMS
+ * pObjectHdr [I] Pointer to the key container to be destroyed.
+ */
+static void destroy_key_container(OBJECTHDR *pObjectHdr)
+{
+ KEYCONTAINER *pKeyContainer = (KEYCONTAINER*)pObjectHdr;
+
+ if (!(pKeyContainer->dwFlags & CRYPT_VERIFYCONTEXT))
+ store_key_container_keys(pKeyContainer);
HeapFree( GetProcessHeap(), 0, pKeyContainer );
}
More information about the wine-cvs
mailing list