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
@@ -0,0 +1,190 @@
1
+ import {
2
+ binaryLikeToArrayBuffer,
3
+ isStringOrBuffer,
4
+ KeyEncoding,
5
+ KFormatType,
6
+ } from '../utils';
7
+ import type { CryptoKeyPair, EncodingOptions } from '../utils';
8
+ import type { CryptoKey } from './classes';
9
+
10
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
11
+ export const isCryptoKey = (obj: any): boolean => {
12
+ return obj !== null && obj?.keyObject !== undefined;
13
+ };
14
+
15
+ export function getCryptoKeyPair(
16
+ key: CryptoKey | CryptoKeyPair,
17
+ ): CryptoKeyPair {
18
+ if ('publicKey' in key && 'privateKey' in key) return key;
19
+ throw new Error('Invalid CryptoKeyPair');
20
+ }
21
+
22
+ /**
23
+ * Parses the public key encoding based on an object. keyType must be undefined
24
+ * when this is used to parse an input encoding and must be a valid key type if
25
+ * used to parse an output encoding.
26
+ */
27
+ export function parsePublicKeyEncoding(
28
+ enc: EncodingOptions,
29
+ keyType: string | undefined,
30
+ objName?: string,
31
+ ) {
32
+ return parseKeyEncoding(enc, keyType, keyType ? true : undefined, objName);
33
+ }
34
+
35
+ /**
36
+ * Parses the private key encoding based on an object. keyType must be undefined
37
+ * when this is used to parse an input encoding and must be a valid key type if
38
+ * used to parse an output encoding.
39
+ */
40
+ export function parsePrivateKeyEncoding(
41
+ enc: EncodingOptions,
42
+ keyType: string | undefined,
43
+ objName?: string,
44
+ ) {
45
+ return parseKeyEncoding(enc, keyType, false, objName);
46
+ }
47
+
48
+ export function parseKeyEncoding(
49
+ enc: EncodingOptions,
50
+ keyType?: string,
51
+ isPublic?: boolean,
52
+ objName?: string,
53
+ ) {
54
+ // validateObject(enc, 'options');
55
+
56
+ const isInput = keyType === undefined;
57
+
58
+ const { format, type } = parseKeyFormatAndType(
59
+ enc,
60
+ keyType,
61
+ isPublic,
62
+ objName,
63
+ );
64
+
65
+ let cipher, passphrase, encoding;
66
+ if (isPublic !== true) {
67
+ ({ cipher, passphrase, encoding } = enc);
68
+
69
+ if (!isInput) {
70
+ if (cipher != null) {
71
+ if (typeof cipher !== 'string')
72
+ throw new Error(
73
+ `Invalid argument ${option('cipher', objName)}: ${cipher}`,
74
+ );
75
+ if (
76
+ format === KFormatType.DER &&
77
+ (type === KeyEncoding.PKCS1 || type === KeyEncoding.SEC1)
78
+ ) {
79
+ throw new Error(
80
+ `Incompatible key options ${encodingNames[type]} does not support encryption`,
81
+ );
82
+ }
83
+ } else if (passphrase !== undefined) {
84
+ throw new Error(
85
+ `invalid argument ${option('cipher', objName)}: ${cipher}`,
86
+ );
87
+ }
88
+ }
89
+
90
+ if (
91
+ (isInput && passphrase !== undefined && !isStringOrBuffer(passphrase)) ||
92
+ (!isInput && cipher != null && !isStringOrBuffer(passphrase))
93
+ ) {
94
+ throw new Error(
95
+ `Invalid argument value ${option('passphrase', objName)}: ${passphrase}`,
96
+ );
97
+ }
98
+ }
99
+
100
+ if (passphrase !== undefined)
101
+ passphrase = binaryLikeToArrayBuffer(passphrase, encoding);
102
+
103
+ return { format, type, cipher, passphrase };
104
+ }
105
+
106
+ const encodingNames = {
107
+ [KeyEncoding.PKCS1]: 'pkcs1',
108
+ [KeyEncoding.PKCS8]: 'pkcs8',
109
+ [KeyEncoding.SPKI]: 'spki',
110
+ [KeyEncoding.SEC1]: 'sec1',
111
+ };
112
+
113
+ function option(name: string, objName?: string) {
114
+ return objName === undefined
115
+ ? `options.${name}`
116
+ : `options.${objName}.${name}`;
117
+ }
118
+
119
+ function parseKeyFormat(
120
+ formatStr?: string,
121
+ defaultFormat?: KFormatType,
122
+ optionName?: string,
123
+ ) {
124
+ if (formatStr === undefined && defaultFormat !== undefined)
125
+ return defaultFormat;
126
+ else if (formatStr === 'pem') return KFormatType.PEM;
127
+ else if (formatStr === 'der') return KFormatType.DER;
128
+ else if (formatStr === 'jwk') return KFormatType.JWK;
129
+ throw new Error(`Invalid key format str: ${optionName}`);
130
+ }
131
+
132
+ function parseKeyType(
133
+ typeStr: string | undefined,
134
+ required: boolean,
135
+ keyType: string | undefined,
136
+ isPublic: boolean | undefined,
137
+ optionName: string,
138
+ ): KeyEncoding | undefined {
139
+ if (typeStr === undefined && !required) {
140
+ return undefined;
141
+ } else if (typeStr === 'pkcs1') {
142
+ if (keyType !== undefined && keyType !== 'rsa') {
143
+ throw new Error(
144
+ `Crypto incompatible key options: ${typeStr} can only be used for RSA keys`,
145
+ );
146
+ }
147
+ return KeyEncoding.PKCS1;
148
+ } else if (typeStr === 'spki' && isPublic !== false) {
149
+ return KeyEncoding.SPKI;
150
+ } else if (typeStr === 'pkcs8' && isPublic !== true) {
151
+ return KeyEncoding.PKCS8;
152
+ } else if (typeStr === 'sec1' && isPublic !== true) {
153
+ if (keyType !== undefined && keyType !== 'ec') {
154
+ throw new Error(
155
+ `Incompatible key options ${typeStr} can only be used for EC keys`,
156
+ );
157
+ }
158
+ return KeyEncoding.SEC1;
159
+ }
160
+
161
+ throw new Error(`Invalid option ${optionName} - ${typeStr}`);
162
+ }
163
+
164
+ function parseKeyFormatAndType(
165
+ enc: EncodingOptions,
166
+ keyType?: string,
167
+ isPublic?: boolean,
168
+ objName?: string,
169
+ ) {
170
+ const { format: formatStr, type: typeStr } = enc;
171
+
172
+ const isInput = keyType === undefined;
173
+ const format = parseKeyFormat(
174
+ formatStr,
175
+ isInput ? KFormatType.PEM : undefined,
176
+ option('format', objName),
177
+ );
178
+
179
+ const isRequired =
180
+ (!isInput || format === KFormatType.DER) && format !== KFormatType.JWK;
181
+
182
+ const type = parseKeyType(
183
+ typeStr,
184
+ isRequired,
185
+ keyType,
186
+ isPublic,
187
+ option('type', objName),
188
+ );
189
+ return { format, type };
190
+ }
package/src/pbkdf2.ts ADDED
@@ -0,0 +1,154 @@
1
+ import { Buffer } from '@craftzdog/react-native-buffer';
2
+ import { NitroModules } from 'react-native-nitro-modules';
3
+ import type { BinaryLike } from './utils';
4
+ import {
5
+ HashContext,
6
+ binaryLikeToArrayBuffer,
7
+ bufferLikeToArrayBuffer,
8
+ lazyDOMException,
9
+ normalizeHashName,
10
+ } from './utils';
11
+ import type { HashAlgorithm, SubtleAlgorithm } from './utils';
12
+ import type { Pbkdf2 } from './specs/pbkdf2.nitro';
13
+ import { promisify } from 'util';
14
+ import type { CryptoKey } from './keys';
15
+
16
+ const WRONG_PASS =
17
+ 'Password must be a string, a Buffer, a typed array or a DataView';
18
+ const WRONG_SALT = `Salt must be a string, a Buffer, a typed array or a DataView`;
19
+
20
+ type Password = BinaryLike;
21
+ type Salt = BinaryLike;
22
+ type Pbkdf2Callback = (err: Error | null, derivedKey?: Buffer) => void;
23
+
24
+ // to use native bits in sub-functions, use getNative(). don't call it at top-level!
25
+ let native: Pbkdf2;
26
+ function getNative(): Pbkdf2 {
27
+ if (native == null) {
28
+ // lazy-load the Nitro HybridObject
29
+ native = NitroModules.createHybridObject<Pbkdf2>('Pbkdf2');
30
+ }
31
+ return native;
32
+ }
33
+
34
+ function sanitizeInput(input: BinaryLike, errorMsg: string): ArrayBuffer {
35
+ try {
36
+ return binaryLikeToArrayBuffer(input);
37
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
38
+ } catch (_e: unknown) {
39
+ throw new Error(errorMsg);
40
+ }
41
+ }
42
+
43
+ export function pbkdf2(
44
+ password: Password,
45
+ salt: Salt,
46
+ iterations: number,
47
+ keylen: number,
48
+ digest: string,
49
+ callback: Pbkdf2Callback,
50
+ ): void {
51
+ if (callback === undefined || typeof callback !== 'function') {
52
+ throw new Error('No callback provided to pbkdf2');
53
+ }
54
+ const sanitizedPassword = sanitizeInput(password, WRONG_PASS);
55
+ const sanitizedSalt = sanitizeInput(salt, WRONG_SALT);
56
+ const normalizedDigest = normalizeHashName(digest, HashContext.Node);
57
+
58
+ getNative();
59
+ native
60
+ .pbkdf2(
61
+ sanitizedPassword,
62
+ sanitizedSalt,
63
+ iterations,
64
+ keylen,
65
+ normalizedDigest,
66
+ )
67
+ .then(
68
+ (res: ArrayBuffer) => {
69
+ callback!(null, Buffer.from(res));
70
+ },
71
+ (e: Error) => {
72
+ callback!(e);
73
+ },
74
+ );
75
+ }
76
+
77
+ export function pbkdf2Sync(
78
+ password: Password,
79
+ salt: Salt,
80
+ iterations: number,
81
+ keylen: number,
82
+ digest?: HashAlgorithm,
83
+ ): Buffer {
84
+ const sanitizedPassword = sanitizeInput(password, WRONG_PASS);
85
+ const sanitizedSalt = sanitizeInput(salt, WRONG_SALT);
86
+
87
+ const algo = digest ? normalizeHashName(digest, HashContext.Node) : 'sha1';
88
+ getNative();
89
+ const result: ArrayBuffer = native.pbkdf2Sync(
90
+ sanitizedPassword,
91
+ sanitizedSalt,
92
+ iterations,
93
+ keylen,
94
+ algo,
95
+ );
96
+
97
+ return Buffer.from(result);
98
+ }
99
+
100
+ // We need this because the typescript overload signatures in pbkdf2() above do
101
+ // not play nice with promisify() below.
102
+ const pbkdf2WithDigest = (
103
+ password: Password,
104
+ salt: Salt,
105
+ iterations: number,
106
+ keylen: number,
107
+ digest: HashAlgorithm,
108
+ callback: Pbkdf2Callback,
109
+ ) => pbkdf2(password, salt, iterations, keylen, digest, callback);
110
+
111
+ const pbkdf2Promise = promisify(pbkdf2WithDigest);
112
+ export async function pbkdf2DeriveBits(
113
+ algorithm: SubtleAlgorithm,
114
+ baseKey: CryptoKey,
115
+ length: number,
116
+ ): Promise<ArrayBuffer> {
117
+ const { iterations, hash, salt } = algorithm;
118
+ const normalizedHash = normalizeHashName(hash);
119
+ if (!normalizedHash) {
120
+ throw lazyDOMException('hash cannot be blank', 'OperationError');
121
+ }
122
+ if (!iterations || iterations === 0) {
123
+ throw lazyDOMException('iterations cannot be zero', 'OperationError');
124
+ }
125
+ if (!salt) {
126
+ throw lazyDOMException(WRONG_SALT, 'OperationError');
127
+ }
128
+ const raw = baseKey.keyObject.export();
129
+
130
+ if (length === 0)
131
+ throw lazyDOMException('length cannot be zero', 'OperationError');
132
+ if (length === null)
133
+ throw lazyDOMException('length cannot be null', 'OperationError');
134
+ if (length % 8) {
135
+ throw lazyDOMException('length must be a multiple of 8', 'OperationError');
136
+ }
137
+
138
+ const sanitizedPassword = sanitizeInput(raw, WRONG_PASS);
139
+ const sanitizedSalt = sanitizeInput(salt, WRONG_SALT);
140
+ const result: Buffer | undefined = await pbkdf2Promise(
141
+ sanitizedPassword,
142
+ sanitizedSalt,
143
+ iterations,
144
+ length / 8,
145
+ normalizedHash as HashAlgorithm,
146
+ );
147
+ if (!result) {
148
+ throw lazyDOMException(
149
+ 'received bad result from pbkdf2()',
150
+ 'OperationError',
151
+ );
152
+ }
153
+ return bufferLikeToArrayBuffer(result);
154
+ }
package/src/random.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Buffer } from '@craftzdog/react-native-buffer';
2
- import type { ArrayBufferView, RandomCallback } from './utils/types';
3
- import { abvToArrayBuffer } from './utils/conversion';
2
+ import type { ABV, RandomCallback } from './utils';
3
+ import { abvToArrayBuffer } from './utils';
4
4
  import { NitroModules } from 'react-native-nitro-modules';
