@zerodev/wallet-core 0.0.1-alpha.16 → 0.0.1-alpha.18

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 (45) hide show
  1. package/dist/_cjs/actions/auth/registerWithOTP.js.map +1 -1
  2. package/dist/_cjs/client/authProxy.js +1 -1
  3. package/dist/_cjs/client/authProxy.js.map +1 -1
  4. package/dist/_cjs/constants.js +2 -1
  5. package/dist/_cjs/constants.js.map +1 -1
  6. package/dist/_cjs/core/createZeroDevWallet.js +9 -3
  7. package/dist/_cjs/core/createZeroDevWallet.js.map +1 -1
  8. package/dist/_cjs/utils/encryptOtpAttempt.js +57 -0
  9. package/dist/_cjs/utils/encryptOtpAttempt.js.map +1 -0
  10. package/dist/_cjs/utils/hpke.js +89 -0
  11. package/dist/_cjs/utils/hpke.js.map +1 -0
  12. package/dist/_esm/actions/auth/registerWithOTP.js.map +1 -1
  13. package/dist/_esm/client/authProxy.js +9 -4
  14. package/dist/_esm/client/authProxy.js.map +1 -1
  15. package/dist/_esm/constants.js +6 -0
  16. package/dist/_esm/constants.js.map +1 -1
  17. package/dist/_esm/core/createZeroDevWallet.js +12 -4
  18. package/dist/_esm/core/createZeroDevWallet.js.map +1 -1
  19. package/dist/_esm/utils/encryptOtpAttempt.js +81 -0
  20. package/dist/_esm/utils/encryptOtpAttempt.js.map +1 -0
  21. package/dist/_esm/utils/hpke.js +135 -0
  22. package/dist/_esm/utils/hpke.js.map +1 -0
  23. package/dist/_types/actions/auth/getAuthenticators.d.ts +12 -12
  24. package/dist/_types/actions/auth/getAuthenticators.d.ts.map +1 -1
  25. package/dist/_types/actions/auth/registerWithOTP.d.ts +6 -0
  26. package/dist/_types/actions/auth/registerWithOTP.d.ts.map +1 -1
  27. package/dist/_types/client/authProxy.d.ts +13 -7
  28. package/dist/_types/client/authProxy.d.ts.map +1 -1
  29. package/dist/_types/constants.d.ts +1 -0
  30. package/dist/_types/constants.d.ts.map +1 -1
  31. package/dist/_types/core/createZeroDevWallet.d.ts +10 -0
  32. package/dist/_types/core/createZeroDevWallet.d.ts.map +1 -1
  33. package/dist/_types/utils/encryptOtpAttempt.d.ts +40 -0
  34. package/dist/_types/utils/encryptOtpAttempt.d.ts.map +1 -0
  35. package/dist/_types/utils/hpke.d.ts +38 -0
  36. package/dist/_types/utils/hpke.d.ts.map +1 -0
  37. package/dist/tsconfig.build.tsbuildinfo +1 -1
  38. package/package.json +4 -1
  39. package/src/actions/auth/getAuthenticators.ts +12 -12
  40. package/src/actions/auth/registerWithOTP.ts +6 -0
  41. package/src/client/authProxy.ts +14 -8
  42. package/src/constants.ts +8 -0
  43. package/src/core/createZeroDevWallet.ts +23 -4
  44. package/src/utils/encryptOtpAttempt.ts +142 -0
  45. package/src/utils/hpke.ts +245 -0
