モノクロ専用カメラアプリ「MonokuroCam」、Android版に続いてiOS版もリリース

モノクロ専用カメラアプリ「MonokuroCam」、Android版に続いてiOS版もリリース
Page content

iPhoneでも楽しめるように

2026年8月14日にAndroid版の公開を開始した、モノクロ専用カメラアプリ「MonokuroCam」の現状をご紹介します。

9月下旬にはiOSへの移植版も作成し、Appleへ公開申請をしておりましたところ、10月27日に晴れてApp Storeにて公開開始となりました (App Storeでアプリを公開するのは初めてなので、ドキドキしながら待ちました)。

お手持ちのAndroidスマホでも、もしくはiPhoneでも、たまにはモノクロにこだわった写真を撮ってみようという方、MonokuroCamを選んでいただく絶好の機会です。有償のアプリですが、ぜひお試しいただければ幸いです。

更新履歴

MonokuroCamが目指すのは、光学レンズで捉えた光を、可能な限りそのまま情報を落とさずに、気軽なスナップ写真として記録する、シンプルなモノクロカメラアプリです。作者の私のニーズや思いつきを反映しつつ、現段階までに次のような改良を行ってきました。

バージョン表記Ver.X.Y.Zの、Yは明確な機能追加による変更、Zは小改良やバグ修正による変更を示しています。Xは、より大胆な変更を行うときにカウントアップしたいと思います。

Android版

Ver.Date内容
1.0.x2026-08-14Google Play Store 正式リリース (対応言語: ja, en)
1.1.x2026-09-04マルチカメラ互換性強化, リアルタイムレンズ検知, 省電力化
1.2.x2026-09-28写真編集機能の拡充, 2倍ズームの仮想レンズ機能
1.3.x2026-10-11低照度モード「LOW」 (Low-Light) 搭載
1.4.x2026-10-11C2PA (Content Credentials) 真正性証明, TSAタイムスタンプ存在証明
1.5.x2026-10-20アプリ内の多言語対応 (最新版では32言語・ロケール)

iOS版

Ver.Date内容
1.0.x2026-10-27Apple App Store 正式リリース (対応言語: ja, en)
1.5.x2026-10-28Android版Ver.1.5と同等

技術的な解説

スナップ写真を気軽に撮るためのカメラアプリにおいて、MonokuroCamでのC2PA対応はユニークかなと思いますので、アプリ内の処理について解説します。

C2PAとは

C2PA (Coalition for Content Provenance and Authenticity) は、デジタルメディアの出所 (どの機器やアプリで生成されたか) や編集履歴などの「来歴 (Provenance)」を、電子署名によって記録・検証可能にするオープンな標準規格です。一般には「Content Credentials」としても知られています。C2PAがどのように機能するかについては、How it works - Content Authenticity Initiative をご参照ください。

MonokuroCamでは、C2PAの仕様に基づいたマニフェスト情報に加えて、TSA (Time Stamping Authority: 信頼できる第三者タイムスタンプ局) によるタイムスタンプを組み合わせることで、次の2点を技術的に検証できるようにしています。

  1. 真正性と改竄検知 (C2PAによる署名): 撮影時のメタデータや画像ハッシュ値を暗号鍵で電子署名することで、「MonokuroCamによって撮影された正規のデータであること」や「撮影後にデータが改変されていないこと (完全性)」を第三者が検証可能にします。
  2. 客観的な存在証明 (TSAタイムスタンプ): スマホ内のローカル時計ではなく、RFC 3161に準拠した第三者認証局のタイムスタンプトークンを埋め込むことで、「その写真データがその日時に確実に存在していたこと」を客観的に証明します。

撮影からC2PA署名・TSA取り込みまでの処理フロー

シャッターを切ってから、C2PAメタデータ付きのJPEG画像が生成されるまでの処理フローを図にまとめました。本機能はMonokuroCam Android版・iOS版の両方に搭載しており、以下の処理フローと出力例はAndroid版 (Pixel 10 Pro XL / Titan M2搭載機) に基づきます (Google発行のX.509ハードウェア証明書チェーン同梱はAndroidのKey Attestation固有であり、iOS版ではSecure Enclave内での使い捨て鍵生成・署名と公開鍵バインディングによって同等の真正性保証を行います)。

flowchart TD
    subgraph S1["1. 撮影と画像処理"]
        A["シャッター"] --> B1["光学撮影 (生キャプチャ)"]
        B1 --> B2["モノクロトーン・コントラスト調整"]
        B2 --> B["モノクロJPEG画像の生成 + Exif記録"]
        B --> C["画像データのハッシュ値計算<br/>(c2pa.hash.data)"]
    end

    subgraph S2["2. ハードウェア隔離領域 (Titan M2)"]
        D["使い捨て署名鍵ペアの生成<br/>(写真ごとにエフェメラル生成)"]
        C -->|"SHA-256をチャレンジとして注入"| D
        D --> E["Google発行の<br/>ハードウェア証明書チェーン"]
    end

    subgraph S3["3. マニフェスト作成と電子署名"]
        C --> F["マニフェスト (アサーション) 構築<br/>- 撮影来歴 (c2pa.actions.v2)<br/>- 端末情報・位置情報"]
        E --> F
        F --> G["Titan M2内部で電子署名<br/>(秘密鍵はチップ外に出ない)"]
    end

    subgraph S4["4. 客観的タイムスタンプの取得"]
        G --> H["署名ダイジェストを<br/>公的TSA局 (Sectigo) へ送信"]
        H --> I["RFC 3161準拠の<br/>タイムスタンプトークン取得"]
    end

    subgraph S5["5. C2PAメタデータの埋め込みと保存"]
        B --> J["画像データ本体 (JPEG)"]
        G --> K["C2PAマニフェスト (JUMBF領域)<br/>[ アサーション + 署名 + 証明書 + TSA ]"]
        I --> K
        J & K --> L["完成: C2PA付きJPEGファイル<br/>(真正性・完全性・存在証明)"]
    end

