6.1.5. Завершающая фаза
Для завершения обработки целевого сертификата, проводим следующие операции относительно n-го сертификата:
Если переменная «explicit_policy» ≠ 0, то уменьшаем переменную «explicit_policy» на единицу.
Если сертификат включает субполе «policyConstraints» и представлена последовательность «requireExplicitPolicy», имеющая нулевое значение, то устанавливаем переменную состояния «explicit_policy» в нулевое значение.
Присваиваем значение «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».
Распознаём и обрабатываем любое другое критичное субполе в поле «Расширения», представленное в n-ом сертификате. Обрабатываем любое другое распознаваемое не критичное субполе в поле «Расширения», представленное в n-ом сертификате, и которое затрагивает обработку маршрута.
Рассчитываем точку пересечения дерева «valid_policy_tree» и параметра «user-initial-policy-set» следующим образом:
Если дерево «valid_policy_tree» = 0, то точка пересечения = 0;
Если дерево «valid_policy_tree» ≠ 0 и параметр «user-initial-policy-set» имеет значение «any-policy», то точка пересечения является всё дерево «valid_policy_tree»;
Если дерево «valid_policy_tree» ≠ 0 и параметр «user-initial-policy-set» не имеет значение «any-policy», то рассчитываем точку пересечения дерева «valid_policy_tree» и параметра «user-initial-policy-set» следующим образом:
Определяем совокупность узлов, определяющих политики, чьи родительские узлы имеют переменные «valid_policy» со значением «anyPolicy». Это и есть совокупность «valid_policy_node_set».
Если компонент «valid_policy» любого узла из совокупности «valid_policy_node_set» не представлен в параметре «user-initial-policy-set» и не имеет значения «anyPolicy», то удаляем этот узел и все его дочерние узлы.
Если дерево «valid_policy_tree» включает узел глубиной n с компонентом «valid_policy», имеющим значение «anyPolicy», а параметр «user-initial-policy-set» не содержит значения «anyPolicy», то выполняем следующие операции:
Установим компонент «qualifier_set» узла глубиной n с компонентом «valid_policy», имеющим значение «anyPolicy», в значение P-Q.
Для каждого идентификатора P-OID в параметре «user-initialpolicy-set», который не является приемлемой политикой «valid_policy» узла в совокупности «valid_policy_node_set», формируем дочерний узел, у которого существует родительский узел глубиной n-1 с приемлемой политикой «valid_policy», содержащей значение «anyPolicy». Устанавливаем значения в дочернем узле следующем образом: установим «valid_policy» в P-OID, «qualifier_set» в P-Q, а «expected_policy_set» в {P-OID}.
Удаляем узел глубиной n с приемлемой политикой «valid_policy», содержащей значение «anyPolicy».
Если в дереве «valid_policy_tree» существует узел глубиной n-1 или меньше и без каких-либо дочерних узлов, то удаляем этот узел. Повторяем эту операцию до тех пор, пока не останется узлов глубиной n-1 или меньше и без каких-либо дочерних узлов.
Если, либо (1) значение переменной «explicit_policy» > 0, либо (2) дерево «valid_policy_tree» не нулевое (не пустое), то обработка маршрута завершилась успешно.
6.1.6. Выходные данные
Если обработка МС завершилась успешно, ПрПП завершается и отображается её результат, а также заключительные значения переменных величин «valid_policy_tree», «working_public_key», «working_public_key_algorithm» и «working_public_key_parameters».