react-native-quick-crypto 1.0.0-beta.2 → 1.0.0-beta.21

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 (462) hide show
  1. package/QuickCrypto.podspec +143 -7
  2. package/README.md +12 -6
  3. package/android/CMakeLists.txt +82 -21
  4. package/android/build.gradle +47 -4
  5. package/android/src/main/cpp/cpp-adapter.cpp +3 -10
  6. package/android/src/main/java/com/margelo/nitro/quickcrypto/QuickCryptoPackage.java +13 -10
  7. package/app.plugin.js +3 -0
  8. package/cpp/blake3/HybridBlake3.cpp +118 -0
  9. package/cpp/blake3/HybridBlake3.hpp +35 -0
  10. package/cpp/cipher/CCMCipher.cpp +199 -0
  11. package/cpp/cipher/CCMCipher.hpp +26 -0
  12. package/cpp/cipher/ChaCha20Cipher.cpp +97 -0
  13. package/cpp/cipher/ChaCha20Cipher.hpp +25 -0
  14. package/cpp/cipher/ChaCha20Poly1305Cipher.cpp +170 -0
  15. package/cpp/cipher/ChaCha20Poly1305Cipher.hpp +30 -0
  16. package/cpp/cipher/HybridCipher.cpp +322 -0
  17. package/cpp/cipher/HybridCipher.hpp +68 -0
  18. package/cpp/cipher/HybridCipherFactory.hpp +97 -0
  19. package/cpp/cipher/OCBCipher.cpp +55 -0
  20. package/cpp/cipher/OCBCipher.hpp +19 -0
  21. package/cpp/cipher/XSalsa20Cipher.cpp +61 -0
  22. package/cpp/cipher/XSalsa20Cipher.hpp +33 -0
  23. package/cpp/ec/HybridEcKeyPair.cpp +428 -0
  24. package/cpp/ec/HybridEcKeyPair.hpp +48 -0
  25. package/cpp/ed25519/HybridEdKeyPair.cpp +300 -0
  26. package/cpp/ed25519/HybridEdKeyPair.hpp +63 -0
  27. package/cpp/hash/HybridHash.cpp +185 -0
  28. package/cpp/hash/HybridHash.hpp +43 -0
  29. package/cpp/hmac/HybridHmac.cpp +95 -0
  30. package/cpp/hmac/HybridHmac.hpp +31 -0
  31. package/cpp/keys/HybridKeyObjectHandle.cpp +243 -0
  32. package/cpp/keys/HybridKeyObjectHandle.hpp +42 -0
  33. package/cpp/keys/KeyObjectData.cpp +226 -0
  34. package/cpp/keys/KeyObjectData.hpp +71 -0
  35. package/cpp/keys/node.h +5 -0
  36. package/cpp/pbkdf2/HybridPbkdf2.cpp +51 -0
  37. package/cpp/pbkdf2/HybridPbkdf2.hpp +24 -0
  38. package/cpp/random/HybridRandom.cpp +32 -18
  39. package/cpp/random/HybridRandom.hpp +18 -30
  40. package/cpp/rsa/HybridRsaKeyPair.cpp +154 -0
  41. package/cpp/rsa/HybridRsaKeyPair.hpp +43 -0
  42. package/cpp/utils/Macros.hpp +68 -0
  43. package/cpp/utils/Utils.hpp +53 -1
  44. package/deps/blake3/.cargo/config.toml +2 -0
  45. package/deps/blake3/.git-blame-ignore-revs +2 -0
  46. package/deps/blake3/.github/workflows/build_b3sum.py +38 -0
  47. package/deps/blake3/.github/workflows/ci.yml +491 -0
  48. package/deps/blake3/.github/workflows/tag.yml +43 -0
  49. package/deps/blake3/.github/workflows/upload_github_release_asset.py +73 -0
  50. package/deps/blake3/CONTRIBUTING.md +31 -0
  51. package/deps/blake3/Cargo.toml +135 -0
  52. package/deps/blake3/LICENSE_A2 +202 -0
  53. package/deps/blake3/LICENSE_A2LLVM +219 -0
  54. package/deps/blake3/LICENSE_CC0 +121 -0
  55. package/deps/blake3/README.md +229 -0
  56. package/deps/blake3/b3sum/Cargo.lock +513 -0
  57. package/deps/blake3/b3sum/Cargo.toml +26 -0
  58. package/deps/blake3/b3sum/README.md +72 -0
  59. package/deps/blake3/b3sum/src/main.rs +564 -0
  60. package/deps/blake3/b3sum/src/unit_tests.rs +235 -0
  61. package/deps/blake3/b3sum/tests/cli_tests.rs +680 -0
  62. package/deps/blake3/b3sum/what_does_check_do.md +176 -0
  63. package/deps/blake3/benches/bench.rs +623 -0
  64. package/deps/blake3/build.rs +389 -0
  65. package/deps/blake3/c/CMakeLists.txt +383 -0
  66. package/deps/blake3/c/CMakePresets.json +73 -0
  67. package/deps/blake3/c/Makefile.testing +82 -0
  68. package/deps/blake3/c/README.md +403 -0
  69. package/deps/blake3/c/blake3-config.cmake.in +14 -0
  70. package/deps/blake3/c/blake3.c +650 -0
  71. package/deps/blake3/c/blake3.h +86 -0
  72. package/deps/blake3/c/blake3_avx2.c +326 -0
  73. package/deps/blake3/c/blake3_avx2_x86-64_unix.S +1815 -0
  74. package/deps/blake3/c/blake3_avx2_x86-64_windows_gnu.S +1817 -0
  75. package/deps/blake3/c/blake3_avx2_x86-64_windows_msvc.asm +1828 -0
  76. package/deps/blake3/c/blake3_avx512.c +1388 -0
  77. package/deps/blake3/c/blake3_avx512_x86-64_unix.S +4824 -0
  78. package/deps/blake3/c/blake3_avx512_x86-64_windows_gnu.S +2615 -0
  79. package/deps/blake3/c/blake3_avx512_x86-64_windows_msvc.asm +2634 -0
  80. package/deps/blake3/c/blake3_c_rust_bindings/Cargo.toml +32 -0
  81. package/deps/blake3/c/blake3_c_rust_bindings/README.md +4 -0
  82. package/deps/blake3/c/blake3_c_rust_bindings/benches/bench.rs +477 -0
  83. package/deps/blake3/c/blake3_c_rust_bindings/build.rs +253 -0
  84. package/deps/blake3/c/blake3_c_rust_bindings/cross_test.sh +31 -0
  85. package/deps/blake3/c/blake3_c_rust_bindings/src/lib.rs +333 -0
  86. package/deps/blake3/c/blake3_c_rust_bindings/src/test.rs +696 -0
  87. package/deps/blake3/c/blake3_dispatch.c +332 -0
  88. package/deps/blake3/c/blake3_impl.h +333 -0
  89. package/deps/blake3/c/blake3_neon.c +366 -0
  90. package/deps/blake3/c/blake3_portable.c +160 -0
  91. package/deps/blake3/c/blake3_sse2.c +566 -0
  92. package/deps/blake3/c/blake3_sse2_x86-64_unix.S +2291 -0
  93. package/deps/blake3/c/blake3_sse2_x86-64_windows_gnu.S +2332 -0
  94. package/deps/blake3/c/blake3_sse2_x86-64_windows_msvc.asm +2350 -0
  95. package/deps/blake3/c/blake3_sse41.c +560 -0
  96. package/deps/blake3/c/blake3_sse41_x86-64_unix.S +2028 -0
  97. package/deps/blake3/c/blake3_sse41_x86-64_windows_gnu.S +2069 -0
  98. package/deps/blake3/c/blake3_sse41_x86-64_windows_msvc.asm +2089 -0
  99. package/deps/blake3/c/blake3_tbb.cpp +37 -0
  100. package/deps/blake3/c/dependencies/CMakeLists.txt +3 -0
  101. package/deps/blake3/c/dependencies/tbb/CMakeLists.txt +28 -0
  102. package/deps/blake3/c/example.c +36 -0
  103. package/deps/blake3/c/example_tbb.c +57 -0
  104. package/deps/blake3/c/libblake3.pc.in +12 -0
  105. package/deps/blake3/c/main.c +166 -0
  106. package/deps/blake3/c/test.py +97 -0
  107. package/deps/blake3/media/B3.svg +70 -0
  108. package/deps/blake3/media/BLAKE3.svg +85 -0
  109. package/deps/blake3/media/speed.svg +1474 -0
  110. package/deps/blake3/reference_impl/Cargo.toml +8 -0
  111. package/deps/blake3/reference_impl/README.md +14 -0
  112. package/deps/blake3/reference_impl/reference_impl.rs +374 -0
  113. package/deps/blake3/src/ffi_avx2.rs +65 -0
  114. package/deps/blake3/src/ffi_avx512.rs +169 -0
  115. package/deps/blake3/src/ffi_neon.rs +82 -0
  116. package/deps/blake3/src/ffi_sse2.rs +126 -0
  117. package/deps/blake3/src/ffi_sse41.rs +126 -0
  118. package/deps/blake3/src/guts.rs +60 -0
  119. package/deps/blake3/src/hazmat.rs +704 -0
  120. package/deps/blake3/src/io.rs +64 -0
  121. package/deps/blake3/src/join.rs +92 -0
  122. package/deps/blake3/src/lib.rs +1835 -0
  123. package/deps/blake3/src/platform.rs +587 -0
  124. package/deps/blake3/src/portable.rs +198 -0
  125. package/deps/blake3/src/rust_avx2.rs +474 -0
  126. package/deps/blake3/src/rust_sse2.rs +775 -0
  127. package/deps/blake3/src/rust_sse41.rs +766 -0
  128. package/deps/blake3/src/test.rs +1049 -0
  129. package/deps/blake3/src/traits.rs +227 -0
  130. package/deps/blake3/src/wasm32_simd.rs +794 -0
  131. package/deps/blake3/test_vectors/Cargo.toml +19 -0
  132. package/deps/blake3/test_vectors/cross_test.sh +25 -0
  133. package/deps/blake3/test_vectors/src/bin/generate.rs +4 -0
  134. package/deps/blake3/test_vectors/src/lib.rs +350 -0
  135. package/deps/blake3/test_vectors/test_vectors.json +217 -0
  136. package/deps/blake3/tools/compiler_version/Cargo.toml +7 -0
  137. package/deps/blake3/tools/compiler_version/build.rs +6 -0
  138. package/deps/blake3/tools/compiler_version/src/main.rs +27 -0
  139. package/deps/blake3/tools/instruction_set_support/Cargo.toml +6 -0
  140. package/deps/blake3/tools/instruction_set_support/src/main.rs +10 -0
  141. package/deps/blake3/tools/release.md +16 -0
  142. package/deps/fastpbkdf2/fastpbkdf2.c +356 -0
  143. package/deps/fastpbkdf2/fastpbkdf2.h +68 -0
  144. package/deps/ncrypto/ncrypto.cc +4679 -0
  145. package/deps/ncrypto/ncrypto.h +1625 -0
  146. package/lib/commonjs/blake3.js +98 -0
  147. package/lib/commonjs/blake3.js.map +1 -0
  148. package/lib/commonjs/cipher.js +180 -0
  149. package/lib/commonjs/cipher.js.map +1 -0
  150. package/lib/commonjs/ec.js +344 -0
  151. package/lib/commonjs/ec.js.map +1 -0
  152. package/lib/commonjs/ed.js +185 -0
  153. package/lib/commonjs/ed.js.map +1 -0
  154. package/lib/commonjs/expo-plugin/@types.js +2 -0
  155. package/lib/commonjs/expo-plugin/@types.js.map +1 -0
  156. package/lib/commonjs/expo-plugin/withRNQC.js +25 -0
  157. package/lib/commonjs/expo-plugin/withRNQC.js.map +1 -0
  158. package/lib/commonjs/expo-plugin/withSodiumAndroid.js +25 -0
  159. package/lib/commonjs/expo-plugin/withSodiumAndroid.js.map +1 -0
  160. package/lib/commonjs/expo-plugin/withSodiumIos.js +26 -0
  161. package/lib/commonjs/expo-plugin/withSodiumIos.js.map +1 -0
  162. package/lib/commonjs/expo-plugin/withXCode.js +51 -0
  163. package/lib/commonjs/expo-plugin/withXCode.js.map +1 -0
  164. package/lib/commonjs/hash.js +215 -0
  165. package/lib/commonjs/hash.js.map +1 -0
  166. package/lib/commonjs/hmac.js +109 -0
  167. package/lib/commonjs/hmac.js.map +1 -0
  168. package/lib/commonjs/index.js +152 -32
  169. package/lib/commonjs/index.js.map +1 -1
  170. package/lib/commonjs/keys/classes.js +250 -0
  171. package/lib/commonjs/keys/classes.js.map +1 -0
  172. package/lib/commonjs/keys/generateKeyPair.js +102 -0
  173. package/lib/commonjs/keys/generateKeyPair.js.map +1 -0
  174. package/lib/commonjs/keys/index.js +89 -0
  175. package/lib/commonjs/keys/index.js.map +1 -0
  176. package/lib/commonjs/keys/signVerify.js +41 -0
  177. package/lib/commonjs/keys/signVerify.js.map +1 -0
  178. package/lib/commonjs/keys/utils.js +123 -0
  179. package/lib/commonjs/keys/utils.js.map +1 -0
  180. package/lib/commonjs/pbkdf2.js +89 -0
  181. package/lib/commonjs/pbkdf2.js.map +1 -0
  182. package/lib/commonjs/random.js +9 -3
  183. package/lib/commonjs/random.js.map +1 -1
  184. package/lib/commonjs/rsa.js +129 -0
  185. package/lib/commonjs/rsa.js.map +1 -0
  186. package/lib/commonjs/specs/blake3.nitro.js +6 -0
  187. package/lib/commonjs/specs/blake3.nitro.js.map +1 -0
  188. package/lib/commonjs/specs/cipher.nitro.js +6 -0
  189. package/lib/commonjs/specs/cipher.nitro.js.map +1 -0
  190. package/lib/commonjs/specs/ecKeyPair.nitro.js +6 -0
  191. package/lib/commonjs/specs/ecKeyPair.nitro.js.map +1 -0
  192. package/lib/commonjs/specs/edKeyPair.nitro.js +6 -0
  193. package/lib/commonjs/specs/edKeyPair.nitro.js.map +1 -0
  194. package/lib/commonjs/specs/hash.nitro.js +6 -0
  195. package/lib/commonjs/specs/hash.nitro.js.map +1 -0
  196. package/lib/commonjs/specs/hmac.nitro.js +6 -0
  197. package/lib/commonjs/specs/hmac.nitro.js.map +1 -0
  198. package/lib/commonjs/specs/keyObjectHandle.nitro.js +6 -0
  199. package/lib/commonjs/specs/keyObjectHandle.nitro.js.map +1 -0
  200. package/lib/commonjs/specs/pbkdf2.nitro.js +6 -0
  201. package/lib/commonjs/specs/pbkdf2.nitro.js.map +1 -0
  202. package/lib/commonjs/specs/rsaKeyPair.nitro.js +6 -0
  203. package/lib/commonjs/specs/rsaKeyPair.nitro.js.map +1 -0
  204. package/lib/commonjs/subtle.js +365 -0
  205. package/lib/commonjs/subtle.js.map +1 -0
  206. package/lib/commonjs/utils/cipher.js +64 -0
  207. package/lib/commonjs/utils/cipher.js.map +1 -0
  208. package/lib/commonjs/utils/conversion.js +140 -6
  209. package/lib/commonjs/utils/conversion.js.map +1 -1
  210. package/lib/commonjs/utils/errors.js +14 -0
  211. package/lib/commonjs/utils/errors.js.map +1 -0
  212. package/lib/commonjs/utils/hashnames.js +91 -0
  213. package/lib/commonjs/utils/hashnames.js.map +1 -0
  214. package/lib/commonjs/utils/index.js +65 -5
  215. package/lib/commonjs/utils/index.js.map +1 -1
  216. package/lib/commonjs/utils/noble.js +82 -0
  217. package/lib/commonjs/utils/noble.js.map +1 -0
  218. package/lib/commonjs/utils/types.js +52 -0
  219. package/lib/commonjs/utils/types.js.map +1 -1
  220. package/lib/commonjs/utils/validation.js +98 -0
  221. package/lib/commonjs/utils/validation.js.map +1 -0
  222. package/lib/module/blake3.js +90 -0
  223. package/lib/module/blake3.js.map +1 -0
  224. package/lib/module/cipher.js +173 -0
  225. package/lib/module/cipher.js.map +1 -0
  226. package/lib/module/ec.js +336 -0
  227. package/lib/module/ec.js.map +1 -0
  228. package/lib/module/ed.js +178 -0
  229. package/lib/module/ed.js.map +1 -0
  230. package/lib/module/expo-plugin/@types.js +2 -0
  231. package/lib/module/expo-plugin/@types.js.map +1 -0
  232. package/lib/module/expo-plugin/withRNQC.js +21 -0
  233. package/lib/module/expo-plugin/withRNQC.js.map +1 -0
  234. package/lib/module/expo-plugin/withSodiumAndroid.js +20 -0
  235. package/lib/module/expo-plugin/withSodiumAndroid.js.map +1 -0
  236. package/lib/module/expo-plugin/withSodiumIos.js +20 -0
  237. package/lib/module/expo-plugin/withSodiumIos.js.map +1 -0
  238. package/lib/module/expo-plugin/withXCode.js +46 -0
  239. package/lib/module/expo-plugin/withXCode.js.map +1 -0
  240. package/lib/module/hash.js +207 -0
  241. package/lib/module/hash.js.map +1 -0
  242. package/lib/module/hmac.js +104 -0
  243. package/lib/module/hmac.js.map +1 -0
  244. package/lib/module/index.js +33 -29
  245. package/lib/module/index.js.map +1 -1
  246. package/lib/module/keys/classes.js +241 -0
  247. package/lib/module/keys/classes.js.map +1 -0
  248. package/lib/module/keys/generateKeyPair.js +96 -0
  249. package/lib/module/keys/generateKeyPair.js.map +1 -0
  250. package/lib/module/keys/index.js +32 -0
  251. package/lib/module/keys/index.js.map +1 -0
  252. package/lib/module/keys/signVerify.js +41 -0
  253. package/lib/module/keys/signVerify.js.map +1 -0
  254. package/lib/module/keys/utils.js +114 -0
  255. package/lib/module/keys/utils.js.map +1 -0
  256. package/lib/module/pbkdf2.js +83 -0
  257. package/lib/module/pbkdf2.js.map +1 -0
  258. package/lib/module/random.js +7 -1
  259. package/lib/module/random.js.map +1 -1
  260. package/lib/module/rsa.js +123 -0
  261. package/lib/module/rsa.js.map +1 -0
  262. package/lib/module/specs/blake3.nitro.js +4 -0
  263. package/lib/module/specs/blake3.nitro.js.map +1 -0
  264. package/lib/module/specs/cipher.nitro.js +4 -0
  265. package/lib/module/specs/cipher.nitro.js.map +1 -0
  266. package/lib/module/specs/ecKeyPair.nitro.js +4 -0
  267. package/lib/module/specs/ecKeyPair.nitro.js.map +1 -0
  268. package/lib/module/specs/edKeyPair.nitro.js +4 -0
  269. package/lib/module/specs/edKeyPair.nitro.js.map +1 -0
  270. package/lib/module/specs/hash.nitro.js +4 -0
  271. package/lib/module/specs/hash.nitro.js.map +1 -0
  272. package/lib/module/specs/hmac.nitro.js +4 -0
  273. package/lib/module/specs/hmac.nitro.js.map +1 -0
  274. package/lib/module/specs/keyObjectHandle.nitro.js +4 -0
  275. package/lib/module/specs/keyObjectHandle.nitro.js.map +1 -0
  276. package/lib/module/specs/pbkdf2.nitro.js +4 -0
  277. package/lib/module/specs/pbkdf2.nitro.js.map +1 -0
  278. package/lib/module/specs/rsaKeyPair.nitro.js +4 -0
  279. package/lib/module/specs/rsaKeyPair.nitro.js.map +1 -0
  280. package/lib/module/subtle.js +360 -0
  281. package/lib/module/subtle.js.map +1 -0
  282. package/lib/module/utils/cipher.js +56 -0
  283. package/lib/module/utils/cipher.js.map +1 -0
  284. package/lib/module/utils/conversion.js +120 -8
  285. package/lib/module/utils/conversion.js.map +1 -1
  286. package/lib/module/utils/errors.js +10 -0
  287. package/lib/module/utils/errors.js.map +1 -0
  288. package/lib/module/utils/hashnames.js +89 -0
  289. package/lib/module/utils/hashnames.js.map +1 -0
  290. package/lib/module/utils/index.js +6 -5
  291. package/lib/module/utils/index.js.map +1 -1
  292. package/lib/module/utils/noble.js +76 -0
  293. package/lib/module/utils/noble.js.map +1 -0
  294. package/lib/module/utils/types.js +53 -0
  295. package/lib/module/utils/types.js.map +1 -1
  296. package/lib/module/utils/validation.js +87 -0
  297. package/lib/module/utils/validation.js.map +1 -0
  298. package/lib/tsconfig.tsbuildinfo +1 -1
  299. package/lib/typescript/blake3.d.ts +33 -0
  300. package/lib/typescript/blake3.d.ts.map +1 -0
  301. package/lib/typescript/cipher.d.ts +60 -0
  302. package/lib/typescript/cipher.d.ts.map +1 -0
  303. package/lib/typescript/ec.d.ts +13 -0
  304. package/lib/typescript/ec.d.ts.map +1 -0
  305. package/lib/typescript/ed.d.ts +43 -0
  306. package/lib/typescript/ed.d.ts.map +1 -0
  307. package/lib/typescript/expo-plugin/@types.d.ts +8 -0
  308. package/lib/typescript/expo-plugin/@types.d.ts.map +1 -0
  309. package/lib/typescript/expo-plugin/withRNQC.d.ts +4 -0
  310. package/lib/typescript/expo-plugin/withRNQC.d.ts.map +1 -0
  311. package/lib/typescript/expo-plugin/withSodiumAndroid.d.ts +4 -0
  312. package/lib/typescript/expo-plugin/withSodiumAndroid.d.ts.map +1 -0
  313. package/lib/typescript/expo-plugin/withSodiumIos.d.ts +4 -0
  314. package/lib/typescript/expo-plugin/withSodiumIos.d.ts.map +1 -0
  315. package/lib/typescript/expo-plugin/withXCode.d.ts +9 -0
  316. package/lib/typescript/expo-plugin/withXCode.d.ts.map +1 -0
  317. package/lib/typescript/hash.d.ts +122 -0
  318. package/lib/typescript/hash.d.ts.map +1 -0
  319. package/lib/typescript/hmac.d.ts +66 -0
  320. package/lib/typescript/hmac.d.ts.map +1 -0
  321. package/lib/typescript/index.d.ts +110 -9
  322. package/lib/typescript/index.d.ts.map +1 -1
  323. package/lib/typescript/keys/classes.d.ts +79 -0
  324. package/lib/typescript/keys/classes.d.ts.map +1 -0
  325. package/lib/typescript/keys/generateKeyPair.d.ts +6 -0
  326. package/lib/typescript/keys/generateKeyPair.d.ts.map +1 -0
  327. package/lib/typescript/keys/index.d.ts +7 -0
  328. package/lib/typescript/keys/index.d.ts.map +1 -0
  329. package/lib/typescript/keys/signVerify.d.ts +1 -0
  330. package/lib/typescript/keys/signVerify.d.ts.map +1 -0
  331. package/lib/typescript/keys/utils.d.ts +34 -0
  332. package/lib/typescript/keys/utils.d.ts.map +1 -0
  333. package/lib/typescript/pbkdf2.d.ts +12 -0
  334. package/lib/typescript/pbkdf2.d.ts.map +1 -0
  335. package/lib/typescript/random.d.ts +11 -5
  336. package/lib/typescript/random.d.ts.map +1 -1
  337. package/lib/typescript/rsa.d.ts +10 -0
  338. package/lib/typescript/rsa.d.ts.map +1 -0
  339. package/lib/typescript/specs/blake3.nitro.d.ts +15 -0
  340. package/lib/typescript/specs/blake3.nitro.d.ts.map +1 -0
  341. package/lib/typescript/specs/cipher.nitro.d.ts +29 -0
  342. package/lib/typescript/specs/cipher.nitro.d.ts.map +1 -0
  343. package/lib/typescript/specs/ecKeyPair.nitro.d.ts +20 -0
  344. package/lib/typescript/specs/ecKeyPair.nitro.d.ts.map +1 -0
  345. package/lib/typescript/specs/edKeyPair.nitro.d.ts +17 -0
  346. package/lib/typescript/specs/edKeyPair.nitro.d.ts.map +1 -0
  347. package/lib/typescript/specs/hash.nitro.d.ts +13 -0
  348. package/lib/typescript/specs/hash.nitro.d.ts.map +1 -0
  349. package/lib/typescript/specs/hmac.nitro.d.ts +10 -0
  350. package/lib/typescript/specs/hmac.nitro.d.ts.map +1 -0
  351. package/lib/typescript/specs/keyObjectHandle.nitro.d.ts +14 -0
  352. package/lib/typescript/specs/keyObjectHandle.nitro.d.ts.map +1 -0
  353. package/lib/typescript/specs/pbkdf2.nitro.d.ts +9 -0
  354. package/lib/typescript/specs/pbkdf2.nitro.d.ts.map +1 -0
  355. package/lib/typescript/specs/rsaKeyPair.nitro.d.ts +20 -0
  356. package/lib/typescript/specs/rsaKeyPair.nitro.d.ts.map +1 -0
  357. package/lib/typescript/subtle.d.ts +17 -0
  358. package/lib/typescript/subtle.d.ts.map +1 -0
  359. package/lib/typescript/utils/cipher.d.ts +7 -0
  360. package/lib/typescript/utils/cipher.d.ts.map +1 -0
  361. package/lib/typescript/utils/conversion.d.ts +24 -2
  362. package/lib/typescript/utils/conversion.d.ts.map +1 -1
  363. package/lib/typescript/utils/errors.d.ts +7 -0
  364. package/lib/typescript/utils/errors.d.ts.map +1 -0
  365. package/lib/typescript/utils/hashnames.d.ts +13 -0
  366. package/lib/typescript/utils/hashnames.d.ts.map +1 -0
  367. package/lib/typescript/utils/index.d.ts +6 -5
  368. package/lib/typescript/utils/index.d.ts.map +1 -1
  369. package/lib/typescript/utils/noble.d.ts +19 -0
  370. package/lib/typescript/utils/noble.d.ts.map +1 -0
  371. package/lib/typescript/utils/types.d.ts +252 -2
  372. package/lib/typescript/utils/types.d.ts.map +1 -1
  373. package/lib/typescript/utils/validation.d.ts +13 -0
  374. package/lib/typescript/utils/validation.d.ts.map +1 -0
  375. package/nitrogen/generated/.gitattributes +1 -0
  376. package/nitrogen/generated/android/QuickCrypto+autolinking.cmake +47 -4
  377. package/nitrogen/generated/android/QuickCrypto+autolinking.gradle +4 -3
  378. package/nitrogen/generated/android/QuickCryptoOnLoad.cpp +144 -0
  379. package/nitrogen/generated/android/QuickCryptoOnLoad.hpp +25 -0
  380. package/nitrogen/generated/android/kotlin/com/margelo/nitro/crypto/QuickCryptoOnLoad.kt +35 -0
  381. package/nitrogen/generated/ios/QuickCrypto+autolinking.rb +11 -8
  382. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.cpp +11 -3
  383. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.hpp +5 -3
  384. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Umbrella.hpp +16 -7
  385. package/nitrogen/generated/ios/QuickCryptoAutolinking.mm +135 -0
  386. package/nitrogen/generated/ios/QuickCryptoAutolinking.swift +12 -0
  387. package/nitrogen/generated/shared/c++/CFRGKeyPairType.hpp +84 -0
  388. package/nitrogen/generated/shared/c++/CipherArgs.hpp +86 -0
  389. package/nitrogen/generated/shared/c++/HybridBlake3Spec.cpp +28 -0
  390. package/nitrogen/generated/shared/c++/HybridBlake3Spec.hpp +76 -0
  391. package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.cpp +21 -0
  392. package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.hpp +67 -0
  393. package/nitrogen/generated/shared/c++/HybridCipherSpec.cpp +28 -0
  394. package/nitrogen/generated/shared/c++/HybridCipherSpec.hpp +76 -0
  395. package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.cpp +29 -0
  396. package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.hpp +77 -0
  397. package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.cpp +30 -0
  398. package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.hpp +75 -0
  399. package/nitrogen/generated/shared/c++/HybridHashSpec.cpp +26 -0
  400. package/nitrogen/generated/shared/c++/HybridHashSpec.hpp +75 -0
  401. package/nitrogen/generated/shared/c++/HybridHmacSpec.cpp +23 -0
  402. package/nitrogen/generated/shared/c++/HybridHmacSpec.hpp +66 -0
  403. package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.cpp +26 -0
  404. package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.hpp +92 -0
  405. package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.cpp +22 -0
  406. package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.hpp +66 -0
  407. package/nitrogen/generated/shared/c++/HybridRandomSpec.cpp +2 -3
  408. package/nitrogen/generated/shared/c++/HybridRandomSpec.hpp +9 -6
  409. package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.cpp +29 -0
  410. package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.hpp +77 -0
  411. package/nitrogen/generated/shared/c++/JWK.hpp +161 -0
  412. package/nitrogen/generated/shared/c++/JWKkty.hpp +84 -0
  413. package/nitrogen/generated/shared/c++/JWKuse.hpp +76 -0
  414. package/nitrogen/generated/shared/c++/KFormatType.hpp +63 -0
  415. package/nitrogen/generated/shared/c++/KeyDetail.hpp +92 -0
  416. package/nitrogen/generated/shared/c++/KeyEncoding.hpp +64 -0
  417. package/nitrogen/generated/shared/c++/KeyObject.hpp +67 -0
  418. package/nitrogen/generated/shared/c++/KeyType.hpp +63 -0
  419. package/nitrogen/generated/shared/c++/KeyUsage.hpp +116 -0
  420. package/nitrogen/generated/shared/c++/NamedCurve.hpp +80 -0
  421. package/package.json +66 -39
  422. package/src/blake3.ts +123 -0
  423. package/src/cipher.ts +335 -0
  424. package/src/ec.ts +432 -0
  425. package/src/ed.ts +256 -0
  426. package/src/expo-plugin/@types.ts +7 -0
  427. package/src/expo-plugin/withRNQC.ts +23 -0
  428. package/src/expo-plugin/withSodiumAndroid.ts +24 -0
  429. package/src/expo-plugin/withSodiumIos.ts +30 -0
  430. package/src/expo-plugin/withXCode.ts +55 -0
  431. package/src/hash.ts +274 -0
  432. package/src/hmac.ts +135 -0
  433. package/src/index.ts +32 -29
  434. package/src/keys/classes.ts +317 -0
  435. package/src/keys/generateKeyPair.ts +145 -0
  436. package/src/keys/index.ts +52 -0
  437. package/src/keys/signVerify.ts +39 -0
  438. package/src/keys/utils.ts +190 -0
  439. package/src/pbkdf2.ts +154 -0
  440. package/src/random.ts +26 -23
  441. package/src/rsa.ts +176 -0
  442. package/src/specs/blake3.nitro.ts +12 -0
  443. package/src/specs/cipher.nitro.ts +25 -0
  444. package/src/specs/ecKeyPair.nitro.ts +38 -0
  445. package/src/specs/edKeyPair.nitro.ts +43 -0
  446. package/src/specs/hash.nitro.ts +10 -0
  447. package/src/specs/hmac.nitro.ts +7 -0
  448. package/src/specs/keyObjectHandle.nitro.ts +31 -0
  449. package/src/specs/pbkdf2.nitro.ts +18 -0
  450. package/src/specs/random.nitro.ts +2 -2
  451. package/src/specs/rsaKeyPair.nitro.ts +33 -0
  452. package/src/subtle.ts +614 -0
  453. package/src/utils/cipher.ts +60 -0
  454. package/src/utils/conversion.ts +143 -9
  455. package/src/utils/errors.ts +15 -0
  456. package/src/utils/hashnames.ts +98 -0
  457. package/src/utils/index.ts +6 -6
  458. package/src/utils/noble.ts +85 -0
  459. package/src/utils/types.ts +423 -3
  460. package/src/utils/validation.ts +130 -0
  461. package/ios/QuickCryptoOnLoad.mm +0 -19
  462. package/lib/module/package.json +0 -1