電子署名とC2PAの直感的なポイント

  • 画像そのものを暗号化して隠すわけではない: 写真データ自体は標準的なJPEGであり、通常のビューアやブラウザでそのまま閲覧できます。C2PAの来歴データはJPEGの標準拡張規格 (JUMBF形式) として埋め込まれます。
  • 「指紋 (ハッシュ値)」にサインする: 画像の全画素や撮影メタデータから計算された「暗号学的ハッシュ値 (指紋)」に対して電子署名を行います。もし撮影後に1ピクセルでも加工されたりメタデータが書き換えられたりすると、ハッシュ値が変化して署名検証に失敗するため、改変が検知できます。
  • 外部TSAによる客観的な時間保証: スマホのローカル時計はユーザーが自由に変更できるため、署名のダイジェストを第三者のタイムスタンプ局 (TSA) に送信して「その時刻に確かに存在していた」という客観的なお墨付き (トークン) を取得します。

c2patoolによるマニフェストの読み解きと5つの要点

C2PAの標準検証ツールであるc2patoolを使用して、MonokuroCam Android版で撮影した写真のメタデータを出力した結果から、要所となる5つのポイントを抽出して解説します。

$ c2patool ./IMG_20261103_134037_172.jpg

1. 来歴と生成プロセスの記録 (c2pa.actions.v2)

画像がどのように生成され、アプリ内でどんな処理が行われたかを宣言します。

        {
          "label": "c2pa.actions.v2",
          "data": {
            "actions": [
              {
                "action": "c2pa.created",
                "softwareAgent": "MonokuroCam/1.5.7",
                "digitalSourceType": "http://cv.iptc.org/newscodes/digitalsourcetype/digitalCapture"
              },
              {
                "action": "c2pa.color_adjustments",
                "softwareAgent": "MonokuroCam/1.5.7",
                "description": "Monochrome tone curve and contrast adjustment"
              }
            ]
          },
          "created": true
        }
  • 実写撮影の証明: digitalSourceTypeにIPTC標準コードのdigitalCapture (物理センサによる光学撮影) が記録され、AI生成 (synthetic) 画像等と明確に区別されます。
  • 編集履歴 (Provenance): 撮影後にアプリ内で行われた処理 (モノクロトーンカーブやコントラスト調整) が記録されており、加工プロセスの透明性が確保されます。

2. 改竄を許さない「ハッシュバインディング」 (完全性の検証)

C2PAは画像ファイル全体を暗号化して秘匿するのではなく、画像バイナリ本体や各メタデータ (アサーション) の暗号学的ハッシュ値をマニフェスト内に保持し、それらをまとめて電子署名する「ハッシュバインディング」を採用しています。

        {
          "code": "assertion.hashedURI.match",
          "url": "self#jumbf=/c2pa/urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c/c2pa.assertions/c2pa.thumbnail.claim",
          "explanation": "hashed uri matched: self#jumbf=c2pa.assertions/c2pa.thumbnail.claim"
        },
        {
          "code": "assertion.hashedURI.match",
          "url": "self#jumbf=/c2pa/urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c/c2pa.assertions/c2pa.actions.v2",
          "explanation": "hashed uri matched: self#jumbf=c2pa.assertions/c2pa.actions.v2"
        },
        {
          "code": "assertion.hashedURI.match",
          "url": "self#jumbf=/c2pa/urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c/c2pa.assertions/c2pa.hash.data",
          "explanation": "hashed uri matched: self#jumbf=c2pa.assertions/c2pa.hash.data"
        },
        {
          "code": "assertion.hashedURI.match",
          "url": "self#jumbf=/c2pa/urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c/c2pa.assertions/com.ubiqun.monokurocam.device",
          "explanation": "hashed uri matched: self#jumbf=c2pa.assertions/com.ubiqun.monokurocam.device"
        },
        {
          "code": "assertion.hashedURI.match",
          "url": "self#jumbf=/c2pa/urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c/c2pa.assertions/com.ubiqun.monokurocam.location",
          "explanation": "hashed uri matched: self#jumbf=c2pa.assertions/com.ubiqun.monokurocam.location"
        },
        {
          "code": "assertion.hashedURI.match",
          "url": "self#jumbf=/c2pa/urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c/c2pa.assertions/com.ubiqun.monokurocam.time_attestation",
          "explanation": "hashed uri matched: self#jumbf=c2pa.assertions/com.ubiqun.monokurocam.time_attestation"
        },
        {
          "code": "assertion.hashedURI.match",
          "url": "self#jumbf=/c2pa/urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c/c2pa.assertions/com.ubiqun.monokurocam.hardware_attestation",
          "explanation": "hashed uri matched: self#jumbf=c2pa.assertions/com.ubiqun.monokurocam.hardware_attestation"
        },
        {
          "code": "assertion.dataHash.match",
          "url": "self#jumbf=/c2pa/urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c/c2pa.assertions/c2pa.hash.data",
          "explanation": "data hash valid"
        }
  • 画素データの完全性: dataHash.matchは、JPEGの画素データ (JUMBF領域外の画像本体) が撮影時点から1ピクセルも変更されていないことを数学的に証明します。
  • メタデータの改変検知: hashedURI.matchにより、撮影端末情報、位置情報、撮影日時、アクション履歴などの各メタデータも個別にハッシュ照合され、一部の改変や削除も即座に検知されます。

