2013年3月4日月曜日

フィールド構成 - タグフィールド

タグフィールド

タグフィールドは、ASN.1データ型を識別するためのフィールドです。フィールドは、1オクテット以上のオクテットから構成されます。このフィールドは、ASN.1データ型に関するクラス、タグ番号、符号化上の構造種別(基本型・構造型)から構成されます。
クラスは4つのクラスがあり、2ビット(ビット8およびビット7を使用)で表現されます。


符号化上の構造種別は1ビット(ビット6を使用)で表現されます。


タグフィールドを1オクテットで表現した場合、タグ番号に5ビットを使用することができ、その場合、64種類のタグ番号(データ型)を識別することが可能です。これでは、64種類以上のタグ番号(データ型)を識別することが不可能であるため、以下のような規則で符号化を行います。

  1. タグ番号が30以下の場合、残りの5ビットで表現します。
  2. タグ番号が31以上の場合、残りの5ビットをすべて1で設定し、続くオクテットでタグ番号をを表現します。その場合、符号化は以下の方法で行います。

  • 第二オクテット以降の各オクテットの最上位ビットは、タグフィールドの最終オクテットか否かを表わします。最上位ビットが0の場合、タグフィールドの最終オクテットであることを示します。この時、タグ番号の値は、第二オクテット以降の各オクテットの下位7ビットを連結して得られる非負整数の表現で符号化されます。

タグ番号が30以下の場合


タグ番号が31以上128以下の場合

タグ番号が129以上の場合



2013年2月16日土曜日

基本符号化規則(BER)

概要

ASN.1の構文は、符号化規則によって、オクテット列(バイト列)に変換します。基本符号化規則は,TLV符号化と呼ばれる技術を利用しています。TLV符号化はデータを情報タイプ(Type)、長さ(Length)、および値(Value)で構成します。ASN.1のデータ型は、基本符号化規則により、次の3つのフィールドに符号化されます。



定形式と不定形式

概要で示した形で符号化する形式を定形式と呼びます。基本符号化規則ではこの定形式のほかに、不定形式と呼ばれる符号化形式を提供しています。



ビットの並び

基本符号化規則は、ASN.1のデータ型を8ビットのオクテット単位に符号化します。オクテットの並びは、最上位オクテットから最下位オクテットへ左から順に第一オクテット、第二オクテット、・・・第nオクテットと並べます。 オクテット内のビットの並びは、最上位ビットをMSBと呼び、最下位ビットをLSBと呼びます。ビットは、最上位ビットから最下位ビットへ向かう順序で並べます。

2013年2月7日木曜日

データ型 - 部分型 - 内部部分型化

内部部分型化は、構造型の親の型を詳細化します。構成要素の中で、どの要素が存在し、存在する場合にとりうる値は何かを規定します。

型の記法

  内部部分型化 ::= WITH COMPONENTS 単一型制限 | WITH COMPONENTS 複数型制限
  単一型制限 ::= 部分型仕様
  複数型制限 ::= { 型制限 } | { ... , 型制限 }

  型制限 ::= 名前付き制限リスト
  名前付き制限リスト ::= 名前つき制限 | 名前つき制限 , 名前付き制限リスト
  名前付き制限 ::= 識別子 制限 | 識別子
  制限 ::= 値制限 存在制限
  値制限 ::= 部分型仕様 | empty
  存在制限 ::= PRESENT | ABSENT | empty
  PRESENT : 対応する要素値が存在
  ABSENT   : 対応する要素値が存在しない
  empty   : { 型制限 }の場合、PRESENTと同じ意味
               { ... , 型制限 }の場合、特別な制限はない

型の記法の例

  Envelope ::= SET {
  typeA TypeA,
  typeB TypeB OPTIONAL,
  typeC TypeC OPTIONAL
  }
  ABEnvelope ::= Envelope ( WITH COMPONENTS {
  ... ,
  typeB PRESENT,
  typeC ABSENT })
  ACEnvelope ::= Envelope ( WITH COMPONENTS {
  ... ,
  typeB ABSENT,
  typeC PRESENT })

  ABEnvelope ::= Envelope ( WITH COMPONENTS { typeA, typeB } )
  ACEnvelope ::= Envelope ( WITH COMPONENTS { typeA, typeC } )


データ型 - 部分型 - サイズ制限

サイズ制限は、値のとりうる長さを制限します。

部分型仕様で、許容する長さを整数で指定します。長さの単位は、対象とするデータ型により変化します。
単一順序列型、単一集合型などの配列をモデル化したデータ型の場合は、その配列のとりうる範囲を構成要素の数の最小値と最大値で示します。


型の記法
  サイズ制限 ::= SIZE 部分型仕様

型の記法の例
  PKIFreeText ::= SEQUENCE SIZE (1..MAX) OF UTF8String
RFC2510

  ExtensionAttributes ::= SET SIZE (1..ub-extension-attributes) OF ExtensionAttribute
OrganizationName ::= PrintableString (SIZE (1..ub-organization-name-length))
PKIX1Explicit88

2013年2月5日火曜日

データ型 - 部分型 - 許容アルファベット

許容アルファベットは、使用できるアルファベットを制限します。

型の記法
  許容アルファベット ::= FROM 部分型仕様

型の記法の例
  DigitString ::= PrintableString ( FROM ( “1”| “2” | “3” | “4” | “5” | “6” | “7” | “8” | “9” | “0” ))

データ型 - 部分型 - 値域

値域は、とりうる値の最小値および最大値を制限します。

型の記法
  値域   ::= 下端点 .. 上端点
  下端点 ::= 下端値 | 下端値 <
  上端点 ::= 上端値 | < 上端値
  下端値 ::= 値 | MIN
  上端値 ::= 値 | MAX

型の記法の例
IntegerType ::= INTEGER
0未満の整数
NegativeNumber ::= IntegerType ( MIN .. < 0 )

0以下の整数
NonPositiveNumber ::= IntegerType ( MIN .. 0 )

0より大きい整数
PositiveNumber ::= IntegerType ( 0 < .. MAX )

0以上の整数
NonNegativeNumber ::= IntegerType ( 0 .. MAX )

2013年2月2日土曜日

データ型 - 部分型 - 包含部分型

包含部分型は、既存の部分型を組み合わせて、新たな部分型を定義します。

型の記法
  包含部分型 ::= INCLUDES 部分型


型の記法の例
  ProtoType ::= ENAMURATED {
    first-class(0), buisiness-class(1), coach-class(2), economy-class(3)
  }
  SubType ::= ProtoType ( coach-class | economy-class )
  OtherType ::= ProtoType ( INCLUDES SubType | business-class )

データ型 - 部分型 - 単一値

単一値は、親の型のとりうる値から部分型で許容する値を制限します。許容する値を直接指定します。

型の記法
  単一値 ::=

型の記法の例
  ESSVersion ::= INTEGER { v1(1) }
AllOrFirstTier ::= INTEGER { allReceipts (0), firstTierRecipients (1) }
rfc2634

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"
}