お断り: 本記事は当社の社内 PoC で得られた知見を整理したもので、実装の細部やソースコードは公開していません。本記事は技術コンセプトと達成水準の共有が目的です。
はじめに
C2PA(Coalition for Content Provenance and Authenticity)の署名を実装するとき、「どのレイヤーで署名するか」という設計判断があります。大きく分けると、ソフトウェア側で署名する構成と、ハードウェア側で署名する構成の 2 通りです。NSA ら 4 機関の Content Credentials に関する CSI でも、Content Credentials は “at export from software or at creation on hardware” と並列に位置づけられており、両方が現実的な選択肢として扱われています。
当社の過去記事 AWS KMS で C2PA 署名を実装する はソフトウェア側のアプローチでした。KMS の内部実装は FIPS 140 認定の HSM、つまり実体としてはハードウェアですが、実装者から見える接点は kms:Sign API であり、コード上は SDK 経由のソフトウェア処理として組み立てる構成です。鍵が AWS の外に出ない、CloudTrail で監査が取れる、IAM で権限が絞れる、といった利点はクラウド KMS の良さがそのまま効いてきます。
一方で、署名を「撮影した瞬間に、撮影したデバイスの中で」完結させたい場面では、署名鍵をデバイス内のセキュアエレメントに置き、署名処理そのものをハードウェア側に降ろす必要があります。CSI の “How to prepare for implementing Content Credentials” でも、Content Credentials を組み込むタイミングとして「センサー/撮影時、編集段階、公開直前」の 3 段階が挙げられており、本記事はそのうち最上流の「センサー/撮影時にハードウェアで付与する」ケースを実機に落とすとどうなるか、という試みです。
つまりこの 2 本の記事は、C2PA 署名を扱うレイヤーが違うだけで、どちらかが正解という話ではありません。サーバやクラウドで運用が完結する用途ではソフトウェア側の構成が、撮影した瞬間からの改ざん耐性が要求される用途ではハードウェア側の構成が選ばれる、という棲み分けです。本記事は後者の試作の中間報告にあたります。

