@zerodev/wallet-core 0.0.1-alpha.9 → 0.0.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 (368) hide show
  1. package/README.md +68 -18
  2. package/dist/_cjs/actions/auth/authenticateWithEmail.js +1 -2
  3. package/dist/_cjs/actions/auth/authenticateWithEmail.js.map +1 -1
  4. package/dist/_cjs/actions/auth/authenticateWithOAuth.js +2 -3
  5. package/dist/_cjs/actions/auth/authenticateWithOAuth.js.map +1 -1
  6. package/dist/_cjs/actions/auth/getAuthProxyConfigId.js +10 -0
  7. package/dist/_cjs/actions/auth/getAuthProxyConfigId.js.map +1 -0
  8. package/dist/_cjs/actions/auth/getAuthenticators.js +16 -0
  9. package/dist/_cjs/actions/auth/getAuthenticators.js.map +1 -0
  10. package/dist/_cjs/actions/auth/getOAuthLoginUrl.js +18 -0
  11. package/dist/_cjs/actions/auth/getOAuthLoginUrl.js.map +1 -0
  12. package/dist/_cjs/actions/auth/getParentOrgId.js +10 -0
  13. package/dist/_cjs/actions/auth/getParentOrgId.js.map +1 -0
  14. package/dist/_cjs/actions/auth/getWhoami.js +18 -4
  15. package/dist/_cjs/actions/auth/getWhoami.js.map +1 -1
  16. package/dist/_cjs/actions/auth/index.js +9 -3
  17. package/dist/_cjs/actions/auth/index.js.map +1 -1
  18. package/dist/_cjs/actions/auth/loginWithStamp.js +5 -6
  19. package/dist/_cjs/actions/auth/loginWithStamp.js.map +1 -1
  20. package/dist/_cjs/actions/auth/registerWithOTP.js +1 -2
  21. package/dist/_cjs/actions/auth/registerWithOTP.js.map +1 -1
  22. package/dist/_cjs/actions/auth/registerWithPasskey.js +1 -2
  23. package/dist/_cjs/actions/auth/registerWithPasskey.js.map +1 -1
  24. package/dist/_cjs/actions/index.js +9 -3
  25. package/dist/_cjs/actions/index.js.map +1 -1
  26. package/dist/_cjs/actions/wallet/getUserWallet.js +3 -5
  27. package/dist/_cjs/actions/wallet/getUserWallet.js.map +1 -1
  28. package/dist/_cjs/actions/wallet/index.js +9 -3
  29. package/dist/_cjs/actions/wallet/index.js.map +1 -1
  30. package/dist/_cjs/actions/wallet/sign7702Authorization.js +16 -0
  31. package/dist/_cjs/actions/wallet/sign7702Authorization.js.map +1 -0
  32. package/dist/_cjs/actions/wallet/signMessage.js +17 -0
  33. package/dist/_cjs/actions/wallet/signMessage.js.map +1 -0
  34. package/dist/_cjs/actions/wallet/signTransaction.js +9 -18
  35. package/dist/_cjs/actions/wallet/signTransaction.js.map +1 -1
  36. package/dist/_cjs/actions/wallet/signTypedDataV4.js +17 -0
  37. package/dist/_cjs/actions/wallet/signTypedDataV4.js.map +1 -0
  38. package/dist/_cjs/actions/wallet/signUserOperation.js +17 -0
  39. package/dist/_cjs/actions/wallet/signUserOperation.js.map +1 -0
  40. package/dist/_cjs/actions/wallet/signingUtils.js +64 -0
  41. package/dist/_cjs/actions/wallet/signingUtils.js.map +1 -0
  42. package/dist/_cjs/adapters/viem.js +60 -27
  43. package/dist/_cjs/adapters/viem.js.map +1 -1
  44. package/dist/_cjs/client/authProxy.js +1 -1
  45. package/dist/_cjs/client/authProxy.js.map +1 -1
  46. package/dist/_cjs/client/createClient.js +5 -5
  47. package/dist/_cjs/client/createClient.js.map +1 -1
  48. package/dist/_cjs/client/decorators/client.js +9 -4
  49. package/dist/_cjs/client/decorators/client.js.map +1 -1
  50. package/dist/_cjs/client/index.js.map +1 -1
  51. package/dist/_cjs/client/transports/createTransport.js +6 -5
  52. package/dist/_cjs/client/transports/createTransport.js.map +1 -1
  53. package/dist/_cjs/client/transports/rest.js +40 -28
  54. package/dist/_cjs/client/transports/rest.js.map +1 -1
  55. package/dist/_cjs/constants.js +4 -4
  56. package/dist/_cjs/constants.js.map +1 -1
  57. package/dist/_cjs/core/{createZeroDevWallet.js → createZeroDevWalletCore.js} +94 -86
  58. package/dist/_cjs/core/createZeroDevWalletCore.js.map +1 -0
  59. package/dist/_cjs/index.js +14 -8
  60. package/dist/_cjs/index.js.map +1 -1
  61. package/dist/_cjs/index.native.js +39 -0
  62. package/dist/_cjs/index.native.js.map +1 -0
  63. package/dist/_cjs/native/createZeroDevWallet.js +13 -0
  64. package/dist/_cjs/native/createZeroDevWallet.js.map +1 -0
  65. package/dist/_cjs/native/stampers/passkey.js +30 -0
  66. package/dist/_cjs/native/stampers/passkey.js.map +1 -0
  67. package/dist/_cjs/native/stampers/secureStore.js +112 -0
  68. package/dist/_cjs/native/stampers/secureStore.js.map +1 -0
  69. package/dist/_cjs/native/storage/asyncStorage.js +11 -0
  70. package/dist/_cjs/native/storage/asyncStorage.js.map +1 -0
  71. package/dist/_cjs/stampers/iframeStamper.js +3 -0
  72. package/dist/_cjs/stampers/iframeStamper.js.map +1 -1
  73. package/dist/_cjs/stampers/indexedDbStamper.js +20 -2
  74. package/dist/_cjs/stampers/indexedDbStamper.js.map +1 -1
  75. package/dist/_cjs/stampers/noopPasskeyStamper.js +16 -0
  76. package/dist/_cjs/stampers/noopPasskeyStamper.js.map +1 -0
  77. package/dist/_cjs/stampers/webauthnStamper.js +23 -3
  78. package/dist/_cjs/stampers/webauthnStamper.js.map +1 -1
  79. package/dist/_cjs/stubs/native-on-web.js +12 -0
  80. package/dist/_cjs/stubs/native-on-web.js.map +1 -0
  81. package/dist/_cjs/utils/encryptOtpAttempt.js +57 -0
  82. package/dist/_cjs/utils/encryptOtpAttempt.js.map +1 -0
  83. package/dist/_cjs/utils/exportPrivateKey.js +1 -1
  84. package/dist/_cjs/utils/exportPrivateKey.js.map +1 -1
  85. package/dist/_cjs/utils/exportWallet.js +52 -61
  86. package/dist/_cjs/utils/exportWallet.js.map +1 -1
  87. package/dist/_cjs/utils/hpke.js +78 -0
  88. package/dist/_cjs/utils/hpke.js.map +1 -0
  89. package/dist/_cjs/utils/platform.js +19 -0
  90. package/dist/_cjs/utils/platform.js.map +1 -0
  91. package/dist/_cjs/utils/resolveOrganizationId.js +20 -0
  92. package/dist/_cjs/utils/resolveOrganizationId.js.map +1 -0
  93. package/dist/_cjs/utils/utils.js +5 -6
  94. package/dist/_cjs/utils/utils.js.map +1 -1
  95. package/dist/_cjs/web/createZeroDevWallet.js +21 -0
  96. package/dist/_cjs/web/createZeroDevWallet.js.map +1 -0
  97. package/dist/_esm/actions/auth/authenticateWithEmail.js +1 -2
  98. package/dist/_esm/actions/auth/authenticateWithEmail.js.map +1 -1
  99. package/dist/_esm/actions/auth/authenticateWithOAuth.js +8 -7
  100. package/dist/_esm/actions/auth/authenticateWithOAuth.js.map +1 -1
  101. package/dist/_esm/actions/auth/getAuthProxyConfigId.js +13 -0
  102. package/dist/_esm/actions/auth/getAuthProxyConfigId.js.map +1 -0
  103. package/dist/_esm/actions/auth/getAuthenticators.js +36 -0
  104. package/dist/_esm/actions/auth/getAuthenticators.js.map +1 -0
  105. package/dist/_esm/actions/auth/getOAuthLoginUrl.js +23 -0
  106. package/dist/_esm/actions/auth/getOAuthLoginUrl.js.map +1 -0
  107. package/dist/_esm/actions/auth/getParentOrgId.js +17 -0
  108. package/dist/_esm/actions/auth/getParentOrgId.js.map +1 -0
  109. package/dist/_esm/actions/auth/getWhoami.js +28 -6
  110. package/dist/_esm/actions/auth/getWhoami.js.map +1 -1
  111. package/dist/_esm/actions/auth/index.js +4 -1
  112. package/dist/_esm/actions/auth/index.js.map +1 -1
  113. package/dist/_esm/actions/auth/loginWithStamp.js +9 -6
  114. package/dist/_esm/actions/auth/loginWithStamp.js.map +1 -1
  115. package/dist/_esm/actions/auth/registerWithOTP.js +5 -2
  116. package/dist/_esm/actions/auth/registerWithOTP.js.map +1 -1
  117. package/dist/_esm/actions/auth/registerWithPasskey.js +1 -3
  118. package/dist/_esm/actions/auth/registerWithPasskey.js.map +1 -1
  119. package/dist/_esm/actions/index.js +2 -2
  120. package/dist/_esm/actions/index.js.map +1 -1
  121. package/dist/_esm/actions/wallet/getUserWallet.js +5 -5
  122. package/dist/_esm/actions/wallet/getUserWallet.js.map +1 -1
  123. package/dist/_esm/actions/wallet/index.js +4 -1
  124. package/dist/_esm/actions/wallet/index.js.map +1 -1
  125. package/dist/_esm/actions/wallet/sign7702Authorization.js +13 -0
  126. package/dist/_esm/actions/wallet/sign7702Authorization.js.map +1 -0
  127. package/dist/_esm/actions/wallet/signMessage.js +14 -0
  128. package/dist/_esm/actions/wallet/signMessage.js.map +1 -0
  129. package/dist/_esm/actions/wallet/signTransaction.js +9 -36
  130. package/dist/_esm/actions/wallet/signTransaction.js.map +1 -1
  131. package/dist/_esm/actions/wallet/signTypedDataV4.js +14 -0
  132. package/dist/_esm/actions/wallet/signTypedDataV4.js.map +1 -0
  133. package/dist/_esm/actions/wallet/signUserOperation.js +14 -0
  134. package/dist/_esm/actions/wallet/signUserOperation.js.map +1 -0
  135. package/dist/_esm/actions/wallet/signingUtils.js +69 -0
  136. package/dist/_esm/actions/wallet/signingUtils.js.map +1 -0
  137. package/dist/_esm/adapters/viem.js +63 -30
  138. package/dist/_esm/adapters/viem.js.map +1 -1
  139. package/dist/_esm/client/authProxy.js +9 -4
  140. package/dist/_esm/client/authProxy.js.map +1 -1
  141. package/dist/_esm/client/createClient.js +5 -5
  142. package/dist/_esm/client/createClient.js.map +1 -1
  143. package/dist/_esm/client/decorators/client.js +9 -4
  144. package/dist/_esm/client/decorators/client.js.map +1 -1
  145. package/dist/_esm/client/index.js +1 -1
  146. package/dist/_esm/client/index.js.map +1 -1
  147. package/dist/_esm/client/transports/createTransport.js +6 -5
  148. package/dist/_esm/client/transports/createTransport.js.map +1 -1
  149. package/dist/_esm/client/transports/rest.js +44 -29
  150. package/dist/_esm/client/transports/rest.js.map +1 -1
  151. package/dist/_esm/constants.js +10 -3
  152. package/dist/_esm/constants.js.map +1 -1
  153. package/dist/_esm/core/{createZeroDevWallet.js → createZeroDevWalletCore.js} +115 -90
  154. package/dist/_esm/core/createZeroDevWalletCore.js.map +1 -0
  155. package/dist/_esm/index.js +13 -5
  156. package/dist/_esm/index.js.map +1 -1
  157. package/dist/_esm/index.native.js +19 -0
  158. package/dist/_esm/index.native.js.map +1 -0
  159. package/dist/_esm/native/createZeroDevWallet.js +10 -0
  160. package/dist/_esm/native/createZeroDevWallet.js.map +1 -0
  161. package/dist/_esm/native/stampers/passkey.js +27 -0
  162. package/dist/_esm/native/stampers/passkey.js.map +1 -0
  163. package/dist/_esm/native/stampers/secureStore.js +120 -0
  164. package/dist/_esm/native/stampers/secureStore.js.map +1 -0
  165. package/dist/_esm/native/storage/asyncStorage.js +13 -0
  166. package/dist/_esm/native/storage/asyncStorage.js.map +1 -0
  167. package/dist/_esm/stampers/iframeStamper.js +3 -0
  168. package/dist/_esm/stampers/iframeStamper.js.map +1 -1
  169. package/dist/_esm/stampers/indexedDbStamper.js +20 -2
  170. package/dist/_esm/stampers/indexedDbStamper.js.map +1 -1
  171. package/dist/_esm/stampers/noopPasskeyStamper.js +18 -0
  172. package/dist/_esm/stampers/noopPasskeyStamper.js.map +1 -0
  173. package/dist/_esm/stampers/webauthnStamper.js +23 -4
  174. package/dist/_esm/stampers/webauthnStamper.js.map +1 -1
  175. package/dist/_esm/stubs/native-on-web.js +25 -0
  176. package/dist/_esm/stubs/native-on-web.js.map +1 -0
  177. package/dist/_esm/utils/encryptOtpAttempt.js +81 -0
  178. package/dist/_esm/utils/encryptOtpAttempt.js.map +1 -0
  179. package/dist/_esm/utils/exportPrivateKey.js +1 -1
  180. package/dist/_esm/utils/exportPrivateKey.js.map +1 -1
  181. package/dist/_esm/utils/exportWallet.js +52 -61
  182. package/dist/_esm/utils/exportWallet.js.map +1 -1
  183. package/dist/_esm/utils/hpke.js +119 -0
  184. package/dist/_esm/utils/hpke.js.map +1 -0
  185. package/dist/_esm/utils/platform.js +16 -0
  186. package/dist/_esm/utils/platform.js.map +1 -0
  187. package/dist/_esm/utils/resolveOrganizationId.js +27 -0
  188. package/dist/_esm/utils/resolveOrganizationId.js.map +1 -0
  189. package/dist/_esm/utils/utils.js +5 -6
  190. package/dist/_esm/utils/utils.js.map +1 -1
  191. package/dist/_esm/web/createZeroDevWallet.js +18 -0
  192. package/dist/_esm/web/createZeroDevWallet.js.map +1 -0
  193. package/dist/_types/actions/auth/authenticateWithEmail.d.ts +0 -6
  194. package/dist/_types/actions/auth/authenticateWithEmail.d.ts.map +1 -1
  195. package/dist/_types/actions/auth/authenticateWithOAuth.d.ts +10 -4
  196. package/dist/_types/actions/auth/authenticateWithOAuth.d.ts.map +1 -1
  197. package/dist/_types/actions/auth/getAuthProxyConfigId.d.ts +12 -0
  198. package/dist/_types/actions/auth/getAuthProxyConfigId.d.ts.map +1 -0
  199. package/dist/_types/actions/auth/getAuthenticators.d.ts +65 -0
  200. package/dist/_types/actions/auth/getAuthenticators.d.ts.map +1 -0
  201. package/dist/_types/actions/auth/getOAuthLoginUrl.d.ts +30 -0
  202. package/dist/_types/actions/auth/getOAuthLoginUrl.d.ts.map +1 -0
  203. package/dist/_types/actions/auth/getParentOrgId.d.ts +17 -0
  204. package/dist/_types/actions/auth/getParentOrgId.d.ts.map +1 -0
  205. package/dist/_types/actions/auth/getWhoami.d.ts +9 -2
  206. package/dist/_types/actions/auth/getWhoami.d.ts.map +1 -1
  207. package/dist/_types/actions/auth/index.d.ts +5 -2
  208. package/dist/_types/actions/auth/index.d.ts.map +1 -1
  209. package/dist/_types/actions/auth/loginWithStamp.d.ts +2 -5
  210. package/dist/_types/actions/auth/loginWithStamp.d.ts.map +1 -1
  211. package/dist/_types/actions/auth/registerWithOTP.d.ts +10 -3
  212. package/dist/_types/actions/auth/registerWithOTP.d.ts.map +1 -1
  213. package/dist/_types/actions/auth/registerWithPasskey.d.ts +0 -7
  214. package/dist/_types/actions/auth/registerWithPasskey.d.ts.map +1 -1
  215. package/dist/_types/actions/index.d.ts +2 -2
  216. package/dist/_types/actions/index.d.ts.map +1 -1
  217. package/dist/_types/actions/wallet/index.d.ts +4 -1
  218. package/dist/_types/actions/wallet/index.d.ts.map +1 -1
  219. package/dist/_types/actions/wallet/sign7702Authorization.d.ts +19 -0
  220. package/dist/_types/actions/wallet/sign7702Authorization.d.ts.map +1 -0
  221. package/dist/_types/actions/wallet/signMessage.d.ts +19 -0
  222. package/dist/_types/actions/wallet/signMessage.d.ts.map +1 -0
  223. package/dist/_types/actions/wallet/signTransaction.d.ts +1 -19
  224. package/dist/_types/actions/wallet/signTransaction.d.ts.map +1 -1
  225. package/dist/_types/actions/wallet/signTypedDataV4.d.ts +21 -0
  226. package/dist/_types/actions/wallet/signTypedDataV4.d.ts.map +1 -0
  227. package/dist/_types/actions/wallet/signUserOperation.d.ts +21 -0
  228. package/dist/_types/actions/wallet/signUserOperation.d.ts.map +1 -0
  229. package/dist/_types/actions/wallet/signingUtils.d.ts +32 -0
  230. package/dist/_types/actions/wallet/signingUtils.d.ts.map +1 -0
  231. package/dist/_types/adapters/viem.d.ts +1 -1
  232. package/dist/_types/adapters/viem.d.ts.map +1 -1
  233. package/dist/_types/client/authProxy.d.ts +13 -7
  234. package/dist/_types/client/authProxy.d.ts.map +1 -1
  235. package/dist/_types/client/decorators/client.d.ts +32 -6
  236. package/dist/_types/client/decorators/client.d.ts.map +1 -1
  237. package/dist/_types/client/index.d.ts +1 -1
  238. package/dist/_types/client/index.d.ts.map +1 -1
  239. package/dist/_types/client/transports/createTransport.d.ts +2 -0
  240. package/dist/_types/client/transports/createTransport.d.ts.map +1 -1
  241. package/dist/_types/client/transports/rest.d.ts +13 -5
  242. package/dist/_types/client/transports/rest.d.ts.map +1 -1
  243. package/dist/_types/client/types.d.ts +9 -9
  244. package/dist/_types/client/types.d.ts.map +1 -1
  245. package/dist/_types/constants.d.ts +3 -3
  246. package/dist/_types/constants.d.ts.map +1 -1
  247. package/dist/_types/core/{createZeroDevWallet.d.ts → createZeroDevWalletCore.d.ts} +30 -10
  248. package/dist/_types/core/createZeroDevWalletCore.d.ts.map +1 -0
  249. package/dist/_types/index.d.ts +7 -7
  250. package/dist/_types/index.d.ts.map +1 -1
  251. package/dist/_types/index.native.d.ts +19 -0
  252. package/dist/_types/index.native.d.ts.map +1 -0
  253. package/dist/_types/native/createZeroDevWallet.d.ts +12 -0
  254. package/dist/_types/native/createZeroDevWallet.d.ts.map +1 -0
  255. package/dist/_types/native/stampers/passkey.d.ts +5 -0
  256. package/dist/_types/native/stampers/passkey.d.ts.map +1 -0
  257. package/dist/_types/native/stampers/secureStore.d.ts +3 -0
  258. package/dist/_types/native/stampers/secureStore.d.ts.map +1 -0
  259. package/dist/_types/native/storage/asyncStorage.d.ts +3 -0
  260. package/dist/_types/native/storage/asyncStorage.d.ts.map +1 -0
  261. package/dist/_types/stampers/iframeStamper.d.ts.map +1 -1
  262. package/dist/_types/stampers/indexedDbStamper.d.ts +2 -2
  263. package/dist/_types/stampers/indexedDbStamper.d.ts.map +1 -1
  264. package/dist/_types/stampers/noopPasskeyStamper.d.ts +8 -0
  265. package/dist/_types/stampers/noopPasskeyStamper.d.ts.map +1 -0
  266. package/dist/_types/stampers/types.d.ts +39 -5
  267. package/dist/_types/stampers/types.d.ts.map +1 -1
  268. package/dist/_types/stampers/webauthnStamper.d.ts +2 -2
  269. package/dist/_types/stampers/webauthnStamper.d.ts.map +1 -1
  270. package/dist/_types/stubs/native-on-web.d.ts +6 -0
  271. package/dist/_types/stubs/native-on-web.d.ts.map +1 -0
  272. package/dist/_types/types/session.d.ts +2 -3
  273. package/dist/_types/types/session.d.ts.map +1 -1
  274. package/dist/_types/utils/buildClientSignature.d.ts +3 -3
  275. package/dist/_types/utils/buildClientSignature.d.ts.map +1 -1
  276. package/dist/_types/utils/encryptOtpAttempt.d.ts +40 -0
  277. package/dist/_types/utils/encryptOtpAttempt.d.ts.map +1 -0
  278. package/dist/_types/utils/exportPrivateKey.d.ts +1 -1
  279. package/dist/_types/utils/exportPrivateKey.d.ts.map +1 -1
  280. package/dist/_types/utils/exportWallet.d.ts +1 -1
  281. package/dist/_types/utils/exportWallet.d.ts.map +1 -1
  282. package/dist/_types/utils/hpke.d.ts +38 -0
  283. package/dist/_types/utils/hpke.d.ts.map +1 -0
  284. package/dist/_types/utils/platform.d.ts +2 -0
  285. package/dist/_types/utils/platform.d.ts.map +1 -0
  286. package/dist/_types/utils/resolveOrganizationId.d.ts +16 -0
  287. package/dist/_types/utils/resolveOrganizationId.d.ts.map +1 -0
  288. package/dist/_types/utils/utils.d.ts.map +1 -1
  289. package/dist/_types/web/createZeroDevWallet.d.ts +18 -0
  290. package/dist/_types/web/createZeroDevWallet.d.ts.map +1 -0
  291. package/dist/tsconfig.build.tsbuildinfo +1 -1
  292. package/package.json +100 -11
  293. package/src/actions/auth/authenticateWithEmail.ts +1 -9
  294. package/src/actions/auth/authenticateWithOAuth.ts +12 -7
  295. package/src/actions/auth/getAuthProxyConfigId.ts +20 -0
  296. package/src/actions/auth/getAuthenticators.ts +89 -0
  297. package/src/actions/auth/getOAuthLoginUrl.ts +48 -0
  298. package/src/actions/auth/getParentOrgId.ts +25 -0
  299. package/src/actions/auth/getWhoami.ts +33 -6
  300. package/src/actions/auth/index.ts +21 -5
  301. package/src/actions/auth/loginWithStamp.ts +11 -12
  302. package/src/actions/auth/registerWithOTP.ts +11 -5
  303. package/src/actions/auth/registerWithPasskey.ts +1 -10
  304. package/src/actions/index.ts +26 -7
  305. package/src/actions/wallet/getUserWallet.ts +5 -5
  306. package/src/actions/wallet/index.ts +22 -4
  307. package/src/actions/wallet/sign7702Authorization.ts +48 -0
  308. package/src/actions/wallet/signMessage.ts +47 -0
  309. package/src/actions/wallet/signTransaction.ts +19 -38
  310. package/src/actions/wallet/signTypedDataV4.ts +52 -0
  311. package/src/actions/wallet/signUserOperation.ts +56 -0
  312. package/src/actions/wallet/signingUtils.ts +110 -0
  313. package/src/adapters/viem.ts +75 -43
  314. package/src/client/authProxy.ts +14 -8
  315. package/src/client/createClient.ts +6 -6
  316. package/src/client/decorators/client.ts +78 -19
  317. package/src/client/index.ts +4 -1
  318. package/src/client/transports/createTransport.ts +8 -5
  319. package/src/client/transports/rest.ts +57 -34
  320. package/src/client/types.ts +9 -9
  321. package/src/constants.ts +12 -4
  322. package/src/core/{createZeroDevWallet.ts → createZeroDevWalletCore.ts} +147 -122
  323. package/src/index.native.ts +102 -0
  324. package/src/index.ts +49 -16
  325. package/src/native/createZeroDevWallet.ts +26 -0
  326. package/src/native/stampers/passkey.ts +39 -0
  327. package/src/native/stampers/secureStore.ts +139 -0
  328. package/src/native/storage/asyncStorage.ts +18 -0
  329. package/src/stampers/iframeStamper.ts +3 -0
  330. package/src/stampers/indexedDbStamper.ts +27 -4
  331. package/src/stampers/noopPasskeyStamper.ts +21 -0
  332. package/src/stampers/types.ts +39 -5
  333. package/src/stampers/webauthnStamper.ts +27 -6
  334. package/src/stubs/native-on-web.ts +29 -0
  335. package/src/types/session.ts +2 -3
  336. package/src/utils/buildClientSignature.ts +3 -3
  337. package/src/utils/encryptOtpAttempt.ts +142 -0
  338. package/src/utils/exportPrivateKey.ts +2 -2
  339. package/src/utils/exportWallet.ts +66 -75
  340. package/src/utils/hpke.ts +219 -0
  341. package/src/utils/platform.ts +21 -0
  342. package/src/utils/resolveOrganizationId.ts +28 -0
  343. package/src/utils/utils.ts +5 -6
  344. package/src/web/createZeroDevWallet.ts +45 -0
  345. package/dist/_cjs/actions/auth/getUserEmail.js +0 -19
  346. package/dist/_cjs/actions/auth/getUserEmail.js.map +0 -1
  347. package/dist/_cjs/actions/wallet/signRawPayload.js +0 -27
  348. package/dist/_cjs/actions/wallet/signRawPayload.js.map +0 -1
  349. package/dist/_cjs/core/createZeroDevWallet.js.map +0 -1
  350. package/dist/_cjs/stampers/index.js +0 -10
  351. package/dist/_cjs/stampers/index.js.map +0 -1
  352. package/dist/_esm/actions/auth/getUserEmail.js +0 -33
  353. package/dist/_esm/actions/auth/getUserEmail.js.map +0 -1
  354. package/dist/_esm/actions/wallet/signRawPayload.js +0 -42
  355. package/dist/_esm/actions/wallet/signRawPayload.js.map +0 -1
  356. package/dist/_esm/core/createZeroDevWallet.js.map +0 -1
  357. package/dist/_esm/stampers/index.js +0 -4
  358. package/dist/_esm/stampers/index.js.map +0 -1
  359. package/dist/_types/actions/auth/getUserEmail.d.ts +0 -32
  360. package/dist/_types/actions/auth/getUserEmail.d.ts.map +0 -1
  361. package/dist/_types/actions/wallet/signRawPayload.d.ts +0 -39
  362. package/dist/_types/actions/wallet/signRawPayload.d.ts.map +0 -1
  363. package/dist/_types/core/createZeroDevWallet.d.ts.map +0 -1
  364. package/dist/_types/stampers/index.d.ts +0 -5
  365. package/dist/_types/stampers/index.d.ts.map +0 -1
  366. package/src/actions/auth/getUserEmail.ts +0 -52
  367. package/src/actions/wallet/signRawPayload.ts +0 -75
  368. package/src/stampers/index.ts +0 -8
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asyncStorage.js","sourceRoot":"","sources":["../../../../src/native/storage/asyncStorage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,cAAc,MAAM,2CAA2C,CAAA;AAG3E,iFAAiF;AACjF,gFAAgF;AAChF,4EAA4E;AAC5E,8EAA8E;AAC9E,iDAAiD;AACjD,MAAM,YAAY,GAChB,cACD,CAAC,OAAO,CAAA;AAET,MAAM,CAAC,MAAM,mBAAmB,GAAmB;IACjD,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC;IAC3C,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC;IACzD,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC;CAClD,CAAA"}
@@ -27,6 +27,9 @@ export async function createIframeStamper(cfg) {
27
27
  async injectKeyExportBundle(bundle, organizationId, keyFormat) {
28
28
  return await inner.injectKeyExportBundle(bundle, organizationId, keyFormat ? KeyFormat[keyFormat] : KeyFormat.Hexadecimal);
29
29
  },
30
+ async applySettings(settings) {
31
+ return await inner.applySettings(settings);
32
+ },
30
33
  };
