crypt32: Implement CertGetSubjectCertificateFromStore.
This commit is contained in:
parent
7870a5a6a1
commit
ae5823db3f
@ -55,7 +55,7 @@
|
|||||||
@ stdcall CertGetNameStringA(ptr long long ptr ptr long)
|
@ stdcall CertGetNameStringA(ptr long long ptr ptr long)
|
||||||
@ stdcall CertGetNameStringW(ptr long long ptr ptr long)
|
@ stdcall CertGetNameStringW(ptr long long ptr ptr long)
|
||||||
@ stub CertGetPublicKeyLength
|
@ stub CertGetPublicKeyLength
|
||||||
@ stub CertGetSubjectCertificateFromStore
|
@ stdcall CertGetSubjectCertificateFromStore(ptr long ptr)
|
||||||
@ stdcall CertGetValidUsages(long ptr ptr ptr ptr)
|
@ stdcall CertGetValidUsages(long ptr ptr ptr ptr)
|
||||||
@ stub CertIsRDNAttrsInCertificateName
|
@ stub CertIsRDNAttrsInCertificateName
|
||||||
@ stdcall CertNameToStrA(long ptr long ptr long)
|
@ stdcall CertNameToStrA(long ptr long ptr long)
|
||||||
|
@ -866,9 +866,10 @@ static PWINECRYPT_CERTSTORE CRYPT_ProvOpenStore(LPCSTR lpszStoreProvider,
|
|||||||
dwFlags, pvPara, NULL, &provInfo);
|
dwFlags, pvPara, NULL, &provInfo);
|
||||||
else
|
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 (memStore)
|
||||||
{
|
{
|
||||||
if (provOpenFunc(lpszStoreProvider, dwEncodingType, hCryptProv,
|
if (provOpenFunc(lpszStoreProvider, dwEncodingType, hCryptProv,
|
||||||
@ -2559,6 +2560,20 @@ PCCERT_CONTEXT WINAPI CertFindCertificateInStore(HCERTSTORE hCertStore,
|
|||||||
return ret;
|
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,
|
BOOL WINAPI CertAddStoreToCollection(HCERTSTORE hCollectionStore,
|
||||||
HCERTSTORE hSiblingStore, DWORD dwUpdateFlags, DWORD dwPriority)
|
HCERTSTORE hSiblingStore, DWORD dwUpdateFlags, DWORD dwPriority)
|
||||||
{
|
{
|
||||||
|
@ -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)
|
static void testMemStore(void)
|
||||||
{
|
{
|
||||||
HCERTSTORE store1, store2;
|
HCERTSTORE store1, store2;
|
||||||
@ -1534,6 +1594,7 @@ START_TEST(store)
|
|||||||
{
|
{
|
||||||
testDupCert();
|
testDupCert();
|
||||||
testFindCert();
|
testFindCert();
|
||||||
|
testGetSubjectCert();
|
||||||
|
|
||||||
/* various combinations of CertOpenStore */
|
/* various combinations of CertOpenStore */
|
||||||
testMemStore();
|
testMemStore();
|
||||||
|
@ -2693,6 +2693,9 @@ PCCTL_CONTEXT WINAPI CertFindCTLInStore(HCERTSTORE hCertStore,
|
|||||||
DWORD dwCertEncodingType, DWORD dwFindFlags, DWORD dwFindType,
|
DWORD dwCertEncodingType, DWORD dwFindFlags, DWORD dwFindType,
|
||||||
const void *pvFindPara, PCCTL_CONTEXT pPrevCtlContext);
|
const void *pvFindPara, PCCTL_CONTEXT pPrevCtlContext);
|
||||||
|
|
||||||
|
PCCERT_CONTEXT WINAPI CertGetSubjectCertificateFromStore(HCERTSTORE hCertStore,
|
||||||
|
DWORD dwCertEncodingType, PCERT_INFO pCertId);
|
||||||
|
|
||||||
BOOL WINAPI CertSerializeCertificateStoreElement(PCCERT_CONTEXT pCertContext,
|
BOOL WINAPI CertSerializeCertificateStoreElement(PCCERT_CONTEXT pCertContext,
|
||||||
DWORD dwFlags, BYTE *pbElement, DWORD *pcbElement);
|
DWORD dwFlags, BYTE *pbElement, DWORD *pcbElement);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user