@@ -0,0 +1,135 @@
1
+ /**
2
+ * HPKE (RFC 9180) seal for Turnkey enclave-encrypted requests.
3
+ *
4
+ * Suite: DHKEM(P-256, HKDF-SHA256) / HKDF-SHA256 / AES-256-GCM
5
+ * - KEM ID = 0x0010 (DHKEM-P256-HKDF-SHA256)
6
+ * - KDF ID = 0x0001 (HKDF-SHA256)
7
+ * - AEAD ID = 0x0002 (AES-256-GCM)
8
+ *
9
+ * Wire format and AAD construction match Turnkey's enclave_encrypt Go package:
10
+ * info = "turnkey_hpke"
11
+ * aad = enc || pkR (both 65-byte uncompressed P-256 points)
12
+ *
13
+ * References:
14
+ * - RFC 9180 §4 / §5
15
+ * - tkhq/go-sdk/pkg/enclave_encrypt
16
+ */
17
+ import { p256 } from '@noble/curves/nist.js';
18
+ import { expand, extract } from '@noble/hashes/hkdf.js';
19
+ import { sha256 } from '@noble/hashes/sha2.js';
20
+ const KEM_ID = 0x0010;
21
+ const KDF_ID = 0x0001;
22
+ const AEAD_ID = 0x0002;
23
+ // Output sizes for the chosen primitives.
24
+ const NH = 32; // SHA-256 output
25
+ const NK = 32; // AES-256 key
26
+ const NN = 12; // AES-GCM nonce
27
+ const NPK = 65; // uncompressed P-256 point: 0x04 || X || Y
28
+ const TURNKEY_HPKE_INFO = new TextEncoder().encode('turnkey_hpke');
29
+ const HPKE_VERSION = new TextEncoder().encode('HPKE-v1');
30
+ // suite_id for the HPKE context: "HPKE" || I2OSP(KEM,2) || I2OSP(KDF,2) || I2OSP(AEAD,2)
31
+ const HPKE_SUITE_ID = concat(new TextEncoder().encode('HPKE'), i2osp(KEM_ID, 2), i2osp(KDF_ID, 2), i2osp(AEAD_ID, 2));
32
+ // suite_id for the KEM scope: "KEM" || I2OSP(KEM,2)
33
+ const KEM_SUITE_ID = concat(new TextEncoder().encode('KEM'), i2osp(KEM_ID, 2));
34
+ function concat(...parts) {
35
+ const total = parts.reduce((sum, p) => sum + p.length, 0);
36
+ const out = new Uint8Array(total);
37
+ let offset = 0;
38
+ for (const p of parts) {
39
+ out.set(p, offset);
40
+ offset += p.length;
41
+ }
42
+ return out;
43
+ }
44
+ function i2osp(n, len) {
45
+ const out = new Uint8Array(len);
46
+ for (let i = len - 1; i >= 0; i--) {
47
+ out[i] = n & 0xff;
48
+ n >>>= 8;
49
+ }
50
+ return out;
51
+ }
52
+ // LabeledExtract(salt, label, ikm, suite_id) =
53
+ // HKDF-Extract(salt, "HPKE-v1" || suite_id || label || ikm)
54
+ function labeledExtract(salt, label, ikm, suiteId) {
55
+ const labeledIkm = concat(HPKE_VERSION, suiteId, new TextEncoder().encode(label), ikm);
56
+ return extract(sha256, labeledIkm, salt);
57
+ }
58
+ // LabeledExpand(prk, label, info, L, suite_id) =
59
+ // HKDF-Expand(prk, I2OSP(L,2) || "HPKE-v1" || suite_id || label || info, L)
60
+ function labeledExpand(prk, label, info, length, suiteId) {
61
+ const labeledInfo = concat(i2osp(length, 2), HPKE_VERSION, suiteId, new TextEncoder().encode(label), info);
62
+ return expand(sha256, prk, labeledInfo, length);
63
+ }
64
+ // DHKEM Encap: returns (sharedSecret, enc)
65
+ // sharedSecret is 32 bytes; enc is the serialized ephemeral pubkey (65 bytes uncompressed).
66
+ function encap(receiverPublicKey) {
67
+ const ephSk = p256.utils.randomSecretKey();
68
+ const ephPkUncompressed = p256.getPublicKey(ephSk, false);
69
+ // ECDH: returns the serialized shared point. Pass isCompressed=true so the
70
+ // first byte is the SEC1 prefix and bytes [1, 33) are the x-coordinate.
71
+ const sharedPoint = p256.getSharedSecret(ephSk, receiverPublicKey,
72
+ /* isCompressed */ true);
73
+ const dh = sharedPoint.slice(1, 33);
74
+ const kemContext = concat(ephPkUncompressed, receiverPublicKey);
75
+ const eaePrk = labeledExtract(new Uint8Array(0), 'eae_prk', dh, KEM_SUITE_ID);
76
+ const sharedSecret = labeledExpand(eaePrk, 'shared_secret', kemContext, NH, KEM_SUITE_ID);
77
+ return { sharedSecret, enc: ephPkUncompressed };
78
+ }
79
+ // KeySchedule for mode_base: returns (key, base_nonce).
80
+ function keySchedule(sharedSecret, info) {
81
+ const empty = new Uint8Array(0);
82
+ const pskIdHash = labeledExtract(empty, 'psk_id_hash', empty, HPKE_SUITE_ID);
83
+ const infoHash = labeledExtract(empty, 'info_hash', info, HPKE_SUITE_ID);
84
+ // mode_base = 0x00 prepended to (psk_id_hash || info_hash)
85
+ const keyScheduleContext = concat(new Uint8Array([0]), pskIdHash, infoHash);
86
+ const secret = labeledExtract(sharedSecret, 'secret', empty, HPKE_SUITE_ID);
87
+ const key = labeledExpand(secret, 'key', keyScheduleContext, NK, HPKE_SUITE_ID);
88
+ const baseNonce = labeledExpand(secret, 'base_nonce', keyScheduleContext, NN, HPKE_SUITE_ID);
89
+ return { key, baseNonce };
90
+ }
91
+ // Web Crypto's BufferSource type rejects `Uint8Array<ArrayBufferLike>` (which
92
+ // noble/v2 returns) under strict TS lib settings because the underlying buffer
93
+ // could in principle be a SharedArrayBuffer. Copy into a fresh ArrayBuffer to
94
+ // satisfy the type.
95
+ function toArrayBuffer(u8) {
96
+ const out = new ArrayBuffer(u8.byteLength);
97
+ new Uint8Array(out).set(u8);
98
+ return out;
99
+ }
100
+ async function aesGcmSeal(key, nonce, aad, plaintext) {
101
+ // Web Crypto returns ciphertext || tag (16 bytes appended). Matches the
102
+ // single-blob format Turnkey's `Sealer.Seal` produces.
103
+ const cryptoKey = await crypto.subtle.importKey('raw', toArrayBuffer(key), { name: 'AES-GCM' },
104
+ /* extractable */ false, ['encrypt']);
105
+ const ct = await crypto.subtle.encrypt({
106
+ name: 'AES-GCM',
107
+ iv: toArrayBuffer(nonce),
108
+ additionalData: toArrayBuffer(aad),
109
+ tagLength: 128,
110
+ }, cryptoKey, toArrayBuffer(plaintext));
111
+ return new Uint8Array(ct);
112
+ }
113
+ /**
114
+ * Single-shot HPKE seal in mode_base for Turnkey's TLS Fetcher enclave.
115
+ *
116
+ * Uses the fixed Turnkey `info = "turnkey_hpke"` and the AAD shape
117
+ * `enc || receiverPublicKey` so the resulting bundle is decryptable by
118
+ * `enclave_encrypt.EnclaveEncryptServer.Decrypt`.
119
+ *
120
+ * @param receiverPublicKey - The enclave's ephemeral target public key
121
+ * (uncompressed P-256, 65 bytes), extracted from the encryption target bundle.
122
+ * @param plaintext - The bytes to encrypt (e.g. the JSON-encoded OTP attempt).
123
+ */
124
+ export async function hpkeSealP256({ receiverPublicKey, plaintext, }) {
125
+ if (receiverPublicKey.length !== NPK) {
126
+ throw new Error(`hpkeSealP256: receiverPublicKey must be ${NPK} bytes (uncompressed P-256), got ${receiverPublicKey.length}`);
127
+ }
128
+ const { sharedSecret, enc } = encap(receiverPublicKey);
129
+ const { key, baseNonce } = keySchedule(sharedSecret, TURNKEY_HPKE_INFO);
130
+ // First message of the context, sequence 0 → nonce = base_nonce.
131
+ const aad = concat(enc, receiverPublicKey);
132
+ const ciphertext = await aesGcmSeal(key, baseNonce, aad, plaintext);
133
+ return { encappedPublic: enc, ciphertext };
134
+ }
135
+ //# sourceMappingURL=hpke.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hpke.js","sourceRoot":"","sources":["../../../src/utils/hpke.ts"],"names":[],"mappings":"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"}
@@ -7,28 +7,28 @@ export type GetAuthenticatorsParameters = {
7
7
  /** The session token for authorization */
8
8
  token: string;
9
9
  };
