//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1997 - 1999 // // File: signgen.cpp // //-------------------------------------------------------------------------- #include "global.hxx" #include extern HINSTANCE HinstDll; extern HMODULE HmodRichEdit; static const HELPMAP helpmap[] = { {IDC_SIGNER_GENERAL_SIGNER_NAME, IDH_SIGNERINFO_GENERAL_SIGNERNAME}, {IDC_SIGNER_GENERAL_EMAIL, IDH_SIGNERINFO_GENERAL_SIGNEREMAIL}, {IDC_SIGNER_GENERAL_SIGNING_TIME, IDH_SIGNERINFO_GENERAL_SIGNETIME}, {IDC_SIGNER_GENERAL_VIEW_CERTIFICATE, IDH_SIGNERINFO_GENERAL_VIEW_CERTIFICATE}, {IDC_SIGNER_GENERAL_COUNTER_SIGS, IDH_SIGNERINFO_GENERAL_COUNTERSIG_LIST}, {IDC_SIGNER_GENERAL_DETAILS, IDH_SIGNERINFO_GENERAL_COUNTERSIG_DETAILS} }; ////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////// static void AddCounterSignersToList(HWND hWndListView, SIGNER_VIEW_HELPER *pviewhelp) { CMSG_SIGNER_INFO const *pSignerInfo; PCMSG_SIGNER_INFO pCounterSignerInfo; DWORD cbCounterSignerInfo; PCCERT_CONTEXT pCertContext = NULL; DWORD i; WCHAR szNameText[CRYPTUI_MAX_STRING_SIZE]; WCHAR szEmailText[CRYPTUI_MAX_STRING_SIZE]; LV_ITEMW lvI; int itemIndex = 0; LPWSTR pszTimeText; pSignerInfo = pviewhelp->pcvsi->pSignerInfo; // // set up the fields in the list view item struct that don't change from item to item // memset(&lvI, 0, sizeof(lvI)); lvI.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE; lvI.state = 0; lvI.stateMask = 0; // // loop for each unauthenticated attribute and see if it is a counter sig // for (i=0; iUnauthAttrs.cAttr; i++) { if (!(strcmp(pSignerInfo->UnauthAttrs.rgAttr[i].pszObjId, szOID_RSA_counterSign) == 0)) { continue; } assert(pSignerInfo->UnauthAttrs.rgAttr[i].cValue == 1); // // decode the EncodedSigner info // cbCounterSignerInfo = 0; pCounterSignerInfo = NULL; if(!CryptDecodeObject(PKCS_7_ASN_ENCODING|CRYPT_ASN_ENCODING, PKCS7_SIGNER_INFO, pSignerInfo->UnauthAttrs.rgAttr[i].rgValue[0].pbData, pSignerInfo->UnauthAttrs.rgAttr[i].rgValue[0].cbData, 0, NULL, &cbCounterSignerInfo)) { return; } if (NULL == (pCounterSignerInfo = (PCMSG_SIGNER_INFO)malloc(cbCounterSignerInfo))) { return; } if(!CryptDecodeObject(PKCS_7_ASN_ENCODING|CRYPT_ASN_ENCODING, PKCS7_SIGNER_INFO, pSignerInfo->UnauthAttrs.rgAttr[i].rgValue[0].pbData, pSignerInfo->UnauthAttrs.rgAttr[i].rgValue[0].cbData, 0, pCounterSignerInfo, &cbCounterSignerInfo)) { free(pCounterSignerInfo); return; } // // find the signers cert // pCertContext = GetSignersCert( pCounterSignerInfo, pviewhelp->hExtraStore, pviewhelp->pcvsi->cStores, pviewhelp->pcvsi->rghStores); // // get the signers name // if (!(pCertContext && CertGetNameStringW( pCertContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0,//CERT_NAME_ISSUER_FLAG, NULL, szNameText, ARRAYSIZE(szNameText)))) { LoadStringU(HinstDll, IDS_NOTAVAILABLE, szNameText, ARRAYSIZE(szNameText)); } // // get the signers email // if (!(pCertContext && (CertGetNameStringW( pCertContext, CERT_NAME_EMAIL_TYPE, 0,//CERT_NAME_ISSUER_FLAG, NULL, szEmailText, ARRAYSIZE(szEmailText)) != 1))) { LoadStringU(HinstDll, IDS_NOTAVAILABLE, szEmailText, ARRAYSIZE(szEmailText)); } pszTimeText = AllocAndReturnSignTime(pCounterSignerInfo, NULL, hWndListView); // // add the item to the list view // lvI.iSubItem = 0; lvI.pszText = szNameText; lvI.cchTextMax = wcslen(szNameText); lvI.lParam = (LPARAM) pCounterSignerInfo; lvI.iItem = itemIndex++; ListView_InsertItemU(hWndListView, &lvI); ListView_SetItemTextU(hWndListView, itemIndex-1 , 1, szEmailText); if (pszTimeText != NULL) { ListView_SetItemTextU(hWndListView, itemIndex-1 , 2, pszTimeText); free(pszTimeText); } else { LoadStringU(HinstDll, IDS_NOTAVAILABLE, szEmailText, ARRAYSIZE(szEmailText)); ListView_SetItemTextU(hWndListView, itemIndex-1 , 2, szEmailText); } } } ////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////// static BOOL ValidateCertForUsageWrapper( PCCERT_CONTEXT pCertContext, DWORD cStores, HCERTSTORE * rghStores, HCERTSTORE hExtraStore, LPCSTR pszOID) { if ((pszOID == NULL) || (!((strcmp(pszOID, szOID_PKIX_KP_TIMESTAMP_SIGNING) == 0) || (strcmp(pszOID, szOID_KP_TIME_STAMP_SIGNING) == 0)))) { return (ValidateCertForUsage( pCertContext, NULL, cStores, rghStores, hExtraStore, pszOID)); } else { return (ValidateCertForUsage( pCertContext, NULL, cStores, rghStores, hExtraStore, szOID_PKIX_KP_TIMESTAMP_SIGNING) || ValidateCertForUsage( pCertContext, NULL, cStores, rghStores, hExtraStore, szOID_KP_TIME_STAMP_SIGNING)); } } ////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////// static BOOL GetWinVTrustState(SIGNER_VIEW_HELPER *pviewhelp) { HCERTSTORE *rghLocalStoreArray; DWORD i; // // if the private data was passed in that means WinVerifyTrust has already // been called so just use that state to see if the cert is OK, otherwise // call BuildWinVTrustState to build up the state // if (pviewhelp->pPrivate == NULL) { // // make one array out of the array of hCertStores plus the extra hCertStore // if (NULL == (rghLocalStoreArray = (HCERTSTORE *) malloc(sizeof(HCERTSTORE) * (pviewhelp->pcvsi->cStores+1)))) { return FALSE; } i=0; while (ipcvsi->cStores) { rghLocalStoreArray[i] = pviewhelp->pcvsi->rghStores[i]; i++; } rghLocalStoreArray[i] = pviewhelp->hExtraStore; if (NULL == (pviewhelp->pPrivate = (CERT_VIEWSIGNERINFO_PRIVATE *) malloc(sizeof(CERT_VIEWSIGNERINFO_PRIVATE)))) { free(rghLocalStoreArray); return FALSE; } if (BuildWinVTrustState( NULL, pviewhelp->pcvsi->pSignerInfo, pviewhelp->pcvsi->cStores+1, rghLocalStoreArray, pviewhelp->pcvsi->pszOID, pviewhelp->pPrivate, &(pviewhelp->CryptProviderDefUsage), &(pviewhelp->WTD))) { pviewhelp->fPrivateAllocated = TRUE; pviewhelp->pPrivate->idxSigner = 0; pviewhelp->pPrivate->fCounterSigner = FALSE; pviewhelp->pPrivate->idxCounterSigner = 0; pviewhelp->pPrivate->dwInheritedError = 0; } else { free(pviewhelp->pPrivate); pviewhelp->pPrivate = NULL; } free(rghLocalStoreArray); } if (pviewhelp->pPrivate != NULL) { return TRUE; } else { return FALSE; } } ////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////// INT_PTR APIENTRY ViewPageSignerGeneral(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { DWORD i; PROPSHEETPAGE *ps; SIGNER_VIEW_HELPER *pviewhelp; HWND hWndListView; LV_COLUMNW lvC; WCHAR szText[CRYPTUI_MAX_STRING_SIZE]; HANDLE hGraphic; DWORD cbText; LPWSTR pwszText; CMSG_SIGNER_INFO const *pSignerInfo; LPWSTR pszTimeText; LVITEMW lvI; int listIndex; CHARFORMAT chFormat; HWND hwnd; CRYPT_PROVIDER_DATA const *pProvData = NULL; LPWSTR pwszErrorString; LPNMLISTVIEW pnmv; switch ( msg ) { case WM_INITDIALOG: // // save the pviewhelp struct in DWL_USER so it can always be accessed // ps = (PROPSHEETPAGE *) lParam; pviewhelp = (SIGNER_VIEW_HELPER *) (ps->lParam); pSignerInfo = pviewhelp->pcvsi->pSignerInfo; SetWindowLongPtr(hwndDlg, DWLP_USER, (DWORD_PTR) pviewhelp); // // extract the signers cert from the list of stores // pviewhelp->pSignersCert = GetSignersCert( pviewhelp->pcvsi->pSignerInfo, pviewhelp->hExtraStore, pviewhelp->pcvsi->cStores, pviewhelp->pcvsi->rghStores); if (!GetWinVTrustState(pviewhelp)) { return FALSE; } switch (pviewhelp->pPrivate->pCryptProviderData->dwFinalError) { case TRUST_E_NO_SIGNER_CERT: pviewhelp->hIcon = LoadIcon(HinstDll, MAKEINTRESOURCE(IDI_EXCLAMATION_SIGN)); LoadStringU(HinstDll, IDS_SIGNER_UNAVAILABLE_CERT, (LPWSTR)szText, ARRAYSIZE(szText)); break; case TRUST_E_CERT_SIGNATURE: pviewhelp->hIcon = LoadIcon(HinstDll, MAKEINTRESOURCE(IDI_REVOKED_SIGN)); LoadStringU(HinstDll, IDS_BAD_SIGNER_CERT_SIGNATURE, (LPWSTR)szText, ARRAYSIZE(szText)); break; case TRUST_E_BAD_DIGEST: pviewhelp->hIcon = LoadIcon(HinstDll, MAKEINTRESOURCE(IDI_REVOKED_SIGN)); LoadStringU(HinstDll, IDS_SIGNER_INVALID_SIGNATURE, (LPWSTR)szText, ARRAYSIZE(szText)); break; case CERT_E_CHAINING: pviewhelp->hIcon = LoadIcon(HinstDll, MAKEINTRESOURCE(IDI_REVOKED_SIGN)); LoadStringU(HinstDll, IDS_SIGNER_CERT_NO_VERIFY, (LPWSTR)szText, ARRAYSIZE(szText)); break; case TRUST_E_COUNTER_SIGNER: case TRUST_E_TIME_STAMP: pviewhelp->hIcon = LoadIcon(HinstDll, MAKEINTRESOURCE(IDI_REVOKED_SIGN)); // // if the over-all error is a counter signer signer error, then we need to check // whether we are currently viewing the counter signer of the original signer // if (pviewhelp->pPrivate->fCounterSigner) { PCRYPT_PROVIDER_SGNR pSigner; // // if we are looking at the counter signer, then get the specific error // out of the signer structure // pSigner = WTHelperGetProvSignerFromChain( pviewhelp->pPrivate->pCryptProviderData, pviewhelp->pPrivate->idxSigner, pviewhelp->pPrivate->fCounterSigner, pviewhelp->pPrivate->idxCounterSigner); if (pSigner == NULL) { LoadStringU(HinstDll, IDS_UKNOWN_ERROR, (LPWSTR)szText, ARRAYSIZE(szText)); } else { switch (pSigner->dwError) { case TRUST_E_NO_SIGNER_CERT: pviewhelp->hIcon = LoadIcon(HinstDll, MAKEINTRESOURCE(IDI_EXCLAMATION_SIGN)); LoadStringU(HinstDll, IDS_SIGNER_UNAVAILABLE_CERT, (LPWSTR)szText, ARRAYSIZE(szText)); break; case TRUST_E_CERT_SIGNATURE: LoadStringU(HinstDll, IDS_BAD_SIGNER_CERT_SIGNATURE, (LPWSTR)szText, ARRAYSIZE(szText)); break; case TRUST_E_BAD_DIGEST: case NTE_BAD_SIGNATURE: LoadStringU(HinstDll, IDS_SIGNER_INVALID_SIGNATURE, (LPWSTR)szText, ARRAYSIZE(szText)); break; default: GetUnknownErrorString(&pwszErrorString, pSigner->dwError); if ((pwszErrorString != NULL) && (wcslen(pwszErrorString)+1 < ARRAYSIZE(szText))) { wcscpy(szText, pwszErrorString); } else { LoadStringU(HinstDll, IDS_UKNOWN_ERROR, (LPWSTR)szText, ARRAYSIZE(szText)); } free(pwszErrorString); break; } } } else { // // since we are viewing the original signer, just set the generic counter signer // error problem // LoadStringU(HinstDll, IDS_COUNTER_SIGNER_INVALID, (LPWSTR)szText, ARRAYSIZE(szText)); } break; case 0: // // even if there is no error from the wintrust call, there may be ar // inherited error, if that is that case then fall through to the default // error processing // if ((pviewhelp->dwInheritedError == 0) && (pviewhelp->pPrivate->dwInheritedError == 0)) { pviewhelp->hIcon = LoadIcon(HinstDll, MAKEINTRESOURCE(IDI_SIGN)); LoadStringU(HinstDll, IDS_SIGNER_VALID, (LPWSTR)szText, ARRAYSIZE(szText)); break; } // fall through if dwInheritedError is not 0 default: if (pviewhelp->pPrivate->pCryptProviderData->dwFinalError != 0) { GetUnknownErrorString(&pwszErrorString, pviewhelp->pPrivate->pCryptProviderData->dwFinalError); } else { if (pviewhelp->dwInheritedError != 0) { GetUnknownErrorString(&pwszErrorString, pviewhelp->dwInheritedError); } else { GetUnknownErrorString(&pwszErrorString, pviewhelp->pPrivate->dwInheritedError); } } pviewhelp->hIcon = LoadIcon(HinstDll, MAKEINTRESOURCE(IDI_REVOKED_SIGN)); if ((pwszErrorString != NULL) && (wcslen(pwszErrorString)+1 < ARRAYSIZE(szText))) { wcscpy(szText, pwszErrorString); } else { LoadStringU(HinstDll, IDS_UKNOWN_ERROR, (LPWSTR)szText, ARRAYSIZE(szText)); } free(pwszErrorString); break; } CryptUISetRicheditTextW(hwndDlg, IDC_SIGNER_GENERAL_VALIDITY_EDIT, szText); LoadStringU(HinstDll, IDS_SIGNER_INFORMATION, (LPWSTR)szText, ARRAYSIZE(szText)); // // set the header text and subclass the edit controls so they display an // arrow cursor in their window // CryptUISetRicheditTextW(hwndDlg, IDC_SIGNER_GENERAL_HEADER_EDIT, szText); CertSubclassEditControlForArrowCursor(GetDlgItem(hwndDlg, IDC_SIGNER_GENERAL_VALIDITY_EDIT)); CertSubclassEditControlForArrowCursor(GetDlgItem(hwndDlg, IDC_SIGNER_GENERAL_HEADER_EDIT)); // // disable the "View Certificate" button if the cert was not found // if (pviewhelp->pSignersCert == NULL) { EnableWindow(GetDlgItem(hwndDlg, IDC_SIGNER_GENERAL_VIEW_CERTIFICATE), FALSE); } // // get the signers name and display it // if (!((pviewhelp->pSignersCert) && (CertGetNameStringW( pviewhelp->pSignersCert, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0,//CERT_NAME_ISSUER_FLAG, NULL, szText, ARRAYSIZE(szText))))) { LoadStringU(HinstDll, IDS_NOTAVAILABLE, szText, ARRAYSIZE(szText)); } CryptUISetRicheditTextW(hwndDlg, IDC_SIGNER_GENERAL_SIGNER_NAME, szText); // // get the signers email and display it // if (!((pviewhelp->pSignersCert) && (CertGetNameStringW( pviewhelp->pSignersCert, CERT_NAME_EMAIL_TYPE, 0,//CERT_NAME_ISSUER_FLAG, NULL, szText, ARRAYSIZE(szText)) != 1))) { LoadStringU(HinstDll, IDS_NOTAVAILABLE, szText, ARRAYSIZE(szText)); } CryptUISetRicheditTextW(hwndDlg, IDC_SIGNER_GENERAL_EMAIL, szText); // // get the signing time and display it // pszTimeText = AllocAndReturnTimeStampersTimes( pviewhelp->pcvsi->pSignerInfo, NULL, GetDlgItem(hwndDlg, IDC_SIGNER_GENERAL_SIGNING_TIME)); if (pszTimeText != NULL) { CryptUISetRicheditTextW(hwndDlg, IDC_SIGNER_GENERAL_SIGNING_TIME, pszTimeText); free(pszTimeText); } else { LoadStringU(HinstDll, IDS_NOTAVAILABLE, szText, ARRAYSIZE(szText)); CryptUISetRicheditTextW(hwndDlg, IDC_SIGNER_GENERAL_SIGNING_TIME, szText); } // // disable the view details button since nothing is currently selected // EnableWindow(GetDlgItem(hwndDlg, IDC_SIGNER_GENERAL_DETAILS), FALSE); // // create and set the font for the signer info header information // memset(&chFormat, 0, sizeof(chFormat)); chFormat.cbSize = sizeof(chFormat); chFormat.dwMask = CFM_BOLD; chFormat.dwEffects = CFE_BOLD; SendMessageA(GetDlgItem(hwndDlg, IDC_SIGNER_GENERAL_HEADER_EDIT), EM_SETCHARFORMAT, SCF_ALL, (LPARAM) &chFormat); // // get the handle of the list view control // hWndListView = GetDlgItem(hwndDlg, IDC_SIGNER_GENERAL_COUNTER_SIGS); // // initialize the columns in the list view // lvC.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvC.fmt = LVCFMT_LEFT; // Left-align the column. lvC.pszText = szText; // The text for the column. // Add the columns. They are loaded from a string table. lvC.iSubItem = 0; lvC.cx = 100; LoadStringU(HinstDll, IDS_NAME, szText, ARRAYSIZE(szText)); if (ListView_InsertColumnU(hWndListView, 0, &lvC) == -1) { // error } lvC.cx = 100; LoadStringU(HinstDll, IDS_EMAIL, szText, ARRAYSIZE(szText)); if (ListView_InsertColumnU(hWndListView, 1, &lvC) == -1) { // error } lvC.cx = 125; LoadStringU(HinstDll, IDS_TIMESTAMP_TIME, szText, ARRAYSIZE(szText)); if (ListView_InsertColumnU(hWndListView, 2, &lvC) == -1) { // error } // // set the style in the list view so that it highlights an entire line // SendMessageA(hWndListView, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT); // // add all of the counter signers to the list box // AddCounterSignersToList(GetDlgItem(hwndDlg, IDC_SIGNER_GENERAL_COUNTER_SIGS), pviewhelp); return TRUE; case WM_NOTIFY: pviewhelp = (SIGNER_VIEW_HELPER *) GetWindowLongPtr(hwndDlg, DWLP_USER); pSignerInfo = pviewhelp->pcvsi->pSignerInfo; switch (((NMHDR FAR *) lParam)->code) { case PSN_SETACTIVE: break; case PSN_APPLY: SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, (LRESULT)TRUE); break; case PSN_KILLACTIVE: SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, (LRESULT)FALSE); return TRUE; case PSN_RESET: SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, (LRESULT)FALSE); break; case PSN_QUERYCANCEL: pviewhelp->fCancelled = TRUE; return FALSE; case PSN_HELP: pviewhelp = (SIGNER_VIEW_HELPER *) GetWindowLongPtr(hwndDlg, DWLP_USER); if (FIsWin95) { //WinHelpA(hwndDlg, (LPSTR) pviewhelp->pcvsi->szHelpFileName, // HELP_CONTEXT, pviewhelp->pcvsi->dwHelpId); } else { //WinHelpW(hwndDlg, pviewhelp->pcvsi->szHelpFileName, HELP_CONTEXT, // pviewhelp->pcvsi->dwHelpId); } return TRUE; case NM_DBLCLK: switch (((NMHDR FAR *) lParam)->idFrom) { case IDC_SIGNER_GENERAL_COUNTER_SIGS: if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_SIGNER_GENERAL_DETAILS))) { SendMessage( hwndDlg, WM_COMMAND, MAKELONG(IDC_SIGNER_GENERAL_DETAILS, BN_CLICKED), (LPARAM) GetDlgItem(hwndDlg, IDC_SIGNER_GENERAL_DETAILS)); } break; } break; case LVN_ITEMCHANGED: if ((((NMHDR FAR *) lParam)->idFrom) != IDC_SIGNER_GENERAL_COUNTER_SIGS) { break; } // // if an item is selected, then enable the details button, otherwise // disable it // EnableWindow( GetDlgItem(hwndDlg, IDC_SIGNER_GENERAL_DETAILS), (ListView_GetSelectedCount( GetDlgItem(hwndDlg,IDC_SIGNER_GENERAL_COUNTER_SIGS)) == 0) ? FALSE : TRUE); break; case NM_CLICK: if ((((NMHDR FAR *) lParam)->idFrom) != IDC_SIGNER_GENERAL_COUNTER_SIGS) { break; } hWndListView = GetDlgItem(hwndDlg, IDC_SIGNER_GENERAL_COUNTER_SIGS); // // make sure something is selected by getting the current selection // listIndex = ListView_GetNextItem( hWndListView, -1, LVNI_SELECTED ); break; case NM_SETFOCUS: switch (((NMHDR FAR *) lParam)->idFrom) { case IDC_SIGNER_GENERAL_COUNTER_SIGS: hWndListView = GetDlgItem(hwndDlg, IDC_SIGNER_GENERAL_COUNTER_SIGS); if ((ListView_GetItemCount(hWndListView) != 0) && (ListView_GetNextItem(hWndListView, -1, LVNI_SELECTED) == -1)) { memset(&lvI, 0, sizeof(lvI)); lvI.mask = LVIF_STATE; lvI.iItem = 0; lvI.state = LVIS_FOCUSED; lvI.stateMask = LVIS_FOCUSED; ListView_SetItem(hWndListView, &lvI); } break; } break; } break; case WM_COMMAND: pviewhelp = (SIGNER_VIEW_HELPER *) GetWindowLongPtr(hwndDlg, DWLP_USER); pSignerInfo = pviewhelp->pcvsi->pSignerInfo; switch (LOWORD(wParam)) { case IDC_SIGNER_GENERAL_VIEW_CERTIFICATE: if (HIWORD(wParam) == BN_CLICKED) { CRYPTUI_VIEWCERTIFICATE_STRUCTW cvps; memset(&cvps,0, sizeof(cvps)); cvps.dwSize = sizeof(cvps); cvps.pCryptProviderData = NULL; cvps.hwndParent = hwndDlg; cvps.pCertContext = pviewhelp->pSignersCert; cvps.cPurposes = 1; cvps.rgszPurposes = (LPCSTR *) &(pviewhelp->pcvsi->pszOID); cvps.cStores = pviewhelp->pcvsi->cStores; cvps.rghStores = pviewhelp->pcvsi->rghStores; if (pviewhelp->pPrivate != NULL) { cvps.pCryptProviderData = pviewhelp->pPrivate->pCryptProviderData; cvps.fpCryptProviderDataTrustedUsage = pviewhelp->pPrivate->fpCryptProviderDataTrustedUsage; cvps.idxSigner = pviewhelp->pPrivate->idxSigner; cvps.fCounterSigner = pviewhelp->pPrivate->fCounterSigner; cvps.idxCounterSigner = pviewhelp->pPrivate->idxCounterSigner; } CryptUIDlgViewCertificateW(&cvps, NULL); } break; case IDC_SIGNER_GENERAL_DETAILS: if (HIWORD(wParam) == BN_CLICKED) { hWndListView = GetDlgItem(hwndDlg, IDC_SIGNER_GENERAL_COUNTER_SIGS); // // get the selected item and its lParam which is a signer info // listIndex = ListView_GetNextItem( hWndListView, -1, LVNI_SELECTED ); memset(&lvI, 0, sizeof(lvI)); lvI.iItem = listIndex; lvI.mask = LVIF_PARAM; if (!ListView_GetItemU(hWndListView, &lvI)) { return FALSE; } CRYPTUI_VIEWSIGNERINFO_STRUCTW cvsi; CERT_VIEWSIGNERINFO_PRIVATE cvsiPrivate; memcpy(&cvsi, pviewhelp->pcvsi, sizeof(cvsi)); cvsi.pSignerInfo = (PCMSG_SIGNER_INFO) lvI.lParam; cvsi.pszOID = szOID_KP_TIME_STAMP_SIGNING; cvsi.hwndParent = hwndDlg; if (pviewhelp->pPrivate != NULL) { cvsiPrivate.pCryptProviderData = pviewhelp->pPrivate->pCryptProviderData; cvsiPrivate.fpCryptProviderDataTrustedUsage = pviewhelp->pPrivate->fpCryptProviderDataTrustedUsage; cvsiPrivate.idxSigner = pviewhelp->pPrivate->idxSigner; cvsiPrivate.fCounterSigner = TRUE; cvsiPrivate.idxCounterSigner = listIndex; cvsi.dwFlags |= CRYPTUI_VIEWSIGNERINFO_RESERVED_FIELD_IS_SIGNERINFO_PRIVATE; cvsi.dwFlags &= ~CRYPTUI_VIEWSIGNERINFO_RESERVED_FIELD_IS_ERROR_CODE; cvsi.dwReserved = (DWORD_PTR) &cvsiPrivate; // // it is possible that there is no error when validating the original // signer info and that an error was inherited, so to allow the counter // signer dialog to again inherit the error it must be filled in in the // private struct // if (pviewhelp->pcvsi->dwFlags & CRYPTUI_VIEWSIGNERINFO_RESERVED_FIELD_IS_ERROR_CODE) { cvsiPrivate.dwInheritedError = (DWORD) pviewhelp->pcvsi->dwReserved; } else { cvsiPrivate.dwInheritedError = 0; } } else if (pviewhelp->pcvsi->dwFlags & CRYPTUI_VIEWSIGNERINFO_RESERVED_FIELD_IS_ERROR_CODE) { cvsi.dwFlags |= CRYPTUI_VIEWSIGNERINFO_RESERVED_FIELD_IS_ERROR_CODE; cvsi.dwFlags &= ~CRYPTUI_VIEWSIGNERINFO_RESERVED_FIELD_IS_SIGNERINFO_PRIVATE; cvsi.dwReserved = pviewhelp->pcvsi->dwReserved; } CryptUIDlgViewSignerInfoW(&cvsi); } break; case IDHELP: if (FIsWin95) { //WinHelpA(hwndDlg, (LPSTR) pviewhelp->pcvsi->szHelpFileName, // HELP_CONTEXT, pviewhelp->pcvsi->dwHelpId); } else { //WinHelpW(hwndDlg, pviewhelp->pcvsi->szHelpFileName, HELP_CONTEXT, // pviewhelp->pcvsi->dwHelpId); } return TRUE; } break; case WM_PAINT: RECT rect; PAINTSTRUCT paintstruct; HDC hdc; COLORREF colorRef; pviewhelp = (SIGNER_VIEW_HELPER *) GetWindowLongPtr(hwndDlg, DWLP_USER); if (GetUpdateRect(hwndDlg, &rect, FALSE)) { hdc = BeginPaint(hwndDlg, &paintstruct); if (hdc == NULL) { EndPaint(hwndDlg, &paintstruct); break; } colorRef = GetBkColor(hdc); SendMessageA(GetDlgItem(hwndDlg, IDC_SIGNER_GENERAL_VALIDITY_EDIT), EM_SETBKGNDCOLOR , 0, (LPARAM) colorRef); SendMessageA(GetDlgItem(hwndDlg, IDC_SIGNER_GENERAL_HEADER_EDIT), EM_SETBKGNDCOLOR, 0, (LPARAM) colorRef); if (pviewhelp->hIcon != NULL) { DrawIcon( hdc, ICON_X_POS, ICON_Y_POS, pviewhelp->hIcon); } EndPaint(hwndDlg, &paintstruct); } break; case WM_DESTROY: pviewhelp = (SIGNER_VIEW_HELPER *) GetWindowLongPtr(hwndDlg, DWLP_USER); if (pviewhelp->pSignersCert) { CertFreeCertificateContext(pviewhelp->pSignersCert); pviewhelp->pSignersCert = NULL; } if (pviewhelp->hIcon != NULL) { DeleteObject(pviewhelp->hIcon); pviewhelp->hIcon = NULL; } if (pviewhelp->fPrivateAllocated) { FreeWinVTrustState( NULL, pviewhelp->pcvsi->pSignerInfo, 0, NULL, pviewhelp->pcvsi->pszOID, &(pviewhelp->CryptProviderDefUsage), &(pviewhelp->WTD));//, //&(pviewhelp->fUseDefaultProvider)); free(pviewhelp->pPrivate); } // // get all the items in the list view and free the lParam // associated with each of them (lParam is the helper sruct) // hWndListView = GetDlgItem(hwndDlg, IDC_SIGNER_GENERAL_COUNTER_SIGS); memset(&lvI, 0, sizeof(lvI)); lvI.iItem = ListView_GetItemCount(hWndListView) - 1; lvI.mask = LVIF_PARAM; while (lvI.iItem >= 0) { if (ListView_GetItemU(hWndListView, &lvI)) { if (((void *) lvI.lParam) != NULL) { free((void *) lvI.lParam); } } lvI.iItem--; } break; case WM_HELP: case WM_CONTEXTMENU: if (msg == WM_HELP) { hwnd = GetDlgItem(hwndDlg, ((LPHELPINFO)lParam)->iCtrlId); } else { hwnd = (HWND) wParam; } if ((hwnd != GetDlgItem(hwndDlg, IDC_SIGNER_GENERAL_SIGNER_NAME)) && (hwnd != GetDlgItem(hwndDlg, IDC_SIGNER_GENERAL_EMAIL)) && (hwnd != GetDlgItem(hwndDlg, IDC_SIGNER_GENERAL_SIGNING_TIME)) && (hwnd != GetDlgItem(hwndDlg, IDC_SIGNER_GENERAL_VIEW_CERTIFICATE)) && (hwnd != GetDlgItem(hwndDlg, IDC_SIGNER_GENERAL_COUNTER_SIGS)) && (hwnd != GetDlgItem(hwndDlg, IDC_SIGNER_GENERAL_DETAILS))) { SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, (LRESULT)TRUE); return TRUE; } else { return OnContextHelp(hwndDlg, msg, wParam, lParam, helpmap); } } return FALSE; }