3. 端末時刻の偽装を排除する第三者タイムスタンプ (TSA: RFC 3161)

スマートフォンの内蔵時計 (ローカル時刻) はユーザーが自由に変更できるため、単独では時刻の客観的な証拠能力を持ちません。

        {
          "label": "com.ubiqun.monokurocam.time_attestation",
          "data": {
            "description": "Cryptographically verified via RFC 3161 Public TSA",
            "tier": 1,
            "timeSource": "tsa_verified",
            "timestamp": 1793680834791
          }
        }
      "signature_info": {
        "alg": "Es256",
        "issuer": "MonokuroCam Hardware Attested",
        "common_name": "Google Pixel 10 Pro XL Hardware Signer",
        "cert_serial_number": "4185279845883303885",
        "time": "2026-11-03T04:40:34+00:00"
      },
        {
          "code": "timeStamp.validated",
          "url": "self#jumbf=/c2pa/urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c/c2pa.signature",
          "explanation": "timestamp message digest matched: Sectigo Public Time Stamping Signer R37"
        },
  • 客観的な存在証明 (signature_info.time / timeStamp.validated): 署名時にRFC 3161に準拠した公的TSA局 (本例ではSectigo) へハッシュダイジェストを送信し、認証局の秘密鍵で発行されたタイムスタンプトークンを埋め込んでいます。これにより「その写真データが、指定のUTC日時 (2026-11-03T04:40:34+00:00) に確実に存在していたこと」が第三者機関によって証明されます。
  • オフライン時を見据えた多層時刻保証 (time_attestation): オンライン時は最上位のtier: 1 (tsa_verified) として記録されます。また、電波の届かないオフライン環境でも撮影を妨げないよう、通信不可時はハードウェア鍵生成時にKey Attestation証明書へ刻印される時刻 (tier: 2: hardware_attestation) やGNSS衛星時計 (tier: 3: gnss_satellite) 等へ自動フォールバックして時刻の根拠を記録する多層設計としています。

4. ハードウェア隔離領域による真正性保証 (StrongBox Attestation)

PC上のスクリプトやエミュレータによるマニフェスト偽造を防ぐため、Android端末のセキュリティチップ (Titan M2) を活用しています。

        {
          "label": "com.ubiqun.monokurocam.hardware_attestation",
          "data": {
            "attestation_certificate_chain": [
              "-----BEGIN CERTIFICATE-----\nMIICwDCCAmegAwIBAgIBATAKBggqhkjOPQQDAjA/MRIwEAYDVQQKEwlTdHJvbmdC...(中略)...-----END CERTIFICATE-----\n",
              "-----BEGIN CERTIFICATE-----\nMIICjTCCAjKgAwIBAgIRAMW/G3x9sRTBMa06mdB1YN8wCgYIKoZIzj0EAwIwKTET...(中略)...-----END CERTIFICATE-----\n",
              "-----BEGIN CERTIFICATE-----\nMIIC7jCCAnWgAwIBAgITbrsc9rQdPsAbTE35b+4d4VVZFzAKBggqhkjOPQQDAzAp...(中略)...-----END CERTIFICATE-----\n",
              "-----BEGIN CERTIFICATE-----\nMIICZDCCAeugAwIBAgIRAPLC/gLfzdARgeSj5rNpoowwCgYIKoZIzj0EAwMwUjEc...(中略)...-----END CERTIFICATE-----\n",
              "-----BEGIN CERTIFICATE-----\nMIICIjCCAaigAwIBAgIRAISp0Cl7DrWK5/8OgN52BgUwCgYIKoZIzj0EAwMwUjEc...(中略)...-----END CERTIFICATE-----\n"
            ],
            "challenge_sha256_base64": "BnlzXBaWbG7ORB8vnUIxMUfzMqD6TKfwXoIpiQJM784=",
            "device_make": "Google",
            "device_model": "Pixel 10 Pro XL",
            "hardware_clock_ms": 1793680832028,
            "hardware_signature_der_base64": "MEUCIQCn9ecg2Q7+MlS94127NWUFA+76di36Bu3wlDUPye2UkQIgH2aBJTmU3sGZ97R9r7wY/vKQ+VHixI1hzG7q1b1ijbA=",
            "is_strongbox": true,
            "security_level": "StrongBox"
          }
        }
  • ハードウェアによる鍵保護: 暗号鍵はTitan M2チップ (StrongBox) 内部で生成・保護され、端末のOSやアプリから直接秘密鍵を取り出すことはできません。
  • Google発行の証明書チェーンとC2PAブリッジ証明書: Android Key Attestationのリーフ証明書にはC2PA規格 (c2pa-rs) が要求する拡張鍵用途 (EKU: id-kp-emailProtection / c2paClaimSigning) が含まれないため、COSE署名 (signature_info) にはTitan M2内の同一公開鍵をバインドしたC2PAブリッジ証明書 (issuer: "MonokuroCam Hardware Attested") を用いています。その上で、同じ公開鍵に対するGoogleのルートCAに連なるKey Attestation証明書チェーン (全5枚: attestation_certificate_chain) をアサーションに同梱し、双方の公開鍵一致を検証することで「正規のPixel 10 Pro XL実機ハードウェア内で署名されたこと」を客観的に裏付けています。
  • 画像ハッシュの焼き込み (challenge_sha256_base64): 撮影したJPEG画像のSHA-256ハッシュ値をチャレンジとしてTitan M2に渡して証明書を発行させ、さらにそのハッシュ値自体にもハードウェア署名 (hardware_signature_der_base64) を行っています。これにより、別写真のハードウェア証明書チェーンだけを流用するリプレイ攻撃も不可能な設計としています。
  • ハードウェア刻印時刻 (hardware_clock_ms): リーフ証明書 (attestation_certificate_chain[0]) 内のASN.1 Tag 701 (creationDateTime) に記録された、StrongBoxによる鍵ペア生成時刻 (1793680832028: TSAタイムスタンプ取得時刻 1793680834791 の約2.8秒前) です。オフライン撮影時 (tier: 2) にはこのハードウェア刻印時刻が時刻証明の根拠として機能します。

