Ограничение подтипа для типа ИДЕНТИФИКАТОРА ОБЪЕКТА: Как ограничить OID некоторым ar c? - PullRequest
0 голосов
/ 25 марта 2020

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

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

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

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

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

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

В качестве осязаемого примера возьмем атрибут policyIdentifier, тип которого является псевдонимом OBJECT IDENTIFIER в объекте типа PolicyInformation в сертификате extention 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 }

Я хочу express, чтобы CertPolicyId - это специализация OBJECT IDENTIFIER, которая может принимать значения только из приведенного выше списка. Конечно, я мог бы явно перечислить все идентификаторы политики по «OR» -синтаксису, то есть я мог бы написать

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 )

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

Ответы [ 3 ]

4 голосов
/ 25 марта 2020

Не существует формального способа ограничить тип ИДЕНТИФИКАТОРА ОБЪЕКТА тем, что он попадает под определенное ar c.

1 голос
/ 25 марта 2020

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

Вы можете сделать oid root неявным (скажем, foo является компонентом SEQUENCE)

{
  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
   }
}
0 голосов
/ 25 марта 2020

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

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

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

...