31
34
  }
32
35
  //# sourceMappingURL=iframeStamper.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"iframeStamper.js","sourceRoot":"","sources":["../../../src/stampers/iframeStamper.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,aAAa,IAAI,oBAAoB,GACtC,MAAM,yBAAyB,CAAA;AAGhC,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAIzC;IACC,MAAM,KAAK,GAAG,IAAI,oBAAoB,CAAC;QACrC,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,eAAe,EAAE,GAAG,CAAC,eAAe;QACpC,eAAe,EAAE,GAAG,CAAC,eAAe;KACrC,CAAC,CAAA;IAEF,OAAO;QACL,KAAK,CAAC,IAAI;YACR,OAAO,MAAM,KAAK,CAAC,IAAI,EAAE,CAAA;QAC3B,CAAC;QACD,KAAK,CAAC,sBAAsB,CAAC,MAAc;YACzC,OAAO,MAAM,KAAK,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAA;QACnD,CAAC;QACD,KAAK,CAAC,YAAY;YAChB,OAAO,MAAM,KAAK,CAAC,oBAAoB,EAAE,CAAA;QAC3C,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,OAAe;YACzB,OAAO,MAAM,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACnC,CAAC;QACD,KAAK,CAAC,KAAK;YACT,MAAM,KAAK,CAAC,KAAK,EAAE,CAAA;QACrB,CAAC;QACD,KAAK,CAAC,wBAAwB,CAAC,MAAc,EAAE,cAAsB;YACnE,OAAO,MAAM,KAAK,CAAC,wBAAwB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;QACrE,CAAC;QACD,KAAK,CAAC,qBAAqB,CACzB,MAAc,EACd,cAAsB,EACtB,SAAyB;YAEzB,OAAO,MAAM,KAAK,CAAC,qBAAqB,CACtC,MAAM,EACN,cAAc,EACd,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CACzD,CAAA;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"iframeStamper.js","sourceRoot":"","sources":["../../../src/stampers/iframeStamper.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,aAAa,IAAI,oBAAoB,GACtC,MAAM,yBAAyB,CAAA;AAGhC,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAIzC;IACC,MAAM,KAAK,GAAG,IAAI,oBAAoB,CAAC;QACrC,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,eAAe,EAAE,GAAG,CAAC,eAAe;QACpC,eAAe,EAAE,GAAG,CAAC,eAAe;KACrC,CAAC,CAAA;IAEF,OAAO;QACL,KAAK,CAAC,IAAI;YACR,OAAO,MAAM,KAAK,CAAC,IAAI,EAAE,CAAA;QAC3B,CAAC;QACD,KAAK,CAAC,sBAAsB,CAAC,MAAc;YACzC,OAAO,MAAM,KAAK,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAA;QACnD,CAAC;QACD,KAAK,CAAC,YAAY;YAChB,OAAO,MAAM,KAAK,CAAC,oBAAoB,EAAE,CAAA;QAC3C,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,OAAe;YACzB,OAAO,MAAM,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACnC,CAAC;QACD,KAAK,CAAC,KAAK;YACT,MAAM,KAAK,CAAC,KAAK,EAAE,CAAA;QACrB,CAAC;QACD,KAAK,CAAC,wBAAwB,CAAC,MAAc,EAAE,cAAsB;YACnE,OAAO,MAAM,KAAK,CAAC,wBAAwB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;QACrE,CAAC;QACD,KAAK,CAAC,qBAAqB,CACzB,MAAc,EACd,cAAsB,EACtB,SAAyB;YAEzB,OAAO,MAAM,KAAK,CAAC,qBAAqB,CACtC,MAAM,EACN,cAAc,EACd,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CACzD,CAAA;QACH,CAAC;QACD,KAAK,CAAC,aAAa,CAAC,QAA6C;YAC/D,OAAO,MAAM,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;QAC5C,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -1,7 +1,9 @@
