crypt32: Set subject's info status from method used to find issuer.

This commit is contained in:
Juan Lang 2007-09-11 12:48:54 -07:00 committed by Alexandre Julliard
parent 54428bfb99
commit a5833ac9f4
1 changed files with 20 additions and 7 deletions

View File

@ -508,7 +508,8 @@ static void CRYPT_CheckSimpleChain(PCertificateChainEngine engine,
}
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);
}
/* 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,
PCCERT_CONTEXT prevIssuer)
PCCERT_CONTEXT prevIssuer, DWORD *infoStatus)
{
PCCERT_CONTEXT issuer = NULL;
PCERT_EXTENSION ext;
DWORD size;
*infoStatus = 0;
if ((ext = CertFindExtension(szOID_AUTHORITY_KEY_IDENTIFIER,
subject->pCertInfo->cExtension, subject->pCertInfo->rgExtension)))
{
@ -546,6 +548,8 @@ static PCCERT_CONTEXT CRYPT_GetIssuer(HCERTSTORE store, PCCERT_CONTEXT subject,
issuer = CertFindCertificateInStore(store,
subject->dwCertEncodingType, 0, CERT_FIND_CERT_ID, &id,
prevIssuer);
if (issuer)
*infoStatus = CERT_TRUST_HAS_EXACT_MATCH_ISSUER;
}
else if (info->KeyId.cbData)
{
@ -554,6 +558,8 @@ static PCCERT_CONTEXT CRYPT_GetIssuer(HCERTSTORE store, PCCERT_CONTEXT subject,
issuer = CertFindCertificateInStore(store,
subject->dwCertEncodingType, 0, CERT_FIND_CERT_ID, &id,
prevIssuer);
if (issuer)
*infoStatus = CERT_TRUST_HAS_KEY_MATCH_ISSUER;
}
LocalFree(info);
}
@ -595,6 +601,8 @@ static PCCERT_CONTEXT CRYPT_GetIssuer(HCERTSTORE store, PCCERT_CONTEXT subject,
issuer = CertFindCertificateInStore(store,
subject->dwCertEncodingType, 0, CERT_FIND_CERT_ID, &id,
prevIssuer);
if (issuer)
*infoStatus = CERT_TRUST_HAS_EXACT_MATCH_ISSUER;
}
else
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,
subject->dwCertEncodingType, 0, CERT_FIND_CERT_ID, &id,
prevIssuer);
if (issuer)
*infoStatus = CERT_TRUST_HAS_KEY_MATCH_ISSUER;
}
LocalFree(info);
}
@ -615,6 +625,8 @@ static PCCERT_CONTEXT CRYPT_GetIssuer(HCERTSTORE store, PCCERT_CONTEXT subject,
issuer = CertFindCertificateInStore(store,
subject->dwCertEncodingType, 0, CERT_FIND_SUBJECT_NAME,
&subject->pCertInfo->Issuer, prevIssuer);
if (issuer)
*infoStatus = CERT_TRUST_HAS_NAME_MATCH_ISSUER;
}
return issuer;
}
@ -631,11 +643,12 @@ static BOOL CRYPT_BuildSimpleChain(PCertificateChainEngine engine,
while (ret && !CRYPT_IsSimpleChainCyclic(chain) &&
!CRYPT_IsCertificateSelfSigned(cert))
{
PCCERT_CONTEXT issuer = CRYPT_GetIssuer(world, cert, NULL);
DWORD infoStatus;
PCCERT_CONTEXT issuer = CRYPT_GetIssuer(world, cert, NULL, &infoStatus);
if (issuer)
{
ret = CRYPT_AddCertToSimpleChain(engine, chain, issuer, 0);
ret = CRYPT_AddCertToSimpleChain(engine, chain, issuer, infoStatus);
cert = issuer;
}
else
@ -888,7 +901,7 @@ static PCertificateChain CRYPT_BuildAlternateContextFromChain(
alternate = NULL;
else
{
DWORD i, j;
DWORD i, j, infoStatus;
PCCERT_CONTEXT alternateIssuer = NULL;
alternate = NULL;
@ -902,7 +915,7 @@ static PCertificateChain CRYPT_BuildAlternateContextFromChain(
chain->context.rgpChain[i]->rgpElement[j + 1]->pCertContext);
alternateIssuer = CRYPT_GetIssuer(prevIssuer->hCertStore,
subject, prevIssuer);
subject, prevIssuer, &infoStatus);
}
if (alternateIssuer)
{
@ -912,7 +925,7 @@ static PCertificateChain CRYPT_BuildAlternateContextFromChain(
if (alternate)
{
BOOL ret = CRYPT_AddCertToSimpleChain(engine,
alternate->context.rgpChain[i], alternateIssuer, 0);
alternate->context.rgpChain[i], alternateIssuer, infoStatus);
if (ret)
{