--- dlls/rsaenh/cryptoprovutils.c | 120 ++++++++++++++++++++++++++++++++++ dlls/rsaenh/cryptoprovutils.h | 3 + dlls/rsaenh/rsaenh.c | 75 +-------------------- 3 files changed, 125 insertions(+), 73 deletions(-)
diff --git a/dlls/rsaenh/cryptoprovutils.c b/dlls/rsaenh/cryptoprovutils.c index ed3b16b13a..e4580a655d 100644 --- a/dlls/rsaenh/cryptoprovutils.c +++ b/dlls/rsaenh/cryptoprovutils.c @@ -531,3 +531,123 @@ HCRYPTPROV new_key_container(PCCH pszContainerName, DWORD dwFlags, const VTableP return hKeyContainer; }
+/****************************************************************************** + * CPAcquireContext [internal] + * + * 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 PVTableProvStruct 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 CRYPTO_PROV_CPAcquireContext(HCRYPTPROV *phProv, LPSTR pszContainer, + DWORD dwFlags, PVTableProvStruc pVTable) +{ + CHAR szKeyContainerName[MAX_PATH]; + + TRACE("(phProv=%p, pszContainer=%s, dwFlags=%08x, pVTable=%p)\n", phProv, + debugstr_a(pszContainer), dwFlags, pVTable); + + if (pszContainer && *pszContainer) + { + lstrcpynA(szKeyContainerName, pszContainer, MAX_PATH); + } + else + { + DWORD dwLen = sizeof(szKeyContainerName); + if (!GetUserNameA(szKeyContainerName, &dwLen)) return FALSE; + } + + switch (dwFlags & (CRYPT_NEWKEYSET|CRYPT_VERIFYCONTEXT|CRYPT_DELETEKEYSET)) + { + case 0: + *phProv = read_key_container(szKeyContainerName, dwFlags, pVTable); + break; + + case CRYPT_DELETEKEYSET: + return delete_container_key(szKeyContainerName, dwFlags); + + case CRYPT_NEWKEYSET: + *phProv = read_key_container(szKeyContainerName, dwFlags, pVTable); + if (*phProv != (HCRYPTPROV)INVALID_HANDLE_VALUE) + { + release_handle(&handle_table, *phProv, CRYPTO_PROV_MAGIC_CONTAINER); + TRACE("Can't create new keyset, already exists\n"); + SetLastError(NTE_EXISTS); + return FALSE; + } + *phProv = new_key_container(szKeyContainerName, dwFlags, pVTable); + break; + + case CRYPT_VERIFYCONTEXT|CRYPT_NEWKEYSET: + case CRYPT_VERIFYCONTEXT: + if (pszContainer && *pszContainer) { + TRACE("pszContainer should be empty\n"); + SetLastError(NTE_BAD_FLAGS); + return FALSE; + } + *phProv = new_key_container("", dwFlags, pVTable); + break; + + default: + *phProv = (HCRYPTPROV)INVALID_HANDLE_VALUE; + SetLastError(NTE_BAD_FLAGS); + return FALSE; + } + + if (*phProv != (HCRYPTPROV)INVALID_HANDLE_VALUE) { + SetLastError(ERROR_SUCCESS); + return TRUE; + } else { + return FALSE; + } +} + +/****************************************************************************** + * CPReleaseContext [internal] + * + * Release a key container. + * + * PARAMS + * hProv [I] Key container to be released. + * dwFlags [I] Currently none defined. + * + * RETURNS + * Success: TRUE + * Failure: FALSE + */ +BOOL WINAPI CRYPTO_PROV_CPReleaseContext(HCRYPTPROV hProv, DWORD dwFlags) +{ + TRACE("(hProv=%08lx, dwFlags=%08x)\n", hProv, dwFlags); + + if (!release_handle(&handle_table, hProv, CRYPTO_PROV_MAGIC_CONTAINER)) + { + /* MSDN: hProv not containing valid context handle */ + SetLastError(NTE_BAD_UID); + return FALSE; + } + + if (dwFlags) { + SetLastError(NTE_BAD_FLAGS); + return FALSE; + } + + return TRUE; +} + diff --git a/dlls/rsaenh/cryptoprovutils.h b/dlls/rsaenh/cryptoprovutils.h index 3a756d3735..b5efd14491 100644 --- a/dlls/rsaenh/cryptoprovutils.h +++ b/dlls/rsaenh/cryptoprovutils.h @@ -88,4 +88,7 @@ HCRYPTPROV read_key_container(PCHAR pszContainerName, DWORD dwFlags, const VTabl HCRYPTPROV new_key_container(PCCH pszContainerName, DWORD dwFlags, const VTableProvStruc *pVTable); BOOL import_key(HCRYPTPROV hProv, const BYTE *pbData, DWORD dwDataLen, HCRYPTKEY hPubKey, DWORD dwFlags, BOOL fStoreKey, HCRYPTKEY *phKey); +BOOL WINAPI CRYPTO_PROV_CPAcquireContext(HCRYPTPROV *phProv, LPSTR pszContainer, + DWORD dwFlags, PVTableProvStruc pVTable); +BOOL WINAPI CRYPTO_PROV_CPReleaseContext(HCRYPTPROV hProv, DWORD dwFlags); #endif /* __WINE_CRYPTOPROVUTILS_H */ diff --git a/dlls/rsaenh/rsaenh.c b/dlls/rsaenh/rsaenh.c index 310863a514..9a2756e5a3 100644 --- a/dlls/rsaenh/rsaenh.c +++ b/dlls/rsaenh/rsaenh.c @@ -1500,64 +1500,7 @@ static BOOL unpad_data(HCRYPTPROV hProv, const BYTE *abData, DWORD dwDataLen, BY BOOL WINAPI RSAENH_CPAcquireContext(HCRYPTPROV *phProv, LPSTR pszContainer, DWORD dwFlags, PVTableProvStruc pVTable) { - CHAR szKeyContainerName[MAX_PATH]; - - TRACE("(phProv=%p, pszContainer=%s, dwFlags=%08x, pVTable=%p)\n", phProv, - debugstr_a(pszContainer), dwFlags, pVTable); - - if (pszContainer && *pszContainer) - { - lstrcpynA(szKeyContainerName, pszContainer, MAX_PATH); - } - else - { - DWORD dwLen = sizeof(szKeyContainerName); - if (!GetUserNameA(szKeyContainerName, &dwLen)) return FALSE; - } - - switch (dwFlags & (CRYPT_NEWKEYSET|CRYPT_VERIFYCONTEXT|CRYPT_DELETEKEYSET)) - { - case 0: - *phProv = read_key_container(szKeyContainerName, dwFlags, pVTable); - break; - - case CRYPT_DELETEKEYSET: - return delete_container_key(szKeyContainerName, dwFlags); - - case CRYPT_NEWKEYSET: - *phProv = read_key_container(szKeyContainerName, dwFlags, pVTable); - if (*phProv != (HCRYPTPROV)INVALID_HANDLE_VALUE) - { - release_handle(&handle_table, *phProv, RSAENH_MAGIC_CONTAINER); - TRACE("Can't create new keyset, already exists\n"); - SetLastError(NTE_EXISTS); - return FALSE; - } - *phProv = new_key_container(szKeyContainerName, dwFlags, pVTable); - break; - - case CRYPT_VERIFYCONTEXT|CRYPT_NEWKEYSET: - case CRYPT_VERIFYCONTEXT: - if (pszContainer && *pszContainer) { - TRACE("pszContainer should be empty\n"); - SetLastError(NTE_BAD_FLAGS); - return FALSE; - } - *phProv = new_key_container("", dwFlags, pVTable); - break; - - default: - *phProv = (HCRYPTPROV)INVALID_HANDLE_VALUE; - SetLastError(NTE_BAD_FLAGS); - return FALSE; - } - - if (*phProv != (HCRYPTPROV)INVALID_HANDLE_VALUE) { - SetLastError(ERROR_SUCCESS); - return TRUE; - } else { - return FALSE; - } + return CRYPTO_PROV_CPAcquireContext(phProv, pszContainer, dwFlags, pVTable); }
/****************************************************************************** @@ -3977,21 +3920,7 @@ BOOL WINAPI RSAENH_CPHashSessionKey(HCRYPTPROV hProv, HCRYPTHASH hHash, HCRYPTKE */ BOOL WINAPI RSAENH_CPReleaseContext(HCRYPTPROV hProv, DWORD dwFlags) { - TRACE("(hProv=%08lx, dwFlags=%08x)\n", hProv, dwFlags); - - if (!release_handle(&handle_table, hProv, RSAENH_MAGIC_CONTAINER)) - { - /* MSDN: hProv not containing valid context handle */ - SetLastError(NTE_BAD_UID); - return FALSE; - } - - if (dwFlags) { - SetLastError(NTE_BAD_FLAGS); - return FALSE; - } - - return TRUE; + return CRYPTO_PROV_CPReleaseContext(hProv, dwFlags); }
/******************************************************************************