1

PKCS#15にはCommonObjectAttributes、オブジェクトへのアクセスのルールを記述する構造があります。残念なことに、これは再帰的です。つまり、それ自体を含むことができます。

SecurityCondition ::= CHOICE {
    authId Identifier,
    not [0] SecurityCondition,
    and [1] SEQUENCE SIZE (2..pkcs15-ub-securityConditions) OF SecurityCondition,
    or  [2] SEQUENCE SIZE (2..pkcs15-ub-securityConditions) OF SecurityCondition,
    ... -- For future extensions
}

これをpyasn1でモデル化する方法に困惑しています。固定レベルの再帰を課して、それらを相互に依存させることができると思いますが、それは私の意見ではあまり魅力的な解決策ではありません。誰かがより良いアイデアを持っていますか?

アップデート

Ilya Etingofs のアプローチをテストするにはSecurityCondition、最初にの定義を除外して、次のようにしました。

 class SecurityCondition(univ.Choice):
    pass

securityConditionComponentType = namedtype.NamedTypes(
        namedtype.NamedType('authId', univ.OctetString().subtype(
            subtypeSpec=constraint.ValueSizeConstraint(0, univ.Integer(255)))
        ),
        namedtype.NamedType('not', SecurityCondition().subtype(
            implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0)
            )
        ),
        namedtype.NamedType('and', univ.SequenceOf(componentType=SecurityCondition).subtype(
            #implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 1),
            #subtypeSpec=constraint.ValueSizeConstraint(2, univ.Integer(255))
            )
        ),
        namedtype.NamedType('or', univ.SequenceOf(componentType=SecurityCondition).subtype(
            #implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 2),
            #subtypeSpec=constraint.ValueSizeConstraint(2, univ.Integer(255))
            )
        )
    )
SecurityCondition.componentType = securityConditionComponentType

使用例:

# Example usage
inner = univ.SequenceOf()
inner.setComponentByPosition(0, SecurityCondition().setComponentByName("authId", "\x02"))
inner.setComponentByPosition(1, SecurityCondition().setComponentByName("authId", "\x03"))

outer = univ.SequenceOf()
outer.setComponentByPosition(0, SecurityCondition().setComponentByName("authId", "\x01"))
outer.setComponentByPosition(1, SecurityCondition().setComponentByName("or", inner))

wrapper = SecurityCondition().setComponentByName("and", outer)

また、サブタイプの仕様や暗黙のタグが使用されていない場合は機能するようです:

>>> print wrapper.prettyPrint()
SecurityCondition:
 and=SequenceOf:
  SecurityCondition:
   authId=0x01
  SecurityCondition:
   or=SequenceOf:
    SecurityCondition:
     authId=0x02
    SecurityCondition:
     authId=0x03

SEQUENCE(2 elem)
    OCTET STRING(2 byte) 01
    SEQUENCE(2 elem)
        OCTET STRING(1 byte) 02
        OCTET STRING(1 byte) 03

implicitTagとがコメント解除されている場合subtypeSpec、エラー

PyAsn1Error: Component type error SequenceOf() vs
SequenceOf().setComponentByPosition(0, SecurityCondition().setComponentByPosition(0,
     OctetString(hexValue='02'))).setComponentByPosition(1,
     SecurityCondition().setComponentByPosition(0, OctetString(hexValue='03')))

発生します。偶然にも、固定数の再帰を試行した場合に発生するのと同じエラーです。

4

1 に答える 1