diff --git a/data/fixtures/README.md b/data/fixtures/README.md index c71559f..47176b6 100644 --- a/data/fixtures/README.md +++ b/data/fixtures/README.md @@ -13,3 +13,23 @@ example from [`adobe/trustmark`](https://github.com/adobe/trustmark) at commit - SHA-256: `e58c5825ed7e5d9fb04710ea541b61bd55879cad65554c0d46260aa24b3d0755` - Expected signal: TrustMark Variant P, schema 1 - License: MIT, reproduced in `../licenses/adobe-trustmark-MIT.txt` + + +## Ideogram C2PA attribution + +`ideogram-c2pa.png` is a SYNTHETIC signed manifest, not a vendor download: a +64x64 flat PNG carrying a C2PA claim (`trainedAlgorithmicMedia`, +`claim_generator "Ideogram/3.0"`) signed by a throwaway test CA whose leaf +certificate subject is `O=Ideogram, Inc, CN=Ideogram, Inc`. It exercises the +issuer-to-platform ATTRIBUTION path end to end through the real reader; the +signer is deliberately untrusted (no trust anchors ship), which is also the +fixture's second assertion: attribution and signer trust are separate +dimensions. + +- Expected signal: C2PA, platform `Ideogram`, `ai_from_metadata` True +- Expected signer: `untrusted` (test CA; attribution must not imply trust) +- Recipe (no keys are committed): create a CA and an ES256 leaf with + `digitalSignature` key usage and subject `CN=Ideogram, Inc`, then + `c2pa.Builder.from_json(...).sign_file(png, out, Signer.from_info( + C2paSignerInfo(b"es256", leaf_pem + ca_pem, pkcs8_key, None)))`. +- No user upload and no Ideogram artifact contributes pixels or bytes. diff --git a/data/fixtures/provenance/ideogram-c2pa.png b/data/fixtures/provenance/ideogram-c2pa.png new file mode 100644 index 0000000..d3d47d0 Binary files /dev/null and b/data/fixtures/provenance/ideogram-c2pa.png differ diff --git a/tests/test_identify.py b/tests/test_identify.py index 4b1d002..e1156b0 100644 --- a/tests/test_identify.py +++ b/tests/test_identify.py @@ -1489,6 +1489,18 @@ class TestVendorOf: assert _vendor_of("Eleven Labs Inc.") == "ElevenLabs" assert _vendor_of("Ideogram") == "Ideogram" + def test_ideogram_fixture_attributed_end_to_end(self): + # Committed synthetic manifest signed by a test CA with CN "Ideogram, Inc": + # attribution must name the platform while signer trust stays untrusted. + # Reachability against the fixture, not a synthesized status set. + fixture = Path(__file__).resolve().parents[1] / "data" / "fixtures" / "provenance" / "ideogram-c2pa.png" + if not fixture.exists(): # the sdist ships no data/ + pytest.skip("provenance fixture not present") + report = identify(fixture, check_visible=False, check_invisible=False) + assert report.ai_from_metadata is True + assert report.platform == "Ideogram" + assert any("Ideogram" in w for w in report.watermarks) + def test_ideogram_issuer_attributed(self): # Corpus evidence 2026-08-08: four uploads signed "Ideogram, Inc" read as # unknown-signer C2PA with no platform. The issuer token is the org prefix.