@learncard/sss-key-manager 0.2.6 → 0.2.7
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/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/sss-key-manager.cjs.development.js +56 -16
- package/dist/sss-key-manager.cjs.development.js.map +2 -2
- package/dist/sss-key-manager.cjs.production.min.js +23 -23
- package/dist/sss-key-manager.cjs.production.min.js.map +3 -3
- package/dist/sss-key-manager.esm.js +56 -16
- package/dist/sss-key-manager.esm.js.map +2 -2
- package/dist/sss-strategy.d.ts.map +1 -1
- package/dist/types.d.ts +28 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +6 -1
- package/src/sss-strategy.test.ts +238 -0
- package/src/sss-strategy.ts +179 -96
- package/src/types.ts +29 -0
package/dist/index.d.ts
CHANGED
|
@@ -24,7 +24,7 @@ export type { EscrowEnrollmentActionInput } from './escrow-authority';
|
|
|
24
24
|
export type { VerifiedEnclaveIdentity, EscrowAuthorityRecord, EscrowAuthorityState, VerifiedEscrowMutation, } from './escrow-authority.types';
|
|
25
25
|
export { verifyNitroAttestationDocument, NitroAttestationError } from './escrow-nitro-attestation';
|
|
26
26
|
export type { NitroAttestationReason } from './escrow-nitro-attestation';
|
|
27
|
-
export type { EscrowAttestationPolicy, EscrowHoldStatus, EscrowRecoveryStart } from './types';
|
|
27
|
+
export type { EscrowAttestationPolicy, EscrowHoldStatus, EscrowPinAttemptContext, EscrowRecoveryStart, } from './types';
|
|
28
28
|
export type { EscrowEnrollmentOptions, EscrowEnrollmentState, EscrowBlobStaleReason, EscrowPinStatus, } from './types';
|
|
29
29
|
export { EscrowPinMismatchError, EscrowPinLockedError, EscrowPinThrottledError, EscrowHoldRestartThrottledError, EscrowPinUnavailableError, PinSignInStaleError, } from './types';
|
|
30
30
|
export { PIN_MIN_LENGTH, PIN_MAX_LENGTH, ESCROW_PIN_MAX_ATTEMPTS, normalizePin, validatePin, generatePinSalt, derivePinProof, constantTimeEqualHex, } from './escrow-pin';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EACH,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,GAChB,MAAM,OAAO,CAAC;AAEf,OAAO,EACH,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,GACxB,MAAM,WAAW,CAAC;AAEnB,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAElD,OAAO,EACH,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,UAAU,EACV,UAAU,EACV,cAAc,EACd,cAAc,EACd,kBAAkB,GACrB,MAAM,UAAU,CAAC;AAElB,OAAO,EACH,qBAAqB,EACrB,4BAA4B,EAC5B,wBAAwB,EACxB,wBAAwB,EACxB,kCAAkC,EAClC,uBAAuB,EACvB,wBAAwB,GAC3B,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACR,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,GACtB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACH,uBAAuB,EACvB,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,wBAAwB,EACxB,2BAA2B,EAC3B,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,GACpB,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACnG,OAAO,EACH,4BAA4B,EAC5B,0BAA0B,EAC1B,qBAAqB,EACrB,+BAA+B,GAClC,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACR,sBAAsB,EACtB,4BAA4B,GAC/B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,YAAY,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACzE,YAAY,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EACH,0BAA0B,EAC1B,qBAAqB,EACrB,wBAAwB,EACxB,4BAA4B,EAC5B,4BAA4B,EAC5B,6BAA6B,EAC7B,wBAAwB,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACtE,YAAY,EACR,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,GACzB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,8BAA8B,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnG,YAAY,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACzE,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -30428,6 +30428,7 @@ var EscrowRequestError = class extends Error {
|
|
|
30428
30428
|
__name(this, "EscrowRequestError");
|
|
30429
30429
|
}
|
|
30430
30430
|
};
|
|
30431
|
+
var isConflictRefusal = /* @__PURE__ */ __name((error) => error instanceof EscrowRequestError && error.status === 409, "isConflictRefusal");
|
|
30431
30432
|
var DuplicateShareCoordinateError = class extends Error {
|
|
30432
30433
|
static {
|
|
30433
30434
|
__name(this, "DuplicateShareCoordinateError");
|
|
@@ -31324,21 +31325,34 @@ function createSSSStrategy(config) {
|
|
|
31324
31325
|
}
|
|
31325
31326
|
};
|
|
31326
31327
|
}, "captureActiveUserGuard");
|
|
31327
|
-
const
|
|
31328
|
+
const recordedWrongPinAttempts = /* @__PURE__ */ __name((escrowPin) => {
|
|
31328
31329
|
const status = escrowPin;
|
|
31329
|
-
if (status?.state === "none") return
|
|
31330
|
-
|
|
31331
|
-
|
|
31332
|
-
|
|
31330
|
+
if (status?.state === "none") return 0;
|
|
31331
|
+
const count = status?.wrongAttempts;
|
|
31332
|
+
return typeof count === "number" && Number.isSafeInteger(count) && count >= 0 ? count : void 0;
|
|
31333
|
+
}, "recordedWrongPinAttempts");
|
|
31334
|
+
const attemptCount = /* @__PURE__ */ __name((value) => typeof value === "number" && Number.isSafeInteger(value) && value >= 0 ? value : void 0, "attemptCount");
|
|
31335
|
+
const pinSignInClean = /* @__PURE__ */ __name((observed, flowAttempts) => {
|
|
31336
|
+
const flowSalt = flowAttempts?.pinSalt;
|
|
31337
|
+
const sameGeneration = typeof flowSalt !== "string" || observed.every((status) => {
|
|
31338
|
+
const salt = status?.salt;
|
|
31339
|
+
return typeof salt !== "string" || salt === flowSalt;
|
|
31340
|
+
});
|
|
31341
|
+
const attempts = sameGeneration ? flowAttempts : void 0;
|
|
31342
|
+
const own = attempts ? attemptCount(attempts.ownWrongAttempts) : 0;
|
|
31343
|
+
if (own === void 0) return { clean: false, ownWrongAttempts: 0 };
|
|
31344
|
+
const prior = attempts ? attemptCount(attempts.priorWrongAttempts) : recordedWrongPinAttempts(observed[0]);
|
|
31345
|
+
const clean = prior === 0 && observed.length > 0 && observed.every((status) => recordedWrongPinAttempts(status) === own);
|
|
31346
|
+
return { clean, ownWrongAttempts: own };
|
|
31347
|
+
}, "pinSignInClean");
|
|
31348
|
+
const refreshablePinCharges = /* @__PURE__ */ __name((before, after, ownWrongAttempts) => {
|
|
31333
31349
|
const pre = before;
|
|
31334
31350
|
const post = after;
|
|
31335
|
-
if (pinHasRecordedWrongAttempts(before) || pinHasRecordedWrongAttempts(after))
|
|
31336
|
-
return void 0;
|
|
31337
31351
|
if (pre?.state !== "enabled" || post?.state !== "enabled") return void 0;
|
|
31338
31352
|
if (typeof pre.attemptsRemaining !== "number" || typeof post.attemptsRemaining !== "number")
|
|
31339
31353
|
return void 0;
|
|
31340
31354
|
if (post.attemptsRemaining !== pre.attemptsRemaining - 1) return void 0;
|
|
31341
|
-
return { attemptsRemaining: post.attemptsRemaining, wrongAttempts:
|
|
31355
|
+
return { attemptsRemaining: post.attemptsRemaining, wrongAttempts: ownWrongAttempts };
|
|
31342
31356
|
}, "refreshablePinCharges");
|
|
31343
31357
|
const freshPinMaterial = /* @__PURE__ */ __name(async (pin) => {
|
|
31344
31358
|
if (!validatePin(pin).ok) return void 0;
|
|
@@ -31361,7 +31375,7 @@ function createSSSStrategy(config) {
|
|
|
31361
31375
|
primaryDid: released.primaryDid
|
|
31362
31376
|
};
|
|
31363
31377
|
}, "adoptReleasedShare");
|
|
31364
|
-
const completePinSignInKeep = /* @__PURE__ */ __name(async (params, released, pin, pinBefore) => {
|
|
31378
|
+
const completePinSignInKeep = /* @__PURE__ */ __name(async (params, released, pin, pinBefore, pinAttempts) => {
|
|
31365
31379
|
const storage2 = guardedStorage();
|
|
31366
31380
|
const generation = storageGeneration;
|
|
31367
31381
|
const storageId = activeStorageId;
|
|
@@ -31370,7 +31384,11 @@ function createSSSStrategy(config) {
|
|
|
31370
31384
|
throw new Error("This recovery request was cancelled.");
|
|
31371
31385
|
}
|
|
31372
31386
|
}, "assertActive");
|
|
31373
|
-
const {
|
|
31387
|
+
const {
|
|
31388
|
+
mode,
|
|
31389
|
+
newPinRequired: newPinRequiredAtRelease,
|
|
31390
|
+
refreshCharges
|
|
31391
|
+
} = await withShareUpdateLock(
|
|
31374
31392
|
storage2,
|
|
31375
31393
|
storageId,
|
|
31376
31394
|
() => withRotationLock(async () => {
|
|
@@ -31414,18 +31432,23 @@ function createSSSStrategy(config) {
|
|
|
31414
31432
|
current.shareVersion
|
|
31415
31433
|
);
|
|
31416
31434
|
pendingIdentityRecovery = void 0;
|
|
31435
|
+
const { clean, ownWrongAttempts } = pinSignInClean(
|
|
31436
|
+
[pinBefore, current.escrowPin],
|
|
31437
|
+
pinAttempts
|
|
31438
|
+
);
|
|
31417
31439
|
return {
|
|
31418
31440
|
mode: mode2,
|
|
31419
|
-
newPinRequired:
|
|
31420
|
-
refreshCharges: refreshablePinCharges(pinBefore, current.escrowPin)
|
|
31441
|
+
newPinRequired: !clean,
|
|
31442
|
+
refreshCharges: clean ? refreshablePinCharges(pinBefore, current.escrowPin, ownWrongAttempts) : void 0
|
|
31421
31443
|
};
|
|
31422
31444
|
})
|
|
31423
31445
|
);
|
|
31424
31446
|
let pinRefreshed = false;
|
|
31425
31447
|
let pinRefreshFailed = false;
|
|
31448
|
+
let newPinRequired = newPinRequiredAtRelease;
|
|
31426
31449
|
if (mode === "kept" && !newPinRequired && refreshCharges && params.signDidAuthVp) {
|
|
31427
31450
|
const pinMaterial = await freshPinMaterial(pin);
|
|
31428
|
-
|
|
31451
|
+
const refresh = pinMaterial === void 0 ? void 0 : await attemptEnrollEscrow(
|
|
31429
31452
|
params.token,
|
|
31430
31453
|
params.providerType,
|
|
31431
31454
|
released.privateKey,
|
|
@@ -31441,7 +31464,18 @@ function createSSSStrategy(config) {
|
|
|
31441
31464
|
params.options?.recoveryLanguage,
|
|
31442
31465
|
refreshCharges
|
|
31443
31466
|
);
|
|
31467
|
+
pinRefreshed = refresh?.enrolled === true;
|
|
31444
31468
|
pinRefreshFailed = pinMaterial !== void 0 && !pinRefreshed;
|
|
31469
|
+
if (pinRefreshFailed) {
|
|
31470
|
+
const latest = await fetchAuthShareRaw(
|
|
31471
|
+
serverUrl,
|
|
31472
|
+
params.token,
|
|
31473
|
+
params.providerType,
|
|
31474
|
+
void 0,
|
|
31475
|
+
tenantId
|
|
31476
|
+
).catch(() => void 0);
|
|
31477
|
+
newPinRequired = latest ? !pinSignInClean([pinBefore, latest.escrowPin], pinAttempts).clean : isConflictRefusal(refresh && !refresh.enrolled ? refresh.error : void 0);
|
|
31478
|
+
}
|
|
31445
31479
|
}
|
|
31446
31480
|
assertActive();
|
|
31447
31481
|
return {
|
|
@@ -31529,7 +31563,7 @@ function createSSSStrategy(config) {
|
|
|
31529
31563
|
pinSignIn: {
|
|
31530
31564
|
mode: "relinked",
|
|
31531
31565
|
pinRefreshed: false,
|
|
31532
|
-
newPinRequired:
|
|
31566
|
+
newPinRequired: !pinSignInClean([status?.escrowPin], pending.pinKeep?.pinAttempts).clean
|
|
31533
31567
|
}
|
|
31534
31568
|
};
|
|
31535
31569
|
}, "completePinSignInRelink");
|
|
@@ -32449,7 +32483,8 @@ function createSSSStrategy(config) {
|
|
|
32449
32483
|
shareVersion: material.shareVersion
|
|
32450
32484
|
},
|
|
32451
32485
|
input.pin,
|
|
32452
|
-
pinBefore
|
|
32486
|
+
pinBefore,
|
|
32487
|
+
input.pinAttempts
|
|
32453
32488
|
);
|
|
32454
32489
|
}
|
|
32455
32490
|
pendingIdentityRecovery = {
|
|
@@ -32460,7 +32495,12 @@ function createSSSStrategy(config) {
|
|
|
32460
32495
|
rebindSessionToken: material.rebindSessionToken,
|
|
32461
32496
|
fromEscrow: true,
|
|
32462
32497
|
// The PIN itself is not kept across the new-login step.
|
|
32463
|
-
...input.method === "escrow-pin" ? {
|
|
32498
|
+
...input.method === "escrow-pin" ? {
|
|
32499
|
+
pinKeep: {
|
|
32500
|
+
shareVersion: material.shareVersion,
|
|
32501
|
+
...input.pinAttempts ? { pinAttempts: { ...input.pinAttempts } } : {}
|
|
32502
|
+
}
|
|
32503
|
+
} : {}
|
|
32464
32504
|
};
|
|
32465
32505
|
if (!token) return { privateKey: privateKey2, did: material.primaryDid };
|
|
32466
32506
|
return completeIdentityRecoveryWith({
|