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にならないのはなぜですか?
ENUMERATED
とINTEGER
はほとんど同じです(これらは異なるタグを使用するだけです)。一般的な考え方は、ENUMERATED
は可能な値の制限されたセット内の選択用であり、INTEGER
は少なくとも理論的には無期限に上昇する可能性のある値用です。
ここで、ENUMERATED
に対するCRLReasons
の使用は、hintであり、「他に理由はないはずです。他のプロトコルバージョン(おそらく他の多くのバージョン)が存在する可能性があります。
これは意図の宣言に過ぎず、決して強制されることはありません。 ASN.1のほとんどの正当化は、「その時点では良いアイデアのように見えた」ことを思い出してください。読みすぎないようにしてください。結局のところ、ASN.1は1980年代に至るまで、年に2桁しかない日付の形式を定義することに成功しました-明白な Y2Kの問題 。 。したがって、ENUMERATED
/INTEGER
双対性をASN.1の多数の癖の1つとして受け入れます(悪くはありません)。
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よりも重要であることがわかります。