From 2676325184e5e58fccc6ab8bd12638aca73f505d Mon Sep 17 00:00:00 2001 From: test-user Date: Tue, 26 May 2026 18:00:16 -0700 Subject: [PATCH] feat(c2pa): expand soft-binding vendor map with registry-verified algs Adds Trufo, Overlai, MarkAny, Mentaport, LumaTrace, VerdaAI, ContentLens, ISCC (io.iscc content code), and Adobe ICN fingerprint to C2PA_SOFT_BINDINGS, and notes AIWatermark wraps Meta PixelSeal. All `alg` prefixes verified against the official c2pa-org/softbinding-algorithm-list registry. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/remove_ai_watermarks/noai/constants.py | 11 ++++++++++- tests/test_metadata.py | 3 +++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/remove_ai_watermarks/noai/constants.py b/src/remove_ai_watermarks/noai/constants.py index 0172b51..424fe0b 100644 --- a/src/remove_ai_watermarks/noai/constants.py +++ b/src/remove_ai_watermarks/noai/constants.py @@ -132,6 +132,7 @@ C2PA_AI_TOOLS = { # the rest (Digimarc, Imatag, Steg.AI, etc.) are proprietary oracle-only decoders. C2PA_SOFT_BINDINGS = { b"com.adobe.trustmark": "Adobe TrustMark", + b"com.adobe.icn": "Adobe (content fingerprint)", b"com.digimarc": "Digimarc", b"com.imatag.lamark": "Imatag (Lamark)", b"ai.steg": "Steg.AI", @@ -139,7 +140,15 @@ C2PA_SOFT_BINDINGS = { b"com.microsoft.wavmark": "Microsoft WavMark", b"com.verimatrix": "Verimatrix", b"com.nagra.nexguard": "NAGRA NexGuard", - b"com.aiwatermark": "AIWatermark", + b"com.aiwatermark": "AIWatermark (Meta PixelSeal)", + b"ai.trufo": "Trufo", + b"app.overlai": "Overlai", + b"com.markany": "MarkAny", + b"com.mentaport": "Mentaport", + b"es.lumatrace": "LumaTrace", + b"ai.verda": "VerdaAI", + b"ai.contentlens": "ContentLens", + b"io.iscc": "ISCC (content code)", } # Lowercased substrings that mark an AI generator when found in an EXIF diff --git a/tests/test_metadata.py b/tests/test_metadata.py index 7904533..8904451 100644 --- a/tests/test_metadata.py +++ b/tests/test_metadata.py @@ -579,6 +579,9 @@ class TestSoftBinding: assert soft_binding_vendors_in(b"...alg...com.adobe.trustmark.P...") == ["Adobe TrustMark"] assert soft_binding_vendors_in(b"com.digimarc.validate.1") == ["Digimarc"] assert soft_binding_vendors_in(b"ai.steg.api blah") == ["Steg.AI"] + # Registry-verified vendors added in v0.6.x. + assert soft_binding_vendors_in(b"ai.trufo.gen1.image") == ["Trufo"] + assert soft_binding_vendors_in(b"io.iscc.v0") == ["ISCC (content code)"] def test_vendors_in_empty_when_absent(self): from remove_ai_watermarks.noai.c2pa import soft_binding_vendors_in