1
1
  import { IndexedDbStamper as TurnkeyIndexedDbStamper } from '@turnkey/indexed-db-stamper';
2
+ import { generateCompressedPublicKeyFromKeyPair } from '../utils/utils.js';
2
3
  export async function createIndexedDbStamper() {
3
4
  const inner = new TurnkeyIndexedDbStamper();
4
5
  await inner.init();
6
+ let pendingKeyPair = null;
5
7
  return {
6
8
  async getPublicKey() {
7
9
  return await inner.getPublicKey();
@@ -9,11 +11,27 @@ export async function createIndexedDbStamper() {
9
11
  async stamp(payload) {
10
12
  return await inner.stamp(payload);
11
13
  },
14
+ async sign(payload) {
15
+ return await inner.sign(payload);
16
+ },
12
17
  async clear() {
13
18
  await inner.clear();
14
19
  },
15
- async resetKeyPair(externalKeyPair) {
16
- await inner.resetKeyPair(externalKeyPair);
20
+ async resetKeyPair() {
21
+ pendingKeyPair = null;
22
+ await inner.resetKeyPair();
23
+ },
24
+ async prepareKeyRotation() {
25
+ const keyPair = await crypto.subtle.generateKey({ name: 'ECDSA', namedCurve: 'P-256' }, false, ['sign', 'verify']);
26
+ pendingKeyPair = keyPair;
27
+ return await generateCompressedPublicKeyFromKeyPair(keyPair);
28
+ },
29
+ async commitKeyRotation() {
30
+ if (!pendingKeyPair) {
31
+ throw new Error('No pending key rotation to commit');
32
+ }
33
+ await inner.resetKeyPair(pendingKeyPair);
34
+ pendingKeyPair = null;
17
35
  },
18
36
  };
19
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"indexedDbStamper.js","sourceRoot":"","sources":["../../../src/stampers/indexedDbStamper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,IAAI,uBAAuB,EAAE,MAAM,6BAA6B,CAAA;AAGzF,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,MAAM,KAAK,GAAG,IAAI,uBAAuB,EAAE,CAAA;IAC3C,MAAM,KAAK,CAAC,IAAI,EAAE,CAAA;IAElB,OAAO;QACL,KAAK,CAAC,YAAY;YAChB,OAAO,MAAM,KAAK,CAAC,YAAY,EAAE,CAAA;QACnC,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,OAAe;YACzB,OAAO,MAAM,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACnC,CAAC;QACD,KAAK,CAAC,KAAK;YACT,MAAM,KAAK,CAAC,KAAK,EAAE,CAAA;QACrB,CAAC;QACD,KAAK,CAAC,YAAY,CAAC,eAA+B;YAChD,MAAM,KAAK,CAAC,YAAY,CAAC,eAAe,CAAC,CAAA;QAC3C,CAAC;KACF,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"indexedDbStamper.js","sourceRoot":"","sources":["../../../src/stampers/indexedDbStamper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,IAAI,uBAAuB,EAAE,MAAM,6BAA6B,CAAA;AACzF,OAAO,EAAE,sCAAsC,EAAE,MAAM,mBAAmB,CAAA;AAG1E,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,MAAM,KAAK,GAAG,IAAI,uBAAuB,EAAE,CAAA;IAC3C,MAAM,KAAK,CAAC,IAAI,EAAE,CAAA;IAElB,IAAI,cAAc,GAAyB,IAAI,CAAA;IAE/C,OAAO;QACL,KAAK,CAAC,YAAY;YAChB,OAAO,MAAM,KAAK,CAAC,YAAY,EAAE,CAAA;QACnC,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,OAAe;YACzB,OAAO,MAAM,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACnC,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,OAAe;YACxB,OAAO,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAClC,CAAC;QACD,KAAK,CAAC,KAAK;YACT,MAAM,KAAK,CAAC,KAAK,EAAE,CAAA;QACrB,CAAC;QACD,KAAK,CAAC,YAAY;YAChB,cAAc,GAAG,IAAI,CAAA;YACrB,MAAM,KAAK,CAAC,YAAY,EAAE,CAAA;QAC5B,CAAC;QACD,KAAK,CAAC,kBAAkB;YACtB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,WAAW,CAC7C,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,EACtC,KAAK,EACL,CAAC,MAAM,EAAE,QAAQ,CAAC,CACnB,CAAA;YACD,cAAc,GAAG,OAAO,CAAA;YACxB,OAAO,MAAM,sCAAsC,CAAC,OAAO,CAAC,CAAA;QAC9D,CAAC;QACD,KAAK,CAAC,iBAAiB;YACrB,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;YACtD,CAAC;YACD,MAAM,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,CAAA;YACxC,cAAc,GAAG,IAAI,CAAA;QACvB,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,18 @@
1
+ const NOT_CONFIGURED_MESSAGE = 'passkeyStamper is not configured. Pass passkeyStamper to zeroDevWallet({ ... }) — use createReactNativePasskeyStamper({ rpId }) on React Native or createWebauthnStamper({ rpId }) on web.';
2
+ /**
3
+ * Internal fallback used when a consumer doesn't supply a `passkeyStamper`.
4
+ * Methods throw on use, so passkey register/login fails with an actionable
5
+ * message — all other flows (apiKey signing, OAuth, OTP) are unaffected.
6
+ */
7
+ export function createNoopPasskeyStamper() {
8
+ return {
9
+ async stamp() {
10
+ throw new Error(NOT_CONFIGURED_MESSAGE);
11
+ },
12
+ async register() {
13
+ throw new Error(NOT_CONFIGURED_MESSAGE);
14
+ },
15
+ async clear() { },
16
+ };
17
+ }
18
+ //# sourceMappingURL=noopPasskeyStamper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noopPasskeyStamper.js","sourceRoot":"","sources":["../../../src/stampers/noopPasskeyStamper.ts"],"names":[],"mappings":"AAEA,MAAM,sBAAsB,GAC1B,4LAA4L,CAAA;AAE9L;;;;GAIG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO;QACL,KAAK,CAAC,KAAK;YACT,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAA;QACzC,CAAC;QACD,KAAK,CAAC,QAAQ;YACZ,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAA;QACzC,CAAC;QACD,KAAK,CAAC,KAAK,KAAI,CAAC;KACjB,CAAA;AACH,CAAC"}
@@ -1,15 +1,34 @@
1
+ import { getWebAuthnAttestation } from '@turnkey/http';
1
2
  import { WebauthnStamper as TurnkeyWebauthnStamper } from '@turnkey/webauthn-stamper';
3
+ import { base64UrlEncode, generateRandomBuffer } from '../utils/utils.js';
2
4
  export async function createWebauthnStamper({ rpId, }) {
3
5
  const inner = new TurnkeyWebauthnStamper({ rpId });
4
6
  return {
5
- async getPublicKey() {
6
- // return await inner.();
7
- return null;
8
- },
9
7
  async stamp(payload) {
10
8
  return await inner.stamp(payload);
11
9
  },
12
10
  async clear() { },
11
+ async register(options) {
12
+ const challenge = generateRandomBuffer();
13
+ const encodedChallenge = base64UrlEncode(challenge);
14
+ const authenticatorUserId = generateRandomBuffer();
15
+ const attestation = await getWebAuthnAttestation({
16
+ publicKey: {
17
+ rp: options.rp,
18
+ challenge,
19
+ pubKeyCredParams: [
20
+ { type: 'public-key', alg: -7 },
21
+ { type: 'public-key', alg: -257 },
22
+ ],
23
+ user: {
24
+ id: authenticatorUserId,
25
+ name: options.userName,
26
+ displayName: options.userName,
27
+ },
28
+ },
29
+ });
30
+ return { attestation, encodedChallenge };
31
+ },
13
32
  };
14
33
  }
15
34
  //# sourceMappingURL=webauthnStamper.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"webauthnStamper.js","sourceRoot":"","sources":["../../../src/stampers/webauthnStamper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,IAAI,sBAAsB,EAAE,MAAM,2BAA2B,CAAA;AAGrF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,EAC1C,IAAI,GAGL;IACC,MAAM,KAAK,GAAG,IAAI,sBAAsB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;IAElD,OAAO;QACL,KAAK,CAAC,YAAY;YAChB,2BAA2B;YAC3B,OAAO,IAAI,CAAA;QACb,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,OAAe;YACzB,OAAO,MAAM,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACnC,CAAC;QACD,KAAK,CAAC,KAAK,KAAI,CAAC;KACjB,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"webauthnStamper.js","sourceRoot":"","sources":["../../../src/stampers/webauthnStamper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,EAAE,eAAe,IAAI,sBAAsB,EAAE,MAAM,2BAA2B,CAAA;AACrF,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAGzE,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,EAC1C,IAAI,GAGL;IACC,MAAM,KAAK,GAAG,IAAI,sBAAsB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;IAElD,OAAO;QACL,KAAK,CAAC,KAAK,CAAC,OAAe;YACzB,OAAO,MAAM,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACnC,CAAC;QACD,KAAK,CAAC,KAAK,KAAI,CAAC;QAChB,KAAK,CAAC,QAAQ,CAAC,OAAmC;YAChD,MAAM,SAAS,GAAG,oBAAoB,EAAE,CAAA;YACxC,MAAM,gBAAgB,GAAG,eAAe,CAAC,SAAS,CAAC,CAAA;YACnD,MAAM,mBAAmB,GAAG,oBAAoB,EAAE,CAAA;YAElD,MAAM,WAAW,GAAG,MAAM,sBAAsB,CAAC;gBAC/C,SAAS,EAAE;oBACT,EAAE,EAAE,OAAO,CAAC,EAAE;oBACd,SAAS;oBACT,gBAAgB,EAAE;wBAChB,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE;wBAC/B,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE;qBAClC;oBACD,IAAI,EAAE;wBACJ,EAAE,EAAE,mBAAmB;wBACvB,IAAI,EAAE,OAAO,CAAC,QAAQ;wBACtB,WAAW,EAAE,OAAO,CAAC,QAAQ;qBAC9B;iBACF;aACF,CAAC,CAAA;YAEF,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAA;QAC1C,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,25 @@
1
+ // Catch-all stub used by every `./react-native/*` subpath in this package
2
+ // under the `browser` and `node` exports conditions. Both are needed for
3
+ // Expo web: the client bundle resolves with `browser` active, while Expo
4
+ // Router's SSR/RSC route render drops platform conditions (no `browser`)
5
+ // and turns on `node` instead — so the web stub has to be gated on both or
6
+ // the SSR pass falls through to the native impl. Imports must be safe on web
7
+ // (some route files are bundled even when they aren't rendered) so we expose
8
+ // the RN-only symbols as throw-on-use functions instead of throwing at
9
+ // module-init time.
10
+ //
11
+ // Anyone who *uses* these on web gets a clear actionable error; anyone who
12
+ // merely imports them (typically because their universal app bundles the
13
+ // native variant too) is unaffected.
14
+ const message = '@zerodev/wallet-core react-native subpaths cannot be imported in a web environment. Use the bare specifier (`import { ... } from "@zerodev/wallet-core"`) instead.';
15
+ function throwOnUse() {
16
+ throw new Error(message);
17
+ }
18
+ export const createSecureStoreStamper = throwOnUse;
19
+ export const createReactNativePasskeyStamper = throwOnUse;
20
+ export const asyncStorageAdapter = throwOnUse;
21
+ // For the broad `./react-native` entry: any consumer reaching it on web is
22
+ // already off-pattern (they should use the bare specifier). Default export
23
+ // covers `import X from '...'`.
24
+ export default throwOnUse;
25
+ //# sourceMappingURL=native-on-web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-on-web.js","sourceRoot":"","sources":["../../../src/stubs/native-on-web.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,yEAAyE;AACzE,yEAAyE;AACzE,yEAAyE;AACzE,2EAA2E;AAC3E,6EAA6E;AAC7E,6EAA6E;AAC7E,uEAAuE;AACvE,oBAAoB;AACpB,EAAE;AACF,2EAA2E;AAC3E,yEAAyE;AACzE,qCAAqC;AAErC,MAAM,OAAO,GACX,oKAAoK,CAAA;AAEtK,SAAS,UAAU;IACjB,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAA;AAC1B,CAAC;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG,UAAU,CAAA;AAClD,MAAM,CAAC,MAAM,+BAA+B,GAAG,UAAU,CAAA;AACzD,MAAM,CAAC,MAAM,mBAAmB,GAAG,UAAU,CAAA;AAE7C,2EAA2E;AAC3E,2EAA2E;AAC3E,gCAAgC;AAChC,eAAe,UAAU,CAAA"}
@@ -0,0 +1,81 @@
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
+ import { p256 } from '@noble/curves/nist.js';
20
+ import { bytesToHex, hexToBytes } from '@noble/hashes/utils.js';
21
+ import { TURNKEY_TLS_FETCHER_SIGN_PUBLIC_KEY } from '../constants.js';
22
+ import { hpkeSealP256 } from './hpke.js';
23
+ const BUNDLE_DATA_VERSION = 'v1.0.0';
24
+ /**
25
+ * Returns a JSON string ready to be sent as `encryptedOtpBundle` on
26
+ * `POST /v1/otp_verify_v2`.
27
+ */
28
+ export async function encryptOtpAttempt({ otpCode, publicKey, encryptionTargetBundle, dangerouslyOverrideSignerPublicKey, }) {
29
+ const expectedSignerHex = dangerouslyOverrideSignerPublicKey ?? TURNKEY_TLS_FETCHER_SIGN_PUBLIC_KEY;
30
+ let envelope;
31
+ try {
32
+ envelope = JSON.parse(encryptionTargetBundle);
33
+ }
34
+ catch (err) {
35
+ throw new Error(`encryptOtpAttempt: failed to parse encryption target bundle: ${err.message}`);
36
+ }
37
+ if (envelope.version !== BUNDLE_DATA_VERSION) {
38
+ throw new Error(`encryptOtpAttempt: unsupported bundle version ${envelope.version}`);
39
+ }
40
+ if (envelope.enclaveQuorumPublic.toLowerCase() !==
41
+ expectedSignerHex.toLowerCase()) {
42
+ throw new Error('encryptOtpAttempt: enclave quorum public key does not match pinned signing key');
43
+ }
44
+ const dataBytes = hexToBytes(envelope.data);
45
+ const signatureBytes = hexToBytes(envelope.dataSignature);
46
+ const signerPublicKeyBytes = hexToBytes(envelope.enclaveQuorumPublic);
47
+ // The Go side does sha256(data) then ASN.1 DER ECDSA verify, without
48
+ // enforcing low-S. Match that here.
49
+ const valid = p256.verify(signatureBytes, dataBytes, signerPublicKeyBytes, {
50
+ prehash: true,
51
+ format: 'der',
52
+ lowS: false,
53
+ });
54
+ if (!valid) {
55
+ throw new Error('encryptOtpAttempt: invalid enclave signature on bundle');
56
+ }
57
+ let signedData;
58
+ try {
59
+ signedData = JSON.parse(new TextDecoder().decode(dataBytes));
60
+ }
61
+ catch (err) {
62
+ throw new Error(`encryptOtpAttempt: failed to parse signed bundle data: ${err.message}`);
63
+ }
64
+ if (!signedData.targetPublic) {
65
+ throw new Error('encryptOtpAttempt: missing targetPublic in signed data');
66
+ }
67
+ const targetPublicKey = hexToBytes(signedData.targetPublic);
68
+ // Plaintext shape matches what the Go example marshals:
69
+ // { otp_code: string, public_key: string }
70
+ const plaintext = new TextEncoder().encode(JSON.stringify({ otp_code: otpCode, public_key: publicKey }));
71
+ const { encappedPublic, ciphertext } = await hpkeSealP256({
72
+ receiverPublicKey: targetPublicKey,
73
+ plaintext,
74
+ });
75
+ // Wire format = the Go SDK's `ClientSendMsg`: Bytes fields hex-encoded.
76
+ return JSON.stringify({
77
+ encappedPublic: bytesToHex(encappedPublic),
78
+ ciphertext: bytesToHex(ciphertext),
79
+ });
80
+ }
81
+ //# sourceMappingURL=encryptOtpAttempt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encryptOtpAttempt.js","sourceRoot":"","sources":["../../../src/utils/encryptOtpAttempt.ts"],"names":[],"mappings":"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"}
@@ -53,7 +53,7 @@ export async function exportPrivateKey(params) {
53
53
  targetPublicKey,
54
54
  },
55
55
  });
56
- const stamperKey = session.stamperType === 'indexedDb' ? 'indexedDbStamper' : 'webauthnStamper';
56
+ const stamperKey = session.stamperType === 'apiKey' ? 'apiKeyStamper' : 'passkeyStamper';
57
57
  const stamper = wallet.client[stamperKey];
58
58
  if (!stamper) {
59
59
  throw new Error(`Stamper '${stamperKey}' not found on wallet.client`);
@@ -1 +1 @@
1
- {"version":3,"file":"exportPrivateKey.js","sourceRoot":"","sources":["../../../src/utils/exportPrivateKey.ts"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAkC;IAElC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,CAAA;IAEjE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAA;IACzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;IACtC,CAAC;IACD,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAA;IAElC,4DAA4D;IAC5D,IAAI,OAAO,GAAG,YAAY,CAAA;IAC1B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAA;QACxC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;QAC9D,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAA;IAC3B,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,EAAE,qCAAqC;QAC3C,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;QAClC,cAAc,EAAE,cAAc;QAC9B,UAAU,EAAE;YACV,OAAO,EAAE,OAAO;YAChB,eAAe;SAChB;KACF,CAAC,CAAA;IAEF,MAAM,UAAU,GACd,OAAO,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,iBAAiB,CAAA;IAC9E,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IACzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,YAAY,UAAU,8BAA8B,CAAC,CAAA;IACvE,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IACnD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAChD,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,KAAK,CAChC,gEAAgE,EAChE;QACE,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE;YACP,CAAC,WAAW,CAAC,eAAe,CAAC,EAAE,WAAW,CAAC,gBAAgB;SAC5D;KACF,CACF,CAAA;IACD,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,CAAA;QAC7C,MAAM,IAAI,KAAK,CACb,oCAAoC,cAAc,CAAC,MAAM,IAAI,SAAS,EAAE,CACzE,CAAA;IACH,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,CAAA;IAE9C,MAAM,YAAY,GAChB,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,yBAAyB,EAAE,YAAY,CAAA;IAEvE,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,wCAAwC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CACrE,CAAA;IACH,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,OAAQ,EAAE,cAAc,EAAE,CAAA;AAC5D,CAAC"}
1
+ {"version":3,"file":"exportPrivateKey.js","sourceRoot":"","sources":["../../../src/utils/exportPrivateKey.ts"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAkC;IAElC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,CAAA;IAEjE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAA;IACzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;IACtC,CAAC;IACD,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAA;IAElC,4DAA4D;IAC5D,IAAI,OAAO,GAAG,YAAY,CAAA;IAC1B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAA;QACxC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;QAC9D,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAA;IAC3B,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,EAAE,qCAAqC;QAC3C,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;QAClC,cAAc,EAAE,cAAc;QAC9B,UAAU,EAAE;YACV,OAAO,EAAE,OAAO;YAChB,eAAe;SAChB;KACF,CAAC,CAAA;IAEF,MAAM,UAAU,GACd,OAAO,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,gBAAgB,CAAA;IACvE,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IACzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,YAAY,UAAU,8BAA8B,CAAC,CAAA;IACvE,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IACnD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAChD,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,KAAK,CAChC,gEAAgE,EAChE;QACE,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE;YACP,CAAC,WAAW,CAAC,eAAe,CAAC,EAAE,WAAW,CAAC,gBAAgB;SAC5D;KACF,CACF,CAAA;IACD,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,CAAA;QAC7C,MAAM,IAAI,KAAK,CACb,oCAAoC,cAAc,CAAC,MAAM,IAAI,SAAS,EAAE,CACzE,CAAA;IACH,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,CAAA;IAE9C,MAAM,YAAY,GAChB,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,yBAAyB,EAAE,YAAY,CAAA;IAEvE,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,wCAAwC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CACrE,CAAA;IACH,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,OAAQ,EAAE,cAAc,EAAE,CAAA;AAC5D,CAAC"}
@@ -31,68 +31,59 @@
31
31
  */
32
32
  export async function exportWallet(params) {
33
33
  const { targetPublicKey, wallet } = params;
34
- try {
35
- const session = await wallet.getSession();
36
- if (!session) {
37
- throw new Error('Session not found');
38
- }
39
- const { organizationId } = session;
40
- const listWalletsBody = JSON.stringify({
41
- organizationId,
42
- });
43
- const listWalletsStamp = await wallet.client[session.stamperType === 'indexedDb'
44
- ? 'indexedDbStamper'
45
- : 'webauthnStamper'].stamp(listWalletsBody);
46
- if (!listWalletsStamp) {
47
- throw new Error('Failed to stamp list wallets body');
48
- }
49
- const listWalletsResponse = await fetch('https://api.turnkey.com/public/v1/query/list_wallets', {
50
- method: 'POST',
51
- body: listWalletsBody,
52
- headers: {
53
- [listWalletsStamp.stampHeaderName]: listWalletsStamp.stampHeaderValue,
54
- },
55
- });
56
- if (!listWalletsResponse.ok) {
57
- throw new Error('Failed to list wallets');
58
- }
59
- const listWalletsData = await listWalletsResponse.json();
60
- const walletId = listWalletsData.wallets[0].walletId;
61
- const exportWalletBody = JSON.stringify({
62
- type: 'ACTIVITY_TYPE_EXPORT_WALLET',
63
- timestampMs: Date.now().toString(),
64
- organizationId: organizationId,
65
- parameters: {
66
- walletId: walletId,
67
- targetPublicKey,
68
- language: 'MNEMONIC_LANGUAGE_ENGLISH',
69
- },
70
- });
71
- const exportWalletStamp = await wallet.client[session.stamperType === 'indexedDb'
72
- ? 'indexedDbStamper'
73
- : 'webauthnStamper'].stamp(exportWalletBody);
74
- if (!exportWalletStamp) {
75
- throw new Error('Failed to stamp export wallet body');
76
- }
77
- const exportWalletResponse = await fetch('https://api.turnkey.com/public/v1/submit/export_wallet', {
78
- method: 'POST',
79
- body: exportWalletBody,
80
- headers: {
81
- [exportWalletStamp.stampHeaderName]: exportWalletStamp.stampHeaderValue,
82
- },
83
- });
84
- if (!exportWalletResponse.ok) {
85
- throw new Error('Failed to export wallet');
86
- }
87
- const exportWalletData = await exportWalletResponse.json();
88
- const exportBundle = exportWalletData?.activity?.result?.exportWalletResult?.exportBundle;
89
- if (!exportBundle) {
90
- throw new Error('Export bundle not found in response');
91
- }
92
- return { exportBundle, walletId, organizationId };
34
+ const session = await wallet.getSession();
35
+ if (!session) {
36
+ throw new Error('Session not found');
93
37
  }
94
- catch (_) {
95
- throw new Error('Error exporting wallet');
38
+ const { organizationId } = session;
39
+ const listWalletsBody = JSON.stringify({
40
+ organizationId,
41
+ });
42
+ const listWalletsStamp = await wallet.client[session.stamperType === 'apiKey' ? 'apiKeyStamper' : 'passkeyStamper'].stamp(listWalletsBody);
43
+ if (!listWalletsStamp) {
44
+ throw new Error('Failed to stamp list wallets body');
96
45
  }
46
+ const listWalletsResponse = await fetch('https://api.turnkey.com/public/v1/query/list_wallets', {
47
+ method: 'POST',
48
+ body: listWalletsBody,
49
+ headers: {
50
+ [listWalletsStamp.stampHeaderName]: listWalletsStamp.stampHeaderValue,
51
+ },
52
+ });
53
+ if (!listWalletsResponse.ok) {
54
+ throw new Error('Failed to list wallets');
55
+ }
56
+ const listWalletsData = await listWalletsResponse.json();
57
+ const walletId = listWalletsData.wallets[0].walletId;
58
+ const exportWalletBody = JSON.stringify({
59
+ type: 'ACTIVITY_TYPE_EXPORT_WALLET',
60
+ timestampMs: Date.now().toString(),
61
+ organizationId: organizationId,
62
+ parameters: {
63
+ walletId: walletId,
64
+ targetPublicKey,
65
+ language: 'MNEMONIC_LANGUAGE_ENGLISH',
66
+ },
67
+ });
68
+ const exportWalletStamp = await wallet.client[session.stamperType === 'apiKey' ? 'apiKeyStamper' : 'passkeyStamper'].stamp(exportWalletBody);
69
+ if (!exportWalletStamp) {
70
+ throw new Error('Failed to stamp export wallet body');
71
+ }
72
+ const exportWalletResponse = await fetch('https://api.turnkey.com/public/v1/submit/export_wallet', {
73
+ method: 'POST',
74
+ body: exportWalletBody,
75
+ headers: {
76
+ [exportWalletStamp.stampHeaderName]: exportWalletStamp.stampHeaderValue,
77
+ },
78
+ });
79
+ if (!exportWalletResponse.ok) {
80
+ throw new Error('Failed to export wallet');
81
+ }
82
+ const exportWalletData = await exportWalletResponse.json();
83
+ const exportBundle = exportWalletData?.activity?.result?.exportWalletResult?.exportBundle;
84
+ if (!exportBundle) {
85
+ throw new Error('Export bundle not found in response');
86
+ }
87
+ return { exportBundle, walletId, organizationId };
97
88
  }
98
89
  //# sourceMappingURL=exportWallet.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"exportWallet.js","sourceRoot":"","sources":["../../../src/utils/exportWallet.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"exportWallet.js","sourceRoot":"","sources":["../../../src/utils/exportWallet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,119 @@
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 { gcm } from '@noble/ciphers/aes.js';
18
+ import { p256 } from '@noble/curves/nist.js';
19
+ import { expand, extract } from '@noble/hashes/hkdf.js';
20
+ import { sha256 } from '@noble/hashes/sha2.js';
21
+ const KEM_ID = 0x0010;
22
+ const KDF_ID = 0x0001;
23
+ const AEAD_ID = 0x0002;
24
+ // Output sizes for the chosen primitives.
25
+ const NH = 32; // SHA-256 output
26
+ const NK = 32; // AES-256 key
27
+ const NN = 12; // AES-GCM nonce
28
+ const NPK = 65; // uncompressed P-256 point: 0x04 || X || Y
29
+ const TURNKEY_HPKE_INFO = new TextEncoder().encode('turnkey_hpke');
30
+ const HPKE_VERSION = new TextEncoder().encode('HPKE-v1');
31
+ // suite_id for the HPKE context: "HPKE" || I2OSP(KEM,2) || I2OSP(KDF,2) || I2OSP(AEAD,2)
32
+ const HPKE_SUITE_ID = concat(new TextEncoder().encode('HPKE'), i2osp(KEM_ID, 2), i2osp(KDF_ID, 2), i2osp(AEAD_ID, 2));
33
+ // suite_id for the KEM scope: "KEM" || I2OSP(KEM,2)
34
+ const KEM_SUITE_ID = concat(new TextEncoder().encode('KEM'), i2osp(KEM_ID, 2));
35
+ function concat(...parts) {
36
+ const total = parts.reduce((sum, p) => sum + p.length, 0);
37
+ const out = new Uint8Array(total);
38
+ let offset = 0;
39
+ for (const p of parts) {
40
+ out.set(p, offset);
41
+ offset += p.length;
42
+ }
43
+ return out;
44
+ }
45
+ function i2osp(n, len) {
46
+ const out = new Uint8Array(len);
47
+ for (let i = len - 1; i >= 0; i--) {
48
+ out[i] = n & 0xff;
49
+ n >>>= 8;
50
+ }
51
+ return out;
52
+ }
53
+ // LabeledExtract(salt, label, ikm, suite_id) =
54
+ // HKDF-Extract(salt, "HPKE-v1" || suite_id || label || ikm)
55
+ function labeledExtract(salt, label, ikm, suiteId) {
56
+ const labeledIkm = concat(HPKE_VERSION, suiteId, new TextEncoder().encode(label), ikm);
57
+ return extract(sha256, labeledIkm, salt);
58
+ }
59
+ // LabeledExpand(prk, label, info, L, suite_id) =
60
+ // HKDF-Expand(prk, I2OSP(L,2) || "HPKE-v1" || suite_id || label || info, L)
61
+ function labeledExpand(prk, label, info, length, suiteId) {
62
+ const labeledInfo = concat(i2osp(length, 2), HPKE_VERSION, suiteId, new TextEncoder().encode(label), info);
63
+ return expand(sha256, prk, labeledInfo, length);
64
+ }
65
+ // DHKEM Encap: returns (sharedSecret, enc)
66
+ // sharedSecret is 32 bytes; enc is the serialized ephemeral pubkey (65 bytes uncompressed).
67
+ function encap(receiverPublicKey) {
68
+ const ephSk = p256.utils.randomSecretKey();
69
+ const ephPkUncompressed = p256.getPublicKey(ephSk, false);
70
+ // ECDH: returns the serialized shared point. Pass isCompressed=true so the
71
+ // first byte is the SEC1 prefix and bytes [1, 33) are the x-coordinate.
72
+ const sharedPoint = p256.getSharedSecret(ephSk, receiverPublicKey,
73
+ /* isCompressed */ true);
74
+ const dh = sharedPoint.slice(1, 33);
75
+ const kemContext = concat(ephPkUncompressed, receiverPublicKey);
76
+ const eaePrk = labeledExtract(new Uint8Array(0), 'eae_prk', dh, KEM_SUITE_ID);
77
+ const sharedSecret = labeledExpand(eaePrk, 'shared_secret', kemContext, NH, KEM_SUITE_ID);
78
+ return { sharedSecret, enc: ephPkUncompressed };
79
+ }
80
+ // KeySchedule for mode_base: returns (key, base_nonce).
81
+ function keySchedule(sharedSecret, info) {
82
+ const empty = new Uint8Array(0);
83
+ const pskIdHash = labeledExtract(empty, 'psk_id_hash', empty, HPKE_SUITE_ID);
84
+ const infoHash = labeledExtract(empty, 'info_hash', info, HPKE_SUITE_ID);
85
+ // mode_base = 0x00 prepended to (psk_id_hash || info_hash)
86
+ const keyScheduleContext = concat(new Uint8Array([0]), pskIdHash, infoHash);
87
+ const secret = labeledExtract(sharedSecret, 'secret', empty, HPKE_SUITE_ID);
88
+ const key = labeledExpand(secret, 'key', keyScheduleContext, NK, HPKE_SUITE_ID);
89
+ const baseNonce = labeledExpand(secret, 'base_nonce', keyScheduleContext, NN, HPKE_SUITE_ID);
90
+ return { key, baseNonce };
91
+ }
92
+ function aesGcmSeal(key, nonce, aad, plaintext) {
93
+ // Returns ciphertext || tag (16 bytes appended) — matches the single-blob
94
+ // format Turnkey's `Sealer.Seal` and Web Crypto's AES-GCM produce.
95
+ return gcm(key, nonce, aad).encrypt(plaintext);
96
+ }
97
+ /**
98
+ * Single-shot HPKE seal in mode_base for Turnkey's TLS Fetcher enclave.
99
+ *
100
+ * Uses the fixed Turnkey `info = "turnkey_hpke"` and the AAD shape
101
+ * `enc || receiverPublicKey` so the resulting bundle is decryptable by
102
+ * `enclave_encrypt.EnclaveEncryptServer.Decrypt`.
103
+ *
104
+ * @param receiverPublicKey - The enclave's ephemeral target public key
105
+ * (uncompressed P-256, 65 bytes), extracted from the encryption target bundle.
106
+ * @param plaintext - The bytes to encrypt (e.g. the JSON-encoded OTP attempt).
107
+ */
108
+ export async function hpkeSealP256({ receiverPublicKey, plaintext, }) {
109
+ if (receiverPublicKey.length !== NPK) {
110
+ throw new Error(`hpkeSealP256: receiverPublicKey must be ${NPK} bytes (uncompressed P-256), got ${receiverPublicKey.length}`);
111
+ }
112
+ const { sharedSecret, enc } = encap(receiverPublicKey);
113
+ const { key, baseNonce } = keySchedule(sharedSecret, TURNKEY_HPKE_INFO);
114
+ // First message of the context, sequence 0 → nonce = base_nonce.
115
+ const aad = concat(enc, receiverPublicKey);
116
+ const ciphertext = aesGcmSeal(key, baseNonce, aad, plaintext);
117
+ return { encappedPublic: enc, ciphertext };
118
+ }
119
+ //# 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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"}
@@ -0,0 +1,16 @@
1
+ export function isReactNative() {
2
+ if (typeof navigator !== 'undefined' &&
3
+ navigator.product === 'ReactNative') {
4
+ return true;
5
+ }
6
+ if (typeof window !== 'undefined' &&
7
+ Object.hasOwn(window, 'ReactNativeWebView')) {
8
+ return true;
9
+ }
10
+ if (typeof globalThis !== 'undefined' &&
11
+ Object.hasOwn(globalThis, 'HermesEngine')) {
12
+ return true;
13
+ }
14
+ return false;
15
+ }
16
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../../src/utils/platform.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa;IAC3B,IACE,OAAO,SAAS,KAAK,WAAW;QAC/B,SAAkC,CAAC,OAAO,KAAK,aAAa,EAC7D,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IACE,OAAO,MAAM,KAAK,WAAW;QAC7B,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,EAC3C,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IACE,OAAO,UAAU,KAAK,WAAW;QACjC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,cAAc,CAAC,EACzC,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Builds a memoized resolver for the Turnkey parent org that stamp-login is
3
+ * signed against. Resolution order:
4
+ * 1. explicit override (self-hosted / local backends)
5
+ * 2. value fetched from the backend, cached after the first success
6
+ * 3. fallback (the known prod parent org) if the fetch fails
7
+ *
8
+ * The fetch is only attempted when there's no override, and only once — a
9
+ * failure is cached as the fallback so we don't refetch on every login.
10
+ */
11
+ export function createOrganizationIdResolver(opts) {
12
+ let cached;
13
+ return async function resolveOrganizationId() {
14
+ if (opts.organizationId)
15
+ return opts.organizationId;
16
+ if (cached === undefined) {
17
+ try {
18
+ cached = await opts.fetchParentOrgId();
19
+ }
20
+ catch {
21
+ cached = opts.fallback;
22
+ }
23
+ }
24
+ return cached;
25
+ };
26
+ }
27
+ //# sourceMappingURL=resolveOrganizationId.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveOrganizationId.js","sourceRoot":"","sources":["../../../src/utils/resolveOrganizationId.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,UAAU,4BAA4B,CAAC,IAI5C;IACC,IAAI,MAA0B,CAAA;IAC9B,OAAO,KAAK,UAAU,qBAAqB;QACzC,IAAI,IAAI,CAAC,cAAc;YAAE,OAAO,IAAI,CAAC,cAAc,CAAA;QACnD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAA;YACxC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAA;YACxB,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;AACH,CAAC"}
@@ -12,7 +12,8 @@ export function parseSession(token) {
12
12
  if (!payload) {
13
13
  throw new Error('Invalid JWT: Missing payload');
14
14
  }
15
- const decoded = JSON.parse(Buffer.from(payload, 'base64').toString());
15
+ const base64 = payload.replace(/-/g, '+').replace(/_/g, '/');
16
+ const decoded = JSON.parse(atob(base64));
16
17
  const { exp, public_key: publicKey, session_type: sessionType, user_id: userId, organization_id: organizationId, } = decoded;
17
18
  if (!exp || !publicKey || !sessionType || !userId || !organizationId) {
18
19
  throw new Error('JWT payload missing required fields');
@@ -51,11 +52,9 @@ export const generateRandomBuffer = () => {
51
52
  * @returns {string} - The encoded challenge.
52
53
  */
53
54
  export const base64UrlEncode = (challenge) => {
54
- return Buffer.from(challenge)
55
- .toString('base64')
56
- .replace(/\+/g, '-')
57
- .replace(/\//g, '_')
58
- .replace(/=/g, '');
55
+ const bytes = new Uint8Array(challenge);
56
+ const binary = String.fromCharCode(...bytes);
57
+ return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
59
58
  };
60
59
  /**
61
60
  * Compresses an uncompressed P-256 public key into its 33-byte compressed form.