5. プライバシー保護のための「使い捨て署名鍵」と検証ステータス

出力結果の検証ステータスを確認すると、Validと判定されつつもsigningCredential.untrustedという警告が出力されます。

  "validation_status": [
    {
      "code": "signingCredential.untrusted",
      "url": "self#jumbf=/c2pa/urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c/c2pa.signature",
      "explanation": "signing certificate untrusted"
    }
  ],
  "validation_results": {
    "activeManifest": {
      "success": [
        {
          "code": "timeStamp.validated",
          "url": "self#jumbf=/c2pa/urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c/c2pa.signature",
          "explanation": "timestamp message digest matched: Sectigo Public Time Stamping Signer R37"
        },
        {
          "code": "claimSignature.insideValidity",
          "url": "self#jumbf=/c2pa/urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c/c2pa.signature",
          "explanation": "claim signature valid"
        },
        {
          "code": "claimSignature.validated",
          "url": "self#jumbf=/c2pa/urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c/c2pa.signature",
          "explanation": "claim signature valid"
        }
      ],
      "informational": [
        {
          "code": "timeStamp.untrusted",
          "url": "self#jumbf=/c2pa/urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c/c2pa.signature",
          "explanation": "timestamp cert untrusted: Sectigo Public Time Stamping Signer R37"
        }
      ],
      "failure": [
        {
          "code": "signingCredential.untrusted",
          "url": "self#jumbf=/c2pa/urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c/c2pa.signature",
          "explanation": "signing certificate untrusted"
        }
      ]
    }
  },
  "validation_state": "Valid"

しかし、MonokuroCamの設計思想においては、このsigningCredential.untrustedという警告は意図的に許容しています。その理由は以下の通りです。

  • 写真間トラッキングの防止と2つの署名モード: 同一の秘密鍵や固定された電子証明書を使い続けると、公開鍵や証明書シリアル番号を突合することで、ネット上に公開された複数の写真が「同一端末・同一人物によって撮影されたものか」を第三者が容易に追跡 (トラッキング) できてしまいます。MonokuroCamではプライバシー保護のため、撮影ごとにエフェメラル (使い捨て) の鍵ペアを動的生成して署名後に秘密鍵を破棄しており、さらに用途に応じて以下の2つのモードを選択できるようにしています (本記事の出力例は後者のモードです)。
    • プライバシー優先モード (デフォルト): ハードウェア証明書チェーンや署名証明書内の端末名を含めず、完全に独立した匿名の使い捨て鍵 (MonokuroCam Anonymous Signer) のみで署名することで、暗号鍵による写真間の相関追跡をゼロにするモード (なお、Exifや com.ubiqun.monokurocam.device アサーションへの機種名記録は、別設定の「端末・カメラ機種名を記録」のON/OFFや撮影後の「端末機種名を削除」機能で個別に制御可能です)。
    • ハードウェア真正性モード (オプトイン): Android版ではStrongBox (またはTEE) 内で撮影ごとに使い捨て鍵ペアを生成しつつ、要点4のGoogle発行ハードウェア証明書チェーンを同梱して実機撮影の証明力を高めるモード。iOS版ではSecure Enclave内で使い捨て鍵ペアの生成・署名を行い、COSE署名鍵との公開鍵バインディング (public_key_der_base64) を記録します。
  • 検証結果の意味:
    • validation_state: "Valid": 画像データおよびメタデータのハッシュ照合、署名計算自体は数学的に正当 (改竄なし) であると確認されています。
    • signingCredential.untrusted: 撮影ごとの使い捨て鍵であるため、Adobe等の一般的な公的CA (Web PKI) の固定トラストストアには登録されておらず、証明書チェーンとしては「untrusted (信頼されたルートCA外)」と判定されます。
    • timeStamp.untrusted (informational): success内のtimeStamp.validatedによりSectigo TSAの署名とハッシュの一致は検証済みですが、c2patoolを引数なし (デフォルト設定) で実行した際はTSA用のトラストアンカーリストが指定されていないため、参考情報 (informational) として出力されます。

