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,23 @@
1
+ import { createRunOncePlugin } from 'expo/config-plugins';
2
+ import type { ConfigPlugin } from 'expo/config-plugins';
3
+ import type { ConfigProps } from './@types';
4
+ import { withSodiumIos } from './withSodiumIos';
5
+ import { withSodiumAndroid } from './withSodiumAndroid';
6
+ import { withXCode } from './withXCode';
7
+
8
+ const withRNQCInternal: ConfigPlugin<ConfigProps> = (config, props = {}) => {
9
+ // add XCode workarounds for some 16.x releases that are not RN-friendly
10
+ config = withXCode(config, props);
11
+
12
+ // enable libsodium algorithms
13
+ if (props.sodiumEnabled) {
14
+ config = withSodiumIos(config, props);
15
+ config = withSodiumAndroid(config, props);
16
+ }
17
+
18
+ return config;
19
+ };
20
+
21
+ export function createRNQCPlugin(name: string, version: string) {
22
+ return createRunOncePlugin(withRNQCInternal, name, version);
23
+ }
@@ -0,0 +1,24 @@
1
+ import type { ConfigPlugin } from 'expo/config-plugins';
2
+ import { withGradleProperties } from 'expo/config-plugins';
3
+ import type { ConfigProps } from './@types';
4
+
5
+ export const withSodiumAndroid: ConfigPlugin<ConfigProps> = config => {
6
+ return withGradleProperties(config, config => {
7
+ config.modResults = config.modResults || [];
8
+
9
+ // Check if the property already exists
10
+ const existingProperty = config.modResults.find(
11
+ item => item.type === 'property' && item.key === 'sodiumEnabled',
12
+ );
13
+
14
+ if (!existingProperty) {
15
+ config.modResults.push({
16
+ type: 'property',
17
+ key: 'sodiumEnabled',
18
+ value: 'true',
19
+ });
20
+ }
21
+
22
+ return config;
23
+ });
24
+ };
@@ -0,0 +1,30 @@
1
+ import type { ConfigPlugin } from 'expo/config-plugins';
2
+ import { withDangerousMod } from 'expo/config-plugins';
3
+ import fs from 'fs';
4
+ import path from 'path';
5
+ import type { ConfigProps } from './@types';
6
+
7
+ export const withSodiumIos: ConfigPlugin<ConfigProps> = config => {
8
+ return withDangerousMod(config, [
9
+ 'ios',
10
+ config => {
11
+ const podfilePath = path.join(
12
+ config.modRequest.platformProjectRoot,
13
+ 'Podfile',
14
+ );
15
+ let contents = fs.readFileSync(podfilePath, 'utf-8');
16
+
17
+ // Check if SODIUM_ENABLED is already set
18
+ if (!contents.includes("ENV['SODIUM_ENABLED']")) {
19
+ // Add it right after the RCT_NEW_ARCH_ENABLED ENV variable
20
+ contents = contents.replace(
21
+ /^(ENV\['RCT_NEW_ARCH_ENABLED'\].*$)/m,
22
+ `$1\nENV['SODIUM_ENABLED'] = '1'`,
23
+ );
24
+ fs.writeFileSync(podfilePath, contents);
25
+ }
26
+
27
+ return config;
28
+ },
29
+ ]);
30
+ };
@@ -0,0 +1,55 @@
1
+ import type { ConfigPlugin } from 'expo/config-plugins';
2
+ import type { ConfigProps } from './@types';
3
+ import { withBuildProperties } from 'expo-build-properties';
4
+ import { withDangerousMod } from 'expo/config-plugins';
5
+ import fs from 'fs';
6
+ import path from 'path';
7
+
8
+ /**
9
+ * Workaround for some jank XCode releases that break React Native native modules
10
+ *
11
+ * see: https://github.com/mrousavy/nitro/issues/422#issuecomment-2545988256
12
+ */
13
+ export const withXCode: ConfigPlugin<ConfigProps> = config => {
14
+ // Use expo-build-properties to bump iOS deployment target
15
+ config = withBuildProperties(config, { ios: { deploymentTarget: '16.1' } });
16
+ // Patch the generated Podfile fallback to ensure platform is always 16.1
17
+ config = withDangerousMod(config, [
18
+ 'ios',
19
+ modConfig => {
20
+ const podfilePath = path.join(
21
+ modConfig.modRequest.platformProjectRoot,
22
+ 'Podfile',
23
+ );
24
+ let contents = fs.readFileSync(podfilePath, 'utf-8');
25
+
26
+ // Check if the IPHONEOS_DEPLOYMENT_TARGET setting is already present
27
+ // We search for the key being assigned, e.g., config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] =
28
+ const deploymentTargetSettingExists =
29
+ /\.build_settings\s*\[\s*['"]IPHONEOS_DEPLOYMENT_TARGET['"]\s*\]\s*=/.test(
30
+ contents,
31
+ );
32
+
33
+ if (!deploymentTargetSettingExists) {
34
+ // IPHONEOS_DEPLOYMENT_TARGET setting not found, proceed to add it.
35
+ contents = contents.replace(
36
+ /(post_install\s+do\s+\|installer\|[\s\S]*?)(\r?\n\s\send\s*)$/m,
37
+ `$1
38
+
39
+ # Expo Build Properties: force deployment target
40
+ # https://github.com/mrousavy/nitro/issues/422#issuecomment-2545988256
41
+ installer.pods_project.targets.each do |target|
42
+ target.build_configurations.each do |config|
43
+ config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '16.1'
44
+ end
45
+ end
46
+ $2`,
47
+ );
48
+ }
49
+
50
+ fs.writeFileSync(podfilePath, contents);
51
+ return modConfig;
52
+ },
53
+ ]);
54
+ return config;
55
+ };
package/src/hash.ts ADDED
@@ -0,0 +1,274 @@
1
+ import { Stream } from 'readable-stream';
2
+ import { NitroModules } from 'react-native-nitro-modules';
3
+ import type { TransformOptions } from 'readable-stream';
4
+ import type { Hash as NativeHash } from './specs/hash.nitro';
5
+ import type {
6
+ BinaryLike,
7
+ Encoding,
8
+ BufferLike,
9
+ SubtleAlgorithm,
10
+ } from './utils';
11
+ import {
12
+ ab2str,
13
+ binaryLikeToArrayBuffer,
14
+ bufferLikeToArrayBuffer,
15
+ } from './utils';
16
+ import { validateMaxBufferLength } from './utils/validation';
17
+ import { lazyDOMException } from './utils/errors';
18
+ import { normalizeHashName } from './utils/hashnames';
19
+
20
+ class HashUtils {
21
+ private static native = NitroModules.createHybridObject<NativeHash>('Hash');
22
+ public static getSupportedHashAlgorithms(): string[] {
23
+ return this.native.getSupportedHashAlgorithms();
24
+ }
25
+ }
26
+
27
+ export function getHashes() {
28
+ return HashUtils.getSupportedHashAlgorithms();
29
+ }
30
+
31
+ interface HashOptions extends TransformOptions {
32
+ /**
33
+ * For XOF hash functions such as `shake256`, the
34
+ * outputLength option can be used to specify the desired output length in bytes.
35
+ */
36
+ outputLength?: number | undefined;
37
+ }
38
+
39
+ interface HashArgs {
40
+ algorithm: string;
41
+ options?: HashOptions;
42
+ native?: NativeHash;
43
+ }
44
+
45
+ class Hash extends Stream.Transform {
46
+ private algorithm: string;
47
+ private options: HashOptions;
48
+ private native: NativeHash;
49
+
50
+ private validate(args: HashArgs) {
51
+ if (typeof args.algorithm !== 'string' || args.algorithm.length === 0)
52
+ throw new Error('Algorithm must be a non-empty string');
53
+ if (
54
+ args.options?.outputLength !== undefined &&
55
+ args.options.outputLength < 0
56
+ )
57
+ throw new Error('Output length must be a non-negative number');
58
+ if (
59
+ args.options?.outputLength !== undefined &&
60
+ typeof args.options.outputLength !== 'number'
61
+ )
62
+ throw new Error('Output length must be a number');
63
+ }
64
+
65
+ /**
66
+ * @internal use `createHash()` instead
67
+ */
68
+ private constructor(args: HashArgs) {
69
+ super(args.options);
70
+
71
+ this.validate(args);
72
+
73
+ this.algorithm = args.algorithm;
74
+ this.options = args.options ?? {};
75
+
76
+ if (args.native) {
77
+ this.native = args.native;
78
+ return;
79
+ }
80
+
81
+ this.native = NitroModules.createHybridObject<NativeHash>('Hash');
82
+ this.native.createHash(this.algorithm, this.options.outputLength);
83
+ }
84
+
85
+ /**
86
+ * Updates the hash content with the given `data`, the encoding of which
87
+ * is given in `inputEncoding`.
88
+ * If `encoding` is not provided, and the `data` is a string, an
89
+ * encoding of `'utf8'` is enforced. If `data` is a `Buffer`, `TypedArray`, or`DataView`, then `inputEncoding` is ignored.
90
+ *
91
+ * This can be called many times with new data as it is streamed.
92
+ * @since v1.0.0
93
+ * @param inputEncoding The `encoding` of the `data` string.
94
+ */
95
+ update(data: BinaryLike): Hash;
96
+ update(data: BinaryLike, inputEncoding: Encoding): Buffer;
97
+ update(data: BinaryLike, inputEncoding?: Encoding): Hash | Buffer {
98
+ const defaultEncoding: Encoding = 'utf8';
99
+ inputEncoding = inputEncoding ?? defaultEncoding;
100
+
101
+ this.native.update(binaryLikeToArrayBuffer(data, inputEncoding));
102
+
103
+ return this; // to support chaining syntax createHash().update().digest()
104
+ }
105
+
106
+ /**
107
+ * Calculates the digest of all of the data passed to be hashed (using the `hash.update()` method).
108
+ * If `encoding` is provided a string will be returned; otherwise
109
+ * a `Buffer` is returned.
110
+ *
111
+ * The `Hash` object can not be used again after `hash.digest()` method has been
112
+ * called. Multiple calls will cause an error to be thrown.
113
+ * @since v1.0.0
114
+ * @param encoding The `encoding` of the return value.
115
+ */
116
+ digest(): Buffer;
117
+ digest(encoding: Encoding): Buffer;
118
+ digest(encoding?: Encoding): Buffer | string {
119
+ const nativeDigest = this.native.digest(encoding);
120
+
121
+ if (encoding && encoding !== 'buffer') {
122
+ return ab2str(nativeDigest, encoding);
123
+ }
124
+
125
+ return Buffer.from(nativeDigest);
126
+ }
127
+
128
+ /**
129
+ * Creates a new `Hash` object that contains a deep copy of the internal state
130
+ * of the current `Hash` object.
131
+ *
132
+ * The optional `options` argument controls stream behavior. For XOF hash
133
+ * functions such as `'shake256'`, the `outputLength` option can be used to
134
+ * specify the desired output length in bytes.
135
+ *
136
+ * An error is thrown when an attempt is made to copy the `Hash` object after
137
+ * its `hash.digest()` method has been called.
138
+ *
139
+ * ```js
140
+ * // Calculate a rolling hash.
141
+ * import { createHash } from 'react-native-quick-crypto';
142
+ *
143
+ * const hash = createHash('sha256');
144
+ *
145
+ * hash.update('one');
146
+ * console.log(hash.copy().digest('hex'));
147
+ *
148
+ * hash.update('two');
149
+ * console.log(hash.copy().digest('hex'));
150
+ *
151
+ * hash.update('three');
152
+ * console.log(hash.copy().digest('hex'));
153
+ *
154
+ * // Etc.
155
+ * ```
156
+ * @since v1.0.0
157
+ * @param options `stream.transform` options
158
+ */
159
+ copy(): Hash;
160
+ copy(options: HashOptions): Hash;
161
+ copy(options?: HashOptions): Hash {
162
+ const newOptions = options ?? this.options;
163
+ const newNativeHash = this.native.copy(newOptions.outputLength);
164
+ const hash = new Hash({
165
+ algorithm: this.algorithm,
166
+ options: newOptions,
167
+ native: newNativeHash,
168
+ });
169
+ return hash;
170
+ }
171
+
172
+ /**
173
+ * Returns the OpenSSL version string
174
+ * @since v1.0.0
175
+ */
176
+ getOpenSSLVersion(): string {
177
+ return this.native.getOpenSSLVersion();
178
+ }
179
+
180
+ // stream interface
181
+ _transform(
182
+ chunk: BinaryLike,
183
+ encoding: BufferEncoding,
184
+ callback: () => void,
185
+ ) {
186
+ this.update(chunk, encoding as Encoding);
187
+ callback();
188
+ }
189
+ _flush(callback: () => void) {
190
+ this.push(this.digest());
191
+ callback();
192
+ }
193
+ }
194
+
195
+ /**
196
+ * Creates and returns a `Hash` object that can be used to generate hash digests
197
+ * using the given `algorithm`. Optional `options` argument controls stream
198
+ * behavior. For XOF hash functions such as `'shake256'`, the `outputLength` option
199
+ * can be used to specify the desired output length in bytes.
200
+ *
201
+ * The `algorithm` is dependent on the available algorithms supported by the
202
+ * version of OpenSSL on the platform. Examples are `'sha256'`, `'sha512'`, etc.
203
+ * On recent releases of OpenSSL, `openssl list -digest-algorithms` will
204
+ * display the available digest algorithms.
205
+ *
206
+ * Example: generating the sha256 sum of a file
207
+ *
208
+ * ```js
209
+ * import crypto from 'react-native-quick-crypto';
210
+ *
211
+ * const hash = crypto.createHash('sha256').update('Test123').digest('hex');
212
+ * console.log('SHA-256 of "Test123":', hash);
213
+ * ```
214
+ * @since v1.0.0
215
+ * @param options `stream.transform` options
216
+ */
217
+ export function createHash(algorithm: string, options?: HashOptions): Hash {
218
+ // @ts-expect-error private constructor
219
+ return new Hash({
220
+ algorithm,
221
+ options,
222
+ });
223
+ }
224
+
225
+ // Implementation for WebCrypto subtle.digest()
226
+
227
+ /**
228
+ * Asynchronous digest function for WebCrypto SubtleCrypto API
229
+ * @param algorithm The hash algorithm to use
230
+ * @param data The data to hash
231
+ * @returns Promise resolving to the hash digest as ArrayBuffer
232
+ */
233
+ export const asyncDigest = async (
234
+ algorithm: SubtleAlgorithm,
235
+ data: BufferLike,
236
+ ): Promise<ArrayBuffer> => {
237
+ validateMaxBufferLength(data, 'data');
238
+
239
+ switch (algorithm.name) {
240
+ case 'SHA-1':
241
+ // Fall through
242
+ case 'SHA-256':
243
+ // Fall through
244
+ case 'SHA-384':
245
+ // Fall through
246
+ case 'SHA-512':
247
+ return internalDigest(algorithm, data);
248
+ }
249
+
250
+ throw lazyDOMException(
251
+ `Unrecognized algorithm name: ${algorithm.name}`,
252
+ 'NotSupportedError',
253
+ );
254
+ };
255
+
256
+ const internalDigest = (
257
+ algorithm: SubtleAlgorithm,
258
+ data: BufferLike,
259
+ ): ArrayBuffer => {
260
+ const normalizedHashName = normalizeHashName(algorithm.name);
261
+ const hash = createHash(normalizedHashName);
262
+ hash.update(bufferLikeToArrayBuffer(data));
263
+ const result = hash.digest();
264
+ const arrayBuffer = new ArrayBuffer(result.length);
265
+ const view = new Uint8Array(arrayBuffer);
266
+ view.set(result);
267
+ return arrayBuffer;
268
+ };
269
+
270
+ export const hashExports = {
271
+ createHash,
272
+ getHashes,
273
+ asyncDigest,
274
+ };
package/src/hmac.ts ADDED
@@ -0,0 +1,135 @@
1
+ import { Buffer } from '@craftzdog/react-native-buffer';
2
+ import { Stream } from 'readable-stream';
3
+ import { NitroModules } from 'react-native-nitro-modules';
4
+ import type { TransformOptions } from 'readable-stream';
5
+ import type { Hmac as NativeHmac } from './specs/hmac.nitro';
6
+ import type { BinaryLike, Encoding } from './utils/types';
7
+ import { ab2str, binaryLikeToArrayBuffer } from './utils/conversion';
8
+
9
+ interface HmacArgs {
10
+ algorithm: string;
11
+ key: BinaryLike;
12
+ options?: TransformOptions;
13
+ }
14
+
15
+ class Hmac extends Stream.Transform {
16
+ private algorithm: string;
17
+ private key: BinaryLike;
18
+ private native: NativeHmac;
19
+
20
+ private validate(args: HmacArgs) {
21
+ if (typeof args.algorithm !== 'string' || args.algorithm.length === 0)
22
+ throw new Error('Algorithm must be a non-empty string');
23
+ if (args.key === null || args.key === undefined)
24
+ throw new Error('Key must not be null or undefined');
25
+ }
26
+
27
+ /**
28
+ * @internal use `createHmac()` instead
29
+ */
30
+ private constructor(args: HmacArgs) {
31
+ super(args.options);
32
+
33
+ this.validate(args);
34
+
35
+ this.algorithm = args.algorithm;
36
+ this.key = args.key;
37
+
38
+ this.native = NitroModules.createHybridObject<NativeHmac>('Hmac');
39
+ this.native.createHmac(this.algorithm, binaryLikeToArrayBuffer(this.key));
40
+ }
41
+
42
+ /**
43
+ * Updates the `Hmac` content with the given `data`, the encoding of which is given in `inputEncoding`.
44
+ * If `encoding` is not provided, and the `data` is a string, an encoding of `'utf8'` is enforced.
45
+ * If `data` is a `Buffer`, `TypedArray`, or`DataView`, then `inputEncoding` is ignored.
46
+ *
47
+ * This can be called many times with new data as it is streamed.
48
+ * @since v1.0.0
49
+ * @param inputEncoding The `encoding` of the `data` string.
50
+ */
51
+ update(data: BinaryLike): Hmac;
52
+ update(data: BinaryLike, inputEncoding: Encoding): Hmac;
53
+ update(data: BinaryLike, inputEncoding?: Encoding): Hmac {
54
+ const defaultEncoding: Encoding = 'utf8';
55
+ inputEncoding = inputEncoding ?? defaultEncoding;
56
+
57
+ this.native.update(binaryLikeToArrayBuffer(data, inputEncoding));
58
+
59
+ return this; // to support chaining syntax createHmac().update().digest()
60
+ }
61
+
62
+ /**
63
+ * Calculates the HMAC digest of all of the data passed using `hmac.update()`.
64
+ * If `encoding` is provided a string is returned; otherwise a `Buffer` is returned;
65
+ *
66
+ * The `Hmac` object can not be used again after `hmac.digest()` has been
67
+ * called. Multiple calls to `hmac.digest()` will result in an error being thrown.
68
+ * @since v1.0.0
69
+ * @param encoding The `encoding` of the return value.
70
+ */
71
+ digest(): Buffer;
72
+ digest(encoding: Encoding): string;
73
+ digest(encoding?: Encoding): Buffer | string {
74
+ const nativeDigest = this.native.digest();
75
+
76
+ if (encoding && encoding !== 'buffer') {
77
+ return ab2str(nativeDigest, encoding);
78
+ }
79
+
80
+ return Buffer.from(nativeDigest);
81
+ }
82
+
83
+ // stream interface
84
+ _transform(
85
+ chunk: BinaryLike,
86
+ encoding: BufferEncoding,
87
+ callback: () => void,
88
+ ) {
89
+ this.update(chunk, encoding as Encoding);
90
+ callback();
91
+ }
92
+ _flush(callback: () => void) {
93
+ this.push(this.digest());
94
+ callback();
95
+ }
96
+ }
97
+
98
+ /**
99
+ * Creates and returns an `Hmac` object that uses the given `algorithm` and `key`.
100
+ * Optional `options` argument controls stream behavior.
101
+ *
102
+ * The `algorithm` is dependent on the available algorithms supported by the
103
+ * version of OpenSSL on the platform. Examples are `'sha256'`, `'sha512'`, etc.
104
+ * On recent releases of OpenSSL, `openssl list -digest-algorithms` will
105
+ * display the available digest algorithms.
106
+ *
107
+ * Example: generating the sha256 HMAC of a file
108
+ *
109
+ * ```js
110
+ * import crypto from 'react-native-quick-crypto';
111
+ *
112
+ * const hmac = crypto.createHmac('sha256', 'secret-key');
113
+ * hmac.update('message to hash');
114
+ * const digest = hmac.digest('hex');
115
+ * console.log(digest); // prints HMAC digest in hexadecimal format
116
+ * ```
117
+ * @since v1.0.0
118
+ * @param options `stream.transform` options
119
+ */
120
+ export function createHmac(
121
+ algorithm: string,
122
+ key: BinaryLike,
123
+ options?: TransformOptions,
124
+ ): Hmac {
125
+ // @ts-expect-error private constructor
126
+ return new Hmac({
127
+ algorithm,
128
+ key,
129
+ options,
130
+ });
131
+ }
132
+
133
+ export const hmacExports = {
134
+ createHmac,
135
+ };
package/src/index.ts CHANGED
@@ -2,48 +2,39 @@
2
2
  import { Buffer } from '@craftzdog/react-native-buffer';
3
3
 
4
4
  // API imports
5
+ import * as keys from './keys';
6
+ import * as blake3 from './blake3';
7
+ import * as cipher from './cipher';
8
+ import * as ed from './ed';
9
+ import { hashExports as hash } from './hash';
10
+ import { hmacExports as hmac } from './hmac';
11
+ import * as pbkdf2 from './pbkdf2';
5
12
  import * as random from './random';
6
13
 
7
14
  // utils import
8
- import { utils } from './utils';
15
+ import * as utils from './utils';
16
+ import * as subtle from './subtle';
9
17
 
10
18
  /**
11
19
  * Loosely matches Node.js {crypto} with some unimplemented functionality.
12
20
  * See `docs/implementation-coverage.md` for status.
13
21
  */
14
22
  const QuickCrypto = {
15
- // createHmac,
16
- // Hmac: createHmac,
17
- // Hash: createHash,
18
- // createHash,
19
- // createCipher,
20
- // createCipheriv,
21
- // createDecipher,
22
- // createDecipheriv,
23
- // createPublicKey,
24
- // createPrivateKey,
25
- // createSecretKey,
26
- // publicEncrypt,
27
- // publicDecrypt,
28
- // privateDecrypt,
29
- // generateKey,
30
- // generateKeyPair,
31
- // generateKeyPairSync,
32
- // generateKeySync,
33
- // createSign,
34
- // createVerify,
35
- // subtle,
36
- // constants,
37
- // ...pbkdf2,
23
+ ...keys,
24
+ ...blake3,
25
+ ...cipher,
26
+ ...ed,
27
+ ...hash,
28
+ ...hmac,
29
+ ...pbkdf2,
38
30
  ...random,
39
- // getCiphers,
40
- // getHashes,
41
- // webcrypto,
42
- utils,
31
+ ...utils,
32
+ ...subtle,
43
33
  };
44
34
 
45
35
  /**
46
- * Optional. Patch global.crypto with quickcrypto and global.Buffer with react-native-buffer.
36
+ * Optional. Patch global.crypto with react-native-quick-crypto and
37
+ * global.Buffer with react-native-buffer.
47
38
  */
48
39
  export const install = () => {
49
40
  // @ts-expect-error copyBytesFrom and poolSizets are missing from react-native-buffer
@@ -56,7 +47,19 @@ export const install = () => {
56
47
  // random, cipher, hash use nextTick
57
48
  global.process.nextTick = setImmediate;
58
49
 
50
+ // exports
59
51
  export default QuickCrypto;
52
+ export * from './blake3';
53
+ export * from './cipher';
54
+ export * from './ed';
55
+ export * from './keys';
56
+ export * from './hash';
57
+ export * from './hmac';
58
+ export * from './pbkdf2';
59
+ export * from './random';
60
+ export * from './utils';
61
+ export * from './subtle';
62
+ export { subtle, isCryptoKeyPair } from './subtle';
60
63
 
61
64
  // Additional exports for CommonJS compatibility
62
65
  module.exports = QuickCrypto;