crypt32: Set subject's info status from method used to find issuer.
This commit is contained in:
parent
54428bfb99
commit
a5833ac9f4
|
@ -508,7 +508,8 @@ static void CRYPT_CheckSimpleChain(PCertificateChainEngine engine,
|
||||||
}
|
}
|
||||||
if (CRYPT_IsCertificateSelfSigned(rootElement->pCertContext))
|
if (CRYPT_IsCertificateSelfSigned(rootElement->pCertContext))
|
||||||
{
|
{
|
||||||
rootElement->TrustStatus.dwInfoStatus |= CERT_TRUST_IS_SELF_SIGNED;
|
rootElement->TrustStatus.dwInfoStatus |=
|
||||||
|
CERT_TRUST_IS_SELF_SIGNED | CERT_TRUST_HAS_NAME_MATCH_ISSUER;
|
||||||
CRYPT_CheckRootCert(engine->hRoot, rootElement);
|
CRYPT_CheckRootCert(engine->hRoot, rootElement);
|
||||||
}
|
}
|
||||||
/* FIXME: check revocation of every cert with CertVerifyRevocation */
|
/* FIXME: check revocation of every cert with CertVerifyRevocation */
|
||||||
|
@ -516,12 +517,13 @@ static void CRYPT_CheckSimpleChain(PCertificateChainEngine engine,
|
||||||
}
|
}
|
||||||
|
|
||||||
static PCCERT_CONTEXT CRYPT_GetIssuer(HCERTSTORE store, PCCERT_CONTEXT subject,
|
static PCCERT_CONTEXT CRYPT_GetIssuer(HCERTSTORE store, PCCERT_CONTEXT subject,
|
||||||
PCCERT_CONTEXT prevIssuer)
|
PCCERT_CONTEXT prevIssuer, DWORD *infoStatus)
|
||||||
{
|
{
|
||||||
PCCERT_CONTEXT issuer = NULL;
|
PCCERT_CONTEXT issuer = NULL;
|
||||||
PCERT_EXTENSION ext;
|
PCERT_EXTENSION ext;
|
||||||
DWORD size;
|
DWORD size;
|
||||||
|
|
||||||
|
*infoStatus = 0;
|
||||||
if ((ext = CertFindExtension(szOID_AUTHORITY_KEY_IDENTIFIER,
|
if ((ext = CertFindExtension(szOID_AUTHORITY_KEY_IDENTIFIER,
|
||||||
subject->pCertInfo->cExtension, subject->pCertInfo->rgExtension)))
|
subject->pCertInfo->cExtension, subject->pCertInfo->rgExtension)))
|
||||||
{
|
{
|
||||||
|
@ -546,6 +548,8 @@ static PCCERT_CONTEXT CRYPT_GetIssuer(HCERTSTORE store, PCCERT_CONTEXT subject,
|
||||||
issuer = CertFindCertificateInStore(store,
|
issuer = CertFindCertificateInStore(store,
|
||||||
subject->dwCertEncodingType, 0, CERT_FIND_CERT_ID, &id,
|
subject->dwCertEncodingType, 0, CERT_FIND_CERT_ID, &id,
|
||||||
prevIssuer);
|
prevIssuer);
|
||||||
|
if (issuer)
|
||||||
|
*infoStatus = CERT_TRUST_HAS_EXACT_MATCH_ISSUER;
|
||||||
}
|
}
|
||||||
else if (info->KeyId.cbData)
|
else if (info->KeyId.cbData)
|
||||||
{
|
{
|
||||||
|
@ -554,6 +558,8 @@ static PCCERT_CONTEXT CRYPT_GetIssuer(HCERTSTORE store, PCCERT_CONTEXT subject,
|
||||||
issuer = CertFindCertificateInStore(store,
|
issuer = CertFindCertificateInStore(store,
|
||||||
subject->dwCertEncodingType, 0, CERT_FIND_CERT_ID, &id,
|
subject->dwCertEncodingType, 0, CERT_FIND_CERT_ID, &id,
|
||||||
prevIssuer);
|
prevIssuer);
|
||||||
|
if (issuer)
|
||||||
|
*infoStatus = CERT_TRUST_HAS_KEY_MATCH_ISSUER;
|
||||||
}
|
}
|
||||||
LocalFree(info);
|
LocalFree(info);
|
||||||
}
|
}
|
||||||
|
@ -595,6 +601,8 @@ static PCCERT_CONTEXT CRYPT_GetIssuer(HCERTSTORE store, PCCERT_CONTEXT subject,
|
||||||
issuer = CertFindCertificateInStore(store,
|
issuer = CertFindCertificateInStore(store,
|
||||||
subject->dwCertEncodingType, 0, CERT_FIND_CERT_ID, &id,
|
subject->dwCertEncodingType, 0, CERT_FIND_CERT_ID, &id,
|
||||||
prevIssuer);
|
prevIssuer);
|
||||||
|
if (issuer)
|
||||||
|
*infoStatus = CERT_TRUST_HAS_EXACT_MATCH_ISSUER;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
FIXME("no supported name type in authority key id2\n");
|
FIXME("no supported name type in authority key id2\n");
|
||||||
|
@ -606,6 +614,8 @@ static PCCERT_CONTEXT CRYPT_GetIssuer(HCERTSTORE store, PCCERT_CONTEXT subject,
|
||||||
issuer = CertFindCertificateInStore(store,
|
issuer = CertFindCertificateInStore(store,
|
||||||
subject->dwCertEncodingType, 0, CERT_FIND_CERT_ID, &id,
|
subject->dwCertEncodingType, 0, CERT_FIND_CERT_ID, &id,
|
||||||
prevIssuer);
|
prevIssuer);
|
||||||
|
if (issuer)
|
||||||
|
*infoStatus = CERT_TRUST_HAS_KEY_MATCH_ISSUER;
|
||||||
}
|
}
|
||||||
LocalFree(info);
|
LocalFree(info);
|
||||||
}
|
}
|
||||||
|
@ -615,6 +625,8 @@ static PCCERT_CONTEXT CRYPT_GetIssuer(HCERTSTORE store, PCCERT_CONTEXT subject,
|
||||||
issuer = CertFindCertificateInStore(store,
|
issuer = CertFindCertificateInStore(store,
|
||||||
subject->dwCertEncodingType, 0, CERT_FIND_SUBJECT_NAME,
|
subject->dwCertEncodingType, 0, CERT_FIND_SUBJECT_NAME,
|
||||||
&subject->pCertInfo->Issuer, prevIssuer);
|
&subject->pCertInfo->Issuer, prevIssuer);
|
||||||
|
if (issuer)
|
||||||
|
*infoStatus = CERT_TRUST_HAS_NAME_MATCH_ISSUER;
|
||||||
}
|
}
|
||||||
return issuer;
|
return issuer;
|
||||||
}
|
}
|
||||||
|
@ -631,11 +643,12 @@ static BOOL CRYPT_BuildSimpleChain(PCertificateChainEngine engine,
|
||||||
while (ret && !CRYPT_IsSimpleChainCyclic(chain) &&
|
while (ret && !CRYPT_IsSimpleChainCyclic(chain) &&
|
||||||
!CRYPT_IsCertificateSelfSigned(cert))
|
!CRYPT_IsCertificateSelfSigned(cert))
|
||||||
{
|
{
|
||||||
PCCERT_CONTEXT issuer = CRYPT_GetIssuer(world, cert, NULL);
|
DWORD infoStatus;
|
||||||
|
PCCERT_CONTEXT issuer = CRYPT_GetIssuer(world, cert, NULL, &infoStatus);
|
||||||
|
|
||||||
if (issuer)
|
if (issuer)
|
||||||
{
|
{
|
||||||
ret = CRYPT_AddCertToSimpleChain(engine, chain, issuer, 0);
|
ret = CRYPT_AddCertToSimpleChain(engine, chain, issuer, infoStatus);
|
||||||
cert = issuer;
|
cert = issuer;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -888,7 +901,7 @@ static PCertificateChain CRYPT_BuildAlternateContextFromChain(
|
||||||
alternate = NULL;
|
alternate = NULL;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DWORD i, j;
|
DWORD i, j, infoStatus;
|
||||||
PCCERT_CONTEXT alternateIssuer = NULL;
|
PCCERT_CONTEXT alternateIssuer = NULL;
|
||||||
|
|
||||||
alternate = NULL;
|
alternate = NULL;
|
||||||
|
@ -902,7 +915,7 @@ static PCertificateChain CRYPT_BuildAlternateContextFromChain(
|
||||||
chain->context.rgpChain[i]->rgpElement[j + 1]->pCertContext);
|
chain->context.rgpChain[i]->rgpElement[j + 1]->pCertContext);
|
||||||
|
|
||||||
alternateIssuer = CRYPT_GetIssuer(prevIssuer->hCertStore,
|
alternateIssuer = CRYPT_GetIssuer(prevIssuer->hCertStore,
|
||||||
subject, prevIssuer);
|
subject, prevIssuer, &infoStatus);
|
||||||
}
|
}
|
||||||
if (alternateIssuer)
|
if (alternateIssuer)
|
||||||
{
|
{
|
||||||
|
@ -912,7 +925,7 @@ static PCertificateChain CRYPT_BuildAlternateContextFromChain(
|
||||||
if (alternate)
|
if (alternate)
|
||||||
{
|
{
|
||||||
BOOL ret = CRYPT_AddCertToSimpleChain(engine,
|
BOOL ret = CRYPT_AddCertToSimpleChain(engine,
|
||||||
alternate->context.rgpChain[i], alternateIssuer, 0);
|
alternate->context.rgpChain[i], alternateIssuer, infoStatus);
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue