Abstract Syntax Notation One (ASN.1) とは


Abstract Syntax Notation One (ASN.1) は、ITU-T(国際電気通信連合-電気通信標準化部門)とISO(国際標準化機構)が共同で策定した標準に基づく、データ構造を記述するための一連の構文規則と、そのデータを転送するための符号化規則です。ITU-T勧告のX.680シリーズで構文規則が、X.690シリーズで符号化規則がそれぞれ規定されています。マシンのメーカーやOS、ソフトウェアなどに依存せず、曖昧さの無いデータ構造を定義することができ、異なるプラットフォーム間での正確な情報伝送を必要とする通信プロトコル仕様の規定などに利用されています。

ASN.1による実際のデータ構造定義は、SNMP、LDAP、X.509証明書などのプロトコル仕様に見ることができます。また、現在進められているコグニティブ無線やスマートグリッドの標準化においてもASN.1が使われており、今後も各種の標準において広く利用されることが予想されます。

BitMeister ASN.1 library for Java™とは


BitMeister ASN.1 Library for Java™(以下、BM ASN.1)は、ASN.1構文で規定されたデータ型をJavaクラスにマッピングして、各種の処理を行うためのクラスライブラリです。BM ASN.1には、ASN.1型をJavaクラスで表現するデータ型クラス、ASN.1型に付随する情報をクラスやフィールドに付与するアノテーションインターフェース、ASN.1型データを処理するランタイム処理クラスなどが含まれています。

BM ASN.1は、ASN.1型のデータをできるだけ一般的なJavaオブジェクト(POJO)と同様に扱えるように配慮して設計されています。ASN.1型データを扱うプログラムを簡潔なコードで記述することができ、ASN.1で規定されたプロトコルを扱うシステムの効率的な開発を可能にします。

Overview


BM ASN.1では、ASN.1型定義をクラスの継承関係で表現し、ASN.1型に付随する各種の情報はアノテーションで付与します。ユーザー定義のASN.1型クラスは、ビルトインASN.1型クラスを継承したクラスにいくつかのアノテーションを付与するだけで作成することができ、基本的に特殊なメソッドやフィールドを作成する必要はありません。各ASN.1型クラスには、clone, equals, toStringなどのObjectクラスのメソッドが既に実装されていて、通常のJavaオブジェクトと透過的に扱うことができます。

構造型(SET,SEQUENCE,CHOICE)の各要素は、ASN.1型クラスのフィールドにマッピングします。構造型への値の設定をフィールドへの代入で行えるため、ASN.1型を扱うJavaコードが簡潔に記述できるだけでなく、データ型の不一致をコンパイル時に検出することができます。構造型の要素への値の設定の際に要素名を文字列で指定するASN.1ライブラリでは、指定する要素名のtypo誤りなどが実行時エラーとなるまで分からないことがありますが、そのような誤りも発生しにくくなっています。

現バージョンのBM ASN.1では、

  • 全てのビルトインASN.1型クラス
  • ASN.1モジュールおよびASN.1型のJavaクラスへのマッピング
  • AUTOMATIC TAGS(自動タグ付け指定)を含むデフォルトタグ指定
  • BER(DER) Codec
  • XER Codec
  • ASN.1型データの文字列表示(toString)
などの機能が実装されています。

今後のリリースで、

  • SubType(SIZE, VALUE, WITH COMPONENTS etc.)への対応
  • ASN.1/Java Translator(BM ASN.1コードの自動生成)
などの実装を予定しています。

また、

  • 単体テストコードの追加
  • ASN.1型クラス定義の正当性チェックの外部コマンドへの切り出し
  • 不要な機能を抑止し、ライブラリを軽量化する機構の実装
などが行われるかもしれません。

プロジェクトページとライセンス


BM ASN.1は、オープンソースプロジェクトとしてSourceForgeに登録されています。開発ライセンスはApache License, Version 2.0です。バグ報告、機能追加要望、開発への参加は大歓迎です。

注意事項


ビットラボの利用規約およびApache License, Version 2.0で述べられている通り、本ライブラリはあくまでも実験プロジェクトとして公開しているものです。本ライブラリを利用することで(直接的、間接的を問わず)なんらかの損害がユーザおよびユーザが使用する施設設備等に発生した場合でも、当社はその責任を負いかねますので、あらかじめご了承ください。

ダウンロード(SourceForge.JP)


更新履歴


Version 0.23 (2012/2/8)

  • XERデコーダのバグ修正
  • ASN1Extendableアノテーションを追加
  • SEQUENCEおよびSETクラスのcollection()メソッドがListインタフェースを返すように修正

Version 0.22 (2011/11/11)

  • Java1.5に対応
  • SelectiveTypeのコンストラクタにASN1Typeデータを渡した場合、データ型により要素を選択するように修正
  • BIT_STRING, OCTET_STRING, NULLにhashCodeメソッドを追加
  • GeneralizedTimeのDERエンコード時のバグを修正

Version 0.21 (2011/09/07)

  • XerEncoderのOCTET_STRING型およびBIT_STRING型エンコードの不具合を修正
  • コレクション型(SEQUENCE_OF型、SET_OF型)に初期化指定付きコンストラクタを追加

Version 0.2 (2011/09/02)

  • XER Codecを追加
  • Moduleの定義方法を修正
  • 上の修正に伴うアノテーションの追加および型クラスの修正
  • RELATIVE_OID型を追加

Version 0.12 (2011/07/11)

  • BerDecoderのSET型デコードの不具合を修正
  • BIT_STRING型の動作を修正
  • 構造型要素のDEFAULT値指定のサンプルを追加

Version 0.11 (2011/07/06)

  • DerEncoderでDERの規定に従っていなかった部分を修正
    • BIT STRING型にNamedBitsが定義されている場合、最も後方のtrue(1)ビット以降のfalse(0)ビットをエンコード前に削除する
    • REAL型のBASE値が2ならバイナリエンコード、BASE値が10ならISO6093NR3でエンコード
    • SEQUENCE型またはSET型の要素にデフォルト値があり、要素の値がデフォルト値と等しい場合、その要素をエンコードに含めずに省略する。
    • SET型の各要素は、タグの昇順にソート
    • SET OF型の各要素は、エンコード後のbyte列をoctet stringと見なして昇順にソート
    • これらの修正に伴う修正
  • 上の規定に従わないBerEncoderクラスを作成(DerEncoderよりも処理が軽い)

Version 0.1 (2011/07/04)

  • 新規公開