package/src/subtle.ts ADDED
@@ -0,0 +1,614 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+ import { Buffer as SBuffer } from 'safe-buffer';
3
+ import type {
4
+ SubtleAlgorithm,
5
+ KeyUsage,
6
+ BinaryLike,
7
+ BufferLike,
8
+ JWK,
9
+ AnyAlgorithm,
10
+ ImportFormat,
11
+ AesKeyGenParams,
12
+ EncryptDecryptParams,
13
+ Operation,
14
+ } from './utils';
15
+ import { CryptoKey } from './keys';
16
+ import type { CryptoKeyPair } from './utils/types';
17
+ import { bufferLikeToArrayBuffer } from './utils/conversion';
18
+ import { lazyDOMException } from './utils/errors';
19
+ import { normalizeHashName, HashContext } from './utils/hashnames';
20
+ import { validateMaxBufferLength } from './utils/validation';
21
+ import { asyncDigest } from './hash';
22
+ import { createSecretKey } from './keys';
23
+ import { pbkdf2DeriveBits } from './pbkdf2';
24
+ import { ecImportKey, ecdsaSignVerify, ec_generateKeyPair } from './ec';
25
+ import { rsa_generateKeyPair } from './rsa';
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
+
32
+ // Temporary enums that need to be defined
33
+
34
+ enum KWebCryptoKeyFormat {
35
+ kWebCryptoKeyFormatRaw,
36
+ kWebCryptoKeyFormatSPKI,
37
+ kWebCryptoKeyFormatPKCS8,
38
+ }
39
+
40
+ enum CipherOrWrapMode {
41
+ kWebCryptoCipherEncrypt,
42
+ kWebCryptoCipherDecrypt,
43
+ }
44
+
45
+ // Placeholder functions that need to be implemented
46
+ function hasAnyNotIn(usages: KeyUsage[], allowed: KeyUsage[]): boolean {
47
+ return usages.some(usage => !allowed.includes(usage));
48
+ }
49
+
50
+ function normalizeAlgorithm(
51
+ algorithm: SubtleAlgorithm | AnyAlgorithm,
52
+ _operation: Operation,
53
+ ): SubtleAlgorithm {
54
+ if (typeof algorithm === 'string') {
55
+ return { name: algorithm };
56
+ }
57
+ return algorithm as SubtleAlgorithm;
58
+ }
59
+
60
+ function getAlgorithmName(name: string, length: number): string {
61
+ return `${name}${length}`;
62
+ }
63
+
64
+ // Placeholder implementations for missing functions
65
+ function ecExportKey(
66
+ _key: CryptoKey,
67
+ _format: KWebCryptoKeyFormat,
68
+ ): ArrayBuffer {
69
+ throw new Error('ecExportKey not implemented');
70
+ }
71
+
72
+ function rsaExportKey(
73
+ _key: CryptoKey,
74
+ _format: KWebCryptoKeyFormat,
75
+ ): ArrayBuffer {
76
+ throw new Error('rsaExportKey not implemented');
77
+ }
78
+
79
+ function rsaCipher(
80
+ _mode: CipherOrWrapMode,
81
+ _key: CryptoKey,
82
+ _data: ArrayBuffer,
83
+ _algorithm: EncryptDecryptParams,
84
+ ): Promise<ArrayBuffer> {
85
+ throw new Error('rsaCipher not implemented');
86
+ }
87
+
88
+ function aesCipher(
89
+ _mode: CipherOrWrapMode,
90
+ _key: CryptoKey,
91
+ _data: ArrayBuffer,
92
+ _algorithm: EncryptDecryptParams,
93
+ ): Promise<ArrayBuffer> {
94
+ throw new Error('aesCipher not implemented');
95
+ }
96
+
97
+ async function aesGenerateKey(
98
+ _algorithm: AesKeyGenParams,
99
+ _extractable: boolean,
100
+ _keyUsages: KeyUsage[],
101
+ ): Promise<CryptoKey> {
102
+ throw new Error('aesGenerateKey not implemented');
103
+ }
104
+
105
+ function rsaImportKey(
106
+ _format: ImportFormat,
107
+ _data: BufferLike | JWK,
108
+ _algorithm: SubtleAlgorithm,
109
+ _extractable: boolean,
110
+ _keyUsages: KeyUsage[],
111
+ ): CryptoKey {
112
+ throw new Error('rsaImportKey not implemented');
113
+ }
114
+
115
+ async function hmacImportKey(
116
+ _algorithm: SubtleAlgorithm,
117
+ _format: ImportFormat,
118
+ _data: BufferLike | JWK,
119
+ _extractable: boolean,
120
+ _keyUsages: KeyUsage[],
121
+ ): Promise<CryptoKey> {
122
+ throw new Error('hmacImportKey not implemented');
123
+ }
124
+
125
+ async function aesImportKey(
126
+ _algorithm: SubtleAlgorithm,
127
+ _format: ImportFormat,
128
+ _data: BufferLike | JWK,
129
+ _extractable: boolean,
130
+ _keyUsages: KeyUsage[],
131
+ ): Promise<CryptoKey> {
132
+ throw new Error('aesImportKey not implemented');
133
+ }
134
+
135
+ const exportKeySpki = async (
136
+ key: CryptoKey,
137
+ ): Promise<ArrayBuffer | unknown> => {
138
+ switch (key.algorithm.name) {
139
+ case 'RSASSA-PKCS1-v1_5':
140
+ // Fall through
141
+ case 'RSA-PSS':
142
+ // Fall through
143
+ case 'RSA-OAEP':
144
+ if (key.type === 'public') {
145
+ return rsaExportKey(key, KWebCryptoKeyFormat.kWebCryptoKeyFormatSPKI);
146
+ }
147
+ break;
148
+ case 'ECDSA':
149
+ // Fall through
150
+ case 'ECDH':
151
+ if (key.type === 'public') {
152
+ return ecExportKey(key, KWebCryptoKeyFormat.kWebCryptoKeyFormatSPKI);
153
+ }
154
+ break;
155
+ }
156
+
157
+ throw new Error(
158
+ `Unable to export a spki ${key.algorithm.name} ${key.type} key`,
159
+ );
160
+ };
161
+
162
+ const exportKeyPkcs8 = async (
163
+ key: CryptoKey,
164
+ ): Promise<ArrayBuffer | unknown> => {
165
+ switch (key.algorithm.name) {
166
+ case 'RSASSA-PKCS1-v1_5':
167
+ // Fall through
168
+ case 'RSA-PSS':
169
+ // Fall through
170
+ case 'RSA-OAEP':
171
+ if (key.type === 'private') {
172
+ return rsaExportKey(key, KWebCryptoKeyFormat.kWebCryptoKeyFormatPKCS8);
173
+ }
174
+ break;
175
+ case 'ECDSA':
176
+ // Fall through
177
+ case 'ECDH':
178
+ if (key.type === 'private') {
179
+ return ecExportKey(key, KWebCryptoKeyFormat.kWebCryptoKeyFormatPKCS8);
180
+ }
181
+ break;
182
+ }
183
+
184
+ throw new Error(
185
+ `Unable to export a pkcs8 ${key.algorithm.name} ${key.type} key`,
186
+ );
187
+ };
188
+
189
+ const exportKeyRaw = (key: CryptoKey): ArrayBuffer | unknown => {
190
+ switch (key.algorithm.name) {
191
+ case 'ECDSA':
192
+ // Fall through
193
+ case 'ECDH':
194
+ if (key.type === 'public') {
195
+ return ecExportKey(key, KWebCryptoKeyFormat.kWebCryptoKeyFormatRaw);
196
+ }
197
+ break;
198
+ case 'AES-CTR':
199
+ // Fall through
200
+ case 'AES-CBC':
201
+ // Fall through
202
+ case 'AES-GCM':
203
+ // Fall through
204
+ case 'AES-KW':
205
+ // Fall through
206
+ case 'HMAC':
207
+ return key.keyObject.export();
208
+ }
209
+
210
+ throw lazyDOMException(
211
+ `Unable to export a raw ${key.algorithm.name} ${key.type} key`,
212
+ 'InvalidAccessError',
213
+ );
214
+ };
215
+
216
+ const exportKeyJWK = (key: CryptoKey): ArrayBuffer | unknown => {
217
+ const jwk = key.keyObject.handle.exportJwk(
218
+ {
219
+ key_ops: key.usages,
220
+ ext: key.extractable,
221
+ },
222
+ true,
223
+ );
224
+ switch (key.algorithm.name) {
225
+ case 'RSASSA-PKCS1-v1_5':
226
+ jwk.alg = normalizeHashName(key.algorithm.hash, HashContext.JwkRsa);
227
+ return jwk;
228
+ case 'RSA-PSS':
229
+ jwk.alg = normalizeHashName(key.algorithm.hash, HashContext.JwkRsaPss);
230
+ return jwk;
231
+ case 'RSA-OAEP':
232
+ jwk.alg = normalizeHashName(key.algorithm.hash, HashContext.JwkRsaOaep);
233
+ return jwk;
234
+ case 'HMAC':
235
+ jwk.alg = normalizeHashName(key.algorithm.hash, HashContext.JwkHmac);
236
+ return jwk;
237
+ case 'ECDSA':
238
+ // Fall through
239
+ case 'ECDH':
240
+ jwk.crv ||= key.algorithm.namedCurve;
241
+ return jwk;
242
+ case 'AES-CTR':
243
+ // Fall through
244
+ case 'AES-CBC':
245
+ // Fall through
246
+ case 'AES-GCM':
247
+ // Fall through
248
+ case 'AES-KW':
249
+ if (key.algorithm.length === undefined) {
250
+ throw lazyDOMException(
251
+ `Algorithm ${key.algorithm.name} missing required length property`,
252
+ 'InvalidAccessError',
253
+ );
254
+ }
255
+ jwk.alg = getAlgorithmName(key.algorithm.name, key.algorithm.length);
256
+ return jwk;
257
+ default:
258
+ // Fall through
259
+ }
260
+
261
+ throw lazyDOMException(
262
+ `JWK export not yet supported: ${key.algorithm.name}`,
263
+ 'NotSupportedError',
264
+ );
265
+ };
266
+
267
+ const importGenericSecretKey = async (
268
+ { name, length }: SubtleAlgorithm,
269
+ format: ImportFormat,
270
+ keyData: BufferLike | BinaryLike,
271
+ extractable: boolean,
272
+ keyUsages: KeyUsage[],
273
+ ): Promise<CryptoKey> => {
274
+ if (extractable) {
275
+ throw new Error(`${name} keys are not extractable`);
276
+ }
277
+ if (hasAnyNotIn(keyUsages, ['deriveKey', 'deriveBits'])) {
278
+ throw new Error(`Unsupported key usage for a ${name} key`);
279
+ }
280
+
281
+ switch (format) {
282
+ case 'raw': {
283
+ if (hasAnyNotIn(keyUsages, ['deriveKey', 'deriveBits'])) {
284
+ throw new Error(`Unsupported key usage for a ${name} key`);
285
+ }
286
+
287
+ const checkLength =
288
+ typeof keyData === 'string' || SBuffer.isBuffer(keyData)
289
+ ? keyData.length * 8
290
+ : keyData.byteLength * 8;
291
+
292
+ if (length !== undefined && length !== checkLength) {
293
+ throw new Error('Invalid key length');
294
+ }
295
+
296
+ const keyObject = createSecretKey(keyData as BinaryLike);
297
+ return new CryptoKey(keyObject, { name }, keyUsages, false);
298
+ }
299
+ }
300
+
301
+ throw new Error(`Unable to import ${name} key with format ${format}`);
302
+ };
303
+
304
+ const checkCryptoKeyPairUsages = (pair: CryptoKeyPair) => {
305
+ if (
306
+ pair.privateKey &&
307
+ pair.privateKey instanceof CryptoKey &&
308
+ pair.privateKey.keyUsages &&
309
+ pair.privateKey.keyUsages.length > 0
310
+ ) {
311
+ return;
312
+ }
313
+ throw lazyDOMException(
314
+ 'Usages cannot be empty when creating a key.',
315
+ 'SyntaxError',
316
+ );
317
+ };
318
+
319
+ // Type guard to check if result is CryptoKeyPair
320
+ export function isCryptoKeyPair(
321
+ result: CryptoKey | CryptoKeyPair,
322
+ ): result is CryptoKeyPair {
323
+ return 'publicKey' in result && 'privateKey' in result;
324
+ }
325
+
326
+ const signVerify = (
327
+ algorithm: SubtleAlgorithm,
328
+ key: CryptoKey,
329
+ data: BufferLike,
330
+ signature?: BufferLike,
331
+ ): ArrayBuffer | boolean => {
332
+ const usage: Operation = signature === undefined ? 'sign' : 'verify';
333
+ algorithm = normalizeAlgorithm(algorithm, usage);
334
+
335
+ if (!key.usages.includes(usage) || algorithm.name !== key.algorithm.name) {
336
+ throw lazyDOMException(
337
+ `Unable to use this key to ${usage}`,
338
+ 'InvalidAccessError',
339
+ );
340
+ }
341
+
342
+ switch (algorithm.name) {
343
+ case 'ECDSA':
344
+ return ecdsaSignVerify(key, data, algorithm, signature);
345
+ }
346
+ throw lazyDOMException(
347
+ `Unrecognized algorithm name '${algorithm}' for '${usage}'`,
348
+ 'NotSupportedError',
349
+ );
350
+ };
351
+
352
+ const cipherOrWrap = async (
353
+ mode: CipherOrWrapMode,
354
+ algorithm: EncryptDecryptParams,
355
+ key: CryptoKey,
356
+ data: ArrayBuffer,
357
+ op: Operation,
358
+ ): Promise<ArrayBuffer> => {
359
+ if (
360
+ key.algorithm.name !== algorithm.name ||
361
+ !key.usages.includes(op as KeyUsage)
362
+ ) {
363
+ throw lazyDOMException(
364
+ 'The requested operation is not valid for the provided key',
365
+ 'InvalidAccessError',
366
+ );
367
+ }
368
+
369
+ validateMaxBufferLength(data, 'data');
370
+
371
+ switch (algorithm.name) {
372
+ case 'RSA-OAEP':
373
+ return rsaCipher(mode, key, data, algorithm);
374
+ case 'AES-CTR':
375
+ // Fall through
376
+ case 'AES-CBC':
377
+ // Fall through
378
+ case 'AES-GCM':
379
+ return aesCipher(mode, key, data, algorithm);
380
+ }
381
+ };
382
+
383
+ export class Subtle {
384
+ async decrypt(
385
+ algorithm: EncryptDecryptParams,
386
+ key: CryptoKey,
387
+ data: BufferLike,
388
+ ): Promise<ArrayBuffer> {
389
+ const normalizedAlgorithm = normalizeAlgorithm(algorithm, 'decrypt');
390
+ return cipherOrWrap(
391
+ CipherOrWrapMode.kWebCryptoCipherDecrypt,
392
+ normalizedAlgorithm as EncryptDecryptParams,
393
+ key,
394
+ bufferLikeToArrayBuffer(data),
395
+ 'decrypt',
396
+ );
397
+ }
398
+
399
+ async digest(
400
+ algorithm: SubtleAlgorithm | AnyAlgorithm,
401
+ data: BufferLike,
402
+ ): Promise<ArrayBuffer> {
403
+ const normalizedAlgorithm = normalizeAlgorithm(
404
+ algorithm,
405
+ 'digest' as Operation,
406
+ );
407
+ return asyncDigest(normalizedAlgorithm, data);
408
+ }
409
+
410
+ async deriveBits(
411
+ algorithm: SubtleAlgorithm,
412
+ baseKey: CryptoKey,
413
+ length: number,
414
+ ): Promise<ArrayBuffer> {
415
+ if (!baseKey.keyUsages.includes('deriveBits')) {
416
+ throw new Error('baseKey does not have deriveBits usage');
417
+ }
418
+ if (baseKey.algorithm.name !== algorithm.name)
419
+ throw new Error('Key algorithm mismatch');
420
+ switch (algorithm.name) {
421
+ case 'PBKDF2':
422
+ return pbkdf2DeriveBits(algorithm, baseKey, length);
423
+ }
424
+ throw new Error(
425
+ `'subtle.deriveBits()' for ${algorithm.name} is not implemented.`,
426
+ );
427
+ }
428
+
429
+ async encrypt(
430
+ algorithm: EncryptDecryptParams,
431
+ key: CryptoKey,
432
+ data: BufferLike,
433
+ ): Promise<ArrayBuffer> {
434
+ const normalizedAlgorithm = normalizeAlgorithm(algorithm, 'encrypt');
435
+ return cipherOrWrap(
436
+ CipherOrWrapMode.kWebCryptoCipherEncrypt,
437
+ normalizedAlgorithm as EncryptDecryptParams,
438
+ key,
439
+ bufferLikeToArrayBuffer(data),
440
+ 'encrypt',
441
+ );
442
+ }
443
+
444
+ async exportKey(
445
+ format: ImportFormat,
446
+ key: CryptoKey,
447
+ ): Promise<ArrayBuffer | JWK> {
448
+ if (!key.extractable) throw new Error('key is not extractable');
449
+
450
+ switch (format) {
451
+ case 'spki':
452
+ return (await exportKeySpki(key)) as ArrayBuffer;
453
+ case 'pkcs8':
454
+ return (await exportKeyPkcs8(key)) as ArrayBuffer;
455
+ case 'jwk':
456
+ return exportKeyJWK(key) as JWK;
457
+ case 'raw':
458
+ return exportKeyRaw(key) as ArrayBuffer;
459
+ }
460
+ }
461
+
462
+ async generateKey(
463
+ algorithm: SubtleAlgorithm,
464
+ extractable: boolean,
465
+ keyUsages: KeyUsage[],
466
+ ): Promise<CryptoKey | CryptoKeyPair> {
467
+ algorithm = normalizeAlgorithm(algorithm, 'generateKey');
468
+ let result: CryptoKey | CryptoKeyPair;
469
+ switch (algorithm.name) {
470
+ case 'RSASSA-PKCS1-v1_5':
471
+ // Fall through
472
+ case 'RSA-PSS':
473
+ // Fall through
474
+ case 'RSA-OAEP':
475
+ result = await rsa_generateKeyPair(algorithm, extractable, keyUsages);
476
+ break;
477
+ case 'ECDSA':
478
+ // Fall through
479
+ case 'ECDH':
480
+ result = await ec_generateKeyPair(
481
+ algorithm.name,
482
+ algorithm.namedCurve!,
483
+ extractable,
484
+ keyUsages,
485
+ );
486
+ checkCryptoKeyPairUsages(result as CryptoKeyPair);
487
+ break;
488
+ case 'AES-CTR':
489
+ // Fall through
490
+ case 'AES-CBC':
491
+ // Fall through
492
+ case 'AES-GCM':
493
+ // Fall through
494
+ case 'AES-KW':
495
+ result = await aesGenerateKey(
496
+ algorithm as AesKeyGenParams,
497
+ extractable,
498
+ keyUsages,
499
+ );
500
+ break;
501
+ default:
502
+ throw new Error(
503
+ `'subtle.generateKey()' is not implemented for ${algorithm.name}.
504
+ Unrecognized algorithm name`,
505
+ );
506
+ }
507
+
508
+ return result;
509
+ }
510
+
511
+ async importKey(
512
+ format: ImportFormat,
513
+ data: BufferLike | BinaryLike | JWK,
514
+ algorithm: SubtleAlgorithm | AnyAlgorithm,
515
+ extractable: boolean,
516
+ keyUsages: KeyUsage[],
517
+ ): Promise<CryptoKey> {
518
+ const normalizedAlgorithm = normalizeAlgorithm(algorithm, 'importKey');
519
+ let result: CryptoKey;
520
+ switch (normalizedAlgorithm.name) {
521
+ case 'RSASSA-PKCS1-v1_5':
522
+ // Fall through
523
+ case 'RSA-PSS':
524
+ // Fall through
525
+ case 'RSA-OAEP':
526
+ result = rsaImportKey(
527
+ format,
528
+ data as BufferLike | JWK,
529
+ normalizedAlgorithm,
530
+ extractable,
531
+ keyUsages,
532
+ );
533
+ break;
534
+ case 'ECDSA':
535
+ // Fall through
536
+ case 'ECDH':
537
+ result = ecImportKey(
538
+ format,
539
+ data,
540
+ normalizedAlgorithm,
541
+ extractable,
542
+ keyUsages,
543
+ );
544
+ break;
545
+ case 'HMAC':
546
+ result = await hmacImportKey(
547
+ normalizedAlgorithm,
548
+ format,
549
+ data as BufferLike | JWK,
550
+ extractable,
551
+ keyUsages,
552
+ );
553
+ break;
554
+ case 'AES-CTR':
555
+ // Fall through
556
+ case 'AES-CBC':
557
+ // Fall through
558
+ case 'AES-GCM':
559
+ // Fall through
560
+ case 'AES-KW':
561
+ result = await aesImportKey(
562
+ normalizedAlgorithm,
563
+ format,
564
+ data as BufferLike | JWK,
565
+ extractable,
566
+ keyUsages,
567
+ );
568
+ break;
569
+ case 'PBKDF2':
570
+ result = await importGenericSecretKey(
571
+ normalizedAlgorithm,
572
+ format,
573
+ data as BufferLike | BinaryLike,
574
+ extractable,
575
+ keyUsages,
576
+ );
577
+ break;
578
+ default:
579
+ throw new Error(
580
+ `"subtle.importKey()" is not implemented for ${normalizedAlgorithm.name}`,
581
+ );
582
+ }
583
+
584
+ if (
585
+ (result.type === 'secret' || result.type === 'private') &&
586
+ result.usages.length === 0
587
+ ) {
588
+ throw new Error(
589
+ `Usages cannot be empty when importing a ${result.type} key.`,
590
+ );
591
+ }
592
+
593
+ return result;
594
+ }
595
+
596
+ async sign(
597
+ algorithm: SubtleAlgorithm,
598
+ key: CryptoKey,
599
+ data: BufferLike,
600
+ ): Promise<ArrayBuffer> {
601
+ return signVerify(algorithm, key, data) as ArrayBuffer;
602
+ }
603
+
604
+ async verify(
605
+ algorithm: SubtleAlgorithm,
606
+ key: CryptoKey,
607
+ signature: BufferLike,
608
+ data: BufferLike,
609
+ ): Promise<ArrayBuffer> {
610
+ return signVerify(algorithm, key, data, signature) as ArrayBuffer;
611
+ }
612
+ }
613
+
614
+ export const subtle = new Subtle();
@@ -0,0 +1,60 @@
1
+ import type { Encoding } from './types';
2
+
3
+ // Mimics node behavior for default global encoding
4
+ let defaultEncoding: Encoding = 'buffer';
5
+
6
+ export function setDefaultEncoding(encoding: Encoding) {
7
+ defaultEncoding = encoding;
8
+ }
9
+
10
+ export function getDefaultEncoding(): Encoding {
11
+ return defaultEncoding;
12
+ }
13
+
14
+ export function normalizeEncoding(enc: string) {
15
+ if (!enc) return 'utf8';
16
+ let retried;
17
+ while (true) {
18
+ switch (enc) {
19
+ case 'utf8':
20
+ case 'utf-8':
21
+ return 'utf8';
22
+ case 'ucs2':
23
+ case 'ucs-2':
24
+ case 'utf16le':
25
+ case 'utf-16le':
26
+ return 'utf16le';
27
+ case 'latin1':
28
+ case 'binary':
29
+ return 'latin1';
30
+ case 'base64':
31
+ case 'ascii':
32
+ case 'hex':
33
+ return enc;
34
+ default:
35
+ if (retried) return; // undefined
36
+ enc = ('' + enc).toLowerCase();
37
+ retried = true;
38
+ }
39
+ }
40
+ }
41
+
42
+ export function validateEncoding(data: string, encoding: string) {
43
+ const normalizedEncoding = normalizeEncoding(encoding);
44
+ const length = data.length;
45
+
46
+ if (normalizedEncoding === 'hex' && length % 2 !== 0) {
47
+ throw new Error(`Encoding ${encoding} not valid for data length ${length}`);
48
+ }
49
+ }
50
+
51
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
52
+ export function getUIntOption(options: Record<string, any>, key: string) {
53
+ let value;
54
+ if (options && (value = options[key]) != null) {
55
+ // >>> Turns any type into a positive integer (also sets the sign bit to 0)
56
+ if (value >>> 0 !== value) throw new Error(`options.${key}: ${value}`);
57
+ return value;
58
+ }
59
+ return -1;
60
+ }