@learncard/sss-key-manager 0.2.2 → 0.2.3
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/escrow-authority.d.ts +26 -0
- package/dist/escrow-authority.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/sss-key-manager.cjs.development.js +60 -1
- package/dist/sss-key-manager.cjs.development.js.map +2 -2
- package/dist/sss-key-manager.cjs.production.min.js +5 -5
- package/dist/sss-key-manager.cjs.production.min.js.map +3 -3
- package/dist/sss-key-manager.esm.js +60 -1
- package/dist/sss-key-manager.esm.js.map +2 -2
- package/dist/sss-strategy.d.ts +2 -1
- package/dist/sss-strategy.d.ts.map +1 -1
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/escrow-authority.test.ts +114 -0
- package/src/escrow-authority.ts +74 -0
- package/src/index.ts +2 -0
- package/src/sss-strategy.test.ts +32 -0
- package/src/sss-strategy.ts +24 -1
- package/src/types.ts +5 -0
|
@@ -199,6 +199,7 @@ var require_types_cjs_development = __commonJS({
|
|
|
199
199
|
FlatAuthGrantValidator: /* @__PURE__ */ __name(() => FlatAuthGrantValidator, "FlatAuthGrantValidator"),
|
|
200
200
|
FrameworkWithSkillsValidator: /* @__PURE__ */ __name(() => FrameworkWithSkillsValidator, "FrameworkWithSkillsValidator"),
|
|
201
201
|
FullClaimHookValidator: /* @__PURE__ */ __name(() => FullClaimHookValidator, "FullClaimHookValidator"),
|
|
202
|
+
GenerateSkillIconsInputValidator: /* @__PURE__ */ __name(() => GenerateSkillIconsInputValidator, "GenerateSkillIconsInputValidator"),
|
|
202
203
|
GeoCoordinatesValidator: /* @__PURE__ */ __name(() => GeoCoordinatesValidator, "GeoCoordinatesValidator"),
|
|
203
204
|
GetCounterEventValidator: /* @__PURE__ */ __name(() => GetCounterEventValidator, "GetCounterEventValidator"),
|
|
204
205
|
GetCountersEventValidator: /* @__PURE__ */ __name(() => GetCountersEventValidator, "GetCountersEventValidator"),
|
|
@@ -359,6 +360,8 @@ var require_types_cjs_development = __commonJS({
|
|
|
359
360
|
SHARE_RECOVERY_PROTOCOL: /* @__PURE__ */ __name(() => SHARE_RECOVERY_PROTOCOL, "SHARE_RECOVERY_PROTOCOL"),
|
|
360
361
|
SHARE_TAG_BYTES: /* @__PURE__ */ __name(() => SHARE_TAG_BYTES, "SHARE_TAG_BYTES"),
|
|
361
362
|
SHARE_VIEW_RECEIPT_TTL_SECONDS: /* @__PURE__ */ __name(() => SHARE_VIEW_RECEIPT_TTL_SECONDS, "SHARE_VIEW_RECEIPT_TTL_SECONDS"),
|
|
363
|
+
SKILL_ICON_MAX_CHARACTERS_PER_REQUEST: /* @__PURE__ */ __name(() => SKILL_ICON_MAX_CHARACTERS_PER_REQUEST, "SKILL_ICON_MAX_CHARACTERS_PER_REQUEST"),
|
|
364
|
+
SKILL_ICON_MAX_NAMES_PER_REQUEST: /* @__PURE__ */ __name(() => SKILL_ICON_MAX_NAMES_PER_REQUEST, "SKILL_ICON_MAX_NAMES_PER_REQUEST"),
|
|
362
365
|
SendAiSessionCredentialEventValidator: /* @__PURE__ */ __name(() => SendAiSessionCredentialEventValidator, "SendAiSessionCredentialEventValidator"),
|
|
363
366
|
SendBoostInputValidator: /* @__PURE__ */ __name(() => SendBoostInputValidator, "SendBoostInputValidator"),
|
|
364
367
|
SendBoostResponseValidator: /* @__PURE__ */ __name(() => SendBoostResponseValidator, "SendBoostResponseValidator"),
|
|
@@ -411,6 +414,7 @@ var require_types_cjs_development = __commonJS({
|
|
|
411
414
|
SkillFrameworkQueryValidator: /* @__PURE__ */ __name(() => SkillFrameworkQueryValidator, "SkillFrameworkQueryValidator"),
|
|
412
415
|
SkillFrameworkStatusEnum: /* @__PURE__ */ __name(() => SkillFrameworkStatusEnum, "SkillFrameworkStatusEnum"),
|
|
413
416
|
SkillFrameworkValidator: /* @__PURE__ */ __name(() => SkillFrameworkValidator, "SkillFrameworkValidator"),
|
|
417
|
+
SkillIconNamesValidator: /* @__PURE__ */ __name(() => SkillIconNamesValidator, "SkillIconNamesValidator"),
|
|
414
418
|
SkillQueryValidator: /* @__PURE__ */ __name(() => SkillQueryValidator, "SkillQueryValidator"),
|
|
415
419
|
SkillSemanticSearchInputValidator: /* @__PURE__ */ __name(() => SkillSemanticSearchInputValidator, "SkillSemanticSearchInputValidator"),
|
|
416
420
|
SkillSemanticSearchResultItemValidator: /* @__PURE__ */ __name(() => SkillSemanticSearchResultItemValidator, "SkillSemanticSearchResultItemValidator"),
|
|
@@ -16148,6 +16152,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
16148
16152
|
term: external_exports.string().optional()
|
|
16149
16153
|
}).catchall(external_exports.any());
|
|
16150
16154
|
var UnsignedAchievementCredentialValidator = UnsignedVCValidator.extend({
|
|
16155
|
+
awardedDate: external_exports.string().optional(),
|
|
16151
16156
|
name: external_exports.string().optional(),
|
|
16152
16157
|
description: external_exports.string().optional(),
|
|
16153
16158
|
image: ImageValidator.optional(),
|
|
@@ -19004,6 +19009,17 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
19004
19009
|
contentUrl: external_exports.string(),
|
|
19005
19010
|
receipt: external_exports.string().min(22).max(128).regex(/^[A-Za-z0-9_-]+$/)
|
|
19006
19011
|
}).strict();
|
|
19012
|
+
var SKILL_ICON_MAX_NAMES_PER_REQUEST = 100;
|
|
19013
|
+
var SKILL_ICON_MAX_CHARACTERS_PER_REQUEST = 2500;
|
|
19014
|
+
var SkillIconNamesValidator = external_exports.array(external_exports.string().nonempty()).min(1).max(SKILL_ICON_MAX_NAMES_PER_REQUEST, {
|
|
19015
|
+
message: `A maximum of ${SKILL_ICON_MAX_NAMES_PER_REQUEST} skill names can be sent per request`
|
|
19016
|
+
}).refine(
|
|
19017
|
+
(names) => names.reduce((total, name) => total + name.length, 0) <= SKILL_ICON_MAX_CHARACTERS_PER_REQUEST,
|
|
19018
|
+
{
|
|
19019
|
+
message: `Skill names may total at most ${SKILL_ICON_MAX_CHARACTERS_PER_REQUEST} characters per request`
|
|
19020
|
+
}
|
|
19021
|
+
);
|
|
19022
|
+
var GenerateSkillIconsInputValidator = external_exports.object({ names: SkillIconNamesValidator });
|
|
19007
19023
|
}
|
|
19008
19024
|
});
|
|
19009
19025
|
|
|
@@ -21034,6 +21050,37 @@ var EscrowEvidenceError = class extends Error {
|
|
|
21034
21050
|
var fail2 = /* @__PURE__ */ __name(() => {
|
|
21035
21051
|
throw new EscrowEvidenceError();
|
|
21036
21052
|
}, "fail");
|
|
21053
|
+
var verifyEscrowHoldState = /* @__PURE__ */ __name(async (response, nonce, expected, identity) => {
|
|
21054
|
+
requireEvidence(/^[0-9a-f]{64}$/.test(nonce));
|
|
21055
|
+
const { payload } = await verifyRecord(response.proof, "snapshot", identity);
|
|
21056
|
+
requireEvidence(Array.isArray(payload) && payload.length === 12);
|
|
21057
|
+
const p = payload;
|
|
21058
|
+
requireEvidence(
|
|
21059
|
+
p[0] === "learncard-authority-hold-state-v3" && p[1] === nonce && p[2] === expected.tenant && p[3] === expected.authorityGeneration && p[4] === expected.did && p[5] === expected.holdId && p[6] === expected.holdDigest
|
|
21060
|
+
);
|
|
21061
|
+
const status = p[7];
|
|
21062
|
+
if (status !== "awaitingConfirmation" && status !== "pending" && status !== "released" && status !== "cancelled")
|
|
21063
|
+
return fail2();
|
|
21064
|
+
const confirmedHiMs = p[8] === null ? null : integer2(p[8]);
|
|
21065
|
+
const releaseWarningSentHiMs = p[9] === null ? null : integer2(p[9]);
|
|
21066
|
+
const attemptsRemaining = integer2(p[10], 0, 5);
|
|
21067
|
+
const codeSendStatus = p[11];
|
|
21068
|
+
if (codeSendStatus !== "unknown" && codeSendStatus !== "notRequired") return fail2();
|
|
21069
|
+
requireEvidence(
|
|
21070
|
+
status !== "awaitingConfirmation" || confirmedHiMs === null && releaseWarningSentHiMs === null
|
|
21071
|
+
);
|
|
21072
|
+
requireEvidence(status !== "pending" && status !== "released" || confirmedHiMs !== null);
|
|
21073
|
+
return { status, confirmedHiMs, releaseWarningSentHiMs, attemptsRemaining, codeSendStatus };
|
|
21074
|
+
}, "verifyEscrowHoldState");
|
|
21075
|
+
var verifyEscrowCodeDelivery = /* @__PURE__ */ __name(async (delivery, expected, identity) => {
|
|
21076
|
+
const { payload } = await verifyRecord(delivery.proof, "snapshot", identity);
|
|
21077
|
+
requireEvidence(Array.isArray(payload) && payload.length === 5);
|
|
21078
|
+
const values = payload;
|
|
21079
|
+
requireEvidence(
|
|
21080
|
+
values[0] === "learncard-authority-code-delivery-v1" && values[1] === expected.tenant && values[2] === expected.authorityGeneration && values[3] === expected.holdDigest && typeof values[4] === "boolean" && values[4] === delivery.codeSent
|
|
21081
|
+
);
|
|
21082
|
+
return delivery.codeSent;
|
|
21083
|
+
}, "verifyEscrowCodeDelivery");
|
|
21037
21084
|
var requireEvidence = /* @__PURE__ */ __name((condition) => {
|
|
21038
21085
|
if (!condition) fail2();
|
|
21039
21086
|
}, "requireEvidence");
|
|
@@ -21702,9 +21749,10 @@ var SERVER_REQUEST_TIMEOUT_MS = 3e4;
|
|
|
21702
21749
|
var requestTimeoutSignal = /* @__PURE__ */ __name((ms = SERVER_REQUEST_TIMEOUT_MS) => typeof AbortSignal !== "undefined" && typeof AbortSignal.timeout === "function" ? AbortSignal.timeout(ms) : void 0, "requestTimeoutSignal");
|
|
21703
21750
|
var describeHttpStatus = /* @__PURE__ */ __name((response) => response.statusText ? `${response.status} ${response.statusText}` : `${response.status}`, "describeHttpStatus");
|
|
21704
21751
|
var EscrowRequestError = class extends Error {
|
|
21705
|
-
constructor(status) {
|
|
21752
|
+
constructor(status, reason) {
|
|
21706
21753
|
super("Escrow request failed");
|
|
21707
21754
|
this.status = status;
|
|
21755
|
+
this.reason = reason;
|
|
21708
21756
|
this.name = "EscrowRequestError";
|
|
21709
21757
|
}
|
|
21710
21758
|
static {
|
|
@@ -22190,6 +22238,14 @@ function createSSSStrategy(config) {
|
|
|
22190
22238
|
...init
|
|
22191
22239
|
});
|
|
22192
22240
|
if (!response.ok) {
|
|
22241
|
+
if (path === "/confirm" && response.status === 403) {
|
|
22242
|
+
const body = await response.json().catch(() => void 0);
|
|
22243
|
+
const reason = body && typeof body === "object" && "message" in body && typeof body.message === "string" ? body.message : void 0;
|
|
22244
|
+
throw new EscrowRequestError(
|
|
22245
|
+
response.status,
|
|
22246
|
+
reason === "codeMismatch" || reason === "codeExpired" || reason === "codeLocked" ? reason : void 0
|
|
22247
|
+
);
|
|
22248
|
+
}
|
|
22193
22249
|
if (!pinAttempt && path === "/recover" && response.status === 429) {
|
|
22194
22250
|
const body = await response.json().catch(() => void 0);
|
|
22195
22251
|
const message = body && typeof body === "object" && "message" in body && typeof body.message === "string" ? body.message : "";
|
|
@@ -23093,6 +23149,7 @@ function createSSSStrategy(config) {
|
|
|
23093
23149
|
ledgerPublicKey: identity.authority.ledgerPublicKey,
|
|
23094
23150
|
keyId: verified.receipt.keyId
|
|
23095
23151
|
};
|
|
23152
|
+
result.codeSent = result.delivery ? await verifyEscrowCodeDelivery(result.delivery, expectations, identity) : void 0;
|
|
23096
23153
|
}
|
|
23097
23154
|
return { ...result, clientEphemeralPrivateKey: pair.privateKey, expectations };
|
|
23098
23155
|
},
|
|
@@ -24357,7 +24414,9 @@ export {
|
|
|
24357
24414
|
validateRecoveryPhrase,
|
|
24358
24415
|
verifyEnclaveAttestation,
|
|
24359
24416
|
verifyEscrowAuthorityState,
|
|
24417
|
+
verifyEscrowCodeDelivery,
|
|
24360
24418
|
verifyEscrowEnrollmentCommit,
|
|
24419
|
+
verifyEscrowHoldState,
|
|
24361
24420
|
verifyNitroAttestationDocument,
|
|
24362
24421
|
verifyStoredShares,
|
|
24363
24422
|
violatesCarryContactRule
|