トラスト・ストアとポリシー・プリセット

署名が役に立つのは「この鍵を信頼するか?」という問いに答えられるときだけです。CGF はトラスト・ストア(誰を信頼するか)とトラスト・ポリシー(どれだけ厳格にするか)を分離し、同じバンドルが異なる環境で異なるポリシーのもとに検証できるようにしています。

トラスト・ストア

トラスト・ストアは検証側マシン上の小さな JSON 文書です。.dpw/compliance/trust-store.json に置かれます。

{
  "keys": [
    {
      "id":  "ops@acme",
      "alg": "Ed25519",
      "pub": "9c4d…ef10",
      "addedAt": "2026-04-08T11:02:00Z",
      "note": "リリース署名者、四半期ごとに更新"
    }
  ],
  "tsas": [
    { "url": "https://freetsa.org/tsr", "note": "EU 運用、無料 TSA" }
  ]
}

CLI から管理します:

cgf trust add-key  ops@acme 9c4d…ef10
cgf trust add-tsa  https://freetsa.org/tsr
cgf trust list-keys
cgf trust list-tsas
cgf trust export > trust.json
cgf trust import --mode merge   trust.json    # 既定
cgf trust import --mode replace trust.json    # ローカルを先に消去

または DPW で Compliance → Trust Store を開きます。UI と CLI は同じファイルに書き込みます。

マシン間の流れ

Laptop A                         Laptop B
─────────                        ─────────
trust add-key alice  …
trust add-tsa freetsa …
trust export > trust.json  ────► trust import --mode merge trust.json
                                 verify dossier.cgfevidence   ✓

トラスト・ポリシー

TrustPolicy は、署名が暗号的に検証されたうえで、バンドルが満たすべき不変条件です:

interface TrustPolicy {
  minSigners:        number;   // 例: 2
  requireAllTrusted: boolean;  // すべての署名者がトラスト・ストアにあること
  requireTimestamp:  boolean;  // 有効な RFC 3161 トークンが存在すること
  requireTSAUrl?:    string;   // タイムスタンプはこの TSA から来ること
}

verifyWithPolicy は構造化された違反を返します。素の pass/fail は返しません:

const result = await verifyWithPolicy(bytes, trustStore, {
  minSigners: 2,
  requireAllTrusted: true,
  requireTimestamp: true,
});

if (!result.ok) {
  for (const v of result.violations) console.error(v);
}

違反の例:

{
  "code":   "policy.requireAllTrusted",
  "signer": "ops@acme",
  "reason": "公開鍵がトラスト・ストアにありません"
}

同梱プリセット

プリセットminSignersrequireAllTrustedrequireTimestamp
Open — 趣味 / 実験0falsefalse
Minimal trust — 社内ステージング1truefalse
EU AI Act high-risk — 規制対象 AI2truetrue
Banking grade — 金融、登録 TSA3truetrue (requireTSAUrl 指定)

プリセットは .dpw/compliance/policy-presets.json に保存され、トラスト・ストアと一緒にエクスポートできます。ユーザー定義のプリセットも同梱プリセットと同じ一覧に並びます。

import { BUILTIN_POLICY_PRESETS, PolicyPresetsStore } from '@/lib/cgf';

const presets = await PolicyPresetsStore.load();
const policy  = presets.byId('eu-ai-act-high-risk');

プリセットの選び方

あなたが…使うべきは
サイドプロジェクトを構築しているOpen
社内ステージングを運用しているMinimal trust
EU AI Act 下で出荷しているEU AI Act high-risk
銀行規制下で出荷しているBanking grade、加えて requireTSAUrl

次に読むもの