試作機の構成
写真の赤・黄・緑の枠が、それぞれ試作機の中心となる 3 つの部品に対応しています。
- 赤枠: M5Stack Unit ID(中身は Microchip の ATECC608B-TNGTLSU-G)。署名鍵を内部に閉じ込めるセキュアエレメント。本体側面に「ATECC608B-TNGTLSU-G」の刻印が見える
- 黄枠: XIAO ESP32-S3 Sense の本体ボード。MCU 側でマニフェストの組み立てとシリアル/Wi-Fi 入出力を担当する
- 緑枠: 黄枠の右上に乗っている OV3660 カメラモジュール。リボンケーブルで XIAO 本体側に直結されており、撮像系を別ボードにせずワンチップに寄せられる
部材を一覧化すると次の通りです。価格はいずれも 2026 年 5 月時点の税込価格で、ブレッドボード・ジャンパ・抵抗などの汎用部材は手元の在庫を使ったため対象外としています。
| 部材 | 写真上の対応 | 役割 | 価格(税込) |
|---|---|---|---|
| XIAO ESP32-S3 Sense | 黄枠(MCU)+ 緑枠(カメラ) | MCU + OV3660 カメラを 1 枚に統合した小型開発ボード | 2,660 円(Switch Science / 秋月電子) |
| M5Stack Unit ID(ATECC608B-TNGTLSU-G) | 赤枠 | ECDSA P-256 鍵を内部に閉じ込めるセキュアエレメント | 1,045 円(Switch Science) |
合計は約 3,700 円。これだけで、c2patool が Trusted と判定する C2PA 署名カメラが組み上がります。
赤枠の Unit ID と黄枠の XIAO の間は、SDA/SCL の 2 本に外付けプルアップ抵抗を足した素直な I2C 接続です。署名鍵は ATECC608B の Slot 2 に GenKey で生成し、以降この鍵はチップの外に出ない前提で運用します。
何を「エッジ完結」と呼んでいるか
PoC の到達点として、次の 3 つを同時に成立させた構成を「エッジ完結」と呼んでいます。
- 撮影は OV3660 で動的に取得した実画像(固定 JPEG ではない)
- C2PA マニフェスト(JUMBF + COSE_Sign1)の組み立てを ESP32 単独で行う
- COSE_Sign1 の署名は ATECC608B 内で実行され、秘密鍵は I2C にも UART にも一切出てこない
ここまで揃うと、出てきた JPEG は「このカメラ個体の中でしか作れない署名」を持っていることになります。ネットワーク不在でも署名でき、外部 KMS への到達性を仮定しません。
検証は Mac 側の c2patool に通しました。validation_state: "Trusted" で、signingCredential.trusted / claimSignature.validated / assertion.dataHash.match を含む 7 件の success コードに対して failure はゼロでした。
instanceID の UUID は撮影ごとに乱数で振り直しているので、シャッターを切るたびに claim の CBOR が変わり、Sig_structure のハッシュが変わり、ATECC が返す ECDSA 署名値も毎回別バイト列になります。固定バイト列の使い回しではないことを実機で示せる作りにしてあります。
コスト
PoC のもう一つの狙いは、コスト感の検証でした。Capture 側でハードウェア由来の真正性を持たせる話は、これまでハイエンドカメラ向けの議論として進んできた経緯があります(Sony や Leica の取り組みが代表例)。一方で、防衛・治安・監視・現場検証といった用途では、もっと安価で量産しやすいデバイスにこの仕組みを載せたいという声が確実に存在します。
前述の部材表のとおり、今回の PoC は核となる 2 部品の合計が約 3,700 円で、c2patool が Trusted と判定するレベルの C2PA 署名カメラが成立することを実機で示せました。Public Trust List 登録済みの正規 CA に置き換える、TSA でタイムスタンプを足す、といった本番化の差分はもちろん残りますが、「市販部品で約 3,700 円までで来る」という事実は次の議論の出発点になると考えています。
今後の展望: 独立動作するエッジ署名デバイス
PoC のゴールは「エッジで C2PA 仕様に準拠して署名できるか」の証明だったので、今の試作機は USB ケーブルでホスト PC とつながった状態で動かしています。USB は給電と、検証用にシリアル経由で signed JPEG を吐かせるためだけに使っているのですが、ここを断つ方向に進めるのが次のフェーズです。
具体的には、次の 4 点を順に試していく予定です。
- 出力経路の置き換え: 現状はシリアルに Base64 を流す形だが、これを Wi-Fi(または LTE/LoRa)に置き換え、JPEG 自体は SD カードに保存しつつ、検証メタデータだけネットワークに上げる構成にしたい
- 給電の独立化: LiPo バッテリー + 充電 IC を載せて、USB を抜いても撮影〜署名のサイクルが回るようにする
- 筐体化: ブレッドボードのままだと現場運用にならないので、3D プリント筐体に収めてシャッターボタンを物理化する
- TSA とトラストアンカーの本番化: ローカル CA を Public Trust List 登録済みの正規 CA に差し替え、RFC3161 タイムスタンプをマニフェストに含める
ここまで進めば、「USB ケーブルが刺さっていなくても、撮影した瞬間にカメラ単独で署名済み JPEG ができている」という体験になります。鍵もマニフェストもネットワークも、すべての信頼境界がデバイスの中で閉じている独立動作デバイスです。
おわりに
C2PA は「クラウドや SaaS で署名を回すための仕様」と捉えると、エッジで動かす意味が見えにくくなります。一方で、撮影の瞬間からマニフェスト生成までを 1 つのチップに閉じ込められるなら、それ自体が改ざん耐性の根拠になります。今回の PoC で、市販部品とセキュアエレメントの組み合わせで、その水準が現実的に手の届く範囲にあることが確認できました。
当社(合同会社テックサンクス)では、C2PA を軸にした受託開発・コンサルティング・技術顧問を提供しています。エッジ側に C2PA 署名を組み込みたい、Capture デバイスのトラストアーキテクチャを設計したい、といったご相談は お問い合わせフォーム からどうぞ。