要約

  • CTT は完成した COSE の署名フィールドを TSA に渡して時刻印を得る。TTC は先にペイロードのハッシュへ時刻印を得てから、そのトークンとペイロードを COSE で署名する。
  • TTC が保護ヘッダーにあることは、後の署名がトークンを覆ったことを示すだけであり、署名自体が TSA 時刻までに存在した証拠にはならない。

失効判定の画面では、時刻印の行も署名の行も「検証済み」だった。担当者はその二つを見て、署名は失効通知より前だと判断した。だが記録を追うと、時刻印を取ったのは文書の中身であり、署名を作ったのはその後だった。

例えば、月曜にあるペイロードのハッシュを Time Stamping Authority(TSA)へ送ってトークンを得る。火曜に署名証明書が失効する。水曜にそのトークンを保護ヘッダーへ入れ、COSE 署名を生成する。この最終オブジェクトは壊れていない。月曜のトークンも、水曜の COSE 署名も有効に検証できる。それでも月曜の TSA は水曜の署名バイト列を見ていない。ペイロードが先に存在したという事実から、署名も先に存在したと読むことはできない。

RFC 9921 は、RFC 3161 の TimeStampToken を COSE_Sign と COSE_Sign1 に収めるための IETF 標準である。ここで重要なのは、タイムスタンプという一つのラベルを足すことではない。CTT と TTC は異なる順序、異なる MessageImprint、異なる検証結果を持つ。RFC 9921 は、ペイロードだけを対象にした古いトークンで、失効後に作られた署名を受理してしまう危険を明示している。

何を TSA に渡したかで結論が決まる

COSE, Then Timestamp(CTT)では、まず COSE 署名を作る。次に COSE_Sign1 なら CBOR 符号化された signature フィールド、COSE_Sign なら CBOR 符号化された signatures フィールドをハッシュし、TSA へ送る。返ってきたトークンは、非保護ヘッダーパラメーター 3161-ctt に格納される。

CTT の時刻印が指しているのは、規格が指定した符号化範囲の署名バイト列である。COSE 署名、TSA トークン、TSA の信頼連鎖とポリシーを検証できれば、その署名は TSA の時刻までに既に存在した、という限定された結論を出せる。RFC 9921 が長期署名に CTT を用いる理由はここにある。後日に証明書が失効・満了しても、適切に保全された過去の署名事実までは消えない。

Timestamp, Then COSE(TTC)では、最初に TSA へ渡すのは COSE ペイロードのバイト列のハッシュである。CBOR の bstr ラッピングは含まず、まだ作られていない署名も含まない。トークンを 保護 ヘッダーパラメーター 3161-ttc に入れた後で、保護ヘッダーとペイロードを COSE 署名する。

これは弱い構成ではなく、別の目的に適した構成である。RFC 9921 の透明性・公証の利用例では、後で append-only ログへ署名済み部分を登録する際、トークンを署名済みステートメント内に残せる。つまり、あるペイロードが早い時点に存在し、そのトークンを含む組を誰かが後に署名したことを保てる。ただし、ログの取り込み、整合性、発行者の身元、失効情報の公開時刻、依拠者の受入れ判断は、別々に検証すべき事実である。

protected は時系列を逆転させない

3161-ttc が protected だという表示は、しばしば人を早合点させる。これは後の COSE 署名がトークンとペイロードを改ざんから守ることを意味する。TSA が、その後の署名を時刻印したという意味ではない。

反対に CTT の 3161-ctt は非保護である。署名の完成後に TSA トークンを得る以上、先にあった COSE 署名は後から届くトークンを覆えないからだ。RFC 9921 は、攻撃者がこのヘッダーを削除または置換できると注意する。対策は、トークンが署名済みであるかのように扱うことではない。輸送中と保存中の COSE Signed Message 全体に完全性保護を施し、署名とトークンの結び付きが失われないようにすることである。

そのため証拠保全には、オブジェクト全体のハッシュ、CTT/TTC のモード、インプリントに使った正確なバイト列、TSA 証明書とポリシー、証明書状態の証拠、保存時の完全性、実際に適用された判断を残す必要がある。CTT トークンが保管途中で消えたなら、「時刻証拠なし」と表示すべきで、「検証済み」を引き継いではならない。

時刻を読む前に、検証の主語を固定する

RFC 3161 の TSA はデータの意味を審査せず、ハッシュ表現へ時刻印を付ける。依頼側は応答状態、TSA の身元と証明書、データインプリント、ハッシュアルゴリズム、nonce または信頼できるローカル時刻、TSA 証明書の状態、ポリシーの受容性を確認しなければならない。genTime は TSA がトークンを生成した時刻であり、精度、分解能、遅延、ポリシーがその主張の境界を定める。

RFC 9921 に固有の検証は、埋め込まれたトークンの MessageImprint を、選んだモードが指定する正確なバイト列で再計算することだ。CTT は署名フィールド、TTC はペイロードを対象にする。CMS トークンを見つけただけでは、必要な結び付きはできない。

衡路の実行コードという見方を採れば、統制は画面上の日時ではなく、動く検証器の経路にある。どちらのモードを選んだか、何をハッシュしたか、失効と TSA ポリシーをどの版で判断したか、誰が受け入れたか、何が実際に起きたか。その連鎖を再現できて初めて、時刻印は組織が使える証拠になる。

Sources