wintrust(7/8): Save signers of a message in SoftpubLoadSignature
Juan Lang
juan.lang at gmail.com
Tue Aug 28 18:22:37 CDT 2007
--Juan
-------------- next part --------------
From c50344ff9145aa9ceb91a490e53c933676bbc7e8 Mon Sep 17 00:00:00 2001
From: Juan Lang <juanlang at juan.corp.google.com>
Date: Tue, 28 Aug 2007 16:10:41 -0700
Subject: [PATCH] Save signers of a message in SoftpubLoadSignature
---
dlls/wintrust/softpub.c | 103 ++++++++++++++++++++++++++++++++++++-----------
1 files changed, 78 insertions(+), 25 deletions(-)
diff --git a/dlls/wintrust/softpub.c b/dlls/wintrust/softpub.c
index caab601..b7c6d5d 100644
--- a/dlls/wintrust/softpub.c
+++ b/dlls/wintrust/softpub.c
@@ -292,6 +292,51 @@ error:
return ret ? S_OK : S_FALSE;
}
+static CMSG_SIGNER_INFO *WINTRUST_GetSigner(CRYPT_PROVIDER_DATA *data,
+ DWORD signerIdx)
+{
+ BOOL ret;
+ CMSG_SIGNER_INFO *signerInfo = NULL;
+ DWORD size;
+
+ ret = CryptMsgGetParam(data->hMsg, CMSG_SIGNER_INFO_PARAM, signerIdx,
+ NULL, &size);
+ if (ret)
+ {
+ signerInfo = data->psPfns->pfnAlloc(size);
+ if (signerInfo)
+ {
+ ret = CryptMsgGetParam(data->hMsg, CMSG_SIGNER_INFO_PARAM,
+ signerIdx, signerInfo, &size);
+ if (!ret)
+ {
+ data->psPfns->pfnFree(signerInfo);
+ signerInfo = NULL;
+ }
+ }
+ else
+ SetLastError(ERROR_OUTOFMEMORY);
+ }
+ return signerInfo;
+}
+
+static BOOL WINTRUST_SaveSigner(CRYPT_PROVIDER_DATA *data, DWORD signerIdx)
+{
+ BOOL ret;
+ CMSG_SIGNER_INFO *signerInfo = WINTRUST_GetSigner(data, signerIdx);
+
+ if (signerInfo)
+ {
+ CRYPT_PROVIDER_SGNR sgnr = { sizeof(sgnr), { 0 } };
+
+ sgnr.psSigner = signerInfo;
+ ret = data->psPfns->pfnAddSgnr2Chain(data, FALSE, signerIdx, &sgnr);
+ }
+ else
+ ret = FALSE;
+ return ret;
+}
+
static CERT_INFO *WINTRUST_GetSignerCertInfo(CRYPT_PROVIDER_DATA *data,
DWORD signerIdx)
{
@@ -320,6 +365,37 @@ static CERT_INFO *WINTRUST_GetSignerCert
return certInfo;
}
+static BOOL WINTRUST_VerifySigner(CRYPT_PROVIDER_DATA *data, DWORD signerIdx)
+{
+ BOOL ret;
+ CERT_INFO *certInfo = WINTRUST_GetSignerCertInfo(data, signerIdx);
+
+ if (certInfo)
+ {
+ CMSG_CTRL_VERIFY_SIGNATURE_EX_PARA para = { sizeof(para), 0, signerIdx,
+ CMSG_VERIFY_SIGNER_CERT, NULL };
+
+ para.pvSigner = (LPVOID)CertGetSubjectCertificateFromStore(
+ data->pahStores[0], data->dwEncoding, certInfo);
+ if (para.pvSigner)
+ {
+ ret = CryptMsgControl(data->hMsg, 0, CMSG_CTRL_VERIFY_SIGNATURE_EX,
+ ¶);
+ if (!ret)
+ SetLastError(TRUST_E_CERT_SIGNATURE);
+ }
+ else
+ {
+ SetLastError(TRUST_E_NO_SIGNER_CERT);
+ ret = FALSE;
+ }
+ data->psPfns->pfnFree(certInfo);
+ }
+ else
+ ret = FALSE;
+ return ret;
+}
+
HRESULT WINAPI SoftpubLoadSignature(CRYPT_PROVIDER_DATA *data)
{
BOOL ret;
@@ -339,31 +415,8 @@ HRESULT WINAPI SoftpubLoadSignature(CRYP
for (i = 0; ret && i < signerCount; i++)
{
- CERT_INFO *certInfo = WINTRUST_GetSignerCertInfo(data, i);
-
- if (certInfo)
- {
- CMSG_CTRL_VERIFY_SIGNATURE_EX_PARA para = { sizeof(para), 0, i,
- CMSG_VERIFY_SIGNER_CERT, NULL };
-
- para.pvSigner = (LPVOID)CertGetSubjectCertificateFromStore(
- data->pahStores[0], data->dwEncoding, certInfo);
- if (para.pvSigner)
- {
- ret = CryptMsgControl(data->hMsg, 0,
- CMSG_CTRL_VERIFY_SIGNATURE_EX, ¶);
- if (!ret)
- SetLastError(TRUST_E_CERT_SIGNATURE);
- }
- else
- {
- SetLastError(TRUST_E_NO_SIGNER_CERT);
- ret = FALSE;
- }
- data->psPfns->pfnFree(certInfo);
- }
- else
- ret = FALSE;
+ if ((ret = WINTRUST_SaveSigner(data, i)))
+ ret = WINTRUST_VerifySigner(data, i);
}
}
else
--
1.4.1
More information about the wine-patches
mailing list