web-dev-qa-db-ja.com

ASN.1:ENUMERATED vs INTEGER

X.509仕様から:

   CRLReason ::= ENUMERATED {
        unspecified             (0),
        keyCompromise           (1),
        cACompromise            (2),
        affiliationChanged      (3),
        superseded              (4),
        cessationOfOperation    (5),
        certificateHold         (6),
             -- value 7 is not used
        removeFromCRL           (8),
        privilegeWithdrawn      (9),
        aACompromise           (10) }

...そして...

Version  ::=  INTEGER  {  v1(0), v2(1), v3(2)  }

バージョンが列挙型ではないのはなぜですか?同様に、CRLReasonがINTEGERにならないのはなぜですか?

8
ansur

ENUMERATEDINTEGERはほとんど同じです(これらは異なるタグを使用するだけです)。一般的な考え方は、ENUMERATEDは可能な値の制限されたセット内の選択用であり、INTEGERは少なくとも理論的には無期限に上昇する可能性のある値用です。

ここで、ENUMERATEDに対するCRLReasonsの使用は、hintであり、「他に理由はないはずです。他のプロトコルバージョン(おそらく他の多くのバージョン)が存在する可能性があります。

これは意図の宣言に過ぎず、決して強制されることはありません。 ASN.1のほとんどの正当化は、「その時点では良いアイデアのように見えた」ことを思い出してください。読みすぎないようにしてください。結局のところ、ASN.1は1980年代に至るまで、年に2桁しかない日付の形式を定義することに成功しました-明白な Y2Kの問題 。 。したがって、ENUMERATED/INTEGER双対性をASN.1の多数の癖の1つとして受け入れます(悪くはありません)。

5
Thomas Pornin

ENUMERATEDとINTEGERは目的が異なります。 ENUMERATEDは名前付きアイテムのリストを作成するためのもので、INTEGERは数字を運ぶためのものです。型表記が多少似ているという事実は、それらを同一にするものではありません。 ENUMERATEDの場合、許可される値は、リストで指定されているものだけです。 INTEGERの場合、名前付きリストは特定の数値の便利なラベルのセットにすぎず、INTEGERタイプに許可される値を制限しません。

CRLReasonがENUMERATEDにされたのは、VersionがINTEGERにされて将来のバージョンの数が制限されないままにされている間に閉じた値のセットが存在するためです。

http://asn1-playground.oss.com でこれらの仕様の一部を試してみてください。これは、BERおよびDERだけでなく、BERとDERもサポートするオンラインASN.1コンパイラーおよびエンコーダー/デコーダーです。 PER、XER、CER。 ENUMERATEDとINTEGERの違いは、他のエンコーディングルール(PERやXERなど)の方がBERやDERよりも重要であることがわかります。

5
Paul Thorpe