[PATCH resend 09/10] refactor rsaenh - move CPAcquireContext, CPReleaseContext from rsaenh/rsaenh.c to rsaenh/cryptoprovutils.c

Zhang Shuai wxsxsdz at gmail.com
Sun Nov 17 14:06:04 CST 2019


Signed-off-by: Zhang Shuai <wxsxsdz at gmail.com>
---
 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