6.1.4. Фаза подготовки к обработке (i+1)-го сертификата
Для готовности к обработке (i+1)-го сертификата, проводятся следующие операции по отношению к i-ому сертификату:
Если имеет место субполе «policyMappings» (отображения политик), то проверяем, что специфическое значение «anyPolicy» не представлено в виде последовательности «issuerDomainPolicy» или «subjectDomainPolicy».
Если имеет место субполе «policyMappings», то для каждой последовательности «issuerDomainPolicy» с идентификатором политики ID-P в субполе «policyMappings»:
Если переменная «policy_mapping» > 0, то для каждого узла в дереве «valid_policy_tree» глубиной i, в котором идентификатор политики ID-P указывает на приемлемую политику «valid_policy», устанавливаем в компоненте «expected_policy_set» совокупность значений «subjectDomainPolicy», которые определяются как эквиваленты ID-P с помощью субполя «policyMappings».
Если в дереве «valid_policy_tree» нет узла глубиной i, имеющего приемлемую политику «valid_policy» с идентификатором ID-P, но имеет место узел глубиной i, имеющий приемлемую политику «anyPolicy», то из этого узла формируется дочерний узел глубиной i-1 с приемлемой политикой «anyPolicy» следующим образом:
Установим компонент «valid_policy» в значение ID-P.
Установим компонент «qualifier_set» в значение совокупности определителей, указанной в политике «anyPolicy» из субполя «certificatePolicies» i-ого сертификата.
И установим компонент «expected_policy_set» в совокупность значений «subjectDomainPolicy», которые определяются как эквиваленты значения ID-P с помощью субполя «policyMappings».
Если переменная «policy_mapping» равна 0:
Удаляем каждый узел глубиной i в дереве «valid_policy_tree», в котором ID-P определяет приемлемую политику «valid_policy».
Если в дереве «valid_policy_tree» представлен узел глубиной i-1 или меньше без дочерних узлов, то данный узел удаляется. Повторяем эту операцию до тех пор, пока не будет узлов глубиной i-1 или меньше без дочерних узлов.
Присваиваем имя владельца сертификата переменной «working_issuer_name».
Присваиваем значение «subjectPublicKey» из сертификата переменной «working_public_key».
Если поле «subjectPublicKeyInfo» сертификата включает субполе «algorithm» с не нулевыми параметрами, то присваиваем эти параметры переменной «working_public_key_parameters».
Если же поле «subjectPublicKeyInfo» сертификата включает субполе «algorithm» с нулевыми параметрами или эти параметры просто отсутствуют, то сравниваем алгоритм для «subjectPublicKey» из сертификата с переменной «working_public_key_algorithm». Если алгоритм для «subjectPublicKey» из сертификата и переменная «working_public_key_algorithm» не совпадают, то устанавливаем переменную «working_public_key_algorithm» в нулевое значение.
Присваиваем значение алгоритма для «subjectPublicKey» из сертификата переменной «working_public_key_algorithm».
Если в сертификате представлено субполе «nameConstraints», то изменяем переменные состояния «permitted_subtrees» и «excluded_subtrees» следующим образом:
Если в сертификате представлена последовательность «permittedSubtrees», то устанавливаем переменную состояния «permitted_subtrees» в точку пересечения её предыдущего значения со значением, представленном в поле «Расширения». Если последовательность «permittedSubtrees» не содержит соответствующий формат имени, то переменная состояния «permitted_subtrees» остаётся неизменной для этого типа имён. Например, точкой пересечения имён «example.com» и «foo.example.com» является «foo.example.com.». А точкой пересечения имён «example.com» и «example.net» является пустое множество.
Если в сертификате представлена последовательность «excludedSubtrees», то устанавливаем переменную состояния «excluded_subtrees» в объединённую последовательность, состоящую из её предшествующего значения и значения, представленного в поле «Расширения». Если последовательность «excludedSubtrees» не включает соответствующего формата имён, то переменная состояния «excluded_subtrees» остаётся неизменной для этого типа имён. Например, объединённой последовательностью пространств имён «example.com» и «foo.example.com» является «example.com.». А объединённой последовательностью пространств имён «example.com» и «example.net» являются оба пространства имён.
Если i-ый сертификат не является само-изданным, то:
Если переменная «explicit_policy» ≠ 0, то уменьшаем переменную «explicit_policy» на единицу.
Если переменная «policy_mapping» ≠ 0, то уменьшаем переменную «policy_mapping» на единицу.
Если переменная «inhibit_anyPolicy» ≠ 0, то уменьшаем переменную «inhibit_anyPolicy» на единицу.
Если сертификат включает субполе «policyConstraints», то изменяем переменные состояния «explicit_policy» и «policy_mapping» следующим образом:
Если представлена последовательность «requireExplicitPolicy» и её значение меньше значения переменной «explicit_policy», то устанавливаем переменную «explicit_policy» в значение из последовательности «requireExplicitPolicy».
Если представлена последовательность «inhibitPolicyMapping» и её значение меньше значения переменной «policy_mapping», то устанавлива ем переменную «policy_mapping» в значение из последовательности «inhibitPolicyMapping».
Если сертификат включает субполе «inhibitAnyPolicy» и его значение меньше значения переменной «inhibit_anyPolicy», то устанавливаем переменную «inhibit_anyPolicy» в значение из субполя «inhibitAnyPolicy»;
Если i-ый сертификат является третьей версией сертификата, то проверяем, что в этом сертификате представлено субполе «basicConstraints», и что флаг «cA» установлен в значение «TRUE»; (Если i-ый сертификат является первой или второй версией сертификата, то прикладная система обязана, либо проверить, что i-ый сертификат является сертификатом УЦ, полученный автономным способом, либо удалить этот сертификат. Прикладные системы и ИТС, придерживающиеся этого стандарта, могут удалять все промежуточные сертификата между первой и второй версиями.)
Если сертификат не был само-изданным, то проверяем, что переменная «max_path_length» > 0, и уменьшаем значение переменной «max_path_length» на единицу.
Если сертификат включает последовательность «pathLenConstraint» и её значение меньше значения переменной «max_path_length», то устанавливаем переменную «max_path_length» в значение из последовательности «pathLenConstraint».
Если сертификат включает субполе «keyUsage», то проверяем, бит «keyCertSign» установлен.
Распознаём и обрабатываем любое другое критичное субполе в поле «Расширения», представленное в сертификате. Обрабатываем любое другое распознаваемое не критичное субполе в поле «Расширения», представленное в сертификате, и которое затрагивает обработку маршрута.
Если проверки a), k), l), n) или o) «провалились», то процедура прекращается, указывая на неисправность и соответствующую причину.
Если проверки a), k), l), n) или o) завершились успешно, то увеличивает на единицу индекс i и продолжаем основную обработку сертификата (6.1.3).