Module: wine Branch: master Commit: a1e14feeac8a5bbcda8ea9ecfd35252ba1a91cbb URL: http://source.winehq.org/git/wine.git/?a=commit;h=a1e14feeac8a5bbcda8ea9ecfd...
Author: Juan Lang juan.lang@gmail.com Date: Fri Aug 8 10:44:46 2008 -0700
crypt32: Implement CertFindCertificateInStore for CERT_FIND_SIGNATURE_HASH.
---
dlls/crypt32/cert.c | 29 +++++++++++++++++++++++++++++ 1 files changed, 29 insertions(+), 0 deletions(-)
diff --git a/dlls/crypt32/cert.c b/dlls/crypt32/cert.c index 4d5d5e4..d9ab229 100644 --- a/dlls/crypt32/cert.c +++ b/dlls/crypt32/cert.c @@ -1143,6 +1143,32 @@ static BOOL compare_existing_cert(PCCERT_CONTEXT pCertContext, DWORD dwType, pCertContext->pCertInfo, toCompare->pCertInfo); }
+static BOOL compare_cert_by_signature_hash(PCCERT_CONTEXT pCertContext, DWORD dwType, + DWORD dwFlags, const void *pvPara) +{ + const CRYPT_HASH_BLOB *hash = (const CRYPT_HASH_BLOB *)pvPara; + DWORD size = 0; + BOOL ret; + + ret = CertGetCertificateContextProperty(pCertContext, + CERT_SIGNATURE_HASH_PROP_ID, NULL, &size); + if (ret && size == hash->cbData) + { + LPBYTE buf = CryptMemAlloc(size); + + if (buf) + { + CertGetCertificateContextProperty(pCertContext, + CERT_SIGNATURE_HASH_PROP_ID, buf, &size); + ret = !memcmp(buf, hash->pbData, size); + CryptMemFree(buf); + } + } + else + ret = FALSE; + return ret; +} + PCCERT_CONTEXT WINAPI CertFindCertificateInStore(HCERTSTORE hCertStore, DWORD dwCertEncodingType, DWORD dwFlags, DWORD dwType, const void *pvPara, PCCERT_CONTEXT pPrevCertContext) @@ -1179,6 +1205,9 @@ PCCERT_CONTEXT WINAPI CertFindCertificateInStore(HCERTSTORE hCertStore, case CERT_COMPARE_EXISTING: compare = compare_existing_cert; break; + case CERT_COMPARE_SIGNATURE_HASH: + compare = compare_cert_by_signature_hash; + break; default: FIXME("find type %08x unimplemented\n", dwType); compare = NULL;