Juan Lang : crypt32: Use CryptSIPRetrieveSubjectGuid to determine how to read a message object from a file , rather than assuming the source file is always a PE executable.
Alexandre Julliard
julliard at winehq.org
Tue Aug 5 07:26:22 CDT 2008
Module: wine
Branch: master
Commit: 10f23fa7f5a8319de556817f106f7bd227a8d42f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=10f23fa7f5a8319de556817f106f7bd227a8d42f
Author: Juan Lang <juan.lang at gmail.com>
Date: Mon Aug 4 22:04:10 2008 -0700
crypt32: Use CryptSIPRetrieveSubjectGuid to determine how to read a message object from a file, rather than assuming the source file is always a PE executable.
---
dlls/crypt32/Makefile.in | 1 -
dlls/crypt32/object.c | 62 +++++++++++++++++++++++++++++++++------------
2 files changed, 45 insertions(+), 18 deletions(-)
diff --git a/dlls/crypt32/Makefile.in b/dlls/crypt32/Makefile.in
index 441efc4..16fbd5e 100644
--- a/dlls/crypt32/Makefile.in
+++ b/dlls/crypt32/Makefile.in
@@ -6,7 +6,6 @@ VPATH = @srcdir@
MODULE = crypt32.dll
IMPORTLIB = crypt32
IMPORTS = user32 advapi32 kernel32 ntdll
-DELAYIMPORTS = imagehlp
C_SRCS = \
base64.c \
diff --git a/dlls/crypt32/object.c b/dlls/crypt32/object.c
index 3eb8988..05a6c5f 100644
--- a/dlls/crypt32/object.c
+++ b/dlls/crypt32/object.c
@@ -21,7 +21,7 @@
#include "windef.h"
#include "winbase.h"
#include "wincrypt.h"
-#include "imagehlp.h"
+#include "mssip.h"
#include "crypt32_private.h"
#include "wine/debug.h"
@@ -400,8 +400,11 @@ static BOOL CRYPT_QueryEmbeddedMessageObject(DWORD dwObjectType,
HCERTSTORE *phCertStore, HCRYPTMSG *phMsg)
{
HANDLE file;
+ GUID subject;
BOOL ret = FALSE;
+ TRACE("%s\n", debugstr_w((LPCWSTR)pvObject));
+
if (dwObjectType != CERT_QUERY_OBJECT_FILE)
{
FIXME("don't know what to do for type %d embedded signed messages\n",
@@ -413,28 +416,53 @@ static BOOL CRYPT_QueryEmbeddedMessageObject(DWORD dwObjectType,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (file != INVALID_HANDLE_VALUE)
{
- DWORD len = 0;
-
- ret = ImageGetCertificateData(file, 0, NULL, &len);
- if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
+ ret = CryptSIPRetrieveSubjectGuid((LPCWSTR)pvObject, file, &subject);
+ if (ret)
{
- WIN_CERTIFICATE *winCert = HeapAlloc(GetProcessHeap(), 0, len);
+ SIP_DISPATCH_INFO sip;
- if (winCert)
+ memset(&sip, 0, sizeof(sip));
+ sip.cbSize = sizeof(sip);
+ ret = CryptSIPLoad(&subject, 0, &sip);
+ if (ret)
{
- ret = ImageGetCertificateData(file, 0, winCert, &len);
+ SIP_SUBJECTINFO subjectInfo;
+ CERT_BLOB blob;
+ DWORD encodingType;
+
+ memset(&subjectInfo, 0, sizeof(subjectInfo));
+ subjectInfo.cbSize = sizeof(subjectInfo);
+ subjectInfo.pgSubjectType = &subject;
+ subjectInfo.hFile = file;
+ subjectInfo.pwsFileName = (LPCWSTR)pvObject;
+ ret = sip.pfGet(&subjectInfo, &encodingType, 0, &blob.cbData,
+ NULL);
if (ret)
{
- CERT_BLOB blob = { winCert->dwLength,
- winCert->bCertificate };
-
- ret = CRYPT_QueryMessageObject(CERT_QUERY_OBJECT_BLOB,
- &blob, CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED,
- pdwMsgAndCertEncodingType, NULL, phCertStore, phMsg);
- if (ret && pdwContentType)
- *pdwContentType = CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED;
+ blob.pbData = CryptMemAlloc(blob.cbData);
+ if (blob.pbData)
+ {
+ ret = sip.pfGet(&subjectInfo, &encodingType, 0,
+ &blob.cbData, blob.pbData);
+ if (ret)
+ {
+ ret = CRYPT_QueryMessageObject(
+ CERT_QUERY_OBJECT_BLOB, &blob,
+ CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED,
+ pdwMsgAndCertEncodingType, NULL, phCertStore,
+ phMsg);
+ if (ret && pdwContentType)
+ *pdwContentType =
+ CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED;
+ }
+ CryptMemFree(blob.pbData);
+ }
+ else
+ {
+ SetLastError(ERROR_OUTOFMEMORY);
+ ret = FALSE;
+ }
}
- HeapFree(GetProcessHeap(), 0, winCert);
}
}
CloseHandle(file);
More information about the wine-cvs
mailing list