2013年1月27日日曜日

データ型 - 部分型

部分型は、他に定義されたASN.1データ型を利用して、取りうる値の範囲を制限することによって新たな型として定義します。制限を行う方法は、以下の6種類の方法があります。



上記の制限の方法は、データ型により適用できる方法が限られます。以下の表は、データ型と制限の方法の適用関係を表わしています。


型の記法

  部分型 ::= 親の型 部分型仕様
  部分型仕様 ::= ( 部分型値集合 部分型値集合リスト )
  部分型値集合リスト ::= 部分型値集合 | 部分型値集合 “|” 部分型値集合リスト | empty
  部分型値集合 ::= 単一値 | 包含部分型 | 値域 | 許容アルファベット | サイズ制限 | 内部部分型化

部分型を定義する場合、親の型とそれに対する制約条件を示す部分型仕様を指定します。
親の型が整数型とする部分型は、以下のように定義されます。
整数版部分型 ::= INTEGER 部分型仕様

親の型が集合型、順序型場合、上記の表現では、記法があいまいとなるため、以下のように定義します。
集合版部分型 ::= SET サイズ制限 OF 親の型
順序版部分型 ::= SEQUENCE サイズ制限 OF 親の型





2013年1月19日土曜日

データ型 - 外部型

外部型は、ASN.1を使用してモデル化することが出来ないデータ型に対して、適切な記述言語を使い、外部型として宣言する場合に用います。外部型は、以下のように定義されます。


EXTERNAL ::= [UNIVAERSAL 8] IMPLICIT SEQUENCE {
  direct-reference         OBJCET IDENTIFIER OPTIONAL, --直接参照
  indirect-referince        INTEGER OPTIONAL,           --間接参照
  data-value-description ObjectDescriptor OPTIONAL, --データ値記述子
  encoding CHOICE {
    single-ASN1-type  [0] ANY,
    octet-aligned        [1] IMPLICIT OCTET STRING,
    arbitary               [2] IMPLICIT BIT STRING
  }
}

型の記法
  外部型 ::= EXTERNAL

値の記法
  上記の外部型の定義に対応する値の記法になります。

2013年1月14日月曜日

データ型 - 任意型


任意型は、ASN.1で定義可能なすべてのデータ型の共用体として定義されるデータ型です。
任意型に対して、暗示的タグ付けをしてはいけません。そうした場合、想定されるデータ型のなかでどれに対応するものなのか、識別できなくなってしまうからです。

型の記法
  任意型 ::= ANY | ANY DEFINED BY 識別子

型の例
  AttributeValue ::= ANY

ANYを使用する場合は、仕様を捕捉しないかぎり、その仕様は不完全なものになります。

 AlgorithmIdentifier ::= SEQUENCE {
    algorithm    OBJECT IDENTIFIER,
    parameters ANY DEFIND BY algorithm OPTIONAL}
  http://www.ietf.org/rfc/rfc3280.txt

識別子により、任意型のなかに入れることができるデータ型を規定する手段を提供します。
上記の例では、任意型をとるparametersを宣言していて、ここでとりうる有効なデータ型が、alogrithmの値により、さらに詳細に規定されることを表しています。

値の記法
  任意値 ::= 型 値

値の例

  MessageContents ::= ANY
  myMessage MessageContents ::= PrintableString “Hello World”

2013年1月12日土曜日

データ型 - 参照選択型


参照選択型は、選択型内に定義されている候補のデータ型から選択するときに使用します。

型の記法
  参照選択型 ::= 識別子 < 型

型の例

ファイル属性(FileAttribute)を以下のように定義します。
FileAttribute ::= CHOICE {
  data-last-used INTEGER,
  file-name      VisibleString}


上記の参照型から参照選択型を使用して、次のような新たな属性(CurrentAttributes)を定義することができます。
CurrentAttributes ::= SEQUENCE {
  data-last-used < FileAttribute,
  file-name      < FileAttribute}

値の記法
  参照選択値 ::= 識別子 値

値の例

currentValue CurrentAttributes ::=  {
  data-last-used 27, 
  file-name      "PROGRAM"}


データ型 - 選択型


状況によってデータ型を切り替えたい場合、選択型を使うことができます。選択型は、1つ以上のデータ型の共有体として定義するデータ型です。選択型は共有体の構成要素のどれか一つが選択されるようなデータ型を表わします。
選択型のデータはいくつかの候補要素のなかから一つが選択されるため、選択されたものがどの候補要素であったのかを分かるようにしておく必要があります。このため、例えば同じデータ型の候補要素がある場合には、明示的なタグ付けにより識別可能にしておく必要があります。
また、選択型に対して、暗示的タグ付けをしてはいけません。

