@learncard/sss-key-manager 0.2.2 → 0.2.4
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 +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/sss-key-manager.cjs.development.js +8231 -2064
- package/dist/sss-key-manager.cjs.development.js.map +3 -3
- package/dist/sss-key-manager.cjs.production.min.js +46 -49
- package/dist/sss-key-manager.cjs.production.min.js.map +3 -3
- package/dist/sss-key-manager.esm.js +8232 -2065
- package/dist/sss-key-manager.esm.js.map +3 -3
- package/dist/sss-strategy.d.ts +33 -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 +7 -1
- package/src/sss-authority.test.ts +378 -2
- package/src/sss-strategy.test.ts +73 -2
- package/src/sss-strategy.ts +219 -26
- package/src/types.ts +5 -0
package/dist/sss-strategy.d.ts
CHANGED
|
@@ -14,6 +14,15 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import type { SSSKeyDerivationStrategy, EscrowAttestationPolicy } from './types';
|
|
16
16
|
import type { EmailRelayBranding } from './email-relay-crypto';
|
|
17
|
+
/**
|
|
18
|
+
* OFF by default. Every input to the uncarryable-PIN inference (recovery methods,
|
|
19
|
+
* share version, PIN state) comes from lca-api, so a compromised API could forge it
|
|
20
|
+
* for a healthy PIN account and have the client sign away the PIN path (Custard7's
|
|
21
|
+
* PR #1815 review). With it off the strategy returns `pin-reset-required` and the
|
|
22
|
+
* app asks the user to set a new PIN. Enabling it needs an independently trustworthy
|
|
23
|
+
* recovery signal and security sign-off: POST_RECOVERY_ESCROW_REPAIR_DESIGN.md, Q1.
|
|
24
|
+
*/
|
|
25
|
+
export declare const DEFAULT_AUTO_CLEAR_UNCARRYABLE_PIN = false;
|
|
17
26
|
export interface SSSStorageFunctions {
|
|
18
27
|
storeDeviceShare: (share: string, id?: string) => Promise<void>;
|
|
19
28
|
getDeviceShare: (id?: string) => Promise<string | null>;
|
|
@@ -31,6 +40,20 @@ export interface SSSStrategyConfig {
|
|
|
31
40
|
};
|
|
32
41
|
/** Report enrollment failures without logging recovery material. */
|
|
33
42
|
onEscrowError?: (err: unknown) => void;
|
|
43
|
+
/**
|
|
44
|
+
* Nitro repair only: when the signed authority still has a PIN but lca-api holds
|
|
45
|
+
* no PIN to carry (an identity-recovery rebind deleted it), sign a PIN `clear`
|
|
46
|
+
* instead of a `carry` that lca-api would reject with PRECONDITION_FAILED.
|
|
47
|
+
* Defaults to {@link DEFAULT_AUTO_CLEAR_UNCARRYABLE_PIN} (off). Do not enable
|
|
48
|
+
* without security sign-off: POST_RECOVERY_ESCROW_REPAIR_DESIGN.md, open question Q1.
|
|
49
|
+
*/
|
|
50
|
+
autoClearUncarryablePin?: boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Called once after every committed automatic PIN clear
|
|
53
|
+
* ({@link SSSStrategyConfig.autoClearUncarryablePin}). Must not throw; defaults
|
|
54
|
+
* to a console warning. Never receives the DID, email or PIN material.
|
|
55
|
+
*/
|
|
56
|
+
onEscrowPinAutoCleared?: (event: EscrowPinAutoClearedEvent) => void;
|
|
34
57
|
/** Server URL for key share operations */
|
|
35
58
|
serverUrl: string;
|
|
36
59
|
/** Custom storage functions (defaults to IndexedDB) */
|
|
@@ -56,10 +79,19 @@ export interface SSSStrategyConfig {
|
|
|
56
79
|
tenantId?: string;
|
|
57
80
|
}
|
|
58
81
|
export declare const SERVER_REQUEST_TIMEOUT_MS = 30000;
|
|
82
|
+
/** Telemetry for an automatic post-rebind PIN clear. Carries no DID, email or PIN data. */
|
|
83
|
+
export interface EscrowPinAutoClearedEvent {
|
|
84
|
+
type: 'escrow.pin.auto_cleared';
|
|
85
|
+
/** Share version the PIN-free enrollment was committed at. */
|
|
86
|
+
shareVersion: number;
|
|
87
|
+
/** Share version the signed authority was still active at (pre-rebind). */
|
|
88
|
+
authorityShareVersion: number | null;
|
|
89
|
+
}
|
|
59
90
|
/** HTTP failure metadata without potentially sensitive server response text. */
|
|
60
91
|
export declare class EscrowRequestError extends Error {
|
|
61
92
|
readonly status: number;
|
|
62
|
-
|
|
93
|
+
readonly reason?: "codeMismatch" | "codeExpired" | "codeLocked" | undefined;
|
|
94
|
+
constructor(status: number, reason?: "codeMismatch" | "codeExpired" | "codeLocked" | undefined);
|
|
63
95
|
}
|
|
64
96
|
/**
|
|
65
97
|
* Signals that an identity-recovery attempt failed after the one-shot server
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sss-strategy.d.ts","sourceRoot":"","sources":["../src/sss-strategy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EACR,wBAAwB,EAaxB,uBAAuB,EAI1B,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"sss-strategy.d.ts","sourceRoot":"","sources":["../src/sss-strategy.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -63,6 +63,11 @@ export interface EscrowHoldStatus {
|
|
|
63
63
|
}
|
|
64
64
|
/** Persist these secrets securely until completion; a null token means an existing hold. */
|
|
65
65
|
export type EscrowRecoveryStart = EscrowHoldStatus & {
|
|
66
|
+
codeSent?: boolean;
|
|
67
|
+
delivery?: {
|
|
68
|
+
codeSent: boolean;
|
|
69
|
+
proof: import('./escrow-authority.types').EscrowAuthorityRecord;
|
|
70
|
+
};
|
|
66
71
|
/** Persist with the secrets, never rebuild from server status. Required for Nitro resume. */
|
|
67
72
|
expectations?: import('@learncard/types').EscrowRecoveryExpectations;
|
|
68
73
|
resumeToken: string | null;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@learncard/sss-key-manager",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.4",
|
|
4
4
|
"description": "Shamir Secret Sharing key manager for LearnCard - replaces Web3Auth SFA",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/sss-key-manager.esm.js",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"vitest": "4.1.11"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@learncard/types": "5.
|
|
42
|
+
"@learncard/types": "5.24.0",
|
|
43
43
|
"@noble/ed25519": "^2.0.0",
|
|
44
44
|
"@peculiar/x509": "^2.1.0",
|
|
45
45
|
"@scure/bip39": "^1.2.1",
|
|
@@ -6,6 +6,8 @@ import {
|
|
|
6
6
|
verifyEscrowAuthorityState,
|
|
7
7
|
verifyEscrowEnrollmentCommit,
|
|
8
8
|
verifyEscrowHoldRecord,
|
|
9
|
+
verifyEscrowCodeDelivery,
|
|
10
|
+
verifyEscrowHoldState,
|
|
9
11
|
verifyEscrowHoldConfirmation,
|
|
10
12
|
createEscrowEnrollmentIntent,
|
|
11
13
|
resolveEscrowEnrollmentAction,
|
|
@@ -436,6 +438,118 @@ describe('verifyEscrowHoldRecord / verifyEscrowHoldConfirmation (client-boundary
|
|
|
436
438
|
ledgerSeq: 0,
|
|
437
439
|
});
|
|
438
440
|
|
|
441
|
+
it('authenticates delivery failure and rejects transplanted or altered delivery evidence', async () => {
|
|
442
|
+
const { sign, identity } = await makeSigner();
|
|
443
|
+
const expected = {
|
|
444
|
+
tenant: 'learncard',
|
|
445
|
+
authorityGeneration: 'g1',
|
|
446
|
+
holdDigest: 'ab'.repeat(32),
|
|
447
|
+
};
|
|
448
|
+
const proof = await sign('snapshot', [
|
|
449
|
+
'learncard-authority-code-delivery-v1',
|
|
450
|
+
expected.tenant,
|
|
451
|
+
expected.authorityGeneration,
|
|
452
|
+
expected.holdDigest,
|
|
453
|
+
false,
|
|
454
|
+
]);
|
|
455
|
+
await expect(
|
|
456
|
+
verifyEscrowCodeDelivery({ codeSent: false, proof }, expected, identity)
|
|
457
|
+
).resolves.toBe(false);
|
|
458
|
+
await expect(
|
|
459
|
+
verifyEscrowCodeDelivery({ codeSent: true, proof }, expected, identity)
|
|
460
|
+
).rejects.toThrow();
|
|
461
|
+
for (const changed of [
|
|
462
|
+
{ tenant: 'other' },
|
|
463
|
+
{ authorityGeneration: 'g2' },
|
|
464
|
+
{ holdDigest: '00'.repeat(32) },
|
|
465
|
+
]) {
|
|
466
|
+
await expect(
|
|
467
|
+
verifyEscrowCodeDelivery(
|
|
468
|
+
{ codeSent: false, proof },
|
|
469
|
+
{ ...expected, ...changed },
|
|
470
|
+
identity
|
|
471
|
+
)
|
|
472
|
+
).rejects.toThrow();
|
|
473
|
+
}
|
|
474
|
+
});
|
|
475
|
+
|
|
476
|
+
it('verifies nonce-bound hold reads and rejects replay, scope substitution and malformed state', async () => {
|
|
477
|
+
const { sign, identity } = await makeSigner();
|
|
478
|
+
const nonce = 'ab'.repeat(32);
|
|
479
|
+
const expected = {
|
|
480
|
+
tenant: 'learncard',
|
|
481
|
+
authorityGeneration: 'g1',
|
|
482
|
+
did,
|
|
483
|
+
holdId: 'hold-1',
|
|
484
|
+
holdDigest: 'cd'.repeat(32),
|
|
485
|
+
};
|
|
486
|
+
const payload = [
|
|
487
|
+
'learncard-authority-hold-state-v3',
|
|
488
|
+
nonce,
|
|
489
|
+
expected.tenant,
|
|
490
|
+
expected.authorityGeneration,
|
|
491
|
+
did,
|
|
492
|
+
expected.holdId,
|
|
493
|
+
expected.holdDigest,
|
|
494
|
+
'pending',
|
|
495
|
+
1000,
|
|
496
|
+
2000,
|
|
497
|
+
4,
|
|
498
|
+
'unknown',
|
|
499
|
+
];
|
|
500
|
+
const response = { proof: await sign('snapshot', payload) };
|
|
501
|
+
await expect(verifyEscrowHoldState(response, nonce, expected, identity)).resolves.toEqual({
|
|
502
|
+
status: 'pending',
|
|
503
|
+
confirmedHiMs: 1000,
|
|
504
|
+
releaseWarningSentHiMs: 2000,
|
|
505
|
+
attemptsRemaining: 4,
|
|
506
|
+
codeSendStatus: 'unknown',
|
|
507
|
+
});
|
|
508
|
+
await expect(
|
|
509
|
+
verifyEscrowHoldState(response, 'ff'.repeat(32), expected, identity)
|
|
510
|
+
).rejects.toThrow();
|
|
511
|
+
for (const changed of [
|
|
512
|
+
{ tenant: 'other' },
|
|
513
|
+
{ authorityGeneration: 'g2' },
|
|
514
|
+
{ did: 'other' },
|
|
515
|
+
{ holdId: 'other' },
|
|
516
|
+
{ holdDigest: '00'.repeat(32) },
|
|
517
|
+
]) {
|
|
518
|
+
await expect(
|
|
519
|
+
verifyEscrowHoldState(response, nonce, { ...expected, ...changed }, identity)
|
|
520
|
+
).rejects.toThrow();
|
|
521
|
+
}
|
|
522
|
+
for (const [index, value] of [
|
|
523
|
+
[7, 'invalid'],
|
|
524
|
+
[8, -1],
|
|
525
|
+
[10, 6],
|
|
526
|
+
[11, 'sent'],
|
|
527
|
+
] as const) {
|
|
528
|
+
const malformed = [...payload];
|
|
529
|
+
malformed[index] = value;
|
|
530
|
+
await expect(
|
|
531
|
+
verifyEscrowHoldState(
|
|
532
|
+
{ proof: await sign('snapshot', malformed) },
|
|
533
|
+
nonce,
|
|
534
|
+
expected,
|
|
535
|
+
identity
|
|
536
|
+
)
|
|
537
|
+
).rejects.toThrow();
|
|
538
|
+
}
|
|
539
|
+
await expect(
|
|
540
|
+
verifyEscrowHoldState(
|
|
541
|
+
{ proof: await sign('commit', payload) },
|
|
542
|
+
nonce,
|
|
543
|
+
expected,
|
|
544
|
+
identity
|
|
545
|
+
)
|
|
546
|
+
).rejects.toThrow();
|
|
547
|
+
const other = await makeSigner();
|
|
548
|
+
await expect(
|
|
549
|
+
verifyEscrowHoldState(response, nonce, expected, other.identity)
|
|
550
|
+
).rejects.toThrow();
|
|
551
|
+
});
|
|
552
|
+
|
|
439
553
|
const signedHoldRecord = async (
|
|
440
554
|
sign: Awaited<ReturnType<typeof makeSigner>>['sign'],
|
|
441
555
|
record: EscrowHoldRecordLike
|
package/src/escrow-authority.ts
CHANGED
|
@@ -23,6 +23,80 @@ import type {
|
|
|
23
23
|
const fail = (): never => {
|
|
24
24
|
throw new EscrowEvidenceError();
|
|
25
25
|
};
|
|
26
|
+
|
|
27
|
+
/** Verify a fresh hold-state response using an independently retained hold binding
|
|
28
|
+
* and a newly generated 32-byte nonce. Never reuse the nonce for another read. */
|
|
29
|
+
export const verifyEscrowHoldState = async (
|
|
30
|
+
response: { proof: unknown },
|
|
31
|
+
nonce: string,
|
|
32
|
+
expected: {
|
|
33
|
+
tenant: string;
|
|
34
|
+
authorityGeneration: string;
|
|
35
|
+
did: string;
|
|
36
|
+
holdId: string;
|
|
37
|
+
holdDigest: string;
|
|
38
|
+
},
|
|
39
|
+
identity: VerifiedEnclaveIdentity
|
|
40
|
+
): Promise<{
|
|
41
|
+
status: 'awaitingConfirmation' | 'pending' | 'released' | 'cancelled';
|
|
42
|
+
confirmedHiMs: number | null;
|
|
43
|
+
releaseWarningSentHiMs: number | null;
|
|
44
|
+
attemptsRemaining: number;
|
|
45
|
+
codeSendStatus: 'unknown' | 'notRequired';
|
|
46
|
+
}> => {
|
|
47
|
+
requireEvidence(/^[0-9a-f]{64}$/.test(nonce));
|
|
48
|
+
const { payload } = await verifyRecord(response.proof, 'snapshot', identity);
|
|
49
|
+
requireEvidence(Array.isArray(payload) && payload.length === 12);
|
|
50
|
+
const p = payload as unknown[];
|
|
51
|
+
requireEvidence(
|
|
52
|
+
p[0] === 'learncard-authority-hold-state-v3' &&
|
|
53
|
+
p[1] === nonce &&
|
|
54
|
+
p[2] === expected.tenant &&
|
|
55
|
+
p[3] === expected.authorityGeneration &&
|
|
56
|
+
p[4] === expected.did &&
|
|
57
|
+
p[5] === expected.holdId &&
|
|
58
|
+
p[6] === expected.holdDigest
|
|
59
|
+
);
|
|
60
|
+
const status = p[7];
|
|
61
|
+
if (
|
|
62
|
+
status !== 'awaitingConfirmation' &&
|
|
63
|
+
status !== 'pending' &&
|
|
64
|
+
status !== 'released' &&
|
|
65
|
+
status !== 'cancelled'
|
|
66
|
+
)
|
|
67
|
+
return fail();
|
|
68
|
+
const confirmedHiMs = p[8] === null ? null : integer(p[8]);
|
|
69
|
+
const releaseWarningSentHiMs = p[9] === null ? null : integer(p[9]);
|
|
70
|
+
const attemptsRemaining = integer(p[10], 0, 5);
|
|
71
|
+
const codeSendStatus = p[11];
|
|
72
|
+
if (codeSendStatus !== 'unknown' && codeSendStatus !== 'notRequired') return fail();
|
|
73
|
+
requireEvidence(
|
|
74
|
+
status !== 'awaitingConfirmation' ||
|
|
75
|
+
(confirmedHiMs === null && releaseWarningSentHiMs === null)
|
|
76
|
+
);
|
|
77
|
+
requireEvidence((status !== 'pending' && status !== 'released') || confirmedHiMs !== null);
|
|
78
|
+
return { status, confirmedHiMs, releaseWarningSentHiMs, attemptsRemaining, codeSendStatus };
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
/** Authenticate advisory send acceptance without changing the immutable hold commitment. */
|
|
82
|
+
export const verifyEscrowCodeDelivery = async (
|
|
83
|
+
delivery: { codeSent: boolean; proof: unknown },
|
|
84
|
+
expected: { tenant: string; authorityGeneration: string; holdDigest: string },
|
|
85
|
+
identity: VerifiedEnclaveIdentity
|
|
86
|
+
): Promise<boolean> => {
|
|
87
|
+
const { payload } = await verifyRecord(delivery.proof, 'snapshot', identity);
|
|
88
|
+
requireEvidence(Array.isArray(payload) && payload.length === 5);
|
|
89
|
+
const values = payload as unknown[];
|
|
90
|
+
requireEvidence(
|
|
91
|
+
values[0] === 'learncard-authority-code-delivery-v1' &&
|
|
92
|
+
values[1] === expected.tenant &&
|
|
93
|
+
values[2] === expected.authorityGeneration &&
|
|
94
|
+
values[3] === expected.holdDigest &&
|
|
95
|
+
typeof values[4] === 'boolean' &&
|
|
96
|
+
values[4] === delivery.codeSent
|
|
97
|
+
);
|
|
98
|
+
return delivery.codeSent;
|
|
99
|
+
};
|
|
26
100
|
const requireEvidence = (condition: boolean): void => {
|
|
27
101
|
if (!condition) fail();
|
|
28
102
|
};
|
package/src/index.ts
CHANGED
|
@@ -92,6 +92,8 @@ export type { HistoricalEscrowEvidence } from './escrow-authority.types';
|
|
|
92
92
|
export type { EscrowRecoveryExpectations } from '@learncard/types';
|
|
93
93
|
export {
|
|
94
94
|
verifyEscrowAuthorityState,
|
|
95
|
+
verifyEscrowHoldState,
|
|
96
|
+
verifyEscrowCodeDelivery,
|
|
95
97
|
verifyEscrowEnrollmentCommit,
|
|
96
98
|
createEscrowEnrollmentIntent,
|
|
97
99
|
resolveEscrowEnrollmentAction,
|
|
@@ -175,7 +177,11 @@ export {
|
|
|
175
177
|
EscrowRequestError,
|
|
176
178
|
} from './sss-strategy';
|
|
177
179
|
|
|
178
|
-
export type {
|
|
180
|
+
export type {
|
|
181
|
+
EscrowPinAutoClearedEvent,
|
|
182
|
+
SSSStorageFunctions,
|
|
183
|
+
SSSStrategyConfig,
|
|
184
|
+
} from './sss-strategy';
|
|
179
185
|
|
|
180
186
|
export {
|
|
181
187
|
generateEphemeralKeypair,
|