react-native-quick-crypto 1.0.0-beta.8 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (480) hide show
  1. package/QuickCrypto.podspec +145 -6
  2. package/README.md +14 -27
  3. package/android/CMakeLists.txt +62 -7
  4. package/android/build.gradle +12 -2
  5. package/android/src/main/java/com/margelo/nitro/quickcrypto/QuickCryptoPackage.java +0 -2
  6. package/app.plugin.js +3 -0
  7. package/cpp/blake3/HybridBlake3.cpp +118 -0
  8. package/cpp/blake3/HybridBlake3.hpp +35 -0
  9. package/cpp/cipher/CCMCipher.cpp +199 -0
  10. package/cpp/cipher/CCMCipher.hpp +26 -0
  11. package/cpp/cipher/ChaCha20Cipher.cpp +97 -0
  12. package/cpp/cipher/ChaCha20Cipher.hpp +25 -0
  13. package/cpp/cipher/ChaCha20Poly1305Cipher.cpp +170 -0
  14. package/cpp/cipher/ChaCha20Poly1305Cipher.hpp +30 -0
  15. package/cpp/cipher/GCMCipher.cpp +68 -0
  16. package/cpp/cipher/GCMCipher.hpp +14 -0
  17. package/cpp/cipher/HybridCipher.cpp +322 -0
  18. package/cpp/cipher/HybridCipher.hpp +68 -0
  19. package/cpp/cipher/HybridCipherFactory.hpp +105 -0
  20. package/cpp/cipher/HybridRsaCipher.cpp +348 -0
  21. package/cpp/cipher/HybridRsaCipher.hpp +29 -0
  22. package/cpp/cipher/OCBCipher.cpp +55 -0
  23. package/cpp/cipher/OCBCipher.hpp +19 -0
  24. package/cpp/cipher/XSalsa20Cipher.cpp +61 -0
  25. package/cpp/cipher/XSalsa20Cipher.hpp +33 -0
  26. package/cpp/ec/HybridEcKeyPair.cpp +428 -0
  27. package/cpp/ec/HybridEcKeyPair.hpp +48 -0
  28. package/cpp/ed25519/HybridEdKeyPair.cpp +228 -98
  29. package/cpp/ed25519/HybridEdKeyPair.hpp +42 -56
  30. package/cpp/hash/HybridHash.cpp +185 -0
  31. package/cpp/hash/HybridHash.hpp +43 -0
  32. package/cpp/hmac/HybridHmac.cpp +95 -0
  33. package/cpp/hmac/HybridHmac.hpp +31 -0
  34. package/cpp/keys/HybridKeyObjectHandle.cpp +749 -0
  35. package/cpp/keys/HybridKeyObjectHandle.hpp +51 -0
  36. package/cpp/keys/KeyObjectData.cpp +268 -0
  37. package/cpp/keys/KeyObjectData.hpp +71 -0
  38. package/cpp/keys/node.h +5 -0
  39. package/cpp/pbkdf2/HybridPbkdf2.cpp +34 -55
  40. package/cpp/pbkdf2/HybridPbkdf2.hpp +5 -16
  41. package/cpp/random/HybridRandom.cpp +6 -17
  42. package/cpp/random/HybridRandom.hpp +5 -6
  43. package/cpp/rsa/HybridRsaKeyPair.cpp +154 -0
  44. package/cpp/rsa/HybridRsaKeyPair.hpp +43 -0
  45. package/cpp/sign/HybridSignHandle.cpp +191 -0
  46. package/cpp/sign/HybridSignHandle.hpp +36 -0
  47. package/cpp/sign/HybridVerifyHandle.cpp +158 -0
  48. package/cpp/sign/HybridVerifyHandle.hpp +36 -0
  49. package/cpp/sign/SignUtils.hpp +108 -0
  50. package/cpp/utils/Macros.hpp +68 -0
  51. package/cpp/utils/Utils.hpp +43 -2
  52. package/cpp/utils/base64.h +309 -0
  53. package/deps/blake3/.cargo/config.toml +2 -0
  54. package/deps/blake3/.git-blame-ignore-revs +2 -0
  55. package/deps/blake3/.github/workflows/build_b3sum.py +38 -0
  56. package/deps/blake3/.github/workflows/ci.yml +491 -0
  57. package/deps/blake3/.github/workflows/tag.yml +43 -0
  58. package/deps/blake3/.github/workflows/upload_github_release_asset.py +73 -0
  59. package/deps/blake3/CONTRIBUTING.md +31 -0
  60. package/deps/blake3/Cargo.toml +135 -0
  61. package/deps/blake3/LICENSE_A2 +202 -0
  62. package/deps/blake3/LICENSE_A2LLVM +219 -0
  63. package/deps/blake3/LICENSE_CC0 +121 -0
  64. package/deps/blake3/README.md +229 -0
  65. package/deps/blake3/b3sum/Cargo.lock +513 -0
  66. package/deps/blake3/b3sum/Cargo.toml +26 -0
  67. package/deps/blake3/b3sum/README.md +72 -0
  68. package/deps/blake3/b3sum/src/main.rs +564 -0
  69. package/deps/blake3/b3sum/src/unit_tests.rs +235 -0
  70. package/deps/blake3/b3sum/tests/cli_tests.rs +680 -0
  71. package/deps/blake3/b3sum/what_does_check_do.md +176 -0
  72. package/deps/blake3/benches/bench.rs +623 -0
  73. package/deps/blake3/build.rs +389 -0
  74. package/deps/blake3/c/CMakeLists.txt +383 -0
  75. package/deps/blake3/c/CMakePresets.json +73 -0
  76. package/deps/blake3/c/Makefile.testing +82 -0
  77. package/deps/blake3/c/README.md +403 -0
  78. package/deps/blake3/c/blake3-config.cmake.in +14 -0
  79. package/deps/blake3/c/blake3.c +650 -0
  80. package/deps/blake3/c/blake3.h +86 -0
  81. package/deps/blake3/c/blake3_avx2.c +326 -0
  82. package/deps/blake3/c/blake3_avx2_x86-64_unix.S +1815 -0
  83. package/deps/blake3/c/blake3_avx2_x86-64_windows_gnu.S +1817 -0
  84. package/deps/blake3/c/blake3_avx2_x86-64_windows_msvc.asm +1828 -0
  85. package/deps/blake3/c/blake3_avx512.c +1388 -0
  86. package/deps/blake3/c/blake3_avx512_x86-64_unix.S +4824 -0
  87. package/deps/blake3/c/blake3_avx512_x86-64_windows_gnu.S +2615 -0
  88. package/deps/blake3/c/blake3_avx512_x86-64_windows_msvc.asm +2634 -0
  89. package/deps/blake3/c/blake3_c_rust_bindings/Cargo.toml +32 -0
  90. package/deps/blake3/c/blake3_c_rust_bindings/README.md +4 -0
  91. package/deps/blake3/c/blake3_c_rust_bindings/benches/bench.rs +477 -0
  92. package/deps/blake3/c/blake3_c_rust_bindings/build.rs +253 -0
  93. package/deps/blake3/c/blake3_c_rust_bindings/cross_test.sh +31 -0
  94. package/deps/blake3/c/blake3_c_rust_bindings/src/lib.rs +333 -0
  95. package/deps/blake3/c/blake3_c_rust_bindings/src/test.rs +696 -0
  96. package/deps/blake3/c/blake3_dispatch.c +332 -0
  97. package/deps/blake3/c/blake3_impl.h +333 -0
  98. package/deps/blake3/c/blake3_neon.c +366 -0
  99. package/deps/blake3/c/blake3_portable.c +160 -0
  100. package/deps/blake3/c/blake3_sse2.c +566 -0
  101. package/deps/blake3/c/blake3_sse2_x86-64_unix.S +2291 -0
  102. package/deps/blake3/c/blake3_sse2_x86-64_windows_gnu.S +2332 -0
  103. package/deps/blake3/c/blake3_sse2_x86-64_windows_msvc.asm +2350 -0
  104. package/deps/blake3/c/blake3_sse41.c +560 -0
  105. package/deps/blake3/c/blake3_sse41_x86-64_unix.S +2028 -0
  106. package/deps/blake3/c/blake3_sse41_x86-64_windows_gnu.S +2069 -0
  107. package/deps/blake3/c/blake3_sse41_x86-64_windows_msvc.asm +2089 -0
  108. package/deps/blake3/c/blake3_tbb.cpp +37 -0
  109. package/deps/blake3/c/dependencies/CMakeLists.txt +3 -0
  110. package/deps/blake3/c/dependencies/tbb/CMakeLists.txt +28 -0
  111. package/deps/blake3/c/example.c +36 -0
  112. package/deps/blake3/c/example_tbb.c +57 -0
  113. package/deps/blake3/c/libblake3.pc.in +12 -0
  114. package/deps/blake3/c/main.c +166 -0
  115. package/deps/blake3/c/test.py +97 -0
  116. package/deps/blake3/media/B3.svg +70 -0
  117. package/deps/blake3/media/BLAKE3.svg +85 -0
  118. package/deps/blake3/media/speed.svg +1474 -0
  119. package/deps/blake3/reference_impl/Cargo.toml +8 -0
  120. package/deps/blake3/reference_impl/README.md +14 -0
  121. package/deps/blake3/reference_impl/reference_impl.rs +374 -0
  122. package/deps/blake3/src/ffi_avx2.rs +65 -0
  123. package/deps/blake3/src/ffi_avx512.rs +169 -0
  124. package/deps/blake3/src/ffi_neon.rs +82 -0
  125. package/deps/blake3/src/ffi_sse2.rs +126 -0
  126. package/deps/blake3/src/ffi_sse41.rs +126 -0
  127. package/deps/blake3/src/guts.rs +60 -0
  128. package/deps/blake3/src/hazmat.rs +704 -0
  129. package/deps/blake3/src/io.rs +64 -0
  130. package/deps/blake3/src/join.rs +92 -0
  131. package/deps/blake3/src/lib.rs +1835 -0
  132. package/deps/blake3/src/platform.rs +587 -0
  133. package/deps/blake3/src/portable.rs +198 -0
  134. package/deps/blake3/src/rust_avx2.rs +474 -0
  135. package/deps/blake3/src/rust_sse2.rs +775 -0
  136. package/deps/blake3/src/rust_sse41.rs +766 -0
  137. package/deps/blake3/src/test.rs +1049 -0
  138. package/deps/blake3/src/traits.rs +227 -0
  139. package/deps/blake3/src/wasm32_simd.rs +794 -0
  140. package/deps/blake3/test_vectors/Cargo.toml +19 -0
  141. package/deps/blake3/test_vectors/cross_test.sh +25 -0
  142. package/deps/blake3/test_vectors/src/bin/generate.rs +4 -0
  143. package/deps/blake3/test_vectors/src/lib.rs +350 -0
  144. package/deps/blake3/test_vectors/test_vectors.json +217 -0
  145. package/deps/blake3/tools/compiler_version/Cargo.toml +7 -0
  146. package/deps/blake3/tools/compiler_version/build.rs +6 -0
  147. package/deps/blake3/tools/compiler_version/src/main.rs +27 -0
  148. package/deps/blake3/tools/instruction_set_support/Cargo.toml +6 -0
  149. package/deps/blake3/tools/instruction_set_support/src/main.rs +10 -0
  150. package/deps/blake3/tools/release.md +16 -0
  151. package/deps/fastpbkdf2/fastpbkdf2.c +5 -1
  152. package/deps/ncrypto/ncrypto.cc +4679 -0
  153. package/deps/ncrypto/ncrypto.h +1625 -0
  154. package/lib/commonjs/blake3.js +98 -0
  155. package/lib/commonjs/blake3.js.map +1 -0
  156. package/lib/commonjs/cipher.js +180 -0
  157. package/lib/commonjs/cipher.js.map +1 -0
  158. package/lib/commonjs/constants.js +32 -0
  159. package/lib/commonjs/constants.js.map +1 -0
  160. package/lib/commonjs/ec.js +480 -0
  161. package/lib/commonjs/ec.js.map +1 -0
  162. package/lib/commonjs/ed.js +214 -2
  163. package/lib/commonjs/ed.js.map +1 -1
  164. package/lib/commonjs/expo-plugin/@types.js +2 -0
  165. package/lib/commonjs/expo-plugin/@types.js.map +1 -0
  166. package/lib/commonjs/expo-plugin/withRNQC.js +25 -0
  167. package/lib/commonjs/expo-plugin/withRNQC.js.map +1 -0
  168. package/lib/commonjs/expo-plugin/withSodiumAndroid.js +25 -0
  169. package/lib/commonjs/expo-plugin/withSodiumAndroid.js.map +1 -0
  170. package/lib/commonjs/expo-plugin/withSodiumIos.js +26 -0
  171. package/lib/commonjs/expo-plugin/withSodiumIos.js.map +1 -0
  172. package/lib/commonjs/expo-plugin/withXCode.js +51 -0
  173. package/lib/commonjs/expo-plugin/withXCode.js.map +1 -0
  174. package/lib/commonjs/hash.js +215 -0
  175. package/lib/commonjs/hash.js.map +1 -0
  176. package/lib/commonjs/hmac.js +109 -0
  177. package/lib/commonjs/hmac.js.map +1 -0
  178. package/lib/commonjs/index.js +102 -24
  179. package/lib/commonjs/index.js.map +1 -1
  180. package/lib/commonjs/keys/classes.js +109 -52
  181. package/lib/commonjs/keys/classes.js.map +1 -1
  182. package/lib/commonjs/keys/generateKeyPair.js +141 -144
  183. package/lib/commonjs/keys/generateKeyPair.js.map +1 -1
  184. package/lib/commonjs/keys/index.js +229 -0
  185. package/lib/commonjs/keys/index.js.map +1 -1
  186. package/lib/commonjs/keys/publicCipher.js +152 -0
  187. package/lib/commonjs/keys/publicCipher.js.map +1 -0
  188. package/lib/commonjs/keys/signVerify.js +178 -39
  189. package/lib/commonjs/keys/signVerify.js.map +1 -1
  190. package/lib/commonjs/keys/utils.js +18 -13
  191. package/lib/commonjs/keys/utils.js.map +1 -1
  192. package/lib/commonjs/pbkdf2.js.map +1 -1
  193. package/lib/commonjs/random.js +6 -0
  194. package/lib/commonjs/random.js.map +1 -1
  195. package/lib/commonjs/rsa.js +202 -0
  196. package/lib/commonjs/rsa.js.map +1 -0
  197. package/lib/commonjs/specs/blake3.nitro.js +6 -0
  198. package/lib/commonjs/specs/blake3.nitro.js.map +1 -0
  199. package/lib/commonjs/specs/cipher.nitro.js +6 -0
  200. package/lib/commonjs/specs/cipher.nitro.js.map +1 -0
  201. package/lib/commonjs/specs/ecKeyPair.nitro.js +6 -0
  202. package/lib/commonjs/specs/ecKeyPair.nitro.js.map +1 -0
  203. package/lib/commonjs/specs/hash.nitro.js +6 -0
  204. package/lib/commonjs/specs/hash.nitro.js.map +1 -0
  205. package/lib/commonjs/specs/hmac.nitro.js +6 -0
  206. package/lib/commonjs/specs/hmac.nitro.js.map +1 -0
  207. package/lib/commonjs/specs/rsaCipher.nitro.js +6 -0
  208. package/lib/commonjs/specs/rsaCipher.nitro.js.map +1 -0
  209. package/lib/commonjs/specs/rsaKeyPair.nitro.js +6 -0
  210. package/lib/commonjs/specs/rsaKeyPair.nitro.js.map +1 -0
  211. package/lib/commonjs/specs/sign.nitro.js +6 -0
  212. package/lib/commonjs/specs/sign.nitro.js.map +1 -0
  213. package/lib/commonjs/subtle.js +987 -0
  214. package/lib/commonjs/subtle.js.map +1 -0
  215. package/lib/commonjs/utils/cipher.js +64 -0
  216. package/lib/commonjs/utils/cipher.js.map +1 -0
  217. package/lib/commonjs/utils/conversion.js +44 -5
  218. package/lib/commonjs/utils/conversion.js.map +1 -1
  219. package/lib/commonjs/utils/hashnames.js +2 -1
  220. package/lib/commonjs/utils/hashnames.js.map +1 -1
  221. package/lib/commonjs/utils/index.js +11 -0
  222. package/lib/commonjs/utils/index.js.map +1 -1
  223. package/lib/commonjs/utils/noble.js +82 -0
  224. package/lib/commonjs/utils/noble.js.map +1 -0
  225. package/lib/commonjs/utils/types.js +32 -17
  226. package/lib/commonjs/utils/types.js.map +1 -1
  227. package/lib/commonjs/utils/validation.js +74 -1
  228. package/lib/commonjs/utils/validation.js.map +1 -1
  229. package/lib/module/blake3.js +90 -0
  230. package/lib/module/blake3.js.map +1 -0
  231. package/lib/module/cipher.js +173 -0
  232. package/lib/module/cipher.js.map +1 -0
  233. package/lib/module/constants.js +28 -0
  234. package/lib/module/constants.js.map +1 -0
  235. package/lib/module/ec.js +470 -0
  236. package/lib/module/ec.js.map +1 -0
  237. package/lib/module/ed.js +212 -3
  238. package/lib/module/ed.js.map +1 -1
  239. package/lib/module/expo-plugin/@types.js +2 -0
  240. package/lib/module/expo-plugin/@types.js.map +1 -0
  241. package/lib/module/expo-plugin/withRNQC.js +21 -0
  242. package/lib/module/expo-plugin/withRNQC.js.map +1 -0
  243. package/lib/module/expo-plugin/withSodiumAndroid.js +20 -0
  244. package/lib/module/expo-plugin/withSodiumAndroid.js.map +1 -0
  245. package/lib/module/expo-plugin/withSodiumIos.js +20 -0
  246. package/lib/module/expo-plugin/withSodiumIos.js.map +1 -0
  247. package/lib/module/expo-plugin/withXCode.js +46 -0
  248. package/lib/module/expo-plugin/withXCode.js.map +1 -0
  249. package/lib/module/hash.js +207 -0
  250. package/lib/module/hash.js.map +1 -0
  251. package/lib/module/hmac.js +104 -0
  252. package/lib/module/hmac.js.map +1 -0
  253. package/lib/module/index.js +21 -21
  254. package/lib/module/index.js.map +1 -1
  255. package/lib/module/keys/classes.js +106 -49
  256. package/lib/module/keys/classes.js.map +1 -1
  257. package/lib/module/keys/generateKeyPair.js +134 -143
  258. package/lib/module/keys/generateKeyPair.js.map +1 -1
  259. package/lib/module/keys/index.js +161 -22
  260. package/lib/module/keys/index.js.map +1 -1
  261. package/lib/module/keys/publicCipher.js +145 -0
  262. package/lib/module/keys/publicCipher.js.map +1 -0
  263. package/lib/module/keys/signVerify.js +170 -39
  264. package/lib/module/keys/signVerify.js.map +1 -1
  265. package/lib/module/keys/utils.js +16 -12
  266. package/lib/module/keys/utils.js.map +1 -1
  267. package/lib/module/pbkdf2.js.map +1 -1
  268. package/lib/module/random.js +6 -0
  269. package/lib/module/random.js.map +1 -1
  270. package/lib/module/rsa.js +194 -0
  271. package/lib/module/rsa.js.map +1 -0
  272. package/lib/module/specs/blake3.nitro.js +4 -0
  273. package/lib/module/specs/blake3.nitro.js.map +1 -0
  274. package/lib/module/specs/cipher.nitro.js +4 -0
  275. package/lib/module/specs/cipher.nitro.js.map +1 -0
  276. package/lib/module/specs/ecKeyPair.nitro.js +4 -0
  277. package/lib/module/specs/ecKeyPair.nitro.js.map +1 -0
  278. package/lib/module/specs/hash.nitro.js +4 -0
  279. package/lib/module/specs/hash.nitro.js.map +1 -0
  280. package/lib/module/specs/hmac.nitro.js +4 -0
  281. package/lib/module/specs/hmac.nitro.js.map +1 -0
  282. package/lib/module/specs/rsaCipher.nitro.js +4 -0
  283. package/lib/module/specs/rsaCipher.nitro.js.map +1 -0
  284. package/lib/module/specs/rsaKeyPair.nitro.js +4 -0
  285. package/lib/module/specs/rsaKeyPair.nitro.js.map +1 -0
  286. package/lib/module/specs/sign.nitro.js +4 -0
  287. package/lib/module/specs/sign.nitro.js.map +1 -0
  288. package/lib/module/subtle.js +982 -0
  289. package/lib/module/subtle.js.map +1 -0
  290. package/lib/module/utils/cipher.js +56 -0
  291. package/lib/module/utils/cipher.js.map +1 -0
  292. package/lib/module/utils/conversion.js +26 -5
  293. package/lib/module/utils/conversion.js.map +1 -1
  294. package/lib/module/utils/hashnames.js +2 -1
  295. package/lib/module/utils/hashnames.js.map +1 -1
  296. package/lib/module/utils/index.js +1 -0
  297. package/lib/module/utils/index.js.map +1 -1
  298. package/lib/module/utils/noble.js +76 -0
  299. package/lib/module/utils/noble.js.map +1 -0
  300. package/lib/module/utils/types.js +32 -17
  301. package/lib/module/utils/types.js.map +1 -1
  302. package/lib/module/utils/validation.js +69 -1
  303. package/lib/module/utils/validation.js.map +1 -1
  304. package/lib/tsconfig.tsbuildinfo +1 -1
  305. package/lib/typescript/blake3.d.ts +33 -0
  306. package/lib/typescript/blake3.d.ts.map +1 -0
  307. package/lib/typescript/cipher.d.ts +60 -0
  308. package/lib/typescript/cipher.d.ts.map +1 -0
  309. package/lib/typescript/constants.d.ts +21 -0
  310. package/lib/typescript/constants.d.ts.map +1 -0
  311. package/lib/typescript/ec.d.ts +22 -0
  312. package/lib/typescript/ec.d.ts.map +1 -0
  313. package/lib/typescript/ed.d.ts +28 -1
  314. package/lib/typescript/ed.d.ts.map +1 -1
  315. package/lib/typescript/expo-plugin/@types.d.ts +8 -0
  316. package/lib/typescript/expo-plugin/@types.d.ts.map +1 -0
  317. package/lib/typescript/expo-plugin/withRNQC.d.ts +4 -0
  318. package/lib/typescript/expo-plugin/withRNQC.d.ts.map +1 -0
  319. package/lib/typescript/expo-plugin/withSodiumAndroid.d.ts +4 -0
  320. package/lib/typescript/expo-plugin/withSodiumAndroid.d.ts.map +1 -0
  321. package/lib/typescript/expo-plugin/withSodiumIos.d.ts +4 -0
  322. package/lib/typescript/expo-plugin/withSodiumIos.d.ts.map +1 -0
  323. package/lib/typescript/expo-plugin/withXCode.d.ts +9 -0
  324. package/lib/typescript/expo-plugin/withXCode.d.ts.map +1 -0
  325. package/lib/typescript/hash.d.ts +122 -0
  326. package/lib/typescript/hash.d.ts.map +1 -0
  327. package/lib/typescript/hmac.d.ts +66 -0
  328. package/lib/typescript/hmac.d.ts.map +1 -0
  329. package/lib/typescript/index.d.ts +102 -10
  330. package/lib/typescript/index.d.ts.map +1 -1
  331. package/lib/typescript/keys/classes.d.ts +50 -8
  332. package/lib/typescript/keys/classes.d.ts.map +1 -1
  333. package/lib/typescript/keys/generateKeyPair.d.ts +5 -0
  334. package/lib/typescript/keys/generateKeyPair.d.ts.map +1 -1
  335. package/lib/typescript/keys/index.d.ts +22 -2
  336. package/lib/typescript/keys/index.d.ts.map +1 -1
  337. package/lib/typescript/keys/publicCipher.d.ts +20 -0
  338. package/lib/typescript/keys/publicCipher.d.ts.map +1 -0
  339. package/lib/typescript/keys/signVerify.d.ts +28 -0
  340. package/lib/typescript/keys/signVerify.d.ts.map +1 -1
  341. package/lib/typescript/keys/utils.d.ts +3 -1
  342. package/lib/typescript/keys/utils.d.ts.map +1 -1
  343. package/lib/typescript/pbkdf2.d.ts +1 -1
  344. package/lib/typescript/pbkdf2.d.ts.map +1 -1
  345. package/lib/typescript/random.d.ts +6 -0
  346. package/lib/typescript/random.d.ts.map +1 -1
  347. package/lib/typescript/rsa.d.ts +19 -0
  348. package/lib/typescript/rsa.d.ts.map +1 -0
  349. package/lib/typescript/specs/blake3.nitro.d.ts +15 -0
  350. package/lib/typescript/specs/blake3.nitro.d.ts.map +1 -0
  351. package/lib/typescript/specs/cipher.nitro.d.ts +29 -0
  352. package/lib/typescript/specs/cipher.nitro.d.ts.map +1 -0
  353. package/lib/typescript/specs/ecKeyPair.nitro.d.ts +20 -0
  354. package/lib/typescript/specs/ecKeyPair.nitro.d.ts.map +1 -0
  355. package/lib/typescript/specs/edKeyPair.nitro.d.ts +1 -0
  356. package/lib/typescript/specs/edKeyPair.nitro.d.ts.map +1 -1
  357. package/lib/typescript/specs/hash.nitro.d.ts +13 -0
  358. package/lib/typescript/specs/hash.nitro.d.ts.map +1 -0
  359. package/lib/typescript/specs/hmac.nitro.d.ts +10 -0
  360. package/lib/typescript/specs/hmac.nitro.d.ts.map +1 -0
  361. package/lib/typescript/specs/keyObjectHandle.nitro.d.ts +1 -1
  362. package/lib/typescript/specs/keyObjectHandle.nitro.d.ts.map +1 -1
  363. package/lib/typescript/specs/rsaCipher.nitro.d.ts +44 -0
  364. package/lib/typescript/specs/rsaCipher.nitro.d.ts.map +1 -0
  365. package/lib/typescript/specs/rsaKeyPair.nitro.d.ts +20 -0
  366. package/lib/typescript/specs/rsaKeyPair.nitro.d.ts.map +1 -0
  367. package/lib/typescript/specs/sign.nitro.d.ts +19 -0
  368. package/lib/typescript/specs/sign.nitro.d.ts.map +1 -0
  369. package/lib/typescript/subtle.d.ts +17 -0
  370. package/lib/typescript/subtle.d.ts.map +1 -0
  371. package/lib/typescript/utils/cipher.d.ts +7 -0
  372. package/lib/typescript/utils/cipher.d.ts.map +1 -0
  373. package/lib/typescript/utils/conversion.d.ts +1 -0
  374. package/lib/typescript/utils/conversion.d.ts.map +1 -1
  375. package/lib/typescript/utils/hashnames.d.ts +3 -1
  376. package/lib/typescript/utils/hashnames.d.ts.map +1 -1
  377. package/lib/typescript/utils/index.d.ts +1 -0
  378. package/lib/typescript/utils/index.d.ts.map +1 -1
  379. package/lib/typescript/utils/noble.d.ts +19 -0
  380. package/lib/typescript/utils/noble.d.ts.map +1 -0
  381. package/lib/typescript/utils/types.d.ts +125 -23
  382. package/lib/typescript/utils/types.d.ts.map +1 -1
  383. package/lib/typescript/utils/validation.d.ts +5 -0
  384. package/lib/typescript/utils/validation.d.ts.map +1 -1
  385. package/nitrogen/generated/.gitattributes +1 -0
  386. package/nitrogen/generated/android/QuickCrypto+autolinking.cmake +30 -1
  387. package/nitrogen/generated/android/QuickCrypto+autolinking.gradle +1 -1
  388. package/nitrogen/generated/android/QuickCryptoOnLoad.cpp +115 -1
  389. package/nitrogen/generated/android/QuickCryptoOnLoad.hpp +1 -1
  390. package/nitrogen/generated/android/kotlin/com/margelo/nitro/crypto/QuickCryptoOnLoad.kt +35 -0
  391. package/nitrogen/generated/ios/QuickCrypto+autolinking.rb +3 -1
  392. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.cpp +1 -1
  393. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.hpp +1 -1
  394. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Umbrella.hpp +3 -3
  395. package/nitrogen/generated/ios/QuickCryptoAutolinking.mm +111 -1
  396. package/nitrogen/generated/ios/QuickCryptoAutolinking.swift +1 -1
  397. package/nitrogen/generated/shared/c++/AsymmetricKeyType.hpp +104 -0
  398. package/nitrogen/generated/shared/c++/CipherArgs.hpp +86 -0
  399. package/nitrogen/generated/shared/c++/HybridBlake3Spec.cpp +28 -0
  400. package/nitrogen/generated/shared/c++/HybridBlake3Spec.hpp +76 -0
  401. package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.cpp +21 -0
  402. package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.hpp +67 -0
  403. package/nitrogen/generated/shared/c++/HybridCipherSpec.cpp +28 -0
  404. package/nitrogen/generated/shared/c++/HybridCipherSpec.hpp +76 -0
  405. package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.cpp +29 -0
  406. package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.hpp +77 -0
  407. package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.cpp +2 -1
  408. package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.hpp +5 -4
  409. package/nitrogen/generated/shared/c++/HybridHashSpec.cpp +26 -0
  410. package/nitrogen/generated/shared/c++/HybridHashSpec.hpp +75 -0
  411. package/nitrogen/generated/shared/c++/HybridHmacSpec.cpp +23 -0
  412. package/nitrogen/generated/shared/c++/HybridHmacSpec.hpp +66 -0
  413. package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.cpp +1 -1
  414. package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.hpp +8 -8
  415. package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.cpp +1 -1
  416. package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.hpp +3 -3
  417. package/nitrogen/generated/shared/c++/HybridRandomSpec.cpp +1 -1
  418. package/nitrogen/generated/shared/c++/HybridRandomSpec.hpp +3 -3
  419. package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.cpp +24 -0
  420. package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.hpp +72 -0
  421. package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.cpp +29 -0
  422. package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.hpp +77 -0
  423. package/nitrogen/generated/shared/c++/HybridSignHandleSpec.cpp +23 -0
  424. package/nitrogen/generated/shared/c++/HybridSignHandleSpec.hpp +71 -0
  425. package/nitrogen/generated/shared/c++/HybridVerifyHandleSpec.cpp +23 -0
  426. package/nitrogen/generated/shared/c++/HybridVerifyHandleSpec.hpp +71 -0
  427. package/nitrogen/generated/shared/c++/JWK.hpp +17 -18
  428. package/nitrogen/generated/shared/c++/JWKkty.hpp +12 -14
  429. package/nitrogen/generated/shared/c++/JWKuse.hpp +8 -10
  430. package/nitrogen/generated/shared/c++/KFormatType.hpp +14 -16
  431. package/nitrogen/generated/shared/c++/KeyDetail.hpp +6 -7
  432. package/nitrogen/generated/shared/c++/KeyEncoding.hpp +15 -17
  433. package/nitrogen/generated/shared/c++/KeyObject.hpp +67 -0
  434. package/nitrogen/generated/shared/c++/KeyType.hpp +11 -13
  435. package/nitrogen/generated/shared/c++/KeyUsage.hpp +38 -24
  436. package/nitrogen/generated/shared/c++/NamedCurve.hpp +10 -12
  437. package/package.json +28 -23
  438. package/src/blake3.ts +123 -0
  439. package/src/cipher.ts +335 -0
  440. package/src/constants.ts +32 -0
  441. package/src/ec.ts +657 -0
  442. package/src/ed.ts +297 -13
  443. package/src/expo-plugin/@types.ts +7 -0
  444. package/src/expo-plugin/withRNQC.ts +23 -0
  445. package/src/expo-plugin/withSodiumAndroid.ts +24 -0
  446. package/src/expo-plugin/withSodiumIos.ts +30 -0
  447. package/src/expo-plugin/withXCode.ts +55 -0
  448. package/src/hash.ts +274 -0
  449. package/src/hmac.ts +135 -0
  450. package/src/index.ts +20 -20
  451. package/src/keys/classes.ts +148 -55
  452. package/src/keys/generateKeyPair.ts +177 -134
  453. package/src/keys/index.ts +226 -14
  454. package/src/keys/publicCipher.ts +229 -0
  455. package/src/keys/signVerify.ts +239 -39
  456. package/src/keys/utils.ts +24 -18
  457. package/src/pbkdf2.ts +1 -1
  458. package/src/random.ts +7 -0
  459. package/src/rsa.ts +310 -0
  460. package/src/specs/blake3.nitro.ts +12 -0
  461. package/src/specs/cipher.nitro.ts +25 -0
  462. package/src/specs/ecKeyPair.nitro.ts +38 -0
  463. package/src/specs/edKeyPair.nitro.ts +2 -0
  464. package/src/specs/hash.nitro.ts +10 -0
  465. package/src/specs/hmac.nitro.ts +7 -0
  466. package/src/specs/keyObjectHandle.nitro.ts +1 -1
  467. package/src/specs/rsaCipher.nitro.ts +65 -0
  468. package/src/specs/rsaKeyPair.nitro.ts +33 -0
  469. package/src/specs/sign.nitro.ts +31 -0
  470. package/src/subtle.ts +1436 -0
  471. package/src/utils/cipher.ts +60 -0
  472. package/src/utils/conversion.ts +33 -4
  473. package/src/utils/hashnames.ts +4 -2
  474. package/src/utils/index.ts +1 -0
  475. package/src/utils/noble.ts +85 -0
  476. package/src/utils/types.ts +209 -29
  477. package/src/utils/validation.ts +96 -1
  478. package/lib/module/package.json +0 -1
  479. package/nitrogen/generated/android/QuickCryptoOnLoad.kt +0 -1
  480. package/nitrogen/generated/shared/c++/CFRGKeyPairType.hpp +0 -86
