0

下面的模块有sKeyPkgAttrs (global) 和SKeyAttributes (local)。我想在这些中添加一些属性。如果一个属性存在于 sKeyPkgAttrs 中,那么它绝不能存在于 SKeyAttributes 中——反之亦然。

我的一些属性是可选的,一些必须出现在这个模块中。

问题:是否可以通过检查属性是否出现在上述其中之一中的方式来约束此模块,因此不能将其放入另一个中?如果一个属性出现了(当它必须是时)

例如

  • 我在 sKeyPkgAttrs 和 SKeyAttributes 中放置了相同的属性 - 全部作为 OPTIONAL
  • 约束“WITH COMPONENT”检查是否至少存在一个属性
  • 其他一些约束检查属性是否不重复
  • 其他一些约束检查是否必须存在属性
SymmetricKeyPackage ::= SEQUENCE {
   version           KeyPkgVersion DEFAULT v1,
   sKeyPkgAttrs  [0] SEQUENCE SIZE (1..MAX) OF Attribute
                                  {{ SKeyPkgAttributes }} OPTIONAL,
   sKeys             SymmetricKeys,
   ... }

 SymmetricKeys ::= SEQUENCE SIZE (1..MAX) OF OneSymmetricKey

 OneSymmetricKey ::= SEQUENCE {
   sKeyAttrs  SEQUENCE SIZE (1..MAX) OF Attribute
                                     {{ SKeyAttributes }} OPTIONAL,
   sKey       OCTET STRING OPTIONAL }
   ( WITH COMPONENTS { ..., sKeyAttrs PRESENT } |
     WITH COMPONENTS { ..., sKey PRESENT } )

 KeyPkgVersion ::= INTEGER  { v1(1) } ( v1, ... )

 SKeyPkgAttributes ATTRIBUTE ::= { ... }

 SKeyAttributes ATTRIBUTE ::= { ... }
4

1 回答 1

1

您需要对 SymmetricKeyPackage 本身施加约束。不幸的是,ASN.1 对我相信您正在寻找的那种唯一性检查没有约束。ASN.1 确实允许所谓的用户约束,如下所示:

SymmetricKeyPackage ::= SEQUENCE {
   version           KeyPkgVersion DEFAULT v1,
   sKeyPkgAttrs  [0] SEQUENCE SIZE (1..MAX) OF Attribute
                                  {{ SKeyPkgAttributes }} OPTIONAL,
   sKeys             SymmetricKeys,
   ... } (CONSTRAINED BY {-- comment describing constraint --})

一些 ASN.1 工具会忽略这个约束,但是一些 ASN.1 工具会创建一个函数存根,您可以在其中编写自己的代码来强制执行超出 ASN.1 约束的内置功能的这种约束符号。显然,您需要用您尝试施加的约束的完整描述替换 - 描述约束的注释。

于 2020-03-12T17:34:35.903 回答