in jvm/src/main/kotlin/com/jetbrains/signatureverifier/crypt/OcspVerifier.kt [53:108]
suspend fun CheckCertificateRevocationStatusAsync(
@NotNull targetCert: X509CertificateHolder,
@NotNull issuerCert: X509CertificateHolder
): VerifySignatureResult {
val ocspUrl = targetCert.GetOcspUrl()
if (ocspUrl == null) {
_logger.Warning("The OCSP access data is empty in certificate ${targetCert.FormatId()}")
_logger.Error(Messages.unable_determin_certificate_revocation_status)
return VerifySignatureResult.InvalidChain(Messages.unable_determin_certificate_revocation_status)
}
val ocspReqGenerator = OCSPReqBuilder()
val digestCalculatorProvider = org.bouncycastle.operator.jcajce.JcaDigestCalculatorProviderBuilder().build()
val digestCalculator = digestCalculatorProvider.get(AlgorithmIdentifier(OIWObjectIdentifiers.idSHA1))
val certificateIdReq = CertificateID(digestCalculator, issuerCert, targetCert.serialNumber)
ocspReqGenerator.addRequest(certificateIdReq)
val ocspReq = ocspReqGenerator.build()
val ocspRes = getOcspResponceAsync(ocspUrl, ocspReq, _ocspResponseTimeout)
if (ocspRes == null || ocspRes.status != OCSPResp.SUCCESSFUL) {
_logger.Error("OCSP response status: ${ocspRes?.status}")
return VerifySignatureResult.InvalidChain(Messages.unable_determin_certificate_revocation_status)
}
val basicOcspResp = ocspRes.responseObject as BasicOCSPResp
if (basicOcspResp == null) {
_logger.Error("Unknown OCSP response type")
return VerifySignatureResult.InvalidChain(Messages.unable_determin_certificate_revocation_status)
}
if (!validateOcspResponse(basicOcspResp))
return VerifySignatureResult.InvalidChain(Messages.invalid_ocsp_response)
val singleResponses = basicOcspResp.responses.filter { w -> w.certID.equals(certificateIdReq) }.toList()
if (singleResponses.count() < 1) {
_logger.Error("OCSP response not correspond to request")
return VerifySignatureResult.InvalidChain(Messages.invalid_ocsp_response)
}
for (singleResp in singleResponses) {
if (!validateSingleOcspResponse(singleResp))
return VerifySignatureResult.InvalidChain(Messages.invalid_ocsp_response)
val certStatus = singleResp.certStatus
//null is good
if (certStatus == null) {
continue
} else if (certStatus is UnknownStatus) {
_logger.Warning(Messages.unknown_certificate_revocation_status)
return VerifySignatureResult.InvalidChain(Messages.unknown_certificate_revocation_status)
} else if (certStatus is RevokedStatus) {
val certRevStatus = certStatus
val msg = formatRevokedStatus(certRevStatus)
_logger.Warning(msg)
return VerifySignatureResult.InvalidChain(msg)
}
}
return VerifySignatureResult.Valid
}