Juan Lang : cryptui: Delete the private keys if requested when they' re successfully exported.

Alexandre Julliard julliard at winehq.org
Mon Feb 9 10:29:22 CST 2009


Module: wine
Branch: master
Commit: c7d65aa7e1a8af75b3efdc5a5a6c4c70291c4650
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c7d65aa7e1a8af75b3efdc5a5a6c4c70291c4650

Author: Juan Lang <juan.lang at gmail.com>
Date:   Fri Feb  6 12:35:52 2009 -0800

cryptui: Delete the private keys if requested when they're successfully exported.

---

 dlls/cryptui/main.c |   28 +++++++++++++++++++++-------
 1 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/dlls/cryptui/main.c b/dlls/cryptui/main.c
index 5cd38e7..af86408 100644
--- a/dlls/cryptui/main.c
+++ b/dlls/cryptui/main.c
@@ -5519,6 +5519,7 @@ struct ExportWizData
     CRYPTUI_WIZ_EXPORT_CERTCONTEXT_INFO contextInfo;
     BOOL freePassword;
     PCRYPT_KEY_PROV_INFO keyProvInfo;
+    BOOL deleteKeys;
     LPWSTR fileName;
     HANDLE file;
     BOOL success;
@@ -5814,7 +5815,7 @@ static LRESULT CALLBACK export_format_dlg_proc(HWND hwnd, UINT msg, WPARAM wp,
                 if (IsDlgButtonChecked(hwnd, IDC_EXPORT_PFX_STRONG_ENCRYPTION))
                     data->contextInfo.fStrongEncryption = TRUE;
                 if (IsDlgButtonChecked(hwnd, IDC_EXPORT_PFX_DELETE_PRIVATE_KEY))
-                    data->contextInfo.fExportPrivateKeys = TRUE;
+                    data->deleteKeys = TRUE;
                 skipPasswordPage = FALSE;
             }
             SetWindowLongPtrW(hwnd, DWLP_MSGRESULT,
@@ -6500,7 +6501,7 @@ static BOOL save_serialized_store(HANDLE file, HCERTSTORE store)
 
 static BOOL save_pfx(HANDLE file, PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo,
  PCCRYPTUI_WIZ_EXPORT_CERTCONTEXT_INFO pContextInfo,
- PCRYPT_KEY_PROV_INFO keyProvInfo)
+ PCRYPT_KEY_PROV_INFO keyProvInfo, BOOL deleteKeys)
 {
     HCERTSTORE store = CertOpenStore(CERT_STORE_PROV_MEMORY, X509_ASN_ENCODING,
      0, CERT_STORE_CREATE_NEW_FLAG, NULL);
@@ -6510,6 +6511,7 @@ static BOOL save_pfx(HANDLE file, PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo,
     {
         CRYPT_DATA_BLOB pfxBlob = { 0, NULL };
         PCCERT_CONTEXT cert = NULL;
+        BOOL freeKeyProvInfo = FALSE;
 
         if (pContextInfo->fExportChain)
         {
@@ -6579,7 +6581,7 @@ static BOOL save_pfx(HANDLE file, PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo,
                 {
                     ret = CertSetCertificateContextProperty(cert,
                      CERT_KEY_PROV_INFO_PROP_ID, 0, keyProvInfo);
-                    HeapFree(GetProcessHeap(), 0, keyProvInfo);
+                    freeKeyProvInfo = TRUE;
                 }
             }
         }
@@ -6612,6 +6614,16 @@ static BOOL save_pfx(HANDLE file, PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo,
                 }
             }
         }
+        if (ret && deleteKeys)
+        {
+            HCRYPTPROV prov;
+
+            CryptAcquireContextW(&prov, keyProvInfo->pwszContainerName,
+             keyProvInfo->pwszProvName, keyProvInfo->dwProvType,
+             CRYPT_DELETEKEYSET);
+        }
+        if (freeKeyProvInfo)
+            HeapFree(GetProcessHeap(), 0, keyProvInfo);
         CertFreeCertificateContext(cert);
         CertCloseStore(store, 0);
     }
@@ -6620,7 +6632,7 @@ static BOOL save_pfx(HANDLE file, PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo,
 
 static BOOL do_export(HANDLE file, PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo,
  PCCRYPTUI_WIZ_EXPORT_CERTCONTEXT_INFO pContextInfo,
- PCRYPT_KEY_PROV_INFO keyProvInfo)
+ PCRYPT_KEY_PROV_INFO keyProvInfo, BOOL deleteKeys)
 {
     BOOL ret;
 
@@ -6664,7 +6676,8 @@ static BOOL do_export(HANDLE file, PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo,
              pContextInfo->fExportChain);
             break;
         case CRYPTUI_WIZ_EXPORT_FORMAT_PFX:
-            ret = save_pfx(file, pExportInfo, pContextInfo, keyProvInfo);
+            ret = save_pfx(file, pExportInfo, pContextInfo, keyProvInfo,
+             deleteKeys);
             break;
         default:
             SetLastError(E_FAIL);
@@ -6728,7 +6741,7 @@ static LRESULT CALLBACK export_finish_dlg_proc(HWND hwnd, UINT msg, WPARAM wp,
 
             data = (struct ExportWizData *)GetWindowLongPtrW(hwnd, DWLP_USER);
             if ((data->success = do_export(data->file, &data->exportInfo,
-             &data->contextInfo, data->keyProvInfo)))
+             &data->contextInfo, data->keyProvInfo, data->deleteKeys)))
             {
                 messageID = IDS_EXPORT_SUCCEEDED;
                 mbFlags = MB_OK;
@@ -6788,6 +6801,7 @@ static BOOL show_export_ui(DWORD dwFlags, HWND hwndParent,
          min(((PCCRYPTUI_WIZ_EXPORT_CERTCONTEXT_INFO)pvoid)->dwSize,
          sizeof(data.contextInfo)));
     data.keyProvInfo = NULL;
+    data.deleteKeys = FALSE;
     data.fileName = NULL;
     data.file = INVALID_HANDLE_VALUE;
     data.success = FALSE;
@@ -6933,7 +6947,7 @@ BOOL WINAPI CryptUIWizExport(DWORD dwFlags, HWND hwndParent,
 
         if (file != INVALID_HANDLE_VALUE)
         {
-            ret = do_export(file, pExportInfo, pvoid, NULL);
+            ret = do_export(file, pExportInfo, pvoid, NULL, FALSE);
             CloseHandle(file);
         }
         else




More information about the wine-cvs mailing list