@@ -1139,6 +1139,51 @@ caller can apply the separate gateway trust policy allowed by [FEP-ef61].
11391139embedded portable object needs its own verification; success for an outer
11401140activity does not authenticate portable objects nested inside it.
11411141
1142+ [ FEP-8b32 ] : https://w3id.org/fep/8b32
1143+ [ FEP-ef61 ] : https://w3id.org/fep/ef61
1144+ [ FEP-fe34 ] : https://w3id.org/fep/fe34
1145+
1146+ ### Compound portable objects
1147+
1148+ For compound documents containing [ FEP-ef61] portable objects, Fedify inboxes
1149+ use a bounded, map-local interoperability profile. Neither [ FEP-8b32] nor
1150+ Verifiable Credential Data Integrity currently specifies this compound-document
1151+ algorithm.
1152+
1153+ The profile treats each JSON map with a direct literal ` proof ` property as a
1154+ separate secured document. Verification removes only that map's ` proof ` and
1155+ leaves proofs on descendant maps in place. Replacing a valid child proof
1156+ therefore invalidates an outer proof that covered the original secured child.
1157+ Fedify requires a direct proof. It does not treat proof aliases, sets, chains,
1158+ or remote references as alternatives.
1159+
1160+ Every embedded portable map needs one direct inline proof and its own explicit
1161+ ` @context ` . Fedify verifies each map against an immutable copy of the received
1162+ JSON and applies the FEP-ef61 portable-ID and controlling-DID policy to that
1163+ map. It does not copy a parent's context into a child, try several
1164+ proof-removal rules, or fetch an unpinned context from the live network.
1165+ Inputs that exceed the traversal limits are rejected. Fedify does not return
1166+ authentication results for only part of a compound document.
1167+
1168+ This profile authenticates JSON snapshots. A child proof may be valid when
1169+ verified in isolation even if the parent's active context causes the embedded
1170+ JSON-LD to expand differently. Proof success does not establish that the
1171+ isolated and embedded expansions are equivalent.
1172+
1173+ > [ !WARNING]
1174+ > Typed vocabulary serialization can change the secured representation of a
1175+ > signed embedded object. Signing a typed child, assigning it to a typed
1176+ > parent, and serializing the parent can remove the child's document and proof
1177+ > contexts while retaining its ` proofValue ` . Do not serialize a signed typed
1178+ > child through a typed parent when producing a map-local compound document.
1179+ > The profile also accepts exactly one direct proof per map, while Fedify's
1180+ > ordinary activity signer creates one proof for each Ed25519 key. A sender
1181+ > producing a portable compound document must arrange for exactly one direct
1182+ > proof on each map.
1183+ > When forwarding an already signed payload, use
1184+ > [ ` forwardActivity() ` ] ( ./outbox.md#federating-posted-activities ) to avoid a
1185+ > vocabulary-object round trip.
1186+
11421187> [ !TIP]
11431188> HTTPS Signatures, Linked Data Signatures, and Object Integrity Proofs can
11441189> coexist in an application and be used together for maximum compatibility.
@@ -1154,10 +1199,6 @@ activity does not authenticate portable objects nested inside it.
11541199> Proofs simultaneously, you need to generate both RSA-PKCS #1 -v1.5 and Ed25519
11551200> key pairs for each actor, and store them in the database.
11561201
1157- [ FEP-8b32 ] : https://w3id.org/fep/8b32
1158- [ FEP-ef61 ] : https://w3id.org/fep/ef61
1159- [ FEP-fe34 ] : https://w3id.org/fep/fe34
1160-
11611202
11621203Activity transformers
11631204---------------------
0 commit comments