Juan Lang : crypt32: Implement CertGetSubjectCertificateFromStore.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Mar 17 06:22:46 CST 2006
Module: wine
Branch: refs/heads/master
Commit: ae5823db3f193bcc039117dd94e2cf486c4c0f96
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=ae5823db3f193bcc039117dd94e2cf486c4c0f96
Author: Juan Lang <juan_lang at yahoo.com>
Date: Thu Mar 16 19:22:56 2006 -0800
crypt32: Implement CertGetSubjectCertificateFromStore.
---
dlls/crypt32/crypt32.spec | 2 +
dlls/crypt32/store.c | 19 ++++++++++++--
dlls/crypt32/tests/store.c | 61 ++++++++++++++++++++++++++++++++++++++++++++
include/wincrypt.h | 3 ++
4 files changed, 82 insertions(+), 3 deletions(-)
diff --git a/dlls/crypt32/crypt32.spec b/dlls/crypt32/crypt32.spec
index 4fc11b3..0d08594 100644
--- a/dlls/crypt32/crypt32.spec
+++ b/dlls/crypt32/crypt32.spec
@@ -55,7 +55,7 @@
@ stdcall CertGetNameStringA(ptr long long ptr ptr long)
@ stdcall CertGetNameStringW(ptr long long ptr ptr long)
@ stub CertGetPublicKeyLength
-@ stub CertGetSubjectCertificateFromStore
+@ stdcall CertGetSubjectCertificateFromStore(ptr long ptr)
@ stdcall CertGetValidUsages(long ptr ptr ptr ptr)
@ stub CertIsRDNAttrsInCertificateName
@ stdcall CertNameToStrA(long ptr long ptr long)
diff --git a/dlls/crypt32/store.c b/dlls/crypt32/store.c
index 495ca03..cf896f7 100644
--- a/dlls/crypt32/store.c
+++ b/dlls/crypt32/store.c
@@ -866,9 +866,10 @@ static PWINECRYPT_CERTSTORE CRYPT_ProvOp
dwFlags, pvPara, NULL, &provInfo);
else
{
- PWINECRYPT_CERTSTORE memStore;
+ HCERTSTORE memStore;
- memStore = CRYPT_MemOpenStore(hCryptProv, dwFlags, NULL);
+ memStore = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0,
+ CERT_STORE_CREATE_NEW_FLAG, NULL);
if (memStore)
{
if (provOpenFunc(lpszStoreProvider, dwEncodingType, hCryptProv,
@@ -2559,6 +2560,20 @@ PCCERT_CONTEXT WINAPI CertFindCertificat
return ret;
}
+PCCERT_CONTEXT WINAPI CertGetSubjectCertificateFromStore(HCERTSTORE hCertStore,
+ DWORD dwCertEncodingType, PCERT_INFO pCertId)
+{
+ TRACE("(%p, %08lx, %p)\n", hCertStore, dwCertEncodingType, pCertId);
+
+ if (!pCertId)
+ {
+ SetLastError(HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER));
+ return NULL;
+ }
+ return CertFindCertificateInStore(hCertStore, dwCertEncodingType, 0,
+ CERT_FIND_SUBJECT_CERT, pCertId, NULL);
+}
+
BOOL WINAPI CertAddStoreToCollection(HCERTSTORE hCollectionStore,
HCERTSTORE hSiblingStore, DWORD dwUpdateFlags, DWORD dwPriority)
{
diff --git a/dlls/crypt32/tests/store.c b/dlls/crypt32/tests/store.c
index c147afb..68356f7 100644
--- a/dlls/crypt32/tests/store.c
+++ b/dlls/crypt32/tests/store.c
@@ -261,6 +261,66 @@ static void testFindCert(void)
}
}
+static void testGetSubjectCert(void)
+{
+ HCERTSTORE store;
+
+ store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0,
+ CERT_STORE_CREATE_NEW_FLAG, NULL);
+ ok(store, "CertOpenStore failed: %ld\n", GetLastError());
+ if (store != NULL)
+ {
+ PCCERT_CONTEXT context1, context2;
+ CERT_INFO info = { 0 };
+ BOOL ret;
+
+ ret = CertAddEncodedCertificateToStore(store, X509_ASN_ENCODING,
+ bigCert, sizeof(bigCert), CERT_STORE_ADD_ALWAYS, NULL);
+ ok(ret, "CertAddEncodedCertificateToStore failed: %08lx\n",
+ GetLastError());
+ ret = CertAddEncodedCertificateToStore(store, X509_ASN_ENCODING,
+ bigCert2, sizeof(bigCert2), CERT_STORE_ADD_NEW, &context1);
+ ok(ret, "CertAddEncodedCertificateToStore failed: %08lx\n",
+ GetLastError());
+ ok(context1 != NULL, "Expected a context\n");
+ ret = CertAddEncodedCertificateToStore(store, X509_ASN_ENCODING,
+ certWithUsage, sizeof(certWithUsage), CERT_STORE_ADD_NEW, NULL);
+ ok(ret, "CertAddEncodedCertificateToStore failed: %08lx\n",
+ GetLastError());
+
+ context2 = CertGetSubjectCertificateFromStore(store, X509_ASN_ENCODING,
+ NULL);
+ ok(!context2 && GetLastError() ==
+ HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER),
+ "Expected HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER), got %08lx\n",
+ GetLastError());
+ context2 = CertGetSubjectCertificateFromStore(store, X509_ASN_ENCODING,
+ &info);
+ ok(!context2 && GetLastError() == CRYPT_E_NOT_FOUND,
+ "Expected CRYPT_E_NOT_FOUND, got %08lx\n", GetLastError());
+ info.SerialNumber.cbData = sizeof(serialNum);
+ info.SerialNumber.pbData = (LPBYTE)serialNum;
+ context2 = CertGetSubjectCertificateFromStore(store, X509_ASN_ENCODING,
+ &info);
+ ok(!context2 && GetLastError() == CRYPT_E_NOT_FOUND,
+ "Expected CRYPT_E_NOT_FOUND, got %08lx\n", GetLastError());
+ info.Issuer.cbData = sizeof(subjectName2);
+ info.Issuer.pbData = (LPBYTE)subjectName2;
+ context2 = CertGetSubjectCertificateFromStore(store, X509_ASN_ENCODING,
+ &info);
+ ok(context2 != NULL,
+ "CertGetSubjectCertificateFromStore failed: %08lx\n", GetLastError());
+ /* Not only should this find a context, but it should be the same
+ * (same address) as context1.
+ */
+ ok(context1 == context2, "Expected identical context addresses\n");
+ CertFreeCertificateContext(context2);
+
+ CertFreeCertificateContext(context1);
+ CertCloseStore(store, 0);
+ }
+}
+
static void testMemStore(void)
{
HCERTSTORE store1, store2;
@@ -1534,6 +1594,7 @@ START_TEST(store)
{
testDupCert();
testFindCert();
+ testGetSubjectCert();
/* various combinations of CertOpenStore */
testMemStore();
diff --git a/include/wincrypt.h b/include/wincrypt.h
index 9784223..085d310 100644
--- a/include/wincrypt.h
+++ b/include/wincrypt.h
@@ -2693,6 +2693,9 @@ PCCTL_CONTEXT WINAPI CertFindCTLInStore(
DWORD dwCertEncodingType, DWORD dwFindFlags, DWORD dwFindType,
const void *pvFindPara, PCCTL_CONTEXT pPrevCtlContext);
+PCCERT_CONTEXT WINAPI CertGetSubjectCertificateFromStore(HCERTSTORE hCertStore,
+ DWORD dwCertEncodingType, PCERT_INFO pCertId);
+
BOOL WINAPI CertSerializeCertificateStoreElement(PCCERT_CONTEXT pCertContext,
DWORD dwFlags, BYTE *pbElement, DWORD *pcbElement);
More information about the wine-cvs
mailing list