@learncard/sss-key-manager 0.2.0 → 0.2.1

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.
Files changed (41) hide show
  1. package/README.md +13 -0
  2. package/dist/escrow-attestation.d.ts +5 -1
  3. package/dist/escrow-attestation.d.ts.map +1 -1
  4. package/dist/escrow-nitro-attestation.d.ts +32 -0
  5. package/dist/escrow-nitro-attestation.d.ts.map +1 -0
  6. package/dist/index.d.ts +3 -1
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/sss-key-manager.cjs.development.js +2995 -320
  9. package/dist/sss-key-manager.cjs.development.js.map +4 -4
  10. package/dist/sss-key-manager.cjs.production.min.js +33 -33
  11. package/dist/sss-key-manager.cjs.production.min.js.map +4 -4
  12. package/dist/sss-key-manager.esm.js +774 -170
  13. package/dist/sss-key-manager.esm.js.map +4 -4
  14. package/dist/sss-strategy.d.ts.map +1 -1
  15. package/dist/types.d.ts +15 -4
  16. package/dist/types.d.ts.map +1 -1
  17. package/package.json +7 -3
  18. package/src/__fixtures__/escrow-vectors-rust.json +82 -0
  19. package/src/__fixtures__/escrow-vectors.json +103 -0
  20. package/src/__fixtures__/nitro-attestation/bad-signature.cbor.b64 +1 -0
  21. package/src/__fixtures__/nitro-attestation/debug-zero-pcrs.cbor.b64 +1 -0
  22. package/src/__fixtures__/nitro-attestation/legacy-user-data.cbor.b64 +1 -0
  23. package/src/__fixtures__/nitro-attestation/manifest.json +60 -0
  24. package/src/__fixtures__/nitro-attestation/nonce-mismatch.cbor.b64 +1 -0
  25. package/src/__fixtures__/nitro-attestation/root.pem +12 -0
  26. package/src/__fixtures__/nitro-attestation/stale-timestamp.cbor.b64 +1 -0
  27. package/src/__fixtures__/nitro-attestation/tampered-previous-key-ids.cbor.b64 +1 -0
  28. package/src/__fixtures__/nitro-attestation/truncated-chain.cbor.b64 +1 -0
  29. package/src/__fixtures__/nitro-attestation/valid.cbor.b64 +1 -0
  30. package/src/__fixtures__/nitro-attestation/wrong-pcr0.cbor.b64 +1 -0
  31. package/src/__fixtures__/nitro-attestation/wrong-root.cbor.b64 +1 -0
  32. package/src/escrow-attestation.test.ts +7 -2
  33. package/src/escrow-attestation.ts +71 -10
  34. package/src/escrow-nitro-attestation.test.ts +204 -0
  35. package/src/escrow-nitro-attestation.ts +286 -0
  36. package/src/escrow-vectors.test.ts +198 -0
  37. package/src/index.ts +8 -1
  38. package/src/sss-session-writes.test.ts +2 -2
  39. package/src/sss-strategy.test.ts +95 -2
  40. package/src/sss-strategy.ts +128 -88
  41. package/src/types.ts +12 -1
package/README.md CHANGED
@@ -63,6 +63,19 @@ protected write.
63
63
 
64
64
  ## Security Model
65
65
 
66
+ ### Nitro attestation trust policy
67
+
68
+ Nitro enrollment verifies a nonce-bound COSE ES384 document, the certificate chain against a
69
+ pinned root DER SHA-256 (AWS Nitro Root G1 by default), and one complete PCR0/1/2 tuple.
70
+ Configure `pinnedMeasurements: [{ pcr0, pcr1, pcr2, imageSha384? }]` with 48-byte hex PCRs.
71
+ Legacy `{ imageSha384 }` entries remain type-compatible but **never match**; they cannot authorize
72
+ enrollment. `rootCertificateSha256` is an explicit trust-anchor override (test roots must never be
73
+ used in production). `maxAgeMs` defaults to 300000; future timestamps allow at most 60 seconds skew.
74
+ The escrow P-256 SPKI comes only from signed `user_data`, not the NSM `public_key` used for KMS.
75
+ `verifyEnclaveAttestation(attestation, policy, nonce)` requires the expected 32-byte nonce in Nitro
76
+ mode. The strategy sends a fresh hex nonce on each attestation GET; software mode ignores the nonce
77
+ and continues to require a pinned public key.
78
+
66
79
  - **Device Share**: Encrypted with non-extractable AES-GCM key stored in IndexedDB
