sphior-verify
SPHIOR を一切信用せずに、SPHIOR が発行した Evidence Pack が改竄されていないことを独立検証する CLI / ライブラリ。
外部依存はゼロ(Node 標準の node:crypto のみ)。監査人・顧客・第三者は、このツールと標準ツール(OpenTimestamps クライアント / OpenSSL)だけで、SPHIOR のサーバに一切接続することなく検証できます。
何を証明するのか
Evidence Pack 1 件は「ある技術的事実(例: 診断で検出された事象)を記録した不変封筒」です。sphior-verify は次の 2 つの暗号学的束縛 を、標準プリミティブ(SHA-256 / RFC6962 Merkle)だけで再現・照合します。
- record 完全性 —
SHA-256(envelope_json) == record_hash
保存された封筒のバイト列を再ハッシュし、記録されたハッシュに一致するかを確かめる。1 ビットでも改竄されれば一致しない。
- Merkle 包含 —
record_hash + inclusion proof → epoch root_hash
その記録が、外部にアンカーされた epoch の Merkle ツリー(RFC6962)に確かに含まれることを確かめる。
補助として canonical 形の確認(envelope_json が RFC8785 JCS 正規形か)も行い、ハッシュが一意に再現可能であることを保証します。
「時刻」と「公開アンカー」は誰が保証するのか
epoch root が いつ存在したか は、sphior-verify では検証しません(意図的)。これは SPHIOR に依存しない標準の外部アンカーを、監査人自身が標準ツールで検証します。--emit がそのための成果物を書き出します。
「SPHIOR が『検証した』と主張する」よりも、あなたが自分で数学と公開アンカーを再計算する方が強い。それがこのツールの存在理由です。
インストール / 実行
Node.js 18 以上。インストール不要で実行できます。
npx sphior-verify pack.json
npx sphior-verify pack.json --emit ./out
npx sphior-verify pack.json --json
pack.json は SPHIOR の Evidence Pack API(GET .../evidence/pack)が返す JSON をそのまま保存したものです。
終了コード
0 — record 完全性 + Merkle 包含ともに一致(改竄なし)
1 — いずれかが不一致(検証失敗)
2 — 入力エラー(ファイル不正など)
完全な独立検証の手順(監査人向け)
npx sphior-verify pack.json --emit ./out
cd out && ots verify root.bin
openssl ts -verify -digest <pack の root_hash> -in root.tsr -CAfile tsa-ca.pem
3 つすべてが通れば、「この記録は改竄されておらず、記録された時刻に、公開/署名アンカー済みの root のツリーに含まれていた」ことを、SPHIOR を信用せずに確認したことになります。
Pack の形式
{
"envelope_json": "…canonical(RFC8785 JCS)な封筒文字列…",
"record_hash": "<hex>",
"merkle": {
"leaf_index": 0,
"proof": [{ "hash": "<hex>", "position": "left|right" }],
"root_hash": "<hex>",
"tree_size": 1
},
"epoch": { "epoch_id": "…", "tier": "base|qualified" },
"anchors": [
{ "anchor_type": "opentimestamps", "status": "pending|confirmed", "ots_b64": "…" },
{ "anchor_type": "rfc3161", "status": "confirmed", "gen_time": "…", "token_b64": "…", "tsa_url": "…" }
]
}
設計上の約束
- 外部依存ゼロ — サプライチェーン経由の改竄面を最小化。監査人がコードを丸ごと読める規模。
- オフライン — SPHIOR のサーバに接続しない。ネットワークが必要なのは外部アンカー検証(
ots / TSA CA 入手)のみ。
- 標準準拠 — SHA-256 / RFC6962(Merkle)/ RFC8785(JCS)/ RFC3161(TSA)/ OpenTimestamps。独自形式なし。
ライセンス
Apache-2.0
期間パック(0.2.0+)
SPHIOR の検証センターからダウンロードした期間パック(records[] 同梱)はそのまま全件検証できます:
npx sphior-verify sphior-verification-pack_2026-07-01_2026-07-26.json --emit out/
- 全 record をループ検証し、一致 / 不一致 / エポック封緘待ち を区別して集計します
--emit はエポック(root)ごとに root-<hex8>.bin(+ .ots / .tsr)を書き出します
- 終了コード: 不一致が 1 件でもあれば 1、なければ 0