5
5
  import type { Random } from './specs/random.nitro';
6
6
 
@@ -14,32 +14,32 @@ function getNative(): Random {
14
14
  return random;
15
15
  }
16
16
 
17
- export function randomFill<T extends ArrayBufferView>(
17
+ export function randomFill<T extends ABV>(
18
18
  buffer: T,
19
- callback: RandomCallback<T>
19
+ callback: RandomCallback<T>,
20
20
  ): void;
21
21
 
22
- export function randomFill<T extends ArrayBufferView>(
22
+ export function randomFill<T extends ABV>(
23
23
  buffer: T,
24
24
  offset: number,
25
- callback: RandomCallback<T>
25
+ callback: RandomCallback<T>,
26
26
  ): void;
27
27
 
28
- export function randomFill<T extends ArrayBufferView>(
28
+ export function randomFill<T extends ABV>(
29
29
  buffer: T,
30
30
  offset: number,
31
31
  size: number,
32
- callback: RandomCallback<T>
32
+ callback: RandomCallback<T>,
33
33
  ): void;
34
34
 
35
- export function randomFill(buffer: ArrayBufferView, ...rest: unknown[]): void {
35
+ export function randomFill(buffer: ABV, ...rest: unknown[]): void {
36
36
  if (typeof rest[rest.length - 1] !== 'function') {
37
37
  throw new Error('No callback provided to randomFill');
38
38
  }
39
39
 
40
40
  const callback = rest[rest.length - 1] as unknown as (
41
41
  err: Error | null,
42
- buf?: ArrayBuffer
42
+ buf?: ArrayBuffer,
43
43
  ) => void;
44
44
 
45
45
  let offset: number = 0;
@@ -61,21 +61,17 @@ export function randomFill(buffer: ArrayBufferView, ...rest: unknown[]): void {
61
61
  },
62
62
  (e: Error) => {
63
63
  callback(e);
64
- }
64
+ },
65
65
  );
66
66
  }
67
67
 
68
- export function randomFillSync<T extends ArrayBufferView>(
68
+ export function randomFillSync<T extends ABV>(
69
69
  buffer: T,
70
70
  offset?: number,
71
- size?: number
71
+ size?: number,
72
72
  ): T;
73
73
 
74
- export function randomFillSync(
75
- buffer: ArrayBufferView,
76
- offset: number = 0,
77
- size?: number
78
- ) {
74
+ export function randomFillSync(buffer: ABV, offset: number = 0, size?: number) {
79
75
  getNative();
80
76
  buffer = abvToArrayBuffer(buffer);
81
77
  const res = random.randomFillSync(buffer, offset, size ?? buffer.byteLength);
@@ -87,12 +83,12 @@ export function randomBytes(size: number): Buffer;
87
83
 
88
84
  export function randomBytes(
89
85
  size: number,
90
- callback: (err: Error | null, buf?: Buffer) => void
86
+ callback: (err: Error | null, buf?: Buffer) => void,
91
87
  ): void;
92
88
 
93
89
  export function randomBytes(
94
90
  size: number,
95
- callback?: (err: Error | null, buf?: Buffer) => void
91
+ callback?: (err: Error | null, buf?: Buffer) => void,
96
92
  ): void | Buffer {
97
93
  const buf = new Buffer(size);
98
94
 
@@ -141,13 +137,13 @@ export function randomInt(max: number): number;
141
137
  export function randomInt(
142
138
  min: number,
143
139
  max: number,
144
- callback: RandomIntCallback
140
+ callback: RandomIntCallback,
145
141
  ): void;
146
142
  export function randomInt(min: number, max: number): number;
147
143
  export function randomInt(
148
144
  arg1: number,
149
145
  arg2?: number | RandomIntCallback,
150
- callback?: RandomIntCallback
146
+ callback?: RandomIntCallback,
151
147
  ): void | number {
152
148
  // Detect optional min syntax
153
149
  // randomInt(max)
@@ -253,7 +249,7 @@ function asyncRefillRandomIntCache() {
253
249
  // callback (errorReceiver) about it. This way, every async call to
254
250
  // randomInt has a chance of being successful, and it avoids complex
255
251
  // exception handling here.
256
- tasks.splice(0).forEach((task) => {
252
+ tasks.splice(0).forEach(task => {
257
253
  randomInt(task.min, task.max, task.callback);
258
254
  });
259
255
 
@@ -273,6 +269,13 @@ export type RandomTypedArrays =
273
269
  | Uint8Array
274
270
  | Uint16Array
275
271
  | Uint32Array;
272
+
273
+ /**
274
+ * Fills the provided typed array with cryptographically strong random values.
275
+ *
276
+ * @param data The data to fill with random values
277
+ * @returns The filled data
278
+ */
276
279
  export function getRandomValues(data: RandomTypedArrays) {
277
280
  if (data.byteLength > 65536) {
278
281
  throw new Error('The requested length exceeds 65,536 bytes');
package/src/rsa.ts ADDED
@@ -0,0 +1,176 @@
1
+ import { NitroModules } from 'react-native-nitro-modules';
2
+ import {
3
+ CryptoKey,
4
+ KeyObject,
5
+ PrivateKeyObject,
6
+ PublicKeyObject,
7
+ } from './keys';
8
+ import {
9
+ getUsagesUnion,
10
+ hasAnyNotIn,
11
+ lazyDOMException,
12
+ normalizeHashName,
13
+ } from './utils';
14
+ import type {
15
+ CryptoKeyPair,
16
+ KeyUsage,
17
+ RsaHashedKeyGenParams,
18
+ SubtleAlgorithm,
19
+ } from './utils';
20
+ import type { RsaKeyPair } from './specs/rsaKeyPair.nitro';
21
+
22
+ export class Rsa {
23
+ native: RsaKeyPair;
24
+
25
+ constructor(
26
+ modulusLength: number,
27
+ publicExponent: Uint8Array,
28
+ hashAlgorithm: string,
29
+ ) {
30
+ this.native = NitroModules.createHybridObject<RsaKeyPair>('RsaKeyPair');
31
+ this.native.setModulusLength(modulusLength);
32
+ this.native.setPublicExponent(
33
+ publicExponent.buffer.slice(
34
+ publicExponent.byteOffset,
35
+ publicExponent.byteOffset + publicExponent.byteLength,
36
+ ) as ArrayBuffer,
37
+ );
38
+ this.native.setHashAlgorithm(hashAlgorithm);
39
+ }
40
+
41
+ async generateKeyPair(): Promise<CryptoKeyPair> {
42
+ await this.native.generateKeyPair();
43
+ return {
44
+ publicKey: this.native.getPublicKey(),
45
+ privateKey: this.native.getPrivateKey(),
46
+ };
47
+ }
48
+
49
+ generateKeyPairSync(): CryptoKeyPair {
50
+ this.native.generateKeyPairSync();
51
+ return {
52
+ publicKey: this.native.getPublicKey(),
53
+ privateKey: this.native.getPrivateKey(),
54
+ };
55
+ }
56
+ }
57
+
58
+ // Node API
59
+ export async function rsa_generateKeyPair(
60
+ algorithm: SubtleAlgorithm,
61
+ extractable: boolean,
62
+ keyUsages: KeyUsage[],
63
+ ): Promise<CryptoKeyPair> {
64
+ const { name, modulusLength, publicExponent, hash } =
65
+ algorithm as RsaHashedKeyGenParams;
66
+
67
+ // Validate parameters first
68
+ if (!modulusLength || modulusLength < 256) {
69
+ throw lazyDOMException('Invalid key length', 'OperationError');
70
+ }
71
+
72
+ if (!publicExponent || publicExponent.length === 0) {
73
+ throw lazyDOMException('Invalid public exponent', 'OperationError');
74
+ }
75
+
76
+ // Validate hash algorithm using existing validation function
77
+ let hashName: string;
78
+ try {
79
+ const normalizedHash = normalizeHashName(hash);
80
+ hashName = typeof hash === 'string' ? hash : hash?.name || normalizedHash;
81
+ } catch {
82
+ throw lazyDOMException('Invalid Hash Algorithm', 'NotSupportedError');
83
+ }
84
+
85
+ // Validate usages are not empty
86
+ if (keyUsages.length === 0) {
87
+ throw lazyDOMException('Usages cannot be empty', 'SyntaxError');
88
+ }
89
+
90
+ // Usage validation based on algorithm type
91
+ switch (name) {
92
+ case 'RSASSA-PKCS1-v1_5':
93
+ if (hasAnyNotIn(keyUsages, ['sign', 'verify'])) {
94
+ throw lazyDOMException(
95
+ `Unsupported key usage for a ${name} key`,
96
+ 'SyntaxError',
97
+ );
98
+ }
99
+ break;
100
+ case 'RSA-PSS':
101
+ if (hasAnyNotIn(keyUsages, ['sign', 'verify'])) {
102
+ throw lazyDOMException(
103
+ `Unsupported key usage for a ${name} key`,
104
+ 'SyntaxError',
105
+ );
106
+ }
107
+ break;
108
+ case 'RSA-OAEP':
109
+ if (
110
+ hasAnyNotIn(keyUsages, ['encrypt', 'decrypt', 'wrapKey', 'unwrapKey'])
111
+ ) {
112
+ throw lazyDOMException(
113
+ `Unsupported key usage for a ${name} key`,
114
+ 'SyntaxError',
115
+ );
116
+ }
117
+ break;
118
+ default:
119
+ throw lazyDOMException(
120
+ 'The algorithm is not supported',
121
+ 'NotSupportedError',
122
+ );
123
+ }
124
+
125
+ // Split usages between public and private keys
126
+ let publicUsages: KeyUsage[] = [];
127
+ let privateUsages: KeyUsage[] = [];
128
+ switch (name) {
129
+ case 'RSASSA-PKCS1-v1_5':
130
+ case 'RSA-PSS':
131
+ publicUsages = getUsagesUnion(keyUsages, 'verify');
132
+ privateUsages = getUsagesUnion(keyUsages, 'sign');
133
+ break;
134
+ case 'RSA-OAEP':
135
+ publicUsages = getUsagesUnion(keyUsages, 'encrypt', 'wrapKey');
136
+ privateUsages = getUsagesUnion(keyUsages, 'decrypt', 'unwrapKey');
137
+ break;
138
+ }
139
+
140
+ // Validate that private key has usages for CryptoKeyPair
141
+ if (privateUsages.length === 0) {
142
+ throw lazyDOMException('Usages cannot be empty', 'SyntaxError');
143
+ }
144
+
145
+ const rsa = new Rsa(modulusLength, publicExponent, hashName);
146
+ await rsa.generateKeyPair();
147
+
148
+ const keyAlgorithm = {
149
+ name,
150
+ modulusLength,
151
+ publicExponent,
152
+ hash: { name: hashName },
153
+ };
154
+
155
+ // Create KeyObject instances using the standard createKeyObject method
156
+ const publicKeyData = rsa.native.getPublicKey();
157
+ const pub = KeyObject.createKeyObject(
158
+ 'public',
159
+ publicKeyData,
160
+ ) as PublicKeyObject;
161
+ const publicKey = new CryptoKey(pub, keyAlgorithm, publicUsages, true);
162
+
163
+ const privateKeyData = rsa.native.getPrivateKey();
164
+ const priv = KeyObject.createKeyObject(
165
+ 'private',
166
+ privateKeyData,
167
+ ) as PrivateKeyObject;
168
+ const privateKey = new CryptoKey(
169
+ priv,
170
+ keyAlgorithm,
171
+ privateUsages,
172
+ extractable,
173
+ );
174
+
175
+ return { publicKey, privateKey };
176
+ }
@@ -0,0 +1,12 @@
1
+ import type { HybridObject } from 'react-native-nitro-modules';
2
+
3
+ export interface Blake3 extends HybridObject<{ ios: 'c++'; android: 'c++' }> {
4
+ initHash(): void;
5
+ initKeyed(key: ArrayBuffer): void;
6
+ initDeriveKey(context: string): void;
7
+ update(data: ArrayBuffer): void;
8
+ digest(length?: number): ArrayBuffer;
9
+ reset(): void;
10
+ copy(): Blake3;
11
+ getVersion(): string;
12
+ }
@@ -0,0 +1,25 @@
1
+ import type { HybridObject } from 'react-native-nitro-modules';
2
+
3
+ type CipherArgs = {
4
+ isCipher: boolean;
5
+ cipherType: string;
6
+ cipherKey: ArrayBuffer;
7
+ iv: ArrayBuffer;
8
+ authTagLen?: number;
9
+ };
10
+
11
+ export interface Cipher extends HybridObject<{ ios: 'c++'; android: 'c++' }> {
12
+ update(data: ArrayBuffer): ArrayBuffer;
13
+ final(): ArrayBuffer;
14
+ setArgs(args: CipherArgs): void;
15
+ setAAD(data: ArrayBuffer, plaintextLength?: number): boolean;
16
+ setAutoPadding(autoPad: boolean): boolean;
17
+ setAuthTag(tag: ArrayBuffer): boolean;
18
+ getAuthTag(): ArrayBuffer;
19
+ getSupportedCiphers(): string[];
20
+ }
21
+
22
+ export interface CipherFactory
23
+ extends HybridObject<{ ios: 'c++'; android: 'c++' }> {
24
+ createCipher(args: CipherArgs): Cipher;
25
+ }