@atlasauth/emulator-core 0.1.0 → 0.3.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/dist/adopt.d.ts +50 -0
- package/dist/adopt.js +57 -0
- package/dist/adopt.js.map +1 -0
- package/dist/coverage.d.ts +15 -0
- package/dist/coverage.js +31 -0
- package/dist/coverage.js.map +1 -0
- package/dist/crypto-util.d.ts +10 -0
- package/dist/crypto-util.js +76 -0
- package/dist/crypto-util.js.map +1 -0
- package/dist/custom-html.d.ts +57 -0
- package/dist/custom-html.js +491 -0
- package/dist/custom-html.js.map +1 -0
- package/dist/engine.d.ts +34 -3
- package/dist/engine.js +57 -8
- package/dist/engine.js.map +1 -1
- package/dist/error-catalog.js +16 -0
- package/dist/error-catalog.js.map +1 -1
- package/dist/event-gate.d.ts +3 -0
- package/dist/event-gate.js +430 -0
- package/dist/event-gate.js.map +1 -0
- package/dist/generic.js +14 -2
- package/dist/generic.js.map +1 -1
- package/dist/handlers/access-signals.d.ts +48 -0
- package/dist/handlers/access-signals.js +76 -0
- package/dist/handlers/access-signals.js.map +1 -0
- package/dist/handlers/approvals.d.ts +2 -0
- package/dist/handlers/approvals.js +418 -0
- package/dist/handlers/approvals.js.map +1 -0
- package/dist/handlers/authz-data.d.ts +2 -0
- package/dist/handlers/authz-data.js +627 -0
- package/dist/handlers/authz-data.js.map +1 -0
- package/dist/handlers/authz-layers.d.ts +229 -0
- package/dist/handlers/authz-layers.js +786 -0
- package/dist/handlers/authz-layers.js.map +1 -0
- package/dist/handlers/authz-state.d.ts +80 -0
- package/dist/handlers/authz-state.js +175 -0
- package/dist/handlers/authz-state.js.map +1 -0
- package/dist/handlers/authz.d.ts +2 -0
- package/dist/handlers/authz.js +410 -0
- package/dist/handlers/authz.js.map +1 -0
- package/dist/handlers/billing.d.ts +100 -0
- package/dist/handlers/billing.js +877 -0
- package/dist/handlers/billing.js.map +1 -0
- package/dist/handlers/cedar-ext.d.ts +35 -0
- package/dist/handlers/cedar-ext.js +174 -0
- package/dist/handlers/cedar-ext.js.map +1 -0
- package/dist/handlers/cedar.d.ts +146 -0
- package/dist/handlers/cedar.js +689 -0
- package/dist/handlers/cedar.js.map +1 -0
- package/dist/handlers/connections.d.ts +5 -0
- package/dist/handlers/connections.js +561 -0
- package/dist/handlers/connections.js.map +1 -0
- package/dist/handlers/control.js +6 -1
- package/dist/handlers/control.js.map +1 -1
- package/dist/handlers/device.d.ts +47 -0
- package/dist/handlers/device.js +665 -0
- package/dist/handlers/device.js.map +1 -0
- package/dist/handlers/emu3-misc.d.ts +38 -0
- package/dist/handlers/emu3-misc.js +1056 -0
- package/dist/handlers/emu3-misc.js.map +1 -0
- package/dist/handlers/emu4-actions-access.d.ts +46 -0
- package/dist/handlers/emu4-actions-access.js +107 -0
- package/dist/handlers/emu4-actions-access.js.map +1 -0
- package/dist/handlers/emu4-actions-catalog-extra.d.ts +3 -0
- package/dist/handlers/emu4-actions-catalog-extra.js +204 -0
- package/dist/handlers/emu4-actions-catalog-extra.js.map +1 -0
- package/dist/handlers/emu4-actions-catalog.d.ts +3 -0
- package/dist/handlers/emu4-actions-catalog.js +143 -0
- package/dist/handlers/emu4-actions-catalog.js.map +1 -0
- package/dist/handlers/emu4-actions-def.d.ts +50 -0
- package/dist/handlers/emu4-actions-def.js +250 -0
- package/dist/handlers/emu4-actions-def.js.map +1 -0
- package/dist/handlers/emu4-actions-sandbox.d.ts +36 -0
- package/dist/handlers/emu4-actions-sandbox.js +318 -0
- package/dist/handlers/emu4-actions-sandbox.js.map +1 -0
- package/dist/handlers/emu4-actions-typegen.d.ts +5 -0
- package/dist/handlers/emu4-actions-typegen.js +73 -0
- package/dist/handlers/emu4-actions-typegen.js.map +1 -0
- package/dist/handlers/emu4-actions.d.ts +2 -0
- package/dist/handlers/emu4-actions.js +506 -0
- package/dist/handlers/emu4-actions.js.map +1 -0
- package/dist/handlers/emu4-authz-trust.d.ts +40 -0
- package/dist/handlers/emu4-authz-trust.js +488 -0
- package/dist/handlers/emu4-authz-trust.js.map +1 -0
- package/dist/handlers/emu4-authz.d.ts +2 -0
- package/dist/handlers/emu4-authz.js +752 -0
- package/dist/handlers/emu4-authz.js.map +1 -0
- package/dist/handlers/emu4-billing-core.d.ts +23 -0
- package/dist/handlers/emu4-billing-core.js +22 -0
- package/dist/handlers/emu4-billing-core.js.map +1 -0
- package/dist/handlers/emu4-billing-x.d.ts +2 -0
- package/dist/handlers/emu4-billing-x.js +489 -0
- package/dist/handlers/emu4-billing-x.js.map +1 -0
- package/dist/handlers/emu4-billing.d.ts +14 -0
- package/dist/handlers/emu4-billing.js +846 -0
- package/dist/handlers/emu4-billing.js.map +1 -0
- package/dist/handlers/emu4-clones.d.ts +2 -0
- package/dist/handlers/emu4-clones.js +322 -0
- package/dist/handlers/emu4-clones.js.map +1 -0
- package/dist/handlers/emu4-compliance.d.ts +8 -0
- package/dist/handlers/emu4-compliance.js +39 -0
- package/dist/handlers/emu4-compliance.js.map +1 -0
- package/dist/handlers/emu4-config.d.ts +14 -0
- package/dist/handlers/emu4-config.js +148 -0
- package/dist/handlers/emu4-config.js.map +1 -0
- package/dist/handlers/emu4-cookies.d.ts +8 -0
- package/dist/handlers/emu4-cookies.js +248 -0
- package/dist/handlers/emu4-cookies.js.map +1 -0
- package/dist/handlers/emu4-erasure.d.ts +2 -0
- package/dist/handlers/emu4-erasure.js +587 -0
- package/dist/handlers/emu4-erasure.js.map +1 -0
- package/dist/handlers/emu4-federation.d.ts +8 -0
- package/dist/handlers/emu4-federation.js +18 -0
- package/dist/handlers/emu4-federation.js.map +1 -0
- package/dist/handlers/emu4-journey-math.d.ts +42 -0
- package/dist/handlers/emu4-journey-math.js +99 -0
- package/dist/handlers/emu4-journey-math.js.map +1 -0
- package/dist/handlers/emu4-messaging.d.ts +21 -0
- package/dist/handlers/emu4-messaging.js +595 -0
- package/dist/handlers/emu4-messaging.js.map +1 -0
- package/dist/handlers/emu4-minors.d.ts +7 -0
- package/dist/handlers/emu4-minors.js +408 -0
- package/dist/handlers/emu4-minors.js.map +1 -0
- package/dist/handlers/emu4-oauth-audit.d.ts +5 -0
- package/dist/handlers/emu4-oauth-audit.js +17 -0
- package/dist/handlers/emu4-oauth-audit.js.map +1 -0
- package/dist/handlers/emu4-oauth-auth.d.ts +83 -0
- package/dist/handlers/emu4-oauth-auth.js +363 -0
- package/dist/handlers/emu4-oauth-auth.js.map +1 -0
- package/dist/handlers/emu4-oauth-delivery.d.ts +68 -0
- package/dist/handlers/emu4-oauth-delivery.js +207 -0
- package/dist/handlers/emu4-oauth-delivery.js.map +1 -0
- package/dist/handlers/emu4-oauth-keys.d.ts +11 -0
- package/dist/handlers/emu4-oauth-keys.js +268 -0
- package/dist/handlers/emu4-oauth-keys.js.map +1 -0
- package/dist/handlers/emu4-oauth-pub.d.ts +36 -0
- package/dist/handlers/emu4-oauth-pub.js +420 -0
- package/dist/handlers/emu4-oauth-pub.js.map +1 -0
- package/dist/handlers/emu4-oauth.d.ts +10 -0
- package/dist/handlers/emu4-oauth.js +23 -0
- package/dist/handlers/emu4-oauth.js.map +1 -0
- package/dist/handlers/emu4-policies.d.ts +2 -0
- package/dist/handlers/emu4-policies.js +408 -0
- package/dist/handlers/emu4-policies.js.map +1 -0
- package/dist/handlers/emu4-region.d.ts +2 -0
- package/dist/handlers/emu4-region.js +189 -0
- package/dist/handlers/emu4-region.js.map +1 -0
- package/dist/handlers/emu4-saml.d.ts +12 -0
- package/dist/handlers/emu4-saml.js +532 -0
- package/dist/handlers/emu4-saml.js.map +1 -0
- package/dist/handlers/emu4-shared.d.ts +44 -0
- package/dist/handlers/emu4-shared.js +90 -0
- package/dist/handlers/emu4-shared.js.map +1 -0
- package/dist/handlers/emu4-snapshots.d.ts +38 -0
- package/dist/handlers/emu4-snapshots.js +231 -0
- package/dist/handlers/emu4-snapshots.js.map +1 -0
- package/dist/handlers/emu4-sns.d.ts +9 -0
- package/dist/handlers/emu4-sns.js +21 -0
- package/dist/handlers/emu4-sns.js.map +1 -0
- package/dist/handlers/emu4-trust-binding.d.ts +27 -0
- package/dist/handlers/emu4-trust-binding.js +344 -0
- package/dist/handlers/emu4-trust-binding.js.map +1 -0
- package/dist/handlers/emu4-trust.d.ts +35 -0
- package/dist/handlers/emu4-trust.js +543 -0
- package/dist/handlers/emu4-trust.js.map +1 -0
- package/dist/handlers/federation.d.ts +2 -0
- package/dist/handlers/federation.js +481 -0
- package/dist/handlers/federation.js.map +1 -0
- package/dist/handlers/fga-engine.d.ts +78 -0
- package/dist/handlers/fga-engine.js +663 -0
- package/dist/handlers/fga-engine.js.map +1 -0
- package/dist/handlers/governance.d.ts +2 -0
- package/dist/handlers/governance.js +460 -0
- package/dist/handlers/governance.js.map +1 -0
- package/dist/handlers/hooks.js +17 -1
- package/dist/handlers/hooks.js.map +1 -1
- package/dist/handlers/index.d.ts +5 -1
- package/dist/handlers/index.js +45 -3
- package/dist/handlers/index.js.map +1 -1
- package/dist/handlers/keys.js +6 -1
- package/dist/handlers/keys.js.map +1 -1
- package/dist/handlers/machines.js +61 -8
- package/dist/handlers/machines.js.map +1 -1
- package/dist/handlers/messaging.d.ts +6 -0
- package/dist/handlers/messaging.js +893 -0
- package/dist/handlers/messaging.js.map +1 -0
- package/dist/handlers/oauth-adv.d.ts +191 -0
- package/dist/handlers/oauth-adv.js +1305 -0
- package/dist/handlers/oauth-adv.js.map +1 -0
- package/dist/handlers/oauth-flows.d.ts +52 -0
- package/dist/handlers/oauth-flows.js +480 -0
- package/dist/handlers/oauth-flows.js.map +1 -0
- package/dist/handlers/oauth.d.ts +96 -0
- package/dist/handlers/oauth.js +793 -0
- package/dist/handlers/oauth.js.map +1 -0
- package/dist/handlers/orgs.js +6 -0
- package/dist/handlers/orgs.js.map +1 -1
- package/dist/handlers/passkeys.d.ts +3 -0
- package/dist/handlers/passkeys.js +293 -0
- package/dist/handlers/passkeys.js.map +1 -0
- package/dist/handlers/platform.d.ts +20 -0
- package/dist/handlers/platform.js +472 -0
- package/dist/handlers/platform.js.map +1 -0
- package/dist/handlers/round2.d.ts +8 -0
- package/dist/handlers/round2.js +372 -0
- package/dist/handlers/round2.js.map +1 -0
- package/dist/handlers/scim.d.ts +4 -0
- package/dist/handlers/scim.js +595 -0
- package/dist/handlers/scim.js.map +1 -0
- package/dist/handlers/sessions.d.ts +9 -3
- package/dist/handlers/sessions.js +76 -38
- package/dist/handlers/sessions.js.map +1 -1
- package/dist/handlers/support.d.ts +20 -0
- package/dist/handlers/support.js +62 -0
- package/dist/handlers/support.js.map +1 -0
- package/dist/handlers/users.js +7 -0
- package/dist/handlers/users.js.map +1 -1
- package/dist/handlers/workflows.d.ts +2 -0
- package/dist/handlers/workflows.js +428 -0
- package/dist/handlers/workflows.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +23 -1
- package/dist/index.js.map +1 -1
- package/dist/jwe.d.ts +18 -0
- package/dist/jwe.js +101 -0
- package/dist/jwe.js.map +1 -0
- package/dist/jws.d.ts +41 -0
- package/dist/jws.js +135 -0
- package/dist/jws.js.map +1 -0
- package/dist/messages.d.ts +7 -0
- package/dist/messages.js +8 -4
- package/dist/messages.js.map +1 -1
- package/dist/messaging-callbacks.d.ts +100 -0
- package/dist/messaging-callbacks.js +767 -0
- package/dist/messaging-callbacks.js.map +1 -0
- package/dist/openapi.js +41 -1
- package/dist/openapi.js.map +1 -1
- package/dist/parity-bin.js +3 -1
- package/dist/parity-bin.js.map +1 -1
- package/dist/parity-emu3-authz.d.ts +3 -0
- package/dist/parity-emu3-authz.js +61 -0
- package/dist/parity-emu3-authz.js.map +1 -0
- package/dist/parity-emu3-billing.d.ts +3 -0
- package/dist/parity-emu3-billing.js +25 -0
- package/dist/parity-emu3-billing.js.map +1 -0
- package/dist/parity-emu3-messaging.d.ts +3 -0
- package/dist/parity-emu3-messaging.js +27 -0
- package/dist/parity-emu3-messaging.js.map +1 -0
- package/dist/parity-emu3-misc.d.ts +2 -0
- package/dist/parity-emu3-misc.js +63 -0
- package/dist/parity-emu3-misc.js.map +1 -0
- package/dist/parity-emu3-oauth.d.ts +2 -0
- package/dist/parity-emu3-oauth.js +39 -0
- package/dist/parity-emu3-oauth.js.map +1 -0
- package/dist/parity-emu4-actions.d.ts +2 -0
- package/dist/parity-emu4-actions.js +38 -0
- package/dist/parity-emu4-actions.js.map +1 -0
- package/dist/parity-emu4-authz.d.ts +3 -0
- package/dist/parity-emu4-authz.js +68 -0
- package/dist/parity-emu4-authz.js.map +1 -0
- package/dist/parity-emu4-billing.d.ts +6 -0
- package/dist/parity-emu4-billing.js +44 -0
- package/dist/parity-emu4-billing.js.map +1 -0
- package/dist/parity-emu4-compliance.d.ts +2 -0
- package/dist/parity-emu4-compliance.js +92 -0
- package/dist/parity-emu4-compliance.js.map +1 -0
- package/dist/parity-emu4-federation.d.ts +2 -0
- package/dist/parity-emu4-federation.js +33 -0
- package/dist/parity-emu4-federation.js.map +1 -0
- package/dist/parity-emu4-messaging.d.ts +3 -0
- package/dist/parity-emu4-messaging.js +42 -0
- package/dist/parity-emu4-messaging.js.map +1 -0
- package/dist/parity-emu4-oauth.d.ts +2 -0
- package/dist/parity-emu4-oauth.js +55 -0
- package/dist/parity-emu4-oauth.js.map +1 -0
- package/dist/parity-emu4-trust.d.ts +2 -0
- package/dist/parity-emu4-trust.js +41 -0
- package/dist/parity-emu4-trust.js.map +1 -0
- package/dist/parity-routes.d.ts +14 -0
- package/dist/parity-routes.js +439 -0
- package/dist/parity-routes.js.map +1 -0
- package/dist/parity.d.ts +10 -3
- package/dist/parity.js +14 -5
- package/dist/parity.js.map +1 -1
- package/dist/sns-cert.d.ts +9 -0
- package/dist/sns-cert.js +101 -0
- package/dist/sns-cert.js.map +1 -0
- package/dist/tokens.d.ts +85 -3
- package/dist/tokens.js +196 -24
- package/dist/tokens.js.map +1 -1
- package/dist/webauthn-virtual.d.ts +70 -0
- package/dist/webauthn-virtual.js +186 -0
- package/dist/webauthn-virtual.js.map +1 -0
- package/dist/webhook-ext.d.ts +16 -0
- package/dist/webhook-ext.js +218 -0
- package/dist/webhook-ext.js.map +1 -0
- package/dist/webhooks.d.ts +3 -0
- package/dist/webhooks.js +37 -3
- package/dist/webhooks.js.map +1 -1
- package/package.json +2 -2
package/dist/tokens.js
CHANGED
|
@@ -1,22 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.TokenService = exports.DEFAULT_TEST_ISSUER = void 0;
|
|
3
|
+
exports.TokenService = exports.DEFAULT_KEY_GRACE_S = exports.isSigningAlg = exports.SIGNING_ALGS = exports.DEFAULT_TEST_ISSUER = void 0;
|
|
4
4
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
5
5
|
const backend_1 = require("@atlasauth/backend");
|
|
6
6
|
const store_1 = require("./store");
|
|
7
|
+
const jws_1 = require("./jws");
|
|
8
|
+
const jwe_1 = require("./jwe");
|
|
9
|
+
const emu4_oauth_audit_1 = require("./handlers/emu4-oauth-audit");
|
|
7
10
|
/** The issuer used when none is given: a reserved `.invalid` host, so no production verifier can ever be configured with it. */
|
|
8
11
|
exports.DEFAULT_TEST_ISSUER = 'https://emulator.atlas.invalid';
|
|
12
|
+
/** The algorithms an instance key may use (the same list the real provider publishes). */
|
|
13
|
+
exports.SIGNING_ALGS = ['RS256', 'ES256', 'ES384', 'PS256', 'EdDSA'];
|
|
14
|
+
const isSigningAlg = (v) => exports.SIGNING_ALGS.includes(v);
|
|
15
|
+
exports.isSigningAlg = isSigningAlg;
|
|
16
|
+
/** How long the previous key stays published after a rotation unless the caller says otherwise. */
|
|
17
|
+
exports.DEFAULT_KEY_GRACE_S = 86_400;
|
|
9
18
|
/**
|
|
10
19
|
* Real signed tokens. Keys are generated in memory on first use and never written anywhere, so a token
|
|
11
20
|
* this engine signs can only verify against this engine's own JWKS. Every token also carries
|
|
12
21
|
* `atlas_emulator: true`, and the issuer defaults to a reserved host.
|
|
22
|
+
*
|
|
23
|
+
* The key set follows the real provider: one current key signs, a staged key is published before it signs, a previous
|
|
24
|
+
* key stays published until its grace ends (the engine clock), an emergency rotation publishes only the new key.
|
|
13
25
|
*/
|
|
14
26
|
class TokenService {
|
|
15
27
|
engine;
|
|
16
|
-
|
|
28
|
+
keys = [];
|
|
17
29
|
initializing = null;
|
|
18
30
|
issuerUrl;
|
|
19
31
|
rotations = 0;
|
|
32
|
+
enc = new Map();
|
|
33
|
+
/** Keys for the algorithms the OP signs responses with that differ from the instance key (as the real provider's OP key table). */
|
|
34
|
+
opKeys = new Map();
|
|
20
35
|
constructor(engine) {
|
|
21
36
|
this.engine = engine;
|
|
22
37
|
this.issuerUrl = engine.options.issuer ?? exports.DEFAULT_TEST_ISSUER;
|
|
@@ -29,48 +44,148 @@ class TokenService {
|
|
|
29
44
|
if (issuer === this.issuerUrl)
|
|
30
45
|
return;
|
|
31
46
|
this.issuerUrl = issuer;
|
|
32
|
-
this.
|
|
33
|
-
this.initializing = null;
|
|
34
|
-
this.rotations = 0;
|
|
47
|
+
this.reset();
|
|
35
48
|
}
|
|
36
49
|
reset() {
|
|
37
|
-
this.
|
|
50
|
+
this.keys = [];
|
|
38
51
|
this.initializing = null;
|
|
39
52
|
this.rotations = 0;
|
|
53
|
+
this.enc.clear();
|
|
54
|
+
this.opKeys.clear();
|
|
40
55
|
}
|
|
41
56
|
async make(alg) {
|
|
42
57
|
const kid = `emu-${this.engine.instanceId}-${++this.rotations}`;
|
|
43
|
-
|
|
58
|
+
// The test issuer is typed for RS256 and ES256; its key generation and signing take every algorithm of the list.
|
|
59
|
+
return (0, backend_1.createTestIssuer)({ alg: alg, issuer: this.issuerUrl, kid, now: this.engine.clock.now });
|
|
44
60
|
}
|
|
45
61
|
async ensure() {
|
|
46
|
-
this.initializing ??= this.make('RS256').then((i) => void this.
|
|
62
|
+
this.initializing ??= this.make('RS256').then((i) => void this.keys.push({ issuer: i, alg: 'RS256', activatesAt: null, graceMs: exports.DEFAULT_KEY_GRACE_S * 1000, retiresAt: null, trigger: null }));
|
|
47
63
|
await this.initializing;
|
|
48
64
|
}
|
|
65
|
+
/** Start signing with a staged key that is due, and drop previous keys whose grace has ended. */
|
|
66
|
+
settle() {
|
|
67
|
+
const now = this.engine.clock.now();
|
|
68
|
+
for (const k of this.keys) {
|
|
69
|
+
if (k.activatesAt === null || k.activatesAt > now)
|
|
70
|
+
continue;
|
|
71
|
+
const prev = this.keys.filter((x) => x !== k && x.activatesAt === null).pop();
|
|
72
|
+
const at = k.activatesAt;
|
|
73
|
+
k.activatesAt = null;
|
|
74
|
+
if (prev && prev.retiresAt === null)
|
|
75
|
+
prev.retiresAt = at + k.graceMs;
|
|
76
|
+
const data = { object: 'signing_key', kid: k.issuer.kid, alg: k.alg, previous_kid: prev?.issuer.kid ?? null, previous_retires_at: prev?.retiresAt ?? null };
|
|
77
|
+
this.engine.webhooks.emit('signing_key.activated', data);
|
|
78
|
+
(0, emu4_oauth_audit_1.recordAudit)(this.engine, 'signing_key.activated', 'system', 'instance', this.engine.instanceId, data);
|
|
79
|
+
}
|
|
80
|
+
this.keys = this.keys.filter((k) => k.retiresAt === null || k.retiresAt > now);
|
|
81
|
+
}
|
|
82
|
+
/** The clock-driven transitions, when a key exists already (an engine that never signed is left alone). */
|
|
83
|
+
async settleIfStarted() {
|
|
84
|
+
if (this.initializing)
|
|
85
|
+
await this.ready();
|
|
86
|
+
}
|
|
87
|
+
/** Make sure the first key exists and the clock-driven transitions have run; every entry point calls this first. */
|
|
88
|
+
async ready() {
|
|
89
|
+
await this.ensure();
|
|
90
|
+
this.settle();
|
|
91
|
+
}
|
|
49
92
|
current() {
|
|
50
|
-
const cur = this.
|
|
93
|
+
const cur = this.keys.filter((k) => k.activatesAt === null).pop();
|
|
51
94
|
if (!cur)
|
|
52
95
|
throw new Error('token service not initialised');
|
|
53
|
-
return cur;
|
|
96
|
+
return cur.issuer;
|
|
97
|
+
}
|
|
98
|
+
currentRec() {
|
|
99
|
+
return this.keys.filter((k) => k.activatesAt === null).pop();
|
|
54
100
|
}
|
|
55
101
|
async jwks() {
|
|
56
|
-
await this.
|
|
57
|
-
return { keys: this.
|
|
102
|
+
await this.ready();
|
|
103
|
+
return { keys: [...this.keys.flatMap((k) => k.issuer.jwks.keys), ...[...this.opKeys.values()].flatMap((i) => i.jwks.keys)] };
|
|
58
104
|
}
|
|
59
|
-
/**
|
|
60
|
-
async
|
|
61
|
-
await this.
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
105
|
+
/** The published key set a relying party reads: the signing keys, plus the encryption key once a client registered for encrypted request objects. */
|
|
106
|
+
async publishedJwks() {
|
|
107
|
+
const sig = await this.jwks();
|
|
108
|
+
return { keys: [...sig.keys, ...[...this.enc.values()].map((k) => k.publicJwk)] };
|
|
109
|
+
}
|
|
110
|
+
/** Make the key clients encrypt request objects to (and publish it). Idempotent per algorithm. */
|
|
111
|
+
async ensureEncryptionKey(alg) {
|
|
112
|
+
let k = this.enc.get(alg);
|
|
113
|
+
if (!k)
|
|
114
|
+
this.enc.set(alg, (k = await (0, jwe_1.generateEncKey)(alg, `emu-enc-${this.engine.instanceId}-${alg.toLowerCase()}`)));
|
|
115
|
+
return k.publicJwk;
|
|
116
|
+
}
|
|
117
|
+
/** The plaintext of a JWE addressed to one of this engine's encryption keys (by `kid`, else by `alg`); null when it cannot be decrypted. */
|
|
118
|
+
async decryptEncrypted(jwe) {
|
|
119
|
+
try {
|
|
120
|
+
const header = JSON.parse(new TextDecoder().decode(Uint8Array.from(atob(jwe.split('.')[0].replace(/-/g, '+').replace(/_/g, '/')), (c) => c.charCodeAt(0))));
|
|
121
|
+
const key = [...this.enc.values()].find((k) => (header.kid ? k.kid === header.kid : k.alg === header.alg));
|
|
122
|
+
return key ? await (0, jwe_1.decryptJwe)(jwe, key) : null;
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
66
127
|
}
|
|
128
|
+
/**
|
|
129
|
+
* Publish a new signing key. Immediately it signs and the old key stays published for `graceSeconds` (default 24 h);
|
|
130
|
+
* `emergency` publishes only the new key; `staged` publishes it now and starts signing at `activatesAt`.
|
|
131
|
+
* The caller checks the real provider's one-key-at-a-time rules (`keyState`).
|
|
132
|
+
*/
|
|
133
|
+
async rotate(alg, opts = {}) {
|
|
134
|
+
await this.ready();
|
|
135
|
+
const cur = this.currentRec();
|
|
136
|
+
const now = this.engine.clock.now();
|
|
137
|
+
const next = alg ?? cur.alg;
|
|
138
|
+
const issuer = await this.make(next);
|
|
139
|
+
const rec = { issuer, alg: next, activatesAt: null, graceMs: (opts.graceSeconds ?? exports.DEFAULT_KEY_GRACE_S) * 1000, retiresAt: null, trigger: opts.trigger ?? null };
|
|
140
|
+
if (opts.staged && !opts.emergency) {
|
|
141
|
+
rec.activatesAt = opts.activatesAt ?? now + 14 * 86_400_000;
|
|
142
|
+
rec.graceMs = (opts.graceSeconds ?? exports.DEFAULT_KEY_GRACE_S) * 1000;
|
|
143
|
+
this.keys.push(rec);
|
|
144
|
+
return { kid: issuer.kid, alg: next, previous_kid: cur.issuer.kid, previous_retires_at: rec.activatesAt + rec.graceMs, emergency: false, staged: true, activates_at: rec.activatesAt };
|
|
145
|
+
}
|
|
146
|
+
if (opts.emergency)
|
|
147
|
+
this.keys = [];
|
|
148
|
+
else
|
|
149
|
+
cur.retiresAt = now + rec.graceMs;
|
|
150
|
+
this.keys.push(rec);
|
|
151
|
+
this.settle();
|
|
152
|
+
return { kid: issuer.kid, alg: next, previous_kid: cur.issuer.kid, previous_retires_at: opts.emergency ? null : cur.retiresAt, emergency: opts.emergency === true };
|
|
153
|
+
}
|
|
154
|
+
/** The staged key, unpublished; null when none is staged. */
|
|
155
|
+
async cancelStaged() {
|
|
156
|
+
await this.ready();
|
|
157
|
+
const k = this.keys.find((x) => x.activatesAt !== null);
|
|
158
|
+
if (!k)
|
|
159
|
+
return null;
|
|
160
|
+
this.keys = this.keys.filter((x) => x !== k);
|
|
161
|
+
return k.issuer.kid;
|
|
162
|
+
}
|
|
163
|
+
/** The key set as the rotation rules see it. */
|
|
164
|
+
async keyState() {
|
|
165
|
+
await this.ready();
|
|
166
|
+
const cur = this.currentRec();
|
|
167
|
+
const staged = this.keys.find((k) => k.activatesAt !== null);
|
|
168
|
+
const prev = this.keys.filter((k) => k.retiresAt !== null).map((k) => k.retiresAt);
|
|
169
|
+
return { currentKid: cur.issuer.kid, alg: cur.alg, staged: staged ? { kid: staged.issuer.kid, alg: staged.alg, activatesAt: staged.activatesAt } : null, previousRetiresAt: prev.length ? Math.max(...prev) : null };
|
|
170
|
+
}
|
|
171
|
+
/** The published keys, newest first, with their state. */
|
|
67
172
|
async signingKeys() {
|
|
68
|
-
await this.
|
|
69
|
-
const cur = this.
|
|
70
|
-
return [...this.
|
|
173
|
+
await this.ready();
|
|
174
|
+
const cur = this.currentRec();
|
|
175
|
+
return [...this.keys].reverse().map((k) => ({
|
|
176
|
+
object: 'signing_key',
|
|
177
|
+
kid: k.issuer.kid,
|
|
178
|
+
alg: k.alg,
|
|
179
|
+
status: k === cur ? 'current' : k.activatesAt !== null ? 'next' : 'previous',
|
|
180
|
+
role: 'main',
|
|
181
|
+
retires_at: k.retiresAt,
|
|
182
|
+
...(k.activatesAt !== null ? { activates_at: k.activatesAt } : {}),
|
|
183
|
+
provider: 'local',
|
|
184
|
+
current: k === cur,
|
|
185
|
+
}));
|
|
71
186
|
}
|
|
72
187
|
async mintSession(input) {
|
|
73
|
-
await this.
|
|
188
|
+
await this.ready();
|
|
74
189
|
const ttl = input.ttlSeconds ?? 60;
|
|
75
190
|
const nowS = Math.floor(this.engine.clock.now() / 1000);
|
|
76
191
|
const claims = {
|
|
@@ -84,13 +199,70 @@ class TokenService {
|
|
|
84
199
|
};
|
|
85
200
|
return { jwt: await this.current().mintSession(claims), claims, expiresIn: ttl };
|
|
86
201
|
}
|
|
202
|
+
/**
|
|
203
|
+
* Sign any claim set with the current key: `iss`, `iat`, `exp` and `atlas_emulator` are filled in, everything else is yours.
|
|
204
|
+
* `idToken` uses the OIDC ID-token minting path (aud, nonce, auth_time stay as given).
|
|
205
|
+
*/
|
|
206
|
+
async signClaims(claims, ttlSeconds = 60) {
|
|
207
|
+
await this.ready();
|
|
208
|
+
const nowS = Math.floor(this.engine.clock.now() / 1000);
|
|
209
|
+
const body = { iss: this.issuerUrl, iat: nowS, exp: nowS + ttlSeconds, atlas_emulator: true, sid: undefined, azp: undefined, sv: undefined, mfa: undefined, ...claims };
|
|
210
|
+
return this.current().mintSession(body);
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Sign claims in a chosen algorithm (an authorization response or ID token the client registered an algorithm for).
|
|
214
|
+
* The instance key signs when it already has that algorithm (or none is asked); otherwise a key of that algorithm is
|
|
215
|
+
* made once and published beside it.
|
|
216
|
+
*/
|
|
217
|
+
async signClaimsAs(alg, claims, ttlSeconds = 60) {
|
|
218
|
+
await this.ready();
|
|
219
|
+
if (!alg || !(0, exports.isSigningAlg)(alg) || alg === this.currentRec().alg)
|
|
220
|
+
return this.signClaims(claims, ttlSeconds);
|
|
221
|
+
let issuer = this.opKeys.get(alg);
|
|
222
|
+
if (!issuer)
|
|
223
|
+
this.opKeys.set(alg, (issuer = await this.make(alg)));
|
|
224
|
+
const nowS = Math.floor(this.engine.clock.now() / 1000);
|
|
225
|
+
return issuer.mintSession({ iss: this.issuerUrl, iat: nowS, exp: nowS + ttlSeconds, atlas_emulator: true, sid: undefined, azp: undefined, sv: undefined, mfa: undefined, ...claims });
|
|
226
|
+
}
|
|
87
227
|
/** Verify as a resource server would: against the engine JWKS, issuer and clock. */
|
|
88
228
|
async verify(token) {
|
|
89
|
-
await this.
|
|
229
|
+
await this.ready();
|
|
90
230
|
const backend = new backend_1.AtlasBackend({ jwks: await this.jwks(), issuer: this.issuerUrl, now: this.engine.clock.now });
|
|
91
231
|
const r = await backend.verify(token);
|
|
92
232
|
return r.ok ? { ok: true, claims: r.claims } : { ok: false, reason: r.reason };
|
|
93
233
|
}
|
|
234
|
+
/**
|
|
235
|
+
* Verify any token this engine signed, whatever its `token_use` (session, machine, access, id): signature against
|
|
236
|
+
* the JWKS, issuer, `exp` and `nbf`. `verify` is the session-only check a resource server would run; this one is
|
|
237
|
+
* for the engine's own routes (machine verify, introspection, token exchange).
|
|
238
|
+
*/
|
|
239
|
+
async verifyAny(token, opts = {}) {
|
|
240
|
+
try {
|
|
241
|
+
const jwt = (0, jws_1.decodeJwt)(token);
|
|
242
|
+
if (!jwt)
|
|
243
|
+
return { ok: false, reason: 'malformed' };
|
|
244
|
+
const jwk = (await this.jwks()).keys.find((k) => k.kid === jwt.header.kid);
|
|
245
|
+
if (!jwk)
|
|
246
|
+
return { ok: false, reason: 'unknown_key' };
|
|
247
|
+
// The key fixes the algorithm: a token naming another one never verifies (no algorithm confusion).
|
|
248
|
+
if (!(0, exports.isSigningAlg)(jwt.header.alg) || jwk.alg !== jwt.header.alg)
|
|
249
|
+
return { ok: false, reason: 'unsupported_alg' };
|
|
250
|
+
if (!(await (0, jws_1.verifyJws)(jwt, jwk)))
|
|
251
|
+
return { ok: false, reason: 'bad_signature' };
|
|
252
|
+
const claims = jwt.payload;
|
|
253
|
+
const nowS = this.engine.clock.now() / 1000;
|
|
254
|
+
if (claims.iss !== this.issuerUrl)
|
|
255
|
+
return { ok: false, reason: 'wrong_issuer' };
|
|
256
|
+
if (!opts.ignoreExp && typeof claims.exp === 'number' && claims.exp <= nowS)
|
|
257
|
+
return { ok: false, reason: 'expired' };
|
|
258
|
+
if (typeof claims.nbf === 'number' && claims.nbf > nowS + 60)
|
|
259
|
+
return { ok: false, reason: 'not_yet_valid' };
|
|
260
|
+
return { ok: true, claims };
|
|
261
|
+
}
|
|
262
|
+
catch {
|
|
263
|
+
return { ok: false, reason: 'malformed' };
|
|
264
|
+
}
|
|
265
|
+
}
|
|
94
266
|
secret(prefix) {
|
|
95
267
|
return `${prefix}_${(0, store_1.randomToken)(24)}`;
|
|
96
268
|
}
|
package/dist/tokens.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export declare function cborEncode(v: any): Uint8Array;
|
|
2
|
+
/** Decode one CBOR item; returns the value and the offset after it (the attested credential data is followed by nothing here, but COSE keys sit mid-buffer). */
|
|
3
|
+
export declare function cborDecode(buf: Uint8Array, at?: number): {
|
|
4
|
+
value: any;
|
|
5
|
+
end: number;
|
|
6
|
+
};
|
|
7
|
+
/** ECDSA signatures from Web Crypto are r||s; WebAuthn carries ASN.1 DER. */
|
|
8
|
+
export declare function rawToDer(raw: Uint8Array): Uint8Array;
|
|
9
|
+
export declare function derToRaw(der: Uint8Array, size?: number): Uint8Array;
|
|
10
|
+
export interface CreationOptions {
|
|
11
|
+
rp: {
|
|
12
|
+
id?: string;
|
|
13
|
+
name?: string;
|
|
14
|
+
};
|
|
15
|
+
user: {
|
|
16
|
+
id: string;
|
|
17
|
+
name?: string;
|
|
18
|
+
displayName?: string;
|
|
19
|
+
};
|
|
20
|
+
challenge: string;
|
|
21
|
+
excludeCredentials?: Array<{
|
|
22
|
+
id: string;
|
|
23
|
+
}>;
|
|
24
|
+
authenticatorSelection?: {
|
|
25
|
+
userVerification?: string;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export interface RequestOptions {
|
|
29
|
+
challenge: string;
|
|
30
|
+
rpId?: string;
|
|
31
|
+
allowCredentials?: Array<{
|
|
32
|
+
id: string;
|
|
33
|
+
}>;
|
|
34
|
+
userVerification?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface VirtualAuthenticatorOptions {
|
|
37
|
+
/** The origin it claims in `clientDataJSON`. */
|
|
38
|
+
origin?: string;
|
|
39
|
+
/** Whether the simulated user verifies (UV flag). Default true. */
|
|
40
|
+
userVerified?: boolean;
|
|
41
|
+
/** Reported in the attestation. Default all zero. */
|
|
42
|
+
aaguid?: Uint8Array;
|
|
43
|
+
}
|
|
44
|
+
export declare class VirtualAuthenticator {
|
|
45
|
+
private credentials;
|
|
46
|
+
userVerified: boolean;
|
|
47
|
+
/** Set to make the next assertions report a counter that does not advance (a cloned authenticator). */
|
|
48
|
+
frozenCounter: boolean;
|
|
49
|
+
readonly origin: string;
|
|
50
|
+
private readonly aaguid;
|
|
51
|
+
constructor(options?: VirtualAuthenticatorOptions);
|
|
52
|
+
get credentialIds(): string[];
|
|
53
|
+
private flags;
|
|
54
|
+
/** `navigator.credentials.create` for a registration `options` object (as returned by `registration/init`). */
|
|
55
|
+
create(options: CreationOptions): Promise<{
|
|
56
|
+
credential_id: string;
|
|
57
|
+
attestation_object: string;
|
|
58
|
+
client_data_json: string;
|
|
59
|
+
transports: string[];
|
|
60
|
+
}>;
|
|
61
|
+
/** `navigator.credentials.get` for an authentication `options` object. */
|
|
62
|
+
get(options: RequestOptions): Promise<{
|
|
63
|
+
credential_id: string;
|
|
64
|
+
authenticator_data: string;
|
|
65
|
+
client_data_json: string;
|
|
66
|
+
signature: string;
|
|
67
|
+
user_handle: string;
|
|
68
|
+
}>;
|
|
69
|
+
}
|
|
70
|
+
export declare const createVirtualAuthenticator: (options?: VirtualAuthenticatorOptions) => VirtualAuthenticator;
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createVirtualAuthenticator = exports.VirtualAuthenticator = void 0;
|
|
4
|
+
exports.cborEncode = cborEncode;
|
|
5
|
+
exports.cborDecode = cborDecode;
|
|
6
|
+
exports.rawToDer = rawToDer;
|
|
7
|
+
exports.derToRaw = derToRaw;
|
|
8
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
9
|
+
const crypto_util_1 = require("./crypto-util");
|
|
10
|
+
/**
|
|
11
|
+
* A virtual WebAuthn authenticator (software "platform" device, ES256, `none` attestation) for tests: it answers
|
|
12
|
+
* `navigator.credentials.create/get` options with real attestation objects and assertions, so a relying party's own
|
|
13
|
+
* verification code (or the engine's Passkey API) runs against genuine bytes. Portable: Web Crypto only.
|
|
14
|
+
*/
|
|
15
|
+
const enc = new TextEncoder();
|
|
16
|
+
const concat = (...parts) => {
|
|
17
|
+
const out = new Uint8Array(parts.reduce((n, p) => n + p.length, 0));
|
|
18
|
+
let o = 0;
|
|
19
|
+
for (const p of parts)
|
|
20
|
+
(out.set(p, o), (o += p.length));
|
|
21
|
+
return out;
|
|
22
|
+
};
|
|
23
|
+
const unb64url = (s) => {
|
|
24
|
+
const b = s.replace(/-/g, '+').replace(/_/g, '/');
|
|
25
|
+
return Uint8Array.from(atob(b + '='.repeat((4 - (b.length % 4)) % 4)), (c) => c.charCodeAt(0));
|
|
26
|
+
};
|
|
27
|
+
// ── CBOR (the subset WebAuthn uses: unsigned/negative ints, byte/text strings, arrays, maps) ──
|
|
28
|
+
const head = (major, n) => {
|
|
29
|
+
if (n < 24)
|
|
30
|
+
return Uint8Array.of((major << 5) | n);
|
|
31
|
+
if (n < 256)
|
|
32
|
+
return Uint8Array.of((major << 5) | 24, n);
|
|
33
|
+
if (n < 65536)
|
|
34
|
+
return Uint8Array.of((major << 5) | 25, n >> 8, n & 255);
|
|
35
|
+
return Uint8Array.of((major << 5) | 26, (n >>> 24) & 255, (n >>> 16) & 255, (n >>> 8) & 255, n & 255);
|
|
36
|
+
};
|
|
37
|
+
function cborEncode(v) {
|
|
38
|
+
if (v instanceof Uint8Array)
|
|
39
|
+
return concat(head(2, v.length), v);
|
|
40
|
+
if (typeof v === 'string') {
|
|
41
|
+
const b = enc.encode(v);
|
|
42
|
+
return concat(head(3, b.length), b);
|
|
43
|
+
}
|
|
44
|
+
if (typeof v === 'number')
|
|
45
|
+
return v >= 0 ? head(0, v) : head(1, -1 - v);
|
|
46
|
+
if (Array.isArray(v))
|
|
47
|
+
return concat(head(4, v.length), ...v.map(cborEncode));
|
|
48
|
+
if (v instanceof Map)
|
|
49
|
+
return concat(head(5, v.size), ...[...v].flatMap(([k, x]) => [cborEncode(k), cborEncode(x)]));
|
|
50
|
+
if (v && typeof v === 'object')
|
|
51
|
+
return cborEncode(new Map(Object.entries(v)));
|
|
52
|
+
throw new Error('cbor: unsupported value');
|
|
53
|
+
}
|
|
54
|
+
/** Decode one CBOR item; returns the value and the offset after it (the attested credential data is followed by nothing here, but COSE keys sit mid-buffer). */
|
|
55
|
+
function cborDecode(buf, at = 0) {
|
|
56
|
+
const first = buf[at];
|
|
57
|
+
const major = first >> 5;
|
|
58
|
+
const info = first & 31;
|
|
59
|
+
let i = at + 1;
|
|
60
|
+
let n = info;
|
|
61
|
+
if (info === 24)
|
|
62
|
+
(n = buf[i], (i += 1));
|
|
63
|
+
else if (info === 25)
|
|
64
|
+
(n = (buf[i] << 8) | buf[i + 1], (i += 2));
|
|
65
|
+
else if (info === 26)
|
|
66
|
+
(n = buf[i] * 2 ** 24 + (buf[i + 1] << 16) + (buf[i + 2] << 8) + buf[i + 3], (i += 4));
|
|
67
|
+
else if (info > 26)
|
|
68
|
+
throw new Error('cbor: length too large');
|
|
69
|
+
if (major === 0)
|
|
70
|
+
return { value: n, end: i };
|
|
71
|
+
if (major === 1)
|
|
72
|
+
return { value: -1 - n, end: i };
|
|
73
|
+
if (major === 2)
|
|
74
|
+
return { value: buf.slice(i, i + n), end: i + n };
|
|
75
|
+
if (major === 3)
|
|
76
|
+
return { value: new TextDecoder().decode(buf.slice(i, i + n)), end: i + n };
|
|
77
|
+
if (major === 4) {
|
|
78
|
+
const arr = [];
|
|
79
|
+
for (let k = 0; k < n; k++) {
|
|
80
|
+
const r = cborDecode(buf, i);
|
|
81
|
+
arr.push(r.value);
|
|
82
|
+
i = r.end;
|
|
83
|
+
}
|
|
84
|
+
return { value: arr, end: i };
|
|
85
|
+
}
|
|
86
|
+
if (major === 5) {
|
|
87
|
+
const map = new Map();
|
|
88
|
+
for (let k = 0; k < n; k++) {
|
|
89
|
+
const key = cborDecode(buf, i);
|
|
90
|
+
const val = cborDecode(buf, key.end);
|
|
91
|
+
map.set(key.value, val.value);
|
|
92
|
+
i = val.end;
|
|
93
|
+
}
|
|
94
|
+
return { value: map, end: i };
|
|
95
|
+
}
|
|
96
|
+
throw new Error('cbor: unsupported major type');
|
|
97
|
+
}
|
|
98
|
+
/** ECDSA signatures from Web Crypto are r||s; WebAuthn carries ASN.1 DER. */
|
|
99
|
+
function rawToDer(raw) {
|
|
100
|
+
const half = raw.length / 2;
|
|
101
|
+
const int = (b) => {
|
|
102
|
+
let s = 0;
|
|
103
|
+
while (s < b.length - 1 && b[s] === 0)
|
|
104
|
+
s++;
|
|
105
|
+
const trimmed = b.slice(s);
|
|
106
|
+
const body = trimmed[0] & 0x80 ? concat(Uint8Array.of(0), trimmed) : trimmed;
|
|
107
|
+
return concat(Uint8Array.of(0x02, body.length), body);
|
|
108
|
+
};
|
|
109
|
+
const r = int(raw.slice(0, half));
|
|
110
|
+
const s = int(raw.slice(half));
|
|
111
|
+
return concat(Uint8Array.of(0x30, r.length + s.length), r, s);
|
|
112
|
+
}
|
|
113
|
+
function derToRaw(der, size = 32) {
|
|
114
|
+
let i = 2;
|
|
115
|
+
if (der[1] & 0x80)
|
|
116
|
+
i += der[1] & 0x7f;
|
|
117
|
+
const read = () => {
|
|
118
|
+
const len = der[i + 1];
|
|
119
|
+
let v = der.slice(i + 2, i + 2 + len);
|
|
120
|
+
i += 2 + len;
|
|
121
|
+
while (v.length > size && v[0] === 0)
|
|
122
|
+
v = v.slice(1);
|
|
123
|
+
return concat(new Uint8Array(size - v.length), v);
|
|
124
|
+
};
|
|
125
|
+
return concat(read(), read());
|
|
126
|
+
}
|
|
127
|
+
class VirtualAuthenticator {
|
|
128
|
+
credentials = [];
|
|
129
|
+
userVerified;
|
|
130
|
+
/** Set to make the next assertions report a counter that does not advance (a cloned authenticator). */
|
|
131
|
+
frozenCounter = false;
|
|
132
|
+
origin;
|
|
133
|
+
aaguid;
|
|
134
|
+
constructor(options = {}) {
|
|
135
|
+
this.origin = options.origin ?? 'https://localhost';
|
|
136
|
+
this.userVerified = options.userVerified ?? true;
|
|
137
|
+
this.aaguid = options.aaguid ?? new Uint8Array(16);
|
|
138
|
+
}
|
|
139
|
+
get credentialIds() {
|
|
140
|
+
return this.credentials.map((c) => (0, crypto_util_1.bytesToB64url)(c.id));
|
|
141
|
+
}
|
|
142
|
+
flags(attested) {
|
|
143
|
+
return 0x01 | (this.userVerified ? 0x04 : 0) | (attested ? 0x40 : 0);
|
|
144
|
+
}
|
|
145
|
+
/** `navigator.credentials.create` for a registration `options` object (as returned by `registration/init`). */
|
|
146
|
+
async create(options) {
|
|
147
|
+
const rpId = options.rp.id ?? new URL(this.origin).hostname;
|
|
148
|
+
if (options.excludeCredentials?.some((c) => this.credentials.some((m) => (0, crypto_util_1.bytesToB64url)(m.id) === c.id)))
|
|
149
|
+
throw new Error('InvalidStateError: a credential for this account already exists on this authenticator.');
|
|
150
|
+
const pair = await crypto.subtle.generateKey({ name: 'ECDSA', namedCurve: 'P-256' }, true, ['sign', 'verify']);
|
|
151
|
+
const id = crypto.getRandomValues(new Uint8Array(32));
|
|
152
|
+
const jwk = (await crypto.subtle.exportKey('jwk', pair.publicKey));
|
|
153
|
+
const cose = cborEncode(new Map([[1, 2], [3, -7], [-1, 1], [-2, unb64url(jwk.x)], [-3, unb64url(jwk.y)]]));
|
|
154
|
+
const attested = concat(this.aaguid, Uint8Array.of(id.length >> 8, id.length & 255), id, cose);
|
|
155
|
+
const authData = concat(await (0, crypto_util_1.sha256)(rpId), Uint8Array.of(this.flags(true)), new Uint8Array(4), attested);
|
|
156
|
+
this.credentials.push({ id, rpId, userHandle: options.user.id, privateKey: pair.privateKey, counter: 0 });
|
|
157
|
+
const clientData = JSON.stringify({ type: 'webauthn.create', challenge: options.challenge, origin: this.origin, crossOrigin: false });
|
|
158
|
+
return {
|
|
159
|
+
credential_id: (0, crypto_util_1.bytesToB64url)(id),
|
|
160
|
+
attestation_object: (0, crypto_util_1.bytesToB64url)(cborEncode(new Map([['fmt', 'none'], ['attStmt', new Map()], ['authData', authData]]))),
|
|
161
|
+
client_data_json: (0, crypto_util_1.bytesToB64url)(enc.encode(clientData)),
|
|
162
|
+
transports: ['internal'],
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/** `navigator.credentials.get` for an authentication `options` object. */
|
|
166
|
+
async get(options) {
|
|
167
|
+
const rpId = options.rpId ?? new URL(this.origin).hostname;
|
|
168
|
+
const allowed = options.allowCredentials?.map((c) => c.id);
|
|
169
|
+
const cred = this.credentials.find((c) => c.rpId === rpId && (!allowed?.length || allowed.includes((0, crypto_util_1.bytesToB64url)(c.id))));
|
|
170
|
+
if (!cred)
|
|
171
|
+
throw new Error('NotAllowedError: no matching credential on this authenticator.');
|
|
172
|
+
if (!this.frozenCounter)
|
|
173
|
+
cred.counter += 1;
|
|
174
|
+
const counter = new Uint8Array(4);
|
|
175
|
+
new DataView(counter.buffer).setUint32(0, cred.counter);
|
|
176
|
+
const authData = concat(await (0, crypto_util_1.sha256)(rpId), Uint8Array.of(this.flags(false)), counter);
|
|
177
|
+
const clientDataJSON = enc.encode(JSON.stringify({ type: 'webauthn.get', challenge: options.challenge, origin: this.origin, crossOrigin: false }));
|
|
178
|
+
const signed = concat(authData, await (0, crypto_util_1.sha256)(clientDataJSON));
|
|
179
|
+
const raw = new Uint8Array(await crypto.subtle.sign({ name: 'ECDSA', hash: 'SHA-256' }, cred.privateKey, signed));
|
|
180
|
+
return { credential_id: (0, crypto_util_1.bytesToB64url)(cred.id), authenticator_data: (0, crypto_util_1.bytesToB64url)(authData), client_data_json: (0, crypto_util_1.bytesToB64url)(clientDataJSON), signature: (0, crypto_util_1.bytesToB64url)(rawToDer(raw)), user_handle: cred.userHandle };
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
exports.VirtualAuthenticator = VirtualAuthenticator;
|
|
184
|
+
const createVirtualAuthenticator = (options) => new VirtualAuthenticator(options);
|
|
185
|
+
exports.createVirtualAuthenticator = createVirtualAuthenticator;
|
|
186
|
+
//# sourceMappingURL=webauthn-virtual.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webauthn-virtual.js","sourceRoot":"","sources":["../src/webauthn-virtual.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Engine } from './engine';
|
|
2
|
+
import type { Obj } from './openapi';
|
|
3
|
+
/** The endpoint fields a create or update body sets (only the ones sent; null clears). Throws a validation error. */
|
|
4
|
+
export declare function parseEndpointExtras(body: Obj, current?: Obj): Obj;
|
|
5
|
+
/** The read side: header names only, no secret of any kind. */
|
|
6
|
+
export declare function presentEndpointExtras(ep: Obj): Obj;
|
|
7
|
+
/** The organization an event belongs to: `data.organization_id`, or the id of an organization object. */
|
|
8
|
+
export declare const eventOrgId: (data: Obj) => string | null;
|
|
9
|
+
/** Does an event pass an endpoint's filters? No filters = yes. Fails closed on anything unreadable. */
|
|
10
|
+
export declare function filtersMatch(filters: Obj | null | undefined, data: Obj): boolean;
|
|
11
|
+
/** Extra request headers for one delivery: the static ones, plus a bearer token fetched with client credentials. */
|
|
12
|
+
export declare function deliveryHeaders(e: Engine, ep: Obj): Promise<Record<string, string>>;
|
|
13
|
+
/** A receiver that answered 401 gets a fresh token next time. */
|
|
14
|
+
export declare const evictToken: (e: Engine, endpointId: string) => void;
|
|
15
|
+
/** The `max_rps` budget: true when this delivery fits the current one-second window, false when it must wait for the next. */
|
|
16
|
+
export declare function takeRate(e: Engine, ep: Obj): boolean;
|