トラスト・ストアとポリシー・プリセット
署名が役に立つのは「この鍵を信頼するか?」という問いに答えられるときだけです。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": "公開鍵がトラスト・ストアにありません"
}
同梱プリセット
| プリセット | minSigners | requireAllTrusted | requireTimestamp |
|---|---|---|---|
| Open — 趣味 / 実験 | 0 | false | false |
| Minimal trust — 社内ステージング | 1 | true | false |
| EU AI Act high-risk — 規制対象 AI | 2 | true | true |
| Banking grade — 金融、登録 TSA | 3 | true | true (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 |