この「公的CAに紐付かない使い捨て鍵 (C2PAブリッジ証明書)」の信頼性を、前述の要点4 (Google発行のハードウェアアテステーション証明書チェーンやSecure Enclaveの公開鍵バインディング) で補完することで、プライバシーを保護しつつ実機ハードウェアによる真正性を担保するアーキテクチャとなっています。

参考情報

参考リンク: C2PAの限界とMonokuroCamのスタンス

  1. How to Hack Time, With C2PA | Blog
  2. Apple、撮影瞬間に署名する新方式発表。C2PAの脆弱性を克服 | Hakky Handbook
  3. 研究者がAndroidのC2PA写真証明を破る、Googleは修正しない方針

上記のリンク先の記事でも指摘されている通り、現行のスマートフォンにおけるC2PA実装は「万能の魔法」ではありません。たとえば、撮影者自身が端末をroot化・OS改変してカメラHAL層 (センサーから署名チップへ渡る手前の経路) に偽の画像データを注入する攻撃や、ディスプレイに表示したフェイク画像を物理レンズで再撮影する「アナログホール」までは、アプリや現行OSの仕組みだけでは完全には防げません。

それでもなお、MonokuroCamの現在のC2PA + TSA実装には、少なくとも次の点を暗号学的に保証できる明確な実用価値があると考えています。

  • 事後改竄の完全な検知: 一度署名された写真データ (全画素および撮影メタデータ) が、撮影後に第三者やAI編集ツールによって1ピクセルたりとも書き換えられていないこと (なお、1つ目の記事にあるC2PAのハッシュ除外範囲 exclusions を悪用した画像差し替え攻撃に対しても、MonokuroCamでは画像全体のSHA-256ハッシュ値をTitan M2の証明書チャレンジ challenge_sha256_base64 に直接焼き込むことで耐性を持たせています)。
  • 客観的な存在時刻の証明: RFC 3161 TSAタイムスタンプにより、「まさにその画素データを持った写真が、指定のUTC日時に確実に存在していたこと」 (事後の日付捏造やバックデートが不可能であること)。
  • 善意の撮影者による説明責任: 悪意ある攻撃者が自端末を改造して行う偽装を100%防ぐものではなくとも、「通常の撮影者が、AI生成や過度なレタッチに頼らず、その日時に撮影したスナップ写真であること」を、後から第三者が検証可能な形で提示できること。

参考動画: MonokuroCam Android版のPromo

MonokuroCamプロモーションのための30秒動画は、音楽も含めてAIを駆使して作成しました。アプリが目指す方向性と同じように、“派手さはないが堅実”というイメージが伝わるように、動画を整えるのが大変です……。

国際版

日本語版

付録: c2patool出力全文 (JSON)

