@learncard/lca-api-service 1.3.2 → 1.4.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/.env.example +26 -2
- package/AGENTS.md +59 -44
- package/CHANGELOG.md +41 -0
- package/compose.env +5 -0
- package/dist/accesslayer/signing-authority/index.d.ts +8 -2
- package/dist/app.d.ts +297 -8
- package/dist/cache/challenges.d.ts +2 -0
- package/dist/cache/recoverySessions.d.ts +42 -0
- package/dist/config/environment.d.ts +152 -2
- package/dist/config/environment.test.d.ts +1 -0
- package/dist/helpers/learnCard.signingAuthority.test.d.ts +1 -0
- package/dist/helpers/rateLimit.helpers.d.ts +4 -0
- package/dist/helpers/seedEncryption.helpers.d.ts +23 -0
- package/dist/helpers/seedEncryption.helpers.test.d.ts +1 -0
- package/dist/index.js +2 -2
- package/dist/migrations/signingAuthoritySeeds.d.ts +13 -0
- package/dist/migrations/signingAuthoritySeedsCli.test.d.ts +1 -0
- package/dist/models/EscrowHold.d.ts +75 -0
- package/dist/models/SigningAuthority.d.ts +7 -1
- package/dist/models/UserKey.d.ts +316 -3
- package/dist/models/UserKey.escrowPin.test.d.ts +1 -0
- package/dist/models/index.d.ts +1 -0
- package/dist/routes/escrow.d.ts +150 -0
- package/dist/routes/index.d.ts +6 -0
- package/dist/routes/keys.d.ts +181 -7
- package/dist/routes/qr-login.d.ts +1 -1
- package/dist/services/escrow-enclave/index.d.ts +9 -0
- package/dist/services/escrow-enclave/notifications.d.ts +9 -0
- package/dist/services/escrow-enclave/softwareEnclave.d.ts +17 -0
- package/dist/services/escrow-enclave/softwareEnclave.test.d.ts +1 -0
- package/dist/services/escrow-enclave/types.d.ts +67 -0
- package/dist/types/seed-encryption.d.ts +31 -0
- package/dist/types/seed-migration.d.ts +49 -0
- package/lambda.ts +8 -3
- package/package.json +17 -11
- package/scripts/check-seed-encryption-infrastructure.mjs +123 -0
- package/scripts/check-signing-authority-redis.mjs +93 -0
- package/scripts/migrate-signing-authority-seeds-local.sh +51 -0
- package/scripts/migrate-signing-authority-seeds.mjs +105 -0
- package/seedMigrationLambda.test.ts +145 -0
- package/seedMigrationLambda.ts +50 -0
- package/serverless-local.yml +3 -0
- package/serverless.escrow-env.cjs +20 -0
- package/serverless.yml +133 -0
- package/src/accesslayer/signing-authority/create.ts +11 -7
- package/src/app.ts +2 -0
- package/src/cache/challenges.ts +12 -2
- package/src/cache/in-memory-lru.ts +1 -0
- package/src/cache/recoverySessions.ts +252 -0
- package/src/config/environment.test.ts +116 -0
- package/src/config/environment.ts +97 -0
- package/src/docker-entry.ts +4 -0
- package/src/helpers/learnCard.helpers.test.ts +11 -1
- package/src/helpers/learnCard.helpers.ts +57 -45
- package/src/helpers/learnCard.signingAuthority.test.ts +194 -0
- package/src/helpers/rateLimit.helpers.ts +112 -0
- package/src/helpers/seedEncryption.helpers.test.ts +427 -0
- package/src/helpers/seedEncryption.helpers.ts +372 -0
- package/src/helpers/signingAuthority.helpers.ts +4 -1
- package/src/migrations/signingAuthoritySeeds.ts +430 -0
- package/src/migrations/signingAuthoritySeedsCli.test.ts +70 -0
- package/src/models/EscrowHold.ts +225 -0
- package/src/models/SigningAuthority.ts +14 -3
- package/src/models/UserKey.escrowPin.test.ts +49 -0
- package/src/models/UserKey.ts +1024 -40
- package/src/models/index.ts +1 -0
- package/src/models/pruneOrphanedRecoveryMethods.ts +3 -1
- package/src/routes/credentials.ts +8 -0
- package/src/routes/escrow.ts +826 -0
- package/src/routes/firebase.ts +90 -48
- package/src/routes/index.ts +98 -5
- package/src/routes/keys.ts +1017 -174
- package/src/routes/qr-login.ts +51 -53
- package/src/services/delivery/adapters/postmark.adapter.ts +5 -0
- package/src/services/escrow-enclave/README.md +51 -0
- package/src/services/escrow-enclave/index.ts +36 -0
- package/src/services/escrow-enclave/notifications.ts +14 -0
- package/src/services/escrow-enclave/softwareEnclave.test.ts +249 -0
- package/src/services/escrow-enclave/softwareEnclave.ts +168 -0
- package/src/services/escrow-enclave/types.ts +76 -0
- package/src/types/seed-encryption.ts +51 -0
- package/src/types/seed-migration.ts +61 -0
- package/test/credentials.spec.ts +2 -0
- package/test/keys-escrow.spec.ts +1389 -0
- package/test/keys-identity-rebind.spec.ts +456 -0
- package/test/keys-lifecycle-invariants.spec.ts +785 -0
- package/test/keys-recovery-confirmation.spec.ts +586 -0
- package/test/keys-recovery-rate-limit.spec.ts +123 -0
- package/test/keys-secret-leakage.spec.ts +265 -0
- package/test/models/escrow.spec.ts +210 -0
- package/test/signing-authority-http.spec.ts +161 -0
- package/test/signing-authority-seed-migration.spec.ts +414 -0
- package/test/signing-authority.spec.ts +40 -0
- package/vitest.config.ts +1 -1
- package/vitest.integration.config.ts +5 -0
- package/dist/cache/signing-authority.d.ts +0 -6
- package/src/cache/signing-authority.ts +0 -37
package/src/models/index.ts
CHANGED
|
@@ -15,11 +15,13 @@ interface RecoveryMethodLike {
|
|
|
15
15
|
* - Methods whose shareVersion matches `currentShareVersion` are kept.
|
|
16
16
|
* - Methods whose shareVersion matches any entry in `previousVersions` are kept.
|
|
17
17
|
* - Everything else is pruned — the auth share it depends on has been evicted.
|
|
18
|
+
* This pure helper cannot update blobs. Both persistence callers in UserKey.ts
|
|
19
|
+
* unset escrowBlob in the same write whenever no escrow method survives.
|
|
18
20
|
*/
|
|
19
21
|
export const pruneOrphanedRecoveryMethods = <T extends RecoveryMethodLike>(
|
|
20
22
|
recoveryMethods: T[],
|
|
21
23
|
currentShareVersion: number,
|
|
22
|
-
previousVersions: number[]
|
|
24
|
+
previousVersions: number[]
|
|
23
25
|
): T[] => {
|
|
24
26
|
const validVersions = new Set([currentShareVersion, ...previousVersions]);
|
|
25
27
|
|
|
@@ -8,6 +8,7 @@ import { getDeliveryService, getFrom } from '../services/delivery';
|
|
|
8
8
|
import { IssueEndpointValidator } from 'types/credentials';
|
|
9
9
|
import { t, authorizedDidRoute, openRoute } from '@routes';
|
|
10
10
|
import { getSigningAuthorityLearnCard } from '@helpers/learnCard.helpers';
|
|
11
|
+
import { SeedEncryptionError } from '@helpers/seedEncryption.helpers';
|
|
11
12
|
import {
|
|
12
13
|
encryptCredentialForRecipients,
|
|
13
14
|
resolveRecipientEncrypters,
|
|
@@ -142,6 +143,13 @@ export const credentialsRouter = t.router({
|
|
|
142
143
|
return issuedCredential;
|
|
143
144
|
} catch (error) {
|
|
144
145
|
if (error instanceof TRPCError) throw error;
|
|
146
|
+
if (error instanceof SeedEncryptionError) {
|
|
147
|
+
// The helper has already logged sanitized metadata. Do not expose KMS details.
|
|
148
|
+
throw new TRPCError({
|
|
149
|
+
code: 'INTERNAL_SERVER_ERROR',
|
|
150
|
+
message: 'Signing authority key is unavailable. Please try again.',
|
|
151
|
+
});
|
|
152
|
+
}
|
|
145
153
|
const errMsg = error instanceof Error ? error.message : String(error);
|
|
146
154
|
const errStack = error instanceof Error ? error.stack : undefined;
|
|
147
155
|
console.error('[LCA /credentials/issue] Failed:', {
|