Причина сравнения interim_reasons_mask и reason_mask в обработке CRL - PullRequest
1 голос
/ 27 июня 2019

In RFC5280 в 6.3.3.В разделе Обработка списка отзыва сертификатов есть шаг:

Убедитесь, что interim_reasons_mask включает в себя одну или несколько причин, которые не включены в маскупроверять.Когда я пытаюсь проверить сертификат с точкой распространения, указывающей на какой-либо URL-адрес, происходит сбой в DistributionPointFetcher: 591.reasonMasks имеет значение 9 true, поэтому я не понимаю, как можно пройти эту проверку, поскольку она была инициализирована и никогда не изменялась.

Обновление

Код, в котором маска масок причиныинициализировано: Ссылка

Код, в котором маска причин передается для обработки в DistributionPointFetcher: Ссылка

1 Ответ

1 голос
/ 27 июня 2019

reason_mask: Эта переменная содержит набор причин отзыва, поддерживаемых CRL и дельта-CRL, обработанными до сих пор.

interim_reasons_mask: Содержит набор причин отзыва, поддерживаемых CRL или дельта-CRL, которые в настоящее время обрабатываются.

Цель этой обработки, посколькуЯ могу сказать, это собрать CRL, чтобы поддержать как можно больше причин отзыва.Поэтому добавление текущего CRL в список будет затруднительно только в том случае, если он поддерживает какие-либо причины отзыва, которые не были поддержаны ни одним из предыдущих CRL.

Если ваш reasons_mask содержит все true, то предыдущие CRLохватил все причины отзыва, или один не дает конкретных причин отзыва, которые он поддерживает, заставляя установить специальное значение all-reasons (все флаги true), что означает, что не нужно объяснять дальнейшие причины отзыва, поэтому он непотрудитесь проверить дальше.


sun.security.provider.certpath.DistributionPointFetcher.java

...
// compute interim reasons mask
boolean[] interimReasonsMask = new boolean[9];
ReasonFlags reasons = null;
if (idpExt != null) {
    reasons = (ReasonFlags) idpExt.get(IssuingDistributionPointExtension.REASONS);
}

boolean[] pointReasonFlags = point.getReasonFlags();
if (reasons != null) {
    if (pointReasonFlags != null) {
        // set interim reasons mask to the intersection of
        // reasons in the DP and onlySomeReasons in the IDP
        boolean[] idpReasonFlags = reasons.getFlags();
        for (int i = 0; i < interimReasonsMask.length; i++) {
            interimReasonsMask[i] = (i < idpReasonFlags.length && idpReasonFlags[i])
                    && (i < pointReasonFlags.length && pointReasonFlags[i]);
        }
    } else {
        // set interim reasons mask to the value of
        // onlySomeReasons in the IDP (and clone it since we may
        // modify it)
        interimReasonsMask = reasons.getFlags().clone();
    }
} else if (idpExt == null || reasons == null) {
    if (pointReasonFlags != null) {
        // set interim reasons mask to the value of DP reasons
        interimReasonsMask = pointReasonFlags.clone();
    } else {
        // set interim reasons mask to the special value all-reasons
        Arrays.fill(interimReasonsMask, true);  // ### SEE HERE ###
    }
}

// verify that interim reasons mask includes one or more reasons
// not included in the reasons mask
boolean oneOrMore = false;
for (int i = 0; i < interimReasonsMask.length && !oneOrMore; i++) {
    if (interimReasonsMask[i] && !(i < reasonsMask.length && reasonsMask[i])) {
        oneOrMore = true;
    }
}
if (!oneOrMore) {
    return false;
}
...
...