「c2patool ./IMG_20261103_134037_172.jpg」の出力結果 (クリックで展開)
{
  "active_manifest": "urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c",
  "manifests": {
    "urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c": {
      "claim_generator_info": [
        {
          "name": "MonokuroCam",
          "version": "1.5.7",
          "org.contentauth.c2pa_rs": "0.91.2"
        }
      ],
      "title": "Monochrome Capture",
      "instance_id": "xmp.iid:70d88d8e-2502-4606-ad54-e93e1b446cf5",
      "thumbnail": {
        "format": "image/jpeg",
        "identifier": "self#jumbf=/c2pa/urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c/c2pa.assertions/c2pa.thumbnail.claim"
      },
      "assertions": [
        {
          "label": "c2pa.actions.v2",
          "data": {
            "actions": [
              {
                "action": "c2pa.created",
                "softwareAgent": "MonokuroCam/1.5.7",
                "digitalSourceType": "http://cv.iptc.org/newscodes/digitalsourcetype/digitalCapture"
              },
              {
                "action": "c2pa.color_adjustments",
                "softwareAgent": "MonokuroCam/1.5.7",
                "description": "Monochrome tone curve and contrast adjustment"
              }
            ]
          },
          "created": true
        },
        {
          "label": "com.ubiqun.monokurocam.device",
          "data": {
            "make": "Google",
            "model": "Pixel 10 Pro XL"
          }
        },
        {
          "label": "com.ubiqun.monokurocam.location",
          "data": {
            "altitude": 31,
            "latitude": 34.70696766860783,
            "longitude": 135.26722664013505
          }
        },
        {
          "label": "com.ubiqun.monokurocam.time_attestation",
          "data": {
            "description": "Cryptographically verified via RFC 3161 Public TSA",
            "tier": 1,
            "timeSource": "tsa_verified",
            "timestamp": 1793680834791
          }
        },
        {
          "label": "com.ubiqun.monokurocam.hardware_attestation",
          "data": {
            "attestation_certificate_chain": [
              "-----BEGIN CERTIFICATE-----\nMIICwDCCAmegAwIBAgIBATAKBggqhkjOPQQDAjA/MRIwEAYDVQQKEwlTdHJvbmdC\nb3gxKTAnBgNVBAMTIGM1YmYxYjdjN2RiMTE0YzEzMWFkM2E5OWQwNzU2MGRmMB4X\nDTcwMDEwMTAwMDAwMFoXDTQ4MDEwMTAwMDAwMFowHzEdMBsGA1UEAxMUQW5kcm9p\nZCBLZXlzdG9yZSBLZXkwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATFSCe3+UgL\niBYUW27iLW4h18TVlBPlKDetB8l2uYtZvzm5Kn15DyVgPTudRH9JhijSOXIbQYLl\nORY6dxCgd6JMo4IBcjCCAW4wDgYDVR0PAQH/BAQDAgeAMBEGCisGAQQB1nkCATsE\nAwoBAjCCAUcGCisGAQQB1nkCAREEggE3MIIBMwICASwKAQICAgEsCgECBCAGeXNc\nFpZsbs5EHy+dQjExR/MyoPpMp/BegimJAkzvzgQAMFi/hT0IAgYBoZ+1dhy/hUVI\nBEYwRDEeMBwEFmNvbS51YmlxdW4ubW9ub2t1cm9jYW0CAgG7MSIEIAk3HL9a8aFf\nPTzt9Cp7cixjxmyY7TCC9uL5kX1TqRXHMIGkoQgxBgIBAgIBA6IDAgEDowQCAgEA\npQUxAwIBBKoDAgEBv4N3AgUAv4U+AwIBAL+FQEwwSgQgylyB2gK43rsFT8YlE1p4\nM2mKmzIUjoou9hnrxiqy49gBAf8KAQAEIDfDzWO9ysRgU7ifmLdIQQCVK1ZESNF7\nKEF3YfeCYXBtv4VBBQIDApgQv4VCBQIDAxdyv4VOBgIEATUojb+FTwYCBAE1KI0w\nCgYIKoZIzj0EAwIDRwAwRAIgUVnj5PlCLR4MVRZpqgpPYOvHZOvlZmp9FhDp3Bay\n2jkCIHHjbxPvmnrx7kUqu2FquU8XuU6LszoUhLTpaZX8aRE4\n-----END CERTIFICATE-----\n",
              "-----BEGIN CERTIFICATE-----\nMIICjTCCAjKgAwIBAgIRAMW/G3x9sRTBMa06mdB1YN8wCgYIKoZIzj0EAwIwKTET\nMBEGA1UEChMKR29vZ2xlIExMQzESMBAGA1UEAxMJRHJvaWQgQ0EzMB4XDTI2MTAy\nNzE3MDg1NloXDTI2MTExMDA3NTY1MlowPzESMBAGA1UEChMJU3Ryb25nQm94MSkw\nJwYDVQQDEyBjNWJmMWI3YzdkYjExNGMxMzFhZDNhOTlkMDc1NjBkZjBZMBMGByqG\nSM49AgEGCCqGSM49AwEHA0IABN4YARSaqeoTqN5O+RCkUyRZU6t74ow1HHIgRhKX\neGY+uxQNU6qjflAZSGdlv+Df92qkF02EaL5FV95wX40YRhSjggEjMIIBHzAdBgNV\nHQ4EFgQUgw3c45N+ms5grXjglh2qLzGxjhcwHwYDVR0jBBgwFoAUWt3pDjmZ6Dg1\nP0Nam4oItq/kc98wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAgQwgbsG\nCisGAQQB1nkCAR4EgayjARhAA2ZHb29nbGUFpAFoQVBQUk9WRUQCeEAzN2MzY2Q2\nM2JkY2FjNDYwNTNiODlmOThiNzQ4NDEwMDk1MmI1NjQ0NDhkMTdiMjg0MTc3NjFm\nNzgyNjE3MDZkA2hBUFBST1ZFRAR4RGdvb2dsZS9tdXN0YW5nL211c3Rhbmc6MTcv\nQ1AzQS4yNjEwMDUuMDA1LzE2MjcxNDQ5OnVzZXIvcmVsZWFzZS1rZXlzMAoGCCqG\nSM49BAMCA0kAMEYCIQCveaniYusMz+5+C0IIyquLt6al0eck525AwKKRGT/PvgIh\nALZK84V6VN5GHx0pqZkPVUSjDFXh+WiWnqpxUlbHyOeg\n-----END CERTIFICATE-----\n",
              "-----BEGIN CERTIFICATE-----\nMIIC7jCCAnWgAwIBAgITbrsc9rQdPsAbTE35b+4d4VVZFzAKBggqhkjOPQQDAzAp\nMRMwEQYDVQQKEwpHb29nbGUgTExDMRIwEAYDVQQDEwlEcm9pZCBDQTIwHhcNMjYx\nMDI3MTMzMzA4WhcNMjcwMTA1MTMzMzA3WjApMRMwEQYDVQQKEwpHb29nbGUgTExD\nMRIwEAYDVQQDEwlEcm9pZCBDQTMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARR\n3AO3syc2jYzv4p88+YShU5ZuYcqkdfGYYyQH+o1rb7tEtDlbM48uRHyBwQlw1OZ7\nRBw035IXtGmi/e50Rh9Ao4IBejCCAXYwDgYDVR0PAQH/BAQDAgIEMA8GA1UdEwEB\n/wQFMAMBAf8wHQYDVR0OBBYEFFrd6Q45meg4NT9DWpuKCLav5HPfMB8GA1UdIwQY\nMBaAFPuU7nThtXAWlYmOhiIonUwP4cMdMIGNBggrBgEFBQcBAQSBgDB+MHwGCCsG\nAQUFBzAChnBodHRwOi8vcHJpdmF0ZWNhLWNvbnRlbnQtNjk5NGIwOWUtMDAwMC0y\nYjlkLWI2MDEtZDQzYTJjZmNmNTI3LnN0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vNGQz\nMDMxZjc1YjdjMjIwY2U1OTgvY2EuY3J0MIGCBgNVHR8EezB5MHegdaBzhnFodHRw\nOi8vcHJpdmF0ZWNhLWNvbnRlbnQtNjk5NGIwOWUtMDAwMC0yYjlkLWI2MDEtZDQz\nYTJjZmNmNTI3LnN0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vNGQzMDMxZjc1YjdjMjIw\nY2U1OTgvY3JsLmNybDAKBggqhkjOPQQDAwNnADBkAjADcZS20a5LI/tjk0L08okL\nheBCnA6xbjfhj4WcTF1xhMZMm5bJpeEDZAwz7vxobGUCMHeBnJLbX5tlsu9JNPbU\ncHm82+Z9Iiqz69w+wBMjGnnqxc1z/pj7zXvouj/kwq51Pg==\n-----END CERTIFICATE-----\n",
              "-----BEGIN CERTIFICATE-----\nMIICZDCCAeugAwIBAgIRAPLC/gLfzdARgeSj5rNpoowwCgYIKoZIzj0EAwMwUjEc\nMBoGA1UEAwwTS2V5IEF0dGVzdGF0aW9uIENBMTEQMA4GA1UECwwHQW5kcm9pZDET\nMBEGA1UECgwKR29vZ2xlIExMQzELMAkGA1UEBhMCVVMwHhcNMjYwMjA5MjAwMTEx\nWhcNMjkwMjA4MjAwMTExWjApMRMwEQYDVQQKEwpHb29nbGUgTExDMRIwEAYDVQQD\nEwlEcm9pZCBDQTIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATkwn4jOZw/zpxhsBn4\n27C8Xz684+3Ajq5zsIzXwYlQPGieyFBuNxkUUFSa4YzZObqTOrgI9iFcfTBqOuOl\nyEtIuipjVowV9UCddBKO5ndqPTEk8Dd2RWn4yMtUTnyMMpGjga0wgaowHwYDVR0j\nBBgwFoAUUjK7LPtGQ5vc1oGpDmVm4DRB6kAwDwYDVR0TAQH/BAUwAwEB/zAdBgNV\nHQ4EFgQU+5TudOG1cBaViY6GIiidTA/hwx0wDgYDVR0PAQH/BAQDAgEGMEcGA1Ud\nHwRAMD4wPKA6oDiGNmh0dHBzOi8vYW5kcm9pZC5nb29nbGVhcGlzLmNvbS9hdHRl\nc3RhdGlvbi9rZXlfY2ExLmNybDAKBggqhkjOPQQDAwNnADBkAjArwb7NmSVBlasM\ndMRjY0FFEum0b+SUZTMmvBT5AGYzk8xGCi2Mj2NZdchxZfxHUJgCMDseaiAzoixN\nISk40rfoR4vMvs7n9r4fgEgmb+9KQbpDgdq0+90mzcAL4vKr4hWSxA==\n-----END CERTIFICATE-----\n",
              "-----BEGIN CERTIFICATE-----\nMIICIjCCAaigAwIBAgIRAISp0Cl7DrWK5/8OgN52BgUwCgYIKoZIzj0EAwMwUjEc\nMBoGA1UEAwwTS2V5IEF0dGVzdGF0aW9uIENBMTEQMA4GA1UECwwHQW5kcm9pZDET\nMBEGA1UECgwKR29vZ2xlIExMQzELMAkGA1UEBhMCVVMwHhcNMjUwNzE3MjIzMjE4\nWhcNMzUwNzE1MjIzMjE4WjBSMRwwGgYDVQQDDBNLZXkgQXR0ZXN0YXRpb24gQ0Ex\nMRAwDgYDVQQLDAdBbmRyb2lkMRMwEQYDVQQKDApHb29nbGUgTExDMQswCQYDVQQG\nEwJVUzB2MBAGByqGSM49AgEGBSuBBAAiA2IABCPaI3FO3z5bBQo8cuiEas4HjqCt\nG/mLFfRT0MsIssPBEEU5Cfbt6sH5yOAxqEi5QagpU1yX4HwnGb7OtBYpDTB57uH5\nEczm34A5FNijV3s0/f0UPl7zbJcTx6xwqMIRq6NCMEAwDwYDVR0TAQH/BAUwAwEB\n/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFFIyuyz7RkOb3NaBqQ5lZuA0QepA\nMAoGCCqGSM49BAMDA2gAMGUCMETfjPO/HwqReR2CS7p0ZWoD/LHs6hDi422opifH\nEUaYLxwGlT9SLdjkVpz0UUOR5wIxAIoGyxGKRHVTpqpGRFiJtQEOOTp/+s1GcxeY\nuR2zh/80lQyu9vAFCj6E4AXc+osmRg==\n-----END CERTIFICATE-----\n"
            ],
            "challenge_sha256_base64": "BnlzXBaWbG7ORB8vnUIxMUfzMqD6TKfwXoIpiQJM784=",
            "device_make": "Google",
            "device_model": "Pixel 10 Pro XL",
            "hardware_clock_ms": 1793680832028,
            "hardware_signature_der_base64": "MEUCIQCn9ecg2Q7+MlS94127NWUFA+76di36Bu3wlDUPye2UkQIgH2aBJTmU3sGZ97R9r7wY/vKQ+VHixI1hzG7q1b1ijbA=",
            "is_strongbox": true,
            "security_level": "StrongBox"
          }
        }
      ],
      "signature_info": {
        "alg": "Es256",
        "issuer": "MonokuroCam Hardware Attested",
        "common_name": "Google Pixel 10 Pro XL Hardware Signer",
        "cert_serial_number": "4185279845883303885",
        "time": "2026-11-03T04:40:34+00:00"
      },
      "label": "urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c",
      "claim_version": 2
    }
  },
  "validation_status": [
    {
      "code": "signingCredential.untrusted",
      "url": "self#jumbf=/c2pa/urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c/c2pa.signature",
      "explanation": "signing certificate untrusted"
    }
  ],
  "validation_results": {
    "activeManifest": {
      "success": [
        {
          "code": "timeStamp.validated",
          "url": "self#jumbf=/c2pa/urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c/c2pa.signature",
          "explanation": "timestamp message digest matched: Sectigo Public Time Stamping Signer R37"
        },
        {
          "code": "claimSignature.insideValidity",
          "url": "self#jumbf=/c2pa/urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c/c2pa.signature",
          "explanation": "claim signature valid"
        },
        {
          "code": "claimSignature.validated",
          "url": "self#jumbf=/c2pa/urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c/c2pa.signature",
          "explanation": "claim signature valid"
        },
        {
          "code": "assertion.hashedURI.match",
          "url": "self#jumbf=/c2pa/urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c/c2pa.assertions/c2pa.thumbnail.claim",
          "explanation": "hashed uri matched: self#jumbf=c2pa.assertions/c2pa.thumbnail.claim"
        },
        {
          "code": "assertion.hashedURI.match",
          "url": "self#jumbf=/c2pa/urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c/c2pa.assertions/c2pa.actions.v2",
          "explanation": "hashed uri matched: self#jumbf=c2pa.assertions/c2pa.actions.v2"
        },
        {
          "code": "assertion.hashedURI.match",
          "url": "self#jumbf=/c2pa/urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c/c2pa.assertions/c2pa.hash.data",
          "explanation": "hashed uri matched: self#jumbf=c2pa.assertions/c2pa.hash.data"
        },
        {
          "code": "assertion.hashedURI.match",
          "url": "self#jumbf=/c2pa/urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c/c2pa.assertions/com.ubiqun.monokurocam.device",
          "explanation": "hashed uri matched: self#jumbf=c2pa.assertions/com.ubiqun.monokurocam.device"
        },
        {
          "code": "assertion.hashedURI.match",
          "url": "self#jumbf=/c2pa/urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c/c2pa.assertions/com.ubiqun.monokurocam.location",
          "explanation": "hashed uri matched: self#jumbf=c2pa.assertions/com.ubiqun.monokurocam.location"
        },
        {
          "code": "assertion.hashedURI.match",
          "url": "self#jumbf=/c2pa/urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c/c2pa.assertions/com.ubiqun.monokurocam.time_attestation",
          "explanation": "hashed uri matched: self#jumbf=c2pa.assertions/com.ubiqun.monokurocam.time_attestation"
        },
        {
          "code": "assertion.hashedURI.match",
          "url": "self#jumbf=/c2pa/urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c/c2pa.assertions/com.ubiqun.monokurocam.hardware_attestation",
          "explanation": "hashed uri matched: self#jumbf=c2pa.assertions/com.ubiqun.monokurocam.hardware_attestation"
        },
        {
          "code": "assertion.dataHash.match",
          "url": "self#jumbf=/c2pa/urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c/c2pa.assertions/c2pa.hash.data",
          "explanation": "data hash valid"
        }
      ],
      "informational": [
        {
          "code": "timeStamp.untrusted",
          "url": "self#jumbf=/c2pa/urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c/c2pa.signature",
          "explanation": "timestamp cert untrusted: Sectigo Public Time Stamping Signer R37"
        }
      ],
      "failure": [
        {
          "code": "signingCredential.untrusted",
          "url": "self#jumbf=/c2pa/urn:c2pa:7eed0c20-3726-4f9f-bd3f-538aa44c155c/c2pa.signature",
          "explanation": "signing certificate untrusted"
        }
      ]
    }
  },
  "validation_state": "Valid"
}