From 2d0e330baf9a6fbd2b993ecc4cee8c4b519c00c8 Mon Sep 17 00:00:00 2001 From: maurice Date: Mon, 9 Nov 2026 09:48:44 +0100 Subject: [PATCH] SPEC-045 Amendment 5: rebuild the expired rogue fixture --- NOTES.md | 1 + notes/step-78-expired-rogue-fixture.md | 51 ++++++++++++++++++ ...-045-ingredients-with-their-own-verdict.md | 24 ++++++++- tests/Fixtures/spec045-c2patool027-rogue.png | Bin 127910 -> 121290 bytes tests/Unit/Reading/IngredientsTest.php | 9 ++++ 5 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 notes/step-78-expired-rogue-fixture.md diff --git a/NOTES.md b/NOTES.md index a488fef..8e80a38 100644 --- a/NOTES.md +++ b/NOTES.md @@ -132,3 +132,4 @@ Follow these before searching; most questions are already answered in one step. | **75** | 2026-10-22 | [c2patool's own `--allowed_list` confers no trust, reported upstream](notes/step-75-c2patool-allowed-list-reported-upstream.md) | | **76** | 2026-11-02 | [c2pa-node 0.9.11 not taken, and an audit step red for a week](notes/step-76-c2pa-node-0-9-11-not-taken-and-a-red-audit-step.md) | | **77** | 2026-11-02 | [SPEC-029 Amendment 1, and a gap in `REQUIRE_AI_MARKING`](notes/step-77-spec-029-am1-and-a-policy-gap.md) | +| **78** | 2026-11-09 | [An expired rogue fixture that kept passing (SPEC-045 Amendment 5)](notes/step-78-expired-rogue-fixture.md) | diff --git a/notes/step-78-expired-rogue-fixture.md b/notes/step-78-expired-rogue-fixture.md new file mode 100644 index 0000000..a5fec7b --- /dev/null +++ b/notes/step-78-expired-rogue-fixture.md @@ -0,0 +1,51 @@ +# Step 78 — An expired rogue fixture that kept passing (2026-11-09) + +SPEC-045 Amendment 5, test only. No code changes, no release. + +## What happened + +`tests/Fixtures/spec045-c2patool027-rogue.png` holds an AI original signed by +a rogue CA (*Rogue Root*, *Rogue Signer*), re-signed once with c2patool +0.27.22 and the C2PA test signer. Both rogue certificates were valid for 30 +days: 2026-10-10 06:38:52 to **2026-11-09 06:38:52 UTC**. The outer signature +has no time-stamp. + +From that moment the file reads `Invalid` (`signingCredential.expired`) on +both readers, instead of a trusted file over an untrusted ingredient +(measured with `certs/c2pa-trust.settings.json`): + +| File | Outer | Ingredient | +|---|---|---| +| expired fixture | `Invalid`, not trusted | not trusted | +| rebuild | `Trusted` | not trusted | + +AC3's table row (`'c2patool 0.27 rogue' => [false]`) checks only the +ingredient, and under Amendment 2 nothing below an untrusted report is +trusted. So the row stayed green: it passed for a reason it was not written +for. Nothing here noticed. + +The Drupal module had copied the file and asserts the log line, which names +the outer verdict. Its CI went red on its 1.0.0-alpha5 release commit, the +morning the certificate expired (content_credentials #3636349, its NOTES +Step 67). + +## The fix + +- The fixture is the module's rebuild, byte for byte: a new P-256 rogue CA + and signer valid to 2036-11-05, an AI original + (`trainedAlgorithmicMedia`) signed by it, re-signed with c2patool 0.27.22 + and `certs/es256_*`, no time-stamp. The recipe and keys are kept in the + module's development notes. +- A new test, "keeps a trusted file trusted over its untrusted ingredient" + (verifier, extension), pins the precondition the row relies on. Run red on + the expired file (2 failed), green on the rebuild. +- `composer check`: 530 passed, 7 skipped. + +## Still open + +- The rebuilt file expires with the C2PA test signer on **2030-08-26** + (outer signature, no time-stamp). Accepted. +- The other rogue fixtures (`spec045-c2pasign-rogue.png`, same expired chain; + `spec045-graft.png`, to 2027) are expected untrusted either way; their rows + do not depend on the rogue certificate's dates. +- No guard for fixture certificate expiry in general. diff --git a/specs/SPEC-045-ingredients-with-their-own-verdict.md b/specs/SPEC-045-ingredients-with-their-own-verdict.md index 8e56a5a..67c10fe 100644 --- a/specs/SPEC-045-ingredients-with-their-own-verdict.md +++ b/specs/SPEC-045-ingredients-with-their-own-verdict.md @@ -285,6 +285,24 @@ to. level trusted, and the integration comparison includes that file. - The tested verifier range moves to `^0.6.1` (SPEC-042 Amendment 5). +## Amendment 5 — a rogue fixture that is still what its row says (approved 2026-11-09) + +Test only; no code changes. `spec045-c2patool027-rogue.png` carried a rogue CA +and signer valid for 30 days, until 2026-11-09 06:38:52 UTC. Since then the +file reads `Invalid` (`signingCredential.expired`, no time-stamp) instead of a +trusted file over an untrusted ingredient. AC3's table row still passed, +because under Amendment 2 nothing below an untrusted report is trusted, so it +kept passing for a reason it was not written for. The module, which copied +the file, went red on it (content_credentials #3636349). + +- The fixture is replaced by the module's rebuild: the same construction with + a rogue CA and signer valid to 2036-11-05, re-signed with c2patool 0.27.22 and + the C2PA test signer, without a time-stamp. It expires with the test signer + on 2030-08-26. +- A new test pins the precondition the row relies on: the file itself is + trusted and its ingredient is not, on every route. It was watched failing + on the expired file. + ## Open questions Resolved at approval (maintainer, 2026-10-10): @@ -302,7 +320,7 @@ Resolved at approval (maintainer, 2026-10-10): |----------------------|-----------------------------|----------------------| | AC1 | `tests/Unit/Reading/IngredientsTest.php` :: "reports the AI origin two ingredients down a C2PA Sign chain" (verifier, extension) | `src/Core/Reading/ManifestStoreParser.php` `parseIngredients()`; `src/Core/Reading/IngredientReport.php`; `src/Core/Reading/ManifestReport.php` `ingredients()` | | AC2 | `tests/Integration/IngredientEquivalenceTest.php` :: "reports the same ingredients through the service and the verifier", "reports the same ingredients through the service and ext-c2pa"; `tests/Integration/ServiceHarness.php` `accessors()` / `ingredientTree()` (so the SPEC-019 and SPEC-042 comparisons cover it); `tests/Unit/Reading/IngredientsTest.php` :: "reads a logo-bearing C2PA Sign chain through the verifier as c2pa-rs does" (Amendment 4, replacing the pinned exception), "trusts the same logo-bearing ingredient through c2pa-rs" | `src/Core/Reading/ManifestStoreParser.php` `ingredientDeltas()` | -| AC3 | `tests/Unit/Reading/IngredientsTest.php` :: "gives each ingredient the verdict of the SPEC-045 table" (5 files × verifier, extension), "trusts a synthetic ingredient only when every AC3 condition holds" (7 cases), "keeps the relationship verbatim"; Amendment 1: "trusts the good synthetic chain when the writer recorded only allowed codes", "trusts no ingredient once a writer recorded a failure code anywhere" (6 cases), "looks for recorded codes in every manifest of the store, not only the active one"; Amendment 2: "trusts no ingredient of a report that is not trusted", "trusts no grandchild of an untrusted ingredient", "trusts a grandchild when every link above it is trusted", "counts neither of two deltas under the same key" (2 orders), "counts an unreadable failure in a delta as a failure" (4 cases, `null` from the second review), "counts a malformed delta as one of two under the same key" (2 cases), "reads a large writer record in bounded time", and the `graft` row of the table test; Amendment 3: "treats keys that differ only in the leading slash as one key" (2 orders), "still finds a delta written in the relative form", "trusts neither of two ingredient entries that share a label" | `src/Core/Reading/ManifestStoreParser.php` `ingredientTrusted()`, `recordedByWriter()`; Amendment 1: `RECORDABLE_CODES`, `recordsHideNothing()`; Amendment 2: `fromArray()` (the report's trust as the first link), `parseIngredients()` `$aboveTrusted`, `recordHidesNothing()`, `ingredientDeltas()`; Amendment 3: `normalisedUri()`, `parseIngredients()` `$labelCounts` | +| AC3 | `tests/Unit/Reading/IngredientsTest.php` :: "gives each ingredient the verdict of the SPEC-045 table" (5 files × verifier, extension), "trusts a synthetic ingredient only when every AC3 condition holds" (7 cases), "keeps the relationship verbatim"; Amendment 1: "trusts the good synthetic chain when the writer recorded only allowed codes", "trusts no ingredient once a writer recorded a failure code anywhere" (6 cases), "looks for recorded codes in every manifest of the store, not only the active one"; Amendment 2: "trusts no ingredient of a report that is not trusted", "trusts no grandchild of an untrusted ingredient", "trusts a grandchild when every link above it is trusted", "counts neither of two deltas under the same key" (2 orders), "counts an unreadable failure in a delta as a failure" (4 cases, `null` from the second review), "counts a malformed delta as one of two under the same key" (2 cases), "reads a large writer record in bounded time", and the `graft` row of the table test; Amendment 3: "treats keys that differ only in the leading slash as one key" (2 orders), "still finds a delta written in the relative form", "trusts neither of two ingredient entries that share a label"; Amendment 5: "keeps a trusted file trusted over its untrusted ingredient" (verifier, extension) | `src/Core/Reading/ManifestStoreParser.php` `ingredientTrusted()`, `recordedByWriter()`; Amendment 1: `RECORDABLE_CODES`, `recordsHideNothing()`; Amendment 2: `fromArray()` (the report's trust as the first link), `parseIngredients()` `$aboveTrusted`, `recordHidesNothing()`, `ingredientDeltas()`; Amendment 3: `normalisedUri()`, `parseIngredients()` `$labelCounts` | | AC4 | `tests/Unit/Reading/IngredientsTest.php` :: "does not trust any ingredient when the reader has no anchors", "does not trust an ingredient without a manifest, or without its own delta", "does not trust an ingredient without a manifest even under a good delta" | `src/Core/Reading/ManifestStoreParser.php` `parseIngredients()`, `ingredientTrusted()` | | AC5 | `tests/Unit/Reading/IngredientsTest.php` :: "stops at a manifest that names itself", "stops at a cycle through an ancestor", "reports an ingredient naming a label that is not in the store as having no manifest", "reports no deeper than depth 8", "reports no more than 64 ingredients in total", "shares the 64 budget across a deep and wide tree" | `src/Core/Reading/ManifestStoreParser.php` `MAX_INGREDIENT_DEPTH`, `MAX_INGREDIENTS`, `parseIngredients()` | | AC6 | `tests/Unit/Reading/IngredientsTest.php` :: "degrades malformed ingredient data instead of throwing" (5 cases), "treats an ingredient with a non-string relationship as having none, and still judges it", "reports no ingredients for an empty report" | `src/Core/Reading/ManifestStoreParser.php` `parseIngredients()`, `codesIn()`, `ingredientDeltas()` | @@ -336,3 +354,7 @@ Amendment 4 (verifier 0.6.1): the pinned logo test turned red on 0.6.1 as designed and was replaced by an agreement test; the logo fixture joined the integration comparison (`c2pasign logo`). `composer check` 519 passed; integration against the local service with trust settings 214 passed. + +Amendment 5 (expired rogue fixture): the new precondition test was run red +on the expired `spec045-c2patool027-rogue.png` (2 failed: verifier, +extension) and green on the rebuild; the SPEC-045 group 80 passed. diff --git a/tests/Fixtures/spec045-c2patool027-rogue.png b/tests/Fixtures/spec045-c2patool027-rogue.png index 61b516b218d8875f1ca04235bc5fcd1b3b2c46c9..70bbb90caea2a038b7fdfeb01851bac9ba38ed76 100644 GIT binary patch literal 121290 zcmeHQ30xCb{-4Ro5flU!5j2PjQW7RZfWTJe5<%;U7xu7|$s`#J3FZLW>MCfx>QU_B z(b_7Ywzh8T)%#HEQMIkbT8p~>?$)baxBV2Wb$c%VH%SC+)j(U9%=8yO7?^o8@BO~- z_ulV%@BJ2y9X&iGC@KiUu#m!nyzv+&LcfZz0PgF7sN5|Wel(P(a;9+KC9YCEy4(kS z8)&kO!osl7IT*GX(>*am?7o0u&qjMo4fm8Py|$FgZq4LMW-_TMh7?l6s3=mWQE7D~ zsnU~rMwP-CQqv6DwDfeH4%Johr1y1$Jg=i1zp7MCIUJ1L$=a+A^nmMA?*sYV16hX^ z4Eq|I= zT7a%c=#2(F#+FhhCb^`HF>y7_)UyVCb7S*AvCt9uh4~ncu)@(lta%p}79hbSm>3Vk zL}9o%3~xS#W%X{gUFM zqZ85xB@r5}R@*l|W3Z0AU7eyOxtHL9fq{x(MPx`wBpDkWOLq9vycg?>+9}1|AC6}3 zgNwuxsZ1Ua7!-^O>*_ab-1N+|o40M>vGb*uUwQSl zJ@4$@xBtMq2M-$mO>j7u5c)Ln0H2Q0=7;h%rBf(2$wi_ zujLB4`w)c>?-3?vdWW3w8MNj>ECL&gXGsP6RX_=rG&f;8<_o&}vZVd0g+0TR^5tx3CVl2KG(`3ou(v6Uq z3RWerT_U*Pbv_WO{I;nDZ&eDNK^N!VNO*u`y`GK%IwZdx@xpi13SH-`2S+WxeegmT zsSruvc_c;P3@SSIsK6by5J}*-+XEsAy!Nw?#R~+w4(aM@kCG7(Nq|VgpC|+Ykp!N* zJs^_6caaKi4{&?-~p<_!EAda9JPME`~o5gz@YxjprT_- z_$|YIy2*teOowfGJl{05LfE^WuzKO{ID~C^JhvaXsRN%;K*27A4(!JW$`bhEgTic{ zE3G~@c*Bx!fA+$*gZIFyYzIjGTtw*W(@xieNbSfL#~`p$eH!xqd^nQu_awmKG5+kv z^KD{-&IdZ553`_i0TMie7Qp#w{9bYkIvVI`e!VIlA_<_Q`PKwGQOpb8?NO5rkpze& zw2ncDB>1xzwjK76z-KHRA_+WaP=Q;OSUn+tB?dRKn_ycWzt zP-6t|SOp!8-$PLF3@UIP4Hi&#@IY%=?EyNUe_J)M+5<#ts~6LUg4r1X1%c~)qSFvb z=unOb!S6{BxDF|9K7mqu9`a^)&331Q)!XcC)4_VOyHd0}7p%IR z;F920)iMqzWp_r#8ZC^~YYMx(Nnva&{0gr+Peqr*&*DBmtu(-fuk zenalQ?gypyuc_YN^kmJC#LEuxfAeRqNWM2??b*Y+yXZ2?z$L}?enj_qNr-ooK+=}B zo#9Rh>`Ace=?c*ZuBDqwSSxCtm1YX_Dw8Tp%Q9KkkeRC0FoaI4QIRPcy-J&IAXFLY z8d_ycO`{2hHfkt>a=MfCPBSr9#!fkH_GzruXsdHmHr;MBxfoTM-KJ+u<&2%ffhN?N z3e-Jn+Gce!Rww0hn$=wIPP02qggS#zlO*e4O;*b3vNM&V9E`;n=SFC7GFL3QL#c}0 zkEmN-XZLc@wAS3jRkgIsZmAs9rXDx1wU+R_qovcmo$^HT|9xmy#HCL>a4C4~)&bc& zj!rN6darh$Wv8kyle#Ogp30}s#PEzQW zu0YJHUdVCY(Rsz=%6|{VQN{&oc|(HDCE& z{`H8WlSGg#AaQ=d2ZJSI5uwubAR=VqiIN~i$as$1loQYxQs!oB!ig~Mx>yn9xjx=z za}s@ehLC9*4Us|UhzxD|)Se+J+@Go5KZ$rvcOu;LI)&%4BE*V}UDJh7c-|&;UnYuC zF}b@HBHY^?F)kP9V3I`Xq|40>Jue>l^7yi!@={Yjt`(16({t9+HQT6nsnRd!^b0)p zexYc1?31R?V;-J8dhlChQ_|yozkTx`qYQ`l-5xQz&P6!fmBobPc(X)AU_=*Gbxc?8 zFGR9@j=P0110)I#iQ8njR4Nxsh#0O=7fBCE#Flvz8}5GZ`J!?1k*A}MUEWwZ=!pqL zU+#9CB$DVcCt~%qE8AvtTU5mb7%@x~i#?T=RMC!<&=^rOMSmeA3-`CUsChkur38`-dR?7`g*eAu?`Kd493uJ&jL z8RW+O`f%Z$y#lv|-nrr39c8nmF?D$T+PD7N?WyU(=RSToEAn&Q0nx6;%|p+PeQL;- zdBIwPWauj!3!|%xPLFyfsqp;$@1L&AA+m_BTrar$RZ5`T*v;2=EiP-*i#|JPI7Z}& zlqj>v*sPM6%NaLVcdh!y`CB;Qp%3rIlEam@-HVwR@~K4 zb6?4S@2+29x-e$+ndQcfjorrVUeC#o;=~2mk_r03ZMe z00MvjAOHve0)PM@00;mAfB+x>2mk_r03ZMe00MvjAOHve0)PM@00;mAfB+x>2mk`N z3V|zAvI6hzv0GMfY0thV_MBL9`N5P29y{}q<9y!a*s&9X?=Jhxn|G~$azKK7;}`YI z=uh+K-M;#br6F@~-%-=lC27G=e;cvIg5e1tc-O5D_pDnlrLNg9(X!#dV5Cy?niRDC zfh4plEtR2D={1B-MQim2EkV*cDkBXM`mNmixdG(`#?VTK-OUe z`TF95wVQ$yk6)gh%X)Ut{9;Q0ho^fBP4{LU*--La%wuV}la5p^n~JVS=#2(F#+Fhh zCb^`HF>y7_)UyVCb7S*AvCt9uh4~mR!Y~~D!))SS}VI zlgVY$0J&Tq7#I+whzL;x2P=AY3-1~c6V!&fkDBj zz|K%igp0)@iC8L?NYLF`=sqS1lXi>MWXrBFL(m^#O4?TX%OK-_X=QMQ^VT z4C>J{vRBlAf$<5061Aym>AH-}+`M7=!wU*W6it{oY4VifskDJHn#^p8!|5uosJ!p~ zx$_>JzhL2_#Va0p^s&cRu3EjOwyu7|#!b&WyLsF89Xnro`IT2++w;!eeftl*d+^ZF zkB)tO{FBBLCqFxV=IpuipMUYM3m3n+botvW|M~9wA2_;jg!t9Zb?HLgfs4?Be~Fx< z3l~*zgojC_u^L&o>~V5xMtDE6Dj*`KX8qRPfpID0o4V`m4M9EnYd;%skt5AbS^Eg9 z{!Ns%5Y|f9NlYQe5gUoau%Xz27mgk|lEd>HZ#U0fApA3g;OOL=90BJ4ham``LE*py zIPk!)4?O5sEo>23k}vS2f=YfTKe)LDgQT0_^AJY}oIwSCq>A9rdE6NXGmL+qs^w!2 z-4{DQ0qfvVa*DC|pElzF9G&d{mgCLLUR>}xABa@2D*f836gq=0&iykBNKKZkg9-)c zkUSTutb*SJ+)Q6^-xGQyp&qgkNd54<+4eU{=pq%;W$-**h`p;M=b-#foSBmvXU>44`4A_@HV8bBn0 z-+p#T!q^!(bbRVL9WitTZdKwCN$A+p1c)T?T%k7cw+#2`MiP23UGRGngudEig|K%$VfFkDg!q(SJLU^K7Ay2^c{2*A zKkfd4jxV3o&k=kc;=*j7gPzyEOu^4sU{(6F&EZ=g00!mt{4!Q_x*kO8I&nn1BlJOF zrTR4FfA^Z7TUY}e9>Z^e1HpNI3ml|UfX>J7At-pAuV9a`Pd9>KI?sdY5J}+q0EI{b zh(O=Yl}^<31g@irPS<2ZB%vd2k1TULnORq~ zmvW~$RE55mT=40>l>ZY|;?~Q88`U6q*Ciax?$;Bf&yc9lqk(X!roRUVd~C#pgW21? z?c05PJFEcXH^alh?EJR5UZk)e&NBB6UsVxLRl6Z%nmb_KO3F`SK48H znqQlY?eM4woIxSQYe!Eg6Z(>Gfv-jpzLg4x$AF{OucfZQMJnige$9RD(D?*@NT={c zAn0hkj+F?XK_QX=I+|ZgNrCHVa4>sE-5wB0fEf#BtWFH43H`u8!3XCBZdGEC;+5x1 zw88W5Z%gVrXvKr)A9OU((LhJLWea{lN8|Y!x3GY+g9|7jlF&gN-)xV_N4vQ5104-=xoT4nNb)fkL8} zYoIfYHhU?$!TNe3?mU(Go44v7iUX;VZ*txc=&6LB;7$%M{RHHti&F)s+{YOC6Qia0< z9aoVW^(xgCy2`WO~4f!opwZ7}>cxVCA%?t$`S9AvF**I2I zawK_%Ybk5>&O=asB$_ulY^NxfZLdshnm#GY5t|hlNc(wBRmuV+|*1 z*PFbBt7?s&-=@3UY%61|jG+WcUaFLFGIq!M>8&E%QRSgj<%`nRN08L_k~k}O%r5#V z>%dcoPrY#0mbrCbZ%ZtW4cpx`@-Tih_p95MpqB0P>JwQvCXwS8_ngo|;m*zHcWzf^ zHD(-{w`fn&&~xaK^Me@BFYtJ6m-9?vCh61iNo{u=) zOGLbz2$Ht6Rf@!JkloyjW=`~kIKZv z(y1vKsOQ}8nr1@1W~ZDs`!sHbs&i9@bSZ95P?gzjdd5_a`Vv7w6KYL`&2CcDHmeiO zQIyMRR&$M-W_Oqfbq1j(Nw!5vxtTs>Fj6UcO$x0tk_2iUm7znk2cc8ZTD?I_khG4< zNc)98WT)*6nwAXHTBi4_95u)nN4503mz%IC`sbr^d_eGozxG>|(zVoVsCwsO{)I0` zEhwHq*w5n*6Xi5BXdZ4;*E|pRCi|+Zb)34v_14&>-@i?-ZLgFbx#QK#q)U}{=RcOo z25vkX^pjcn_o{-~b8r15a0>^Y=hcb6kZGM@yr9fDyrPn?DvkCX-1m6lXY4cyWM7TF)9yBG6pr$;M)u}3?sN{O^*gdf_KuqH2jImH(J-=?G6t5Dx8rR#rxHEfi|EM}3|55Zj~TC=Fsx`o z;ppMh#*DtBSQAO~;BJW(U9WjEH=F3wGlV3GG!3EAY16dC)Se+J1fe6-ynhl^bFQ|q zoz3k_#CV$9qqVt39t}mAi?oEBH8X}0rp6xUt~@lV_kW@nlI19 zSMECMMAt-t#UJ2iJ`Sr1v z$6VGAP7{fg+OEXry((#7x5j5pc^BST{@t4RXAXuw)vv$m(AgbH*!E(P6>(w-`swQB z##v>bM9+RL>ch0GtjUcJ9XzpUKj~^)HBr&Q-i;z6xgH8qgthi=JNPfujUVDaxwr6* z_%6ML@BC|++?WUNW8&t%K0UkthBU1B(tBO&O@AGu-yAkDP_!hY&!RIsYzwIQOYhJH zCa+Nq9enV%`oS5OqTUHTO}<&-sucY#RQ*mJO;AMF79NxmV#H+EvKv0X4ZB^Jo7%G5 zJ*!`t|5;`46O+47bz$RQ8r0?RGfUd`xwsG`@fnZNpE4~;s9YJ6 zrN%E+4_H~=hq<%iVht+t@vz3JpM;4M&lF+%H_>-|^QYL6YQwf37uHVd-F=tr$!~J{_ld+KMkX)V_4nO(5C07sWd+3!4C}I&`@tW(txIpTv-sY^yzB{;Pk!~u*05d5&|NRaANZ$b^!{}( zYOC&iA)^BO;`@8#SkwM{&S2Q$Xe{edF}Bc-VdJ`B%0oDomx0YmkYk}}S5Yn81Q37| mU^u{>023ofhgK2!^XZ>tOUA5UwuRFW3Wtr(`&-Vv)&CDl^y0Gs literal 127910 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 C#Tc3Z diff --git a/tests/Unit/Reading/IngredientsTest.php b/tests/Unit/Reading/IngredientsTest.php index 332bb55..60fc8a4 100644 --- a/tests/Unit/Reading/IngredientsTest.php +++ b/tests/Unit/Reading/IngredientsTest.php @@ -266,6 +266,15 @@ function spec045GoodDelta(string $in, string $ingredientLabel = 'c2pa.ingredient 'c2pa-rs CIE-sig-CA' => ['spec045-c2pa-rs-CIE-sig-CA.jpg', [false, false]], ])->group('SPEC-045'); +// Amendment 5: the rogue row above is only worth having while the file itself +// is trusted; an expired fixture made it pass for another reason. +it('keeps a trusted file trusted over its untrusted ingredient', function (string $route) { + $report = spec045Read($route, 'spec045-c2patool027-rogue.png'); + + expect($report->isTrusted())->toBeTrue() + ->and($report->ingredients()[0]->isTrusted())->toBeFalse(); +})->with(spec045Routes())->group('SPEC-045'); + it('keeps the relationship verbatim', function () { $report = spec045Read('verifier', 'spec045-c2pa-rs-CIE-sig-CA.jpg');