@real-life/trust-protocol 0.1.0
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/README.md +99 -0
- package/dist/core.d.ts +32 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +312 -0
- package/dist/core.js.map +1 -0
- package/dist/crypto.d.ts +32 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +114 -0
- package/dist/crypto.js.map +1 -0
- package/dist/delivery.d.ts +51 -0
- package/dist/delivery.d.ts.map +1 -0
- package/dist/delivery.js +170 -0
- package/dist/delivery.js.map +1 -0
- package/dist/encounter.d.ts +63 -0
- package/dist/encounter.d.ts.map +1 -0
- package/dist/encounter.js +56 -0
- package/dist/encounter.js.map +1 -0
- package/dist/identity.d.ts +25 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +87 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/probe/continuity.d.ts +99 -0
- package/dist/probe/continuity.d.ts.map +1 -0
- package/dist/probe/continuity.js +303 -0
- package/dist/probe/continuity.js.map +1 -0
- package/dist/probe/deps.d.ts +61 -0
- package/dist/probe/deps.d.ts.map +1 -0
- package/dist/probe/deps.js +54 -0
- package/dist/probe/deps.js.map +1 -0
- package/dist/probe/introduce.d.ts +70 -0
- package/dist/probe/introduce.d.ts.map +1 -0
- package/dist/probe/introduce.js +295 -0
- package/dist/probe/introduce.js.map +1 -0
- package/dist/probe/membership.d.ts +90 -0
- package/dist/probe/membership.d.ts.map +1 -0
- package/dist/probe/membership.js +450 -0
- package/dist/probe/membership.js.map +1 -0
- package/dist/probe/trust.d.ts +116 -0
- package/dist/probe/trust.d.ts.map +1 -0
- package/dist/probe/trust.js +345 -0
- package/dist/probe/trust.js.map +1 -0
- package/dist/probe.d.ts +8 -0
- package/dist/probe.d.ts.map +1 -0
- package/dist/probe.js +41 -0
- package/dist/probe.js.map +1 -0
- package/dist/schemas.d.ts +2 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +51 -0
- package/dist/schemas.js.map +1 -0
- package/dist/unicode15.d.ts +8 -0
- package/dist/unicode15.d.ts.map +1 -0
- package/dist/unicode15.js +55 -0
- package/dist/unicode15.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"membership.js","sourceRoot":"","sources":["../../src/probe/membership.ts"],"names":[],"mappings":"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","sourcesContent":["// groups.mjs — Stage C: groups over the introduced channel. PROBE.\n// DOM-free, on rltp-core + rltp-crypto (+ the shipped schemas: the invite\n// IS the DTG InvitationCredential of membership-invite/0.2, the accept IS\n// membership-accept/0.2 — both schema-validated at issuance AND receipt).\n//\n// WHAT THIS PROBE EXERCISES (the converged Membership 0.16 / Access 0.30\n// semantics, instantiated live):\n// founding — the founder signs the genesis under a FOUNDING pair\n// context (Access 3.4.1: group/<digest> cannot exist\n// before the digest does); genesisDigest = multihash\n// over the proof-free genesis; the founder then derives\n// the member anchor group/<digest> and self-enrolls.\n// prelude — the inviter cannot derive the invitee's member anchor;\n// the invitee's app derives it from the genesisDigest\n// (canonical-u before the label, Access 5.1) and answers\n// over the EXISTING relationship channel (Membership 1.2).\n// invite — a conformant DTG InvitationCredential in a delivery\n// document WITHOUT a document proof (one carrier,\n// Membership 2); invitee re-derives and compares\n// (the prelude check, Membership 3.1).\n// accept — consent, task-proved under the subject; ref = the\n// CREDENTIAL digest (decoded-bytes equality).\n// admission — the inviter runs the Access 5.3 pair-internal checks\n// (path convention, time window incl. membership-skew,\n// size budget, card enclosure profile) and updates the\n// roster; a WELCOME (probe form) carries the roster to\n// members over their channels.\n// OUT OF PROBE SCOPE (named, not faked): the full access-operation\n// envelope (oid/prev/epochs), welcome seal + keydist/epoch keys, vouch\n// paths and candidacy surfacing, removal. That is the library's next\n// growth ring — the checks here are the real ones, the transport forms\n// marked @probe are not wire-normative.\nimport { jcs, makeValidator, toU, sameDigest, tsec, calOK } from '../core.js'\nimport * as C from './deps.js'\nimport type { Person } from './deps.js'\nimport { SCHEMAS } from '../schemas.js'\n\nconst V = makeValidator(SCHEMAS)\nconst validOr = (data: any, file: string) => { const s = SCHEMAS[file]; const errs = V.validate(data, s, s); if (errs.length) throw new Error(file + ': ' + errs[0]); return data }\nconst MEMBERSHIP_SKEW = 300 // PT5M (Membership §5)\nconst TT = 'https://real-life.org/trust-tasks/'\nconst CTX3 = ['https://www.w3.org/ns/credentials/v2', 'https://firstperson.network/credentials/dtg/v1', 'https://real-life.org/rltp/v1']\nconst say = (p: Person, m: string) => p.log.push(m)\nconst uuid = (ent?: any) => ent ?? globalThis.crypto.randomUUID()\n\n// member anchor: canonical-u re-encoding BEFORE the label (Access 5.1)\nexport async function memberContext (p: Person, genesisDigest: string) {\n const label = 'group/' + toU(genesisDigest)\n const ctx = await C.labeledContext(p.rootIkm, label)\n p.contexts.set(ctx.anchor, ctx); p.contexts.set(ctx.keyAgreement, ctx)\n return ctx\n}\nconst memberCard = async (ctx: any, name: string, whenIso: string) =>\n validOr(await C.signCard(ctx, C.cardBody(ctx, { name }), whenIso), 'contact-card.schema.json')\n\n// ── founding ────────────────────────────────────────────────────────────\nexport async function foundGroup (p: Person, label: string, when: number, ent: any = {}) {\n const iso = C.iso(when)\n const founding = await C.pairContext(p.rootIkm, ent.foundingNonce ?? C.rand(32)) // pair class: the founding occasion\n const groupDid = C.anchorOfEd((await C.edFromSeed(ent.groupSeed ?? C.rand(32))).pubRaw) // group address (probe mint; Identity work)\n const genesisBody = { type: 'group-genesis@probe', group: groupDid, label, founder: founding.anchor, issuedAt: iso }\n const genesis = await C.diSign(founding, genesisBody, iso)\n const genesisDigest = await C.digestDoc(genesisBody) // proof-free signature input (Access 3.2)\n const my = await memberContext(p, genesisDigest)\n const card = await memberCard(my, p.name, iso)\n const g: any = {\n label, groupDid, genesisDigest, genesis, myMemberCtx: my, role: 'founder',\n vouchThreshold: ent.vouchThreshold ?? 1, // Bürgschaftsschwelle (Gruppenregel; UI zeigt sie nur > 1)\n vouchesReceived: new Map(), // Bürgschaften FÜR MICH (issuer -> vouch@2)\n myVouches: new Map(), // Bürgschaften VON MIR (candidate -> vouch@2)\n roster: new Map([[my.anchor, { name: p.name, card, addedAt: iso, founder: true }]]),\n threads: new Map(), // invitee member anchor -> { threadId, invite } (open invitations)\n }\n p.groups.set(genesisDigest, g)\n say(p, `Gruppe „${label}\" gegründet — Genesis unter Gründungs-pair-Anker, Member-Anker ${my.anchor.slice(0, 20)}… abgeleitet`)\n return g\n}\n\n// ── transport helper: sealed doc over an existing relationship channel ──\nasync function sendDoc (p: Person, contact: any, doc: any, ent: any = {}) {\n return { to: contact, env: await C.seal(doc, contact.channel.counterpartKa, ent) }\n}\nconst channelCtxOf = (p: Person, doc: any) => p.contexts.get(doc.recipient) ?? null\nconst contactByAnchor = (p: Person, anchor: string) => p.contacts.get(anchor) ?? null\nconst contactOfIssuer = (p: Person, issuer: string) => p.contacts.get(issuer) ?? null\n\n// ── prelude (Membership 1.2/3.1: the invitee supplies the member anchor) ─\nexport async function preludeRequest (p: Person, contactAnchor: string, genesisDigest: string, when: number, ent: any = {}) {\n const contact = contactByAnchor(p, contactAnchor)\n const g = p.groups.get(genesisDigest)\n const body = {\n id: uuid(ent.id), type: TT + 'membership-prelude-request@probe',\n issuer: contact.channel.own.anchor, recipient: contactAnchor,\n threadId: uuid(ent.threadId), issuedAt: C.iso(when),\n payload: { genesisDigest, group: g.groupDid, label: g.label },\n }\n const doc = await C.diSign(contact.channel.own, body, C.iso(when))\n say(p, `Prelude an ${contact.name}: genesisDigest der Gruppe „${g.label}\" über den Beziehungs-Kanal`)\n return sendDoc(p, contact, doc, ent)\n}\n\n// ── receive dispatch: every membership doc travels the channel sealed ───\n// Returns { handled, outbound?: [{to, env}], prompt?: entry }.\nexport async function receiveDoc (p: Person, env: any, when: number, ent: any = {}) {\n const opened = await C.openEnvelope(p, env) // Stufen 1–4, Cache-Lesung\n if (opened.duplicate) return { handled: true, duplicate: true }\n if (opened.error) return { handled: false }\n const r = await receiveDocInner(p, env, opened.doc, when, ent)\n if (r?.handled && !(r as any).error) C.effectDone(p, opened.digest)\n return r\n}\nasync function receiveDocInner (p: Person, env: any, doc: any, when: number, ent: any = {}) {\n const ctx = channelCtxOf(p, { recipient: env.rkid }) ?? p.contexts.get(env.rkid)\n if (!ctx) return { handled: false }\n if (typeof doc?.type !== 'string' || !doc.type.startsWith(TT + 'membership-')) return { handled: false, doc }\n // the sender is identified by the CHANNEL the envelope arrived on (rkid\n // names our own pair context of exactly one relationship) — membership\n // documents carry MEMBER anchors as issuer, which no contact key holds\n const from = [...p.contacts.values()].find((c) => c.channel?.own?.anchor === ctx.anchor) ?? contactOfIssuer(p, doc.issuer)\n switch (doc.type.slice((TT + 'membership-').length)) {\n case 'prelude-request@probe': {\n // form BEFORE fields (review 3, M-3): a valid signature binds\n // whatever was signed — payload.genesisDigest earns its type here\n if (!C.shaped(doc, { issuer: 'string', threadId: 'string', payload: 'object', proof: 'object' })\n || !C.shaped(doc.payload, { genesisDigest: 'string', group: 'string', label: 'string' })) return { handled: true, error: 'malformed prelude' }\n if (!from || !(await C.diVerify(doc, doc.issuer))) return { handled: true, error: 'prelude proof' }\n let my\n try { my = await memberContext(p, doc.payload.genesisDigest) } catch { return { handled: true, error: 'genesisDigest not canonical' } }\n const body = {\n id: uuid(), type: TT + 'membership-prelude-reply@probe',\n issuer: from.channel.own.anchor, recipient: doc.issuer,\n threadId: doc.threadId, issuedAt: C.iso(when),\n payload: { genesisDigest: doc.payload.genesisDigest, memberAnchor: my.anchor },\n }\n const reply = await C.diSign(from.channel.own, body, C.iso(when))\n say(p, `Prelude von ${from.name}: Member-Anker für „${doc.payload.label}\" abgeleitet und geantwortet`)\n return { handled: true, outbound: [await sendDoc(p, from, reply, ent)] }\n }\n case 'prelude-reply@probe': {\n if (!C.shaped(doc, { issuer: 'string', threadId: 'string', payload: 'object', proof: 'object' })\n || !C.shaped(doc.payload, { genesisDigest: 'string', memberAnchor: 'string' })\n || C.edRawOfAnchor(doc.payload.memberAnchor) === null) return { handled: true, error: 'malformed prelude-reply' }\n if (!from || !(await C.diVerify(doc, doc.issuer))) return { handled: true, error: 'prelude-reply proof' }\n const g = [...p.groups.values()].find((g) => g.genesisDigest === doc.payload.genesisDigest)\n if (!g) return { handled: true, error: 'unknown group' }\n // Log erst NACH dem gelungenen Bau; ein Schema-Throw aus\n // buildInvite verlässt die Empfangs-Promise nie (Review 9, P-B2)\n let inv\n try { inv = await buildInvite(p, g, from, doc.payload.memberAnchor, when, doc.threadId, ent) }\n catch (e: any) { return { handled: true, error: 'invite build: ' + String(e?.message ?? e) } }\n say(p, `${from.name}s Member-Anker erhalten — Einladung wird ausgestellt`)\n return { handled: true, outbound: [inv] }\n }\n case 'invite/0.2': return handleInvite(p, doc, from, when)\n case 'accept/0.2': return handleAccept(p, doc, from, when, ent)\n case 'welcome@probe': return handleWelcome(p, doc, from)\n case 'vouch/0.1': return handleVouch(p, doc, from)\n }\n return { handled: false, doc }\n}\n\n// ── the invite: a conformant DTG InvitationCredential (one carrier) ─────\nexport async function buildInvite (p: Person, g: any, contact: any, inviteeMemberAnchor: string, when: number, threadId: string, ent: any = {}) {\n const iso = C.iso(when), until = C.iso(when + 24 * 3600 * 1000)\n const inviterCard = await memberCard(g.myMemberCtx, p.name, iso)\n const credBody = {\n '@context': CTX3,\n type: ['VerifiableCredential', 'DTGCredential', 'InvitationCredential', 'MembershipInvite'],\n issuer: g.myMemberCtx.anchor,\n credentialSubject: { id: inviteeMemberAnchor, group: g.groupDid, genesisDigest: g.genesisDigest, card: inviterCard, name: g.label },\n validFrom: iso, validUntil: until, taskContext: threadId,\n }\n const invite = await C.diSign(g.myMemberCtx, credBody, iso)\n validOr({ invite }, 'payload-membership-invite.schema.json')\n const doc = { // document-level proof ABSENT: the credential is the one carrier (Membership 2)\n id: uuid(ent.docId), type: TT + 'membership-invite/0.2',\n issuer: g.myMemberCtx.anchor, recipient: inviteeMemberAnchor,\n threadId, issuedAt: iso, payload: { invite },\n }\n validOr(doc, 'rltp-delivery-document.schema.json')\n g.threads.set(inviteeMemberAnchor, { threadId, invite, contactAnchor: [...p.contacts.entries()].find(([, c]) => c === contact)![0] })\n say(p, `Einladung (InvitationCredential) an ${contact.name} — Thread ${threadId.slice(0, 8)}…`)\n return sendDoc(p, contact, doc, ent)\n}\n\nasync function handleInvite (p: Person, doc: any, from: any, when: number) {\n if (!from) return { handled: true, error: 'invite not from a held contact' }\n const inv = doc.payload?.invite\n try { validOr(doc.payload, 'payload-membership-invite.schema.json'); validOr(doc, 'rltp-delivery-document.schema.json') } catch (e: any) { say(p, 'Einladung schema-ungültig: ' + e.message); return { handled: true, error: 'schema' } }\n if ('proof' in doc) { say(p, 'Einladung trägt Dokument-Proof — one carrier verletzt'); return { handled: true, error: 'one-carrier' } }\n if (!(await C.diVerify(inv, inv.issuer))) return { handled: true, error: 'credential proof' }\n if (inv.issuer !== doc.issuer || inv.credentialSubject.id !== doc.recipient || inv.taskContext !== doc.threadId) return { handled: true, error: 'document bindings' }\n if (inv.credentialSubject.card.anchor !== inv.issuer || !(await C.diVerify(inv.credentialSubject.card, inv.issuer))) return { handled: true, error: 'card ownership' }\n const cardOK = !('sentTo' in inv.credentialSubject.card) && !('boundTo' in inv.credentialSubject.card) && !('deliveryHints' in inv.credentialSubject.card)\n if (!cardOK) return { handled: true, error: 'card enclosure profile' }\n if (![inv.validFrom, inv.validUntil, inv.proof.created].every(calOK) || tsec(inv.validUntil) < tsec(inv.validFrom)) return { handled: true, error: 'validity' }\n // THE PRELUDE CHECK (Membership 3.1): my own derivation from the\n // genesisDigest must equal credentialSubject.id — a substituted anchor\n // dies here, whatever the prelude's path was\n const my = await memberContext(p, inv.credentialSubject.genesisDigest)\n if (my.anchor !== inv.credentialSubject.id) { say(p, 'Prelude-Check FEHLGESCHLAGEN: Einladung nennt nicht meine Ableitung'); return { handled: true, error: 'prelude mismatch' } }\n const entry = { kind: 'invite', doc, invite: inv, from: from.name, fromAnchor: doc.issuer, fromContact: from, myMemberCtx: my, decided: false }\n p.inbox.push(entry)\n say(p, `${from.name} lädt dich in „${inv.credentialSubject.name ?? 'eine Gruppe'}\" ein (Einladung geprüft, Prelude-Check bestanden)`)\n return { handled: true, prompt: entry }\n}\n\n// ── the accept: consent, task-proved, credential-digest ref ─────────────\nexport async function acceptInvite (p: Person, entry: any, when: number, ent: any = {}) {\n const inv = entry.invite\n const iso = C.iso(when)\n const card = await memberCard(entry.myMemberCtx, p.name, iso)\n const payload = { accept: {\n group: inv.credentialSubject.group, subject: entry.myMemberCtx.anchor,\n ref: await C.digestDoc(inv), // the invitation identity: JCS over the COMPLETE credential incl. proof\n card, candidacy: ent.candidacy ?? false,\n } }\n validOr(payload, 'payload-membership-accept.schema.json')\n const body = {\n id: uuid(ent.docId), type: TT + 'membership-accept/0.2',\n issuer: entry.myMemberCtx.anchor, recipient: inv.issuer,\n threadId: inv.taskContext, issuedAt: iso, payload,\n }\n const doc = await C.diSign(entry.myMemberCtx, body, iso) // task proof under the subject (Membership 2)\n validOr(doc, 'rltp-delivery-document.schema.json')\n entry.decided = true; entry.accepted = true\n say(p, `Beitritt zu „${inv.credentialSubject.name}\" erklärt (Accept, ref = Credential-Digest)`)\n return sendDoc(p, entry.fromContact, doc, ent)\n}\n\n// ── admission: the Access 5.3 pair-internal checks, then roster + welcome ─\nasync function handleAccept (p: Person, doc: any, from: any, when: number, ent: any = {}) {\n const g = [...p.groups.values()].find((g) => g.threads.has(doc.issuer))\n if (!g) return { handled: true, error: 'no open invitation for this subject' }\n const th = g.threads.get(doc.issuer)\n const inv = th.invite, acc = doc.payload?.accept\n const fail = async (why: string) => { say(p, `Admission abgelehnt: ${why}`); return { handled: true, error: why } }\n try { validOr(doc.payload, 'payload-membership-accept.schema.json'); validOr(doc, 'rltp-delivery-document.schema.json') } catch { return fail('schema') }\n if (!(await C.diVerify(doc, doc.issuer))) return fail('accept task proof')\n if (!sameDigest(acc.ref, await C.digestDoc(inv))) return fail('ref ≠ credential digest') // decoded-bytes equality\n if (acc.subject !== inv.credentialSubject.id || acc.subject !== doc.issuer) return fail('subject binding')\n if (acc.group !== inv.credentialSubject.group || !sameDigest(inv.credentialSubject.genesisDigest, g.genesisDigest)) return fail('group binding')\n if (doc.threadId !== inv.taskContext) return fail('thread binding')\n if (acc.card.anchor !== acc.subject || !(await C.diVerify(acc.card, acc.subject))) return fail('card ownership')\n if (('sentTo' in acc.card) || ('boundTo' in acc.card) || ('deliveryHints' in acc.card)) return fail('card enclosure profile')\n if (![doc.issuedAt, doc.proof.created].every(calOK)) return fail('calendar validity')\n if (tsec(doc.issuedAt) > tsec(inv.validUntil) + MEMBERSHIP_SKEW * 1000 || tsec(doc.proof.created) > tsec(inv.validUntil) + MEMBERSHIP_SKEW * 1000) return fail('accept after validUntil + membership-skew')\n if (Buffer_(jcs(doc)) > 16384 || Buffer_(jcs({ invite: inv })) > 16384) return fail('size budget')\n if (!g.roster.has(inv.issuer)) return fail('inviter not a member')\n if (g.roster.has(acc.subject)) { say(p, 'Same-Subject-Admission: idempotent'); return { handled: true, idempotent: true } }\n // ATOMICITY (review 3, B-2): every await that can fail — digest,\n // signing, sealing — happens BEFORE the first state mutation. If the\n // welcome cannot be built, the roster has not grown, the thread still\n // stands, and the SAME delivery can be retried cleanly.\n const newEntry = { name: acc.card.name, card: acc.card, addedAt: C.iso(when), candidacy: acc.candidacy === true,\n acceptDigest: await C.digestDoc(doc), contactAnchor: th.contactAnchor }\n const contact = contactByAnchor(p, th.contactAnchor)\n const rosterAfter = [...g.roster.entries(), [acc.subject, newEntry] as const]\n const wBody = {\n id: uuid(), type: TT + 'membership-welcome@probe',\n issuer: g.myMemberCtx.anchor, recipient: acc.subject,\n threadId: doc.threadId, issuedAt: C.iso(when),\n payload: { genesisDigest: g.genesisDigest, group: g.groupDid, label: g.label, genesis: g.genesis, vouchThreshold: g.vouchThreshold ?? 1,\n roster: rosterAfter.map(([anchor, m]: any) => ({ anchor, name: m.name, addedAt: m.addedAt, founder: !!m.founder, candidacy: !!m.candidacy, acceptDigest: m.acceptDigest ?? null })) },\n }\n const welcome = await sendDoc(p, contact, await C.diSign(g.myMemberCtx, wBody, C.iso(when)), ent)\n // — from here on, synchronous only —\n g.roster.set(acc.subject, newEntry)\n { const c = contactByAnchor(p, th.contactAnchor); if (c) (c.sharedGroups ??= []).push(g.genesisDigest) } // der Inviter WEISS, wer beigetreten ist\n g.threads.delete(doc.issuer)\n say(p, `${acc.card.name} ist Mitglied von „${g.label}\" — Admission kanonisch, Consent konsumiert`)\n return { handled: true, admitted: acc.subject, outbound: [welcome] }\n}\nconst Buffer_ = (s: any) => new TextEncoder().encode(s).length\n\nasync function handleWelcome (p: Person, doc: any, from: any) {\n // form BEFORE fields (M-3): the roster travels as data and becomes\n // this person's map — every entry earns its shape before adoption\n if (!C.shaped(doc, { issuer: 'string', recipient: 'string', payload: 'object', proof: 'object' })\n || !C.shaped(doc.payload, { genesisDigest: 'string', group: 'string', label: 'string', roster: 'array' })\n || !doc.payload.roster.every((m: any) => C.shaped(m, { anchor: 'string', name: 'string', addedAt: 'string' }))) return { handled: true, error: 'malformed welcome' }\n if (toU(doc.payload.genesisDigest) !== doc.payload.genesisDigest) return { handled: true, error: 'malformed welcome (genesisDigest)' }\n if (!(await C.diVerify(doc, doc.issuer))) return { handled: true, error: 'welcome proof' }\n const gd = doc.payload.genesisDigest\n let my\n try { my = await memberContext(p, gd) } catch { return { handled: true, error: 'genesisDigest not canonical' } }\n if (doc.recipient !== my.anchor) return { handled: true, error: 'welcome not for my member anchor' }\n const g: any = {\n label: doc.payload.label, groupDid: doc.payload.group, genesisDigest: gd,\n genesis: doc.payload.genesis, myMemberCtx: my, role: 'member',\n vouchThreshold: doc.payload.vouchThreshold ?? 1,\n vouchesReceived: new Map(), myVouches: new Map(),\n roster: new Map(doc.payload.roster.map((m: any) => [m.anchor, m])),\n threads: new Map(),\n }\n g.myAcceptDigest = g.roster.get(my.anchor)?.acceptDigest ?? null\n p.groups.set(gd, g)\n if (from) (from.sharedGroups ??= []).push(gd) // der Invitee WEISS, wer ihn eingeladen hat\n say(p, `Willkommen in „${g.label}\" — Roster mit ${g.roster.size} Mitgliedern übernommen`)\n return { handled: true, joined: gd }\n}\n\n// ── die Bürgschaft (Task membership-vouch/0.1, Artefakt vouch@2) ────────\n// ein konformes DTG EndorsementCredential ──────────────────────────────\n// (AdmissionVouch, Access 4.2/4.3): genesisDigest bindet die Gruppe,\n// accept bindet die KONSENTIERTE Kandidatur (keine stehende Bürgschaft),\n// provenance ist selbst-attestiert (met | introduced). Signiert unter dem\n// MEMBER-Anker des Bürgen; schema-validiert bei Ausstellung UND Empfang.\n// Transport (probe): über den Beziehungs-Kanal zum KANDIDATEN — nur wer\n// einen Kanal zum Kandidaten hält, kann liefern (per-device-Wissen,\n// nichts wird erfunden); der Kandidat sammelt und zählt gegen die\n// Schwelle. Gruppenweite Sichtbarkeit der Zählung = Access-Envelope-Ring.\nexport async function vouchFor (p: Person, genesisDigest: string, candidateAnchor: string, provenance: any, when: number, ent: any = {}) {\n const g = p.groups.get(genesisDigest)\n const m = g?.roster.get(candidateAnchor)\n if (!g || !m) return { error: 'unbekannter Kandidat' }\n if (!m.candidacy) return { error: 'keine sichtbare Kandidatur (Opt-in fehlt)' }\n if (!m.acceptDigest) return { error: 'kein accept-Bezug — Bürgschaft wäre stehend' }\n if (!m.contactAnchor || !p.contacts.get(m.contactAnchor)) return { error: 'kein Kanal zum Kandidaten' }\n if (g.myVouches.has(candidateAnchor)) return { error: 'bereits gebürgt' }\n const iso = C.iso(when)\n const cred = await C.diSign(g.myMemberCtx, {\n '@context': CTX3,\n type: ['VerifiableCredential', 'DTGCredential', 'EndorsementCredential', 'AdmissionVouch'],\n issuer: g.myMemberCtx.anchor,\n validFrom: iso,\n credentialSubject: { id: candidateAnchor, endorsement: {\n type: 'AdmissionVouch', genesisDigest: toU(g.genesisDigest), accept: toU(m.acceptDigest), provenance } },\n }, iso)\n validOr(cred, 'access-vouch.schema.json')\n g.myVouches.set(candidateAnchor, cred)\n const contact = p.contacts.get(m.contactAnchor)\n const doc = {\n id: uuid(ent.docId), type: TT + 'membership-vouch/0.1',\n issuer: g.myMemberCtx.anchor, recipient: candidateAnchor,\n threadId: uuid(ent.threadId), issuedAt: iso, payload: { vouch: cred },\n }\n say(p, `Bürgschaft für ${m.name} in „${g.label}\" ausgestellt (${provenance}, accept-gebunden)`)\n return sendDoc(p, contact, await C.diSign(g.myMemberCtx, doc, iso), ent)\n}\n\n// Kandidatenseite: jede Prüfung an ihrem Punkt, dann zählen\nasync function handleVouch (p: Person, doc: any, from: any) {\n const cred = doc.payload?.vouch\n const g = [...p.groups.values()].find((g) => cred && sameDigest(cred.credentialSubject?.endorsement?.genesisDigest ?? '', g.genesisDigest))\n const fail = (why: string) => { say(p, `Bürgschaft verworfen: ${why}`); return { handled: true, error: why } }\n if (!g) return fail('unbekannte Gruppe')\n try { validOr(cred, 'access-vouch.schema.json') } catch { return fail('schema') }\n if (!(await C.diVerify(cred, cred.issuer)) || !(await C.diVerify(doc, doc.issuer))) return fail('proof')\n if (cred.issuer !== doc.issuer) return fail('issuer binding')\n if (!g.roster.has(cred.issuer)) return fail('Bürge ist kein Mitglied')\n if (cred.credentialSubject.id !== g.myMemberCtx.anchor) return fail('nicht für mich')\n if (!g.myAcceptDigest || !sameDigest(cred.credentialSubject.endorsement.accept, g.myAcceptDigest)) return fail('accept-Bindung')\n if (g.vouchesReceived.has(cred.issuer)) { say(p, 'Bürgschaft doppelt — idempotent'); return { handled: true, idempotent: true } }\n g.vouchesReceived.set(cred.issuer, cred)\n const n = g.vouchesReceived.size, need = g.vouchThreshold ?? 1\n if (n >= need) {\n const me = g.roster.get(g.myMemberCtx.anchor)\n if (me) me.candidacy = false\n g.candidacyFulfilled = true\n say(p, `Bürgschaft von ${g.roster.get(cred.issuer)?.name ?? '?'} — Schwelle erreicht (${n}/${need}), Kandidatur erfüllt`)\n } else {\n say(p, `Bürgschaft von ${g.roster.get(cred.issuer)?.name ?? '?'} erhalten (${n}/${need})`)\n }\n return { handled: true, vouched: cred.issuer, fulfilled: n >= need }\n}\n"]}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import * as C from './deps.js';
|
|
2
|
+
import type { Person } from './deps.js';
|
|
3
|
+
export declare function hmac(keyBytes: Uint8Array, msg: string): Promise<string>;
|
|
4
|
+
export declare function communityContext(p: Person): Promise<C.Context>;
|
|
5
|
+
export declare const selfCard: (p: Person, whenIso: string) => Promise<C.CardBody & {
|
|
6
|
+
proof: Record<string, any>;
|
|
7
|
+
}>;
|
|
8
|
+
export declare function makeMapping(p: Person, counterpartAnchor: string, when: number): Promise<{
|
|
9
|
+
body: {
|
|
10
|
+
type: string;
|
|
11
|
+
pair: string;
|
|
12
|
+
self: string;
|
|
13
|
+
to: string;
|
|
14
|
+
issuedAt: string;
|
|
15
|
+
};
|
|
16
|
+
card: C.CardBody & {
|
|
17
|
+
proof: Record<string, any>;
|
|
18
|
+
};
|
|
19
|
+
mac1: string;
|
|
20
|
+
mac2: string;
|
|
21
|
+
}>;
|
|
22
|
+
export declare function verifyMapping(p: Person, m: any): Promise<boolean>;
|
|
23
|
+
export declare function forgeMapping(forger: Person, victimCard: any, pairAnchor: string, when: number): Promise<{
|
|
24
|
+
body: {
|
|
25
|
+
type: string;
|
|
26
|
+
pair: string;
|
|
27
|
+
self: string;
|
|
28
|
+
to: string;
|
|
29
|
+
issuedAt: string;
|
|
30
|
+
};
|
|
31
|
+
card: any;
|
|
32
|
+
mac1: string;
|
|
33
|
+
mac2: string;
|
|
34
|
+
}>;
|
|
35
|
+
export declare function buildStar(p: Person, contact: any): Promise<{
|
|
36
|
+
salt: string;
|
|
37
|
+
count: number;
|
|
38
|
+
blinded: string[];
|
|
39
|
+
}>;
|
|
40
|
+
export declare function starMatch(p: Person, entry: any, snap: any, anchor: string): Promise<any>;
|
|
41
|
+
export declare function refreshStarInfo(p: Person): Promise<void>;
|
|
42
|
+
export declare function setTrust(p: Person, counterpartAnchor: string, when: number, ent?: any): Promise<{
|
|
43
|
+
error: string;
|
|
44
|
+
to?: undefined;
|
|
45
|
+
env?: undefined;
|
|
46
|
+
} | {
|
|
47
|
+
to: any;
|
|
48
|
+
env: C.Envelope;
|
|
49
|
+
error?: undefined;
|
|
50
|
+
}>;
|
|
51
|
+
export declare function setTrustPaused(p: Person, counterpartAnchor: string, paused: boolean): void;
|
|
52
|
+
/**
|
|
53
|
+
* Refresh every deliverable star. Per-recipient resilience (review 5,
|
|
54
|
+
* M-1): a failure for ONE recipient never discards the stars already
|
|
55
|
+
* built for others — the result carries the sealed outbound plus a
|
|
56
|
+
* named failure list. THE CONTRACT: the caller (host application) owns
|
|
57
|
+
* redelivery of failed refreshes, e.g. by calling this again; a failed
|
|
58
|
+
* refresh is a SEND problem, never grounds to redeliver the inbound
|
|
59
|
+
* document (its effect is complete and cached).
|
|
60
|
+
*/
|
|
61
|
+
export declare function starRefreshAll(p: Person, when: number, ent?: any): Promise<{
|
|
62
|
+
to: any;
|
|
63
|
+
env: C.Envelope;
|
|
64
|
+
}[] & {
|
|
65
|
+
failures: {
|
|
66
|
+
to: string;
|
|
67
|
+
error: string;
|
|
68
|
+
}[];
|
|
69
|
+
}>;
|
|
70
|
+
export declare function receiveTrustDoc(p: Person, env: any, when: number, ent?: any): Promise<{
|
|
71
|
+
handled: boolean;
|
|
72
|
+
doc: any;
|
|
73
|
+
error?: undefined;
|
|
74
|
+
disclosed?: undefined;
|
|
75
|
+
fromName?: undefined;
|
|
76
|
+
outbound?: undefined;
|
|
77
|
+
outboundError?: undefined;
|
|
78
|
+
star?: undefined;
|
|
79
|
+
} | {
|
|
80
|
+
handled: boolean;
|
|
81
|
+
error: string;
|
|
82
|
+
doc?: undefined;
|
|
83
|
+
disclosed?: undefined;
|
|
84
|
+
fromName?: undefined;
|
|
85
|
+
outbound?: undefined;
|
|
86
|
+
outboundError?: undefined;
|
|
87
|
+
star?: undefined;
|
|
88
|
+
} | {
|
|
89
|
+
handled: boolean;
|
|
90
|
+
disclosed: any;
|
|
91
|
+
fromName: any;
|
|
92
|
+
outbound: {
|
|
93
|
+
to: any;
|
|
94
|
+
env: C.Envelope;
|
|
95
|
+
}[];
|
|
96
|
+
outboundError: string | undefined;
|
|
97
|
+
doc?: undefined;
|
|
98
|
+
error?: undefined;
|
|
99
|
+
star?: undefined;
|
|
100
|
+
} | {
|
|
101
|
+
handled: boolean;
|
|
102
|
+
star: boolean;
|
|
103
|
+
doc?: undefined;
|
|
104
|
+
error?: undefined;
|
|
105
|
+
disclosed?: undefined;
|
|
106
|
+
fromName?: undefined;
|
|
107
|
+
outbound?: undefined;
|
|
108
|
+
outboundError?: undefined;
|
|
109
|
+
} | {
|
|
110
|
+
handled: boolean;
|
|
111
|
+
duplicate: boolean;
|
|
112
|
+
} | {
|
|
113
|
+
handled: boolean;
|
|
114
|
+
duplicate?: undefined;
|
|
115
|
+
}>;
|
|
116
|
+
//# sourceMappingURL=trust.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trust.d.ts","sourceRoot":"","sources":["../../src/probe/trust.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,CAAC,MAAM,WAAW,CAAA;AAC9B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AASvC,wBAAsB,IAAI,CAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,mBAG5D;AAID,wBAAsB,gBAAgB,CAAE,CAAC,EAAE,MAAM,sBAGhD;AACD,eAAO,MAAM,QAAQ,GAAU,GAAG,MAAM,EAAE,SAAS,MAAM;;EAGxD,CAAA;AAWD,wBAAsB,WAAW,CAAE,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;;;;;;;;;;;;GAWpF;AAGD,wBAAsB,aAAa,CAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,oBAerD;AAKD,wBAAsB,YAAY,CAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;;;;;;;;;;GASpG;AAsCD,wBAAgB,SAAS,CAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG;;;;GAOjD;AAED,wBAAsB,SAAS,CAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,gBAGhF;AAGD,wBAAsB,eAAe,CAAE,CAAC,EAAE,MAAM,iBAY/C;AASD,wBAAsB,QAAQ,CAAE,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;;;;;;GAoChG;AACD,wBAAgB,cAAc,CAAE,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,QAKpF;AAID;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;;;YAEpD,MAAM;eAAS,MAAM;;GAqB5C;AAGD,wBAAsB,eAAe,CAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,GAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAOtF"}
|
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
// trust.mjs — Stufe 2 des Redesigns: der EXPLIZITE VERTRAUENSAKT
|
|
2
|
+
// (aufgeschobene Anker-Offenlegung), der geblendete Stern und die
|
|
3
|
+
// Pause-Semantik. PROBE, DOM-frei, auf rltp-core + rltp-crypto.
|
|
4
|
+
//
|
|
5
|
+
// DAS MODELL (portiert aus graph-web.mjs auf den WebCrypto-Stack):
|
|
6
|
+
// Vertrauensakt = EINSEITIGE Offenlegungsentscheidung. A liefert an B:
|
|
7
|
+
// 1. das kreuz-MAC-te anchor-mapping pair→self (Designated Verifier:
|
|
8
|
+
// BEIDE MACs könnte auch B selbst berechnen — ein geleaktes
|
|
9
|
+
// Mapping beweist Dritten NICHTS; forgeMapping demonstriert das),
|
|
10
|
+
// 2. die eigene Self-Card (stabiler Anker + keyAgreement),
|
|
11
|
+
// 3. den geblendeten Stern-Schnappschuss.
|
|
12
|
+
// B VERIFIZIERT das Mapping mit den eigenen Geheimnissen, bevor die
|
|
13
|
+
// Verknüpfung akzeptiert wird. Pausieren stoppt nur KÜNFTIGE
|
|
14
|
+
// Lieferungen — Geliefertes bleibt (Einweg-Tür, irreversibles Wissen).
|
|
15
|
+
//
|
|
16
|
+
// Stern (Publikums-Prinzip, Klasse D): der Sender leitet NIE rohe
|
|
17
|
+
// Dritt-Anker weiter. Jeder gehaltene Self-Anker reist als
|
|
18
|
+
// HMAC(k, anchor) unter dem Beziehungs-Schlüssel k; der Empfänger kann
|
|
19
|
+
// nur Anker testen, die er selbst legitim hält („gemeinsame Kontakte"),
|
|
20
|
+
// und sonst nichts. Epochales Blenden: salt = monotone Sequenznummer
|
|
21
|
+
// pro Beziehung; Listen SORTIERT (Lieferreihenfolge leakt nichts).
|
|
22
|
+
// Ehrlicher Rest: 1-Bit-Orakel über gehaltene Anker + die Zählung.
|
|
23
|
+
import { jcs } from '../core.js';
|
|
24
|
+
import * as C from './deps.js';
|
|
25
|
+
const te = new TextEncoder();
|
|
26
|
+
const S = globalThis.crypto.subtle;
|
|
27
|
+
const TT = 'https://real-life.org/trust-tasks/';
|
|
28
|
+
const say = (p, m) => p.log.push(m);
|
|
29
|
+
const uuid = (ent) => ent ?? globalThis.crypto.randomUUID();
|
|
30
|
+
// ── Primitiven ──────────────────────────────────────────────────────────
|
|
31
|
+
export async function hmac(keyBytes, msg) {
|
|
32
|
+
const k = await S.importKey('raw', keyBytes, { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
|
|
33
|
+
return C.b64uOf(new Uint8Array(await S.sign('HMAC', k, te.encode(msg))));
|
|
34
|
+
}
|
|
35
|
+
// der stabile soziale Anker = COMMUNITY-ANKER (Identity 0.13, S-DID-Schnitt):
|
|
36
|
+
// gewöhnlicher Gruppen-Kontext über die Genesis der persönlichen Community —
|
|
37
|
+
// nie mehr die zero-input-Recovery-Strings
|
|
38
|
+
export async function communityContext(p) {
|
|
39
|
+
if (!p.selfCtx)
|
|
40
|
+
p.selfCtx = await C.communityContext(p.rootIkm, p.communityGenesis);
|
|
41
|
+
return p.selfCtx;
|
|
42
|
+
}
|
|
43
|
+
export const selfCard = async (p, whenIso) => {
|
|
44
|
+
const s = await communityContext(p);
|
|
45
|
+
return C.signCard(s, C.cardBody(s, { name: p.name }), whenIso);
|
|
46
|
+
};
|
|
47
|
+
// Beziehungs-Schlüssel: X25519 zwischen den pair-Kontexten des Kanals
|
|
48
|
+
const chShared = (contact) => C.ecdh(contact.channel.own.x.priv, C.xRawOfMk(contact.channel.counterpartKa));
|
|
49
|
+
const relKey = async (contact, info) => C.hkdf(await chShared(contact), info);
|
|
50
|
+
// ── anchor-mapping@2 (Designated Verifier, Doppel-MAC) ──────────────────
|
|
51
|
+
// mac1: Kanal-DH (pairA × pairB) · mac2: selfA × pairB — der Empfänger
|
|
52
|
+
// rechnet mac2 mit SEINEM pair-Privkey gegen die Self-Card nach. Beide
|
|
53
|
+
// Schlüssel kann auch der Empfänger allein ableiten: Abstreitbarkeit.
|
|
54
|
+
const mappingBody = (pairAnchor, selfAnchor, toPairAnchor, whenIso) => ({ type: 'anchor-mapping@2', pair: pairAnchor, self: selfAnchor, to: toPairAnchor, issuedAt: whenIso });
|
|
55
|
+
export async function makeMapping(p, counterpartAnchor, when) {
|
|
56
|
+
const contact = p.contacts.get(counterpartAnchor);
|
|
57
|
+
const s = await communityContext(p);
|
|
58
|
+
const whenIso = C.iso(when);
|
|
59
|
+
const card = await selfCard(p, whenIso);
|
|
60
|
+
const body = mappingBody(contact.channel.own.anchor, s.anchor, counterpartAnchor, whenIso);
|
|
61
|
+
const msg = jcs(body);
|
|
62
|
+
const theirKa = C.xRawOfMk(contact.channel.counterpartKa);
|
|
63
|
+
return { body, card,
|
|
64
|
+
mac1: await hmac(await relKey(contact, 'rltp/trust/mac/map1'), msg),
|
|
65
|
+
mac2: await hmac(await C.hkdf(await C.ecdh(s.x.priv, theirKa), 'rltp/trust/mac/map2'), msg) };
|
|
66
|
+
}
|
|
67
|
+
// Verifikation ist EMPFÄNGER-PRIVAT: sie BRAUCHT die eigenen Geheimnisse
|
|
68
|
+
// (das ist der Punkt — ein Dritter kann nicht einmal die Gültigkeit prüfen)
|
|
69
|
+
export async function verifyMapping(p, m) {
|
|
70
|
+
try {
|
|
71
|
+
const b = m?.body;
|
|
72
|
+
if (!b || b.type !== 'anchor-mapping@2')
|
|
73
|
+
return false;
|
|
74
|
+
const entry = p.contacts.get(b.pair);
|
|
75
|
+
if (!entry?.channel?.own)
|
|
76
|
+
return false;
|
|
77
|
+
if (b.to !== entry.channel.own.anchor)
|
|
78
|
+
return false;
|
|
79
|
+
const card = m.card;
|
|
80
|
+
if (card?.anchor !== b.self || !(await C.diVerify(card, b.self)))
|
|
81
|
+
return false;
|
|
82
|
+
const msg = jcs(b);
|
|
83
|
+
if ((await hmac(await relKey(entry, 'rltp/trust/mac/map1'), msg)) !== m.mac1)
|
|
84
|
+
return false;
|
|
85
|
+
const k2 = await C.hkdf(await C.ecdh(entry.channel.own.x.priv, C.xRawOfMk(card.keyAgreement)), 'rltp/trust/mac/map2');
|
|
86
|
+
if ((await hmac(k2, msg)) !== m.mac2)
|
|
87
|
+
return false;
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// die Abstreitbarkeits-Demo: der EMPFÄNGER fabriziert ein Mapping, das
|
|
95
|
+
// einen beliebigen pair-Anker an ein beliebiges Self bindet, dessen Card
|
|
96
|
+
// er hält — es verifiziert identisch. Genau darum überzeugt ein
|
|
97
|
+
// geleaktes Mapping niemanden.
|
|
98
|
+
export async function forgeMapping(forger, victimCard, pairAnchor, when) {
|
|
99
|
+
const entry = forger.contacts.get(pairAnchor);
|
|
100
|
+
const whenIso = C.iso(when);
|
|
101
|
+
const body = mappingBody(pairAnchor, victimCard.anchor, entry.channel.own.anchor, whenIso);
|
|
102
|
+
const msg = jcs(body);
|
|
103
|
+
const k2 = await C.hkdf(await C.ecdh(entry.channel.own.x.priv, C.xRawOfMk(victimCard.keyAgreement)), 'rltp/trust/mac/map2');
|
|
104
|
+
return { body, card: victimCard,
|
|
105
|
+
mac1: await hmac(await relKey(entry, 'rltp/trust/mac/map1'), msg),
|
|
106
|
+
mac2: await hmac(k2, msg) };
|
|
107
|
+
}
|
|
108
|
+
// ── der geblendete Stern ────────────────────────────────────────────────
|
|
109
|
+
// Sequenz-Reservierung: SYNCHRON vor jedem await, damit zwei
|
|
110
|
+
// nebenläufige Aufrufe nie denselben Salt ziehen (Review 6, B-1).
|
|
111
|
+
// Ein bei Fehlschlag verbrannter Salt ist erlaubt — die Sequenz ist
|
|
112
|
+
// strikt monoton, nicht lückenlos.
|
|
113
|
+
const reserveStarSeq = (contact) => {
|
|
114
|
+
contact.starSeqNext = Math.max(contact.starSeqNext ?? 0, contact.starSeq ?? 0) + 1;
|
|
115
|
+
return contact.starSeqNext;
|
|
116
|
+
};
|
|
117
|
+
const commitStar = (contact, seq, snap) => {
|
|
118
|
+
// das Journal hält NUR den High-Water-Stern: ein verspätet fertig
|
|
119
|
+
// gewordener kleinerer Salt rollt sentStar nicht zurück (Review 7, B-2)
|
|
120
|
+
if (seq > (contact.starSeq ?? 0)) {
|
|
121
|
+
contact.starSeq = seq;
|
|
122
|
+
contact.sentStar = snap;
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
// Produktion pro Kontakt SERIALISIERT: die Reservierung macht Salts
|
|
126
|
+
// eindeutig, erst die Kette macht ihre AUSLIEFERUNG streng steigend —
|
|
127
|
+
// der Empfänger verwirft normativ jeden nicht strikt größeren Salt
|
|
128
|
+
const withStarLock = (contact, fn) => {
|
|
129
|
+
const run = (contact.starLock ?? Promise.resolve()).then(fn, fn);
|
|
130
|
+
contact.starLock = run.catch(() => { });
|
|
131
|
+
return run;
|
|
132
|
+
};
|
|
133
|
+
// reine Berechnung — mutiert NICHTS; Sequenz kommt aus reserveStarSeq
|
|
134
|
+
async function buildStarPure(p, contact, seq) {
|
|
135
|
+
const salt = String(seq);
|
|
136
|
+
const k = await relKey(contact, 'rltp/trust/blind/star/' + salt);
|
|
137
|
+
const blinded = [];
|
|
138
|
+
let count = 0;
|
|
139
|
+
for (const e of p.contacts.values()) {
|
|
140
|
+
if (!e.selfAnchor)
|
|
141
|
+
continue;
|
|
142
|
+
count++;
|
|
143
|
+
blinded.push(await hmac(k, e.selfAnchor));
|
|
144
|
+
}
|
|
145
|
+
blinded.sort();
|
|
146
|
+
return { salt, count, blinded };
|
|
147
|
+
}
|
|
148
|
+
export function buildStar(p, contact) {
|
|
149
|
+
return withStarLock(contact, async () => {
|
|
150
|
+
const seq = reserveStarSeq(contact);
|
|
151
|
+
const snap = await buildStarPure(p, contact, seq);
|
|
152
|
+
commitStar(contact, seq, snap); // Sender-Journal: was ich hier zuletzt geliefert habe
|
|
153
|
+
return snap;
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
// Empfängerseite: denselben Lieferschlüssel nachrechnen, EINEN Anker testen
|
|
157
|
+
export async function starMatch(p, entry, snap, anchor) {
|
|
158
|
+
const k = await relKey(entry, 'rltp/trust/blind/star/' + snap.salt);
|
|
159
|
+
return snap.blinded.includes(await hmac(k, anchor));
|
|
160
|
+
}
|
|
161
|
+
// Cache für die synchrone UI: pro Kontakt { count, knownNames } aus dem
|
|
162
|
+
// empfangenen Schnappschuss gegen die EIGENEN gehaltenen Self-Anker.
|
|
163
|
+
export async function refreshStarInfo(p) {
|
|
164
|
+
for (const [key, entry] of p.contacts) {
|
|
165
|
+
if (!entry.starReceived || !entry.channel?.own)
|
|
166
|
+
continue;
|
|
167
|
+
const known = [];
|
|
168
|
+
const seen = new Set();
|
|
169
|
+
for (const [k2, e] of p.contacts) {
|
|
170
|
+
if (k2 === key || !e.selfAnchor || seen.has(e.selfAnchor))
|
|
171
|
+
continue;
|
|
172
|
+
seen.add(e.selfAnchor);
|
|
173
|
+
if (await starMatch(p, entry, entry.starReceived, e.selfAnchor))
|
|
174
|
+
known.push(e.name);
|
|
175
|
+
}
|
|
176
|
+
entry.starInfo = { count: entry.starReceived.count, knownNames: known.sort() };
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// ── der Vertrauensakt ───────────────────────────────────────────────────
|
|
180
|
+
// Erlaubt für ✓ (Zeremonie) UND ⇄ (vorgestellt, beidseitig) — Vertrauen
|
|
181
|
+
// ist eine OFFENLEGUNGS-Entscheidung, keine Verifikations-Behauptung
|
|
182
|
+
// (Antons Entscheid 24.08.); die UI benennt bei ⇄ ehrlich die
|
|
183
|
+
// Vermittler-Abhängigkeit. Gesperrt bleibt ◇: einseitig hast du nichts
|
|
184
|
+
// freigegeben — es existiert kein eigener Kanal-Kontext für das Mapping.
|
|
185
|
+
// Einweg-Tür: trustGiven bleibt; Pausieren stoppt nur das Abo.
|
|
186
|
+
export async function setTrust(p, counterpartAnchor, when, ent = {}) {
|
|
187
|
+
const contact = p.contacts.get(counterpartAnchor);
|
|
188
|
+
if (!contact)
|
|
189
|
+
return { error: 'kein Kontakt' };
|
|
190
|
+
if (!contact.channel?.own)
|
|
191
|
+
return { error: 'kein eigener Kanal — einseitig (◇) hast du nichts freigegeben' };
|
|
192
|
+
if (contact.trustGiven)
|
|
193
|
+
return { error: 'bereits geschenkt (Einweg-Tür)' };
|
|
194
|
+
// In-flight-Latch (Review 6, B-1): der Latch fällt SYNCHRON — zwei
|
|
195
|
+
// nebenläufige Aufrufe können die offene Tür nicht beide bestehen
|
|
196
|
+
if (contact.trustPending)
|
|
197
|
+
return { error: 'bereits unterwegs (Einweg-Tür)' };
|
|
198
|
+
contact.trustPending = true;
|
|
199
|
+
try {
|
|
200
|
+
// ALLES Fehlbare — auch die Zeitform (when=NaN wirft) — liegt im
|
|
201
|
+
// try, dessen finally den Latch räumt (Review 7, B-1)
|
|
202
|
+
const whenIso = C.iso(when);
|
|
203
|
+
// die Tür schließt erst, wenn die Disclosure WIRKLICH existiert
|
|
204
|
+
// (Review 5, B-5): alles Fehlbare läuft vor den Journal-Mutationen
|
|
205
|
+
const mapping = await makeMapping(p, counterpartAnchor, when);
|
|
206
|
+
// Stern-Abschnitt unter dem Kontakt-Lock: Reservierung, Bau, Siegel
|
|
207
|
+
// und Commit in EINEM geordneten Zug (Review 7, B-2)
|
|
208
|
+
const { env, star, seq } = await withStarLock(contact, async () => {
|
|
209
|
+
const seq = reserveStarSeq(contact);
|
|
210
|
+
const star = await buildStarPure(p, contact, seq);
|
|
211
|
+
const body = {
|
|
212
|
+
id: uuid(ent.id), type: TT + 'trust-disclosure@probe',
|
|
213
|
+
issuer: contact.channel.own.anchor, recipient: counterpartAnchor,
|
|
214
|
+
issuedAt: whenIso, payload: { mapping, star },
|
|
215
|
+
};
|
|
216
|
+
const doc = await C.diSign(contact.channel.own, body, whenIso);
|
|
217
|
+
const env = await C.seal(doc, contact.channel.counterpartKa, ent);
|
|
218
|
+
commitStar(contact, seq, star);
|
|
219
|
+
return { env, star, seq };
|
|
220
|
+
});
|
|
221
|
+
contact.trustGiven = whenIso;
|
|
222
|
+
contact.sentMapping = mapping; // Sender-Journal: die geöffnete Einweg-Tür
|
|
223
|
+
say(p, `Vertrauen geschenkt an ${contact.name}: stabiler Anker offengelegt (DV-Mapping) + Kontakt-Updates aktiv`);
|
|
224
|
+
return { to: contact, env };
|
|
225
|
+
}
|
|
226
|
+
finally {
|
|
227
|
+
contact.trustPending = false;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
export function setTrustPaused(p, counterpartAnchor, paused) {
|
|
231
|
+
const contact = p.contacts.get(counterpartAnchor);
|
|
232
|
+
if (!contact?.trustGiven)
|
|
233
|
+
return;
|
|
234
|
+
contact.trustPaused = !!paused;
|
|
235
|
+
say(p, paused ? `Kontakt-Updates an ${contact.name} pausiert (Geliefertes bleibt)` : `Kontakt-Updates an ${contact.name} wieder aktiv`);
|
|
236
|
+
}
|
|
237
|
+
// Bestand geändert (neuer Self-Anker gehalten) → Stern überall auffrischen,
|
|
238
|
+
// wo ich vertraue und nicht pausiert habe. Ohne das frieren Sterne in der
|
|
239
|
+
// Toggle-Reihenfolge ein (Antons Erstlauf-Befund im Graph-Simulator).
|
|
240
|
+
/**
|
|
241
|
+
* Refresh every deliverable star. Per-recipient resilience (review 5,
|
|
242
|
+
* M-1): a failure for ONE recipient never discards the stars already
|
|
243
|
+
* built for others — the result carries the sealed outbound plus a
|
|
244
|
+
* named failure list. THE CONTRACT: the caller (host application) owns
|
|
245
|
+
* redelivery of failed refreshes, e.g. by calling this again; a failed
|
|
246
|
+
* refresh is a SEND problem, never grounds to redeliver the inbound
|
|
247
|
+
* document (its effect is complete and cached).
|
|
248
|
+
*/
|
|
249
|
+
export async function starRefreshAll(p, when, ent = {}) {
|
|
250
|
+
const outbound = [];
|
|
251
|
+
const failures = [];
|
|
252
|
+
for (const [anchor, contact] of p.contacts) {
|
|
253
|
+
if (!contact.trustGiven || contact.trustPaused)
|
|
254
|
+
continue;
|
|
255
|
+
try {
|
|
256
|
+
const env = await withStarLock(contact, async () => {
|
|
257
|
+
const seq = reserveStarSeq(contact);
|
|
258
|
+
const star = await buildStarPure(p, contact, seq);
|
|
259
|
+
const whenIso = C.iso(when);
|
|
260
|
+
const body = {
|
|
261
|
+
id: uuid(), type: TT + 'trust-star@probe',
|
|
262
|
+
issuer: contact.channel.own.anchor, recipient: anchor,
|
|
263
|
+
issuedAt: whenIso, payload: { star },
|
|
264
|
+
};
|
|
265
|
+
const sealed = await C.seal(await C.diSign(contact.channel.own, body, whenIso), contact.channel.counterpartKa, ent);
|
|
266
|
+
commitStar(contact, seq, star);
|
|
267
|
+
return sealed;
|
|
268
|
+
});
|
|
269
|
+
outbound.push({ to: contact, env });
|
|
270
|
+
}
|
|
271
|
+
catch (e) {
|
|
272
|
+
failures.push({ to: contact.name ?? anchor, error: String(e?.message ?? e) });
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
return Object.assign(outbound, { failures });
|
|
276
|
+
}
|
|
277
|
+
// ── Empfangs-Dispatch (Form wie groups.receiveDoc) ──────────────────────
|
|
278
|
+
export async function receiveTrustDoc(p, env, when, ent = {}) {
|
|
279
|
+
const opened = await C.openEnvelope(p, env); // Stufen 1–4, Cache-Lesung
|
|
280
|
+
if (opened.duplicate)
|
|
281
|
+
return { handled: true, duplicate: true };
|
|
282
|
+
if (opened.error)
|
|
283
|
+
return { handled: false };
|
|
284
|
+
const r = await receiveTrustDocInner(p, env, opened.doc, when, ent);
|
|
285
|
+
if (r?.handled && !r.error)
|
|
286
|
+
C.effectDone(p, opened.digest);
|
|
287
|
+
return r;
|
|
288
|
+
}
|
|
289
|
+
async function receiveTrustDocInner(p, env, doc, when, ent = {}) {
|
|
290
|
+
const ctx = p.contexts.get(env.rkid);
|
|
291
|
+
if (!ctx)
|
|
292
|
+
return { handled: false };
|
|
293
|
+
if (typeof doc?.type !== 'string' || !doc.type.startsWith(TT + 'trust-'))
|
|
294
|
+
return { handled: false, doc };
|
|
295
|
+
// form BEFORE fields (M-3): issuer, proof and payload as used below
|
|
296
|
+
// form BEFORE fields (M-3, verschärft in Runde 3): jeder Typ verlangt
|
|
297
|
+
// SEIN Payload — star@probe ohne star ist formwidrig, nicht ein Throw
|
|
298
|
+
const kind = doc.type.slice((TT + 'trust-').length);
|
|
299
|
+
const starOk = C.shaped(doc.payload ?? {}, { star: 'object' }) && C.shaped(doc.payload.star, { salt: 'string', count: 'number', blinded: 'array' })
|
|
300
|
+
&& C.intStr(doc.payload.star.salt) && Number.isInteger(doc.payload.star.count) && doc.payload.star.count >= 0
|
|
301
|
+
&& doc.payload.star.count === doc.payload.star.blinded.length
|
|
302
|
+
&& doc.payload.star.blinded.every((b) => typeof b === 'string');
|
|
303
|
+
const mappingOk = C.shaped(doc.payload ?? {}, { mapping: 'object' }) && C.shaped(doc.payload.mapping, { mac1: 'string', mac2: 'string', card: 'object' });
|
|
304
|
+
if (!C.shaped(doc, { issuer: 'string', proof: 'object', payload: 'object' })
|
|
305
|
+
|| (kind === 'disclosure@probe' && !(mappingOk && starOk))
|
|
306
|
+
|| (kind === 'star@probe' && !starOk))
|
|
307
|
+
return { handled: true, error: 'malformed' };
|
|
308
|
+
const fromEntry = [...p.contacts.entries()].find(([, c]) => c.channel?.own?.anchor === ctx.anchor);
|
|
309
|
+
if (!fromEntry)
|
|
310
|
+
return { handled: true, error: 'kein Kanal' };
|
|
311
|
+
const [fromKey, from] = fromEntry;
|
|
312
|
+
if (doc.issuer !== fromKey || !(await C.diVerify(doc, doc.issuer)))
|
|
313
|
+
return { handled: true, error: 'trust doc proof' };
|
|
314
|
+
switch (doc.type.slice((TT + 'trust-').length)) {
|
|
315
|
+
case 'disclosure@probe': {
|
|
316
|
+
const m = doc.payload?.mapping;
|
|
317
|
+
if (!(await verifyMapping(p, m))) {
|
|
318
|
+
say(p, `Mapping von ${from.name} verifiziert NICHT — verworfen`);
|
|
319
|
+
return { handled: true, error: 'mapping' };
|
|
320
|
+
}
|
|
321
|
+
from.selfAnchor = m.body.self;
|
|
322
|
+
from.mapping = m;
|
|
323
|
+
from.trustReceived = doc.issuedAt;
|
|
324
|
+
from.starReceived = doc.payload.star;
|
|
325
|
+
await refreshStarInfo(p);
|
|
326
|
+
say(p, `${from.name} vertraut dir: stabiler Anker geprüft übernommen (nur für dich beweisend)`);
|
|
327
|
+
// mein Bestand wuchs → mein lieferbarer Stern auch: auffrischen.
|
|
328
|
+
// Der INBOUND-Effekt ist hier komplett und bleibt cached;
|
|
329
|
+
// starRefreshAll ist pro Empfänger resilient — Teilergebnisse
|
|
330
|
+
// gehen nie verloren, Fehlschläge stehen benannt in failures und
|
|
331
|
+
// gehören dem HOST (Nachliefer-Vertrag, Review 5 M-1)
|
|
332
|
+
const outbound = await starRefreshAll(p, when, ent);
|
|
333
|
+
const outboundError = outbound.failures.length ? outbound.failures.map((f) => `${f.to}: ${f.error}`).join(' · ') : undefined;
|
|
334
|
+
return { handled: true, disclosed: m.body.self, fromName: from.name, outbound: [...outbound], outboundError };
|
|
335
|
+
}
|
|
336
|
+
case 'star@probe': {
|
|
337
|
+
from.starReceived = doc.payload.star;
|
|
338
|
+
await refreshStarInfo(p);
|
|
339
|
+
say(p, `Kontakt-Update von ${from.name}: ${doc.payload.star.count} Kontakte (geblendet)`);
|
|
340
|
+
return { handled: true, star: true };
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
return { handled: false, doc };
|
|
344
|
+
}
|
|
345
|
+
//# sourceMappingURL=trust.js.map
|