@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,87 @@
|
|
|
1
|
+
import type { Identity } from "../didcomm/index.js";
|
|
2
|
+
import { type ResolvedKeyAgreement, type WebSocketCtor } from "../didcomm/index.js";
|
|
3
|
+
import { type KVStore } from "../store/index.js";
|
|
4
|
+
import type { DidcommMessageBridge, VtaTransport } from "./transport.js";
|
|
5
|
+
/**
|
|
6
|
+
* Config for {@link WalletSession.fromDids} — the live path. Supply
|
|
7
|
+
* DIDs; the VTA + mediator are resolved (the mediator via its hosting
|
|
8
|
+
* service), the holder authenticates to the mediator, and a live
|
|
9
|
+
* WebSocket session is opened.
|
|
10
|
+
*/
|
|
11
|
+
export interface WalletSessionFromDidsConfig {
|
|
12
|
+
/** Persistent store for the holder identity. */
|
|
13
|
+
store: KVStore;
|
|
14
|
+
/** VTA DID (`did:webvh` or `did:key`). */
|
|
15
|
+
vtaDid: string;
|
|
16
|
+
/** Mediator DID. */
|
|
17
|
+
mediatorDid: string;
|
|
18
|
+
/** fetch impl for the mediator auth handshake (defaults to global). */
|
|
19
|
+
fetch?: typeof fetch;
|
|
20
|
+
/** WebSocket ctor (defaults to globalThis.WebSocket). */
|
|
21
|
+
webSocketImpl?: WebSocketCtor;
|
|
22
|
+
/** Allow `ws://`/`http://` endpoints. Local dev only. */
|
|
23
|
+
allowInsecure?: boolean;
|
|
24
|
+
/** Per-request timeout. */
|
|
25
|
+
timeoutMs?: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Config for {@link WalletSession.withBridge} — the test path. Inject a
|
|
29
|
+
* bridge (e.g. the in-memory bridge) plus pre-resolved endpoints, no
|
|
30
|
+
* network.
|
|
31
|
+
*/
|
|
32
|
+
export interface WalletSessionWithBridgeConfig {
|
|
33
|
+
store: KVStore;
|
|
34
|
+
bridge: DidcommMessageBridge;
|
|
35
|
+
vta: ResolvedKeyAgreement;
|
|
36
|
+
mediator: ResolvedKeyAgreement;
|
|
37
|
+
timeoutMs?: number;
|
|
38
|
+
}
|
|
39
|
+
export interface WalletSessionState {
|
|
40
|
+
holder: Identity;
|
|
41
|
+
/** True once a live mediator session is open (live delivery enabled). */
|
|
42
|
+
liveMode: boolean;
|
|
43
|
+
/** True if this run minted a fresh identity (first launch). */
|
|
44
|
+
freshlyMintedIdentity: boolean;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Top-level wallet orchestrator. Composes the persisted holder
|
|
48
|
+
* identity, a connected mediator transport, and the passkey-management
|
|
49
|
+
* transport against the VTA.
|
|
50
|
+
*
|
|
51
|
+
* The mediator transport is the library's `MediatorSession` (challenge
|
|
52
|
+
* → JWT → bearer-subprotocol WebSocket → pickup live-delivery), adapted
|
|
53
|
+
* to the bridge via `MediatorSessionBridge`. There is no
|
|
54
|
+
* coordinate-mediation enrollment: the holder is a bare `did:key` that
|
|
55
|
+
* can't advertise a mediator service, so the authenticated session +
|
|
56
|
+
* live delivery is the complete inbound path for request/response.
|
|
57
|
+
* Full mediation (mediate-grant routing key published in the holder's
|
|
58
|
+
* DID document + keylist-update) is a future milestone gated on a
|
|
59
|
+
* service-advertising holder DID (`did:peer`/`did:webvh`).
|
|
60
|
+
*
|
|
61
|
+
* Construct via {@link fromDids} (live) or {@link withBridge} (tests).
|
|
62
|
+
*/
|
|
63
|
+
export declare class WalletSession {
|
|
64
|
+
private readonly holder;
|
|
65
|
+
private readonly vtaTransport;
|
|
66
|
+
private readonly _state;
|
|
67
|
+
private readonly onClose;
|
|
68
|
+
private constructor();
|
|
69
|
+
/**
|
|
70
|
+
* Live path: load-or-mint the holder, authenticate to the mediator,
|
|
71
|
+
* open the WebSocket session, and wire the VTA transport. Returns a
|
|
72
|
+
* ready session — no separate bootstrap step.
|
|
73
|
+
*/
|
|
74
|
+
static fromDids(cfg: WalletSessionFromDidsConfig): Promise<WalletSession>;
|
|
75
|
+
/**
|
|
76
|
+
* Test path: inject a bridge (e.g. the in-memory bridge) and
|
|
77
|
+
* pre-resolved endpoints. No network, no live session.
|
|
78
|
+
*/
|
|
79
|
+
static withBridge(cfg: WalletSessionWithBridgeConfig): Promise<WalletSession>;
|
|
80
|
+
/** Current session state. */
|
|
81
|
+
state(): WalletSessionState;
|
|
82
|
+
/** The ready VTA transport for passkey-management exchanges. */
|
|
83
|
+
transport(): VtaTransport;
|
|
84
|
+
/** Tear down the mediator session + dispose the holder identity. */
|
|
85
|
+
close(): void;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=wallet-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet-session.d.ts","sourceRoot":"","sources":["../../src/vta/wallet-session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAGL,KAAK,oBAAoB,EACzB,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAEL,KAAK,OAAO,EACb,MAAM,mBAAmB,CAAC;AAG3B,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEzE;;;;;GAKG;AACH,MAAM,WAAW,2BAA2B;IAC1C,gDAAgD;IAChD,KAAK,EAAE,OAAO,CAAC;IACf,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,yDAAyD;IACzD,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,yDAAyD;IACzD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,6BAA6B;IAC5C,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,oBAAoB,CAAC;IAC7B,GAAG,EAAE,oBAAoB,CAAC;IAC1B,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,QAAQ,CAAC;IACjB,yEAAyE;IACzE,QAAQ,EAAE,OAAO,CAAC;IAClB,+DAA+D;IAC/D,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IAErC,OAAO;IAYP;;;;OAIG;WACU,QAAQ,CAAC,GAAG,EAAE,2BAA2B,GAAG,OAAO,CAAC,aAAa,CAAC;IAuC/E;;;OAGG;WACU,UAAU,CACrB,GAAG,EAAE,6BAA6B,GACjC,OAAO,CAAC,aAAa,CAAC;IAmBzB,6BAA6B;IAC7B,KAAK,IAAI,kBAAkB;IAI3B,gEAAgE;IAChE,SAAS,IAAI,YAAY;IAIzB,oEAAoE;IACpE,KAAK,IAAI,IAAI;CAId"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { connectMediatorSession, } from "../didcomm/index.js";
|
|
2
|
+
import { generateOrLoadHolderIdentity, } from "../store/index.js";
|
|
3
|
+
import { MediatorSessionBridge } from "./bridge-mediator-session.js";
|
|
4
|
+
import { DidcommVtaTransport } from "./didcomm.js";
|
|
5
|
+
/**
|
|
6
|
+
* Top-level wallet orchestrator. Composes the persisted holder
|
|
7
|
+
* identity, a connected mediator transport, and the passkey-management
|
|
8
|
+
* transport against the VTA.
|
|
9
|
+
*
|
|
10
|
+
* The mediator transport is the library's `MediatorSession` (challenge
|
|
11
|
+
* → JWT → bearer-subprotocol WebSocket → pickup live-delivery), adapted
|
|
12
|
+
* to the bridge via `MediatorSessionBridge`. There is no
|
|
13
|
+
* coordinate-mediation enrollment: the holder is a bare `did:key` that
|
|
14
|
+
* can't advertise a mediator service, so the authenticated session +
|
|
15
|
+
* live delivery is the complete inbound path for request/response.
|
|
16
|
+
* Full mediation (mediate-grant routing key published in the holder's
|
|
17
|
+
* DID document + keylist-update) is a future milestone gated on a
|
|
18
|
+
* service-advertising holder DID (`did:peer`/`did:webvh`).
|
|
19
|
+
*
|
|
20
|
+
* Construct via {@link fromDids} (live) or {@link withBridge} (tests).
|
|
21
|
+
*/
|
|
22
|
+
export class WalletSession {
|
|
23
|
+
holder;
|
|
24
|
+
vtaTransport;
|
|
25
|
+
_state;
|
|
26
|
+
onClose;
|
|
27
|
+
constructor(args) {
|
|
28
|
+
this.holder = args.holder;
|
|
29
|
+
this.vtaTransport = args.vtaTransport;
|
|
30
|
+
this._state = args.state;
|
|
31
|
+
this.onClose = args.onClose;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Live path: load-or-mint the holder, authenticate to the mediator,
|
|
35
|
+
* open the WebSocket session, and wire the VTA transport. Returns a
|
|
36
|
+
* ready session — no separate bootstrap step.
|
|
37
|
+
*/
|
|
38
|
+
static async fromDids(cfg) {
|
|
39
|
+
const { identity: holder, freshlyMinted } = await generateOrLoadHolderIdentity(cfg.store);
|
|
40
|
+
let connection;
|
|
41
|
+
try {
|
|
42
|
+
connection = await connectMediatorSession({
|
|
43
|
+
holder,
|
|
44
|
+
mediatorDid: cfg.mediatorDid,
|
|
45
|
+
vtaDid: cfg.vtaDid,
|
|
46
|
+
...(cfg.fetch ? { fetch: cfg.fetch } : {}),
|
|
47
|
+
...(cfg.webSocketImpl ? { webSocketImpl: cfg.webSocketImpl } : {}),
|
|
48
|
+
...(cfg.allowInsecure !== undefined
|
|
49
|
+
? { allowInsecure: cfg.allowInsecure }
|
|
50
|
+
: {}),
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
holder.dispose();
|
|
55
|
+
throw err;
|
|
56
|
+
}
|
|
57
|
+
const bridge = new MediatorSessionBridge(connection, cfg.timeoutMs);
|
|
58
|
+
const vtaTransport = new DidcommVtaTransport({
|
|
59
|
+
bridge,
|
|
60
|
+
holder,
|
|
61
|
+
vta: connection.vta,
|
|
62
|
+
mediator: connection.mediator,
|
|
63
|
+
...(cfg.timeoutMs !== undefined ? { timeoutMs: cfg.timeoutMs } : {}),
|
|
64
|
+
});
|
|
65
|
+
return new WalletSession({
|
|
66
|
+
holder,
|
|
67
|
+
vtaTransport,
|
|
68
|
+
state: { holder, liveMode: true, freshlyMintedIdentity: freshlyMinted },
|
|
69
|
+
onClose: () => connection.close(),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Test path: inject a bridge (e.g. the in-memory bridge) and
|
|
74
|
+
* pre-resolved endpoints. No network, no live session.
|
|
75
|
+
*/
|
|
76
|
+
static async withBridge(cfg) {
|
|
77
|
+
const { identity: holder, freshlyMinted } = await generateOrLoadHolderIdentity(cfg.store);
|
|
78
|
+
const vtaTransport = new DidcommVtaTransport({
|
|
79
|
+
bridge: cfg.bridge,
|
|
80
|
+
holder,
|
|
81
|
+
vta: cfg.vta,
|
|
82
|
+
mediator: cfg.mediator,
|
|
83
|
+
...(cfg.timeoutMs !== undefined ? { timeoutMs: cfg.timeoutMs } : {}),
|
|
84
|
+
});
|
|
85
|
+
return new WalletSession({
|
|
86
|
+
holder,
|
|
87
|
+
vtaTransport,
|
|
88
|
+
state: { holder, liveMode: false, freshlyMintedIdentity: freshlyMinted },
|
|
89
|
+
onClose: () => { },
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
/** Current session state. */
|
|
93
|
+
state() {
|
|
94
|
+
return this._state;
|
|
95
|
+
}
|
|
96
|
+
/** The ready VTA transport for passkey-management exchanges. */
|
|
97
|
+
transport() {
|
|
98
|
+
return this.vtaTransport;
|
|
99
|
+
}
|
|
100
|
+
/** Tear down the mediator session + dispose the holder identity. */
|
|
101
|
+
close() {
|
|
102
|
+
this.onClose();
|
|
103
|
+
this.holder.dispose();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=wallet-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet-session.js","sourceRoot":"","sources":["../../src/vta/wallet-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base64url.d.ts","sourceRoot":"","sources":["../../src/webauthn/base64url.ts"],"names":[],"mappings":"AAAA,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAM1D;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU,CAOtD"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export function bytesToBase64url(bytes) {
|
|
2
|
+
let s = "";
|
|
3
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
4
|
+
s += String.fromCharCode(bytes[i] ?? 0);
|
|
5
|
+
}
|
|
6
|
+
return btoa(s).replaceAll("+", "-").replaceAll("/", "_").replace(/=+$/, "");
|
|
7
|
+
}
|
|
8
|
+
export function base64urlToBytes(s) {
|
|
9
|
+
const pad = s.length % 4 === 2 ? "==" : s.length % 4 === 3 ? "=" : "";
|
|
10
|
+
const b64 = (s + pad).replaceAll("-", "+").replaceAll("_", "/");
|
|
11
|
+
const bin = atob(b64);
|
|
12
|
+
const out = new Uint8Array(bin.length);
|
|
13
|
+
for (let i = 0; i < bin.length; i++)
|
|
14
|
+
out[i] = bin.charCodeAt(i);
|
|
15
|
+
return out;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=base64url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base64url.js","sourceRoot":"","sources":["../../src/webauthn/base64url.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,gBAAgB,CAAC,KAAiB;IAChD,IAAI,CAAC,GAAG,EAAE,CAAC;IACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,CAAS;IACxC,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACtE,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAChE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACtB,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAChE,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/webauthn/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/webauthn/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export declare const COSE_ALG: {
|
|
2
|
+
readonly ES256: -7;
|
|
3
|
+
readonly EdDSA: -8;
|
|
4
|
+
readonly ES384: -35;
|
|
5
|
+
readonly ES512: -36;
|
|
6
|
+
readonly RS256: -257;
|
|
7
|
+
};
|
|
8
|
+
export type CoseAlg = (typeof COSE_ALG)[keyof typeof COSE_ALG];
|
|
9
|
+
/**
|
|
10
|
+
* Encode a multikey from a multicodec code and raw key bytes.
|
|
11
|
+
* Returns the canonical `z…` multibase-base58btc string used by W3C
|
|
12
|
+
* Multikey verificationMethods.
|
|
13
|
+
*/
|
|
14
|
+
export declare function encodeMultikey(multicodec: number, keyBytes: Uint8Array): string;
|
|
15
|
+
/**
|
|
16
|
+
* SEC1 point compression for an uncompressed P-256 / P-384 public key.
|
|
17
|
+
* Input: 0x04 || X || Y (65 bytes for P-256, 97 for P-384).
|
|
18
|
+
* Output: 0x02|0x03 || X (33 bytes for P-256, 49 for P-384).
|
|
19
|
+
*/
|
|
20
|
+
export declare function compressEcPoint(uncompressed: Uint8Array): Uint8Array;
|
|
21
|
+
/**
|
|
22
|
+
* Convert a CryptoKey (imported from WebAuthn SPKI) into a W3C Multikey
|
|
23
|
+
* string. Currently supports ES256 (P-256) and Ed25519.
|
|
24
|
+
*/
|
|
25
|
+
export declare function cryptoKeyToMultikey(publicKey: CryptoKey, coseAlg: CoseAlg): Promise<string>;
|
|
26
|
+
//# sourceMappingURL=multikey.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multikey.d.ts","sourceRoot":"","sources":["../../src/webauthn/multikey.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ;;;;;;CAMX,CAAC;AAEX,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,OAAO,QAAQ,CAAC,CAAC;AAiC/D;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,MAAM,CAG/E;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,UAAU,GAAG,UAAU,CAepE;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,MAAM,CAAC,CAmBjB"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { base58 } from "@scure/base";
|
|
2
|
+
export const COSE_ALG = {
|
|
3
|
+
ES256: -7,
|
|
4
|
+
EdDSA: -8,
|
|
5
|
+
ES384: -35,
|
|
6
|
+
ES512: -36,
|
|
7
|
+
RS256: -257,
|
|
8
|
+
};
|
|
9
|
+
const MULTICODEC = {
|
|
10
|
+
p256Pub: 0x1200,
|
|
11
|
+
ed25519Pub: 0xed,
|
|
12
|
+
p384Pub: 0x1201,
|
|
13
|
+
};
|
|
14
|
+
function encodeVarint(value) {
|
|
15
|
+
if (value < 0 || !Number.isInteger(value)) {
|
|
16
|
+
throw new RangeError("multicodec must be a non-negative integer");
|
|
17
|
+
}
|
|
18
|
+
const bytes = [];
|
|
19
|
+
let v = value;
|
|
20
|
+
while (v >= 0x80) {
|
|
21
|
+
bytes.push((v & 0x7f) | 0x80);
|
|
22
|
+
v >>>= 7;
|
|
23
|
+
}
|
|
24
|
+
bytes.push(v & 0x7f);
|
|
25
|
+
return new Uint8Array(bytes);
|
|
26
|
+
}
|
|
27
|
+
function concatBytes(...parts) {
|
|
28
|
+
const len = parts.reduce((n, p) => n + p.length, 0);
|
|
29
|
+
const out = new Uint8Array(len);
|
|
30
|
+
let off = 0;
|
|
31
|
+
for (const p of parts) {
|
|
32
|
+
out.set(p, off);
|
|
33
|
+
off += p.length;
|
|
34
|
+
}
|
|
35
|
+
return out;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Encode a multikey from a multicodec code and raw key bytes.
|
|
39
|
+
* Returns the canonical `z…` multibase-base58btc string used by W3C
|
|
40
|
+
* Multikey verificationMethods.
|
|
41
|
+
*/
|
|
42
|
+
export function encodeMultikey(multicodec, keyBytes) {
|
|
43
|
+
const prefix = encodeVarint(multicodec);
|
|
44
|
+
return "z" + base58.encode(concatBytes(prefix, keyBytes));
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* SEC1 point compression for an uncompressed P-256 / P-384 public key.
|
|
48
|
+
* Input: 0x04 || X || Y (65 bytes for P-256, 97 for P-384).
|
|
49
|
+
* Output: 0x02|0x03 || X (33 bytes for P-256, 49 for P-384).
|
|
50
|
+
*/
|
|
51
|
+
export function compressEcPoint(uncompressed) {
|
|
52
|
+
if (uncompressed[0] !== 0x04) {
|
|
53
|
+
throw new Error("expected uncompressed SEC1 point (0x04 prefix)");
|
|
54
|
+
}
|
|
55
|
+
if (uncompressed.length % 2 !== 1) {
|
|
56
|
+
throw new Error("invalid uncompressed point length");
|
|
57
|
+
}
|
|
58
|
+
const coordLen = (uncompressed.length - 1) / 2;
|
|
59
|
+
const x = uncompressed.subarray(1, 1 + coordLen);
|
|
60
|
+
const yLastByte = uncompressed[uncompressed.length - 1] ?? 0;
|
|
61
|
+
const prefix = (yLastByte & 1) === 0 ? 0x02 : 0x03;
|
|
62
|
+
const out = new Uint8Array(1 + coordLen);
|
|
63
|
+
out[0] = prefix;
|
|
64
|
+
out.set(x, 1);
|
|
65
|
+
return out;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Convert a CryptoKey (imported from WebAuthn SPKI) into a W3C Multikey
|
|
69
|
+
* string. Currently supports ES256 (P-256) and Ed25519.
|
|
70
|
+
*/
|
|
71
|
+
export async function cryptoKeyToMultikey(publicKey, coseAlg) {
|
|
72
|
+
if (coseAlg === COSE_ALG.ES256) {
|
|
73
|
+
const raw = new Uint8Array(await crypto.subtle.exportKey("raw", publicKey));
|
|
74
|
+
const compressed = compressEcPoint(raw);
|
|
75
|
+
return encodeMultikey(MULTICODEC.p256Pub, compressed);
|
|
76
|
+
}
|
|
77
|
+
if (coseAlg === COSE_ALG.EdDSA) {
|
|
78
|
+
const raw = new Uint8Array(await crypto.subtle.exportKey("raw", publicKey));
|
|
79
|
+
if (raw.length !== 32) {
|
|
80
|
+
throw new Error(`unexpected Ed25519 key length: ${raw.length}`);
|
|
81
|
+
}
|
|
82
|
+
return encodeMultikey(MULTICODEC.ed25519Pub, raw);
|
|
83
|
+
}
|
|
84
|
+
if (coseAlg === COSE_ALG.ES384) {
|
|
85
|
+
const raw = new Uint8Array(await crypto.subtle.exportKey("raw", publicKey));
|
|
86
|
+
const compressed = compressEcPoint(raw);
|
|
87
|
+
return encodeMultikey(MULTICODEC.p384Pub, compressed);
|
|
88
|
+
}
|
|
89
|
+
throw new Error(`unsupported COSE algorithm for multikey: ${coseAlg}`);
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=multikey.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multikey.js","sourceRoot":"","sources":["../../src/webauthn/multikey.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type CoseAlg } from "./multikey.js";
|
|
2
|
+
export interface PasskeyEnrollmentChallenge {
|
|
3
|
+
challenge: Uint8Array;
|
|
4
|
+
rp: {
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
};
|
|
8
|
+
user: {
|
|
9
|
+
id: Uint8Array;
|
|
10
|
+
name: string;
|
|
11
|
+
displayName: string;
|
|
12
|
+
};
|
|
13
|
+
pubKeyCredParams?: PublicKeyCredentialParameters[];
|
|
14
|
+
authenticatorSelection?: AuthenticatorSelectionCriteria;
|
|
15
|
+
timeout?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface PasskeyEnrollmentResult {
|
|
18
|
+
credentialId: string;
|
|
19
|
+
credentialIdBytes: Uint8Array;
|
|
20
|
+
publicKeyMultikey: string;
|
|
21
|
+
coseAlg: CoseAlg;
|
|
22
|
+
attestationObjectB64u: string;
|
|
23
|
+
clientDataJsonB64u: string;
|
|
24
|
+
authenticatorDataB64u: string;
|
|
25
|
+
transports: AuthenticatorTransport[];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Run a WebAuthn registration ceremony and produce a payload suitable
|
|
29
|
+
* for posting to the VTA's `POST /did/verification-methods` endpoint.
|
|
30
|
+
*
|
|
31
|
+
* The caller is responsible for obtaining `challenge` from the VTA —
|
|
32
|
+
* never generate it client-side. The VTA stores the challenge and
|
|
33
|
+
* verifies the returned `clientDataJSON`.
|
|
34
|
+
*/
|
|
35
|
+
export declare function enrollPasskey(c: PasskeyEnrollmentChallenge): Promise<PasskeyEnrollmentResult>;
|
|
36
|
+
//# sourceMappingURL=register.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/webauthn/register.ts"],"names":[],"mappings":"AACA,OAAO,EAAiC,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAE5E,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,UAAU,CAAC;IACtB,EAAE,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACjC,IAAI,EAAE;QAAE,EAAE,EAAE,UAAU,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5D,gBAAgB,CAAC,EAAE,6BAA6B,EAAE,CAAC;IACnD,sBAAsB,CAAC,EAAE,8BAA8B,CAAC;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,UAAU,CAAC;IAC9B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,UAAU,EAAE,sBAAsB,EAAE,CAAC;CACtC;AAoCD;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,CAAC,EAAE,0BAA0B,GAC5B,OAAO,CAAC,uBAAuB,CAAC,CAyDlC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { bytesToBase64url } from "./base64url.js";
|
|
2
|
+
import { COSE_ALG, cryptoKeyToMultikey } from "./multikey.js";
|
|
3
|
+
const DEFAULT_PUBKEY_PARAMS = [
|
|
4
|
+
{ type: "public-key", alg: COSE_ALG.ES256 },
|
|
5
|
+
{ type: "public-key", alg: COSE_ALG.EdDSA },
|
|
6
|
+
];
|
|
7
|
+
function importSpkiForAlg(spki, coseAlg) {
|
|
8
|
+
if (coseAlg === COSE_ALG.ES256) {
|
|
9
|
+
return crypto.subtle.importKey("spki", spki, { name: "ECDSA", namedCurve: "P-256" }, true, ["verify"]);
|
|
10
|
+
}
|
|
11
|
+
if (coseAlg === COSE_ALG.EdDSA) {
|
|
12
|
+
return crypto.subtle.importKey("spki", spki, { name: "Ed25519" }, true, ["verify"]);
|
|
13
|
+
}
|
|
14
|
+
if (coseAlg === COSE_ALG.ES384) {
|
|
15
|
+
return crypto.subtle.importKey("spki", spki, { name: "ECDSA", namedCurve: "P-384" }, true, ["verify"]);
|
|
16
|
+
}
|
|
17
|
+
throw new Error(`unsupported COSE algorithm: ${coseAlg}`);
|
|
18
|
+
}
|
|
19
|
+
function isSupportedAlg(alg) {
|
|
20
|
+
return alg === COSE_ALG.ES256 || alg === COSE_ALG.EdDSA || alg === COSE_ALG.ES384;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Run a WebAuthn registration ceremony and produce a payload suitable
|
|
24
|
+
* for posting to the VTA's `POST /did/verification-methods` endpoint.
|
|
25
|
+
*
|
|
26
|
+
* The caller is responsible for obtaining `challenge` from the VTA —
|
|
27
|
+
* never generate it client-side. The VTA stores the challenge and
|
|
28
|
+
* verifies the returned `clientDataJSON`.
|
|
29
|
+
*/
|
|
30
|
+
export async function enrollPasskey(c) {
|
|
31
|
+
const cred = (await navigator.credentials.create({
|
|
32
|
+
publicKey: {
|
|
33
|
+
challenge: c.challenge,
|
|
34
|
+
rp: c.rp,
|
|
35
|
+
user: {
|
|
36
|
+
id: c.user.id,
|
|
37
|
+
name: c.user.name,
|
|
38
|
+
displayName: c.user.displayName,
|
|
39
|
+
},
|
|
40
|
+
pubKeyCredParams: c.pubKeyCredParams ?? DEFAULT_PUBKEY_PARAMS,
|
|
41
|
+
authenticatorSelection: c.authenticatorSelection ?? {
|
|
42
|
+
residentKey: "preferred",
|
|
43
|
+
userVerification: "preferred",
|
|
44
|
+
},
|
|
45
|
+
attestation: "direct",
|
|
46
|
+
...(c.timeout !== undefined ? { timeout: c.timeout } : {}),
|
|
47
|
+
},
|
|
48
|
+
}));
|
|
49
|
+
if (!cred)
|
|
50
|
+
throw new Error("WebAuthn registration returned no credential");
|
|
51
|
+
const response = cred.response;
|
|
52
|
+
if (typeof response.getPublicKey !== "function" || typeof response.getPublicKeyAlgorithm !== "function") {
|
|
53
|
+
throw new Error("WebAuthn Level 2 response methods (getPublicKey/getPublicKeyAlgorithm) are unavailable; browser too old");
|
|
54
|
+
}
|
|
55
|
+
const spki = response.getPublicKey();
|
|
56
|
+
if (!spki) {
|
|
57
|
+
throw new Error("authenticator did not expose a Subject Public Key Info");
|
|
58
|
+
}
|
|
59
|
+
const alg = response.getPublicKeyAlgorithm();
|
|
60
|
+
if (!isSupportedAlg(alg)) {
|
|
61
|
+
throw new Error(`authenticator returned unsupported algorithm ${alg}`);
|
|
62
|
+
}
|
|
63
|
+
const cryptoKey = await importSpkiForAlg(spki, alg);
|
|
64
|
+
const multikey = await cryptoKeyToMultikey(cryptoKey, alg);
|
|
65
|
+
const transports = (typeof response.getTransports === "function" ? response.getTransports() : []);
|
|
66
|
+
return {
|
|
67
|
+
credentialId: cred.id,
|
|
68
|
+
credentialIdBytes: new Uint8Array(cred.rawId),
|
|
69
|
+
publicKeyMultikey: multikey,
|
|
70
|
+
coseAlg: alg,
|
|
71
|
+
attestationObjectB64u: bytesToBase64url(new Uint8Array(response.attestationObject)),
|
|
72
|
+
clientDataJsonB64u: bytesToBase64url(new Uint8Array(response.clientDataJSON)),
|
|
73
|
+
authenticatorDataB64u: bytesToBase64url(new Uint8Array(response.getAuthenticatorData())),
|
|
74
|
+
transports,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=register.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/webauthn/register.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@openvtc/pnm-core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Browser-side bridge between WebAuthn passkeys and VTA-managed DIDs. Wire types, WebAuthn ceremony helpers, COSE→Multikey conversion, DID verificationMethod builder, REST + DIDComm transports, mediator client, SIOP / RP-login / provision-integration flows.",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/OpenVTC/vta-browser-plugin.git",
|
|
9
|
+
"directory": "packages/core"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/OpenVTC/vta-browser-plugin/tree/main/packages/core",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/OpenVTC/vta-browser-plugin/issues"
|
|
14
|
+
},
|
|
15
|
+
"type": "module",
|
|
16
|
+
"main": "./dist/index.js",
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"types": "./dist/index.d.ts",
|
|
21
|
+
"import": "./dist/index.js"
|
|
22
|
+
},
|
|
23
|
+
"./webauthn": {
|
|
24
|
+
"types": "./dist/webauthn/index.d.ts",
|
|
25
|
+
"import": "./dist/webauthn/index.js"
|
|
26
|
+
},
|
|
27
|
+
"./did": {
|
|
28
|
+
"types": "./dist/did/index.d.ts",
|
|
29
|
+
"import": "./dist/did/index.js"
|
|
30
|
+
},
|
|
31
|
+
"./vta": {
|
|
32
|
+
"types": "./dist/vta/index.d.ts",
|
|
33
|
+
"import": "./dist/vta/index.js"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"files": [
|
|
37
|
+
"dist"
|
|
38
|
+
],
|
|
39
|
+
"scripts": {
|
|
40
|
+
"build": "tsc -b",
|
|
41
|
+
"lint": "tsc -b --noEmit",
|
|
42
|
+
"test": "tsc -b && node --test tests/*.mjs",
|
|
43
|
+
"clean": "rm -rf dist *.tsbuildinfo"
|
|
44
|
+
},
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"@hpke/chacha20poly1305": "^1.8.0",
|
|
47
|
+
"@hpke/core": "^1.9.0",
|
|
48
|
+
"@noble/curves": "^2.2.0",
|
|
49
|
+
"@openvtc/vti-didcomm-js": "^0.4.1",
|
|
50
|
+
"@scure/base": "^1.1.9",
|
|
51
|
+
"cbor-x": "^1.6.4"
|
|
52
|
+
},
|
|
53
|
+
"devDependencies": {
|
|
54
|
+
"typescript": "^5.7.2"
|
|
55
|
+
}
|
|
56
|
+
}
|