10
- /** An OAuth authenticator linked to the user (PascalCase from Go default marshaling) */
10
+ /** An OAuth authenticator linked to the user */
11
11
  export type OAuthAuthenticator = {
12
- Provider?: string;
13
- ClientId?: string;
14
- Subject?: string;
12
+ provider?: string;
13
+ clientId?: string;
14
+ subject?: string;
15
15
  [key: string]: unknown;
16
16
  };
17
- /** A passkey (WebAuthn) authenticator (PascalCase from Go default marshaling) */
17
+ /** A passkey (WebAuthn) authenticator */
18
18
  export type PasskeyAuthenticator = {
19
- RpId?: string;
20
- PublicKey?: string;
21
- CredentialId?: string;
19
+ rpId?: string;
20
+ publicKey?: string;
21
+ credentialId?: string;
22
22
  [key: string]: unknown;
23
23
  };
24
- /** An email contact linked to the user (PascalCase from Go default marshaling) */
24
+ /** An email contact linked to the user */
25
25
  export type EmailContact = {
26
- Email?: string;
26
+ email?: string;
27
27
  [key: string]: unknown;
28
28
  };
29
- /** An API key authenticator (PascalCase from Go default marshaling) */
29
+ /** An API key authenticator */
30
30
  export type ApiKeyAuthenticator = {
31
- ApiKey?: string;
31
+ apiKey?: string;
32
32
  [key: string]: unknown;
33
33
  };
