--- 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) {