added ocsp_parse_single_response
This commit is contained in:
@@ -625,6 +625,84 @@ static response_status ocsp_parse_response(chunk_t blob, response_t * res)
|
|||||||
return rStatus;
|
return rStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* parse a single OCSP response
|
||||||
|
*/
|
||||||
|
static bool ocsp_parse_single_response(chunk_t blob, int level0, single_response_t *sres)
|
||||||
|
{
|
||||||
|
u_int level, extn_oid;
|
||||||
|
asn1_ctx_t ctx;
|
||||||
|
bool critical;
|
||||||
|
chunk_t object;
|
||||||
|
int objectID = 0;
|
||||||
|
|
||||||
|
asn1_init(&ctx, blob, level0, FALSE, FALSE);
|
||||||
|
|
||||||
|
while (objectID < SINGLE_RESPONSE_ROOF)
|
||||||
|
{
|
||||||
|
if (!extract_object(singleResponseObjects, &objectID, &object, &level, &ctx))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (objectID)
|
||||||
|
{
|
||||||
|
case SINGLE_RESPONSE_ALGORITHM:
|
||||||
|
sres->hash_algorithm = parse_algorithmIdentifier(object, level+1, NULL);
|
||||||
|
break;
|
||||||
|
case SINGLE_RESPONSE_ISSUER_NAME_HASH:
|
||||||
|
sres->issuer_name_hash = object;
|
||||||
|
break;
|
||||||
|
case SINGLE_RESPONSE_ISSUER_KEY_HASH:
|
||||||
|
sres->issuer_key_hash = object;
|
||||||
|
break;
|
||||||
|
case SINGLE_RESPONSE_SERIAL_NUMBER:
|
||||||
|
sres->serialNumber = object;
|
||||||
|
break;
|
||||||
|
case SINGLE_RESPONSE_CERT_STATUS_GOOD:
|
||||||
|
sres->status = CERT_GOOD;
|
||||||
|
break;
|
||||||
|
case SINGLE_RESPONSE_CERT_STATUS_REVOKED:
|
||||||
|
sres->status = CERT_REVOKED;
|
||||||
|
break;
|
||||||
|
case SINGLE_RESPONSE_CERT_STATUS_REVOCATION_TIME:
|
||||||
|
sres->revocationTime = asn1totime(&object, ASN1_GENERALIZEDTIME);
|
||||||
|
break;
|
||||||
|
case SINGLE_RESPONSE_CERT_STATUS_CRL_REASON:
|
||||||
|
sres->revocationReason = (object.len == 1)
|
||||||
|
? *object.ptr : REASON_UNSPECIFIED;
|
||||||
|
break;
|
||||||
|
case SINGLE_RESPONSE_CERT_STATUS_UNKNOWN:
|
||||||
|
sres->status = CERT_UNKNOWN;
|
||||||
|
break;
|
||||||
|
case SINGLE_RESPONSE_THIS_UPDATE:
|
||||||
|
sres->thisUpdate = asn1totime(&object, ASN1_GENERALIZEDTIME);
|
||||||
|
break;
|
||||||
|
case SINGLE_RESPONSE_NEXT_UPDATE:
|
||||||
|
sres->nextUpdate = asn1totime(&object, ASN1_GENERALIZEDTIME);
|
||||||
|
break;
|
||||||
|
case SINGLE_RESPONSE_EXT_ID:
|
||||||
|
extn_oid = known_oid(object);
|
||||||
|
break;
|
||||||
|
case SINGLE_RESPONSE_CRITICAL:
|
||||||
|
critical = object.len && *object.ptr;
|
||||||
|
DBG2(" %s", critical ? "TRUE" : "FALSE");
|
||||||
|
case SINGLE_RESPONSE_EXT_VALUE:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
objectID++;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* process received ocsp single response and add it to ocsp cache
|
||||||
|
*/
|
||||||
|
static void process_single_response(private_ocsp_t *this, single_response_t *sres)
|
||||||
|
{
|
||||||
|
/* TODO */
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* verify and process ocsp response and update the ocsp cache
|
* verify and process ocsp response and update the ocsp cache
|
||||||
*/
|
*/
|
||||||
@@ -681,7 +759,7 @@ void ocsp_process_response(private_ocsp_t *this, chunk_t reply)
|
|||||||
{
|
{
|
||||||
single_response_t sres = empty_single_response;
|
single_response_t sres = empty_single_response;
|
||||||
|
|
||||||
if (parse_ocsp_single_response(object, level+1, &sres))
|
if (ocsp_parse_single_response(object, level+1, &sres))
|
||||||
{
|
{
|
||||||
process_single_response(this, &sres);
|
process_single_response(this, &sres);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user