Juan Lang : cryptui: Save private key in temporary store when exporting it.

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


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

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

cryptui: Save private key in temporary store when exporting it.

---

 dlls/cryptui/main.c |   49 ++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 40 insertions(+), 9 deletions(-)

diff --git a/dlls/cryptui/main.c b/dlls/cryptui/main.c
index 620f53f..5cd38e7 100644
--- a/dlls/cryptui/main.c
+++ b/dlls/cryptui/main.c
@@ -6499,7 +6499,8 @@ 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)
+ PCCRYPTUI_WIZ_EXPORT_CERTCONTEXT_INFO pContextInfo,
+ PCRYPT_KEY_PROV_INFO keyProvInfo)
 {
     HCERTSTORE store = CertOpenStore(CERT_STORE_PROV_MEMORY, X509_ASN_ENCODING,
      0, CERT_STORE_CREATE_NEW_FLAG, NULL);
@@ -6508,6 +6509,7 @@ static BOOL save_pfx(HANDLE file, PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo,
     if (store)
     {
         CRYPT_DATA_BLOB pfxBlob = { 0, NULL };
+        PCCERT_CONTEXT cert = NULL;
 
         if (pContextInfo->fExportChain)
         {
@@ -6542,9 +6544,16 @@ static BOOL save_pfx(HANDLE file, PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo,
                     for (i = 0; ret && i < chain->cChain; i++)
                         for (j = 0; ret && j < chain->rgpChain[i]->cElement;
                          j++)
-                            ret = CertAddCertificateContextToStore(store,
-                             chain->rgpChain[i]->rgpElement[j]->pCertContext,
-                             CERT_STORE_ADD_ALWAYS, NULL);
+                        {
+                            if (i == 0 && j == 0)
+                                ret = CertAddCertificateContextToStore(store,
+                                 chain->rgpChain[i]->rgpElement[j]->pCertContext,
+                                 CERT_STORE_ADD_ALWAYS, &cert);
+                            else
+                                ret = CertAddCertificateContextToStore(store,
+                                 chain->rgpChain[i]->rgpElement[j]->pCertContext,
+                                 CERT_STORE_ADD_ALWAYS, NULL);
+                        }
                     CertFreeCertificateChain(chain);
                 }
             }
@@ -6553,7 +6562,27 @@ static BOOL save_pfx(HANDLE file, PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo,
         }
         else
             ret = CertAddCertificateContextToStore(store,
-             pExportInfo->u.pCertContext, CERT_STORE_ADD_ALWAYS, NULL);
+             pExportInfo->u.pCertContext, CERT_STORE_ADD_ALWAYS, &cert);
+        /* Copy private key info to newly created cert, so it'll get exported
+         * along with the cert.
+         */
+        if (ret && pContextInfo->fExportPrivateKeys)
+        {
+            if (keyProvInfo)
+                ret = CertSetCertificateContextProperty(cert,
+                 CERT_KEY_PROV_INFO_PROP_ID, 0, keyProvInfo);
+            else
+            {
+                if (!(keyProvInfo = export_get_private_key_info(cert)))
+                    ret = FALSE;
+                else
+                {
+                    ret = CertSetCertificateContextProperty(cert,
+                     CERT_KEY_PROV_INFO_PROP_ID, 0, keyProvInfo);
+                    HeapFree(GetProcessHeap(), 0, keyProvInfo);
+                }
+            }
+        }
         if (ret)
         {
             DWORD exportFlags =
@@ -6583,13 +6612,15 @@ static BOOL save_pfx(HANDLE file, PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo,
                 }
             }
         }
+        CertFreeCertificateContext(cert);
         CertCloseStore(store, 0);
     }
     return ret;
 }
 
 static BOOL do_export(HANDLE file, PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo,
- PCCRYPTUI_WIZ_EXPORT_CERTCONTEXT_INFO pContextInfo)
+ PCCRYPTUI_WIZ_EXPORT_CERTCONTEXT_INFO pContextInfo,
+ PCRYPT_KEY_PROV_INFO keyProvInfo)
 {
     BOOL ret;
 
@@ -6633,7 +6664,7 @@ 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);
+            ret = save_pfx(file, pExportInfo, pContextInfo, keyProvInfo);
             break;
         default:
             SetLastError(E_FAIL);
@@ -6697,7 +6728,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->contextInfo, data->keyProvInfo)))
             {
                 messageID = IDS_EXPORT_SUCCEEDED;
                 mbFlags = MB_OK;
@@ -6902,7 +6933,7 @@ BOOL WINAPI CryptUIWizExport(DWORD dwFlags, HWND hwndParent,
 
         if (file != INVALID_HANDLE_VALUE)
         {
-            ret = do_export(file, pExportInfo, pvoid);
+            ret = do_export(file, pExportInfo, pvoid, NULL);
             CloseHandle(file);
         }
         else




More information about the wine-cvs mailing list