Module: wine Branch: master Commit: 58269419e508e1cb8b88420466f0a4daa94d56bc URL: http://source.winehq.org/git/wine.git/?a=commit;h=58269419e508e1cb8b88420466...
Author: Juan Lang juan.lang@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 ); }