67
80
  - **Auth Share**: Server-side envelope encryption (DEK + KMS-encrypted DEK)
68
81
  - **Recovery Share**: Password-based uses Argon2id KDF with secure parameters
@@ -1,8 +1,12 @@
1
1
  import type { EscrowAttestationPolicy } from './types';
2
2
  /** Parse untrusted attestation data and enforce an explicit enclave trust policy. */
3
- export declare const verifyEnclaveAttestation: (attestation: unknown, policy: EscrowAttestationPolicy) => Promise<{
3
+ export declare const verifyEnclaveAttestation: (attestation: unknown, policy: EscrowAttestationPolicy, nonce?: Uint8Array) => Promise<{
4
4
  publicKey: string;
5
5
  keyId: string;
6
+ /** P9.1: retired keyIds still accepted for decrypt. In nitro mode this is
7
+ * the value bound inside the signed attestation document, cross-checked
8
+ * against the plaintext field below — never the plaintext alone. */
9
+ previousKeyIds: string[];
6
10
  mode: "software" | "nitro";
7
11
  }>;
8
12
  //# sourceMappingURL=escrow-attestation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"escrow-attestation.d.ts","sourceRoot":"","sources":["../src/escrow-attestation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAiBvD,qFAAqF;AACrF,eAAO,MAAM,wBAAwB,GACjC,aAAa,OAAO,EACpB,QAAQ,uBAAuB,KAChC,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAA;CAAE,CAyC1E,CAAC"}
1
+ {"version":3,"file":"escrow-attestation.d.ts","sourceRoot":"","sources":["../src/escrow-attestation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAkBvD,qFAAqF;AACrF,eAAO,MAAM,wBAAwB,GACjC,aAAa,OAAO,EACpB,QAAQ,uBAAuB,EAC/B,QAAQ,UAAU,KACnB,OAAO,CAAC;IACP,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd;;wEAEoE;IACpE,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;CAC9B,CA4FA,CAAC"}
@@ -0,0 +1,32 @@
1
+ import 'reflect-metadata';
2
+ import type { EscrowAttestationPolicy } from './types';
3
+ export type NitroAttestationReason = 'cbor' | 'cose' | 'alg' | 'chain' | 'root' | 'signature' | 'pcr' | 'debug' | 'nonce' | 'freshness' | 'user-data';
4
+ /** A fail-closed attestation failure with a stable, non-sensitive reason. */
5
+ export declare class NitroAttestationError extends Error {
6
+ readonly reason: NitroAttestationReason;
7
+ constructor(reason: NitroAttestationReason);
8
+ }
9
+ type NitroPolicy = Extract<EscrowAttestationPolicy, {
10
+ mode: 'nitro';
11
+ }>;
12
+ /** Verify signed NSM evidence before trusting its P-256 escrow key (not public_key/KMS key). */
13
+ export declare const verifyNitroAttestationDocument: (documentB64: string, { expectedNonce, policy, now, }: {
14
+ expectedNonce: Uint8Array;
15
+ policy: NitroPolicy;
16
+ now?: number;
17
+ }) => Promise<{
18
+ escrowPublicKeySpkiB64: string;
19
+ /** P9.1: the enclave's own current keyId, bound inside this same signed
20
+ * document. `undefined` for the legacy user_data format, which never
21
+ * carried a keyId — callers must not silently trust a plaintext keyId in
22
+ * that case any more than they did before this field existed. */
23
+ keyId: string | undefined;
24
+ /** P9.1: retired keyIds the enclave still accepts for decrypt only, bound
25
+ * inside this same signed document. Empty for the legacy user_data format. */
26
+ previousKeyIds: string[];
27
+ pcrs: Record<number, string>;
28
+ timestamp: number;
29
+ moduleId: string;
30
+ }>;
31
+ export {};
32
+ //# sourceMappingURL=escrow-nitro-attestation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escrow-nitro-attestation.d.ts","sourceRoot":"","sources":["../src/escrow-nitro-attestation.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAS1B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAEvD,MAAM,MAAM,sBAAsB,GAC5B,MAAM,GACN,MAAM,GACN,KAAK,GACL,OAAO,GACP,MAAM,GACN,WAAW,GACX,KAAK,GACL,OAAO,GACP,OAAO,GACP,WAAW,GACX,WAAW,CAAC;AAElB,6EAA6E;AAC7E,qBAAa,qBAAsB,SAAQ,KAAK;aAChB,MAAM,EAAE,sBAAsB;gBAA9B,MAAM,EAAE,sBAAsB;CAI7D;AAGD,KAAK,WAAW,GAAG,OAAO,CAAC,uBAAuB,EAAE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AA2EvE,gGAAgG;AAChG,eAAO,MAAM,8BAA8B,GACvC,aAAa,MAAM,EACnB,iCAIG;IACC,aAAa,EAAE,UAAU,CAAC;IAC1B,MAAM,EAAE,WAAW,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;CAChB,KACF,OAAO,CAAC;IACP,sBAAsB,EAAE,MAAM,CAAC;IAC/B;;;qEAGiE;IACjE,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B;kFAC8E;IAC9E,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACpB,CAwJA,CAAC"}
package/dist/index.d.ts CHANGED
@@ -14,8 +14,10 @@ export type { EmailRelayBranding, EmailRelayEnvelope, EmailRelayPlaintext, } fro
14
14
  export { ESCROW_ENVELOPE_VERSION, ESCROW_ALGORITHM, ESCROW_BLOB_INFO, ESCROW_RELEASE_INFO, ESCROW_CLIENT_KEY_ID, parseEscrowEnvelope, parseEscrowBlobPlaintext, parseEscrowReleasePlaintext, generateEscrowKeyPair, encryptEscrowBlob, decryptEscrowBlob, sealEscrowRelease, openEscrowRelease, } from './escrow-crypto';
15
15
  export type { EscrowEnvelope, EscrowBlobPlaintext, EscrowReleasePlaintext } from './escrow-crypto';
16
16
  export { verifyEnclaveAttestation } from './escrow-attestation';
17
+ export { verifyNitroAttestationDocument, NitroAttestationError } from './escrow-nitro-attestation';
18
+ export type { NitroAttestationReason } from './escrow-nitro-attestation';
17
19
  export type { EscrowAttestationPolicy, EscrowHoldStatus, EscrowRecoveryStart } from './types';
18
- export type { EscrowEnrollmentOptions, EscrowEnrollmentState, EscrowPinStatus } from './types';
20
+ export type { EscrowEnrollmentOptions, EscrowEnrollmentState, EscrowBlobStaleReason, EscrowPinStatus, } from './types';
19
21
  export { EscrowPinMismatchError, EscrowPinLockedError, EscrowPinThrottledError, EscrowHoldRestartThrottledError, EscrowPinUnavailableError, } from './types';
20
22
  export { PIN_MIN_LENGTH, PIN_MAX_LENGTH, ESCROW_PIN_MAX_ATTEMPTS, normalizePin, validatePin, generatePinSalt, derivePinProof, constantTimeEqualHex, } from './escrow-pin';
21
23
  export { createPasskeyCredential, deriveKeyFromPasskey, encryptShareWithPasskey, decryptShareWithPasskey, isWebAuthnSupported, isPRFSupported, } from './passkey';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}