@fedify/fedify 2.4.0-dev.2247 → 2.4.0-dev.2256
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{builder-h6Su-vmu.mjs → builder-DvSQqk2l.mjs} +2 -2
- package/dist/compat/transformers.test.mjs +1 -1
- package/dist/{compound-proof-Bw0EpfSI.mjs → compound-proof-5bg_j_ye.mjs} +2 -2
- package/dist/{deno-B3jtacWP.mjs → deno-AmcRMq5z.mjs} +1 -1
- package/dist/{docloader-wBsCwntT.mjs → docloader-CIP_SG39.mjs} +2 -2
- package/dist/federation/builder.test.mjs +1 -1
- package/dist/federation/compound-fanout.test.mjs +3 -3
- package/dist/federation/handler-compound-proof.test.mjs +3 -3
- package/dist/federation/handler.test.mjs +5 -5
- package/dist/federation/hashlink-media.test.mjs +2 -2
- package/dist/federation/idempotency.test.mjs +2 -2
- package/dist/federation/metrics.test.mjs +1 -1
- package/dist/federation/middleware.test.mjs +7 -7
- package/dist/federation/mod.cjs +1 -1
- package/dist/federation/mod.js +1 -1
- package/dist/federation/outgoing-proof.test.mjs +5 -5
- package/dist/federation/portable-actor.test.mjs +3 -3
- package/dist/federation/portable-chain.test.mjs +3 -3
- package/dist/federation/portable-collection.test.mjs +4 -4
- package/dist/federation/portable-delivery.test.mjs +2 -2
- package/dist/federation/portable-gateway-keys.test.mjs +4 -4
- package/dist/federation/portable-inbox.test.mjs +4 -4
- package/dist/federation/portable-parse-uri.test.mjs +1 -1
- package/dist/federation/portable-route-activity.test.mjs +2 -2
- package/dist/federation/portable.test.mjs +3 -3
- package/dist/federation/send.test.mjs +3 -3
- package/dist/federation/tasks/enqueue.test.mjs +1 -1
- package/dist/federation/tasks/tasks.test.mjs +2 -2
- package/dist/federation/temporal.test.mjs +1 -1
- package/dist/federation/webfinger.test.mjs +1 -1
- package/dist/{federation-BtmlXC28.cjs → federation-BDzIgqOd.cjs} +3 -3
- package/dist/{http-Z_4nXnmx.cjs → http-1fZ83jj7.cjs} +10 -7
- package/dist/{http-DRZjWZk6.js → http-BGb3QioZ.js} +10 -7
- package/dist/{http-CsoDFFF_.mjs → http-DkqWu-sm.mjs} +4 -4
- package/dist/{key-C3Lb5EjY.mjs → key-CEsu7oaD.mjs} +2 -2
- package/dist/{kv-cache-Crhs8arR.cjs → kv-cache-BEWuZSB4.cjs} +1 -1
- package/dist/{kv-cache-Bd3aLvJf.js → kv-cache-CGhEgt98.js} +1 -1
- package/dist/{kv-cache-DSMMJ-7o.mjs → kv-cache-CJS4mImS.mjs} +1 -1
- package/dist/{ld-Chjbei_k.mjs → ld-Cf4CPWN_.mjs} +3 -3
- package/dist/{metrics-DeBEbzG-.mjs → metrics-CocsZP0E.mjs} +1 -1
- package/dist/{middleware-DhxWy_Zg.js → middleware-BfYke3YQ.js} +3 -3
- package/dist/{middleware-CxB6OeH7.mjs → middleware-Cne_jMZo.mjs} +1 -1
- package/dist/{middleware-Z_0BB5RU.mjs → middleware-Dxn0E9ES.mjs} +14 -14
- package/dist/{mod-Cy9VNHVw.d.ts → mod-BlLwewYe.d.ts} +2 -0
- package/dist/{mod-DoTWIc7F.d.cts → mod-VHYh1lTK.d.cts} +2 -0
- package/dist/mod.cjs +4 -4
- package/dist/mod.d.cts +1 -1
- package/dist/mod.d.ts +1 -1
- package/dist/mod.js +4 -4
- package/dist/nodeinfo/handler.test.mjs +1 -1
- package/dist/{owner-C7w13Of7.mjs → owner-DSJ7nFgy.mjs} +3 -3
- package/dist/{portable-collection-pdx667Mu.js → portable-collection-BuBV6xTo.js} +1 -1
- package/dist/{portable-collection-BppkIWgo.mjs → portable-collection-qskqXJrH.mjs} +2 -2
- package/dist/{portable-collection-BRTSf2Wv.cjs → portable-collection-r-mHg1PV.cjs} +1 -1
- package/dist/{portable-key-DJysCyel.mjs → portable-key-woGH_1nn.mjs} +1 -1
- package/dist/{proof-Bqvn7ML0.mjs → proof-8WiH_-Gq.mjs} +13 -10
- package/dist/{send-CKR_TvnM.mjs → send-JKzZBgPU.mjs} +3 -3
- package/dist/sig/compound-proof-discovery.test.mjs +1 -1
- package/dist/sig/compound-proof-producer.test.mjs +1 -1
- package/dist/sig/compound-proof-verification.test.mjs +2 -2
- package/dist/sig/compound-proof.test.mjs +2 -2
- package/dist/sig/http.test.mjs +2 -2
- package/dist/sig/key.test.mjs +1 -1
- package/dist/sig/ld.test.mjs +2 -2
- package/dist/sig/mitra-receive-interop.test.d.mts +2 -0
- package/dist/sig/mitra-receive-interop.test.mjs +260 -0
- package/dist/sig/mitra-send-interop.test.d.mts +2 -0
- package/dist/sig/mitra-send-interop.test.mjs +461 -0
- package/dist/sig/mod.cjs +2 -2
- package/dist/sig/mod.d.cts +1 -1
- package/dist/sig/mod.d.ts +1 -1
- package/dist/sig/mod.js +2 -2
- package/dist/sig/owner.test.mjs +1 -1
- package/dist/sig/portable-collection.test.mjs +1 -1
- package/dist/sig/portable-interop.test.d.mts +2 -0
- package/dist/sig/portable-interop.test.mjs +156 -0
- package/dist/sig/portable-key.test.mjs +6 -6
- package/dist/sig/proof.test.mjs +88 -3
- package/dist/sig/tootik-request-interop.test.d.mts +2 -0
- package/dist/sig/tootik-request-interop.test.mjs +190 -0
- package/dist/sig/tootik-send-interop.test.d.mts +2 -0
- package/dist/sig/tootik-send-interop.test.mjs +331 -0
- package/dist/{temporal-BqBivTLz.mjs → temporal-CT3fRaMH.mjs} +1 -1
- package/dist/testing/kv.test.mjs +1 -1
- package/dist/utils/docloader.test.mjs +2 -2
- package/dist/utils/kv-cache.test.mjs +1 -1
- package/dist/utils/mod.cjs +1 -1
- package/dist/utils/mod.js +1 -1
- package/package.json +7 -7
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import { Temporal } from "temporal-polyfill";
|
|
2
|
+
import "urlpattern-polyfill";
|
|
3
|
+
globalThis.addEventListener = () => {};
|
|
4
|
+
import { t as MemoryKvStore } from "../kv-DCHkaJ9-.mjs";
|
|
5
|
+
import { t as assertEquals } from "../assert_equals-Z6IcEbWU.mjs";
|
|
6
|
+
import "../std__assert-DvMDRPes.mjs";
|
|
7
|
+
import { t as assert } from "../assert-D1Eafmd_.mjs";
|
|
8
|
+
import { c as verifyPortableObjectProof } from "../proof-8WiH_-Gq.mjs";
|
|
9
|
+
import { p as verifyRequestDetailed } from "../http-DkqWu-sm.mjs";
|
|
10
|
+
import { o as createFederation } from "../middleware-Dxn0E9ES.mjs";
|
|
11
|
+
import { t as doesActorOwnKey } from "../owner-DSJ7nFgy.mjs";
|
|
12
|
+
import { Create, Person } from "@fedify/vocab";
|
|
13
|
+
import { canonicalizePortableUri, decodeMultibase, importDidKey } from "@fedify/vocab-runtime";
|
|
14
|
+
import { mockDocumentLoader, test } from "@fedify/fixture";
|
|
15
|
+
import { encodeHex } from "byte-encodings/hex";
|
|
16
|
+
import serialize from "json-canon";
|
|
17
|
+
//#region test-vectors/fep-ef61/mitra-v5.10.0/receive/actor.json
|
|
18
|
+
var actor_default = {
|
|
19
|
+
"@context": [
|
|
20
|
+
"https://www.w3.org/ns/activitystreams",
|
|
21
|
+
"https://w3id.org/security/v1",
|
|
22
|
+
"https://www.w3.org/ns/did/v1",
|
|
23
|
+
"https://w3id.org/security/data-integrity/v1",
|
|
24
|
+
"https://w3id.org/security/multikey/v1",
|
|
25
|
+
"https://w3id.org/fep/ef61"
|
|
26
|
+
],
|
|
27
|
+
assertionMethod: [
|
|
28
|
+
{
|
|
29
|
+
"controller": "ap+ef61://did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/actor",
|
|
30
|
+
"id": "ap+ef61://did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/actor#main-key",
|
|
31
|
+
"publicKeyMultibase": "z4MXj1wBzi9jUstyPQj1tJmBTCJQwSmgdEH3r3AcgJRwZBMkP3rY67NfsjsVyeRAH24e8frWsjLuhKJ3G9yRWp2R848U8Yeh8kNyR9GF2vmGEi6BHNEqhGnZMMQnAnLovqzQ7p9vfSsHUYU19yrzEwCSFumsDkk4np96HCjbkpejfNkDDAjPexavs9KSdovfFhJdb1uy4wcyG3ynZFSKsyPQyEUVFd72ufLKgG4h8j4fNHqwzvVQG1tRnqMqzFgS6uXJfftXGsAC6QVE5keYdicLvJ6n2t5UrCsVSeoMwgSuDpXVB8vXuhFkxNz4v2bKBHuHVUzA7cKWxoY5gaczcq4on1P23vsRbtxhkWUQgUA4KMenYWDLk",
|
|
32
|
+
"type": "Multikey"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"controller": "ap+ef61://did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/actor",
|
|
36
|
+
"id": "ap+ef61://did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/actor#ed25519-key",
|
|
37
|
+
"publicKeyMultibase": "z6MknVDBdr3PRNFK35WPFbHxy7m5g18iuoSTht4vRwzt9WKq",
|
|
38
|
+
"type": "Multikey"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"controller": "ap+ef61://did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/actor",
|
|
42
|
+
"id": "http://localhost:18498/.well-known/apgateway/did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/actor#fedify-rsa",
|
|
43
|
+
"publicKeyMultibase": "zgghBUVkqmWS8e1imM79CWx4zopmbKaBcdbLUSHjyo3KNnBVZscUs1T8HXSrY7yeSQJZSrrEjtnXq1tWc9fKL31uDYYbr8iSbtiRiXDxUQLA1ZDRH2tsz8a8PufoKK3w9qwNaxkcFVa5YKZ99ahxvvEJ86oDpPexr1HoE5wux1XihNx7kPtpJseQVKjTPYM1YcWe3SqDvy374ZaGFZx5YpxcVCr5gfF9iDHP8KWnYwWF3ge6icMQiqkiCZxsjeV8DL7ww7DJiQniYbk4qZ7mvcpqts657MPR7NWeFKim9wKy6mzaKEdDnkkVeTPbQYFgCUsZyrZcbBFTZp3YAnpTA2k4vmjBvKUyUKzrtXrJAuNgU7Y2cvdxRSCKorAJ38brzReEHA8Vwk72t9Le2P7PVqbUNScKt3L1v1pvQr28rim9Ff7uqPmK4R9j5FR7Tse4qq8zGoxYVAoH5isp9udJjLCs7BsF9MekS1D4aardVzMmqCzjiWCfjeUtTGdkqREsUkGyD3seFUGKui2aqafzVATZQCze4X3KcXL8vLWfq1W7VEx5HVCy5aCAV9E2VCUwimuUNfuSVYGaSY6S3XGXpMYCftak9VA4r22pZCCePC6fXwGhVNwo2mznyZNGbWc1fRLVCr45pS1RaXd58RrXWc2d4HcXdpsQ3XK6tiA4GJUe276bvKmktYKzcfn7KXs9ZHddFNe1SyctHP2JNL",
|
|
44
|
+
"type": "Multikey"
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
gateways: ["http://127.0.0.1:18497", "http://localhost:18498"],
|
|
48
|
+
id: "ap+ef61://did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/actor",
|
|
49
|
+
inbox: "ap+ef61://did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/actor/inbox",
|
|
50
|
+
name: "Fedify live portable client",
|
|
51
|
+
outbox: "ap+ef61://did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/actor/outbox",
|
|
52
|
+
preferredUsername: "fepsgnpakpb",
|
|
53
|
+
proof: {
|
|
54
|
+
"@context": [
|
|
55
|
+
"https://www.w3.org/ns/activitystreams",
|
|
56
|
+
"https://w3id.org/security/v1",
|
|
57
|
+
"https://www.w3.org/ns/did/v1",
|
|
58
|
+
"https://w3id.org/security/data-integrity/v1",
|
|
59
|
+
"https://w3id.org/security/multikey/v1",
|
|
60
|
+
"https://w3id.org/fep/ef61"
|
|
61
|
+
],
|
|
62
|
+
"created": "2026-09-30T14:46:57.846825928Z",
|
|
63
|
+
"cryptosuite": "eddsa-jcs-2022",
|
|
64
|
+
"proofPurpose": "assertionMethod",
|
|
65
|
+
"proofValue": "z32F5XC6bGuzR6ZE5jCiKTQXcFm2F6fp7WLFWM69bkv7RDXSxe67fXjJXgtdLoQBYqsWnqZqczVvivhACfAYaj1kG",
|
|
66
|
+
"type": "DataIntegrityProof",
|
|
67
|
+
"verificationMethod": "did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB#z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB"
|
|
68
|
+
},
|
|
69
|
+
publicKey: {
|
|
70
|
+
"id": "http://localhost:18498/.well-known/apgateway/did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/actor#fedify-rsa",
|
|
71
|
+
"owner": "ap+ef61://did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/actor",
|
|
72
|
+
"publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAoSFdSVINqqwdCPZrEo8H\nqwx1bmlm/sT7RXpb53oDt0kWOnjhGrNnRSXa4PbHKCPH6yrzV3xGpmN1zVAXcShg\nu44m1NXbtBtfuEVHSOebRQWu2wyQRYlDk76MEyT33GDtNJf/4OnjnBXO71ebEFVY\nSKWkZacdS0Ft42sqvFaAK4/RDUEiUWE2t4YsEthT90fo+rXz/Snnv74p70eHnjD8\n6P29f8JKITTaqXp1ltuoiS9oEIFV/6FQ7HPMfzdBIgMvg/3pDDr1stFT56Slsvrr\nnMF4J2jy1HNYEo1V7HvS7wStZmGRPNYoiSTHvbk5Vm3ZCmE3Qzng/Sus19KN/B57\njkeOA8ObS5OXCjshZ+GrBmSnAzZjl+Gm6gQDKBk8/ilaSXH2QtCR4TQmvbsCjRFA\njoXcKvMh4SfnWGXC5XdkbVjXJuFSHHFNbHBCLygk/IJdbvEHQpPH4Rsqbc3f4TvL\n3ge/Jd6rm7huVlax3UMq7qUWTtb1PRjjSlrV0Tj5REv1KNe5VGvhMpQmHfJe7zd0\nBVbgi4I91QRJg9XF/dYXgm330skdSkM0UapBNo9xbgK3ejyNWG5aHcazO+DSdWNu\n5AbkXLB7m5djxb5ONrOYzz7llW4kg2H0zWNLFbRvdfKowdG906J4h9+6ZYhwufMa\ndVHS/5EyQbbwVeqe+MG0Qo8CAwEAAQ==\n-----END PUBLIC KEY-----\n",
|
|
73
|
+
"type": "CryptographicKey"
|
|
74
|
+
},
|
|
75
|
+
type: "Person"
|
|
76
|
+
};
|
|
77
|
+
//#endregion
|
|
78
|
+
//#region test-vectors/fep-ef61/mitra-v5.10.0/receive/request.json
|
|
79
|
+
var url$1 = "https://fedify.example:18444/users/alice/inbox";
|
|
80
|
+
var method = "POST";
|
|
81
|
+
var headers = [
|
|
82
|
+
["accept", "*/*"],
|
|
83
|
+
["content-length", "2409"],
|
|
84
|
+
["content-type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\""],
|
|
85
|
+
["date", "Wed, 30 Sep 2026 14:47:04 GMT"],
|
|
86
|
+
["digest", "SHA-256=d1ozC9i0ryDU//wSsMAzw9wD/r5HN0ti5wovjUSqN8k="],
|
|
87
|
+
["host", "fedify.example:18444"],
|
|
88
|
+
["signature", "keyId=\"http://127.0.0.1:18497/.well-known/apgateway/did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/actor#main-key\",algorithm=\"rsa-sha256\",headers=\"(request-target) host date digest\",signature=\"PQHhIZUyBNsH779V+IB0Q08Pw8fsgq9RflyLExtYqNWwd/DXRyddBG1Y0RRCKrzigwFnW74rvuZpjU35gZzPaQA+TFxQvl8wBcPKLrYuc+NkIwGrCIpnFkUCglG6JagZ3cJfSqIB7DU7RIEvYfPjK9IchHug8ZghLnWhwLTE9UpKmtH/nJrU2Pd3n2Dn+EkfcYFe+n2KZxS7cjgPiRDRgei31WaCIIDRK4x7PvKq0VmrLwsNSKJzFsUp+KxiwoOHT1Ad9d6BPAJI8p+HqvWu0b2rMu4EK/nqHNwDYB7uYcundCYeQNI8wHmt2qxHxC2JuCuuV99WJxvXMSTbfUfgWg==\""],
|
|
89
|
+
["user-agent", "Mitra 5.10.0; http://127.0.0.1:18497"]
|
|
90
|
+
];
|
|
91
|
+
var capturedAt$1 = "2026-09-30T14:47:04.185Z";
|
|
92
|
+
//#endregion
|
|
93
|
+
//#region test-vectors/fep-ef61/mitra-v5.10.0/receive/metadata.json
|
|
94
|
+
var capturedAt = "2026-09-30T14:47:04.185Z";
|
|
95
|
+
var httpKeyId = "http://127.0.0.1:18497/.well-known/apgateway/did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/actor#main-key";
|
|
96
|
+
var sha256$1 = {
|
|
97
|
+
"requestBody": "775a330bd8b4af20d4fffc12b0c033c3dc03febe47374b62e70a2f8d44aa37c9",
|
|
98
|
+
"actorBody": "f24c677b3854353c272c29164342f94f420b7570aaf2999d1ea179c7c24ba4bc"
|
|
99
|
+
};
|
|
100
|
+
//#endregion
|
|
101
|
+
//#region test-vectors/fep-ef61/mitra-v5.10.0/receive/raw-bodies.json
|
|
102
|
+
var requestBody = "{\"@context\":[\"https://www.w3.org/ns/activitystreams\",\"https://w3id.org/security/v1\",\"https://www.w3.org/ns/did/v1\",\"https://w3id.org/security/data-integrity/v1\",\"https://w3id.org/security/multikey/v1\",\"https://w3id.org/fep/ef61\"],\"actor\":\"ap+ef61://did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/actor\",\"id\":\"ap+ef61://did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/creates/1\",\"object\":{\"@context\":[\"https://www.w3.org/ns/activitystreams\",\"https://w3id.org/security/v1\",\"https://www.w3.org/ns/did/v1\",\"https://w3id.org/security/data-integrity/v1\",\"https://w3id.org/security/multikey/v1\",\"https://w3id.org/fep/ef61\"],\"attributedTo\":\"ap+ef61://did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/actor\",\"content\":\"<p>@alice Fedify to Mitra portable C2S live interop.</p>\",\"id\":\"ap+ef61://did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/notes/1\",\"proof\":{\"@context\":[\"https://www.w3.org/ns/activitystreams\",\"https://w3id.org/security/v1\",\"https://www.w3.org/ns/did/v1\",\"https://w3id.org/security/data-integrity/v1\",\"https://w3id.org/security/multikey/v1\",\"https://w3id.org/fep/ef61\"],\"created\":\"2026-09-30T14:47:01.910135986Z\",\"cryptosuite\":\"eddsa-jcs-2022\",\"proofPurpose\":\"assertionMethod\",\"proofValue\":\"z33dM5LxM7KnmoDjVMnYb44y8skPARP8qur6TiRDLr5P51SQZu3goY2JCVAFVLNjmnxE6dHPRRrcGW6qHr8vusyjt\",\"type\":\"DataIntegrityProof\",\"verificationMethod\":\"did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB#z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB\"},\"tag\":{\"href\":\"https://fedify.example:18444/users/alice\",\"name\":\"@alice\",\"type\":\"Mention\"},\"to\":[\"https://www.w3.org/ns/activitystreams#Public\",\"https://fedify.example:18444/users/alice\"],\"type\":\"Note\"},\"proof\":{\"@context\":[\"https://www.w3.org/ns/activitystreams\",\"https://w3id.org/security/v1\",\"https://www.w3.org/ns/did/v1\",\"https://w3id.org/security/data-integrity/v1\",\"https://w3id.org/security/multikey/v1\",\"https://w3id.org/fep/ef61\"],\"created\":\"2026-09-30T14:47:01.923062012Z\",\"cryptosuite\":\"eddsa-jcs-2022\",\"proofPurpose\":\"assertionMethod\",\"proofValue\":\"z4AqgJsruzRmAz7JZdmTY5zRNXZknLomUgGNmN4jwwBZorMg19MurHvhsHaSfW6Uooc5zXSTRZZK4T6uaLc4hJoL1\",\"type\":\"DataIntegrityProof\",\"verificationMethod\":\"did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB#z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB\"},\"to\":[\"https://www.w3.org/ns/activitystreams#Public\",\"https://fedify.example:18444/users/alice\"],\"type\":\"Create\"}";
|
|
103
|
+
var actorBody = "{\"@context\":[\"https://www.w3.org/ns/activitystreams\",\"https://w3id.org/security/v1\",\"https://www.w3.org/ns/did/v1\",\"https://w3id.org/security/data-integrity/v1\",\"https://w3id.org/security/multikey/v1\",\"https://w3id.org/fep/ef61\"],\"assertionMethod\":[{\"controller\":\"ap+ef61://did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/actor\",\"id\":\"ap+ef61://did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/actor#main-key\",\"publicKeyMultibase\":\"z4MXj1wBzi9jUstyPQj1tJmBTCJQwSmgdEH3r3AcgJRwZBMkP3rY67NfsjsVyeRAH24e8frWsjLuhKJ3G9yRWp2R848U8Yeh8kNyR9GF2vmGEi6BHNEqhGnZMMQnAnLovqzQ7p9vfSsHUYU19yrzEwCSFumsDkk4np96HCjbkpejfNkDDAjPexavs9KSdovfFhJdb1uy4wcyG3ynZFSKsyPQyEUVFd72ufLKgG4h8j4fNHqwzvVQG1tRnqMqzFgS6uXJfftXGsAC6QVE5keYdicLvJ6n2t5UrCsVSeoMwgSuDpXVB8vXuhFkxNz4v2bKBHuHVUzA7cKWxoY5gaczcq4on1P23vsRbtxhkWUQgUA4KMenYWDLk\",\"type\":\"Multikey\"},{\"controller\":\"ap+ef61://did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/actor\",\"id\":\"ap+ef61://did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/actor#ed25519-key\",\"publicKeyMultibase\":\"z6MknVDBdr3PRNFK35WPFbHxy7m5g18iuoSTht4vRwzt9WKq\",\"type\":\"Multikey\"},{\"controller\":\"ap+ef61://did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/actor\",\"id\":\"http://localhost:18498/.well-known/apgateway/did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/actor#fedify-rsa\",\"publicKeyMultibase\":\"zgghBUVkqmWS8e1imM79CWx4zopmbKaBcdbLUSHjyo3KNnBVZscUs1T8HXSrY7yeSQJZSrrEjtnXq1tWc9fKL31uDYYbr8iSbtiRiXDxUQLA1ZDRH2tsz8a8PufoKK3w9qwNaxkcFVa5YKZ99ahxvvEJ86oDpPexr1HoE5wux1XihNx7kPtpJseQVKjTPYM1YcWe3SqDvy374ZaGFZx5YpxcVCr5gfF9iDHP8KWnYwWF3ge6icMQiqkiCZxsjeV8DL7ww7DJiQniYbk4qZ7mvcpqts657MPR7NWeFKim9wKy6mzaKEdDnkkVeTPbQYFgCUsZyrZcbBFTZp3YAnpTA2k4vmjBvKUyUKzrtXrJAuNgU7Y2cvdxRSCKorAJ38brzReEHA8Vwk72t9Le2P7PVqbUNScKt3L1v1pvQr28rim9Ff7uqPmK4R9j5FR7Tse4qq8zGoxYVAoH5isp9udJjLCs7BsF9MekS1D4aardVzMmqCzjiWCfjeUtTGdkqREsUkGyD3seFUGKui2aqafzVATZQCze4X3KcXL8vLWfq1W7VEx5HVCy5aCAV9E2VCUwimuUNfuSVYGaSY6S3XGXpMYCftak9VA4r22pZCCePC6fXwGhVNwo2mznyZNGbWc1fRLVCr45pS1RaXd58RrXWc2d4HcXdpsQ3XK6tiA4GJUe276bvKmktYKzcfn7KXs9ZHddFNe1SyctHP2JNL\",\"type\":\"Multikey\"}],\"gateways\":[\"http://127.0.0.1:18497\",\"http://localhost:18498\"],\"id\":\"ap+ef61://did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/actor\",\"inbox\":\"ap+ef61://did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/actor/inbox\",\"name\":\"Fedify live portable client\",\"outbox\":\"ap+ef61://did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/actor/outbox\",\"preferredUsername\":\"fepsgnpakpb\",\"proof\":{\"@context\":[\"https://www.w3.org/ns/activitystreams\",\"https://w3id.org/security/v1\",\"https://www.w3.org/ns/did/v1\",\"https://w3id.org/security/data-integrity/v1\",\"https://w3id.org/security/multikey/v1\",\"https://w3id.org/fep/ef61\"],\"created\":\"2026-09-30T14:46:57.846825928Z\",\"cryptosuite\":\"eddsa-jcs-2022\",\"proofPurpose\":\"assertionMethod\",\"proofValue\":\"z32F5XC6bGuzR6ZE5jCiKTQXcFm2F6fp7WLFWM69bkv7RDXSxe67fXjJXgtdLoQBYqsWnqZqczVvivhACfAYaj1kG\",\"type\":\"DataIntegrityProof\",\"verificationMethod\":\"did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB#z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB\"},\"publicKey\":{\"id\":\"http://localhost:18498/.well-known/apgateway/did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/actor#fedify-rsa\",\"owner\":\"ap+ef61://did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/actor\",\"publicKeyPem\":\"-----BEGIN PUBLIC KEY-----\\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAoSFdSVINqqwdCPZrEo8H\\nqwx1bmlm/sT7RXpb53oDt0kWOnjhGrNnRSXa4PbHKCPH6yrzV3xGpmN1zVAXcShg\\nu44m1NXbtBtfuEVHSOebRQWu2wyQRYlDk76MEyT33GDtNJf/4OnjnBXO71ebEFVY\\nSKWkZacdS0Ft42sqvFaAK4/RDUEiUWE2t4YsEthT90fo+rXz/Snnv74p70eHnjD8\\n6P29f8JKITTaqXp1ltuoiS9oEIFV/6FQ7HPMfzdBIgMvg/3pDDr1stFT56Slsvrr\\nnMF4J2jy1HNYEo1V7HvS7wStZmGRPNYoiSTHvbk5Vm3ZCmE3Qzng/Sus19KN/B57\\njkeOA8ObS5OXCjshZ+GrBmSnAzZjl+Gm6gQDKBk8/ilaSXH2QtCR4TQmvbsCjRFA\\njoXcKvMh4SfnWGXC5XdkbVjXJuFSHHFNbHBCLygk/IJdbvEHQpPH4Rsqbc3f4TvL\\n3ge/Jd6rm7huVlax3UMq7qUWTtb1PRjjSlrV0Tj5REv1KNe5VGvhMpQmHfJe7zd0\\nBVbgi4I91QRJg9XF/dYXgm330skdSkM0UapBNo9xbgK3ejyNWG5aHcazO+DSdWNu\\n5AbkXLB7m5djxb5ONrOYzz7llW4kg2H0zWNLFbRvdfKowdG906J4h9+6ZYhwufMa\\ndVHS/5EyQbbwVeqe+MG0Qo8CAwEAAQ==\\n-----END PUBLIC KEY-----\\n\",\"type\":\"CryptographicKey\"},\"type\":\"Person\"}";
|
|
104
|
+
//#endregion
|
|
105
|
+
//#region test-vectors/fep-ef61/mitra-v5.10.0/receive/response.json
|
|
106
|
+
var status$1 = 202;
|
|
107
|
+
//#endregion
|
|
108
|
+
//#region test-vectors/fep-ef61/mitra-v5.10.0/receive/listener.json
|
|
109
|
+
var type = "Create";
|
|
110
|
+
var id = "ap+ef61://did%3Akey%3Az6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/creates/1";
|
|
111
|
+
var actor = "ap+ef61://did%3Akey%3Az6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/actor";
|
|
112
|
+
//#endregion
|
|
113
|
+
//#region test-vectors/fep-ef61/mitra-v5.10.0/receive/verification.json
|
|
114
|
+
var verified = true;
|
|
115
|
+
var key = "http://127.0.0.1:18497/.well-known/apgateway/did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/actor#main-key";
|
|
116
|
+
//#endregion
|
|
117
|
+
//#region test-vectors/fep-ef61/mitra-v5.10.0/receive/actor-response.json
|
|
118
|
+
var url = "http://127.0.0.1:18497/.well-known/apgateway/did:key:z6MkuLKdSc7GHbgu9zDC8sZEjSbhAn7GzoHKXxsgsGNPakpB/actor#main-key";
|
|
119
|
+
var status = 200;
|
|
120
|
+
//#endregion
|
|
121
|
+
//#region src/sig/mitra-receive-interop.test.ts
|
|
122
|
+
const body = requestBody;
|
|
123
|
+
const activity = JSON.parse(body);
|
|
124
|
+
async function sha256(value) {
|
|
125
|
+
return encodeHex(new Uint8Array(await crypto.subtle.digest("SHA-256", new TextEncoder().encode(value))));
|
|
126
|
+
}
|
|
127
|
+
async function digest(value) {
|
|
128
|
+
return new Uint8Array(await crypto.subtle.digest("SHA-256", new TextEncoder().encode(value)));
|
|
129
|
+
}
|
|
130
|
+
async function verifyRawJcs(document) {
|
|
131
|
+
const { proof, ...unsecured } = document;
|
|
132
|
+
assert(proof != null && typeof proof === "object" && !Array.isArray(proof));
|
|
133
|
+
const { proofValue, ...configuration } = proof;
|
|
134
|
+
assertEquals(configuration.cryptosuite, "eddsa-jcs-2022");
|
|
135
|
+
configuration["@context"] ??= document["@context"];
|
|
136
|
+
assert(typeof configuration.verificationMethod === "string");
|
|
137
|
+
assert(typeof proofValue === "string");
|
|
138
|
+
const key = await importDidKey(configuration.verificationMethod.split("#")[0]);
|
|
139
|
+
const combined = /* @__PURE__ */ new Uint8Array(64);
|
|
140
|
+
combined.set(await digest(serialize(configuration)), 0);
|
|
141
|
+
combined.set(await digest(serialize(unsecured)), 32);
|
|
142
|
+
return await crypto.subtle.verify("Ed25519", key, new Uint8Array(decodeMultibase(proofValue)), combined);
|
|
143
|
+
}
|
|
144
|
+
function loader(document = actor_default) {
|
|
145
|
+
return (url) => {
|
|
146
|
+
assertEquals(url.split("#")[0], httpKeyId.split("#")[0]);
|
|
147
|
+
return Promise.resolve({
|
|
148
|
+
document: structuredClone(document),
|
|
149
|
+
documentUrl: httpKeyId.split("#")[0],
|
|
150
|
+
contextUrl: null
|
|
151
|
+
});
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
const options = {
|
|
155
|
+
documentLoader: loader(),
|
|
156
|
+
contextLoader: mockDocumentLoader,
|
|
157
|
+
currentTime: Temporal.Instant.from(capturedAt$1)
|
|
158
|
+
};
|
|
159
|
+
function request(requestBody = body, url = url$1, headers$1 = new Headers(headers)) {
|
|
160
|
+
return new Request(url, {
|
|
161
|
+
method,
|
|
162
|
+
headers: headers$1,
|
|
163
|
+
body: requestBody
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
async function deliver(requestBody) {
|
|
167
|
+
const federation = createFederation({
|
|
168
|
+
kv: new MemoryKvStore(),
|
|
169
|
+
documentLoaderFactory: () => loader(),
|
|
170
|
+
contextLoaderFactory: () => mockDocumentLoader,
|
|
171
|
+
signatureTimeWindow: false
|
|
172
|
+
});
|
|
173
|
+
federation.setActorDispatcher("/users/{identifier}", (ctx, identifier) => identifier === "alice" ? new Person({
|
|
174
|
+
id: ctx.getActorUri(identifier),
|
|
175
|
+
inbox: ctx.getInboxUri(identifier)
|
|
176
|
+
}) : null).setKeyPairsDispatcher(() => []);
|
|
177
|
+
const received = [];
|
|
178
|
+
federation.setInboxListeners("/users/{identifier}/inbox", "/inbox").on(Create, (_ctx, create) => {
|
|
179
|
+
received.push(create);
|
|
180
|
+
});
|
|
181
|
+
return {
|
|
182
|
+
response: await federation.fetch(request(requestBody), { contextData: void 0 }),
|
|
183
|
+
received
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
test("Mitra v5.10.0 forwarded client-proved Create verifies its proof and HTTP signature", async () => {
|
|
187
|
+
const actorBody$1 = actorBody;
|
|
188
|
+
assertEquals(await sha256(body), sha256$1.requestBody);
|
|
189
|
+
assertEquals(await sha256(actorBody$1), sha256$1.actorBody);
|
|
190
|
+
assertEquals(JSON.parse(actorBody$1), actor_default);
|
|
191
|
+
assertEquals(status, 200);
|
|
192
|
+
assertEquals(url, httpKeyId);
|
|
193
|
+
assertEquals(verified, true);
|
|
194
|
+
assertEquals(key, httpKeyId);
|
|
195
|
+
assertEquals(activity.type, "Create");
|
|
196
|
+
assertEquals(actor_default.type, "Person");
|
|
197
|
+
assert((await verifyPortableObjectProof(activity.object, options)).verified);
|
|
198
|
+
assertEquals(activity.actor, actor_default.id);
|
|
199
|
+
assert(await verifyRawJcs(actor_default));
|
|
200
|
+
assert(await verifyRawJcs(activity));
|
|
201
|
+
assert(await verifyRawJcs(activity.object));
|
|
202
|
+
assert((await verifyPortableObjectProof(actor_default, options)).verified);
|
|
203
|
+
assert((await verifyPortableObjectProof(activity, options)).verified);
|
|
204
|
+
const verified$1 = await verifyRequestDetailed(request(), options);
|
|
205
|
+
assert(verified$1.verified);
|
|
206
|
+
assertEquals(verified$1.key.id?.href, httpKeyId);
|
|
207
|
+
assert(verified$1.key.id?.href !== actor_default.publicKey.id);
|
|
208
|
+
assert(await doesActorOwnKey(await Create.fromJsonLd(activity, options), verified$1.key, options));
|
|
209
|
+
assertEquals(capturedAt$1, capturedAt);
|
|
210
|
+
});
|
|
211
|
+
test("Mitra v5.10.0 forwarded client-proved Create reaches the Fedify inbox listener", async () => {
|
|
212
|
+
assertEquals(status$1, 202);
|
|
213
|
+
assertEquals(type, "Create");
|
|
214
|
+
assertEquals(canonicalizePortableUri(id), canonicalizePortableUri(activity.id));
|
|
215
|
+
assertEquals(canonicalizePortableUri(actor), canonicalizePortableUri(activity.actor));
|
|
216
|
+
const { response, received } = await deliver(body);
|
|
217
|
+
assertEquals(response.status, 202);
|
|
218
|
+
assertEquals(received.length, 1);
|
|
219
|
+
assert(received[0].id != null);
|
|
220
|
+
assertEquals(canonicalizePortableUri(received[0].id.href), canonicalizePortableUri(activity.id));
|
|
221
|
+
assert(received[0].actorId != null);
|
|
222
|
+
assertEquals(canonicalizePortableUri(received[0].actorId.href), canonicalizePortableUri(actor_default.id));
|
|
223
|
+
});
|
|
224
|
+
test("Mitra v5.10.0 forwarded client-proved Create rejects body tampering", async () => {
|
|
225
|
+
const tampered = {
|
|
226
|
+
...activity,
|
|
227
|
+
object: {
|
|
228
|
+
...activity.object,
|
|
229
|
+
content: "Tampered received Note"
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
assertEquals((await verifyPortableObjectProof(tampered, options)).verified, false);
|
|
233
|
+
assertEquals(await verifyRawJcs(tampered), false);
|
|
234
|
+
assertEquals(await verifyRawJcs(tampered.object), false);
|
|
235
|
+
const changedBody = JSON.stringify(tampered);
|
|
236
|
+
assertEquals((await verifyRequestDetailed(request(changedBody), options)).verified, false);
|
|
237
|
+
const { response, received } = await deliver(changedBody);
|
|
238
|
+
assertEquals(response.status, 401);
|
|
239
|
+
assertEquals(received.length, 0);
|
|
240
|
+
});
|
|
241
|
+
test("Mitra v5.10.0 forwarded client-proved Create rejects signed header and path tampering", async () => {
|
|
242
|
+
const headers$2 = new Headers(headers);
|
|
243
|
+
headers$2.set("Date", new Date(Date.parse(new Headers(headers).get("Date")) + 1e3).toUTCString());
|
|
244
|
+
assertEquals((await verifyRequestDetailed(request(body, url$1, headers$2), options)).verified, false);
|
|
245
|
+
assertEquals((await verifyRequestDetailed(request(body, `${url$1}/tampered`), options)).verified, false);
|
|
246
|
+
});
|
|
247
|
+
test("Mitra v5.10.0 forwarded client-proved Create rejects a tampered actor proof", async () => {
|
|
248
|
+
const tampered = {
|
|
249
|
+
...actor_default,
|
|
250
|
+
preferredUsername: "mallory"
|
|
251
|
+
};
|
|
252
|
+
assertEquals(await verifyRawJcs(tampered), false);
|
|
253
|
+
assertEquals((await verifyPortableObjectProof(tampered, options)).verified, false);
|
|
254
|
+
assertEquals((await verifyRequestDetailed(request(), {
|
|
255
|
+
...options,
|
|
256
|
+
documentLoader: loader(tampered)
|
|
257
|
+
})).verified, false);
|
|
258
|
+
});
|
|
259
|
+
//#endregion
|
|
260
|
+
export {};
|