@openvtc/pnm-core 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 +129 -0
- package/dist/did/derive-signing-key.d.ts +19 -0
- package/dist/did/derive-signing-key.d.ts.map +1 -0
- package/dist/did/derive-signing-key.js +96 -0
- package/dist/did/derive-signing-key.js.map +1 -0
- package/dist/did/index.d.ts +5 -0
- package/dist/did/index.d.ts.map +1 -0
- package/dist/did/index.js +5 -0
- package/dist/did/index.js.map +1 -0
- package/dist/did/peer.d.ts +37 -0
- package/dist/did/peer.d.ts.map +1 -0
- package/dist/did/peer.js +49 -0
- package/dist/did/peer.js.map +1 -0
- package/dist/did/verification-method.d.ts +43 -0
- package/dist/did/verification-method.d.ts.map +1 -0
- package/dist/did/verification-method.js +32 -0
- package/dist/did/verification-method.js.map +1 -0
- package/dist/did/verify.d.ts +49 -0
- package/dist/did/verify.d.ts.map +1 -0
- package/dist/did/verify.js +89 -0
- package/dist/did/verify.js.map +1 -0
- package/dist/didcomm/index.d.ts +235 -0
- package/dist/didcomm/index.d.ts.map +1 -0
- package/dist/didcomm/index.js +415 -0
- package/dist/didcomm/index.js.map +1 -0
- package/dist/inbound/confirm.d.ts +50 -0
- package/dist/inbound/confirm.d.ts.map +1 -0
- package/dist/inbound/confirm.js +64 -0
- package/dist/inbound/confirm.js.map +1 -0
- package/dist/inbound/dedup.d.ts +9 -0
- package/dist/inbound/dedup.d.ts.map +1 -0
- package/dist/inbound/dedup.js +31 -0
- package/dist/inbound/dedup.js.map +1 -0
- package/dist/inbound/index.d.ts +3 -0
- package/dist/inbound/index.d.ts.map +1 -0
- package/dist/inbound/index.js +3 -0
- package/dist/inbound/index.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/onboarding/index.d.ts +2 -0
- package/dist/onboarding/index.d.ts.map +1 -0
- package/dist/onboarding/index.js +2 -0
- package/dist/onboarding/index.js.map +1 -0
- package/dist/onboarding/swap.d.ts +60 -0
- package/dist/onboarding/swap.d.ts.map +1 -0
- package/dist/onboarding/swap.js +148 -0
- package/dist/onboarding/swap.js.map +1 -0
- package/dist/provision/adopt.d.ts +31 -0
- package/dist/provision/adopt.d.ts.map +1 -0
- package/dist/provision/adopt.js +114 -0
- package/dist/provision/adopt.js.map +1 -0
- package/dist/provision/armor.d.ts +19 -0
- package/dist/provision/armor.d.ts.map +1 -0
- package/dist/provision/armor.js +243 -0
- package/dist/provision/armor.js.map +1 -0
- package/dist/provision/crc24.d.ts +5 -0
- package/dist/provision/crc24.d.ts.map +1 -0
- package/dist/provision/crc24.js +30 -0
- package/dist/provision/crc24.js.map +1 -0
- package/dist/provision/hpke.d.ts +17 -0
- package/dist/provision/hpke.d.ts.map +1 -0
- package/dist/provision/hpke.js +60 -0
- package/dist/provision/hpke.js.map +1 -0
- package/dist/provision/index.d.ts +10 -0
- package/dist/provision/index.d.ts.map +1 -0
- package/dist/provision/index.js +16 -0
- package/dist/provision/index.js.map +1 -0
- package/dist/provision/open.d.ts +28 -0
- package/dist/provision/open.d.ts.map +1 -0
- package/dist/provision/open.js +224 -0
- package/dist/provision/open.js.map +1 -0
- package/dist/provision/request.d.ts +65 -0
- package/dist/provision/request.d.ts.map +1 -0
- package/dist/provision/request.js +53 -0
- package/dist/provision/request.js.map +1 -0
- package/dist/provision/run.d.ts +76 -0
- package/dist/provision/run.d.ts.map +1 -0
- package/dist/provision/run.js +110 -0
- package/dist/provision/run.js.map +1 -0
- package/dist/provision/send.d.ts +85 -0
- package/dist/provision/send.d.ts.map +1 -0
- package/dist/provision/send.js +87 -0
- package/dist/provision/send.js.map +1 -0
- package/dist/provision/types.d.ts +110 -0
- package/dist/provision/types.d.ts.map +1 -0
- package/dist/provision/types.js +17 -0
- package/dist/provision/types.js.map +1 -0
- package/dist/rp-login/didcomm.d.ts +34 -0
- package/dist/rp-login/didcomm.d.ts.map +1 -0
- package/dist/rp-login/didcomm.js +72 -0
- package/dist/rp-login/didcomm.js.map +1 -0
- package/dist/rp-login/index.d.ts +3 -0
- package/dist/rp-login/index.d.ts.map +1 -0
- package/dist/rp-login/index.js +3 -0
- package/dist/rp-login/index.js.map +1 -0
- package/dist/rp-login/step-up.d.ts +43 -0
- package/dist/rp-login/step-up.d.ts.map +1 -0
- package/dist/rp-login/step-up.js +118 -0
- package/dist/rp-login/step-up.js.map +1 -0
- package/dist/siop/index.d.ts +3 -0
- package/dist/siop/index.d.ts.map +1 -0
- package/dist/siop/index.js +3 -0
- package/dist/siop/index.js.map +1 -0
- package/dist/siop/login-client.d.ts +29 -0
- package/dist/siop/login-client.d.ts.map +1 -0
- package/dist/siop/login-client.js +79 -0
- package/dist/siop/login-client.js.map +1 -0
- package/dist/siop/self-issued.d.ts +96 -0
- package/dist/siop/self-issued.d.ts.map +1 -0
- package/dist/siop/self-issued.js +162 -0
- package/dist/siop/self-issued.js.map +1 -0
- package/dist/store/holder-identity.d.ts +241 -0
- package/dist/store/holder-identity.d.ts.map +1 -0
- package/dist/store/holder-identity.js +441 -0
- package/dist/store/holder-identity.js.map +1 -0
- package/dist/store/index.d.ts +4 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +4 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/kv-store.d.ts +51 -0
- package/dist/store/kv-store.d.ts.map +1 -0
- package/dist/store/kv-store.js +100 -0
- package/dist/store/kv-store.js.map +1 -0
- package/dist/store/secret-wrap.d.ts +109 -0
- package/dist/store/secret-wrap.d.ts.map +1 -0
- package/dist/store/secret-wrap.js +85 -0
- package/dist/store/secret-wrap.js.map +1 -0
- package/dist/trust-tasks/index.d.ts +2 -0
- package/dist/trust-tasks/index.d.ts.map +1 -0
- package/dist/trust-tasks/index.js +2 -0
- package/dist/trust-tasks/index.js.map +1 -0
- package/dist/trust-tasks/sign.d.ts +31 -0
- package/dist/trust-tasks/sign.d.ts.map +1 -0
- package/dist/trust-tasks/sign.js +141 -0
- package/dist/trust-tasks/sign.js.map +1 -0
- package/dist/util/timing.d.ts +14 -0
- package/dist/util/timing.d.ts.map +1 -0
- package/dist/util/timing.js +20 -0
- package/dist/util/timing.js.map +1 -0
- package/dist/vault/delete.d.ts +19 -0
- package/dist/vault/delete.d.ts.map +1 -0
- package/dist/vault/delete.js +35 -0
- package/dist/vault/delete.js.map +1 -0
- package/dist/vault/index.d.ts +8 -0
- package/dist/vault/index.d.ts.map +1 -0
- package/dist/vault/index.js +7 -0
- package/dist/vault/index.js.map +1 -0
- package/dist/vault/list.d.ts +96 -0
- package/dist/vault/list.d.ts.map +1 -0
- package/dist/vault/list.js +106 -0
- package/dist/vault/list.js.map +1 -0
- package/dist/vault/proxy-login.d.ts +100 -0
- package/dist/vault/proxy-login.d.ts.map +1 -0
- package/dist/vault/proxy-login.js +106 -0
- package/dist/vault/proxy-login.js.map +1 -0
- package/dist/vault/release.d.ts +33 -0
- package/dist/vault/release.d.ts.map +1 -0
- package/dist/vault/release.js +83 -0
- package/dist/vault/release.js.map +1 -0
- package/dist/vault/sign-trust-task.d.ts +26 -0
- package/dist/vault/sign-trust-task.d.ts.map +1 -0
- package/dist/vault/sign-trust-task.js +53 -0
- package/dist/vault/sign-trust-task.js.map +1 -0
- package/dist/vault/transport.d.ts +50 -0
- package/dist/vault/transport.d.ts.map +1 -0
- package/dist/vault/transport.js +118 -0
- package/dist/vault/transport.js.map +1 -0
- package/dist/vault/upsert.d.ts +102 -0
- package/dist/vault/upsert.d.ts.map +1 -0
- package/dist/vault/upsert.js +92 -0
- package/dist/vault/upsert.js.map +1 -0
- package/dist/vta/bridge-mediator-session.d.ts +26 -0
- package/dist/vta/bridge-mediator-session.d.ts.map +1 -0
- package/dist/vta/bridge-mediator-session.js +37 -0
- package/dist/vta/bridge-mediator-session.js.map +1 -0
- package/dist/vta/bridge-memory.d.ts +80 -0
- package/dist/vta/bridge-memory.d.ts.map +1 -0
- package/dist/vta/bridge-memory.js +162 -0
- package/dist/vta/bridge-memory.js.map +1 -0
- package/dist/vta/client.d.ts +40 -0
- package/dist/vta/client.d.ts.map +1 -0
- package/dist/vta/client.js +91 -0
- package/dist/vta/client.js.map +1 -0
- package/dist/vta/contexts.d.ts +60 -0
- package/dist/vta/contexts.d.ts.map +1 -0
- package/dist/vta/contexts.js +118 -0
- package/dist/vta/contexts.js.map +1 -0
- package/dist/vta/didcomm.d.ts +57 -0
- package/dist/vta/didcomm.d.ts.map +1 -0
- package/dist/vta/didcomm.js +138 -0
- package/dist/vta/didcomm.js.map +1 -0
- package/dist/vta/errors.d.ts +20 -0
- package/dist/vta/errors.d.ts.map +1 -0
- package/dist/vta/errors.js +64 -0
- package/dist/vta/errors.js.map +1 -0
- package/dist/vta/index.d.ts +15 -0
- package/dist/vta/index.d.ts.map +1 -0
- package/dist/vta/index.js +15 -0
- package/dist/vta/index.js.map +1 -0
- package/dist/vta/mediation.d.ts +80 -0
- package/dist/vta/mediation.d.ts.map +1 -0
- package/dist/vta/mediation.js +29 -0
- package/dist/vta/mediation.js.map +1 -0
- package/dist/vta/mediator-client.d.ts +66 -0
- package/dist/vta/mediator-client.d.ts.map +1 -0
- package/dist/vta/mediator-client.js +139 -0
- package/dist/vta/mediator-client.js.map +1 -0
- package/dist/vta/pickup.d.ts +81 -0
- package/dist/vta/pickup.d.ts.map +1 -0
- package/dist/vta/pickup.js +30 -0
- package/dist/vta/pickup.js.map +1 -0
- package/dist/vta/protocol.d.ts +76 -0
- package/dist/vta/protocol.d.ts.map +1 -0
- package/dist/vta/protocol.js +30 -0
- package/dist/vta/protocol.js.map +1 -0
- package/dist/vta/smoke.d.ts +59 -0
- package/dist/vta/smoke.d.ts.map +1 -0
- package/dist/vta/smoke.js +408 -0
- package/dist/vta/smoke.js.map +1 -0
- package/dist/vta/transport.d.ts +55 -0
- package/dist/vta/transport.d.ts.map +1 -0
- package/dist/vta/transport.js +2 -0
- package/dist/vta/transport.js.map +1 -0
- package/dist/vta/types.d.ts +50 -0
- package/dist/vta/types.d.ts.map +1 -0
- package/dist/vta/types.js +2 -0
- package/dist/vta/types.js.map +1 -0
- package/dist/vta/wallet-session.d.ts +87 -0
- package/dist/vta/wallet-session.d.ts.map +1 -0
- package/dist/vta/wallet-session.js +106 -0
- package/dist/vta/wallet-session.js.map +1 -0
- package/dist/webauthn/base64url.d.ts +3 -0
- package/dist/webauthn/base64url.d.ts.map +1 -0
- package/dist/webauthn/base64url.js +17 -0
- package/dist/webauthn/base64url.js.map +1 -0
- package/dist/webauthn/index.d.ts +4 -0
- package/dist/webauthn/index.d.ts.map +1 -0
- package/dist/webauthn/index.js +4 -0
- package/dist/webauthn/index.js.map +1 -0
- package/dist/webauthn/multikey.d.ts +26 -0
- package/dist/webauthn/multikey.d.ts.map +1 -0
- package/dist/webauthn/multikey.js +91 -0
- package/dist/webauthn/multikey.js.map +1 -0
- package/dist/webauthn/register.d.ts +36 -0
- package/dist/webauthn/register.d.ts.map +1 -0
- package/dist/webauthn/register.js +77 -0
- package/dist/webauthn/register.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// Vault — list (M1).
|
|
2
|
+
//
|
|
3
|
+
// Posts a `https://trusttasks.org/spec/vault/list/0.1` envelope to the VTA's
|
|
4
|
+
// trust-task dispatcher (`POST /api/trust-tasks`) and returns the metadata
|
|
5
|
+
// view of stored credentials. Read-only — secret material never crosses the
|
|
6
|
+
// wire (it's only released by `vault/release/0.1`, which lands in M2).
|
|
7
|
+
//
|
|
8
|
+
// Authentication: the wallet authcrypts a `atm/1.0/authenticate` DIDComm
|
|
9
|
+
// message to the VTA's keyAgreement key (same primitive `swapAclRest` uses)
|
|
10
|
+
// to obtain a short-lived bearer token, then attaches the token to the
|
|
11
|
+
// trust-tasks POST. No token caching in M1 — every list call does a fresh
|
|
12
|
+
// auth round-trip. Caching can land in M2 alongside vault/sync.
|
|
13
|
+
//
|
|
14
|
+
// Holder authentication: the wallet's holder did:peer must be in the VTA's
|
|
15
|
+
// ACL (placed there by the M0.7 swap-acl flow) and must carry the derived
|
|
16
|
+
// `VaultRead` capability — Admin / Initiator / Application / Reader pass;
|
|
17
|
+
// Monitor is denied.
|
|
18
|
+
import { packAuthcrypt } from "../didcomm/index.js";
|
|
19
|
+
const TASK_VAULT_LIST_0_1 = "https://trusttasks.org/spec/vault/list/0.1";
|
|
20
|
+
const TASK_VAULT_LIST_0_1_RESPONSE = "https://trusttasks.org/spec/vault/list/0.1#response";
|
|
21
|
+
const VTA_AUTHENTICATE = "https://affinidi.com/atm/1.0/authenticate";
|
|
22
|
+
/**
|
|
23
|
+
* Authenticate to the VTA over REST + DIDComm-authcrypt, then post the
|
|
24
|
+
* canonical vault/list/0.1 Trust Task envelope and return the parsed
|
|
25
|
+
* entries. Single round-trip's worth of auth — no token cache in M1.
|
|
26
|
+
*/
|
|
27
|
+
export async function vaultListRest(opts) {
|
|
28
|
+
const { baseUrl, holder, service, filter } = opts;
|
|
29
|
+
const f = opts.fetch ?? fetch.bind(globalThis);
|
|
30
|
+
const base = baseUrl.replace(/\/+$/, "");
|
|
31
|
+
// 1. /auth/challenge → flat { challenge, sessionId, expiresAt } per
|
|
32
|
+
// `vti_common::auth::handlers::challenge::ChallengeResponse`. Fields
|
|
33
|
+
// are top-level, NOT nested under a `data` envelope.
|
|
34
|
+
const cRes = await f(`${base}/auth/challenge`, {
|
|
35
|
+
method: "POST",
|
|
36
|
+
headers: { "content-type": "application/json" },
|
|
37
|
+
body: JSON.stringify({ did: holder.did }),
|
|
38
|
+
});
|
|
39
|
+
if (!cRes.ok) {
|
|
40
|
+
throw new Error(`vta /auth/challenge failed (${cRes.status}): ${await cRes.text()}`);
|
|
41
|
+
}
|
|
42
|
+
const cBody = (await cRes.json());
|
|
43
|
+
if (!cBody.sessionId || !cBody.challenge) {
|
|
44
|
+
throw new Error(`vta /auth/challenge: malformed response: ${JSON.stringify(cBody)}`);
|
|
45
|
+
}
|
|
46
|
+
// 2. Authcrypt an `atm/1.0/authenticate` message to the VTA.
|
|
47
|
+
const authMsg = {
|
|
48
|
+
id: globalThis.crypto.randomUUID(),
|
|
49
|
+
type: VTA_AUTHENTICATE,
|
|
50
|
+
from: holder.did,
|
|
51
|
+
to: [service.did],
|
|
52
|
+
body: { challenge: cBody.challenge, session_id: cBody.sessionId },
|
|
53
|
+
};
|
|
54
|
+
const packed = await packAuthcrypt(authMsg, holder, [
|
|
55
|
+
{ kid: service.keyAgreementKid, jwk: service.keyAgreementPublicJwk },
|
|
56
|
+
]);
|
|
57
|
+
// 3. POST the packed JWE to /auth/ → AuthenticateResponse with
|
|
58
|
+
// { session, tokens: { accessToken, ... } } per vta-sdk's
|
|
59
|
+
// `protocols::auth::AuthenticateResponse`. Tokens are nested under
|
|
60
|
+
// `tokens`, NOT `data`.
|
|
61
|
+
const aRes = await f(`${base}/auth/`, {
|
|
62
|
+
method: "POST",
|
|
63
|
+
headers: { "content-type": "application/didcomm-encrypted+json" },
|
|
64
|
+
body: packed,
|
|
65
|
+
});
|
|
66
|
+
if (!aRes.ok) {
|
|
67
|
+
throw new Error(`vta /auth/ failed (${aRes.status}): ${await aRes.text()}`);
|
|
68
|
+
}
|
|
69
|
+
const aBody = (await aRes.json());
|
|
70
|
+
const accessToken = aBody.tokens?.accessToken;
|
|
71
|
+
if (!accessToken) {
|
|
72
|
+
throw new Error(`vta /auth/: malformed response: ${JSON.stringify(aBody)}`);
|
|
73
|
+
}
|
|
74
|
+
// 4. POST /api/trust-tasks with the vault/list/0.1 envelope.
|
|
75
|
+
const envelope = {
|
|
76
|
+
id: globalThis.crypto.randomUUID(),
|
|
77
|
+
type: TASK_VAULT_LIST_0_1,
|
|
78
|
+
issuer: holder.did,
|
|
79
|
+
recipient: service.did,
|
|
80
|
+
issuedAt: new Date().toISOString(),
|
|
81
|
+
payload: filter ?? {},
|
|
82
|
+
};
|
|
83
|
+
const tRes = await f(`${base}/api/trust-tasks`, {
|
|
84
|
+
method: "POST",
|
|
85
|
+
headers: {
|
|
86
|
+
"content-type": "application/json",
|
|
87
|
+
authorization: `Bearer ${accessToken}`,
|
|
88
|
+
},
|
|
89
|
+
body: JSON.stringify(envelope),
|
|
90
|
+
});
|
|
91
|
+
if (!tRes.ok) {
|
|
92
|
+
throw new Error(`vta /api/trust-tasks vault/list failed (${tRes.status}): ${await tRes.text()}`);
|
|
93
|
+
}
|
|
94
|
+
const tBody = (await tRes.json());
|
|
95
|
+
if (tBody.type !== TASK_VAULT_LIST_0_1_RESPONSE) {
|
|
96
|
+
throw new Error(`vault/list: unexpected response type ${tBody.type ?? "(none)"} — ${JSON.stringify(tBody)}`);
|
|
97
|
+
}
|
|
98
|
+
const entries = tBody.payload?.entries ?? [];
|
|
99
|
+
return {
|
|
100
|
+
entries,
|
|
101
|
+
truncated: tBody.payload?.truncated ?? false,
|
|
102
|
+
...(tBody.payload?.cursor ? { cursor: tBody.payload.cursor } : {}),
|
|
103
|
+
...(tBody.payload?.redactedFields ? { redactedFields: tBody.payload.redactedFields } : {}),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/vault/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { type Identity } from "../didcomm/index.js";
|
|
2
|
+
import type { SiteTarget } from "./list.js";
|
|
3
|
+
import { type VtaAuthInputs } from "./transport.js";
|
|
4
|
+
/** Refresh hint the maintainer attaches to the SessionBlob — the holder
|
|
5
|
+
* uses this to decide whether to background-refresh, refresh on 401, or
|
|
6
|
+
* wait for the maintainer to drive renewal. Mirrors
|
|
7
|
+
* `vault/_shared/0.1/session-blob#/$defs/RefreshHint`. */
|
|
8
|
+
export type SessionRefreshHint = "maintainer-only" | "on-401" | "before-expiry";
|
|
9
|
+
/** A single cookie returned in a SessionBlob. Mirrors
|
|
10
|
+
* `vault/_shared/0.1/session-blob#/$defs/CookieJarEntry`. */
|
|
11
|
+
export interface SessionCookie {
|
|
12
|
+
name: string;
|
|
13
|
+
value: string;
|
|
14
|
+
domain: string;
|
|
15
|
+
path: string;
|
|
16
|
+
/** RFC 3339 — cookie's own expiry as the third party set it. The
|
|
17
|
+
* holder MUST treat the blob-level `expiresAt` as an outer bound
|
|
18
|
+
* regardless of this field. */
|
|
19
|
+
expires?: string;
|
|
20
|
+
secure?: boolean;
|
|
21
|
+
httpOnly?: boolean;
|
|
22
|
+
sameSite?: "Strict" | "Lax" | "None";
|
|
23
|
+
}
|
|
24
|
+
/** A request header the holder attaches to outbound requests to the
|
|
25
|
+
* bound origin. Typically `Authorization: Bearer <id_token>` for the
|
|
26
|
+
* SIOP path. */
|
|
27
|
+
export interface SessionHeader {
|
|
28
|
+
name: string;
|
|
29
|
+
value: string;
|
|
30
|
+
}
|
|
31
|
+
/** A storage entry (localStorage / sessionStorage) the holder writes
|
|
32
|
+
* into the bound origin. */
|
|
33
|
+
export interface SessionStorageItem {
|
|
34
|
+
key: string;
|
|
35
|
+
value: string;
|
|
36
|
+
}
|
|
37
|
+
/** The cleartext payload of a successful `vault/proxy-login/0.1`
|
|
38
|
+
* response. Mirrors `vault/_shared/0.1/session-blob`. */
|
|
39
|
+
export interface SessionBlob {
|
|
40
|
+
/** Maintainer-assigned opaque id. Echoed at the response root for
|
|
41
|
+
* audit logging without unsealing. */
|
|
42
|
+
sessionId: string;
|
|
43
|
+
/** RFC 3339. Holder MUST discard the blob at this time. */
|
|
44
|
+
expiresAt: string;
|
|
45
|
+
cookies?: SessionCookie[];
|
|
46
|
+
headers?: SessionHeader[];
|
|
47
|
+
localStorage?: SessionStorageItem[];
|
|
48
|
+
sessionStorage?: SessionStorageItem[];
|
|
49
|
+
/** Web origin this session is for. Holder MUST refuse to inject the
|
|
50
|
+
* session into any other origin. Absent only for pure-DIDComm RPs
|
|
51
|
+
* (no browser origin to bind to). */
|
|
52
|
+
bindOrigin?: string;
|
|
53
|
+
refreshHint?: SessionRefreshHint;
|
|
54
|
+
}
|
|
55
|
+
export interface VaultProxyLoginRestOptions extends VtaAuthInputs {
|
|
56
|
+
entryId: string;
|
|
57
|
+
/** When the entry has multiple targets, names which one to log in
|
|
58
|
+
* against. The maintainer falls back to the entry's first DID-shaped
|
|
59
|
+
* or web-origin target if omitted. */
|
|
60
|
+
target?: SiteTarget;
|
|
61
|
+
/** Caller-supplied nonce, embedded verbatim by the maintainer as the
|
|
62
|
+
* SIOP id_token's `nonce` claim. The canonical use is threading the
|
|
63
|
+
* RP's `/auth/challenge` value through so the resulting id_token
|
|
64
|
+
* passes the RP's exact-match nonce check. Drivers without a nonce
|
|
65
|
+
* concept (Password POST, OAuth refresh) ignore. Bounded
|
|
66
|
+
* `[1, 512]` chars by the canonical schema; longer values would fail
|
|
67
|
+
* server-side validation. */
|
|
68
|
+
nonce?: string;
|
|
69
|
+
/** Caller-supplied TTL ceiling in seconds; the maintainer caps further.
|
|
70
|
+
* Honoured up to the server's cap (300 s in M2B.2b). */
|
|
71
|
+
ttlSecondsHint?: number;
|
|
72
|
+
}
|
|
73
|
+
export interface VaultProxyLoginResponse {
|
|
74
|
+
/** Cleartext session material. The caller MUST schedule a wipe at
|
|
75
|
+
* `expiresAt` and MUST NOT inject the session into any origin other
|
|
76
|
+
* than `sessionBlob.bindOrigin`. */
|
|
77
|
+
sessionBlob: SessionBlob;
|
|
78
|
+
/** Mirrors `sessionBlob.sessionId` — exposed for audit logging before
|
|
79
|
+
* unsealing. */
|
|
80
|
+
sessionId: string;
|
|
81
|
+
/** Mirrors `sessionBlob.expiresAt`. */
|
|
82
|
+
expiresAt: string;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Ask the VTA to perform a login at the bound third party using the
|
|
86
|
+
* vault entry's secret material; receive an authcrypt-sealed
|
|
87
|
+
* `SessionBlob` (cookies / headers) that lets the holder operate the
|
|
88
|
+
* resulting session WITHOUT ever holding the long-term credential.
|
|
89
|
+
*
|
|
90
|
+
* The unpacked SessionBlob is returned in plaintext — callers MUST:
|
|
91
|
+
* 1. Schedule a wipe at `expiresAt` (setTimeout in the popup; the
|
|
92
|
+
* countdown pattern in `vault/release` is the reference).
|
|
93
|
+
* 2. Refuse to inject the session into any origin other than
|
|
94
|
+
* `sessionBlob.bindOrigin` (the holder's content script / DNR
|
|
95
|
+
* rules enforce this — @openvtc/pnm-core is browser-agnostic and only
|
|
96
|
+
* surfaces the constraint).
|
|
97
|
+
*/
|
|
98
|
+
export declare function vaultProxyLoginRest(opts: VaultProxyLoginRestOptions): Promise<VaultProxyLoginResponse>;
|
|
99
|
+
export type { Identity };
|
|
100
|
+
//# sourceMappingURL=proxy-login.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy-login.d.ts","sourceRoot":"","sources":["../../src/vault/proxy-login.ts"],"names":[],"mappings":"AA0BA,OAAO,EAAiB,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAA+B,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAMjF;;;2DAG2D;AAC3D,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,GAAG,QAAQ,GAAG,eAAe,CAAC;AAEhF;8DAC8D;AAC9D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb;;oCAEgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;CACtC;AAED;;iBAEiB;AACjB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED;6BAC6B;AAC7B,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED;0DAC0D;AAC1D,MAAM,WAAW,WAAW;IAC1B;2CACuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACpC,cAAc,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACtC;;0CAEsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC;AAED,MAAM,WAAW,0BAA2B,SAAQ,aAAa;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB;;2CAEuC;IACvC,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB;;;;;;kCAM8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;6DACyD;IACzD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,uBAAuB;IACtC;;yCAEqC;IACrC,WAAW,EAAE,WAAW,CAAC;IACzB;qBACiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,0BAA0B,GAC/B,OAAO,CAAC,uBAAuB,CAAC,CA0FlC;AAED,YAAY,EAAE,QAAQ,EAAE,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// Vault — proxy-login (M2B.3).
|
|
2
|
+
//
|
|
3
|
+
// Posts a `https://trusttasks.org/spec/vault/proxy-login/0.1` envelope.
|
|
4
|
+
// The VTA performs the login at the bound third-party site on the
|
|
5
|
+
// holder's behalf, returns a `SessionBlob` (cookies + headers needed to
|
|
6
|
+
// operate the resulting session) inside a `didcomm-authcrypt` JWE, and
|
|
7
|
+
// the holder unpacks it locally — exactly the same outer machinery as
|
|
8
|
+
// `vault/release`, just with a `SessionBlob` cleartext payload instead
|
|
9
|
+
// of a `VaultSecret`.
|
|
10
|
+
//
|
|
11
|
+
// The long-term credential (the entry's password, DID signing key, or
|
|
12
|
+
// OAuth refresh token) never leaves the VTA in this flow. The holder
|
|
13
|
+
// only ever sees the short-lived session material — a SIOPv2 id_token
|
|
14
|
+
// for DID-self-issued entries (M2B.2b), a cookie jar for Password POST
|
|
15
|
+
// (M2B.5), etc.
|
|
16
|
+
//
|
|
17
|
+
// Callers MUST treat the returned `sessionBlob` like a release secret:
|
|
18
|
+
// in-memory only, wiped no later than `expiresAt`. The maintainer caps
|
|
19
|
+
// `expiresAt` server-side; the wallet honours it via a setTimeout that
|
|
20
|
+
// clears the in-memory copy.
|
|
21
|
+
//
|
|
22
|
+
// M2B.3 implements the response side; the actual injection of cookies /
|
|
23
|
+
// headers into the page lives in the extension (declarativeNetRequest
|
|
24
|
+
// for headers, chrome.cookies.set for cookies) — those bindings live in
|
|
25
|
+
// the extension layer because @openvtc/pnm-core is browser-agnostic.
|
|
26
|
+
import { unpackMessage } from "../didcomm/index.js";
|
|
27
|
+
import { getVtaBearer, postTrustTask } from "./transport.js";
|
|
28
|
+
const TASK_VAULT_PROXY_LOGIN = "https://trusttasks.org/spec/vault/proxy-login/0.1";
|
|
29
|
+
const TASK_VAULT_PROXY_LOGIN_RESPONSE = "https://trusttasks.org/spec/vault/proxy-login/0.1#response";
|
|
30
|
+
/**
|
|
31
|
+
* Ask the VTA to perform a login at the bound third party using the
|
|
32
|
+
* vault entry's secret material; receive an authcrypt-sealed
|
|
33
|
+
* `SessionBlob` (cookies / headers) that lets the holder operate the
|
|
34
|
+
* resulting session WITHOUT ever holding the long-term credential.
|
|
35
|
+
*
|
|
36
|
+
* The unpacked SessionBlob is returned in plaintext — callers MUST:
|
|
37
|
+
* 1. Schedule a wipe at `expiresAt` (setTimeout in the popup; the
|
|
38
|
+
* countdown pattern in `vault/release` is the reference).
|
|
39
|
+
* 2. Refuse to inject the session into any origin other than
|
|
40
|
+
* `sessionBlob.bindOrigin` (the holder's content script / DNR
|
|
41
|
+
* rules enforce this — @openvtc/pnm-core is browser-agnostic and only
|
|
42
|
+
* surfaces the constraint).
|
|
43
|
+
*/
|
|
44
|
+
export async function vaultProxyLoginRest(opts) {
|
|
45
|
+
const bearer = await getVtaBearer({
|
|
46
|
+
baseUrl: opts.baseUrl,
|
|
47
|
+
holder: opts.holder,
|
|
48
|
+
service: opts.service,
|
|
49
|
+
...(opts.fetch ? { fetch: opts.fetch } : {}),
|
|
50
|
+
});
|
|
51
|
+
const wire = await postTrustTask({
|
|
52
|
+
baseUrl: opts.baseUrl,
|
|
53
|
+
bearer,
|
|
54
|
+
envelope: {
|
|
55
|
+
type: TASK_VAULT_PROXY_LOGIN,
|
|
56
|
+
payload: {
|
|
57
|
+
entryId: opts.entryId,
|
|
58
|
+
...(opts.target !== undefined ? { target: opts.target } : {}),
|
|
59
|
+
...(opts.nonce !== undefined ? { nonce: opts.nonce } : {}),
|
|
60
|
+
...(opts.ttlSecondsHint !== undefined
|
|
61
|
+
? { ttlSecondsHint: opts.ttlSecondsHint }
|
|
62
|
+
: {}),
|
|
63
|
+
},
|
|
64
|
+
issuer: opts.holder.did,
|
|
65
|
+
recipient: opts.service.did,
|
|
66
|
+
},
|
|
67
|
+
expectedResponseType: TASK_VAULT_PROXY_LOGIN_RESPONSE,
|
|
68
|
+
operationLabel: "vault/proxy-login/0.1",
|
|
69
|
+
...(opts.fetch ? { fetch: opts.fetch } : {}),
|
|
70
|
+
});
|
|
71
|
+
if (wire.sealedSessionBlob.envelope !== "didcomm-authcrypt") {
|
|
72
|
+
throw new Error(`vault/proxy-login: unsupported envelope ${wire.sealedSessionBlob.envelope} — this wallet only understands didcomm-authcrypt`);
|
|
73
|
+
}
|
|
74
|
+
// The VTA authcrypts the SessionBlob to the holder; the unpacker
|
|
75
|
+
// needs the VTA's keyAgreement public JWK to verify the sender
|
|
76
|
+
// binding (the `skid` in the JWE's protected header). Without it,
|
|
77
|
+
// vti-didcomm-js raises "sender.publicJwk required for authcrypt".
|
|
78
|
+
// The service endpoint structure carries the resolved VTA pubkey
|
|
79
|
+
// from the holder's onboarding handshake.
|
|
80
|
+
const unpacked = await unpackMessage({
|
|
81
|
+
input: wire.sealedSessionBlob.jwe,
|
|
82
|
+
sender_public_jwk: opts.service.keyAgreementPublicJwk,
|
|
83
|
+
}, opts.holder);
|
|
84
|
+
if (unpacked.kind !== "encrypted") {
|
|
85
|
+
throw new Error(`vault/proxy-login: unpacked JWE was not authcrypt-encrypted (kind=${unpacked.kind})`);
|
|
86
|
+
}
|
|
87
|
+
// Defence-in-depth: anoncrypt-only would be a downgrade — the VTA
|
|
88
|
+
// MUST authenticate as the signer so a relay can't substitute a
|
|
89
|
+
// different SessionBlob.
|
|
90
|
+
if (!unpacked.authenticated) {
|
|
91
|
+
throw new Error("vault/proxy-login: unpacked JWE was not authenticated (anoncrypt downgrade)");
|
|
92
|
+
}
|
|
93
|
+
const body = unpacked.message.body;
|
|
94
|
+
if (!body || typeof body !== "object") {
|
|
95
|
+
throw new Error("vault/proxy-login: unpacked DIDComm message has no body");
|
|
96
|
+
}
|
|
97
|
+
// Cast at the wire boundary — the server has already canonical-schema-
|
|
98
|
+
// validated the SessionBlob shape before sealing it.
|
|
99
|
+
const sessionBlob = body;
|
|
100
|
+
return {
|
|
101
|
+
sessionBlob,
|
|
102
|
+
sessionId: wire.sessionId,
|
|
103
|
+
expiresAt: wire.expiresAt,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=proxy-login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy-login.js","sourceRoot":"","sources":["../../src/vault/proxy-login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type Identity } from "../didcomm/index.js";
|
|
2
|
+
import type { SecretKind } from "./list.js";
|
|
3
|
+
import { type VtaAuthInputs } from "./transport.js";
|
|
4
|
+
import type { VaultSecret } from "./upsert.js";
|
|
5
|
+
export interface VaultReleaseRestOptions extends VtaAuthInputs {
|
|
6
|
+
entryId: string;
|
|
7
|
+
/** Caller's preferred cache TTL in seconds. The maintainer caps
|
|
8
|
+
* server-side (M2A.3 ceiling is 60 s); honoured up to the cap. */
|
|
9
|
+
ttlSecondsHint?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface VaultReleaseResponse {
|
|
12
|
+
/** Unpacked secret material. Caller MUST wipe / zero this reference
|
|
13
|
+
* no later than `ttlSeconds` after the release call returned. */
|
|
14
|
+
secret: VaultSecret;
|
|
15
|
+
/** Maintainer-declared discriminator — mirrors `secret.kind`. */
|
|
16
|
+
secretKind: SecretKind;
|
|
17
|
+
/** Enforced cache TTL. Already capped by the maintainer; the caller
|
|
18
|
+
* MUST honour it. */
|
|
19
|
+
ttlSeconds: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Release the cleartext secret material of a vault entry. The
|
|
23
|
+
* maintainer authcrypts the secret to the holder's keyAgreement key;
|
|
24
|
+
* this helper unpacks the resulting JWE locally.
|
|
25
|
+
*
|
|
26
|
+
* The unpacked secret is returned in plaintext — callers MUST schedule
|
|
27
|
+
* a wipe at `ttlSeconds` (e.g. via `setTimeout`) and MUST NOT persist
|
|
28
|
+
* the cleartext beyond that window (no disk, no logs, no syncing
|
|
29
|
+
* storage).
|
|
30
|
+
*/
|
|
31
|
+
export declare function vaultReleaseRest(opts: VaultReleaseRestOptions): Promise<VaultReleaseResponse>;
|
|
32
|
+
export type { Identity };
|
|
33
|
+
//# sourceMappingURL=release.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release.d.ts","sourceRoot":"","sources":["../../src/vault/release.ts"],"names":[],"mappings":"AAUA,OAAO,EAAiB,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAA+B,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK/C,MAAM,WAAW,uBAAwB,SAAQ,aAAa;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB;uEACmE;IACnE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC;sEACkE;IAClE,MAAM,EAAE,WAAW,CAAC;IACpB,iEAAiE;IACjE,UAAU,EAAE,UAAU,CAAC;IACvB;0BACsB;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,oBAAoB,CAAC,CAoF/B;AAKD,YAAY,EAAE,QAAQ,EAAE,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// Vault — release (M2A.5).
|
|
2
|
+
//
|
|
3
|
+
// Posts a `https://trusttasks.org/spec/vault/release/0.1` envelope and
|
|
4
|
+
// unpacks the maintainer's authcrypt-sealed response into the cleartext
|
|
5
|
+
// `VaultSecret`. The secret bytes only ever live in the holder's local
|
|
6
|
+
// memory for the duration of the `ttlSeconds` the maintainer caps; the
|
|
7
|
+
// caller MUST wipe them at TTL even if the user hasn't finished
|
|
8
|
+
// interacting (in practice: a `setTimeout` that clears the popup's
|
|
9
|
+
// "reveal" state).
|
|
10
|
+
import { unpackMessage } from "../didcomm/index.js";
|
|
11
|
+
import { getVtaBearer, postTrustTask } from "./transport.js";
|
|
12
|
+
const TASK_VAULT_RELEASE = "https://trusttasks.org/spec/vault/release/0.1";
|
|
13
|
+
const TASK_VAULT_RELEASE_RESPONSE = "https://trusttasks.org/spec/vault/release/0.1#response";
|
|
14
|
+
/**
|
|
15
|
+
* Release the cleartext secret material of a vault entry. The
|
|
16
|
+
* maintainer authcrypts the secret to the holder's keyAgreement key;
|
|
17
|
+
* this helper unpacks the resulting JWE locally.
|
|
18
|
+
*
|
|
19
|
+
* The unpacked secret is returned in plaintext — callers MUST schedule
|
|
20
|
+
* a wipe at `ttlSeconds` (e.g. via `setTimeout`) and MUST NOT persist
|
|
21
|
+
* the cleartext beyond that window (no disk, no logs, no syncing
|
|
22
|
+
* storage).
|
|
23
|
+
*/
|
|
24
|
+
export async function vaultReleaseRest(opts) {
|
|
25
|
+
const bearer = await getVtaBearer({
|
|
26
|
+
baseUrl: opts.baseUrl,
|
|
27
|
+
holder: opts.holder,
|
|
28
|
+
service: opts.service,
|
|
29
|
+
...(opts.fetch ? { fetch: opts.fetch } : {}),
|
|
30
|
+
});
|
|
31
|
+
const wire = await postTrustTask({
|
|
32
|
+
baseUrl: opts.baseUrl,
|
|
33
|
+
bearer,
|
|
34
|
+
envelope: {
|
|
35
|
+
type: TASK_VAULT_RELEASE,
|
|
36
|
+
payload: {
|
|
37
|
+
entryId: opts.entryId,
|
|
38
|
+
...(opts.ttlSecondsHint !== undefined
|
|
39
|
+
? { ttlSecondsHint: opts.ttlSecondsHint }
|
|
40
|
+
: {}),
|
|
41
|
+
},
|
|
42
|
+
issuer: opts.holder.did,
|
|
43
|
+
recipient: opts.service.did,
|
|
44
|
+
},
|
|
45
|
+
expectedResponseType: TASK_VAULT_RELEASE_RESPONSE,
|
|
46
|
+
operationLabel: "vault/release/0.1",
|
|
47
|
+
...(opts.fetch ? { fetch: opts.fetch } : {}),
|
|
48
|
+
});
|
|
49
|
+
if (wire.sealedSecret.envelope !== "didcomm-authcrypt") {
|
|
50
|
+
throw new Error(`vault/release: unsupported envelope ${wire.sealedSecret.envelope} — this wallet only understands didcomm-authcrypt`);
|
|
51
|
+
}
|
|
52
|
+
// The VTA authcrypts the secret to the holder; the unpacker needs
|
|
53
|
+
// the VTA's keyAgreement public JWK to verify the sender binding.
|
|
54
|
+
// Same shape as vault/proxy-login — see that file for the longer
|
|
55
|
+
// explanation. Latent in this file since M2A.3 (release was never
|
|
56
|
+
// end-to-end tested with a real VTA before M2B.4 demos exposed
|
|
57
|
+
// the failure on the parallel proxy-login path).
|
|
58
|
+
const unpacked = await unpackMessage({
|
|
59
|
+
input: wire.sealedSecret.jwe,
|
|
60
|
+
sender_public_jwk: opts.service.keyAgreementPublicJwk,
|
|
61
|
+
}, opts.holder);
|
|
62
|
+
if (unpacked.kind !== "encrypted") {
|
|
63
|
+
throw new Error(`vault/release: unpacked JWE was not authcrypt-encrypted (kind=${unpacked.kind})`);
|
|
64
|
+
}
|
|
65
|
+
// Defence-in-depth: the unpacked message MUST be authenticated (the
|
|
66
|
+
// VTA's signature verified) — anoncrypt-only would be a downgrade.
|
|
67
|
+
if (!unpacked.authenticated) {
|
|
68
|
+
throw new Error("vault/release: unpacked JWE was not authenticated (anoncrypt downgrade)");
|
|
69
|
+
}
|
|
70
|
+
// The cleartext body IS the VaultSecret JSON. Cast it directly — the
|
|
71
|
+
// server-side validation already ensured the variant discriminator
|
|
72
|
+
// matches `secretKind`.
|
|
73
|
+
const body = unpacked.message.body;
|
|
74
|
+
if (!body || typeof body !== "object") {
|
|
75
|
+
throw new Error("vault/release: unpacked DIDComm message has no body");
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
secret: body,
|
|
79
|
+
secretKind: wire.secretKind,
|
|
80
|
+
ttlSeconds: wire.ttlSeconds,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=release.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release.js","sourceRoot":"","sources":["../../src/vault/release.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type VtaAuthInputs } from "./transport.js";
|
|
2
|
+
import type { TrustTaskEnvelope } from "../trust-tasks/sign.js";
|
|
3
|
+
export interface VaultSignTrustTaskRestOptions extends VtaAuthInputs {
|
|
4
|
+
/** Identifier of the vault entry whose principal will sign. MUST
|
|
5
|
+
* point at a `did-self-issued` or `didcomm-peer` entry — other
|
|
6
|
+
* kinds reject with `vault/sign-trust-task:not_signable`. */
|
|
7
|
+
entryId: string;
|
|
8
|
+
/** The Trust Task document to sign. MUST have no `proof` field.
|
|
9
|
+
* MUST set `issuer = <entry.principalDid>`. The VTA refuses to
|
|
10
|
+
* silently rewrite issuer (`envelope_issuer_mismatch`). */
|
|
11
|
+
unsignedEnvelope: TrustTaskEnvelope;
|
|
12
|
+
}
|
|
13
|
+
export interface VaultSignTrustTaskResponse {
|
|
14
|
+
/** The supplied envelope with a `proof` field attached.
|
|
15
|
+
* `proof.verificationMethod = <principalDid>#<signingKeyId>`;
|
|
16
|
+
* `proof.cryptosuite = "eddsa-jcs-2022"`;
|
|
17
|
+
* `proof.proofPurpose = "assertionMethod"`. */
|
|
18
|
+
signedEnvelope: TrustTaskEnvelope;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Ask the VTA to sign a Trust Task envelope as the principal of a
|
|
22
|
+
* vault entry. The returned `signedEnvelope` is byte-identical to
|
|
23
|
+
* the input except for the attached `proof` field.
|
|
24
|
+
*/
|
|
25
|
+
export declare function vaultSignTrustTaskRest(opts: VaultSignTrustTaskRestOptions): Promise<VaultSignTrustTaskResponse>;
|
|
26
|
+
//# sourceMappingURL=sign-trust-task.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sign-trust-task.d.ts","sourceRoot":"","sources":["../../src/vault/sign-trust-task.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAiB,KAAK,aAAa,EAAgB,MAAM,gBAAgB,CAAC;AACjF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAMhE,MAAM,WAAW,6BAA8B,SAAQ,aAAa;IAClE;;kEAE8D;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB;;gEAE4D;IAC5D,gBAAgB,EAAE,iBAAiB,CAAC;CACrC;AAED,MAAM,WAAW,0BAA0B;IACzC;;;oDAGgD;IAChD,cAAc,EAAE,iBAAiB,CAAC;CACnC;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,6BAA6B,GAClC,OAAO,CAAC,0BAA0B,CAAC,CA8BrC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// Vault — sign-trust-task.
|
|
2
|
+
//
|
|
3
|
+
// Posts a `https://trusttasks.org/spec/vault/sign-trust-task/0.1`
|
|
4
|
+
// envelope. The VTA attaches an eddsa-jcs-2022 Data Integrity proof
|
|
5
|
+
// to the supplied envelope, signing as the principal DID of a
|
|
6
|
+
// `did-self-issued` or `didcomm-peer` vault entry. The long-term
|
|
7
|
+
// signing key never leaves the VTA.
|
|
8
|
+
//
|
|
9
|
+
// This is the per-envelope signing complement to `vault/proxy-login`:
|
|
10
|
+
// proxy-login mints a session credential at session-start; sign-trust-
|
|
11
|
+
// task signs individual follow-up tasks during that session so the
|
|
12
|
+
// RP's `proof.verificationMethod == authenticated session DID` check
|
|
13
|
+
// passes.
|
|
14
|
+
//
|
|
15
|
+
// Unlike `vault/release` / `vault/proxy-login`, the response is NOT
|
|
16
|
+
// authcrypt-sealed — the signed envelope is destined for the RP
|
|
17
|
+
// (which has to be able to verify it anyway) and carries no
|
|
18
|
+
// long-term secret material. The proof itself is the only sensitive
|
|
19
|
+
// output, and it's deliberately public.
|
|
20
|
+
import { postTrustTask, getVtaBearer } from "./transport.js";
|
|
21
|
+
const TASK_VAULT_SIGN_TRUST_TASK = "https://trusttasks.org/spec/vault/sign-trust-task/0.1";
|
|
22
|
+
const TASK_VAULT_SIGN_TRUST_TASK_RESPONSE = "https://trusttasks.org/spec/vault/sign-trust-task/0.1#response";
|
|
23
|
+
/**
|
|
24
|
+
* Ask the VTA to sign a Trust Task envelope as the principal of a
|
|
25
|
+
* vault entry. The returned `signedEnvelope` is byte-identical to
|
|
26
|
+
* the input except for the attached `proof` field.
|
|
27
|
+
*/
|
|
28
|
+
export async function vaultSignTrustTaskRest(opts) {
|
|
29
|
+
const bearer = await getVtaBearer({
|
|
30
|
+
baseUrl: opts.baseUrl,
|
|
31
|
+
holder: opts.holder,
|
|
32
|
+
service: opts.service,
|
|
33
|
+
...(opts.fetch ? { fetch: opts.fetch } : {}),
|
|
34
|
+
});
|
|
35
|
+
const wire = await postTrustTask({
|
|
36
|
+
baseUrl: opts.baseUrl,
|
|
37
|
+
bearer,
|
|
38
|
+
envelope: {
|
|
39
|
+
type: TASK_VAULT_SIGN_TRUST_TASK,
|
|
40
|
+
payload: {
|
|
41
|
+
entryId: opts.entryId,
|
|
42
|
+
unsignedEnvelope: opts.unsignedEnvelope,
|
|
43
|
+
},
|
|
44
|
+
issuer: opts.holder.did,
|
|
45
|
+
recipient: opts.service.did,
|
|
46
|
+
},
|
|
47
|
+
expectedResponseType: TASK_VAULT_SIGN_TRUST_TASK_RESPONSE,
|
|
48
|
+
operationLabel: "vault/sign-trust-task/0.1",
|
|
49
|
+
...(opts.fetch ? { fetch: opts.fetch } : {}),
|
|
50
|
+
});
|
|
51
|
+
return { signedEnvelope: wire.signedEnvelope };
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=sign-trust-task.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sign-trust-task.js","sourceRoot":"","sources":["../../src/vault/sign-trust-task.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,EAAE;AACF,kEAAkE;AAClE,oEAAoE;AACpE,8DAA8D;AAC9D,iEAAiE;AACjE,oCAAoC;AACpC,EAAE;AACF,sEAAsE;AACtE,uEAAuE;AACvE,mEAAmE;AACnE,qEAAqE;AACrE,UAAU;AACV,EAAE;AACF,oEAAoE;AACpE,gEAAgE;AAChE,4DAA4D;AAC5D,oEAAoE;AACpE,wCAAwC;AAExC,OAAO,EAAE,aAAa,EAAsB,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGjF,MAAM,0BAA0B,GAAG,uDAAuD,CAAC;AAC3F,MAAM,mCAAmC,GACvC,gEAAgE,CAAC;AAqBnE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAAmC;IAEnC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;QAChC,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7C,CAAC,CAAC;IAMH,MAAM,IAAI,GAAG,MAAM,aAAa,CAAe;QAC7C,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,MAAM;QACN,QAAQ,EAAE;YACR,IAAI,EAAE,0BAA0B;YAChC,OAAO,EAAE;gBACP,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;aACxC;YACD,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG;YACvB,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG;SAC5B;QACD,oBAAoB,EAAE,mCAAmC;QACzD,cAAc,EAAE,2BAA2B;QAC3C,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7C,CAAC,CAAC;IAEH,OAAO,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { type Identity } from "../didcomm/index.js";
|
|
2
|
+
import type { RemoteDidcommEndpoint } from "../vta/didcomm.js";
|
|
3
|
+
export interface VtaAuthInputs {
|
|
4
|
+
/** VTA REST base URL — from the connection state's `restBaseUrl`. */
|
|
5
|
+
baseUrl: string;
|
|
6
|
+
/** Authcrypt sender — the holder's DIDComm identity post-onboarding. */
|
|
7
|
+
holder: Identity;
|
|
8
|
+
/** VTA's keyAgreement endpoint (resolved via `resolveKeyAgreement`). */
|
|
9
|
+
service: RemoteDidcommEndpoint;
|
|
10
|
+
/** fetch impl (defaults to global). */
|
|
11
|
+
fetch?: typeof fetch;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Run /auth/challenge → authcrypt /auth/ → bearer token. The token's
|
|
15
|
+
* 15-minute TTL is more than enough for a single trust-task POST; we
|
|
16
|
+
* don't cache because the next vault op happens whenever the user
|
|
17
|
+
* clicks something and would likely fall outside the cache window.
|
|
18
|
+
*/
|
|
19
|
+
export declare function getVtaBearer(opts: VtaAuthInputs): Promise<string>;
|
|
20
|
+
export interface VaultTaskRequest {
|
|
21
|
+
/** Trust Task type URI (matches the request URI in the canonical spec). */
|
|
22
|
+
type: string;
|
|
23
|
+
/** Payload object — task-specific shape. */
|
|
24
|
+
payload: unknown;
|
|
25
|
+
/** Optional issuer DID; set when the consumer signs a `proof`. */
|
|
26
|
+
issuer?: string;
|
|
27
|
+
/** Optional recipient DID — the maintainer's DID. Audience-binds the doc. */
|
|
28
|
+
recipient?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface PostTrustTaskOpts<R> {
|
|
31
|
+
baseUrl: string;
|
|
32
|
+
bearer: string;
|
|
33
|
+
envelope: VaultTaskRequest;
|
|
34
|
+
/** Expected response `type` URI (the `<request>#response` form). */
|
|
35
|
+
expectedResponseType: string;
|
|
36
|
+
fetch?: typeof fetch;
|
|
37
|
+
/** Internal: used to enrich error messages. */
|
|
38
|
+
operationLabel?: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* POST an authenticated Trust Task envelope to /api/trust-tasks. The
|
|
42
|
+
* framework's dispatcher returns either a `<task>#response` document
|
|
43
|
+
* (success) or a `trust-task-error/0.1` document (reject). This helper
|
|
44
|
+
* differentiates the two: success returns the parsed `payload` cast as
|
|
45
|
+
* `R`; reject throws an `Error` carrying the framework's error code +
|
|
46
|
+
* comment so callers see "vault/upsert:version_conflict — ..." rather
|
|
47
|
+
* than a raw 400.
|
|
48
|
+
*/
|
|
49
|
+
export declare function postTrustTask<R>(opts: PostTrustTaskOpts<R>): Promise<R>;
|
|
50
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/vault/transport.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAiB,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAI/D,MAAM,WAAW,aAAa;IAC5B,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,MAAM,EAAE,QAAQ,CAAC;IACjB,wEAAwE;IACxE,OAAO,EAAE,qBAAqB,CAAC;IAC/B,uCAAuC;IACvC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAgDvE;AAED,MAAM,WAAW,gBAAgB;IAC/B,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,oEAAoE;IACpE,oBAAoB,EAAE,MAAM,CAAC;IAC7B,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAmD7E"}
|