Ограничение подтипа для типа OBJECT IDENTIFIER: как ограничить OID некоторой дугой?

Я пишу спецификацию в ASN.1. Каков формально правильный синтаксис для ограничения диапазона значений атрибута с типом OBJECT IDENTIFIER определенной дугой OID? Например. Я хотел бы добиться чего-то вроде

foo OBJECT IDENTIFIER ( BELOW SUBTREE { 2 1 1 } )

Ключевое слово BELOW SUBTREE было придумано мной для примера, чтобы было понятно, что я ищу.

Проработанный пример

По-видимому, мой вопрос выше недостаточно ясен, поскольку некоторые ответы предлагают решения, которые не решают проблему. Я немного подробнее расскажу о том, что я делаю и чего хочу достичь. Я пишу политику сертификатов X.509 и должен указать профиль X.509 в главе 7. Это означает, что я должен обосновать некоторые варианты или степени свободы, которые существуют в общем синтаксисе для области применения моего приложения. В частности, я не могу и не должен изменять какие-либо типы атрибутов, потому что это сделало бы результат несовместимым с сертификатом X.509, т. е. я могу специализировать только некоторые типы, пока специализация остается совместимой с обобщением.

Идентификаторы объектов повсеместно используются в X.509.

В качестве наглядного примера возьмем атрибут policyIdentifier, тип которого является псевдонимом OBJECT IDENTIFIER в объекте типа PolicyInformation в расширении сертификата CertificatePolicies.

CertificatePolicies ::= SEQUENCE SIZE (1) OF PolicyInformation

PolicyInformation ::= SEQUENCE {
  policyIdentifier   CertPolicyId,
}

CertPolicyId ::= OBJECT IDENTIFIER

(Я уже сократил синтаксис ASN.1 для нужд моего приложения.)

Предположим, я определил следующие константы

id-cp-my-policies OBJECT IDENTIFIER -- some OID arc in the private enterprise arc under my control
id-cp-my-policy-v10 OBJECT IDENTIFIER ::= { id-cp-my-policies 1 0 }
id-cp-my-policy-v11 OBJECT IDENTIFIER ::= { id-cp-my-policies 1 1 }
id-cp-my-policy-v12 OBJECT IDENTIFIER ::= { id-cp-my-policies 1 2 }
id-cp-my-policy-v20 OBJECT IDENTIFIER ::= { id-cp-my-policies 2 0 }
id-cp-my-policy-v30 OBJECT IDENTIFIER ::= { id-cp-my-policies 3 0 }
id-cp-my-policy-v31 OBJECT IDENTIFIER ::= { id-cp-my-policies 3 1 }

Я хочу подчеркнуть, что CertPolicyId является специализацией OBJECT IDENTIFIER, которая может принимать значения только из списка выше. Конечно, я мог бы явно перечислить все идентификаторы политик с помощью синтаксиса "ИЛИ", т.е. я мог бы написать

CertPolicyId ::= OBJECT IDENTIFIER ( id-cp-my-policy-v10 | id-cp-my-policy-v11 | id-cp-my-policy-v12 | id-cp-my-policy-v20 | id-cp-my-policy-v30 | id-cp-my-policy-v31 )

Однако это не кажется очень перспективным. Вместо этого я хотел бы написать что-то вроде

CertPolicyId ::= OBJECT IDENTIFIER ( BELOW SUBTREE id-cp-my-policies )

Я надеюсь, что этот пример поможет понять, что я хочу сделать.


person user2690527    schedule 25.03.2020    source источник


Ответы (3)


Не существует формального способа ограничить тип OBJECT IDENTIFIER попаданием в определенную дугу.

person Kevin    schedule 25.03.2020
comment
Действительно? :-( Жаль. Я подожду, если кто-нибудь придумает решение и докажет, что ваш ответ неверен. Если нет, я в конечном итоге приму этот ответ, хотя это не то, на что я надеялся. - person user2690527; 25.03.2020
comment
Ответ Кевина правильный. В ASN.1 нет ограничений, ограничивающих значения типа идентификатора объекта, чтобы они начинались с указанной серии целых чисел. - person Alessandro; 26.03.2020

Вы можете использовать тип RELATIVE-OID

Вы можете либо сделать корневой oid неявным (скажем, foo является компонентом ПОСЛЕДОВАТЕЛЬНОСТИ)

{
  foo RELATIVE-OID  -- relative to root { 2 1 1 }
}

или явный

{ 
   foo SEQUENCE {
      root OBJECT IDENTIFIER DEFAULT { 2 1 1 },
      object-id RELATIVE-OID  -- relative to root
   }
}
person YaFred    schedule 25.03.2020
comment
Не могли бы вы дать ссылку на спецификации, определяющие тип RELATIVE-OID? Я не слышал об этом раньше. - person user2690527; 26.03.2020
comment
Это определено в TREC X.680 (itu .int/rec/T-REC-X.680-X.693-201508-I). - person YaFred; 26.03.2020
comment
Прочитав характеристики, я понял, что это не то, что мне нужно. RELATIVE-OID — это всего лишь механизм для уменьшения размера сообщения путем передачи только конца OID при условии, что общий префикс понятен и используется всеми партнерами по обмену данными. Общий префикс каким-то образом определяется верхними уровнями приложения и может быть отмечен комментарием в ASN.1. Однако мне нужно передать весь OID, а не только его часть, но я хочу выразить, что OID должен встречаться с конкретной дуги. - person user2690527; 26.03.2020
comment
После того, как вы отредактировали вопрос, я думаю, что ответ @Kevin правильный ... - person YaFred; 26.03.2020
comment
Обычно предлагается указать ограничение (в вашем собственном формате или в тексте на английском языке) в пользовательском ограничении. Например: O ::= ОБЪЕКТНЫЙ ИДЕНТИФИКАТОР (ОГРАНИЧЕН {--ниже дуги-- ОБЪЕКТНЫЙ ИДЕНТИФИКАТОР: {0 1 2 3}}) Очевидно, указанное выше ограничение не может применяться автоматически, если инструмент ASN.1 не поддерживает пользовательские обратные вызовы для пользователя. -определенные ограничения. - person Alessandro; 26.03.2020

Вы можете использовать этот подход:

foo OBJECT IDENTIFIER ::= { 1 2 3 }
foo-bar OBJECT IDENTIFIER ::= { foo 4 }

таким образом, foo-bar приведет к значению OID 1.2.3.4 в точечной нотации. Это то, что вы ищите?

person Crypt32    schedule 25.03.2020
comment
Это способ определения значений, а не типов. Кажется, он хочет определить тип. - person Kevin; 25.03.2020
comment
Нет, это не то, что я ищу. Я знаю, как определить значение (или константу). Как правильно сказал @Kevin, я хочу определить ограниченный тип, который обеспечивает, чтобы атрибут принимал только OID ниже определенной дуги. - person user2690527; 25.03.2020