型の記法

  選択型 ::= CHOICE  { 代替型リスト } 
  代替型リスト ::= 名前付き型 | 代替型リスト , 名前付き型
  名前付き型 ::= 識別子 型 | 型 | 参照選択型

型の例

CertificateChoices ::= CHOICE {
    certificate Certificate,                    -- See X.509
    extendedCertificate [0] IMPLICIT ExtendedCertificate,  -- Obsolete
    attrCert              [1] IMPLICIT AttributeCertificate } -- See X.509 and X9.57

値の記法
  名前付き値 ::= 識別子 : 値

値の例

FileIdentifier ::= CHOICE {
  relativeName [0] IMPLICIT VisibleString,
  absoluteName [1] IMPLICIT VisibileString,
  serialNumber [2] IMPLICIT INTEGER }
myFile FileIdentifier ::= relativeName:”ASN1”


2013年1月4日金曜日

データ型 - タグ型

集合型のような構造型のデータ型から分かるように、同じASN.1型のデータを識別する手段が必要です。タグ型は既存のデータ型の構文を利用して、そのデータ型に新たなタグを付与します。汎用のクラスのタグ型は、アプリケーションに依存しない汎用的なデータ型を定義し、タグの指定は、[UNIVERSAL タグ番号]のように行います。
また、キーワードのIMPLICITとEXPLICITを使うことにより、既存のデータ型を置き換えるか否かを指定することもできます。


型の記法
  タグ型 ::= タグ 型 | タグ IMPLICIT 型 | タグ EXPLICIT 型
  タグ ::= [ クラス タグ番号 ]
  タグ番号 ::= 整数 | 定義値
  クラス ::= UNIVERSAL | APPLICATION | PRIVATE | empty 


タグ型で、 タグ 型 を指定した場合、モジュールのタグデフォルトで指定したキーワードと同じ振る舞いになります。モジュールでタグデフォルトが指定されていない場合は、タグ EXPLICIT 型 と同じ意味になります。

クラスは4種類のクラスに対応して、それぞれ以下のキーワードに対応します。


型の例
Accuracy ::= SEQUENCE {
  seconds        INTEGER           OPTIONAL,
  millis      [0] INTEGER  (1..999) OPTIONAL,
  micros     [1] INTEGER  (1..999) OPTIONAL }

ContentInfo ::= SEQUENCE {
     contentType              ContentType,
     content     [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL }


値の記法
  タグ値 ::=

値の例
A ::= [PRIVATE 1] EXPLICIT OCTET STRING
myData A ::= '0123456789ABCDEF'H


2013年1月2日水曜日

データ型 - 単一集合型



0個以上のASN.1データ型の集まりを表わし、構成要素のデータ型がすべて同じである場合、単一集合型を使用することができます。

型の記法
  単一集合型 ::= SET OF 型 | SET

  SETと記述とした場合、任意型(ANY)と組み合わせた SET OF ANY の意味になります。

型の例
  DigestAlgorithmIdentifiers ::= SET OF DigestAlgorithmIdentifier
  SignerInfos ::= SET OF SignerInfo

 http://www.ietf.org/rfc/rfc3852.txt

  Keywords ::= SET OF VisibleString

値の記法
  単一集合値 ::= { 値リスト } | {}

値の例
  asn1Keywords Keywords ::= { "INTEGER", "BOOLEAN", "REAL" }
  

データ型 - 集合型

0個以上のASN.1データ型の集まりを表わすために集合型を使用することができます。集合型では、順序列型とは異なり、構成要素の並び順に意味はありません。構成要素の数がわかっていて、列挙する構成要素の順序を気にする必要がない場合に使用します。

型の記法
 集合型 ::= SET{要素型リスト} | SET{}
 要素型リスト ::= 要素型 | 要素型 , 要素型リスト
 要素型 ::= 名前付き型 | 名前付き型 OPTIONAL | 名前付き型 DEFAULT 値 |
 COMPONENT OF 型 

COMPONENT OF を使用して、他のデータ構造を取り込む場合、取り込むデータ型は、集合体でなければいけません。

型の例
UserAccount ::= SET {
  username      [0] VisibleString,
  password      [1] VisibleString,
  accountNumber INTEGER
}

値の記法
  集合値 ::= { 要素値リスト } {}
  要素値リスト ::= 名前付き値 | 要素値リスト , 名前付き値
  名前付き値 ::= 識別子 値 | 値


値の例
myAccount UserAccount ::= SET {
  accountNumber 2013,
  username      "konta",
  password      "xxxxx"
}