NAME
Tripletail::Serializer - 値の直列化
SYNOPSIS
my $ser = $TL->newSerializer();
$ser->setCryptoKey($key); # must be 32 octets long
my $bin = $ser->serialize([100, 'foo', {bar => 'baz'}]);
my $val = $ser->deserialize($bin);
# $val equals to [100, 'foo', {bar => 'baz'}]
DESCRIPTION
Perl の各種の値をオクテット列に直列化する。 そのフォーマットは直列化結果が可能な限り小さくなるように設計されており、 また ZLIB 形式による圧縮や AES アルゴリズムによる暗号化、Adler-32 チェックサムによる誤り検出をサポートしている。
METHODS
$TL->newSerializer
-
my $ser = $TL->newSerializer();
Tripletail::Serializer のインスタンスを生成する。引数は取らない。
getCryptoKey
-
my $key = $ser->getCryptoKey();
オクテット列表現の暗号化および復号に使用する AES 共通鍵を返す。 もし鍵が設定されていなければ
undef
を返す。 setCryptoKey
-
$ser->setCryptoKey($key);
オクテット列表現の暗号化および復号に使用する AES 共通鍵を設定する。 鍵長は 256 ビット、32 バイトでなければならず、それ以外の長さの鍵を設定しようとした場合には
die
する。undef
を指定した場合には鍵が設定されていない状態になる。 serialize
-
my $val = [100, 'foo', {bar => 'baz'}]; my $bin = $ser->serialize($val);
第一引数に与えられた任意の値を直列化する。 もしその中に
bless
されたリファレンスが存在した場合には die する。 AES 共通鍵が設定されていれば暗号化を行い、されていなければ行わない。 deserialize
-
my $val = $ser->deserialize($bin);
第一引数に与えられた、直列化されたデータを元に戻す。
もしデータが暗号化されているならば設定されている AES 共通鍵を用いて復号を行う。 その際に鍵が設定されていなければ die する。
AES 共通鍵が設定されているにもかかわらずデータが暗号化されていない場合にも die する。 この動作はセキュリティ上の理由による。
FORMAT
本クラスで用いる直列化のフォーマットを以下に述べる。それには主として RFC 4234 (http://tools.ietf.org/html/rfc4234) を用いるが、ビット表現については EBML RFC Draft (http://matroska.org/technical/specs/rfc/index.html) のものを使用する。
document = header payload
直列化結果(以下ドキュメント)はヘッダとペイロードから成る。
header = 5%b0 is-encrypted is-compressed has-checksum
is-encrypted = BIT
is-compressed = BIT
has-checksum = BIT
ヘッダ長は 1 オクテットであり、その上位 5 ビットは常にゼロである。 is-encrypted
ビットは後述の暗号化が行われているかどうかを、 is-compressed
ビットは圧縮されているかどうかを、 has-checksum
ビットは Adler-32 チェックサムが存在するかどうかを示す。 ただし is-compressed
と has-checksum
は排他である。
payload = encrypted-payload / plain-payload
encrypted-payload = iv AES-CBC(plain-payload)
iv = 16OCTET
plain-payload = compressed-payload / uncompressed-payload
compressed-payload = ZLIB(value)
uncompressed-payload = value-with-checksum / value
value-with-checksum = value ADLER32(value)
ペイロードには次の 6 種類がある。
- 暗号化され、圧縮されている
-
暗号化には AES アルゴリズムの CBC モードを使用する。鍵長は 256 ビット、ブロック長は 128 ビットである。 IV はランダムな 16 オクテットであり、パディングには PKCS#7 (http://tools.ietf.org/html/rfc5652#section-6.3) 形式を用いる。
- 暗号化され、圧縮されておらず、チェックサムが存在する
-
チェックサムには Adler-32 (http://tools.ietf.org/html/rfc1950#section-8) アルゴリズムを用いる。これは network byte order の 4 オクテットで記録される。
- 暗号化され、圧縮されておらず、チェックサムも存在しない
-
この形式では誤った鍵を用いてペイロードを復号した場合にエラーになる事を保証できないため推奨されない。
- 暗号化されておらず、圧縮されている
-
圧縮には RFC 1950 (http://tools.ietf.org/html/rfc1950) ZLIB 形式を用いる。 この場合 ZLIB 形式の定義により必ずその内部に Adler-32 チェックサムが存在する。 従って圧縮されている場合には独立のチェックサムが付けられる事は無い。
- 暗号化も圧縮もされておらず、チェックサムが存在する
-
この形式は ZLIB 圧縮すると却って結果が肥大化する場合に限って用いられる。
- 暗号化も圧縮もされておらず、チェックサムも存在しない
-
この形式では不正なペイロードを "deserialize" した場合にエラーになる事を保証できないため推奨されない。
value = %x00 ; undef
/ %x01 vint ; non-negative integer
/ %x02 vint ; negative integer
/ %x03 size *OCTET ; IEEE 754 floating point number
/ %x04 size *OCTET ; octet string
/ %x05 size *OCTET ; UTF-8 string
/ %x06 size *value ; array
/ %x07 size *(value value) ; hash
整数および浮動小数点数は、それを表現するために必要な最小のオクテット数を用いて network byte order で格納される。 整数の幅は任意だが、浮動小数点数の幅は 0, 4, 8 オクテットのいずれかでなければならない。 幅ゼロの整数は 0 を、幅ゼロの浮動小数点数は 0.0 をそれぞれ表す。
負の整数はその絶対値で表現する。
ハッシュテーブルは複数個のキーと値のペアで表現されるが、そのキーには整数、オクテット列、UTF-8 文字列のみが使用可能である。
size = vint
vint = ( %b0 vint 7BIT ) / ( %b1 7BIT )
整数およびデータ長は可変長整数で表現される。その形式は EBML RFC Draft "2.1. Variable size integer" (http://matroska.org/technical/specs/rfc/index.html) に定義されたものと同一である。例:
Width Size Representation
1 2^7 1xxx xxxx
2 2^14 01xx xxxx xxxx xxxx
3 2^21 001x xxxx xxxx xxxx xxxx xxxx
4 2^28 0001 xxxx xxxx xxxx xxxx xxxx xxxx xxxx
AUTHOR INFORMATION
Copyright 2006-2012 YMIRLINK Inc.
This framework is free software; you can redistribute it and/or modify it under the same terms as Perl itself
このフレームワークはフリーソフトウェアです。あなたは Perl と同じライセンスの 元で再配布及び変更を行うことが出来ます。
Address bug reports and comments to: tl@tripletail.jp
Web site: http://tripletail.jp/