[PATCH resend 09/10] dssenh: refactor rsaenh - move CPAcquireContext, CPReleaseContext from rsaenh/rsaenh.c to rsaenh/cryptoprovutils.c
Zhang Shuai
wxsxsdz at gmail.com
Sun Nov 17 13:01:34 CST 2019
---
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);
}
/******************************************************************************
--
2.21.0
More information about the wine-devel
mailing list