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