type=module
superclass=
included=
extended=
library=openssl
aliases=
aliasof=

ASN.1(Abstract Syntax Notation One)
 のデータを取り扱うためのモジュールです。

OpenSSLで証明書などを取り扱うのに必要になります。

このモジュールには、ASN.1関連のモジュール関数や定数、
ASN.1 のデータ型に対応するクラスが定義されています。

このモジュールは ASN.1 を十分に取り扱うのに必要な機能は
持っていません。SSL/TLSで必要な機能しか実装されていません。

ASN.1 は ITU-T と ISO によって定義された、データの構造を定義するための
言語を中心とした規格です。
この言語で定義された抽象的な構造を実際のバイト列で表現する
方法は ASN.1 の規格の一部として数種類定義されています。
このリファレンスで言及されている DER 形式も
このエンコード形式の一種です。

=== 概要

このモジュールにおいて、
ASN.1 のデータ型は [[c:OpenSSL::ASN1::ASN1Data]] および
そのサブクラスにマップされています。

ASN.1 の単純型(simple type)は [[c:OpenSSL::ASN1::Primitive]] の
各サブクラスに、構造型(structured type)は [[c:OpenSSL::ASN1::Constructive]]
の各サブクラスに対応しています。通常これらのタグクラスは UNIVERSAL です。
その値は [[m:OpenSSL::ASN1::ASN1Data#value]] で取り出せます。
単純型は通常の Ruby のオブジェクト、構造型は配列
UNIVERSAL以外のタグクラスを付けられた型は、
[[c:OpenSSL::ASN1::ASN1Data]] に対応します。UNIVERSAL以外のタグクラス
でタグ付けられた型のデータは、[[c:OpenSSL::ASN1::ASN1Data]]のオブジェクトで
表現され、その値として文字列(IMPLICITなタグ付けの場合)もしくは
配列(EXPLICITなタグ付けの場合)として表現されます。
[[c:OpenSSL::ASN1::Primitive]] のタグ付けの情報を使うことで、
IMPLICIT or EXPLICIT なタグ付けを実現することもできます。

例:
  # 単純型のデータ
  x = OpenSSL::ASN1::UTF8String.new("foobar")
  # 構造型のデータ
  y = OpenSSL::ASN1::Sequence.new([OpenSSL::ASN1::Boolean.new(true),
                                  OpenSSL::ASN1::Integer.new(-12)])
  # APPLICATION タグクラスのタグ2番でタグ付けられたデータ
  z = OpenSSL::ASN1::ASN1Data.new([OpenSSL::ASN1::Boolean.new(false)], 
                                  2, :APPLICATION)
  # 上と同様のデータを OpenSSL::ASN1::Booelan.new の2番目以降の
  # 引数で表現する
  z2 = OpenSSL::ASN1::Boolean.new(false, 2, :EXPLICIT, :APPLICATION)
  # IMPLICIT なタグ付けをする
  u = OpenSSL::ASN1::Boolean.new(false, 3, :IMPLICIT, :APPLICATION)

  # to_der でエンコード
  x.to_der  # => "\f\x06foobar"
  y.to_der  # => "0\x06\x01\x01\xFF\x02\x01\xF4"
  z.to_der  # => "b\x03\x01\x01\x00"
  z2.to_der # => "b\x03\x01\x01\x00"  これは z.to_der と同じ
  u.to_der # => "C\x01\x00"
  # エンコードした文字列をデコード
  OpenSSL::ASN1.decode(x.to_der)
  # => #<OpenSSL::ASN1::UTF8String:0x000000027cc700 @tag=12, @value="foobar", @tagging=nil, @tag_class=:UNIVERSAL>
  OpenSSL::ASN1.decode(y.to_der)
  # => #<OpenSSL::ASN1::Sequence:0x000000027c47d0 @tag=16, @value=[#<OpenSSL::ASN1::Boolean:0x000000027c4898 @tag=1, @value=true, @tagging=nil, @tag_class=:UNIVERSAL>, #<OpenSSL::ASN1::Integer:0x000000027c47f8 @tag=2, @value=-12, @tagging=nil, @tag_class=:UNIVERSAL>], @tagging=nil, @tag_class=:UNIVERSAL>
  OpenSSL::ASN1.decode(z.to_der)
  # => #<OpenSSL::ASN1::ASN1Data:0x000000027bc918 @tag=2, @value=[#<OpenSSL::ASN1::Boolean:0x000000027bc968 @tag=1, @value=false, @tagging=nil, @tag_class=:UNIVERSAL>], @tag_class=:APPLICATION>
  OpenSSL::ASN1.decode(u.to_der)
  # => #<OpenSSL::ASN1::ASN1Data:0x000000025bef30 @tag=3, @value="\x00", @tag_class=:APPLICATION>
  # @valueが "\x00" という文字列になっている

このモジュールは ASN.1 記法による記述を解釈し、利用する機能はないため、
IMPLICITなタグ付けをされたデータを適切に取り扱うことは面倒でしょう。

DER形式の文字列をデコードしてRubyのオブジェクトに変換するには
[[m:OpenSSL::ASN1.#decode]] もしくは [[m:OpenSSL::ASN1.#decode_all]] を用います。
逆に、[[c:OpenSSL::ASN1::ASN1Data]] のオブジェクトを DER 形式の文字列に
変換するには、[[m:OpenSSL::ASN1::ASN1Data#to_der]]を用います。

クラス階層
     OpenSSL::ASN1::ASN1Data
       +-> OpenSSL::ASN1::Primitive
       |     +-> OpenSSL::ASN1::Boolean
       |     +-> OpenSSL::ASN1::Integer
       |     +-> OpenSSL::ASN1::Enumerated
       |     +-> OpenSSL::ASN1::BitString
       |     +-> OpenSSL::ASN1::OctetString
       |     +-> OpenSSL::ASN1::UTF8String
       |     +-> OpenSSL::ASN1::NumericString
       |     +-> OpenSSL::ASN1::PrintableString
       |     +-> OpenSSL::ASN1::T61String
       |     +-> OpenSSL::ASN1::VideotexString
       |     +-> OpenSSL::ASN1::IA5String
       |     +-> OpenSSL::ASN1::GraphicString
       |     +-> OpenSSL::ASN1::ISO64String
       |     +-> OpenSSL::ASN1::GeneralString
       |     +-> OpenSSL::ASN1::UniversalString
       |     +-> OpenSSL::ASN1::BMPString
       |     +-> OpenSSL::ASN1::Null
       |     +-> OpenSSL::ASN1::ObjectId
       |     +-> OpenSSL::ASN1::UTCTime
       |     `-> OpenSSL::ASN1::GeneralizedTime
       `-> OpenSSL::ASN1::Constructive
             +-> OpenSSL::ASN1::Set
             `-> OpenSSL::ASN1::Sequence



=== 参照

* ITU-T Rec. X.680-699 [[url:http://www.itu.int/itu-t/recommendations/index.aspx?ser=X]]