@@ -0,0 +1,982 @@
1
+ "use strict";
2
+
3
+ /* eslint-disable @typescript-eslint/no-unused-vars */
4
+ import { Buffer as SBuffer } from 'safe-buffer';
5
+ import { KFormatType, KeyEncoding } from './utils';
6
+ import { CryptoKey, KeyObject, PublicKeyObject, PrivateKeyObject, SecretKeyObject } from './keys';
7
+ import { bufferLikeToArrayBuffer } from './utils/conversion';
8
+ import { lazyDOMException } from './utils/errors';
9
+ import { normalizeHashName, HashContext } from './utils/hashnames';
10
+ import { validateMaxBufferLength } from './utils/validation';
11
+ import { asyncDigest } from './hash';
12
+ import { createSecretKey } from './keys';
13
+ import { NitroModules } from 'react-native-nitro-modules';
14
+ import { pbkdf2DeriveBits } from './pbkdf2';
15
+ import { ecImportKey, ecdsaSignVerify, ec_generateKeyPair } from './ec';
16
+ import { rsa_generateKeyPair } from './rsa';
17
+ import { getRandomValues } from './random';
18
+ import { createHmac } from './hmac';
19
+ import { createSign, createVerify } from './keys/signVerify';
20
+ import { ed_generateKeyPairWebCrypto, Ed } from './ed';
21
+ // import { pbkdf2DeriveBits } from './pbkdf2';
22
+ // import { aesCipher, aesGenerateKey, aesImportKey, getAlgorithmName } from './aes';
23
+ // import { rsaCipher, rsaExportKey, rsaImportKey, rsaKeyGenerate } from './rsa';
24
+ // import { normalizeAlgorithm, type Operation } from './algorithms';
25
+ // import { hmacImportKey } from './mac';
26
+
27
+ // Temporary enums that need to be defined
28
+ var KWebCryptoKeyFormat = /*#__PURE__*/function (KWebCryptoKeyFormat) {
29
+ KWebCryptoKeyFormat[KWebCryptoKeyFormat["kWebCryptoKeyFormatRaw"] = 0] = "kWebCryptoKeyFormatRaw";
30
+ KWebCryptoKeyFormat[KWebCryptoKeyFormat["kWebCryptoKeyFormatSPKI"] = 1] = "kWebCryptoKeyFormatSPKI";
31
+ KWebCryptoKeyFormat[KWebCryptoKeyFormat["kWebCryptoKeyFormatPKCS8"] = 2] = "kWebCryptoKeyFormatPKCS8";
32
+ return KWebCryptoKeyFormat;
33
+ }(KWebCryptoKeyFormat || {});
34
+ var CipherOrWrapMode = /*#__PURE__*/function (CipherOrWrapMode) {
35
+ CipherOrWrapMode[CipherOrWrapMode["kWebCryptoCipherEncrypt"] = 0] = "kWebCryptoCipherEncrypt";
36
+ CipherOrWrapMode[CipherOrWrapMode["kWebCryptoCipherDecrypt"] = 1] = "kWebCryptoCipherDecrypt";
37
+ return CipherOrWrapMode;
38
+ }(CipherOrWrapMode || {}); // Placeholder functions that need to be implemented
39
+ function hasAnyNotIn(usages, allowed) {
40
+ return usages.some(usage => !allowed.includes(usage));
41
+ }
42
+ function normalizeAlgorithm(algorithm, _operation) {
43
+ if (typeof algorithm === 'string') {
44
+ return {
45
+ name: algorithm
46
+ };
47
+ }
48
+ return algorithm;
49
+ }
50
+ function getAlgorithmName(name, length) {
51
+ return `${name}${length}`;
52
+ }
53
+
54
+ // Placeholder implementations for missing functions
55
+ function ecExportKey(key, format) {
56
+ const keyObject = key.keyObject;
57
+ if (format === KWebCryptoKeyFormat.kWebCryptoKeyFormatSPKI) {
58
+ // Export public key in SPKI format
59
+ const exported = keyObject.export({
60
+ format: 'der',
61
+ type: 'spki'
62
+ });
63
+ return bufferLikeToArrayBuffer(exported);
64
+ } else if (format === KWebCryptoKeyFormat.kWebCryptoKeyFormatPKCS8) {
65
+ // Export private key in PKCS8 format
66
+ const exported = keyObject.export({
67
+ format: 'der',
68
+ type: 'pkcs8'
69
+ });
70
+ return bufferLikeToArrayBuffer(exported);
71
+ } else {
72
+ throw new Error(`Unsupported EC export format: ${format}`);
73
+ }
74
+ }
75
+ function rsaExportKey(key, format) {
76
+ const keyObject = key.keyObject;
77
+ if (format === KWebCryptoKeyFormat.kWebCryptoKeyFormatSPKI) {
78
+ // Export public key in SPKI format
79
+ const exported = keyObject.export({
80
+ format: 'der',
81
+ type: 'spki'
82
+ });
83
+ return bufferLikeToArrayBuffer(exported);
84
+ } else if (format === KWebCryptoKeyFormat.kWebCryptoKeyFormatPKCS8) {
85
+ // Export private key in PKCS8 format
86
+ const exported = keyObject.export({
87
+ format: 'der',
88
+ type: 'pkcs8'
89
+ });
90
+ return bufferLikeToArrayBuffer(exported);
91
+ } else {
92
+ throw new Error(`Unsupported RSA export format: ${format}`);
93
+ }
94
+ }
95
+ async function rsaCipher(mode, key, data, algorithm) {
96
+ const rsaParams = algorithm;
97
+
98
+ // Validate key type matches operation
99
+ const expectedType = mode === CipherOrWrapMode.kWebCryptoCipherEncrypt ? 'public' : 'private';
100
+ if (key.type !== expectedType) {
101
+ throw lazyDOMException('The requested operation is not valid for the provided key', 'InvalidAccessError');
102
+ }
103
+
104
+ // Get hash algorithm from key
105
+ const hashAlgorithm = normalizeHashName(key.algorithm.hash);
106
+
107
+ // Prepare label (optional)
108
+ const label = rsaParams.label ? bufferLikeToArrayBuffer(rsaParams.label) : undefined;
109
+
110
+ // Create RSA cipher instance
111
+ const rsaCipherModule = NitroModules.createHybridObject('RsaCipher');
112
+
113
+ // RSA-OAEP padding constant = 4
114
+ const RSA_PKCS1_OAEP_PADDING = 4;
115
+ if (mode === CipherOrWrapMode.kWebCryptoCipherEncrypt) {
116
+ // Encrypt with public key
117
+ return rsaCipherModule.encrypt(key.keyObject.handle, data, RSA_PKCS1_OAEP_PADDING, hashAlgorithm, label);
118
+ } else {
119
+ // Decrypt with private key
120
+ return rsaCipherModule.decrypt(key.keyObject.handle, data, RSA_PKCS1_OAEP_PADDING, hashAlgorithm, label);
121
+ }
122
+ }
123
+ async function aesCipher(mode, key, data, algorithm) {
124
+ const {
125
+ name
126
+ } = algorithm;
127
+ switch (name) {
128
+ case 'AES-CTR':
129
+ return aesCtrCipher(mode, key, data, algorithm);
130
+ case 'AES-CBC':
131
+ return aesCbcCipher(mode, key, data, algorithm);
132
+ case 'AES-GCM':
133
+ return aesGcmCipher(mode, key, data, algorithm);
134
+ default:
135
+ throw lazyDOMException(`Unsupported AES algorithm: ${name}`, 'NotSupportedError');
136
+ }
137
+ }
138
+ async function aesCtrCipher(mode, key, data, algorithm) {
139
+ // Validate counter and length
140
+ if (!algorithm.counter || algorithm.counter.byteLength !== 16) {
141
+ throw lazyDOMException('AES-CTR algorithm.counter must be 16 bytes', 'OperationError');
142
+ }
143
+ if (algorithm.length < 1 || algorithm.length > 128) {
144
+ throw lazyDOMException('AES-CTR algorithm.length must be between 1 and 128', 'OperationError');
145
+ }
146
+
147
+ // Get cipher type based on key length
148
+ const keyLength = key.algorithm.length;
149
+ const cipherType = `aes-${keyLength}-ctr`;
150
+
151
+ // Create cipher
152
+ const factory = NitroModules.createHybridObject('CipherFactory');
153
+ const cipher = factory.createCipher({
154
+ isCipher: mode === CipherOrWrapMode.kWebCryptoCipherEncrypt,
155
+ cipherType,
156
+ cipherKey: bufferLikeToArrayBuffer(key.keyObject.export()),
157
+ iv: bufferLikeToArrayBuffer(algorithm.counter)
158
+ });
159
+
160
+ // Process data
161
+ const updated = cipher.update(data);
162
+ const final = cipher.final();
163
+
164
+ // Concatenate results
165
+ const result = new Uint8Array(updated.byteLength + final.byteLength);
166
+ result.set(new Uint8Array(updated), 0);
167
+ result.set(new Uint8Array(final), updated.byteLength);
168
+ return result.buffer;
169
+ }
170
+ async function aesCbcCipher(mode, key, data, algorithm) {
171
+ // Validate IV
172
+ const iv = bufferLikeToArrayBuffer(algorithm.iv);
173
+ if (iv.byteLength !== 16) {
174
+ throw lazyDOMException('algorithm.iv must contain exactly 16 bytes', 'OperationError');
175
+ }
176
+
177
+ // Get cipher type based on key length
178
+ const keyLength = key.algorithm.length;
179
+ const cipherType = `aes-${keyLength}-cbc`;
180
+
181
+ // Create cipher
182
+ const factory = NitroModules.createHybridObject('CipherFactory');
183
+ const cipher = factory.createCipher({
184
+ isCipher: mode === CipherOrWrapMode.kWebCryptoCipherEncrypt,
185
+ cipherType,
186
+ cipherKey: bufferLikeToArrayBuffer(key.keyObject.export()),
187
+ iv
188
+ });
189
+
190
+ // Process data
191
+ const updated = cipher.update(data);
192
+ const final = cipher.final();
193
+
194
+ // Concatenate results
195
+ const result = new Uint8Array(updated.byteLength + final.byteLength);
196
+ result.set(new Uint8Array(updated), 0);
197
+ result.set(new Uint8Array(final), updated.byteLength);
198
+ return result.buffer;
199
+ }
200
+ async function aesGcmCipher(mode, key, data, algorithm) {
201
+ const {
202
+ tagLength = 128
203
+ } = algorithm;
204
+
205
+ // Validate tag length
206
+ const validTagLengths = [32, 64, 96, 104, 112, 120, 128];
207
+ if (!validTagLengths.includes(tagLength)) {
208
+ throw lazyDOMException(`${tagLength} is not a valid AES-GCM tag length`, 'OperationError');
209
+ }
210
+ const tagByteLength = tagLength / 8;
211
+
212
+ // Get cipher type based on key length
213
+ const keyLength = key.algorithm.length;
214
+ const cipherType = `aes-${keyLength}-gcm`;
215
+
216
+ // Create cipher
217
+ const factory = NitroModules.createHybridObject('CipherFactory');
218
+ const cipher = factory.createCipher({
219
+ isCipher: mode === CipherOrWrapMode.kWebCryptoCipherEncrypt,
220
+ cipherType,
221
+ cipherKey: bufferLikeToArrayBuffer(key.keyObject.export()),
222
+ iv: bufferLikeToArrayBuffer(algorithm.iv),
223
+ authTagLen: tagByteLength
224
+ });
225
+ let processData;
226
+ let authTag;
227
+ if (mode === CipherOrWrapMode.kWebCryptoCipherDecrypt) {
228
+ // For decryption, extract auth tag from end of data
229
+ const dataView = new Uint8Array(data);
230
+ if (dataView.byteLength < tagByteLength) {
231
+ throw lazyDOMException('The provided data is too small.', 'OperationError');
232
+ }
233
+
234
+ // Split data and tag
235
+ const ciphertextLength = dataView.byteLength - tagByteLength;
236
+ processData = dataView.slice(0, ciphertextLength).buffer;
237
+ authTag = dataView.slice(ciphertextLength).buffer;
238
+
239
+ // Set auth tag for verification
240
+ cipher.setAuthTag(authTag);
241
+ } else {
242
+ processData = data;
243
+ }
244
+
245
+ // Set additional authenticated data if provided
246
+ if (algorithm.additionalData) {
247
+ cipher.setAAD(bufferLikeToArrayBuffer(algorithm.additionalData));
248
+ }
249
+
250
+ // Process data
251
+ const updated = cipher.update(processData);
252
+ const final = cipher.final();
253
+ if (mode === CipherOrWrapMode.kWebCryptoCipherEncrypt) {
254
+ // For encryption, append auth tag to result
255
+ const tag = cipher.getAuthTag();
256
+ const result = new Uint8Array(updated.byteLength + final.byteLength + tag.byteLength);
257
+ result.set(new Uint8Array(updated), 0);
258
+ result.set(new Uint8Array(final), updated.byteLength);
259
+ result.set(new Uint8Array(tag), updated.byteLength + final.byteLength);
260
+ return result.buffer;
261
+ } else {
262
+ // For decryption, just concatenate plaintext
263
+ const result = new Uint8Array(updated.byteLength + final.byteLength);
264
+ result.set(new Uint8Array(updated), 0);
265
+ result.set(new Uint8Array(final), updated.byteLength);
266
+ return result.buffer;
267
+ }
268
+ }
269
+ async function aesGenerateKey(algorithm, extractable, keyUsages) {
270
+ const {
271
+ length
272
+ } = algorithm;
273
+ const name = algorithm.name;
274
+ if (!name) {
275
+ throw lazyDOMException('Algorithm name is required', 'OperationError');
276
+ }
277
+
278
+ // Validate key length
279
+ if (![128, 192, 256].includes(length)) {
280
+ throw lazyDOMException(`Invalid AES key length: ${length}. Must be 128, 192, or 256.`, 'OperationError');
281
+ }
282
+
283
+ // Validate usages
284
+ const validUsages = ['encrypt', 'decrypt', 'wrapKey', 'unwrapKey'];
285
+ if (hasAnyNotIn(keyUsages, validUsages)) {
286
+ throw lazyDOMException(`Unsupported key usage for ${name}`, 'SyntaxError');
287
+ }
288
+
289
+ // Generate random key bytes
290
+ const keyBytes = new Uint8Array(length / 8);
291
+ getRandomValues(keyBytes);
292
+
293
+ // Create secret key
294
+ const keyObject = createSecretKey(keyBytes);
295
+
296
+ // Construct algorithm object with guaranteed name
297
+ const keyAlgorithm = {
298
+ name,
299
+ length
300
+ };
301
+ return new CryptoKey(keyObject, keyAlgorithm, keyUsages, extractable);
302
+ }
303
+ async function hmacGenerateKey(algorithm, extractable, keyUsages) {
304
+ // Validate usages
305
+ if (hasAnyNotIn(keyUsages, ['sign', 'verify'])) {
306
+ throw lazyDOMException('Unsupported key usage for HMAC key', 'SyntaxError');
307
+ }
308
+
309
+ // Get hash algorithm
310
+ const hash = algorithm.hash;
311
+ if (!hash) {
312
+ throw lazyDOMException('HMAC algorithm requires a hash parameter', 'TypeError');
313
+ }
314
+ const hashName = normalizeHashName(hash);
315
+
316
+ // Determine key length
317
+ let length = algorithm.length;
318
+ if (length === undefined) {
319
+ // Use hash output length as default key length
320
+ switch (hashName) {
321
+ case 'SHA-1':
322
+ length = 160;
323
+ break;
324
+ case 'SHA-256':
325
+ length = 256;
326
+ break;
327
+ case 'SHA-384':
328
+ length = 384;
329
+ break;
330
+ case 'SHA-512':
331
+ length = 512;
332
+ break;
333
+ default:
334
+ length = 256;
335
+ // Default to 256 bits
336
+ }
337
+ }
338
+ if (length === 0) {
339
+ throw lazyDOMException('Zero-length key is not supported', 'OperationError');
340
+ }
341
+
342
+ // Generate random key bytes
343
+ const keyBytes = new Uint8Array(Math.ceil(length / 8));
344
+ getRandomValues(keyBytes);
345
+
346
+ // Create secret key
347
+ const keyObject = createSecretKey(keyBytes);
348
+
349
+ // Construct algorithm object
350
+ const keyAlgorithm = {
351
+ name: 'HMAC',
352
+ hash: hashName,
353
+ length
354
+ };
355
+ return new CryptoKey(keyObject, keyAlgorithm, keyUsages, extractable);
356
+ }
357
+ function rsaImportKey(format, data, algorithm, extractable, keyUsages) {
358
+ const {
359
+ name
360
+ } = algorithm;
361
+
362
+ // Validate usages
363
+ let checkSet;
364
+ switch (name) {
365
+ case 'RSASSA-PKCS1-v1_5':
366
+ case 'RSA-PSS':
367
+ checkSet = ['sign', 'verify'];
368
+ break;
369
+ case 'RSA-OAEP':
370
+ checkSet = ['encrypt', 'decrypt', 'wrapKey', 'unwrapKey'];
371
+ break;
372
+ default:
373
+ throw new Error(`Unsupported RSA algorithm: ${name}`);
374
+ }
375
+ if (hasAnyNotIn(keyUsages, checkSet)) {
376
+ throw new Error(`Unsupported key usage for ${name}`);
377
+ }
378
+ let keyObject;
379
+ if (format === 'jwk') {
380
+ const jwk = data;
381
+
382
+ // Validate JWK
383
+ if (jwk.kty !== 'RSA') {
384
+ throw new Error('Invalid JWK format for RSA key');
385
+ }
386
+ const handle = NitroModules.createHybridObject('KeyObjectHandle');
387
+ const keyType = handle.initJwk(jwk, undefined);
388
+ if (keyType === undefined) {
389
+ throw new Error('Failed to import RSA JWK');
390
+ }
391
+
392
+ // Create the appropriate KeyObject based on type
393
+ if (keyType === 1) {
394
+ keyObject = new PublicKeyObject(handle);
395
+ } else if (keyType === 2) {
396
+ keyObject = new PrivateKeyObject(handle);
397
+ } else {
398
+ throw new Error('Unexpected key type from RSA JWK import');
399
+ }
400
+ } else if (format === 'spki') {
401
+ const keyData = bufferLikeToArrayBuffer(data);
402
+ keyObject = KeyObject.createKeyObject('public', keyData, KFormatType.DER, KeyEncoding.SPKI);
403
+ } else if (format === 'pkcs8') {
404
+ const keyData = bufferLikeToArrayBuffer(data);
405
+ keyObject = KeyObject.createKeyObject('private', keyData, KFormatType.DER, KeyEncoding.PKCS8);
406
+ } else {
407
+ throw new Error(`Unsupported format for RSA import: ${format}`);
408
+ }
409
+
410
+ // Get the modulus length from the key and add it to the algorithm
411
+ const keyDetails = keyObject.asymmetricKeyDetails;
412
+
413
+ // Convert publicExponent number to big-endian byte array
414
+ let publicExponentBytes;
415
+ if (keyDetails?.publicExponent) {
416
+ const exp = keyDetails.publicExponent;
417
+ // Convert number to big-endian bytes
418
+ const bytes = [];
419
+ let value = exp;
420
+ while (value > 0) {
421
+ bytes.unshift(value & 0xff);
422
+ value = Math.floor(value / 256);
423
+ }
424
+ publicExponentBytes = new Uint8Array(bytes.length > 0 ? bytes : [0]);
425
+ }
426
+ const algorithmWithDetails = {
427
+ ...algorithm,
428
+ modulusLength: keyDetails?.modulusLength,
429
+ publicExponent: publicExponentBytes
430
+ };
431
+ return new CryptoKey(keyObject, algorithmWithDetails, keyUsages, extractable);
432
+ }
433
+ async function hmacImportKey(algorithm, format, data, extractable, keyUsages) {
434
+ // Validate usages
435
+ if (hasAnyNotIn(keyUsages, ['sign', 'verify'])) {
436
+ throw new Error('Unsupported key usage for an HMAC key');
437
+ }
438
+ let keyObject;
439
+ if (format === 'jwk') {
440
+ const jwk = data;
441
+
442
+ // Validate JWK
443
+ if (!jwk || typeof jwk !== 'object') {
444
+ throw new Error('Invalid keyData');
445
+ }
446
+ if (jwk.kty !== 'oct') {
447
+ throw new Error('Invalid JWK format for HMAC key');
448
+ }
449
+
450
+ // Validate key length if specified
451
+ if (algorithm.length !== undefined) {
452
+ if (!jwk.k) {
453
+ throw new Error('JWK missing key data');
454
+ }
455
+ // Decode to check length
456
+ const decoded = SBuffer.from(jwk.k, 'base64');
457
+ const keyBitLength = decoded.length * 8;
458
+ if (algorithm.length === 0) {
459
+ throw new Error('Zero-length key is not supported');
460
+ }
461
+ if (algorithm.length !== keyBitLength) {
462
+ throw new Error('Invalid key length');
463
+ }
464
+ }
465
+ const handle = NitroModules.createHybridObject('KeyObjectHandle');
466
+ const keyType = handle.initJwk(jwk, undefined);
467
+ if (keyType === undefined || keyType !== 0) {
468
+ throw new Error('Failed to import HMAC JWK');
469
+ }
470
+ keyObject = new SecretKeyObject(handle);
471
+ } else if (format === 'raw') {
472
+ keyObject = createSecretKey(data);
473
+ } else {
474
+ throw new Error(`Unable to import HMAC key with format ${format}`);
475
+ }
476
+ return new CryptoKey(keyObject, {
477
+ ...algorithm,
478
+ name: 'HMAC'
479
+ }, keyUsages, extractable);
480
+ }
481
+ async function aesImportKey(algorithm, format, data, extractable, keyUsages) {
482
+ const {
483
+ name,
484
+ length
485
+ } = algorithm;
486
+
487
+ // Validate usages
488
+ const validUsages = ['encrypt', 'decrypt', 'wrapKey', 'unwrapKey'];
489
+ if (hasAnyNotIn(keyUsages, validUsages)) {
490
+ throw new Error(`Unsupported key usage for ${name}`);
491
+ }
492
+ let keyObject;
493
+ let actualLength;
494
+ if (format === 'jwk') {
495
+ const jwk = data;
496
+
497
+ // Validate JWK
498
+ if (jwk.kty !== 'oct') {
499
+ throw new Error('Invalid JWK format for AES key');
500
+ }
501
+ const handle = NitroModules.createHybridObject('KeyObjectHandle');
502
+ const keyType = handle.initJwk(jwk, undefined);
503
+ if (keyType === undefined || keyType !== 0) {
504
+ throw new Error('Failed to import AES JWK');
505
+ }
506
+ keyObject = new SecretKeyObject(handle);
507
+
508
+ // Get actual key length from imported key
509
+ const exported = keyObject.export();
510
+ actualLength = exported.byteLength * 8;
511
+ } else if (format === 'raw') {
512
+ const keyData = bufferLikeToArrayBuffer(data);
513
+ actualLength = keyData.byteLength * 8;
514
+
515
+ // Validate key length
516
+ if (![128, 192, 256].includes(actualLength)) {
517
+ throw new Error('Invalid AES key length');
518
+ }
519
+ keyObject = createSecretKey(keyData);
520
+ } else {
521
+ throw new Error(`Unsupported format for AES import: ${format}`);
522
+ }
523
+
524
+ // Validate length if specified
525
+ if (length !== undefined && length !== actualLength) {
526
+ throw new Error(`Key length mismatch: expected ${length}, got ${actualLength}`);
527
+ }
528
+ return new CryptoKey(keyObject, {
529
+ name,
530
+ length: actualLength
531
+ }, keyUsages, extractable);
532
+ }
533
+ function edImportKey(format, data, algorithm, extractable, keyUsages) {
534
+ const {
535
+ name
536
+ } = algorithm;
537
+
538
+ // Validate usages
539
+ if (hasAnyNotIn(keyUsages, ['sign', 'verify'])) {
540
+ throw lazyDOMException(`Unsupported key usage for ${name} key`, 'SyntaxError');
541
+ }
542
+ let keyObject;
543
+ if (format === 'spki') {
544
+ // Import public key
545
+ const keyData = bufferLikeToArrayBuffer(data);
546
+ keyObject = KeyObject.createKeyObject('public', keyData, KFormatType.DER, KeyEncoding.SPKI);
547
+ } else if (format === 'pkcs8') {
548
+ // Import private key
549
+ const keyData = bufferLikeToArrayBuffer(data);
550
+ keyObject = KeyObject.createKeyObject('private', keyData, KFormatType.DER, KeyEncoding.PKCS8);
551
+ } else if (format === 'raw') {
552
+ // Raw format - public key only for Ed keys
553
+ const keyData = bufferLikeToArrayBuffer(data);
554
+ const handle = NitroModules.createHybridObject('KeyObjectHandle');
555
+ // For raw Ed keys, we need to create them differently
556
+ // Raw public keys are just the key bytes
557
+ handle.init(1, keyData); // 1 = public key type
558
+ keyObject = new PublicKeyObject(handle);
559
+ } else {
560
+ throw lazyDOMException(`Unsupported format for ${name} import: ${format}`, 'NotSupportedError');
561
+ }
562
+ return new CryptoKey(keyObject, {
563
+ name
564
+ }, keyUsages, extractable);
565
+ }
566
+ const exportKeySpki = async key => {
567
+ switch (key.algorithm.name) {
568
+ case 'RSASSA-PKCS1-v1_5':
569
+ // Fall through
570
+ case 'RSA-PSS':
571
+ // Fall through
572
+ case 'RSA-OAEP':
573
+ if (key.type === 'public') {
574
+ return rsaExportKey(key, KWebCryptoKeyFormat.kWebCryptoKeyFormatSPKI);
575
+ }
576
+ break;
577
+ case 'ECDSA':
578
+ // Fall through
579
+ case 'ECDH':
580
+ if (key.type === 'public') {
581
+ return ecExportKey(key, KWebCryptoKeyFormat.kWebCryptoKeyFormatSPKI);
582
+ }
583
+ break;
584
+ case 'Ed25519':
585
+ // Fall through
586
+ case 'Ed448':
587
+ if (key.type === 'public') {
588
+ // Export Ed key in SPKI DER format
589
+ return bufferLikeToArrayBuffer(key.keyObject.handle.exportKey(KFormatType.DER, KeyEncoding.SPKI));
590
+ }
591
+ break;
592
+ }
593
+ throw new Error(`Unable to export a spki ${key.algorithm.name} ${key.type} key`);
594
+ };
595
+ const exportKeyPkcs8 = async key => {
596
+ switch (key.algorithm.name) {
597
+ case 'RSASSA-PKCS1-v1_5':
598
+ // Fall through
599
+ case 'RSA-PSS':
600
+ // Fall through
601
+ case 'RSA-OAEP':
602
+ if (key.type === 'private') {
603
+ return rsaExportKey(key, KWebCryptoKeyFormat.kWebCryptoKeyFormatPKCS8);
604
+ }
605
+ break;
606
+ case 'ECDSA':
607
+ // Fall through
608
+ case 'ECDH':
609
+ if (key.type === 'private') {
610
+ return ecExportKey(key, KWebCryptoKeyFormat.kWebCryptoKeyFormatPKCS8);
611
+ }
612
+ break;
613
+ case 'Ed25519':
614
+ // Fall through
615
+ case 'Ed448':
616
+ if (key.type === 'private') {
617
+ // Export Ed key in PKCS8 DER format
618
+ return bufferLikeToArrayBuffer(key.keyObject.handle.exportKey(KFormatType.DER, KeyEncoding.PKCS8));
619
+ }
620
+ break;
621
+ }
622
+ throw new Error(`Unable to export a pkcs8 ${key.algorithm.name} ${key.type} key`);
623
+ };
624
+ const exportKeyRaw = key => {
625
+ switch (key.algorithm.name) {
626
+ case 'ECDSA':
627
+ // Fall through
628
+ case 'ECDH':
629
+ if (key.type === 'public') {
630
+ return ecExportKey(key, KWebCryptoKeyFormat.kWebCryptoKeyFormatRaw);
631
+ }
632
+ break;
633
+ case 'AES-CTR':
634
+ // Fall through
635
+ case 'AES-CBC':
636
+ // Fall through
637
+ case 'AES-GCM':
638
+ // Fall through
639
+ case 'AES-KW':
640
+ // Fall through
641
+ case 'HMAC':
642
+ {
643
+ const exported = key.keyObject.export();
644
+ // Convert Buffer to ArrayBuffer
645
+ return exported.buffer.slice(exported.byteOffset, exported.byteOffset + exported.byteLength);
646
+ }
647
+ }
648
+ throw lazyDOMException(`Unable to export a raw ${key.algorithm.name} ${key.type} key`, 'InvalidAccessError');
649
+ };
650
+ const exportKeyJWK = key => {
651
+ const jwk = key.keyObject.handle.exportJwk({
652
+ key_ops: key.usages,
653
+ ext: key.extractable
654
+ }, true);
655
+ switch (key.algorithm.name) {
656
+ case 'RSASSA-PKCS1-v1_5':
657
+ jwk.alg = normalizeHashName(key.algorithm.hash, HashContext.JwkRsa);
658
+ return jwk;
659
+ case 'RSA-PSS':
660
+ jwk.alg = normalizeHashName(key.algorithm.hash, HashContext.JwkRsaPss);
661
+ return jwk;
662
+ case 'RSA-OAEP':
663
+ jwk.alg = normalizeHashName(key.algorithm.hash, HashContext.JwkRsaOaep);
664
+ return jwk;
665
+ case 'HMAC':
666
+ jwk.alg = normalizeHashName(key.algorithm.hash, HashContext.JwkHmac);
667
+ return jwk;
668
+ case 'ECDSA':
669
+ // Fall through
670
+ case 'ECDH':
671
+ jwk.crv ||= key.algorithm.namedCurve;
672
+ return jwk;
673
+ case 'AES-CTR':
674
+ // Fall through
675
+ case 'AES-CBC':
676
+ // Fall through
677
+ case 'AES-GCM':
678
+ // Fall through
679
+ case 'AES-KW':
680
+ if (key.algorithm.length === undefined) {
681
+ throw lazyDOMException(`Algorithm ${key.algorithm.name} missing required length property`, 'InvalidAccessError');
682
+ }
683
+ jwk.alg = getAlgorithmName(key.algorithm.name, key.algorithm.length);
684
+ return jwk;
685
+ default:
686
+ // Fall through
687
+ }
688
+ throw lazyDOMException(`JWK export not yet supported: ${key.algorithm.name}`, 'NotSupportedError');
689
+ };
690
+ const importGenericSecretKey = async ({
691
+ name,
692
+ length
693
+ }, format, keyData, extractable, keyUsages) => {
694
+ if (extractable) {
695
+ throw new Error(`${name} keys are not extractable`);
696
+ }
697
+ if (hasAnyNotIn(keyUsages, ['deriveKey', 'deriveBits'])) {
698
+ throw new Error(`Unsupported key usage for a ${name} key`);
699
+ }
700
+ switch (format) {
701
+ case 'raw':
702
+ {
703
+ if (hasAnyNotIn(keyUsages, ['deriveKey', 'deriveBits'])) {
704
+ throw new Error(`Unsupported key usage for a ${name} key`);
705
+ }
706
+ const checkLength = typeof keyData === 'string' || SBuffer.isBuffer(keyData) ? keyData.length * 8 : keyData.byteLength * 8;
707
+ if (length !== undefined && length !== checkLength) {
708
+ throw new Error('Invalid key length');
709
+ }
710
+ const keyObject = createSecretKey(keyData);
711
+ return new CryptoKey(keyObject, {
712
+ name
713
+ }, keyUsages, false);
714
+ }
715
+ }
716
+ throw new Error(`Unable to import ${name} key with format ${format}`);
717
+ };
718
+ const checkCryptoKeyPairUsages = pair => {
719
+ if (pair.privateKey && pair.privateKey instanceof CryptoKey && pair.privateKey.keyUsages && pair.privateKey.keyUsages.length > 0) {
720
+ return;
721
+ }
722
+ throw lazyDOMException('Usages cannot be empty when creating a key.', 'SyntaxError');
723
+ };
724
+
725
+ // Type guard to check if result is CryptoKeyPair
726
+ export function isCryptoKeyPair(result) {
727
+ return 'publicKey' in result && 'privateKey' in result;
728
+ }
729
+ function hmacSignVerify(key, data, signature) {
730
+ // Get hash algorithm from key
731
+ const hashName = normalizeHashName(key.algorithm.hash);
732
+
733
+ // Export the secret key material
734
+ const keyData = key.keyObject.export();
735
+
736
+ // Create HMAC and compute digest
737
+ const hmac = createHmac(hashName, keyData);
738
+ hmac.update(bufferLikeToArrayBuffer(data));
739
+ const computed = hmac.digest();
740
+ if (signature === undefined) {
741
+ // Sign operation - return the HMAC as ArrayBuffer
742
+ return computed.buffer.slice(computed.byteOffset, computed.byteOffset + computed.byteLength);
743
+ }
744
+
745
+ // Verify operation - compare computed HMAC with provided signature
746
+ const sigBytes = new Uint8Array(bufferLikeToArrayBuffer(signature));
747
+ const computedBytes = new Uint8Array(computed.buffer, computed.byteOffset, computed.byteLength);
748
+ if (computedBytes.length !== sigBytes.length) {
749
+ return false;
750
+ }
751
+
752
+ // Constant-time comparison to prevent timing attacks
753
+ let result = 0;
754
+ for (let i = 0; i < computedBytes.length; i++) {
755
+ result |= computedBytes[i] ^ sigBytes[i];
756
+ }
757
+ return result === 0;
758
+ }
759
+ function rsaSignVerify(key, data, padding, signature, saltLength) {
760
+ // Get hash algorithm from key
761
+ const hashName = normalizeHashName(key.algorithm.hash);
762
+
763
+ // Determine RSA padding constant
764
+ const RSA_PKCS1_PADDING = 1;
765
+ const RSA_PKCS1_PSS_PADDING = 6;
766
+ const paddingValue = padding === 'pss' ? RSA_PKCS1_PSS_PADDING : RSA_PKCS1_PADDING;
767
+ if (signature === undefined) {
768
+ // Sign operation
769
+ const signer = createSign(hashName);
770
+ signer.update(data);
771
+ const sig = signer.sign({
772
+ key: key,
773
+ padding: paddingValue,
774
+ saltLength
775
+ });
776
+ return sig.buffer.slice(sig.byteOffset, sig.byteOffset + sig.byteLength);
777
+ }
778
+
779
+ // Verify operation
780
+ const verifier = createVerify(hashName);
781
+ verifier.update(data);
782
+ return verifier.verify({
783
+ key: key,
784
+ padding: paddingValue,
785
+ saltLength
786
+ }, signature);
787
+ }
788
+ function edSignVerify(key, data, signature) {
789
+ const isSign = signature === undefined;
790
+ const expectedKeyType = isSign ? 'private' : 'public';
791
+ if (key.type !== expectedKeyType) {
792
+ throw lazyDOMException(`Key must be a ${expectedKeyType} key`, 'InvalidAccessError');
793
+ }
794
+
795
+ // Get curve type from algorithm name (Ed25519 or Ed448)
796
+ const algorithmName = key.algorithm.name;
797
+ const curveType = algorithmName.toLowerCase();
798
+
799
+ // Create Ed instance with the curve
800
+ const ed = new Ed(curveType, {});
801
+
802
+ // Export raw key bytes (exportKey with no format returns raw for Ed keys)
803
+ const rawKey = key.keyObject.handle.exportKey();
804
+ const dataBuffer = bufferLikeToArrayBuffer(data);
805
+ if (isSign) {
806
+ // Sign operation - use raw private key
807
+ const sig = ed.signSync(dataBuffer, rawKey);
808
+ return sig;
809
+ } else {
810
+ // Verify operation - use raw public key
811
+ const signatureBuffer = bufferLikeToArrayBuffer(signature);
812
+ return ed.verifySync(signatureBuffer, dataBuffer, rawKey);
813
+ }
814
+ }
815
+ const signVerify = (algorithm, key, data, signature) => {
816
+ const usage = signature === undefined ? 'sign' : 'verify';
817
+ algorithm = normalizeAlgorithm(algorithm, usage);
818
+ if (!key.usages.includes(usage) || algorithm.name !== key.algorithm.name) {
819
+ throw lazyDOMException(`Unable to use this key to ${usage}`, 'InvalidAccessError');
820
+ }
821
+ switch (algorithm.name) {
822
+ case 'ECDSA':
823
+ return ecdsaSignVerify(key, data, algorithm, signature);
824
+ case 'HMAC':
825
+ return hmacSignVerify(key, data, signature);
826
+ case 'RSASSA-PKCS1-v1_5':
827
+ return rsaSignVerify(key, data, 'pkcs1', signature);
828
+ case 'RSA-PSS':
829
+ return rsaSignVerify(key, data, 'pss', signature, algorithm.saltLength);
830
+ case 'Ed25519':
831
+ case 'Ed448':
832
+ return edSignVerify(key, data, signature);
833
+ }
834
+ throw lazyDOMException(`Unrecognized algorithm name '${algorithm.name}' for '${usage}'`, 'NotSupportedError');
835
+ };
836
+ const cipherOrWrap = async (mode, algorithm, key, data, op) => {
837
+ if (key.algorithm.name !== algorithm.name || !key.usages.includes(op)) {
838
+ throw lazyDOMException('The requested operation is not valid for the provided key', 'InvalidAccessError');
839
+ }
840
+ validateMaxBufferLength(data, 'data');
841
+ switch (algorithm.name) {
842
+ case 'RSA-OAEP':
843
+ return rsaCipher(mode, key, data, algorithm);
844
+ case 'AES-CTR':
845
+ // Fall through
846
+ case 'AES-CBC':
847
+ // Fall through
848
+ case 'AES-GCM':
849
+ return aesCipher(mode, key, data, algorithm);
850
+ }
851
+ };
852
+ export class Subtle {
853
+ async decrypt(algorithm, key, data) {
854
+ const normalizedAlgorithm = normalizeAlgorithm(algorithm, 'decrypt');
855
+ return cipherOrWrap(CipherOrWrapMode.kWebCryptoCipherDecrypt, normalizedAlgorithm, key, bufferLikeToArrayBuffer(data), 'decrypt');
856
+ }
857
+ async digest(algorithm, data) {
858
+ const normalizedAlgorithm = normalizeAlgorithm(algorithm, 'digest');
859
+ return asyncDigest(normalizedAlgorithm, data);
860
+ }
861
+ async deriveBits(algorithm, baseKey, length) {
862
+ if (!baseKey.keyUsages.includes('deriveBits')) {
863
+ throw new Error('baseKey does not have deriveBits usage');
864
+ }
865
+ if (baseKey.algorithm.name !== algorithm.name) throw new Error('Key algorithm mismatch');
866
+ switch (algorithm.name) {
867
+ case 'PBKDF2':
868
+ return pbkdf2DeriveBits(algorithm, baseKey, length);
869
+ }
870
+ throw new Error(`'subtle.deriveBits()' for ${algorithm.name} is not implemented.`);
871
+ }
872
+ async encrypt(algorithm, key, data) {
873
+ const normalizedAlgorithm = normalizeAlgorithm(algorithm, 'encrypt');
874
+ return cipherOrWrap(CipherOrWrapMode.kWebCryptoCipherEncrypt, normalizedAlgorithm, key, bufferLikeToArrayBuffer(data), 'encrypt');
875
+ }
876
+ async exportKey(format, key) {
877
+ if (!key.extractable) throw new Error('key is not extractable');
878
+ switch (format) {
879
+ case 'spki':
880
+ return await exportKeySpki(key);
881
+ case 'pkcs8':
882
+ return await exportKeyPkcs8(key);
883
+ case 'jwk':
884
+ return exportKeyJWK(key);
885
+ case 'raw':
886
+ return exportKeyRaw(key);
887
+ }
888
+ }
889
+ async generateKey(algorithm, extractable, keyUsages) {
890
+ algorithm = normalizeAlgorithm(algorithm, 'generateKey');
891
+ let result;
892
+ switch (algorithm.name) {
893
+ case 'RSASSA-PKCS1-v1_5':
894
+ // Fall through
895
+ case 'RSA-PSS':
896
+ // Fall through
897
+ case 'RSA-OAEP':
898
+ result = await rsa_generateKeyPair(algorithm, extractable, keyUsages);
899
+ break;
900
+ case 'ECDSA':
901
+ // Fall through
902
+ case 'ECDH':
903
+ result = await ec_generateKeyPair(algorithm.name, algorithm.namedCurve, extractable, keyUsages);
904
+ checkCryptoKeyPairUsages(result);
905
+ break;
906
+ case 'AES-CTR':
907
+ // Fall through
908
+ case 'AES-CBC':
909
+ // Fall through
910
+ case 'AES-GCM':
911
+ // Fall through
912
+ case 'AES-KW':
913
+ result = await aesGenerateKey(algorithm, extractable, keyUsages);
914
+ break;
915
+ case 'HMAC':
916
+ result = await hmacGenerateKey(algorithm, extractable, keyUsages);
917
+ break;
918
+ case 'Ed25519':
919
+ // Fall through
920
+ case 'Ed448':
921
+ result = await ed_generateKeyPairWebCrypto(algorithm.name.toLowerCase(), extractable, keyUsages);
922
+ checkCryptoKeyPairUsages(result);
923
+ break;
924
+ default:
925
+ throw new Error(`'subtle.generateKey()' is not implemented for ${algorithm.name}.
926
+ Unrecognized algorithm name`);
927
+ }
928
+ return result;
929
+ }
930
+ async importKey(format, data, algorithm, extractable, keyUsages) {
931
+ const normalizedAlgorithm = normalizeAlgorithm(algorithm, 'importKey');
932
+ let result;
933
+ switch (normalizedAlgorithm.name) {
934
+ case 'RSASSA-PKCS1-v1_5':
935
+ // Fall through
936
+ case 'RSA-PSS':
937
+ // Fall through
938
+ case 'RSA-OAEP':
939
+ result = rsaImportKey(format, data, normalizedAlgorithm, extractable, keyUsages);
940
+ break;
941
+ case 'ECDSA':
942
+ // Fall through
943
+ case 'ECDH':
944
+ result = ecImportKey(format, data, normalizedAlgorithm, extractable, keyUsages);
945
+ break;
946
+ case 'HMAC':
947
+ result = await hmacImportKey(normalizedAlgorithm, format, data, extractable, keyUsages);
948
+ break;
949
+ case 'AES-CTR':
950
+ // Fall through
951
+ case 'AES-CBC':
952
+ // Fall through
953
+ case 'AES-GCM':
954
+ // Fall through
955
+ case 'AES-KW':
956
+ result = await aesImportKey(normalizedAlgorithm, format, data, extractable, keyUsages);
957
+ break;
958
+ case 'PBKDF2':
959
+ result = await importGenericSecretKey(normalizedAlgorithm, format, data, extractable, keyUsages);
960
+ break;
961
+ case 'Ed25519':
962
+ // Fall through
963
+ case 'Ed448':
964
+ result = edImportKey(format, data, normalizedAlgorithm, extractable, keyUsages);
965
+ break;
966
+ default:
967
+ throw new Error(`"subtle.importKey()" is not implemented for ${normalizedAlgorithm.name}`);
968
+ }
969
+ if ((result.type === 'secret' || result.type === 'private') && result.usages.length === 0) {
970
+ throw new Error(`Usages cannot be empty when importing a ${result.type} key.`);
971
+ }
972
+ return result;
973
+ }
974
+ async sign(algorithm, key, data) {
975
+ return signVerify(algorithm, key, data);
976
+ }
977
+ async verify(algorithm, key, signature, data) {
978
+ return signVerify(algorithm, key, data, signature);
979
+ }
980
+ }
981
+ export const subtle = new Subtle();
982
+ //# sourceMappingURL=subtle.js.map