static void crl_akid_check(X509_STORE_CTX *ctx, X509_CRL *crl,
                           X509 **pissuer, int *pcrl_score)
{
    X509 *crl_issuer = NULL;
    X509_NAME *cnm = X509_CRL_get_issuer(crl);
    int cidx = ctx->error_depth;
    int i;
    if (cidx != sk_X509_num(ctx->chain) - 1)
        cidx++;
    crl_issuer = sk_X509_value(ctx->chain, cidx);
    if (X509_check_akid(crl_issuer, crl->akid) == X509_V_OK) {
        if (*pcrl_score & CRL_SCORE_ISSUER_NAME) {
            *pcrl_score |= CRL_SCORE_AKID | CRL_SCORE_ISSUER_CERT;
            *pissuer = crl_issuer;
            return;
        }
    }
    for (cidx++; cidx < sk_X509_num(ctx->chain); cidx++) {
        crl_issuer = sk_X509_value(ctx->chain, cidx);
        if (X509_NAME_cmp(X509_get_subject_name(crl_issuer), cnm))
            continue;
        if (X509_check_akid(crl_issuer, crl->akid) == X509_V_OK) {
            *pcrl_score |= CRL_SCORE_AKID | CRL_SCORE_SAME_PATH;
            *pissuer = crl_issuer;
            return;
        }
    }
    if (!(ctx->param->flags & X509_V_FLAG_EXTENDED_CRL_SUPPORT))
        return;
    for (i = 0; i < sk_X509_num(ctx->untrusted); i++) {
        crl_issuer = sk_X509_value(ctx->untrusted, i);
        if (X509_NAME_cmp(X509_get_subject_name(crl_issuer), cnm))
            continue;
        if (X509_check_akid(crl_issuer, crl->akid) == X509_V_OK) {
            *pissuer = crl_issuer;
            *pcrl_score |= CRL_SCORE_AKID;
            return;
        }
    }
}
['static void crl_akid_check(X509_STORE_CTX *ctx, X509_CRL *crl,\n                           X509 **pissuer, int *pcrl_score)\n{\n    X509 *crl_issuer = NULL;\n    X509_NAME *cnm = X509_CRL_get_issuer(crl);\n    int cidx = ctx->error_depth;\n    int i;\n    if (cidx != sk_X509_num(ctx->chain) - 1)\n        cidx++;\n    crl_issuer = sk_X509_value(ctx->chain, cidx);\n    if (X509_check_akid(crl_issuer, crl->akid) == X509_V_OK) {\n        if (*pcrl_score & CRL_SCORE_ISSUER_NAME) {\n            *pcrl_score |= CRL_SCORE_AKID | CRL_SCORE_ISSUER_CERT;\n            *pissuer = crl_issuer;\n            return;\n        }\n    }\n    for (cidx++; cidx < sk_X509_num(ctx->chain); cidx++) {\n        crl_issuer = sk_X509_value(ctx->chain, cidx);\n        if (X509_NAME_cmp(X509_get_subject_name(crl_issuer), cnm))\n            continue;\n        if (X509_check_akid(crl_issuer, crl->akid) == X509_V_OK) {\n            *pcrl_score |= CRL_SCORE_AKID | CRL_SCORE_SAME_PATH;\n            *pissuer = crl_issuer;\n            return;\n        }\n    }\n    if (!(ctx->param->flags & X509_V_FLAG_EXTENDED_CRL_SUPPORT))\n        return;\n    for (i = 0; i < sk_X509_num(ctx->untrusted); i++) {\n        crl_issuer = sk_X509_value(ctx->untrusted, i);\n        if (X509_NAME_cmp(X509_get_subject_name(crl_issuer), cnm))\n            continue;\n        if (X509_check_akid(crl_issuer, crl->akid) == X509_V_OK) {\n            *pissuer = crl_issuer;\n            *pcrl_score |= CRL_SCORE_AKID;\n            return;\n        }\n    }\n}', 'X509_NAME *X509_CRL_get_issuer(X509_CRL *crl)\n{\n    return crl->crl.issuer;\n}', 'DEFINE_STACK_OF(X509)', 'int sk_num(const _STACK *st)\n{\n    if (st == NULL)\n        return -1;\n    return st->num;\n}', 'void *sk_value(const _STACK *st, int i)\n{\n    if (!st || (i < 0) || (i >= st->num))\n        return NULL;\n    return st->data[i];\n}', 'int X509_check_akid(X509 *issuer, AUTHORITY_KEYID *akid)\n{\n    if (!akid)\n        return X509_V_OK;\n    if (akid->keyid && issuer->skid &&\n        ASN1_OCTET_STRING_cmp(akid->keyid, issuer->skid))\n        return X509_V_ERR_AKID_SKID_MISMATCH;\n    if (akid->serial &&\n        ASN1_INTEGER_cmp(X509_get_serialNumber(issuer), akid->serial))\n        return X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH;\n    if (akid->issuer) {\n        GENERAL_NAMES *gens;\n        GENERAL_NAME *gen;\n        X509_NAME *nm = NULL;\n        int i;\n        gens = akid->issuer;\n        for (i = 0; i < sk_GENERAL_NAME_num(gens); i++) {\n            gen = sk_GENERAL_NAME_value(gens, i);\n            if (gen->type == GEN_DIRNAME) {\n                nm = gen->d.dirn;\n                break;\n            }\n        }\n        if (nm && X509_NAME_cmp(nm, X509_get_issuer_name(issuer)))\n            return X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH;\n    }\n    return X509_V_OK;\n}', 'X509_NAME *X509_get_subject_name(X509 *a)\n{\n    return (a->cert_info.subject);\n}']