決定論的CBOR - RFC8949 vs RFC7049
RFC 8949
4. Serialization Considerations
4.1. Preferred Serialization
4.2. Deterministically Encoded CBOR
4.2.1. Core Deterministic Encoding Requirements
4.2.2. Additional Deterministic Encoding Considerations
4.2.3. Length-First Map Key Ordering
RFC 7049 セクション3.9: Canonical CBORの定義
これと異なる順序でマップキーをソートしている
本ドキュメントでは「カノニカル化(canonicalization)」が特定の決定論的エンコーディングの用途にのみ関連付けられることが多いため、この用語を避けています。しかし、これらの用語は本質的に交換可能であり、本ドキュメントのコア要件セットも「Canonical CBOR」と呼ぶことができ、その長さ優先順序版は「Old Canonical CBOR」と呼ぶことができるでしょう。
yusei.iconこのページの目的はここの違いを理解しようというところ
RFC 7049
RFC 8949によって廃止されたとされているため,これを使用してはならない
Determinisitic Encoding - マップのキーのソート方法の違い
RFC 8949
コア決定論的エンコーディング, Core Deterministic Encoding
ルール: マップのキーを、エンコード後のバイト列表現で辞書順にソートする。
特徴: 実装が直感的でシンプル。バイト列をそのまま比較すれば良いため、多くのプログラミング言語で簡単に実装できます。これはRFC8949で新たに推奨されるようになった方式です。
RFC 7049と比較してよりシンプルで間違いが起きにくいと判断された
多くのプログラミング言語には、バイト列を効率的に辞書順ソートするための標準的な関数が用意されており、実装者はそれを利用するだけで済みます。
なぜRFC 7049を廃止したのか?
RFC 8949 Appendix G. Changes from RFC 7049 セクションより
他のErrata報告 (Err4409, Err4963, Err4964) は、カノニカルエンコーディングにおけるマップキーのソートルールが煩雑(onerous)であるとされた.
このドキュメントは、RFC 7049で提案されたマップの順序付けを、エンコードされたキーの単純な辞書順ソートに単純化することで、決定論的エンコーディングの実装をさらに容易にした
用語等の明確化
RFC 7049の7年間の利用で曖昧さが問題になるケースがあったため、各種用語の定義をより厳密にした
セキュリティリスクの改善
セキュリティに関する考慮事項(セクション10)は、ほとんどが書き直され、大幅に拡張されました。他の複数の場所で、デコーダが整形式エラーを単純に容認できないことが、より明示的になりました
整数と浮動小数点数の区別の明確化
JSONの仕様に影響され、整数と浮動小数点数の区別が曖昧な部分がありましたが、CBORはバイナリ表現であるため、この区別をより明確にする必要がありました。
実装と使用の経験から、これら2つの数値ドメイン間の分離を文書でより明確に描くべきであることが示唆されました。整数が浮動小数点数の代わりとして円滑に(seamlessly)使用できることを示唆するような文言は削除されました。
RFC 7049
ここでは,Determinisitic Encodingではなく,Canonical CBORと表現
長さ優先のマップキー順序, Length-First Map Key Ordering)
ルール: マップのキーを、まずエンコード後のバイト列の長さでソートし、長さが同じ場合はバイト列表現で辞書順にソートする。
バイト列の長さを先に比較しなければならない
2段階の処理が必要になっている
特徴: これは古いRFC7049で「Canonical CBOR」として定義されていたルールです。後方互換性のためにRFC8949にも残されています。