34
34
  export type GetAuthenticatorsReturnType = {
@@ -1 +1 @@
1
- {"version":3,"file":"getAuthenticators.d.ts","sourceRoot":"","sources":["../../../../src/actions/auth/getAuthenticators.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAEnD,MAAM,MAAM,2BAA2B,GAAG;IACxC,0DAA0D;IAC1D,iBAAiB,EAAE,MAAM,CAAA;IACzB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAA;IACjB,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,wFAAwF;AACxF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,CAAA;AAED,iFAAiF;AACjF,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,CAAA;AAED,kFAAkF;AAClF,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,CAAA;AAED,uEAAuE;AACvE,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,2BAA2B,GAAG;IACxC,wDAAwD;IACxD,MAAM,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAAA;IACnC,oEAAoE;IACpE,QAAQ,EAAE,oBAAoB,EAAE,GAAG,IAAI,CAAA;IACvC,6DAA6D;IAC7D,aAAa,EAAE,YAAY,EAAE,GAAG,IAAI,CAAA;IACpC,uDAAuD;IACvD,OAAO,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAAA;CACtC,CAAA;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,2BAA2B,GAClC,OAAO,CAAC,2BAA2B,CAAC,CAetC"}
1
+ {"version":3,"file":"getAuthenticators.d.ts","sourceRoot":"","sources":["../../../../src/actions/auth/getAuthenticators.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAEnD,MAAM,MAAM,2BAA2B,GAAG;IACxC,0DAA0D;IAC1D,iBAAiB,EAAE,MAAM,CAAA;IACzB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAA;IACjB,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,gDAAgD;AAChD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,CAAA;AAED,yCAAyC;AACzC,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,CAAA;AAED,0CAA0C;AAC1C,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,CAAA;AAED,+BAA+B;AAC/B,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,2BAA2B,GAAG;IACxC,wDAAwD;IACxD,MAAM,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAAA;IACnC,oEAAoE;IACpE,QAAQ,EAAE,oBAAoB,EAAE,GAAG,IAAI,CAAA;IACvC,6DAA6D;IAC7D,aAAa,EAAE,YAAY,EAAE,GAAG,IAAI,CAAA;IACpC,uDAAuD;IACvD,OAAO,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAAA;CACtC,CAAA;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,2BAA2B,GAClC,OAAO,CAAC,2BAA2B,CAAC,CAetC"}
@@ -27,6 +27,12 @@ export type RegisterWithOTPParameters = {
27
27
  export type RegisterWithOTPReturnType = {
28
28
  /** The OTP ID needed for verification */
29
29
  otpId: string;
30
+ /**
31
+ * Signed encryption target bundle issued by the TLS Fetcher enclave for
32
+ * this OTP session. Passed verbatim to the verify step so the SDK can
33
+ * HPKE-encrypt the OTP attempt to the enclave's ephemeral target key.
34
+ */
35
+ otpEncryptionTargetBundle: string;
30
36
  };
31
37
  /**
32
38
  * Initiates OTP (One-Time Password) authentication
@@ -1 +1 @@
1
- {"version":3,"file":"registerWithOTP.d.ts","sourceRoot":"","sources":["../../../../src/actions/auth/registerWithOTP.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAEpE,MAAM,MAAM,UAAU,GAAG;IACvB,kEAAkE;IAClE,IAAI,EAAE,OAAO,GAAG,KAAK,CAAA;IACrB,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,qEAAqE;IACrE,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACrB,kDAAkD;IAClD,YAAY,EAAE,OAAO,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAA;IACb,+CAA+C;IAC/C,OAAO,EAAE,UAAU,CAAA;IACnB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAA;IACjB,4CAA4C;IAC5C,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;IACvC,+CAA+C;IAC/C,oBAAoB,CAAC,EAAE,oBAAoB,CAAA;CAC5C,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAAC,yBAAyB,CAAC,CA0BpC"}
1
+ {"version":3,"file":"registerWithOTP.d.ts","sourceRoot":"","sources":["../../../../src/actions/auth/registerWithOTP.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAEpE,MAAM,MAAM,UAAU,GAAG;IACvB,kEAAkE;IAClE,IAAI,EAAE,OAAO,GAAG,KAAK,CAAA;IACrB,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,qEAAqE;IACrE,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACrB,kDAAkD;IAClD,YAAY,EAAE,OAAO,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAA;IACb,+CAA+C;IAC/C,OAAO,EAAE,UAAU,CAAA;IACnB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAA;IACjB,4CAA4C;IAC5C,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;IACvC,+CAA+C;IAC/C,oBAAoB,CAAC,EAAE,oBAAoB,CAAA;CAC5C,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAA;IACb;;;;OAIG;IACH,yBAAyB,EAAE,MAAM,CAAA;CAClC,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAAC,yBAAyB,CAAC,CA0BpC"}
@@ -7,10 +7,11 @@ export type AuthProxyClientConfig = {
7
7
  export type AuthProxyVerifyOtpRequest = {
8
8
  /** The OTP ID from registration */
9
9
  otpId: string;
10
- /** The OTP code entered by the user */
11
- otpCode: string;
12
- /** The public key to associate with the verification */
13
- public_key: string;
10
+ /**
11
+ * HPKE-sealed bundle containing `{otp_code, public_key}` encrypted to the
12
+ * enclave's per-session target key. Produced by `encryptOtpAttempt`.
13
+ */
14
+ encryptedOtpBundle: string;
14
15
  };
15
16
  export type AuthProxyVerifyOtpResponse = {
16
17
  /** The verification token to use for login */
@@ -25,10 +26,15 @@ export type AuthProxyVerifyOtpResponse = {
25
26
  */
26
27
  export declare function createAuthProxyClient(config: AuthProxyClientConfig): {
27
28
  /**
28
- * Verifies an OTP code with Turnkey's Auth Proxy
29
+ * Verifies an OTP attempt with Turnkey's Auth Proxy.
30
+ *
31
+ * The `encryptedOtpBundle` is HPKE-sealed `{otp_code, public_key}` JSON
32
+ * (see `encryptOtpAttempt`). The auth proxy forwards the ciphertext to
33
+ * the TLS Fetcher enclave, which decrypts it, verifies the OTP code, and
34
+ * returns a `verificationToken` bound to the embedded public key.
29
35
  *
30
- * Returns a verificationToken that should be passed to the backend's
31
- * /auth/login/otp endpoint along with a client signature.
36
+ * Pass the returned `verificationToken` to `/auth/login/otp` along with
37
+ * a client signature to complete the login.
32
38
  */
33
39
  verifyOtp(params: AuthProxyVerifyOtpRequest): Promise<AuthProxyVerifyOtpResponse>;
34
40
  };
@@ -1 +1 @@
1
- {"version":3,"file":"authProxy.d.ts","sourceRoot":"","sources":["../../../src/client/authProxy.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,qBAAqB,GAAG;IAClC,gDAAgD;IAChD,iBAAiB,EAAE,MAAM,CAAA;IACzB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAA;IACb,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAA;IACf,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,8CAA8C;IAC9C,iBAAiB,EAAE,MAAM,CAAA;CAC1B,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB;IAiC/D;;;;;OAKG;sBAEO,yBAAyB,GAChC,OAAO,CAAC,0BAA0B,CAAC;EAIzC;AAED,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAA"}
1
+ {"version":3,"file":"authProxy.d.ts","sourceRoot":"","sources":["../../../src/client/authProxy.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,qBAAqB,GAAG;IAClC,gDAAgD;IAChD,iBAAiB,EAAE,MAAM,CAAA;IACzB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAA;IACb;;;OAGG;IACH,kBAAkB,EAAE,MAAM,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,8CAA8C;IAC9C,iBAAiB,EAAE,MAAM,CAAA;CAC1B,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB;IAiC/D;;;;;;;;;;OAUG;sBAEO,yBAAyB,GAChC,OAAO,CAAC,0BAA0B,CAAC;EAIzC;AAED,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAA"}
@@ -3,4 +3,5 @@ export declare const DEFAULT_IFRAME_CONTAINER_ID = "turnkey-auth-iframe-containe
3
3
  export declare const DEFAULT_IFRAME_ELEMENT_ID = "turnkey-default-iframe-element-id";
4
4
  export declare const DEFAULT_ORGANIZATION_ID = "0d98e826-dd8f-44ca-a585-3afcd27d4002";
5
5
  export declare const KMS_SERVER_URL = "https://kms.staging.zerodev.app";
6
+ export declare const TURNKEY_TLS_FETCHER_SIGN_PUBLIC_KEY = "046b4f88421f76b6ba418afc2ea1d8ced671337d7db6b80478a60d8531bf8f17fa9a512f0fef96fc0c9b4cd9dff70b34992e520ce04c79d931f6ff6296b547d201";
6
7
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qCAAqC,QAAQ,CAAA;AAC1D,eAAO,MAAM,2BAA2B,qCAAqC,CAAA;AAC7E,eAAO,MAAM,yBAAyB,sCAAsC,CAAA;AAC5E,eAAO,MAAM,uBAAuB,yCAAyC,CAAA;AAC7E,eAAO,MAAM,cAAc,oCAAoC,CAAA"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qCAAqC,QAAQ,CAAA;AAC1D,eAAO,MAAM,2BAA2B,qCAAqC,CAAA;AAC7E,eAAO,MAAM,yBAAyB,sCAAsC,CAAA;AAC5E,eAAO,MAAM,uBAAuB,yCAAyC,CAAA;AAC7E,eAAO,MAAM,cAAc,oCAAoC,CAAA;AAO/D,eAAO,MAAM,mCAAmC,uIACsF,CAAA"}
@@ -35,6 +35,11 @@ export type AuthParams = {
35
35
  mode: 'verifyOtp';
36
36
  otpId: string;
37
37
  otpCode: string;
38
+ /**
39
+ * The encryption target bundle returned by the matching `sendOtp` call.
40
+ * Required — used to HPKE-encrypt the OTP attempt to the enclave.
41
+ */
42
+ otpEncryptionTargetBundle: string;
38
43
  } | {
39
44
  type: 'magicLink';
40
45
  mode: 'send';
@@ -46,6 +51,11 @@ export type AuthParams = {
46
51
  mode: 'verify';
47
52
  otpId: string;
48
53
  code: string;
54
+ /**
55
+ * The encryption target bundle returned by the matching `sendMagicLink`
56
+ * (a.k.a. magicLink `send`) call. Required for the encrypted-OTP flow.
57
+ */
58
+ otpEncryptionTargetBundle: string;
49
59
  };
50
60
  export interface ZeroDevWalletSDK {
51
61
  client: ZeroDevWalletClient;
@@ -1 +1 @@
1
- {"version":3,"file":"createZeroDevWallet.d.ts","sourceRoot":"","sources":["../../../src/core/createZeroDevWallet.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"createZeroDevWallet.d.ts","sourceRoot":"","sources":["../../../src/core/createZeroDevWallet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Wraps the OTP code + client public key in a Turnkey-compatible HPKE bundle
3
+ * for the `/v1/otp_verify_v2` auth-proxy endpoint.
4
+ *
5
+ * Bundle flow (RFC 9180 mode_base over Turnkey's TLS Fetcher enclave):
6
+ * 1. The backend's /init/otp returns a signed envelope that contains an
7
+ * ephemeral HPKE public key (`targetPublic`) generated fresh by the
8
+ * enclave for this OTP attempt.
9
+ * 2. We verify the envelope's ECDSA signature against a pinned production
10
+ * key (`TURNKEY_TLS_FETCHER_SIGN_PUBLIC_KEY`) so a compromised proxy
11
+ * cannot substitute its own ephemeral key.
12
+ * 3. We HPKE-seal `{otp_code, public_key}` to `targetPublic`. The auth proxy
13
+ * forwards the ciphertext to the enclave; only the enclave can decrypt
14
+ * it. The enclave then issues a `verificationToken` bound to the public
15
+ * key embedded in the plaintext.
16
+ *
17
+ * See: tkhq/go-sdk `examples/email_otp` and `pkg/enclave_encrypt`.
18
+ */
19
+ export type EncryptOtpAttemptParams = {
20
+ /** The OTP code the user entered. */
21
+ otpCode: string;
22
+ /**
23
+ * The client's session public key (compressed P-256 hex). The enclave binds
24
+ * this key into the `verificationToken` it issues.
25
+ */
26
+ publicKey: string;
27
+ /** The signed envelope returned by `/auth/init/otp`. */
28
+ encryptionTargetBundle: string;
29
+ /**
30
+ * Test-only override for the pinned signing key. Production callers should
31
+ * leave this undefined; it exists so tests don't have to use the real key.
32
+ */
33
+ dangerouslyOverrideSignerPublicKey?: string;
34
+ };
35
+ /**
36
+ * Returns a JSON string ready to be sent as `encryptedOtpBundle` on
37
+ * `POST /v1/otp_verify_v2`.
38
+ */
39
+ export declare function encryptOtpAttempt({ otpCode, publicKey, encryptionTargetBundle, dangerouslyOverrideSignerPublicKey, }: EncryptOtpAttemptParams): Promise<string>;
40
+ //# sourceMappingURL=encryptOtpAttempt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encryptOtpAttempt.d.ts","sourceRoot":"","sources":["../../../src/utils/encryptOtpAttempt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAyBH,MAAM,MAAM,uBAAuB,GAAG;IACpC,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAA;IACjB,wDAAwD;IACxD,sBAAsB,EAAE,MAAM,CAAA;IAC9B;;;OAGG;IACH,kCAAkC,CAAC,EAAE,MAAM,CAAA;CAC5C,CAAA;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,EACtC,OAAO,EACP,SAAS,EACT,sBAAsB,EACtB,kCAAkC,GACnC,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyE3C"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * HPKE (RFC 9180) seal for Turnkey enclave-encrypted requests.
3
+ *
4
+ * Suite: DHKEM(P-256, HKDF-SHA256) / HKDF-SHA256 / AES-256-GCM
5
+ * - KEM ID = 0x0010 (DHKEM-P256-HKDF-SHA256)
6
+ * - KDF ID = 0x0001 (HKDF-SHA256)
7
+ * - AEAD ID = 0x0002 (AES-256-GCM)
8
+ *
9
+ * Wire format and AAD construction match Turnkey's enclave_encrypt Go package:
10
+ * info = "turnkey_hpke"
11
+ * aad = enc || pkR (both 65-byte uncompressed P-256 points)
12
+ *
13
+ * References:
14
+ * - RFC 9180 §4 / §5
15
+ * - tkhq/go-sdk/pkg/enclave_encrypt
16
+ */
17
+ export type HpkeSealResult = {
18
+ /** Ephemeral sender public key (uncompressed P-256, 65 bytes). */
19
+ encappedPublic: Uint8Array;
20
+ /** AES-256-GCM ciphertext with a 16-byte authentication tag appended. */
21
+ ciphertext: Uint8Array;
22
+ };
23
+ /**
24
+ * Single-shot HPKE seal in mode_base for Turnkey's TLS Fetcher enclave.
25
+ *
26
+ * Uses the fixed Turnkey `info = "turnkey_hpke"` and the AAD shape
27
+ * `enc || receiverPublicKey` so the resulting bundle is decryptable by
28
+ * `enclave_encrypt.EnclaveEncryptServer.Decrypt`.
29
+ *
30
+ * @param receiverPublicKey - The enclave's ephemeral target public key
31
+ * (uncompressed P-256, 65 bytes), extracted from the encryption target bundle.
32
+ * @param plaintext - The bytes to encrypt (e.g. the JSON-encoded OTP attempt).
33
+ */
34
+ export declare function hpkeSealP256({ receiverPublicKey, plaintext, }: {
35
+ receiverPublicKey: Uint8Array;
36
+ plaintext: Uint8Array;
37
+ }): Promise<HpkeSealResult>;
38
+ //# sourceMappingURL=hpke.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hpke.d.ts","sourceRoot":"","sources":["../../../src/utils/hpke.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AA8LH,MAAM,MAAM,cAAc,GAAG;IAC3B,kEAAkE;IAClE,cAAc,EAAE,UAAU,CAAA;IAC1B,yEAAyE;IACzE,UAAU,EAAE,UAAU,CAAA;CACvB,CAAA;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAAC,EACjC,iBAAiB,EACjB,SAAS,GACV,EAAE;IACD,iBAAiB,EAAE,UAAU,CAAA;IAC7B,SAAS,EAAE,UAAU,CAAA;CACtB,GAAG,OAAO,CAAC,cAAc,CAAC,CAe1B"}