@ohos-ports/react-native-quick-crypto 0.0.0-stage → 1.1.8-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1027) hide show
  1. package/QuickCrypto.podspec +259 -0
  2. package/README.md +170 -2
  3. package/android/CMakeLists.txt +155 -0
  4. package/android/build.gradle +176 -0
  5. package/android/gradle.properties +6 -0
  6. package/android/src/main/AndroidManifest.xml +3 -0
  7. package/android/src/main/cpp/cpp-adapter.cpp +8 -0
  8. package/android/src/main/java/com/margelo/nitro/quickcrypto/QuickCryptoPackage.java +41 -0
  9. package/app.plugin.js +3 -0
  10. package/cpp/argon2/HybridArgon2.cpp +110 -0
  11. package/cpp/argon2/HybridArgon2.hpp +32 -0
  12. package/cpp/blake3/HybridBlake3.cpp +120 -0
  13. package/cpp/blake3/HybridBlake3.hpp +35 -0
  14. package/cpp/certificate/HybridCertificate.cpp +42 -0
  15. package/cpp/certificate/HybridCertificate.hpp +16 -0
  16. package/cpp/cipher/CCMCipher.cpp +211 -0
  17. package/cpp/cipher/CCMCipher.hpp +24 -0
  18. package/cpp/cipher/ChaCha20Cipher.cpp +91 -0
  19. package/cpp/cipher/ChaCha20Cipher.hpp +23 -0
  20. package/cpp/cipher/ChaCha20Poly1305Cipher.cpp +175 -0
  21. package/cpp/cipher/ChaCha20Poly1305Cipher.hpp +27 -0
  22. package/cpp/cipher/GCMCipher.cpp +65 -0
  23. package/cpp/cipher/GCMCipher.hpp +14 -0
  24. package/cpp/cipher/HybridCipher.cpp +403 -0
  25. package/cpp/cipher/HybridCipher.hpp +90 -0
  26. package/cpp/cipher/HybridCipherFactory.hpp +119 -0
  27. package/cpp/cipher/HybridRsaCipher.cpp +477 -0
  28. package/cpp/cipher/HybridRsaCipher.hpp +33 -0
  29. package/cpp/cipher/OCBCipher.cpp +55 -0
  30. package/cpp/cipher/OCBCipher.hpp +19 -0
  31. package/cpp/cipher/XChaCha20Poly1305Cipher.cpp +158 -0
  32. package/cpp/cipher/XChaCha20Poly1305Cipher.hpp +42 -0
  33. package/cpp/cipher/XSalsa20Cipher.cpp +127 -0
  34. package/cpp/cipher/XSalsa20Cipher.hpp +55 -0
  35. package/cpp/cipher/XSalsa20Poly1305Cipher.cpp +138 -0
  36. package/cpp/cipher/XSalsa20Poly1305Cipher.hpp +41 -0
  37. package/cpp/dh/HybridDhKeyPair.cpp +179 -0
  38. package/cpp/dh/HybridDhKeyPair.hpp +37 -0
  39. package/cpp/dh/HybridDiffieHellman.cpp +482 -0
  40. package/cpp/dh/HybridDiffieHellman.hpp +42 -0
  41. package/cpp/dsa/HybridDsaKeyPair.cpp +128 -0
  42. package/cpp/dsa/HybridDsaKeyPair.hpp +32 -0
  43. package/cpp/ec/HybridEcKeyPair.cpp +481 -0
  44. package/cpp/ec/HybridEcKeyPair.hpp +45 -0
  45. package/cpp/ecdh/HybridECDH.cpp +251 -0
  46. package/cpp/ecdh/HybridECDH.hpp +43 -0
  47. package/cpp/ed25519/HybridEdKeyPair.cpp +360 -0
  48. package/cpp/ed25519/HybridEdKeyPair.hpp +67 -0
  49. package/cpp/hash/HybridHash.cpp +190 -0
  50. package/cpp/hash/HybridHash.hpp +43 -0
  51. package/cpp/hkdf/HybridHkdf.cpp +115 -0
  52. package/cpp/hkdf/HybridHkdf.hpp +29 -0
  53. package/cpp/hmac/HybridHmac.cpp +102 -0
  54. package/cpp/hmac/HybridHmac.hpp +32 -0
  55. package/cpp/keys/HybridKeyObjectHandle.cpp +1519 -0
  56. package/cpp/keys/HybridKeyObjectHandle.hpp +78 -0
  57. package/cpp/keys/KeyObjectData.cpp +298 -0
  58. package/cpp/keys/KeyObjectData.hpp +73 -0
  59. package/cpp/keys/node.h +5 -0
  60. package/cpp/kmac/HybridKmac.cpp +83 -0
  61. package/cpp/kmac/HybridKmac.hpp +31 -0
  62. package/cpp/mldsa/HybridMlDsaKeyPair.cpp +243 -0
  63. package/cpp/mldsa/HybridMlDsaKeyPair.hpp +49 -0
  64. package/cpp/mlkem/HybridMlKemKeyPair.cpp +315 -0
  65. package/cpp/mlkem/HybridMlKemKeyPair.hpp +48 -0
  66. package/cpp/pbkdf2/HybridPbkdf2.cpp +50 -0
  67. package/cpp/pbkdf2/HybridPbkdf2.hpp +24 -0
  68. package/cpp/prime/HybridPrime.cpp +81 -0
  69. package/cpp/prime/HybridPrime.hpp +20 -0
  70. package/cpp/random/HybridRandom.cpp +48 -0
  71. package/cpp/random/HybridRandom.hpp +32 -0
  72. package/cpp/rsa/HybridRsaKeyPair.cpp +151 -0
  73. package/cpp/rsa/HybridRsaKeyPair.hpp +40 -0
  74. package/cpp/scrypt/HybridScrypt.cpp +64 -0
  75. package/cpp/scrypt/HybridScrypt.hpp +28 -0
  76. package/cpp/sign/HybridSignHandle.cpp +241 -0
  77. package/cpp/sign/HybridSignHandle.hpp +36 -0
  78. package/cpp/sign/HybridVerifyHandle.cpp +207 -0
  79. package/cpp/sign/HybridVerifyHandle.hpp +36 -0
  80. package/cpp/sign/SignUtils.hpp +91 -0
  81. package/cpp/slhdsa/HybridSlhDsaKeyPair.cpp +245 -0
  82. package/cpp/slhdsa/HybridSlhDsaKeyPair.hpp +48 -0
  83. package/cpp/turboshake/HybridTurboShake.cpp +379 -0
  84. package/cpp/turboshake/HybridTurboShake.hpp +28 -0
  85. package/cpp/utils/HybridUtils.cpp +399 -0
  86. package/cpp/utils/HybridUtils.hpp +28 -0
  87. package/cpp/utils/Macros.hpp +68 -0
  88. package/cpp/utils/QuickCryptoUtils.cpp +44 -0
  89. package/cpp/utils/QuickCryptoUtils.hpp +186 -0
  90. package/cpp/utils/base64.h +309 -0
  91. package/cpp/x509/HybridX509Certificate.cpp +174 -0
  92. package/cpp/x509/HybridX509Certificate.hpp +51 -0
  93. package/deps/blake3/LICENSE_A2 +202 -0
  94. package/deps/blake3/LICENSE_A2LLVM +219 -0
  95. package/deps/blake3/LICENSE_CC0 +121 -0
  96. package/deps/blake3/README.md +228 -0
  97. package/deps/blake3/c/README.md +403 -0
  98. package/deps/blake3/c/blake3.c +651 -0
  99. package/deps/blake3/c/blake3.h +86 -0
  100. package/deps/blake3/c/blake3_dispatch.c +332 -0
  101. package/deps/blake3/c/blake3_impl.h +333 -0
  102. package/deps/blake3/c/blake3_neon.c +367 -0
  103. package/deps/blake3/c/blake3_portable.c +160 -0
  104. package/deps/fastpbkdf2/fastpbkdf2.c +356 -0
  105. package/deps/fastpbkdf2/fastpbkdf2.h +68 -0
  106. package/deps/ncrypto/LICENSE +21 -0
  107. package/deps/ncrypto/README.md +18 -0
  108. package/deps/ncrypto/include/dh-primes.h +67 -0
  109. package/deps/ncrypto/include/ncrypto/aead.h +137 -0
  110. package/deps/ncrypto/include/ncrypto/version.h +14 -0
  111. package/deps/ncrypto/include/ncrypto.h +1759 -0
  112. package/deps/ncrypto/src/aead.cpp +302 -0
  113. package/deps/ncrypto/src/engine.cpp +93 -0
  114. package/deps/ncrypto/src/ncrypto.cpp +5426 -0
  115. package/deps/simdutf/LICENSE-APACHE +201 -0
  116. package/deps/simdutf/LICENSE-MIT +18 -0
  117. package/deps/simdutf/README.md +2782 -0
  118. package/deps/simdutf/include/simdutf/avx512.h +79 -0
  119. package/deps/simdutf/include/simdutf/base64_implementation.h +158 -0
  120. package/deps/simdutf/include/simdutf/base64_tables.h +887 -0
  121. package/deps/simdutf/include/simdutf/common_defs.h +186 -0
  122. package/deps/simdutf/include/simdutf/compiler_check.h +50 -0
  123. package/deps/simdutf/include/simdutf/constexpr_ptr.h +138 -0
  124. package/deps/simdutf/include/simdutf/encoding_types.h +189 -0
  125. package/deps/simdutf/include/simdutf/error.h +126 -0
  126. package/deps/simdutf/include/simdutf/implementation.h +7081 -0
  127. package/deps/simdutf/include/simdutf/internal/isadetection.h +325 -0
  128. package/deps/simdutf/include/simdutf/portability.h +285 -0
  129. package/deps/simdutf/include/simdutf/scalar/ascii.h +86 -0
  130. package/deps/simdutf/include/simdutf/scalar/atomic_util.h +105 -0
  131. package/deps/simdutf/include/simdutf/scalar/base64.h +911 -0
  132. package/deps/simdutf/include/simdutf/scalar/latin1.h +26 -0
  133. package/deps/simdutf/include/simdutf/scalar/latin1_to_utf16/latin1_to_utf16.h +52 -0
  134. package/deps/simdutf/include/simdutf/scalar/latin1_to_utf32/latin1_to_utf32.h +27 -0
  135. package/deps/simdutf/include/simdutf/scalar/latin1_to_utf8/latin1_to_utf8.h +191 -0
  136. package/deps/simdutf/include/simdutf/scalar/swap_bytes.h +35 -0
  137. package/deps/simdutf/include/simdutf/scalar/utf16.h +226 -0
  138. package/deps/simdutf/include/simdutf/scalar/utf16_to_latin1/utf16_to_latin1.h +108 -0
  139. package/deps/simdutf/include/simdutf/scalar/utf16_to_latin1/valid_utf16_to_latin1.h +40 -0
  140. package/deps/simdutf/include/simdutf/scalar/utf16_to_utf32/utf16_to_utf32.h +86 -0
  141. package/deps/simdutf/include/simdutf/scalar/utf16_to_utf32/valid_utf16_to_utf32.h +44 -0
  142. package/deps/simdutf/include/simdutf/scalar/utf16_to_utf8/utf16_to_utf8.h +295 -0
  143. package/deps/simdutf/include/simdutf/scalar/utf16_to_utf8/valid_utf16_to_utf8.h +91 -0
  144. package/deps/simdutf/include/simdutf/scalar/utf32.h +82 -0
  145. package/deps/simdutf/include/simdutf/scalar/utf32_to_latin1/utf32_to_latin1.h +68 -0
  146. package/deps/simdutf/include/simdutf/scalar/utf32_to_latin1/valid_utf32_to_latin1.h +67 -0
  147. package/deps/simdutf/include/simdutf/scalar/utf32_to_utf16/utf32_to_utf16.h +84 -0
  148. package/deps/simdutf/include/simdutf/scalar/utf32_to_utf16/valid_utf32_to_utf16.h +44 -0
  149. package/deps/simdutf/include/simdutf/scalar/utf32_to_utf8/utf32_to_utf8.h +142 -0
  150. package/deps/simdutf/include/simdutf/scalar/utf32_to_utf8/valid_utf32_to_utf8.h +72 -0
  151. package/deps/simdutf/include/simdutf/scalar/utf8.h +326 -0
  152. package/deps/simdutf/include/simdutf/scalar/utf8_to_latin1/utf8_to_latin1.h +225 -0
  153. package/deps/simdutf/include/simdutf/scalar/utf8_to_latin1/valid_utf8_to_latin1.h +87 -0
  154. package/deps/simdutf/include/simdutf/scalar/utf8_to_utf16/utf8_to_utf16.h +342 -0
  155. package/deps/simdutf/include/simdutf/scalar/utf8_to_utf16/valid_utf8_to_utf16.h +106 -0
  156. package/deps/simdutf/include/simdutf/scalar/utf8_to_utf32/utf8_to_utf32.h +299 -0
  157. package/deps/simdutf/include/simdutf/scalar/utf8_to_utf32/valid_utf8_to_utf32.h +83 -0
  158. package/deps/simdutf/include/simdutf/simdutf_version.h +26 -0
  159. package/deps/simdutf/include/simdutf.h +26 -0
  160. package/deps/simdutf/include/simdutf_c.h +342 -0
  161. package/deps/simdutf/src/arm64/arm_base64.cpp +791 -0
  162. package/deps/simdutf/src/arm64/arm_convert_latin1_to_utf16.cpp +24 -0
  163. package/deps/simdutf/src/arm64/arm_convert_latin1_to_utf32.cpp +24 -0
  164. package/deps/simdutf/src/arm64/arm_convert_latin1_to_utf8.cpp +70 -0
  165. package/deps/simdutf/src/arm64/arm_convert_utf16_to_latin1.cpp +61 -0
  166. package/deps/simdutf/src/arm64/arm_convert_utf16_to_utf32.cpp +185 -0
  167. package/deps/simdutf/src/arm64/arm_convert_utf16_to_utf8.cpp +780 -0
  168. package/deps/simdutf/src/arm64/arm_convert_utf32_to_latin1.cpp +60 -0
  169. package/deps/simdutf/src/arm64/arm_convert_utf32_to_utf16.cpp +208 -0
  170. package/deps/simdutf/src/arm64/arm_convert_utf32_to_utf8.cpp +505 -0
  171. package/deps/simdutf/src/arm64/arm_convert_utf8_to_latin1.cpp +69 -0
  172. package/deps/simdutf/src/arm64/arm_convert_utf8_to_utf16.cpp +313 -0
  173. package/deps/simdutf/src/arm64/arm_convert_utf8_to_utf32.cpp +179 -0
  174. package/deps/simdutf/src/arm64/arm_find.cpp +199 -0
  175. package/deps/simdutf/src/arm64/arm_utf16fix.cpp +185 -0
  176. package/deps/simdutf/src/arm64/arm_validate_utf16.cpp +165 -0
  177. package/deps/simdutf/src/arm64/arm_validate_utf32le.cpp +65 -0
  178. package/deps/simdutf/src/arm64/implementation.cpp +1442 -0
  179. package/deps/simdutf/src/encoding_types.cpp +67 -0
  180. package/deps/simdutf/src/error.cpp +3 -0
  181. package/deps/simdutf/src/fallback/implementation.cpp +589 -0
  182. package/deps/simdutf/src/generic/ascii_validation.h +50 -0
  183. package/deps/simdutf/src/generic/base64.h +233 -0
  184. package/deps/simdutf/src/generic/base64lengths.h +63 -0
  185. package/deps/simdutf/src/generic/buf_block_reader.h +109 -0
  186. package/deps/simdutf/src/generic/find.h +75 -0
  187. package/deps/simdutf/src/generic/utf16/change_endianness.h +24 -0
  188. package/deps/simdutf/src/generic/utf16/count_code_points_bytemask.h +58 -0
  189. package/deps/simdutf/src/generic/utf16/to_well_formed.h +93 -0
  190. package/deps/simdutf/src/generic/utf16/utf32_length_from_utf16.h +15 -0
  191. package/deps/simdutf/src/generic/utf16/utf8_length_from_utf16.h +35 -0
  192. package/deps/simdutf/src/generic/utf16/utf8_length_from_utf16_bytemask.h +199 -0
  193. package/deps/simdutf/src/generic/utf16.h +73 -0
  194. package/deps/simdutf/src/generic/utf32.h +136 -0
  195. package/deps/simdutf/src/generic/utf8/utf16_length_from_utf8_bytemask.h +53 -0
  196. package/deps/simdutf/src/generic/utf8.h +92 -0
  197. package/deps/simdutf/src/generic/utf8_to_latin1/utf8_to_latin1.h +316 -0
  198. package/deps/simdutf/src/generic/utf8_to_latin1/valid_utf8_to_latin1.h +78 -0
  199. package/deps/simdutf/src/generic/utf8_to_utf16/utf8_to_utf16.h +332 -0
  200. package/deps/simdutf/src/generic/utf8_to_utf16/valid_utf8_to_utf16.h +74 -0
  201. package/deps/simdutf/src/generic/utf8_to_utf32/utf8_to_utf32.h +318 -0
  202. package/deps/simdutf/src/generic/utf8_to_utf32/valid_utf8_to_utf32.h +42 -0
  203. package/deps/simdutf/src/generic/utf8_validation/utf8_lookup4_algorithm.h +223 -0
  204. package/deps/simdutf/src/generic/utf8_validation/utf8_validator.h +84 -0
  205. package/deps/simdutf/src/generic/validate_utf16.h +164 -0
  206. package/deps/simdutf/src/generic/validate_utf32.h +99 -0
  207. package/deps/simdutf/src/haswell/avx2_base64.cpp +837 -0
  208. package/deps/simdutf/src/haswell/avx2_convert_latin1_to_utf16.cpp +28 -0
  209. package/deps/simdutf/src/haswell/avx2_convert_latin1_to_utf32.cpp +20 -0
  210. package/deps/simdutf/src/haswell/avx2_convert_latin1_to_utf8.cpp +83 -0
  211. package/deps/simdutf/src/haswell/avx2_convert_utf16_to_latin1.cpp +83 -0
  212. package/deps/simdutf/src/haswell/avx2_convert_utf16_to_utf32.cpp +210 -0
  213. package/deps/simdutf/src/haswell/avx2_convert_utf16_to_utf8.cpp +602 -0
  214. package/deps/simdutf/src/haswell/avx2_convert_utf32_to_latin1.cpp +116 -0
  215. package/deps/simdutf/src/haswell/avx2_convert_utf32_to_utf16.cpp +164 -0
  216. package/deps/simdutf/src/haswell/avx2_convert_utf32_to_utf8.cpp +569 -0
  217. package/deps/simdutf/src/haswell/avx2_convert_utf8_to_latin1.cpp +60 -0
  218. package/deps/simdutf/src/haswell/avx2_convert_utf8_to_utf16.cpp +195 -0
  219. package/deps/simdutf/src/haswell/avx2_convert_utf8_to_utf32.cpp +135 -0
  220. package/deps/simdutf/src/haswell/avx2_utf16fix.cpp +173 -0
  221. package/deps/simdutf/src/haswell/avx2_validate_utf16.cpp +17 -0
  222. package/deps/simdutf/src/haswell/implementation.cpp +1447 -0
  223. package/deps/simdutf/src/icelake/icelake_ascii_validation.inl.cpp +19 -0
  224. package/deps/simdutf/src/icelake/icelake_base64.inl.cpp +630 -0
  225. package/deps/simdutf/src/icelake/icelake_common.inl.cpp +37 -0
  226. package/deps/simdutf/src/icelake/icelake_convert_latin1_to_utf16.inl.cpp +36 -0
  227. package/deps/simdutf/src/icelake/icelake_convert_latin1_to_utf32.inl.cpp +23 -0
  228. package/deps/simdutf/src/icelake/icelake_convert_latin1_to_utf8.inl.cpp +107 -0
  229. package/deps/simdutf/src/icelake/icelake_convert_utf16_to_latin1.inl.cpp +103 -0
  230. package/deps/simdutf/src/icelake/icelake_convert_utf16_to_utf32.inl.cpp +136 -0
  231. package/deps/simdutf/src/icelake/icelake_convert_utf16_to_utf8.inl.cpp +206 -0
  232. package/deps/simdutf/src/icelake/icelake_convert_utf32_to_latin1.inl.cpp +74 -0
  233. package/deps/simdutf/src/icelake/icelake_convert_utf32_to_utf16.inl.cpp +338 -0
  234. package/deps/simdutf/src/icelake/icelake_convert_utf32_to_utf8.inl.cpp +574 -0
  235. package/deps/simdutf/src/icelake/icelake_convert_utf8_to_latin1.inl.cpp +104 -0
  236. package/deps/simdutf/src/icelake/icelake_convert_utf8_to_utf16.inl.cpp +75 -0
  237. package/deps/simdutf/src/icelake/icelake_convert_valid_utf8_to_latin1.inl.cpp +69 -0
  238. package/deps/simdutf/src/icelake/icelake_find.inl.cpp +146 -0
  239. package/deps/simdutf/src/icelake/icelake_from_utf8.inl.cpp +266 -0
  240. package/deps/simdutf/src/icelake/icelake_from_valid_utf8.inl.cpp +136 -0
  241. package/deps/simdutf/src/icelake/icelake_macros.inl.cpp +143 -0
  242. package/deps/simdutf/src/icelake/icelake_utf16fix.cpp +138 -0
  243. package/deps/simdutf/src/icelake/icelake_utf32_validation.inl.cpp +63 -0
  244. package/deps/simdutf/src/icelake/icelake_utf8_common.inl.cpp +753 -0
  245. package/deps/simdutf/src/icelake/icelake_utf8_length_from_utf16.inl.cpp +269 -0
  246. package/deps/simdutf/src/icelake/icelake_utf8_validation.inl.cpp +116 -0
  247. package/deps/simdutf/src/icelake/implementation.cpp +1903 -0
  248. package/deps/simdutf/src/implementation.cpp +2526 -0
  249. package/deps/simdutf/src/lasx/implementation.cpp +1531 -0
  250. package/deps/simdutf/src/lasx/lasx_base64.cpp +695 -0
  251. package/deps/simdutf/src/lasx/lasx_convert_latin1_to_utf16.cpp +76 -0
  252. package/deps/simdutf/src/lasx/lasx_convert_latin1_to_utf32.cpp +55 -0
  253. package/deps/simdutf/src/lasx/lasx_convert_latin1_to_utf8.cpp +65 -0
  254. package/deps/simdutf/src/lasx/lasx_convert_utf16_to_latin1.cpp +64 -0
  255. package/deps/simdutf/src/lasx/lasx_convert_utf16_to_utf32.cpp +183 -0
  256. package/deps/simdutf/src/lasx/lasx_convert_utf16_to_utf8.cpp +550 -0
  257. package/deps/simdutf/src/lasx/lasx_convert_utf32_to_latin1.cpp +73 -0
  258. package/deps/simdutf/src/lasx/lasx_convert_utf32_to_utf16.cpp +218 -0
  259. package/deps/simdutf/src/lasx/lasx_convert_utf32_to_utf8.cpp +589 -0
  260. package/deps/simdutf/src/lasx/lasx_convert_utf8_to_latin1.cpp +72 -0
  261. package/deps/simdutf/src/lasx/lasx_convert_utf8_to_utf16.cpp +296 -0
  262. package/deps/simdutf/src/lasx/lasx_convert_utf8_to_utf32.cpp +190 -0
  263. package/deps/simdutf/src/lasx/lasx_find.cpp +64 -0
  264. package/deps/simdutf/src/lasx/lasx_validate_utf16.cpp +13 -0
  265. package/deps/simdutf/src/lasx/lasx_validate_utf32le.cpp +84 -0
  266. package/deps/simdutf/src/lsx/implementation.cpp +1417 -0
  267. package/deps/simdutf/src/lsx/lsx_base64.cpp +675 -0
  268. package/deps/simdutf/src/lsx/lsx_convert_latin1_to_utf16.cpp +39 -0
  269. package/deps/simdutf/src/lsx/lsx_convert_latin1_to_utf32.cpp +27 -0
  270. package/deps/simdutf/src/lsx/lsx_convert_latin1_to_utf8.cpp +56 -0
  271. package/deps/simdutf/src/lsx/lsx_convert_utf16_to_latin1.cpp +64 -0
  272. package/deps/simdutf/src/lsx/lsx_convert_utf16_to_utf32.cpp +133 -0
  273. package/deps/simdutf/src/lsx/lsx_convert_utf16_to_utf8.cpp +518 -0
  274. package/deps/simdutf/src/lsx/lsx_convert_utf32_to_latin1.cpp +66 -0
  275. package/deps/simdutf/src/lsx/lsx_convert_utf32_to_utf16.cpp +155 -0
  276. package/deps/simdutf/src/lsx/lsx_convert_utf32_to_utf8.cpp +459 -0
  277. package/deps/simdutf/src/lsx/lsx_convert_utf8_to_latin1.cpp +75 -0
  278. package/deps/simdutf/src/lsx/lsx_convert_utf8_to_utf16.cpp +291 -0
  279. package/deps/simdutf/src/lsx/lsx_convert_utf8_to_utf32.cpp +179 -0
  280. package/deps/simdutf/src/lsx/lsx_find.cpp +60 -0
  281. package/deps/simdutf/src/lsx/lsx_validate_utf16.cpp +13 -0
  282. package/deps/simdutf/src/lsx/lsx_validate_utf32le.cpp +68 -0
  283. package/deps/simdutf/src/ppc64/implementation.cpp +992 -0
  284. package/deps/simdutf/src/ppc64/ppc64_base64.cpp +480 -0
  285. package/deps/simdutf/src/ppc64/ppc64_base64_internal_tests.cpp +401 -0
  286. package/deps/simdutf/src/ppc64/ppc64_convert_latin1_to_utf16.cpp +12 -0
  287. package/deps/simdutf/src/ppc64/ppc64_convert_latin1_to_utf32.cpp +12 -0
  288. package/deps/simdutf/src/ppc64/ppc64_convert_latin1_to_utf8.cpp +149 -0
  289. package/deps/simdutf/src/ppc64/ppc64_convert_utf16_to_latin1.cpp +67 -0
  290. package/deps/simdutf/src/ppc64/ppc64_convert_utf16_to_utf32.cpp +87 -0
  291. package/deps/simdutf/src/ppc64/ppc64_convert_utf16_to_utf8.cpp +296 -0
  292. package/deps/simdutf/src/ppc64/ppc64_convert_utf32_to_latin1.cpp +57 -0
  293. package/deps/simdutf/src/ppc64/ppc64_convert_utf32_to_utf16.cpp +117 -0
  294. package/deps/simdutf/src/ppc64/ppc64_convert_utf32_to_utf8.cpp +166 -0
  295. package/deps/simdutf/src/ppc64/ppc64_convert_utf8_to_latin1.cpp +69 -0
  296. package/deps/simdutf/src/ppc64/ppc64_convert_utf8_to_utf16.cpp +211 -0
  297. package/deps/simdutf/src/ppc64/ppc64_convert_utf8_to_utf32.cpp +153 -0
  298. package/deps/simdutf/src/ppc64/ppc64_utf16_to_utf8_tables.h +1011 -0
  299. package/deps/simdutf/src/ppc64/ppc64_utf8_length_from_latin1.cpp +37 -0
  300. package/deps/simdutf/src/ppc64/ppc64_validate_utf16.cpp +19 -0
  301. package/deps/simdutf/src/ppc64/templates.cpp +91 -0
  302. package/deps/simdutf/src/rvv/implementation.cpp +138 -0
  303. package/deps/simdutf/src/rvv/rvv_find.cpp +27 -0
  304. package/deps/simdutf/src/rvv/rvv_helpers.inl.cpp +23 -0
  305. package/deps/simdutf/src/rvv/rvv_latin1_to.inl.cpp +71 -0
  306. package/deps/simdutf/src/rvv/rvv_length_from.inl.cpp +164 -0
  307. package/deps/simdutf/src/rvv/rvv_utf16_to.inl.cpp +399 -0
  308. package/deps/simdutf/src/rvv/rvv_utf16fix.cpp +110 -0
  309. package/deps/simdutf/src/rvv/rvv_utf32_to.inl.cpp +307 -0
  310. package/deps/simdutf/src/rvv/rvv_utf8_to.inl.cpp +435 -0
  311. package/deps/simdutf/src/rvv/rvv_validate.inl.cpp +275 -0
  312. package/deps/simdutf/src/simdutf/arm64/begin.h +2 -0
  313. package/deps/simdutf/src/simdutf/arm64/bitmanipulation.h +34 -0
  314. package/deps/simdutf/src/simdutf/arm64/end.h +2 -0
  315. package/deps/simdutf/src/simdutf/arm64/implementation.h +307 -0
  316. package/deps/simdutf/src/simdutf/arm64/intrinsics.h +10 -0
  317. package/deps/simdutf/src/simdutf/arm64/simd.h +547 -0
  318. package/deps/simdutf/src/simdutf/arm64/simd16-inl.h +403 -0
  319. package/deps/simdutf/src/simdutf/arm64/simd32-inl.h +129 -0
  320. package/deps/simdutf/src/simdutf/arm64/simd64-inl.h +28 -0
  321. package/deps/simdutf/src/simdutf/arm64.h +43 -0
  322. package/deps/simdutf/src/simdutf/fallback/begin.h +1 -0
  323. package/deps/simdutf/src/simdutf/fallback/bitmanipulation.h +13 -0
  324. package/deps/simdutf/src/simdutf/fallback/end.h +1 -0
  325. package/deps/simdutf/src/simdutf/fallback/implementation.h +331 -0
  326. package/deps/simdutf/src/simdutf/fallback.h +42 -0
  327. package/deps/simdutf/src/simdutf/haswell/begin.h +15 -0
  328. package/deps/simdutf/src/simdutf/haswell/bitmanipulation.h +35 -0
  329. package/deps/simdutf/src/simdutf/haswell/end.h +13 -0
  330. package/deps/simdutf/src/simdutf/haswell/implementation.h +338 -0
  331. package/deps/simdutf/src/simdutf/haswell/intrinsics.h +67 -0
  332. package/deps/simdutf/src/simdutf/haswell/simd.h +363 -0
  333. package/deps/simdutf/src/simdutf/haswell/simd16-inl.h +261 -0
  334. package/deps/simdutf/src/simdutf/haswell/simd32-inl.h +111 -0
  335. package/deps/simdutf/src/simdutf/haswell/simd64-inl.h +34 -0
  336. package/deps/simdutf/src/simdutf/haswell.h +63 -0
  337. package/deps/simdutf/src/simdutf/icelake/begin.h +14 -0
  338. package/deps/simdutf/src/simdutf/icelake/bitmanipulation.h +44 -0
  339. package/deps/simdutf/src/simdutf/icelake/end.h +12 -0
  340. package/deps/simdutf/src/simdutf/icelake/implementation.h +346 -0
  341. package/deps/simdutf/src/simdutf/icelake/intrinsics.h +138 -0
  342. package/deps/simdutf/src/simdutf/icelake/simd.h +17 -0
  343. package/deps/simdutf/src/simdutf/icelake/simd16-inl.h +90 -0
  344. package/deps/simdutf/src/simdutf/icelake/simd32-inl.h +47 -0
  345. package/deps/simdutf/src/simdutf/icelake.h +81 -0
  346. package/deps/simdutf/src/simdutf/lasx/begin.h +8 -0
  347. package/deps/simdutf/src/simdutf/lasx/bitmanipulation.h +25 -0
  348. package/deps/simdutf/src/simdutf/lasx/end.h +8 -0
  349. package/deps/simdutf/src/simdutf/lasx/implementation.h +310 -0
  350. package/deps/simdutf/src/simdutf/lasx/intrinsics.h +319 -0
  351. package/deps/simdutf/src/simdutf/lasx/simd.h +551 -0
  352. package/deps/simdutf/src/simdutf/lasx/simd16-inl.h +234 -0
  353. package/deps/simdutf/src/simdutf/lasx/simd32-inl.h +74 -0
  354. package/deps/simdutf/src/simdutf/lasx/simd64-inl.h +52 -0
  355. package/deps/simdutf/src/simdutf/lasx.h +49 -0
  356. package/deps/simdutf/src/simdutf/lsx/begin.h +2 -0
  357. package/deps/simdutf/src/simdutf/lsx/bitmanipulation.h +25 -0
  358. package/deps/simdutf/src/simdutf/lsx/end.h +2 -0
  359. package/deps/simdutf/src/simdutf/lsx/implementation.h +309 -0
  360. package/deps/simdutf/src/simdutf/lsx/intrinsics.h +196 -0
  361. package/deps/simdutf/src/simdutf/lsx/simd.h +421 -0
  362. package/deps/simdutf/src/simdutf/lsx/simd16-inl.h +242 -0
  363. package/deps/simdutf/src/simdutf/lsx/simd32-inl.h +69 -0
  364. package/deps/simdutf/src/simdutf/lsx/simd64-inl.h +50 -0
  365. package/deps/simdutf/src/simdutf/lsx.h +52 -0
  366. package/deps/simdutf/src/simdutf/ppc64/begin.h +1 -0
  367. package/deps/simdutf/src/simdutf/ppc64/bitmanipulation.h +29 -0
  368. package/deps/simdutf/src/simdutf/ppc64/end.h +1 -0
  369. package/deps/simdutf/src/simdutf/ppc64/implementation.h +348 -0
  370. package/deps/simdutf/src/simdutf/ppc64/intrinsics.h +19 -0
  371. package/deps/simdutf/src/simdutf/ppc64/simd.h +177 -0
  372. package/deps/simdutf/src/simdutf/ppc64/simd16-inl.h +327 -0
  373. package/deps/simdutf/src/simdutf/ppc64/simd32-inl.h +247 -0
  374. package/deps/simdutf/src/simdutf/ppc64/simd8-inl.h +618 -0
  375. package/deps/simdutf/src/simdutf/ppc64.h +40 -0
  376. package/deps/simdutf/src/simdutf/rvv/begin.h +7 -0
  377. package/deps/simdutf/src/simdutf/rvv/end.h +7 -0
  378. package/deps/simdutf/src/simdutf/rvv/implementation.h +321 -0
  379. package/deps/simdutf/src/simdutf/rvv/intrinsics.h +131 -0
  380. package/deps/simdutf/src/simdutf/rvv.h +41 -0
  381. package/deps/simdutf/src/simdutf/westmere/begin.h +8 -0
  382. package/deps/simdutf/src/simdutf/westmere/bitmanipulation.h +37 -0
  383. package/deps/simdutf/src/simdutf/westmere/end.h +8 -0
  384. package/deps/simdutf/src/simdutf/westmere/implementation.h +338 -0
  385. package/deps/simdutf/src/simdutf/westmere/intrinsics.h +38 -0
  386. package/deps/simdutf/src/simdutf/westmere/simd.h +379 -0
  387. package/deps/simdutf/src/simdutf/westmere/simd16-inl.h +242 -0
  388. package/deps/simdutf/src/simdutf/westmere/simd32-inl.h +151 -0
  389. package/deps/simdutf/src/simdutf/westmere/simd64-inl.h +33 -0
  390. package/deps/simdutf/src/simdutf/westmere.h +59 -0
  391. package/deps/simdutf/src/simdutf.cpp +152 -0
  392. package/deps/simdutf/src/simdutf_c.cpp +525 -0
  393. package/deps/simdutf/src/tables/utf16_to_utf8_tables.h +768 -0
  394. package/deps/simdutf/src/tables/utf32_to_utf16_tables.h +53 -0
  395. package/deps/simdutf/src/tables/utf8_to_utf16_tables.h +826 -0
  396. package/deps/simdutf/src/westmere/implementation.cpp +1479 -0
  397. package/deps/simdutf/src/westmere/internal/loader.cpp +7 -0
  398. package/deps/simdutf/src/westmere/internal/write_v_u16_11bits_to_utf8.cpp +66 -0
  399. package/deps/simdutf/src/westmere/sse_base64.cpp +672 -0
  400. package/deps/simdutf/src/westmere/sse_convert_latin1_to_utf16.cpp +21 -0
  401. package/deps/simdutf/src/westmere/sse_convert_latin1_to_utf32.cpp +31 -0
  402. package/deps/simdutf/src/westmere/sse_convert_latin1_to_utf8.cpp +71 -0
  403. package/deps/simdutf/src/westmere/sse_convert_utf16_to_latin1.cpp +70 -0
  404. package/deps/simdutf/src/westmere/sse_convert_utf16_to_utf32.cpp +206 -0
  405. package/deps/simdutf/src/westmere/sse_convert_utf16_to_utf8.cpp +504 -0
  406. package/deps/simdutf/src/westmere/sse_convert_utf32_to_latin1.cpp +82 -0
  407. package/deps/simdutf/src/westmere/sse_convert_utf32_to_utf16.cpp +209 -0
  408. package/deps/simdutf/src/westmere/sse_convert_utf32_to_utf8.cpp +589 -0
  409. package/deps/simdutf/src/westmere/sse_convert_utf8_to_latin1.cpp +58 -0
  410. package/deps/simdutf/src/westmere/sse_convert_utf8_to_utf16.cpp +197 -0
  411. package/deps/simdutf/src/westmere/sse_convert_utf8_to_utf32.cpp +141 -0
  412. package/deps/simdutf/src/westmere/sse_utf16fix.cpp +82 -0
  413. package/deps/simdutf/src/westmere/sse_validate_utf16.cpp +17 -0
  414. package/jest/index.js +16 -0
  415. package/lib/commonjs/argon2.js +88 -0
  416. package/lib/commonjs/argon2.js.map +1 -0
  417. package/lib/commonjs/blake3.js +99 -0
  418. package/lib/commonjs/blake3.js.map +1 -0
  419. package/lib/commonjs/certificate.js +35 -0
  420. package/lib/commonjs/certificate.js.map +1 -0
  421. package/lib/commonjs/cipher.js +299 -0
  422. package/lib/commonjs/cipher.js.map +1 -0
  423. package/lib/commonjs/constants.js +32 -0
  424. package/lib/commonjs/constants.js.map +1 -0
  425. package/lib/commonjs/dh-groups.js +29 -0
  426. package/lib/commonjs/dh-groups.js.map +1 -0
  427. package/lib/commonjs/dhKeyPair.js +112 -0
  428. package/lib/commonjs/dhKeyPair.js.map +1 -0
  429. package/lib/commonjs/diffie-hellman.js +151 -0
  430. package/lib/commonjs/diffie-hellman.js.map +1 -0
  431. package/lib/commonjs/dsa.js +101 -0
  432. package/lib/commonjs/dsa.js.map +1 -0
  433. package/lib/commonjs/ec.js +370 -0
  434. package/lib/commonjs/ec.js.map +1 -0
  435. package/lib/commonjs/ecdh.js +109 -0
  436. package/lib/commonjs/ecdh.js.map +1 -0
  437. package/lib/commonjs/ed.js +443 -0
  438. package/lib/commonjs/ed.js.map +1 -0
  439. package/lib/commonjs/expo-plugin/@types.js +2 -0
  440. package/lib/commonjs/expo-plugin/@types.js.map +1 -0
  441. package/lib/commonjs/expo-plugin/withRNQC.js +25 -0
  442. package/lib/commonjs/expo-plugin/withRNQC.js.map +1 -0
  443. package/lib/commonjs/expo-plugin/withSodiumAndroid.js +25 -0
  444. package/lib/commonjs/expo-plugin/withSodiumAndroid.js.map +1 -0
  445. package/lib/commonjs/expo-plugin/withSodiumIos.js +23 -0
  446. package/lib/commonjs/expo-plugin/withSodiumIos.js.map +1 -0
  447. package/lib/commonjs/expo-plugin/withXCode.js +109 -0
  448. package/lib/commonjs/expo-plugin/withXCode.js.map +1 -0
  449. package/lib/commonjs/hash.js +291 -0
  450. package/lib/commonjs/hash.js.map +1 -0
  451. package/lib/commonjs/hkdf.js +178 -0
  452. package/lib/commonjs/hkdf.js.map +1 -0
  453. package/lib/commonjs/hmac.js +125 -0
  454. package/lib/commonjs/hmac.js.map +1 -0
  455. package/lib/commonjs/index.js +356 -0
  456. package/lib/commonjs/index.js.map +1 -0
  457. package/lib/commonjs/keys/classes.js +280 -0
  458. package/lib/commonjs/keys/classes.js.map +1 -0
  459. package/lib/commonjs/keys/generateKeyPair.js +237 -0
  460. package/lib/commonjs/keys/generateKeyPair.js.map +1 -0
  461. package/lib/commonjs/keys/index.js +381 -0
  462. package/lib/commonjs/keys/index.js.map +1 -0
  463. package/lib/commonjs/keys/publicCipher.js +171 -0
  464. package/lib/commonjs/keys/publicCipher.js.map +1 -0
  465. package/lib/commonjs/keys/signVerify.js +227 -0
  466. package/lib/commonjs/keys/signVerify.js.map +1 -0
  467. package/lib/commonjs/keys/utils.js +181 -0
  468. package/lib/commonjs/keys/utils.js.map +1 -0
  469. package/lib/commonjs/mldsa.js +69 -0
  470. package/lib/commonjs/mldsa.js.map +1 -0
  471. package/lib/commonjs/mlkem.js +219 -0
  472. package/lib/commonjs/mlkem.js.map +1 -0
  473. package/lib/commonjs/native-nitro-bridge.js +344 -0
  474. package/lib/commonjs/nitro-node-shim.js +23 -0
  475. package/lib/commonjs/package.json +1 -0
  476. package/lib/commonjs/pbkdf2.js +106 -0
  477. package/lib/commonjs/pbkdf2.js.map +1 -0
  478. package/lib/commonjs/prime.js +84 -0
  479. package/lib/commonjs/prime.js.map +1 -0
  480. package/lib/commonjs/random.js +296 -0
  481. package/lib/commonjs/random.js.map +1 -0
  482. package/lib/commonjs/rsa.js +213 -0
  483. package/lib/commonjs/rsa.js.map +1 -0
  484. package/lib/commonjs/scrypt.js +139 -0
  485. package/lib/commonjs/scrypt.js.map +1 -0
  486. package/lib/commonjs/slhdsa.js +70 -0
  487. package/lib/commonjs/slhdsa.js.map +1 -0
  488. package/lib/commonjs/specs/argon2.nitro.js +6 -0
  489. package/lib/commonjs/specs/argon2.nitro.js.map +1 -0
  490. package/lib/commonjs/specs/blake3.nitro.js +6 -0
  491. package/lib/commonjs/specs/blake3.nitro.js.map +1 -0
  492. package/lib/commonjs/specs/certificate.nitro.js +6 -0
  493. package/lib/commonjs/specs/certificate.nitro.js.map +1 -0
  494. package/lib/commonjs/specs/cipher.nitro.js +6 -0
  495. package/lib/commonjs/specs/cipher.nitro.js.map +1 -0
  496. package/lib/commonjs/specs/dhKeyPair.nitro.js +6 -0
  497. package/lib/commonjs/specs/dhKeyPair.nitro.js.map +1 -0
  498. package/lib/commonjs/specs/diffie-hellman.nitro.js +6 -0
  499. package/lib/commonjs/specs/diffie-hellman.nitro.js.map +1 -0
  500. package/lib/commonjs/specs/dsaKeyPair.nitro.js +6 -0
  501. package/lib/commonjs/specs/dsaKeyPair.nitro.js.map +1 -0
  502. package/lib/commonjs/specs/ecKeyPair.nitro.js +6 -0
  503. package/lib/commonjs/specs/ecKeyPair.nitro.js.map +1 -0
  504. package/lib/commonjs/specs/ecdh.nitro.js +6 -0
  505. package/lib/commonjs/specs/ecdh.nitro.js.map +1 -0
  506. package/lib/commonjs/specs/edKeyPair.nitro.js +6 -0
  507. package/lib/commonjs/specs/edKeyPair.nitro.js.map +1 -0
  508. package/lib/commonjs/specs/hash.nitro.js +6 -0
  509. package/lib/commonjs/specs/hash.nitro.js.map +1 -0
  510. package/lib/commonjs/specs/hkdf.nitro.js +6 -0
  511. package/lib/commonjs/specs/hkdf.nitro.js.map +1 -0
  512. package/lib/commonjs/specs/hmac.nitro.js +6 -0
  513. package/lib/commonjs/specs/hmac.nitro.js.map +1 -0
  514. package/lib/commonjs/specs/keyObjectHandle.nitro.js +6 -0
  515. package/lib/commonjs/specs/keyObjectHandle.nitro.js.map +1 -0
  516. package/lib/commonjs/specs/kmac.nitro.js +6 -0
  517. package/lib/commonjs/specs/kmac.nitro.js.map +1 -0
  518. package/lib/commonjs/specs/mlDsaKeyPair.nitro.js +6 -0
  519. package/lib/commonjs/specs/mlDsaKeyPair.nitro.js.map +1 -0
  520. package/lib/commonjs/specs/mlKemKeyPair.nitro.js +6 -0
  521. package/lib/commonjs/specs/mlKemKeyPair.nitro.js.map +1 -0
  522. package/lib/commonjs/specs/pbkdf2.nitro.js +6 -0
  523. package/lib/commonjs/specs/pbkdf2.nitro.js.map +1 -0
  524. package/lib/commonjs/specs/prime.nitro.js +6 -0
  525. package/lib/commonjs/specs/prime.nitro.js.map +1 -0
  526. package/lib/commonjs/specs/random.nitro.js +6 -0
  527. package/lib/commonjs/specs/random.nitro.js.map +1 -0
  528. package/lib/commonjs/specs/rsaCipher.nitro.js +6 -0
  529. package/lib/commonjs/specs/rsaCipher.nitro.js.map +1 -0
  530. package/lib/commonjs/specs/rsaKeyPair.nitro.js +6 -0
  531. package/lib/commonjs/specs/rsaKeyPair.nitro.js.map +1 -0
  532. package/lib/commonjs/specs/scrypt.nitro.js +6 -0
  533. package/lib/commonjs/specs/scrypt.nitro.js.map +1 -0
  534. package/lib/commonjs/specs/sign.nitro.js +6 -0
  535. package/lib/commonjs/specs/sign.nitro.js.map +1 -0
  536. package/lib/commonjs/specs/slhDsaKeyPair.nitro.js +6 -0
  537. package/lib/commonjs/specs/slhDsaKeyPair.nitro.js.map +1 -0
  538. package/lib/commonjs/specs/turboshake.nitro.js +6 -0
  539. package/lib/commonjs/specs/turboshake.nitro.js.map +1 -0
  540. package/lib/commonjs/specs/utils.nitro.js +6 -0
  541. package/lib/commonjs/specs/utils.nitro.js.map +1 -0
  542. package/lib/commonjs/specs/x509certificate.nitro.js +6 -0
  543. package/lib/commonjs/specs/x509certificate.nitro.js.map +1 -0
  544. package/lib/commonjs/subtle.js +3211 -0
  545. package/lib/commonjs/subtle.js.map +1 -0
  546. package/lib/commonjs/utils/cipher.js +75 -0
  547. package/lib/commonjs/utils/cipher.js.map +1 -0
  548. package/lib/commonjs/utils/conversion.js +249 -0
  549. package/lib/commonjs/utils/conversion.js.map +1 -0
  550. package/lib/commonjs/utils/errors.js +73 -0
  551. package/lib/commonjs/utils/errors.js.map +1 -0
  552. package/lib/commonjs/utils/hashnames.js +122 -0
  553. package/lib/commonjs/utils/hashnames.js.map +1 -0
  554. package/lib/commonjs/utils/index.js +83 -0
  555. package/lib/commonjs/utils/index.js.map +1 -0
  556. package/lib/commonjs/utils/noble.js +82 -0
  557. package/lib/commonjs/utils/noble.js.map +1 -0
  558. package/lib/commonjs/utils/timingSafeEqual.js +29 -0
  559. package/lib/commonjs/utils/timingSafeEqual.js.map +1 -0
  560. package/lib/commonjs/utils/types.js +55 -0
  561. package/lib/commonjs/utils/types.js.map +1 -0
  562. package/lib/commonjs/utils/validation.js +144 -0
  563. package/lib/commonjs/utils/validation.js.map +1 -0
  564. package/lib/commonjs/x509certificate.js +189 -0
  565. package/lib/commonjs/x509certificate.js.map +1 -0
  566. package/lib/module/argon2.js +83 -0
  567. package/lib/module/argon2.js.map +1 -0
  568. package/lib/module/blake3.js +91 -0
  569. package/lib/module/blake3.js.map +1 -0
  570. package/lib/module/certificate.js +30 -0
  571. package/lib/module/certificate.js.map +1 -0
  572. package/lib/module/cipher.js +291 -0
  573. package/lib/module/cipher.js.map +1 -0
  574. package/lib/module/constants.js +28 -0
  575. package/lib/module/constants.js.map +1 -0
  576. package/lib/module/dh-groups.js +25 -0
  577. package/lib/module/dh-groups.js.map +1 -0
  578. package/lib/module/dhKeyPair.js +105 -0
  579. package/lib/module/dhKeyPair.js.map +1 -0
  580. package/lib/module/diffie-hellman.js +145 -0
  581. package/lib/module/diffie-hellman.js.map +1 -0
  582. package/lib/module/dsa.js +94 -0
  583. package/lib/module/dsa.js.map +1 -0
  584. package/lib/module/ec.js +358 -0
  585. package/lib/module/ec.js.map +1 -0
  586. package/lib/module/ecdh.js +103 -0
  587. package/lib/module/ecdh.js.map +1 -0
  588. package/lib/module/ed.js +433 -0
  589. package/lib/module/ed.js.map +1 -0
  590. package/lib/module/expo-plugin/@types.js +2 -0
  591. package/lib/module/expo-plugin/@types.js.map +1 -0
  592. package/lib/module/expo-plugin/withRNQC.js +21 -0
  593. package/lib/module/expo-plugin/withRNQC.js.map +1 -0
  594. package/lib/module/expo-plugin/withSodiumAndroid.js +20 -0
  595. package/lib/module/expo-plugin/withSodiumAndroid.js.map +1 -0
  596. package/lib/module/expo-plugin/withSodiumIos.js +17 -0
  597. package/lib/module/expo-plugin/withSodiumIos.js.map +1 -0
  598. package/lib/module/expo-plugin/withXCode.js +101 -0
  599. package/lib/module/expo-plugin/withXCode.js.map +1 -0
  600. package/lib/module/hash.js +282 -0
  601. package/lib/module/hash.js.map +1 -0
  602. package/lib/module/hkdf.js +168 -0
  603. package/lib/module/hkdf.js.map +1 -0
  604. package/lib/module/hmac.js +120 -0
  605. package/lib/module/hmac.js.map +1 -0
  606. package/lib/module/index.js +115 -0
  607. package/lib/module/index.js.map +1 -0
  608. package/lib/module/keys/classes.js +271 -0
  609. package/lib/module/keys/classes.js.map +1 -0
  610. package/lib/module/keys/generateKeyPair.js +231 -0
  611. package/lib/module/keys/generateKeyPair.js.map +1 -0
  612. package/lib/module/keys/index.js +246 -0
  613. package/lib/module/keys/index.js.map +1 -0
  614. package/lib/module/keys/publicCipher.js +164 -0
  615. package/lib/module/keys/publicCipher.js.map +1 -0
  616. package/lib/module/keys/signVerify.js +217 -0
  617. package/lib/module/keys/signVerify.js.map +1 -0
  618. package/lib/module/keys/utils.js +170 -0
  619. package/lib/module/keys/utils.js.map +1 -0
  620. package/lib/module/mldsa.js +63 -0
  621. package/lib/module/mldsa.js.map +1 -0
  622. package/lib/module/mlkem.js +211 -0
  623. package/lib/module/mlkem.js.map +1 -0
  624. package/lib/module/pbkdf2.js +100 -0
  625. package/lib/module/pbkdf2.js.map +1 -0
  626. package/lib/module/prime.js +77 -0
  627. package/lib/module/prime.js.map +1 -0
  628. package/lib/module/random.js +284 -0
  629. package/lib/module/random.js.map +1 -0
  630. package/lib/module/rsa.js +205 -0
  631. package/lib/module/rsa.js.map +1 -0
  632. package/lib/module/scrypt.js +134 -0
  633. package/lib/module/scrypt.js.map +1 -0
  634. package/lib/module/slhdsa.js +64 -0
  635. package/lib/module/slhdsa.js.map +1 -0
  636. package/lib/module/specs/argon2.nitro.js +4 -0
  637. package/lib/module/specs/argon2.nitro.js.map +1 -0
  638. package/lib/module/specs/blake3.nitro.js +4 -0
  639. package/lib/module/specs/blake3.nitro.js.map +1 -0
  640. package/lib/module/specs/certificate.nitro.js +4 -0
  641. package/lib/module/specs/certificate.nitro.js.map +1 -0
  642. package/lib/module/specs/cipher.nitro.js +4 -0
  643. package/lib/module/specs/cipher.nitro.js.map +1 -0
  644. package/lib/module/specs/dhKeyPair.nitro.js +4 -0
  645. package/lib/module/specs/dhKeyPair.nitro.js.map +1 -0
  646. package/lib/module/specs/diffie-hellman.nitro.js +4 -0
  647. package/lib/module/specs/diffie-hellman.nitro.js.map +1 -0
  648. package/lib/module/specs/dsaKeyPair.nitro.js +4 -0
  649. package/lib/module/specs/dsaKeyPair.nitro.js.map +1 -0
  650. package/lib/module/specs/ecKeyPair.nitro.js +4 -0
  651. package/lib/module/specs/ecKeyPair.nitro.js.map +1 -0
  652. package/lib/module/specs/ecdh.nitro.js +4 -0
  653. package/lib/module/specs/ecdh.nitro.js.map +1 -0
  654. package/lib/module/specs/edKeyPair.nitro.js +4 -0
  655. package/lib/module/specs/edKeyPair.nitro.js.map +1 -0
  656. package/lib/module/specs/hash.nitro.js +4 -0
  657. package/lib/module/specs/hash.nitro.js.map +1 -0
  658. package/lib/module/specs/hkdf.nitro.js +4 -0
  659. package/lib/module/specs/hkdf.nitro.js.map +1 -0
  660. package/lib/module/specs/hmac.nitro.js +4 -0
  661. package/lib/module/specs/hmac.nitro.js.map +1 -0
  662. package/lib/module/specs/keyObjectHandle.nitro.js +4 -0
  663. package/lib/module/specs/keyObjectHandle.nitro.js.map +1 -0
  664. package/lib/module/specs/kmac.nitro.js +4 -0
  665. package/lib/module/specs/kmac.nitro.js.map +1 -0
  666. package/lib/module/specs/mlDsaKeyPair.nitro.js +4 -0
  667. package/lib/module/specs/mlDsaKeyPair.nitro.js.map +1 -0
  668. package/lib/module/specs/mlKemKeyPair.nitro.js +4 -0
  669. package/lib/module/specs/mlKemKeyPair.nitro.js.map +1 -0
  670. package/lib/module/specs/pbkdf2.nitro.js +4 -0
  671. package/lib/module/specs/pbkdf2.nitro.js.map +1 -0
  672. package/lib/module/specs/prime.nitro.js +4 -0
  673. package/lib/module/specs/prime.nitro.js.map +1 -0
  674. package/lib/module/specs/random.nitro.js +4 -0
  675. package/lib/module/specs/random.nitro.js.map +1 -0
  676. package/lib/module/specs/rsaCipher.nitro.js +4 -0
  677. package/lib/module/specs/rsaCipher.nitro.js.map +1 -0
  678. package/lib/module/specs/rsaKeyPair.nitro.js +4 -0
  679. package/lib/module/specs/rsaKeyPair.nitro.js.map +1 -0
  680. package/lib/module/specs/scrypt.nitro.js +4 -0
  681. package/lib/module/specs/scrypt.nitro.js.map +1 -0
  682. package/lib/module/specs/sign.nitro.js +4 -0
  683. package/lib/module/specs/sign.nitro.js.map +1 -0
  684. package/lib/module/specs/slhDsaKeyPair.nitro.js +4 -0
  685. package/lib/module/specs/slhDsaKeyPair.nitro.js.map +1 -0
  686. package/lib/module/specs/turboshake.nitro.js +4 -0
  687. package/lib/module/specs/turboshake.nitro.js.map +1 -0
  688. package/lib/module/specs/utils.nitro.js +4 -0
  689. package/lib/module/specs/utils.nitro.js.map +1 -0
  690. package/lib/module/specs/x509certificate.nitro.js +4 -0
  691. package/lib/module/specs/x509certificate.nitro.js.map +1 -0
  692. package/lib/module/subtle.js +3205 -0
  693. package/lib/module/subtle.js.map +1 -0
  694. package/lib/module/utils/cipher.js +67 -0
  695. package/lib/module/utils/cipher.js.map +1 -0
  696. package/lib/module/utils/conversion.js +205 -0
  697. package/lib/module/utils/conversion.js.map +1 -0
  698. package/lib/module/utils/errors.js +67 -0
  699. package/lib/module/utils/errors.js.map +1 -0
  700. package/lib/module/utils/hashnames.js +120 -0
  701. package/lib/module/utils/hashnames.js.map +1 -0
  702. package/lib/module/utils/index.js +10 -0
  703. package/lib/module/utils/index.js.map +1 -0
  704. package/lib/module/utils/noble.js +76 -0
  705. package/lib/module/utils/noble.js.map +1 -0
  706. package/lib/module/utils/timingSafeEqual.js +25 -0
  707. package/lib/module/utils/timingSafeEqual.js.map +1 -0
  708. package/lib/module/utils/types.js +57 -0
  709. package/lib/module/utils/types.js.map +1 -0
  710. package/lib/module/utils/validation.js +131 -0
  711. package/lib/module/utils/validation.js.map +1 -0
  712. package/lib/module/x509certificate.js +184 -0
  713. package/lib/module/x509certificate.js.map +1 -0
  714. package/lib/typescript/argon2.d.ts +16 -0
  715. package/lib/typescript/argon2.d.ts.map +1 -0
  716. package/lib/typescript/blake3.d.ts +33 -0
  717. package/lib/typescript/blake3.d.ts.map +1 -0
  718. package/lib/typescript/certificate.d.ts +8 -0
  719. package/lib/typescript/certificate.d.ts.map +1 -0
  720. package/lib/typescript/cipher.d.ts +75 -0
  721. package/lib/typescript/cipher.d.ts.map +1 -0
  722. package/lib/typescript/constants.d.ts +21 -0
  723. package/lib/typescript/constants.d.ts.map +1 -0
  724. package/lib/typescript/dh-groups.d.ts +5 -0
  725. package/lib/typescript/dh-groups.d.ts.map +1 -0
  726. package/lib/typescript/dhKeyPair.d.ts +19 -0
  727. package/lib/typescript/dhKeyPair.d.ts.map +1 -0
  728. package/lib/typescript/diffie-hellman.d.ts +18 -0
  729. package/lib/typescript/diffie-hellman.d.ts.map +1 -0
  730. package/lib/typescript/dsa.d.ts +19 -0
  731. package/lib/typescript/dsa.d.ts.map +1 -0
  732. package/lib/typescript/ec.d.ts +24 -0
  733. package/lib/typescript/ec.d.ts.map +1 -0
  734. package/lib/typescript/ecdh.d.ts +19 -0
  735. package/lib/typescript/ecdh.d.ts.map +1 -0
  736. package/lib/typescript/ed.d.ts +47 -0
  737. package/lib/typescript/ed.d.ts.map +1 -0
  738. package/lib/typescript/expo-plugin/@types.d.ts +8 -0
  739. package/lib/typescript/expo-plugin/@types.d.ts.map +1 -0
  740. package/lib/typescript/expo-plugin/withRNQC.d.ts +4 -0
  741. package/lib/typescript/expo-plugin/withRNQC.d.ts.map +1 -0
  742. package/lib/typescript/expo-plugin/withSodiumAndroid.d.ts +4 -0
  743. package/lib/typescript/expo-plugin/withSodiumAndroid.d.ts.map +1 -0
  744. package/lib/typescript/expo-plugin/withSodiumIos.d.ts +4 -0
  745. package/lib/typescript/expo-plugin/withSodiumIos.d.ts.map +1 -0
  746. package/lib/typescript/expo-plugin/withXCode.d.ts +23 -0
  747. package/lib/typescript/expo-plugin/withXCode.d.ts.map +1 -0
  748. package/lib/typescript/hash.d.ts +126 -0
  749. package/lib/typescript/hash.d.ts.map +1 -0
  750. package/lib/typescript/hkdf.d.ts +26 -0
  751. package/lib/typescript/hkdf.d.ts.map +1 -0
  752. package/lib/typescript/hmac.d.ts +66 -0
  753. package/lib/typescript/hmac.d.ts.map +1 -0
  754. package/lib/typescript/index.d.ts +240 -0
  755. package/lib/typescript/index.d.ts.map +1 -0
  756. package/lib/typescript/keys/classes.d.ts +95 -0
  757. package/lib/typescript/keys/classes.d.ts.map +1 -0
  758. package/lib/typescript/keys/generateKeyPair.d.ts +17 -0
  759. package/lib/typescript/keys/generateKeyPair.d.ts.map +1 -0
  760. package/lib/typescript/keys/index.d.ts +26 -0
  761. package/lib/typescript/keys/index.d.ts.map +1 -0
  762. package/lib/typescript/keys/publicCipher.d.ts +23 -0
  763. package/lib/typescript/keys/publicCipher.d.ts.map +1 -0
  764. package/lib/typescript/keys/signVerify.d.ts +35 -0
  765. package/lib/typescript/keys/signVerify.d.ts.map +1 -0
  766. package/lib/typescript/keys/utils.d.ts +51 -0
  767. package/lib/typescript/keys/utils.d.ts.map +1 -0
  768. package/lib/typescript/mldsa.d.ts +18 -0
  769. package/lib/typescript/mldsa.d.ts.map +1 -0
  770. package/lib/typescript/mlkem.d.ts +30 -0
  771. package/lib/typescript/mlkem.d.ts.map +1 -0
  772. package/lib/typescript/pbkdf2.d.ts +12 -0
  773. package/lib/typescript/pbkdf2.d.ts.map +1 -0
  774. package/lib/typescript/prime.d.ts +19 -0
  775. package/lib/typescript/prime.d.ts.map +1 -0
  776. package/lib/typescript/random.d.ts +31 -0
  777. package/lib/typescript/random.d.ts.map +1 -0
  778. package/lib/typescript/rsa.d.ts +20 -0
  779. package/lib/typescript/rsa.d.ts.map +1 -0
  780. package/lib/typescript/scrypt.d.ts +18 -0
  781. package/lib/typescript/scrypt.d.ts.map +1 -0
  782. package/lib/typescript/slhdsa.d.ts +19 -0
  783. package/lib/typescript/slhdsa.d.ts.map +1 -0
  784. package/lib/typescript/specs/argon2.nitro.d.ts +9 -0
  785. package/lib/typescript/specs/argon2.nitro.d.ts.map +1 -0
  786. package/lib/typescript/specs/blake3.nitro.d.ts +15 -0
  787. package/lib/typescript/specs/blake3.nitro.d.ts.map +1 -0
  788. package/lib/typescript/specs/certificate.nitro.d.ts +10 -0
  789. package/lib/typescript/specs/certificate.nitro.d.ts.map +1 -0
  790. package/lib/typescript/specs/cipher.nitro.d.ts +38 -0
  791. package/lib/typescript/specs/cipher.nitro.d.ts.map +1 -0
  792. package/lib/typescript/specs/dhKeyPair.nitro.d.ts +14 -0
  793. package/lib/typescript/specs/dhKeyPair.nitro.d.ts.map +1 -0
  794. package/lib/typescript/specs/diffie-hellman.nitro.d.ts +18 -0
  795. package/lib/typescript/specs/diffie-hellman.nitro.d.ts.map +1 -0
  796. package/lib/typescript/specs/dsaKeyPair.nitro.d.ts +13 -0
  797. package/lib/typescript/specs/dsaKeyPair.nitro.d.ts.map +1 -0
  798. package/lib/typescript/specs/ecKeyPair.nitro.d.ts +21 -0
  799. package/lib/typescript/specs/ecKeyPair.nitro.d.ts.map +1 -0
  800. package/lib/typescript/specs/ecdh.nitro.d.ts +15 -0
  801. package/lib/typescript/specs/ecdh.nitro.d.ts.map +1 -0
  802. package/lib/typescript/specs/edKeyPair.nitro.d.ts +17 -0
  803. package/lib/typescript/specs/edKeyPair.nitro.d.ts.map +1 -0
  804. package/lib/typescript/specs/hash.nitro.d.ts +13 -0
  805. package/lib/typescript/specs/hash.nitro.d.ts.map +1 -0
  806. package/lib/typescript/specs/hkdf.nitro.d.ts +10 -0
  807. package/lib/typescript/specs/hkdf.nitro.d.ts.map +1 -0
  808. package/lib/typescript/specs/hmac.nitro.d.ts +10 -0
  809. package/lib/typescript/specs/hmac.nitro.d.ts.map +1 -0
  810. package/lib/typescript/specs/keyObjectHandle.nitro.d.ts +27 -0
  811. package/lib/typescript/specs/keyObjectHandle.nitro.d.ts.map +1 -0
  812. package/lib/typescript/specs/kmac.nitro.d.ts +10 -0
  813. package/lib/typescript/specs/kmac.nitro.d.ts.map +1 -0
  814. package/lib/typescript/specs/mlDsaKeyPair.nitro.d.ts +16 -0
  815. package/lib/typescript/specs/mlDsaKeyPair.nitro.d.ts.map +1 -0
  816. package/lib/typescript/specs/mlKemKeyPair.nitro.d.ts +18 -0
  817. package/lib/typescript/specs/mlKemKeyPair.nitro.d.ts.map +1 -0
  818. package/lib/typescript/specs/pbkdf2.nitro.d.ts +9 -0
  819. package/lib/typescript/specs/pbkdf2.nitro.d.ts.map +1 -0
  820. package/lib/typescript/specs/prime.nitro.d.ts +11 -0
  821. package/lib/typescript/specs/prime.nitro.d.ts.map +1 -0
  822. package/lib/typescript/specs/random.nitro.d.ts +9 -0
  823. package/lib/typescript/specs/random.nitro.d.ts.map +1 -0
  824. package/lib/typescript/specs/rsaCipher.nitro.d.ts +54 -0
  825. package/lib/typescript/specs/rsaCipher.nitro.d.ts.map +1 -0
  826. package/lib/typescript/specs/rsaKeyPair.nitro.d.ts +20 -0
  827. package/lib/typescript/specs/rsaKeyPair.nitro.d.ts.map +1 -0
  828. package/lib/typescript/specs/scrypt.nitro.d.ts +9 -0
  829. package/lib/typescript/specs/scrypt.nitro.d.ts.map +1 -0
  830. package/lib/typescript/specs/sign.nitro.d.ts +19 -0
  831. package/lib/typescript/specs/sign.nitro.d.ts.map +1 -0
  832. package/lib/typescript/specs/slhDsaKeyPair.nitro.d.ts +16 -0
  833. package/lib/typescript/specs/slhDsaKeyPair.nitro.d.ts.map +1 -0
  834. package/lib/typescript/specs/turboshake.nitro.d.ts +11 -0
  835. package/lib/typescript/specs/turboshake.nitro.d.ts.map +1 -0
  836. package/lib/typescript/specs/utils.nitro.d.ts +8 -0
  837. package/lib/typescript/specs/utils.nitro.d.ts.map +1 -0
  838. package/lib/typescript/specs/x509certificate.nitro.d.ts +34 -0
  839. package/lib/typescript/specs/x509certificate.nitro.d.ts.map +1 -0
  840. package/lib/typescript/subtle.d.ts +33 -0
  841. package/lib/typescript/subtle.d.ts.map +1 -0
  842. package/lib/typescript/utils/cipher.d.ts +19 -0
  843. package/lib/typescript/utils/cipher.d.ts.map +1 -0
  844. package/lib/typescript/utils/conversion.d.ts +36 -0
  845. package/lib/typescript/utils/conversion.d.ts.map +1 -0
  846. package/lib/typescript/utils/errors.d.ts +19 -0
  847. package/lib/typescript/utils/errors.d.ts.map +1 -0
  848. package/lib/typescript/utils/hashnames.d.ts +13 -0
  849. package/lib/typescript/utils/hashnames.d.ts.map +1 -0
  850. package/lib/typescript/utils/index.d.ts +8 -0
  851. package/lib/typescript/utils/index.d.ts.map +1 -0
  852. package/lib/typescript/utils/noble.d.ts +19 -0
  853. package/lib/typescript/utils/noble.d.ts.map +1 -0
  854. package/lib/typescript/utils/timingSafeEqual.d.ts +3 -0
  855. package/lib/typescript/utils/timingSafeEqual.d.ts.map +1 -0
  856. package/lib/typescript/utils/types.d.ts +314 -0
  857. package/lib/typescript/utils/types.d.ts.map +1 -0
  858. package/lib/typescript/utils/validation.d.ts +15 -0
  859. package/lib/typescript/utils/validation.d.ts.map +1 -0
  860. package/lib/typescript/x509certificate.d.ts +64 -0
  861. package/lib/typescript/x509certificate.d.ts.map +1 -0
  862. package/nitrogen/generated/.gitattributes +1 -0
  863. package/nitrogen/generated/android/QuickCrypto+autolinking.cmake +110 -0
  864. package/nitrogen/generated/android/QuickCrypto+autolinking.gradle +27 -0
  865. package/nitrogen/generated/android/QuickCryptoOnLoad.cpp +334 -0
  866. package/nitrogen/generated/android/QuickCryptoOnLoad.hpp +25 -0
  867. package/nitrogen/generated/android/kotlin/com/margelo/nitro/crypto/QuickCryptoOnLoad.kt +35 -0
  868. package/nitrogen/generated/ios/QuickCrypto+autolinking.rb +60 -0
  869. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.cpp +17 -0
  870. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Bridge.hpp +27 -0
  871. package/nitrogen/generated/ios/QuickCrypto-Swift-Cxx-Umbrella.hpp +38 -0
  872. package/nitrogen/generated/ios/QuickCryptoAutolinking.mm +325 -0
  873. package/nitrogen/generated/ios/QuickCryptoAutolinking.swift +16 -0
  874. package/nitrogen/generated/shared/c++/AsymmetricKeyType.hpp +176 -0
  875. package/nitrogen/generated/shared/c++/CipherArgs.hpp +101 -0
  876. package/nitrogen/generated/shared/c++/CipherInfo.hpp +104 -0
  877. package/nitrogen/generated/shared/c++/HkdfMode.hpp +80 -0
  878. package/nitrogen/generated/shared/c++/HybridArgon2Spec.cpp +22 -0
  879. package/nitrogen/generated/shared/c++/HybridArgon2Spec.hpp +66 -0
  880. package/nitrogen/generated/shared/c++/HybridBlake3Spec.cpp +28 -0
  881. package/nitrogen/generated/shared/c++/HybridBlake3Spec.hpp +74 -0
  882. package/nitrogen/generated/shared/c++/HybridCertificateSpec.cpp +23 -0
  883. package/nitrogen/generated/shared/c++/HybridCertificateSpec.hpp +64 -0
  884. package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.cpp +21 -0
  885. package/nitrogen/generated/shared/c++/HybridCipherFactorySpec.hpp +67 -0
  886. package/nitrogen/generated/shared/c++/HybridCipherSpec.cpp +29 -0
  887. package/nitrogen/generated/shared/c++/HybridCipherSpec.hpp +78 -0
  888. package/nitrogen/generated/shared/c++/HybridDhKeyPairSpec.cpp +27 -0
  889. package/nitrogen/generated/shared/c++/HybridDhKeyPairSpec.hpp +69 -0
  890. package/nitrogen/generated/shared/c++/HybridDiffieHellmanSpec.cpp +31 -0
  891. package/nitrogen/generated/shared/c++/HybridDiffieHellmanSpec.hpp +72 -0
  892. package/nitrogen/generated/shared/c++/HybridDsaKeyPairSpec.cpp +26 -0
  893. package/nitrogen/generated/shared/c++/HybridDsaKeyPairSpec.hpp +68 -0
  894. package/nitrogen/generated/shared/c++/HybridECDHSpec.cpp +28 -0
  895. package/nitrogen/generated/shared/c++/HybridECDHSpec.hpp +70 -0
  896. package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.cpp +30 -0
  897. package/nitrogen/generated/shared/c++/HybridEcKeyPairSpec.hpp +76 -0
  898. package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.cpp +30 -0
  899. package/nitrogen/generated/shared/c++/HybridEdKeyPairSpec.hpp +74 -0
  900. package/nitrogen/generated/shared/c++/HybridHashSpec.cpp +26 -0
  901. package/nitrogen/generated/shared/c++/HybridHashSpec.hpp +74 -0
  902. package/nitrogen/generated/shared/c++/HybridHkdfSpec.cpp +22 -0
  903. package/nitrogen/generated/shared/c++/HybridHkdfSpec.hpp +67 -0
  904. package/nitrogen/generated/shared/c++/HybridHmacSpec.cpp +23 -0
  905. package/nitrogen/generated/shared/c++/HybridHmacSpec.hpp +66 -0
  906. package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.cpp +39 -0
  907. package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.hpp +107 -0
  908. package/nitrogen/generated/shared/c++/HybridKmacSpec.cpp +23 -0
  909. package/nitrogen/generated/shared/c++/HybridKmacSpec.hpp +66 -0
  910. package/nitrogen/generated/shared/c++/HybridMlDsaKeyPairSpec.cpp +29 -0
  911. package/nitrogen/generated/shared/c++/HybridMlDsaKeyPairSpec.hpp +72 -0
  912. package/nitrogen/generated/shared/c++/HybridMlKemKeyPairSpec.cpp +31 -0
  913. package/nitrogen/generated/shared/c++/HybridMlKemKeyPairSpec.hpp +74 -0
  914. package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.cpp +22 -0
  915. package/nitrogen/generated/shared/c++/HybridPbkdf2Spec.hpp +65 -0
  916. package/nitrogen/generated/shared/c++/HybridPrimeSpec.cpp +24 -0
  917. package/nitrogen/generated/shared/c++/HybridPrimeSpec.hpp +67 -0
  918. package/nitrogen/generated/shared/c++/HybridRandomSpec.cpp +22 -0
  919. package/nitrogen/generated/shared/c++/HybridRandomSpec.hpp +64 -0
  920. package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.cpp +25 -0
  921. package/nitrogen/generated/shared/c++/HybridRsaCipherSpec.hpp +71 -0
  922. package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.cpp +29 -0
  923. package/nitrogen/generated/shared/c++/HybridRsaKeyPairSpec.hpp +75 -0
  924. package/nitrogen/generated/shared/c++/HybridScryptSpec.cpp +22 -0
  925. package/nitrogen/generated/shared/c++/HybridScryptSpec.hpp +64 -0
  926. package/nitrogen/generated/shared/c++/HybridSignHandleSpec.cpp +23 -0
  927. package/nitrogen/generated/shared/c++/HybridSignHandleSpec.hpp +69 -0
  928. package/nitrogen/generated/shared/c++/HybridSlhDsaKeyPairSpec.cpp +29 -0
  929. package/nitrogen/generated/shared/c++/HybridSlhDsaKeyPairSpec.hpp +72 -0
  930. package/nitrogen/generated/shared/c++/HybridTurboShakeSpec.cpp +22 -0
  931. package/nitrogen/generated/shared/c++/HybridTurboShakeSpec.hpp +70 -0
  932. package/nitrogen/generated/shared/c++/HybridUtilsSpec.cpp +21 -0
  933. package/nitrogen/generated/shared/c++/HybridUtilsSpec.hpp +62 -0
  934. package/nitrogen/generated/shared/c++/HybridVerifyHandleSpec.cpp +23 -0
  935. package/nitrogen/generated/shared/c++/HybridVerifyHandleSpec.hpp +69 -0
  936. package/nitrogen/generated/shared/c++/HybridX509CertificateHandleSpec.cpp +46 -0
  937. package/nitrogen/generated/shared/c++/HybridX509CertificateHandleSpec.hpp +96 -0
  938. package/nitrogen/generated/shared/c++/JWK.hpp +185 -0
  939. package/nitrogen/generated/shared/c++/JWKkty.hpp +92 -0
  940. package/nitrogen/generated/shared/c++/JWKuse.hpp +76 -0
  941. package/nitrogen/generated/shared/c++/KFormatType.hpp +63 -0
  942. package/nitrogen/generated/shared/c++/KangarooTwelveVariant.hpp +76 -0
  943. package/nitrogen/generated/shared/c++/KeyDetail.hpp +108 -0
  944. package/nitrogen/generated/shared/c++/KeyEncoding.hpp +64 -0
  945. package/nitrogen/generated/shared/c++/KeyObject.hpp +83 -0
  946. package/nitrogen/generated/shared/c++/KeyType.hpp +63 -0
  947. package/nitrogen/generated/shared/c++/KeyUsage.hpp +116 -0
  948. package/nitrogen/generated/shared/c++/NamedCurve.hpp +80 -0
  949. package/nitrogen/generated/shared/c++/TurboShakeVariant.hpp +76 -0
  950. package/ohos/binding.gyp +33 -0
  951. package/ohos/build/Release/quick_crypto.node +0 -0
  952. package/ohos/quick_crypto_napi.cpp +1316 -0
  953. package/package.json +158 -4
  954. package/src/argon2.ts +161 -0
  955. package/src/blake3.ts +124 -0
  956. package/src/certificate.ts +41 -0
  957. package/src/cipher.ts +497 -0
  958. package/src/constants.ts +32 -0
  959. package/src/dh-groups.ts +27 -0
  960. package/src/dhKeyPair.ts +164 -0
  961. package/src/diffie-hellman.ts +195 -0
  962. package/src/dsa.ts +146 -0
  963. package/src/ec.ts +580 -0
  964. package/src/ecdh.ts +132 -0
  965. package/src/ed.ts +605 -0
  966. package/src/expo-plugin/@types.ts +7 -0
  967. package/src/expo-plugin/withRNQC.ts +23 -0
  968. package/src/expo-plugin/withSodiumAndroid.ts +24 -0
  969. package/src/expo-plugin/withSodiumIos.ts +25 -0
  970. package/src/expo-plugin/withXCode.ts +134 -0
  971. package/src/hash.ts +433 -0
  972. package/src/hkdf.ts +327 -0
  973. package/src/hmac.ts +150 -0
  974. package/src/index.ts +126 -0
  975. package/src/keys/classes.ts +369 -0
  976. package/src/keys/generateKeyPair.ts +358 -0
  977. package/src/keys/index.ts +383 -0
  978. package/src/keys/publicCipher.ts +256 -0
  979. package/src/keys/signVerify.ts +329 -0
  980. package/src/keys/utils.ts +263 -0
  981. package/src/mldsa.ts +125 -0
  982. package/src/mlkem.ts +350 -0
  983. package/src/pbkdf2.ts +183 -0
  984. package/src/prime.ts +134 -0
  985. package/src/random.ts +427 -0
  986. package/src/rsa.ts +333 -0
  987. package/src/scrypt.ts +201 -0
  988. package/src/slhdsa.ts +146 -0
  989. package/src/specs/argon2.nitro.ts +29 -0
  990. package/src/specs/blake3.nitro.ts +12 -0
  991. package/src/specs/certificate.nitro.ts +8 -0
  992. package/src/specs/cipher.nitro.ts +39 -0
  993. package/src/specs/dhKeyPair.nitro.ts +14 -0
  994. package/src/specs/diffie-hellman.nitro.ts +16 -0
  995. package/src/specs/dsaKeyPair.nitro.ts +13 -0
  996. package/src/specs/ecKeyPair.nitro.ts +40 -0
  997. package/src/specs/ecdh.nitro.ts +12 -0
  998. package/src/specs/edKeyPair.nitro.ts +43 -0
  999. package/src/specs/hash.nitro.ts +10 -0
  1000. package/src/specs/hkdf.nitro.ts +25 -0
  1001. package/src/specs/hmac.nitro.ts +7 -0
  1002. package/src/specs/keyObjectHandle.nitro.ts +56 -0
  1003. package/src/specs/kmac.nitro.ts +12 -0
  1004. package/src/specs/mlDsaKeyPair.nitro.ts +29 -0
  1005. package/src/specs/mlKemKeyPair.nitro.ts +32 -0
  1006. package/src/specs/pbkdf2.nitro.ts +18 -0
  1007. package/src/specs/prime.nitro.ts +18 -0
  1008. package/src/specs/random.nitro.ts +14 -0
  1009. package/src/specs/rsaCipher.nitro.ts +82 -0
  1010. package/src/specs/rsaKeyPair.nitro.ts +33 -0
  1011. package/src/specs/scrypt.nitro.ts +23 -0
  1012. package/src/specs/sign.nitro.ts +31 -0
  1013. package/src/specs/slhDsaKeyPair.nitro.ts +29 -0
  1014. package/src/specs/turboshake.nitro.ts +21 -0
  1015. package/src/specs/utils.nitro.ts +5 -0
  1016. package/src/specs/x509certificate.nitro.ts +38 -0
  1017. package/src/subtle.ts +4545 -0
  1018. package/src/utils/cipher.ts +82 -0
  1019. package/src/utils/conversion.ts +285 -0
  1020. package/src/utils/errors.ts +83 -0
  1021. package/src/utils/hashnames.ts +129 -0
  1022. package/src/utils/index.ts +7 -0
  1023. package/src/utils/noble.ts +85 -0
  1024. package/src/utils/timingSafeEqual.ts +28 -0
  1025. package/src/utils/types.ts +617 -0
  1026. package/src/utils/validation.ts +199 -0
  1027. package/src/x509certificate.ts +276 -0
@@ -0,0 +1,1316 @@
1
+ // quick_crypto_napi.cpp
2
+ //
3
+ // Standalone N-API binding for react-native-quick-crypto core crypto on
4
+ // HarmonyOS Node.js (user-space node from harmonybrew, ABI module 147).
5
+ //
6
+ // The upstream crypto core is implemented as C++20 Nitro HybridObjects under
7
+ // cpp/ (HybridHash, HybridCipher, HybridRandom, ...) which can only be
8
+ // instantiated through the react-native-nitro-modules JSI host inside a React
9
+ // Native app. On standalone HarmonyOS Node.js that host is unavailable.
10
+ //
11
+ // This binding re-implements the *same OpenSSL operations* used by the
12
+ // HybridObject implementations (see cpp/hash/HybridHash.cpp for the EVP
13
+ // digest flow, deps/ncrypto/src/ncrypto.cpp for the ARGON2 KDF flow) and
14
+ // exposes them as a plain N-API addon, so the crypto functionality becomes
15
+ // natively loadable in HarmonyOS Node.js with OpenSSL 3.6.
16
+ //
17
+ // Everything here is a real OpenSSL implementation — no stubs, no fakes.
18
+
19
+ #include <node_api.h>
20
+
21
+ #include <blake3.h>
22
+
23
+ #include <openssl/core_names.h>
24
+ #include <openssl/crypto.h>
25
+ #include <openssl/err.h>
26
+ #include <openssl/evp.h>
27
+ #include <openssl/kdf.h>
28
+ #include <openssl/params.h>
29
+ #include <openssl/rand.h>
30
+
31
+ #include <algorithm>
32
+ #include <cctype>
33
+ #include <cstdint>
34
+ #include <cstring>
35
+ #include <string>
36
+ #include <vector>
37
+
38
+ #include <openssl/hmac.h>
39
+
40
+ namespace {
41
+
42
+ // ---------------------------------------------------------------------------
43
+ // helpers
44
+ // ---------------------------------------------------------------------------
45
+
46
+ std::string GetOpenSSLError() {
47
+ unsigned long code = ERR_get_error();
48
+ if (code == 0) return std::string();
49
+ char buf[256];
50
+ ERR_error_string_n(code, buf, sizeof(buf));
51
+ ERR_clear_error();
52
+ return std::string(buf);
53
+ }
54
+
55
+ napi_value ThrowJsError(napi_env env, const std::string& message) {
56
+ napi_throw_error(env, nullptr, message.c_str());
57
+ return nullptr;
58
+ }
59
+
60
+ napi_value ThrowOpenSSLError(napi_env env, const std::string& what) {
61
+ std::string err = GetOpenSSLError();
62
+ return ThrowJsError(env, err.empty() ? what : what + ": " + err);
63
+ }
64
+
65
+ // Accepts string | ArrayBuffer | TypedArray (incl. Buffer).
66
+ bool GetData(napi_env env, napi_value value, const uint8_t** data,
67
+ size_t* len) {
68
+ napi_valuetype type;
69
+ if (napi_typeof(env, value, &type) != napi_ok) return false;
70
+ if (type == napi_string) {
71
+ size_t slen = 0;
72
+ napi_get_value_string_utf8(env, value, nullptr, 0, &slen);
73
+ std::string* holder = new std::string(slen, '\0');
74
+ napi_get_value_string_utf8(env, value, &(*holder)[0], slen + 1, &slen);
75
+ // NOTE: string data outlives this call because the JS engine copies the
76
+ // bytes into OpenSSL state synchronously within the same native call.
77
+ *data = reinterpret_cast<const uint8_t*>(holder->data());
78
+ *len = slen;
79
+ return true;
80
+ }
81
+ bool is_typed = false;
82
+ bool is_ab = false;
83
+ napi_is_typedarray(env, value, &is_typed);
84
+ napi_is_arraybuffer(env, value, &is_ab);
85
+ if (is_typed) {
86
+ napi_typedarray_type tt;
87
+ size_t length = 0, offset = 0;
88
+ void* ptr = nullptr;
89
+ napi_value ab;
90
+ if (napi_get_typedarray_info(env, value, &tt, &length, &ptr, &ab,
91
+ &offset) != napi_ok)
92
+ return false;
93
+ // ptr already points at the element window (offset applied).
94
+ *data = reinterpret_cast<const uint8_t*>(ptr);
95
+ *len = length;
96
+ return true;
97
+ }
98
+ if (is_ab) {
99
+ void* ptr = nullptr;
100
+ size_t length = 0;
101
+ if (napi_get_arraybuffer_info(env, value, &ptr, &length) != napi_ok)
102
+ return false;
103
+ *data = reinterpret_cast<const uint8_t*>(ptr);
104
+ *len = length;
105
+ return true;
106
+ }
107
+ return false;
108
+ }
109
+
110
+ bool GetString(napi_env env, napi_value value, std::string* out) {
111
+ napi_valuetype type;
112
+ if (napi_typeof(env, value, &type) != napi_ok || type != napi_string)
113
+ return false;
114
+ size_t len = 0;
115
+ napi_get_value_string_utf8(env, value, nullptr, 0, &len);
116
+ out->resize(len);
117
+ napi_get_value_string_utf8(env, value, &(*out)[0], len + 1, &len);
118
+ return true;
119
+ }
120
+
121
+ bool GetUint64(napi_env env, napi_value value, uint64_t* out) {
122
+ napi_valuetype type;
123
+ if (napi_typeof(env, value, &type) != napi_ok || type != napi_number)
124
+ return false;
125
+ double d = 0;
126
+ napi_get_value_double(env, value, &d);
127
+ if (d < 0) return false;
128
+ *out = static_cast<uint64_t>(d);
129
+ return true;
130
+ }
131
+
132
+ bool GetBool(napi_env env, napi_value value, bool* out) {
133
+ napi_valuetype type;
134
+ if (napi_typeof(env, value, &type) != napi_ok || type != napi_boolean)
135
+ return false;
136
+ napi_get_value_bool(env, value, out);
137
+ return true;
138
+ }
139
+
140
+ napi_value MakeArrayBuffer(napi_env env, const uint8_t* data, size_t len) {
141
+ void* out = nullptr;
142
+ napi_value result;
143
+ if (napi_create_arraybuffer(env, len, &out, &result) != napi_ok)
144
+ return nullptr;
145
+ if (len > 0 && data != nullptr) memcpy(out, data, len);
146
+ return result;
147
+ }
148
+
149
+ template <typename T>
150
+ napi_value MakeExternal(napi_env env, T* ptr) {
151
+ napi_value result;
152
+ napi_finalize finalize = [](napi_env /*env*/, void* data,
153
+ void* /*hint*/) { delete static_cast<T*>(data); };
154
+ if (napi_create_external(env, ptr, finalize, nullptr, &result) != napi_ok) {
155
+ delete ptr;
156
+ return nullptr;
157
+ }
158
+ return result;
159
+ }
160
+
161
+ template <typename T>
162
+ T* GetExternal(napi_env env, napi_value value) {
163
+ void* ptr = nullptr;
164
+ if (napi_get_value_external(env, value, &ptr) != napi_ok) return nullptr;
165
+ return static_cast<T*>(ptr);
166
+ }
167
+
168
+ // ---------------------------------------------------------------------------
169
+ // Hash (mirrors cpp/hash/HybridHash.cpp)
170
+ // ---------------------------------------------------------------------------
171
+
172
+ struct HashContext {
173
+ EVP_MD_CTX* ctx = nullptr;
174
+ EVP_MD* md = nullptr;
175
+ std::string algorithm;
176
+ size_t outputLength = 0; // 0 = default; only for XOF
177
+ bool isXof = false;
178
+ ~HashContext() {
179
+ if (ctx) EVP_MD_CTX_free(ctx);
180
+ if (md) EVP_MD_free(md);
181
+ }
182
+ };
183
+
184
+ EVP_MD* FetchMdOrThrow(napi_env env, const std::string& alg) {
185
+ EVP_MD* md = EVP_MD_fetch(nullptr, alg.c_str(), nullptr);
186
+ if (!md) {
187
+ std::string err = GetOpenSSLError();
188
+ std::string msg = "Unknown hash algorithm: " + alg;
189
+ if (!err.empty()) msg += " (" + err + ")";
190
+ napi_throw_error(env, nullptr, msg.c_str());
191
+ return nullptr;
192
+ }
193
+ return md;
194
+ }
195
+
196
+ napi_value HashCreate(napi_env env, napi_callback_info info) {
197
+ size_t argc = 2;
198
+ napi_value argv[2];
199
+ napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
200
+ if (argc < 1) return ThrowJsError(env, "hashCreate: algorithm is required");
201
+
202
+ std::string alg;
203
+ if (!GetString(env, argv[0], &alg))
204
+ return ThrowJsError(env, "hashCreate: algorithm must be a string");
205
+
206
+ uint64_t outputLength = 0;
207
+ bool hasOutputLength = false;
208
+ if (argc >= 2) {
209
+ napi_valuetype t;
210
+ napi_typeof(env, argv[1], &t);
211
+ if (t == napi_number) {
212
+ hasOutputLength = true;
213
+ if (!GetUint64(env, argv[1], &outputLength))
214
+ return ThrowJsError(env, "Invalid digest output length");
215
+ }
216
+ }
217
+
218
+ EVP_MD* md = FetchMdOrThrow(env, alg);
219
+ if (!md) return nullptr;
220
+
221
+ bool isXof = (EVP_MD_get_flags(md) & EVP_MD_FLAG_XOF) != 0;
222
+ if (hasOutputLength && !isXof) {
223
+ EVP_MD_free(md);
224
+ return ThrowJsError(
225
+ env, "outputLength is only supported for XOF hash algorithms (shake128/shake256)");
226
+ }
227
+ if (hasOutputLength && outputLength == 0) {
228
+ EVP_MD_free(md);
229
+ return ThrowJsError(env, "Invalid digest output length: 0");
230
+ }
231
+
232
+ EVP_MD_CTX* ctx = EVP_MD_CTX_new();
233
+ if (!ctx) {
234
+ EVP_MD_free(md);
235
+ return ThrowOpenSSLError(env, "Failed to create hash context");
236
+ }
237
+ if (EVP_DigestInit_ex(ctx, md, nullptr) != 1) {
238
+ EVP_MD_CTX_free(ctx);
239
+ EVP_MD_free(md);
240
+ return ThrowOpenSSLError(env, "Failed to initialize hash digest");
241
+ }
242
+
243
+ HashContext* h = new HashContext();
244
+ h->ctx = ctx;
245
+ h->md = md;
246
+ h->algorithm = alg;
247
+ h->outputLength = static_cast<size_t>(outputLength);
248
+ h->isXof = isXof;
249
+ return MakeExternal(env, h);
250
+ }
251
+
252
+ napi_value HashUpdate(napi_env env, napi_callback_info info) {
253
+ size_t argc = 2;
254
+ napi_value argv[2];
255
+ napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
256
+ if (argc < 2) return ThrowJsError(env, "hashUpdate: (hash, data) required");
257
+ HashContext* h = GetExternal<HashContext>(env, argv[0]);
258
+ if (!h || !h->ctx) return ThrowJsError(env, "Hash context not initialized");
259
+ const uint8_t* data = nullptr;
260
+ size_t len = 0;
261
+ if (!GetData(env, argv[1], &data, &len))
262
+ return ThrowJsError(env, "hashUpdate: data must be a string, Buffer, or ArrayBuffer");
263
+ if (len > 0 && EVP_DigestUpdate(h->ctx, data, len) != 1)
264
+ return ThrowOpenSSLError(env, "Failed to update hash digest");
265
+ napi_value undef;
266
+ napi_get_undefined(env, &undef);
267
+ return undef;
268
+ }
269
+
270
+ napi_value HashDigest(napi_env env, napi_callback_info info) {
271
+ size_t argc = 2;
272
+ napi_value argv[2];
273
+ napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
274
+ if (argc < 1) return ThrowJsError(env, "hashDigest: hash external required");
275
+ HashContext* h = GetExternal<HashContext>(env, argv[0]);
276
+ if (!h || !h->ctx) return ThrowJsError(env, "Hash context not initialized");
277
+
278
+ // Optional per-call output length override (XOF)
279
+ size_t digestSize = h->outputLength > 0
280
+ ? h->outputLength
281
+ : static_cast<size_t>(EVP_MD_get_size(h->md) > 0
282
+ ? EVP_MD_get_size(h->md)
283
+ : 32);
284
+ if (argc >= 2) {
285
+ napi_valuetype t;
286
+ napi_typeof(env, argv[1], &t);
287
+ if (t == napi_number) {
288
+ uint64_t override = 0;
289
+ if (!GetUint64(env, argv[1], &override) || override == 0)
290
+ return ThrowJsError(env, "Invalid digest output length");
291
+ if (!h->isXof)
292
+ return ThrowJsError(env, "outputLength is only supported for XOF hash algorithms");
293
+ digestSize = static_cast<size_t>(override);
294
+ }
295
+ }
296
+
297
+ // Work on a copy so the hash stays usable after digest() (Node parity).
298
+ EVP_MD_CTX* tmp = EVP_MD_CTX_new();
299
+ if (!tmp) return ThrowOpenSSLError(env, "Failed to copy hash context");
300
+ if (EVP_MD_CTX_copy_ex(tmp, h->ctx) != 1) {
301
+ EVP_MD_CTX_free(tmp);
302
+ return ThrowOpenSSLError(env, "Failed to copy hash context");
303
+ }
304
+
305
+ std::vector<uint8_t> out(digestSize);
306
+ unsigned int outLen = 0;
307
+ int ret;
308
+ if (h->isXof && digestSize > 0) {
309
+ // set XOF length param like HybridHash::setParams
310
+ uint32_t xoflen = static_cast<uint32_t>(digestSize);
311
+ OSSL_PARAM params[2] = {
312
+ OSSL_PARAM_construct_uint("xoflen", &xoflen),
313
+ OSSL_PARAM_construct_end()};
314
+ if (EVP_MD_CTX_set_params(tmp, params) != 1) {
315
+ std::string err = GetOpenSSLError();
316
+ EVP_MD_CTX_free(tmp);
317
+ return ThrowJsError(env, "Failed to set XOF length parameter: " + err);
318
+ }
319
+ ret = EVP_DigestFinalXOF(tmp, out.data(), out.size());
320
+ } else {
321
+ ret = EVP_DigestFinal_ex(tmp, out.data(), &outLen);
322
+ }
323
+ EVP_MD_CTX_free(tmp);
324
+ if (ret != 1) return ThrowOpenSSLError(env, "Failed to finalize hash digest");
325
+
326
+ size_t finalLen = (h->isXof && digestSize > 0) ? out.size() : outLen;
327
+ return MakeArrayBuffer(env, out.data(), finalLen);
328
+ }
329
+
330
+ napi_value HashCopy(napi_env env, napi_callback_info info) {
331
+ size_t argc = 1;
332
+ napi_value argv[1];
333
+ napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
334
+ if (argc < 1) return ThrowJsError(env, "hashCopy: hash external required");
335
+ HashContext* h = GetExternal<HashContext>(env, argv[0]);
336
+ if (!h || !h->ctx) return ThrowJsError(env, "Hash context not initialized");
337
+
338
+ EVP_MD* md = FetchMdOrThrow(env, h->algorithm);
339
+ if (!md) return nullptr;
340
+ EVP_MD_CTX* ctx = EVP_MD_CTX_new();
341
+ if (!ctx) {
342
+ EVP_MD_free(md);
343
+ return ThrowOpenSSLError(env, "Failed to create hash context");
344
+ }
345
+ if (EVP_MD_CTX_copy_ex(ctx, h->ctx) != 1) {
346
+ EVP_MD_CTX_free(ctx);
347
+ EVP_MD_free(md);
348
+ return ThrowOpenSSLError(env, "Failed to copy hash context");
349
+ }
350
+ HashContext* copy = new HashContext();
351
+ copy->ctx = ctx;
352
+ copy->md = md;
353
+ copy->algorithm = h->algorithm;
354
+ copy->outputLength = h->outputLength;
355
+ copy->isXof = h->isXof;
356
+ return MakeExternal(env, copy);
357
+ }
358
+
359
+ napi_value HashOneShot(napi_env env, napi_callback_info info) {
360
+ size_t argc = 3;
361
+ napi_value argv[3];
362
+ napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
363
+ if (argc < 2) return ThrowJsError(env, "hash: (algorithm, data) required");
364
+ std::string alg;
365
+ if (!GetString(env, argv[0], &alg))
366
+ return ThrowJsError(env, "hash: algorithm must be a string");
367
+ const uint8_t* data = nullptr;
368
+ size_t len = 0;
369
+ if (!GetData(env, argv[1], &data, &len))
370
+ return ThrowJsError(env, "hash: data must be a string, Buffer, or ArrayBuffer");
371
+
372
+ uint64_t outputLength = 0;
373
+ if (argc >= 3) GetUint64(env, argv[2], &outputLength);
374
+
375
+ EVP_MD* md = FetchMdOrThrow(env, alg);
376
+ if (!md) return nullptr;
377
+ EVP_MD_CTX* ctx = EVP_MD_CTX_new();
378
+ if (!ctx) {
379
+ EVP_MD_free(md);
380
+ return ThrowOpenSSLError(env, "Failed to create hash context");
381
+ }
382
+ if (EVP_DigestInit_ex(ctx, md, nullptr) != 1 ||
383
+ (len > 0 && EVP_DigestUpdate(ctx, data, len) != 1)) {
384
+ EVP_MD_CTX_free(ctx);
385
+ EVP_MD_free(md);
386
+ return ThrowOpenSSLError(env, "Failed to compute hash");
387
+ }
388
+ std::vector<uint8_t> out;
389
+ if ((EVP_MD_get_flags(md) & EVP_MD_FLAG_XOF) && outputLength > 0) {
390
+ out.resize(static_cast<size_t>(outputLength));
391
+ if (EVP_DigestFinalXOF(ctx, out.data(), out.size()) != 1) {
392
+ EVP_MD_CTX_free(ctx);
393
+ EVP_MD_free(md);
394
+ return ThrowOpenSSLError(env, "Failed to finalize hash digest");
395
+ }
396
+ } else {
397
+ out.resize(static_cast<size_t>(EVP_MD_get_size(md)));
398
+ unsigned int outLen = 0;
399
+ if (EVP_DigestFinal_ex(ctx, out.data(), &outLen) != 1) {
400
+ EVP_MD_CTX_free(ctx);
401
+ EVP_MD_free(md);
402
+ return ThrowOpenSSLError(env, "Failed to finalize hash digest");
403
+ }
404
+ out.resize(outLen);
405
+ }
406
+ EVP_MD_CTX_free(ctx);
407
+ EVP_MD_free(md);
408
+ return MakeArrayBuffer(env, out.data(), out.size());
409
+ }
410
+
411
+ // ---------------------------------------------------------------------------
412
+ // HMAC (mirrors cpp/hmac/HybridHmac.cpp)
413
+ // ---------------------------------------------------------------------------
414
+
415
+ struct HmacContext {
416
+ EVP_MAC* mac = nullptr;
417
+ EVP_MAC_CTX* ctx = nullptr;
418
+ std::string algorithm;
419
+ ~HmacContext() {
420
+ if (ctx) EVP_MAC_CTX_free(ctx);
421
+ if (mac) EVP_MAC_free(mac);
422
+ }
423
+ };
424
+
425
+ napi_value HmacCreate(napi_env env, napi_callback_info info) {
426
+ size_t argc = 2;
427
+ napi_value argv[2];
428
+ napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
429
+ if (argc < 2)
430
+ return ThrowJsError(env, "hmacCreate: (algorithm, key) required");
431
+ std::string alg;
432
+ if (!GetString(env, argv[0], &alg))
433
+ return ThrowJsError(env, "hmacCreate: algorithm must be a string");
434
+ const uint8_t* key = nullptr;
435
+ size_t keyLen = 0;
436
+ if (!GetData(env, argv[1], &key, &keyLen))
437
+ return ThrowJsError(env, "hmacCreate: key must be a string, Buffer, or ArrayBuffer");
438
+
439
+ EVP_MAC* mac = EVP_MAC_fetch(nullptr, "HMAC", nullptr);
440
+ if (!mac) return ThrowOpenSSLError(env, "Failed to fetch HMAC");
441
+ EVP_MAC_CTX* ctx = EVP_MAC_CTX_new(mac);
442
+ if (!ctx) {
443
+ EVP_MAC_free(mac);
444
+ return ThrowOpenSSLError(env, "Failed to create HMAC context");
445
+ }
446
+ std::string digest = alg;
447
+ OSSL_PARAM params[2] = {
448
+ OSSL_PARAM_construct_utf8_string(OSSL_MAC_PARAM_DIGEST, &digest[0], 0),
449
+ OSSL_PARAM_construct_end()};
450
+ if (EVP_MAC_init(ctx, keyLen > 0 ? key : reinterpret_cast<const uint8_t*>(""),
451
+ keyLen, params) != 1) {
452
+ std::string err = GetOpenSSLError();
453
+ EVP_MAC_CTX_free(ctx);
454
+ EVP_MAC_free(mac);
455
+ return ThrowJsError(env, "Unknown HMAC digest algorithm: " + alg +
456
+ (err.empty() ? "" : " (" + err + ")"));
457
+ }
458
+ HmacContext* h = new HmacContext();
459
+ h->mac = mac;
460
+ h->ctx = ctx;
461
+ h->algorithm = alg;
462
+ return MakeExternal(env, h);
463
+ }
464
+
465
+ napi_value HmacUpdate(napi_env env, napi_callback_info info) {
466
+ size_t argc = 2;
467
+ napi_value argv[2];
468
+ napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
469
+ if (argc < 2) return ThrowJsError(env, "hmacUpdate: (hmac, data) required");
470
+ HmacContext* h = GetExternal<HmacContext>(env, argv[0]);
471
+ if (!h || !h->ctx) return ThrowJsError(env, "HMAC context not initialized");
472
+ const uint8_t* data = nullptr;
473
+ size_t len = 0;
474
+ if (!GetData(env, argv[1], &data, &len))
475
+ return ThrowJsError(env, "hmacUpdate: data must be a string, Buffer, or ArrayBuffer");
476
+ if (len > 0 && EVP_MAC_update(h->ctx, data, len) != 1)
477
+ return ThrowOpenSSLError(env, "Failed to update HMAC");
478
+ napi_value undef;
479
+ napi_get_undefined(env, &undef);
480
+ return undef;
481
+ }
482
+
483
+ napi_value HmacDigest(napi_env env, napi_callback_info info) {
484
+ size_t argc = 1;
485
+ napi_value argv[1];
486
+ napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
487
+ if (argc < 1) return ThrowJsError(env, "hmacDigest: hmac external required");
488
+ HmacContext* h = GetExternal<HmacContext>(env, argv[0]);
489
+ if (!h || !h->ctx) return ThrowJsError(env, "HMAC context not initialized");
490
+ size_t size = EVP_MAC_CTX_get_mac_size(h->ctx);
491
+ std::vector<uint8_t> out(size ? size : 1);
492
+ size_t outLen = 0;
493
+ if (EVP_MAC_final(h->ctx, out.data(), &outLen, out.size()) != 1)
494
+ return ThrowOpenSSLError(env, "Failed to finalize HMAC");
495
+ return MakeArrayBuffer(env, out.data(), outLen);
496
+ }
497
+
498
+ napi_value HmacOneShot(napi_env env, napi_callback_info info) {
499
+ size_t argc = 3;
500
+ napi_value argv[3];
501
+ napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
502
+ if (argc < 3) return ThrowJsError(env, "hmac: (algorithm, key, data) required");
503
+ std::string alg;
504
+ if (!GetString(env, argv[0], &alg))
505
+ return ThrowJsError(env, "hmac: algorithm must be a string");
506
+ const uint8_t* key = nullptr;
507
+ size_t keyLen = 0;
508
+ if (!GetData(env, argv[1], &key, &keyLen))
509
+ return ThrowJsError(env, "hmac: key must be a string, Buffer, or ArrayBuffer");
510
+ const uint8_t* data = nullptr;
511
+ size_t len = 0;
512
+ if (!GetData(env, argv[2], &data, &len))
513
+ return ThrowJsError(env, "hmac: data must be a string, Buffer, or ArrayBuffer");
514
+
515
+ EVP_MAC* mac = EVP_MAC_fetch(nullptr, "HMAC", nullptr);
516
+ if (!mac) return ThrowOpenSSLError(env, "Failed to fetch HMAC");
517
+ EVP_MAC_CTX* mctx = EVP_MAC_CTX_new(mac);
518
+ if (!mctx) {
519
+ EVP_MAC_free(mac);
520
+ return ThrowOpenSSLError(env, "Failed to create HMAC context");
521
+ }
522
+ std::string digest = alg;
523
+ OSSL_PARAM mparams[2] = {
524
+ OSSL_PARAM_construct_utf8_string(OSSL_MAC_PARAM_DIGEST, &digest[0], 0),
525
+ OSSL_PARAM_construct_end()};
526
+ size_t outLen = 0;
527
+ bool ok = EVP_MAC_init(mctx, keyLen > 0 ? key : reinterpret_cast<const uint8_t*>(""),
528
+ keyLen, mparams) == 1;
529
+ std::vector<uint8_t> out;
530
+ if (ok) {
531
+ out.resize(EVP_MAC_CTX_get_mac_size(mctx));
532
+ ok = (len == 0 || EVP_MAC_update(mctx, data, len) == 1) &&
533
+ EVP_MAC_final(mctx, out.data(), &outLen, out.size()) == 1;
534
+ }
535
+ EVP_MAC_CTX_free(mctx);
536
+ EVP_MAC_free(mac);
537
+ if (!ok) return ThrowOpenSSLError(env, "Failed to compute HMAC");
538
+ return MakeArrayBuffer(env, out.data(), outLen);
539
+ }
540
+
541
+ // ---------------------------------------------------------------------------
542
+ // Random (mirrors cpp/random/HybridRandom.cpp)
543
+ // ---------------------------------------------------------------------------
544
+
545
+ napi_value RandomBytes(napi_env env, napi_callback_info info) {
546
+ size_t argc = 1;
547
+ napi_value argv[1];
548
+ napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
549
+ if (argc < 1) return ThrowJsError(env, "randomBytes: size required");
550
+ uint64_t size = 0;
551
+ if (!GetUint64(env, argv[0], &size))
552
+ return ThrowJsError(env, "randomBytes: size must be a non-negative number");
553
+ if (size > 0x7fffffff)
554
+ return ThrowJsError(env, "randomBytes: size must be <= 2^31 - 1");
555
+ std::vector<uint8_t> out(static_cast<size_t>(size));
556
+ if (size > 0 && RAND_bytes(out.data(), static_cast<int>(size)) != 1)
557
+ return ThrowOpenSSLError(env, "Failed to generate random bytes");
558
+ return MakeArrayBuffer(env, out.data(), out.size());
559
+ }
560
+
561
+ // ---------------------------------------------------------------------------
562
+ // KDFs: PBKDF2 / scrypt / HKDF / Argon2
563
+ // ---------------------------------------------------------------------------
564
+
565
+ napi_value Pbkdf2Sync(napi_env env, napi_callback_info info) {
566
+ size_t argc = 5;
567
+ napi_value argv[5];
568
+ napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
569
+ if (argc < 5)
570
+ return ThrowJsError(env, "pbkdf2Sync: (password, salt, iterations, keylen, digest) required");
571
+ const uint8_t* pw = nullptr;
572
+ size_t pwLen = 0;
573
+ if (!GetData(env, argv[0], &pw, &pwLen))
574
+ return ThrowJsError(env, "pbkdf2Sync: password must be a string, Buffer, or ArrayBuffer");
575
+ const uint8_t* salt = nullptr;
576
+ size_t saltLen = 0;
577
+ if (!GetData(env, argv[1], &salt, &saltLen))
578
+ return ThrowJsError(env, "pbkdf2Sync: salt must be a string, Buffer, or ArrayBuffer");
579
+ uint64_t iterations = 0, keylen = 0;
580
+ if (!GetUint64(env, argv[2], &iterations))
581
+ return ThrowJsError(env, "pbkdf2Sync: iterations must be a non-negative number");
582
+ if (!GetUint64(env, argv[3], &keylen) || keylen == 0)
583
+ return ThrowJsError(env, "pbkdf2Sync: keylen must be a positive number");
584
+ std::string digest;
585
+ if (!GetString(env, argv[4], &digest))
586
+ return ThrowJsError(env, "pbkdf2Sync: digest must be a string");
587
+ EVP_MD* md = FetchMdOrThrow(env, digest);
588
+ if (!md) return nullptr;
589
+ std::vector<uint8_t> out(static_cast<size_t>(keylen));
590
+ int ret = PKCS5_PBKDF2_HMAC(reinterpret_cast<const char*>(pwLen > 0 ? pw : reinterpret_cast<const uint8_t*>("")),
591
+ static_cast<int>(pwLen),
592
+ saltLen > 0 ? salt : reinterpret_cast<const uint8_t*>(""),
593
+ static_cast<int>(saltLen),
594
+ static_cast<int>(iterations), md, out.size(), out.data());
595
+ EVP_MD_free(md);
596
+ if (ret != 1) return ThrowOpenSSLError(env, "Failed to derive PBKDF2 key");
597
+ return MakeArrayBuffer(env, out.data(), out.size());
598
+ }
599
+
600
+ napi_value ScryptSync(napi_env env, napi_callback_info info) {
601
+ size_t argc = 7;
602
+ napi_value argv[7];
603
+ napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
604
+ if (argc < 6)
605
+ return ThrowJsError(env, "scryptSync: (password, salt, keylen, N, r, p[, maxmem]) required");
606
+ const uint8_t* pw = nullptr;
607
+ size_t pwLen = 0;
608
+ if (!GetData(env, argv[0], &pw, &pwLen))
609
+ return ThrowJsError(env, "scryptSync: password must be a string, Buffer, or ArrayBuffer");
610
+ const uint8_t* salt = nullptr;
611
+ size_t saltLen = 0;
612
+ if (!GetData(env, argv[1], &salt, &saltLen))
613
+ return ThrowJsError(env, "scryptSync: salt must be a string, Buffer, or ArrayBuffer");
614
+ uint64_t keylen = 0, N = 0, r = 0, p = 0, maxmem = 0;
615
+ if (!GetUint64(env, argv[2], &keylen) || keylen == 0)
616
+ return ThrowJsError(env, "scryptSync: keylen must be a positive number");
617
+ if (!GetUint64(env, argv[3], &N) || N < 2 || (N & (N - 1)) != 0)
618
+ return ThrowJsError(env, "scryptSync: N must be a power of 2 greater than 1");
619
+ if (!GetUint64(env, argv[4], &r) || r == 0)
620
+ return ThrowJsError(env, "scryptSync: r must be a positive number");
621
+ if (!GetUint64(env, argv[5], &p) || p == 0)
622
+ return ThrowJsError(env, "scryptSync: p must be a positive number");
623
+ if (argc >= 7) {
624
+ if (!GetUint64(env, argv[6], &maxmem))
625
+ return ThrowJsError(env, "scryptSync: maxmem must be a non-negative number");
626
+ } else {
627
+ maxmem = 0; // OpenSSL default
628
+ }
629
+ std::vector<uint8_t> out(static_cast<size_t>(keylen));
630
+ if (EVP_PBE_scrypt(reinterpret_cast<const char*>(pwLen > 0 ? pw : reinterpret_cast<const uint8_t*>("")),
631
+ pwLen,
632
+ saltLen > 0 ? salt : reinterpret_cast<const uint8_t*>(""),
633
+ saltLen, N, r, p, maxmem, out.data(), out.size()) != 1)
634
+ return ThrowOpenSSLError(env, "Failed to derive scrypt key");
635
+ return MakeArrayBuffer(env, out.data(), out.size());
636
+ }
637
+
638
+ // HKDF extract+expand one-shot (mirrors lib hkdfSync flow).
639
+ napi_value HkdfSync(napi_env env, napi_callback_info info) {
640
+ size_t argc = 5;
641
+ napi_value argv[5];
642
+ napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
643
+ if (argc < 5)
644
+ return ThrowJsError(env, "hkdfSync: (digest, ikm, salt, info, keylen) required");
645
+ std::string digest;
646
+ if (!GetString(env, argv[0], &digest))
647
+ return ThrowJsError(env, "hkdfSync: digest must be a string");
648
+ const uint8_t* ikm = nullptr;
649
+ size_t ikmLen = 0;
650
+ if (!GetData(env, argv[1], &ikm, &ikmLen))
651
+ return ThrowJsError(env, "hkdfSync: ikm must be a string, Buffer, or ArrayBuffer");
652
+ const uint8_t* salt = nullptr;
653
+ size_t saltLen = 0;
654
+ if (!GetData(env, argv[2], &salt, &saltLen))
655
+ return ThrowJsError(env, "hkdfSync: salt must be a string, Buffer, or ArrayBuffer");
656
+ const uint8_t* infoData = nullptr;
657
+ size_t infoLen = 0;
658
+ if (!GetData(env, argv[3], &infoData, &infoLen))
659
+ return ThrowJsError(env, "hkdfSync: info must be a string, Buffer, or ArrayBuffer");
660
+ uint64_t keylen = 0;
661
+ if (!GetUint64(env, argv[4], &keylen) || keylen == 0)
662
+ return ThrowJsError(env, "hkdfSync: keylen must be a positive number");
663
+
664
+ EVP_KDF* kdf = EVP_KDF_fetch(nullptr, "HKDF", nullptr);
665
+ if (!kdf) return ThrowOpenSSLError(env, "Failed to fetch HKDF");
666
+ EVP_KDF_CTX* kctx = EVP_KDF_CTX_new(kdf);
667
+ EVP_KDF_free(kdf);
668
+ if (!kctx) return ThrowOpenSSLError(env, "Failed to create HKDF context");
669
+
670
+ std::string mode = "EXTRACT_AND_EXPAND";
671
+ std::string mdName = digest;
672
+ OSSL_PARAM params[6] = {
673
+ OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST, &mdName[0], 0),
674
+ OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_MODE, &mode[0], 0),
675
+ OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY,
676
+ const_cast<uint8_t*>(ikmLen > 0 ? ikm : reinterpret_cast<const uint8_t*>("")),
677
+ ikmLen),
678
+ OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SALT,
679
+ const_cast<uint8_t*>(saltLen > 0 ? salt : reinterpret_cast<const uint8_t*>("")),
680
+ saltLen),
681
+ OSSL_PARAM_construct_octet_string("info",
682
+ const_cast<uint8_t*>(infoLen > 0 ? infoData : reinterpret_cast<const uint8_t*>("")),
683
+ infoLen),
684
+ OSSL_PARAM_construct_end()};
685
+ std::vector<uint8_t> out(static_cast<size_t>(keylen));
686
+ int ret = EVP_KDF_derive(kctx, out.data(), out.size(), params);
687
+ EVP_KDF_CTX_free(kctx);
688
+ if (ret != 1) return ThrowOpenSSLError(env, "Failed to derive HKDF key");
689
+ return MakeArrayBuffer(env, out.data(), out.size());
690
+ }
691
+
692
+ // Argon2 via OpenSSL 3.2+ ARGON2* KDF (mirrors deps/ncrypto/src/ncrypto.cpp argon2()).
693
+ napi_value Argon2Sync(napi_env env, napi_callback_info info) {
694
+ size_t argc = 10;
695
+ napi_value argv[10];
696
+ napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
697
+ if (argc < 8)
698
+ return ThrowJsError(env, "argon2Sync: (algorithm, message, nonce, parallelism, tagLength, memory, passes, version[, secret][, ad]) required");
699
+ std::string alg;
700
+ if (!GetString(env, argv[0], &alg))
701
+ return ThrowJsError(env, "argon2Sync: algorithm must be a string");
702
+ std::string kdfName;
703
+ if (alg == "argon2d") kdfName = "ARGON2D";
704
+ else if (alg == "argon2i") kdfName = "ARGON2I";
705
+ else if (alg == "argon2id") kdfName = "ARGON2ID";
706
+ else return ThrowJsError(env, "Unknown argon2 algorithm: " + alg);
707
+
708
+ const uint8_t* msg = nullptr;
709
+ size_t msgLen = 0;
710
+ if (!GetData(env, argv[1], &msg, &msgLen))
711
+ return ThrowJsError(env, "argon2Sync: message must be a string, Buffer, or ArrayBuffer");
712
+ const uint8_t* nonce = nullptr;
713
+ size_t nonceLen = 0;
714
+ if (!GetData(env, argv[2], &nonce, &nonceLen))
715
+ return ThrowJsError(env, "argon2Sync: nonce must be a string, Buffer, or ArrayBuffer");
716
+ uint64_t parallelism = 0, tagLength = 0, memory = 0, passes = 0, version = 0;
717
+ if (!GetUint64(env, argv[3], &parallelism) || parallelism == 0)
718
+ return ThrowJsError(env, "argon2Sync: parallelism must be >= 1");
719
+ if (!GetUint64(env, argv[4], &tagLength) || tagLength < 4)
720
+ return ThrowJsError(env, "argon2Sync: tagLength must be >= 4");
721
+ if (!GetUint64(env, argv[5], &memory) || memory == 0)
722
+ return ThrowJsError(env, "argon2Sync: memory (KiB) must be >= 1");
723
+ if (!GetUint64(env, argv[6], &passes) || passes == 0)
724
+ return ThrowJsError(env, "argon2Sync: passes must be >= 1");
725
+ if (!GetUint64(env, argv[7], &version))
726
+ return ThrowJsError(env, "argon2Sync: version must be a number");
727
+
728
+ const uint8_t* secret = nullptr;
729
+ size_t secretLen = 0;
730
+ if (argc >= 9) {
731
+ napi_valuetype t;
732
+ napi_typeof(env, argv[8], &t);
733
+ if (t != napi_undefined && t != napi_null) GetData(env, argv[8], &secret, &secretLen);
734
+ }
735
+ const uint8_t* ad = nullptr;
736
+ size_t adLen = 0;
737
+ if (argc >= 10) {
738
+ napi_valuetype t;
739
+ napi_typeof(env, argv[9], &t);
740
+ if (t != napi_undefined && t != napi_null) GetData(env, argv[9], &ad, &adLen);
741
+ }
742
+
743
+ EVP_KDF* kdf = EVP_KDF_fetch(nullptr, kdfName.c_str(), nullptr);
744
+ if (!kdf) return ThrowOpenSSLError(env, "Failed to fetch " + kdfName);
745
+ EVP_KDF_CTX* kctx = EVP_KDF_CTX_new(kdf);
746
+ EVP_KDF_free(kdf);
747
+ if (!kctx) return ThrowOpenSSLError(env, "Failed to create ARGON2 KDF context");
748
+
749
+ uint32_t lanes = static_cast<uint32_t>(parallelism);
750
+ uint32_t memcost = static_cast<uint32_t>(memory);
751
+ uint32_t iter = static_cast<uint32_t>(passes);
752
+ uint32_t ver = static_cast<uint32_t>(version);
753
+
754
+ std::vector<OSSL_PARAM> params;
755
+ params.reserve(9);
756
+ params.push_back(OSSL_PARAM_construct_octet_string(
757
+ OSSL_KDF_PARAM_PASSWORD,
758
+ const_cast<uint8_t*>(msgLen > 0 ? msg : reinterpret_cast<const uint8_t*>("")), msgLen));
759
+ params.push_back(OSSL_PARAM_construct_octet_string(
760
+ OSSL_KDF_PARAM_SALT,
761
+ const_cast<uint8_t*>(nonceLen > 0 ? nonce : reinterpret_cast<const uint8_t*>("")), nonceLen));
762
+ params.push_back(OSSL_PARAM_construct_uint32(OSSL_KDF_PARAM_ARGON2_LANES, &lanes));
763
+ // NOTE: OSSL_KDF_PARAM_THREADS intentionally omitted — it is an
764
+ // implementation-parallelism hint (requires a thread pool) and does not
765
+ // affect the derived key; ARGON2_LANES is the algorithmic parameter.
766
+ params.push_back(OSSL_PARAM_construct_uint32(OSSL_KDF_PARAM_ARGON2_MEMCOST, &memcost));
767
+ params.push_back(OSSL_PARAM_construct_uint32(OSSL_KDF_PARAM_ITER, &iter));
768
+ params.push_back(OSSL_PARAM_construct_uint32(OSSL_KDF_PARAM_ARGON2_VERSION, &ver));
769
+ if (adLen != 0) {
770
+ params.push_back(OSSL_PARAM_construct_octet_string(
771
+ OSSL_KDF_PARAM_ARGON2_AD, const_cast<uint8_t*>(ad), adLen));
772
+ }
773
+ if (secretLen != 0) {
774
+ params.push_back(OSSL_PARAM_construct_octet_string(
775
+ OSSL_KDF_PARAM_SECRET, const_cast<uint8_t*>(secret), secretLen));
776
+ }
777
+ params.push_back(OSSL_PARAM_construct_end());
778
+
779
+ std::vector<uint8_t> out(static_cast<size_t>(tagLength));
780
+ int ret = EVP_KDF_derive(kctx, out.data(), out.size(), params.data());
781
+ EVP_KDF_CTX_free(kctx);
782
+ if (ret != 1) return ThrowOpenSSLError(env, "Failed to derive Argon2 key");
783
+ return MakeArrayBuffer(env, out.data(), out.size());
784
+ }
785
+
786
+ // ---------------------------------------------------------------------------
787
+ // timingSafeEqual (mirrors cpp/utils/HybridUtils.cpp)
788
+ // ---------------------------------------------------------------------------
789
+
790
+ napi_value TimingSafeEqual(napi_env env, napi_callback_info info) {
791
+ size_t argc = 2;
792
+ napi_value argv[2];
793
+ napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
794
+ if (argc < 2) return ThrowJsError(env, "timingSafeEqual: (a, b) required");
795
+ const uint8_t* a = nullptr;
796
+ size_t aLen = 0;
797
+ const uint8_t* b = nullptr;
798
+ size_t bLen = 0;
799
+ if (!GetData(env, argv[0], &a, &aLen))
800
+ return ThrowJsError(env, "timingSafeEqual: first argument must be a string, Buffer, or ArrayBuffer");
801
+ if (!GetData(env, argv[1], &b, &bLen))
802
+ return ThrowJsError(env, "timingSafeEqual: second argument must be a string, Buffer, or ArrayBuffer");
803
+ if (aLen != bLen)
804
+ return ThrowJsError(env, "timingSafeEqual: input buffers must have the same byte length");
805
+ bool equal = aLen == 0 || CRYPTO_memcmp(a, b, aLen) == 0;
806
+ napi_value result;
807
+ napi_get_boolean(env, equal, &result);
808
+ return result;
809
+ }
810
+
811
+ // ---------------------------------------------------------------------------
812
+ // Cipher (mirrors cpp/cipher/HybridCipher.cpp)
813
+ // ---------------------------------------------------------------------------
814
+
815
+ struct CipherContext {
816
+ EVP_CIPHER_CTX* ctx = nullptr;
817
+ bool encrypt = false;
818
+ bool authMode = false;
819
+ bool autoPad = true;
820
+ bool finalized = false;
821
+ size_t tagLen = 16;
822
+ ~CipherContext() {
823
+ if (ctx) EVP_CIPHER_CTX_free(ctx);
824
+ }
825
+ };
826
+
827
+ bool IsAuthMode(const std::string& algLower, int mode) {
828
+ (void)mode;
829
+ return algLower.find("gcm") != std::string::npos ||
830
+ algLower.find("ccm") != std::string::npos ||
831
+ algLower.find("ocb") != std::string::npos ||
832
+ algLower.find("siv") != std::string::npos ||
833
+ algLower.find("poly1305") != std::string::npos;
834
+ }
835
+
836
+ napi_value CipherCreate(napi_env env, napi_callback_info info) {
837
+ size_t argc = 4;
838
+ napi_value argv[4];
839
+ napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
840
+ if (argc < 3)
841
+ return ThrowJsError(env, "cipherCreate: (algorithm, key, iv, encrypt) required");
842
+ std::string alg;
843
+ if (!GetString(env, argv[0], &alg))
844
+ return ThrowJsError(env, "cipherCreate: algorithm must be a string");
845
+ const uint8_t* key = nullptr;
846
+ size_t keyLen = 0;
847
+ if (!GetData(env, argv[1], &key, &keyLen))
848
+ return ThrowJsError(env, "cipherCreate: key must be a string, Buffer, or ArrayBuffer");
849
+ const uint8_t* iv = nullptr;
850
+ size_t ivLen = 0;
851
+ bool hasIv = false;
852
+ {
853
+ napi_valuetype t;
854
+ napi_typeof(env, argv[2], &t);
855
+ if (t != napi_undefined && t != napi_null) {
856
+ hasIv = true;
857
+ if (!GetData(env, argv[2], &iv, &ivLen))
858
+ return ThrowJsError(env, "cipherCreate: iv must be a string, Buffer, or ArrayBuffer");
859
+ }
860
+ }
861
+ bool encrypt = false;
862
+ if (!GetBool(env, argv[3], &encrypt))
863
+ return ThrowJsError(env, "cipherCreate: encrypt must be a boolean");
864
+
865
+ EVP_CIPHER* cipher = EVP_CIPHER_fetch(nullptr, alg.c_str(), nullptr);
866
+ if (!cipher) {
867
+ std::string err = GetOpenSSLError();
868
+ return ThrowJsError(env, "Unknown cipher algorithm: " + alg +
869
+ (err.empty() ? "" : " (" + err + ")"));
870
+ }
871
+ std::string algLower = alg;
872
+ for (auto& c : algLower) c = static_cast<char>(std::tolower(static_cast<unsigned char>(c)));
873
+ bool authMode = IsAuthMode(algLower, EVP_CIPHER_get_mode(cipher));
874
+
875
+ CipherContext* c = new CipherContext();
876
+ c->encrypt = encrypt;
877
+ c->authMode = authMode;
878
+ c->ctx = EVP_CIPHER_CTX_new();
879
+ if (!c->ctx) {
880
+ EVP_CIPHER_free(cipher);
881
+ delete c;
882
+ return ThrowOpenSSLError(env, "Failed to create cipher context");
883
+ }
884
+ int enc = encrypt ? 1 : 0;
885
+
886
+ // Validate / allow variable key length (like Node's checkCipherParameters).
887
+ int klen = EVP_CIPHER_get_key_length(cipher);
888
+ if (keyLen != static_cast<size_t>(klen)) {
889
+ if (EVP_CIPHER_CTX_set_key_length(c->ctx, static_cast<int>(keyLen)) != 1) {
890
+ std::string msg = "Invalid key length: got " + std::to_string(keyLen) +
891
+ ", expected " + std::to_string(klen) + " for " + alg;
892
+ EVP_CIPHER_CTX_free(c->ctx);
893
+ EVP_CIPHER_free(cipher);
894
+ delete c;
895
+ return ThrowJsError(env, msg);
896
+ }
897
+ }
898
+
899
+ // For AEAD modes, set the IV length explicitly before key/iv init so that
900
+ // non-default IV sizes work (same as HybridCipher).
901
+ if (authMode && hasIv && ivLen > 0) {
902
+ if (EVP_CipherInit_ex2(c->ctx, cipher, nullptr, nullptr, enc, nullptr) != 1) {
903
+ std::string err = GetOpenSSLError();
904
+ EVP_CIPHER_CTX_free(c->ctx);
905
+ EVP_CIPHER_free(cipher);
906
+ delete c;
907
+ return ThrowJsError(env, "Failed to initialize cipher: " + err);
908
+ }
909
+ size_t ivLenParam = ivLen;
910
+ OSSL_PARAM ivParams[2] = {
911
+ OSSL_PARAM_construct_size_t(OSSL_CIPHER_PARAM_AEAD_IVLEN, &ivLenParam),
912
+ OSSL_PARAM_construct_end()};
913
+ if (EVP_CIPHER_CTX_set_params(c->ctx, ivParams) != 1) {
914
+ ERR_clear_error(); // non-fatal: fall back to default IV length
915
+ }
916
+ if (EVP_CipherInit_ex2(c->ctx, nullptr, key, iv, enc, nullptr) != 1) {
917
+ std::string err = GetOpenSSLError();
918
+ EVP_CIPHER_CTX_free(c->ctx);
919
+ EVP_CIPHER_free(cipher);
920
+ delete c;
921
+ return ThrowJsError(env, "Failed to initialize cipher: " + err);
922
+ }
923
+ } else {
924
+ if (EVP_CipherInit_ex2(c->ctx, cipher, key,
925
+ hasIv && ivLen > 0 ? iv : nullptr, enc, nullptr) != 1) {
926
+ std::string err = GetOpenSSLError();
927
+ EVP_CIPHER_CTX_free(c->ctx);
928
+ EVP_CIPHER_free(cipher);
929
+ delete c;
930
+ return ThrowJsError(env, "Failed to initialize cipher: " + err);
931
+ }
932
+ }
933
+ EVP_CIPHER_free(cipher);
934
+ return MakeExternal(env, c);
935
+ }
936
+
937
+ napi_value CipherUpdate(napi_env env, napi_callback_info info) {
938
+ size_t argc = 2;
939
+ napi_value argv[2];
940
+ napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
941
+ if (argc < 2) return ThrowJsError(env, "cipherUpdate: (cipher, data) required");
942
+ CipherContext* c = GetExternal<CipherContext>(env, argv[0]);
943
+ if (!c || !c->ctx) return ThrowJsError(env, "Cipher context not initialized");
944
+ if (c->finalized) return ThrowJsError(env, "_CIPHER_FINALIZED");
945
+ const uint8_t* data = nullptr;
946
+ size_t len = 0;
947
+ if (!GetData(env, argv[1], &data, &len))
948
+ return ThrowJsError(env, "cipherUpdate: data must be a string, Buffer, or ArrayBuffer");
949
+ int blockSize = EVP_CIPHER_CTX_get_block_size(c->ctx);
950
+ if (blockSize <= 0) blockSize = 16;
951
+ std::vector<uint8_t> out(len + static_cast<size_t>(blockSize) + 16);
952
+ int outl = 0;
953
+ int ret = c->encrypt
954
+ ? EVP_EncryptUpdate(c->ctx, out.data(), &outl, len > 0 ? data : out.data(),
955
+ static_cast<int>(len))
956
+ : EVP_DecryptUpdate(c->ctx, out.data(), &outl, len > 0 ? data : out.data(),
957
+ static_cast<int>(len));
958
+ if (ret != 1) return ThrowOpenSSLError(env, "Failed to update cipher");
959
+ return MakeArrayBuffer(env, out.data(), static_cast<size_t>(outl > 0 ? outl : 0));
960
+ }
961
+
962
+ napi_value CipherSetAAD(napi_env env, napi_callback_info info) {
963
+ size_t argc = 2;
964
+ napi_value argv[2];
965
+ napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
966
+ if (argc < 2) return ThrowJsError(env, "cipherSetAAD: (cipher, data) required");
967
+ CipherContext* c = GetExternal<CipherContext>(env, argv[0]);
968
+ if (!c || !c->ctx) return ThrowJsError(env, "Cipher context not initialized");
969
+ if (!c->authMode) return ThrowJsError(env, "cipherSetAAD is only supported for AEAD ciphers");
970
+ const uint8_t* data = nullptr;
971
+ size_t len = 0;
972
+ if (!GetData(env, argv[1], &data, &len))
973
+ return ThrowJsError(env, "cipherSetAAD: data must be a string, Buffer, or ArrayBuffer");
974
+ int outl = 0;
975
+ int ret = c->encrypt
976
+ ? EVP_EncryptUpdate(c->ctx, nullptr, &outl, len > 0 ? data : reinterpret_cast<const uint8_t*>(""),
977
+ static_cast<int>(len))
978
+ : EVP_DecryptUpdate(c->ctx, nullptr, &outl, len > 0 ? data : reinterpret_cast<const uint8_t*>(""),
979
+ static_cast<int>(len));
980
+ if (ret != 1) return ThrowOpenSSLError(env, "Failed to set AAD");
981
+ napi_value undef;
982
+ napi_get_undefined(env, &undef);
983
+ return undef;
984
+ }
985
+
986
+ napi_value CipherSetAutoPadding(napi_env env, napi_callback_info info) {
987
+ size_t argc = 2;
988
+ napi_value argv[2];
989
+ napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
990
+ if (argc < 2)
991
+ return ThrowJsError(env, "cipherSetAutoPadding: (cipher, autoPadding) required");
992
+ CipherContext* c = GetExternal<CipherContext>(env, argv[0]);
993
+ if (!c || !c->ctx) return ThrowJsError(env, "Cipher context not initialized");
994
+ bool pad = true;
995
+ GetBool(env, argv[1], &pad);
996
+ if (EVP_CIPHER_CTX_set_padding(c->ctx, pad ? 1 : 0) != 1)
997
+ return ThrowOpenSSLError(env, "Failed to set auto padding");
998
+ c->autoPad = pad;
999
+ napi_value undef;
1000
+ napi_get_undefined(env, &undef);
1001
+ return undef;
1002
+ }
1003
+
1004
+ napi_value CipherFinal(napi_env env, napi_callback_info info) {
1005
+ size_t argc = 1;
1006
+ napi_value argv[1];
1007
+ napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1008
+ if (argc < 1) return ThrowJsError(env, "cipherFinal: cipher external required");
1009
+ CipherContext* c = GetExternal<CipherContext>(env, argv[0]);
1010
+ if (!c || !c->ctx) return ThrowJsError(env, "Cipher context not initialized");
1011
+ if (c->finalized) return ThrowJsError(env, "_CIPHER_FINALIZED");
1012
+ int blockSize = EVP_CIPHER_CTX_get_block_size(c->ctx);
1013
+ if (blockSize <= 0) blockSize = 16;
1014
+ std::vector<uint8_t> out(static_cast<size_t>(blockSize) + 16);
1015
+ int outl = 0;
1016
+ int ret = c->encrypt ? EVP_EncryptFinal_ex(c->ctx, out.data(), &outl)
1017
+ : EVP_DecryptFinal_ex(c->ctx, out.data(), &outl);
1018
+ c->finalized = true;
1019
+ if (ret != 1) return ThrowOpenSSLError(env, "Failed to finalize cipher");
1020
+ return MakeArrayBuffer(env, out.data(), static_cast<size_t>(outl > 0 ? outl : 0));
1021
+ }
1022
+
1023
+ napi_value CipherGetAuthTag(napi_env env, napi_callback_info info) {
1024
+ size_t argc = 2;
1025
+ napi_value argv[2];
1026
+ napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1027
+ if (argc < 1) return ThrowJsError(env, "cipherGetAuthTag: cipher external required");
1028
+ CipherContext* c = GetExternal<CipherContext>(env, argv[0]);
1029
+ if (!c || !c->ctx) return ThrowJsError(env, "Cipher context not initialized");
1030
+ if (!c->encrypt)
1031
+ return ThrowJsError(env, "getAuthTag is only supported on encryption");
1032
+ size_t tagLen = c->tagLen;
1033
+ if (argc >= 2) {
1034
+ napi_valuetype t;
1035
+ napi_typeof(env, argv[1], &t);
1036
+ if (t == napi_number) {
1037
+ uint64_t v = 0;
1038
+ if (!GetUint64(env, argv[1], &v) || v == 0 || v > 1024)
1039
+ return ThrowJsError(env, "Invalid auth tag length");
1040
+ tagLen = static_cast<size_t>(v);
1041
+ }
1042
+ }
1043
+ std::vector<uint8_t> out(tagLen);
1044
+ if (EVP_CIPHER_CTX_ctrl(c->ctx, EVP_CTRL_AEAD_GET_TAG, static_cast<int>(tagLen),
1045
+ out.data()) != 1)
1046
+ return ThrowOpenSSLError(env, "Failed to get auth tag");
1047
+ return MakeArrayBuffer(env, out.data(), out.size());
1048
+ }
1049
+
1050
+ napi_value CipherSetAuthTag(napi_env env, napi_callback_info info) {
1051
+ size_t argc = 2;
1052
+ napi_value argv[2];
1053
+ napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1054
+ if (argc < 2) return ThrowJsError(env, "cipherSetAuthTag: (cipher, tag) required");
1055
+ CipherContext* c = GetExternal<CipherContext>(env, argv[0]);
1056
+ if (!c || !c->ctx) return ThrowJsError(env, "Cipher context not initialized");
1057
+ if (c->encrypt)
1058
+ return ThrowJsError(env, "setAuthTag is only supported on decryption");
1059
+ const uint8_t* tag = nullptr;
1060
+ size_t len = 0;
1061
+ if (!GetData(env, argv[1], &tag, &len) || len == 0 || len > 1024)
1062
+ return ThrowJsError(env, "Invalid auth tag");
1063
+ if (EVP_CIPHER_CTX_ctrl(c->ctx, EVP_CTRL_AEAD_SET_TAG, static_cast<int>(len),
1064
+ const_cast<uint8_t*>(tag)) != 1)
1065
+ return ThrowOpenSSLError(env, "Failed to set auth tag");
1066
+ c->tagLen = len;
1067
+ napi_value undef;
1068
+ napi_get_undefined(env, &undef);
1069
+ return undef;
1070
+ }
1071
+
1072
+ // ---------------------------------------------------------------------------
1073
+ // Blake3 (vendored deps/blake3/c, mirrors cpp/blake3/HybridBlake3.cpp)
1074
+ // ---------------------------------------------------------------------------
1075
+
1076
+ struct Blake3Context {
1077
+ blake3_hasher hasher = {};
1078
+ int mode = 0; // 0=hash, 1=keyed, 2=deriveKey
1079
+ uint8_t key[BLAKE3_KEY_LEN] = {0};
1080
+ std::string context;
1081
+ };
1082
+
1083
+ napi_value Blake3InitHash(napi_env env, napi_callback_info) {
1084
+ Blake3Context* b = new Blake3Context();
1085
+ blake3_hasher_init(&b->hasher);
1086
+ b->mode = 0;
1087
+ return MakeExternal(env, b);
1088
+ }
1089
+
1090
+ napi_value Blake3InitKeyed(napi_env env, napi_callback_info info) {
1091
+ size_t argc = 1;
1092
+ napi_value argv[1];
1093
+ napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1094
+ if (argc < 1) return ThrowJsError(env, "blake3InitKeyed: key required");
1095
+ const uint8_t* key = nullptr;
1096
+ size_t len = 0;
1097
+ if (!GetData(env, argv[0], &key, &len) || len != BLAKE3_KEY_LEN)
1098
+ return ThrowJsError(env, "BLAKE3: key must be exactly 32 bytes");
1099
+ Blake3Context* b = new Blake3Context();
1100
+ blake3_hasher_init_keyed(&b->hasher, key);
1101
+ memcpy(b->key, key, BLAKE3_KEY_LEN);
1102
+ b->mode = 1;
1103
+ return MakeExternal(env, b);
1104
+ }
1105
+
1106
+ napi_value Blake3InitDeriveKey(napi_env env, napi_callback_info info) {
1107
+ size_t argc = 1;
1108
+ napi_value argv[1];
1109
+ napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1110
+ if (argc < 1) return ThrowJsError(env, "blake3InitDeriveKey: context required");
1111
+ std::string context;
1112
+ if (!GetString(env, argv[0], &context) || context.empty())
1113
+ return ThrowJsError(env, "BLAKE3: context must be a non-empty string");
1114
+ Blake3Context* b = new Blake3Context();
1115
+ blake3_hasher_init_derive_key(&b->hasher, context.c_str());
1116
+ b->mode = 2;
1117
+ b->context = context;
1118
+ return MakeExternal(env, b);
1119
+ }
1120
+
1121
+ napi_value Blake3Update(napi_env env, napi_callback_info info) {
1122
+ size_t argc = 2;
1123
+ napi_value argv[2];
1124
+ napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1125
+ if (argc < 2) return ThrowJsError(env, "blake3Update: (state, data) required");
1126
+ Blake3Context* b = GetExternal<Blake3Context>(env, argv[0]);
1127
+ if (!b) return ThrowJsError(env, "Blake3 state not initialized");
1128
+ const uint8_t* data = nullptr;
1129
+ size_t len = 0;
1130
+ if (!GetData(env, argv[1], &data, &len))
1131
+ return ThrowJsError(env, "blake3Update: data must be a string, Buffer, or ArrayBuffer");
1132
+ if (len > 0) blake3_hasher_update(&b->hasher, data, len);
1133
+ napi_value undef;
1134
+ napi_get_undefined(env, &undef);
1135
+ return undef;
1136
+ }
1137
+
1138
+ napi_value Blake3Digest(napi_env env, napi_callback_info info) {
1139
+ size_t argc = 2;
1140
+ napi_value argv[2];
1141
+ napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1142
+ if (argc < 1) return ThrowJsError(env, "blake3Digest: state required");
1143
+ Blake3Context* b = GetExternal<Blake3Context>(env, argv[0]);
1144
+ if (!b) return ThrowJsError(env, "Blake3 state not initialized");
1145
+ uint64_t outLen = BLAKE3_OUT_LEN;
1146
+ if (argc >= 2) {
1147
+ napi_valuetype t;
1148
+ napi_typeof(env, argv[1], &t);
1149
+ if (t == napi_number && !GetUint64(env, argv[1], &outLen))
1150
+ return ThrowJsError(env, "Invalid BLAKE3 output length");
1151
+ }
1152
+ if (outLen == 0 || outLen > 0x7fffffff)
1153
+ return ThrowJsError(env, "Invalid BLAKE3 output length");
1154
+ // work on a copy so state stays usable (Node/Blake3 parity)
1155
+ Blake3Context copy = *b;
1156
+ std::vector<uint8_t> out(static_cast<size_t>(outLen));
1157
+ blake3_hasher_finalize(&copy.hasher, out.data(), out.size());
1158
+ return MakeArrayBuffer(env, out.data(), out.size());
1159
+ }
1160
+
1161
+ napi_value Blake3Copy(napi_env env, napi_callback_info info) {
1162
+ size_t argc = 1;
1163
+ napi_value argv[1];
1164
+ napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1165
+ if (argc < 1) return ThrowJsError(env, "blake3Copy: state required");
1166
+ Blake3Context* b = GetExternal<Blake3Context>(env, argv[0]);
1167
+ if (!b) return ThrowJsError(env, "Blake3 state not initialized");
1168
+ Blake3Context* copy = new Blake3Context(*b);
1169
+ return MakeExternal(env, copy);
1170
+ }
1171
+
1172
+ napi_value Blake3Reset(napi_env env, napi_callback_info info) {
1173
+ size_t argc = 1;
1174
+ napi_value argv[1];
1175
+ napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1176
+ if (argc < 1) return ThrowJsError(env, "blake3Reset: state required");
1177
+ Blake3Context* b = GetExternal<Blake3Context>(env, argv[0]);
1178
+ if (!b) return ThrowJsError(env, "Blake3 state not initialized");
1179
+ if (b->mode == 1)
1180
+ blake3_hasher_init_keyed(&b->hasher, b->key);
1181
+ else if (b->mode == 2) blake3_hasher_init_derive_key(&b->hasher, b->context.c_str());
1182
+ else blake3_hasher_init(&b->hasher);
1183
+ napi_value undef;
1184
+ napi_get_undefined(env, &undef);
1185
+ return undef;
1186
+ }
1187
+
1188
+ napi_value Blake3OneShot(napi_env env, napi_callback_info info) {
1189
+ size_t argc = 2;
1190
+ napi_value argv[2];
1191
+ napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1192
+ if (argc < 1) return ThrowJsError(env, "blake3: data required");
1193
+ const uint8_t* data = nullptr;
1194
+ size_t len = 0;
1195
+ if (!GetData(env, argv[0], &data, &len))
1196
+ return ThrowJsError(env, "blake3: data must be a string, Buffer, or ArrayBuffer");
1197
+ uint64_t outLen = BLAKE3_OUT_LEN;
1198
+ if (argc >= 2) GetUint64(env, argv[1], &outLen);
1199
+ if (outLen == 0 || outLen > 0x7fffffff)
1200
+ return ThrowJsError(env, "Invalid BLAKE3 output length");
1201
+ blake3_hasher hasher;
1202
+ blake3_hasher_init(&hasher);
1203
+ if (len > 0) blake3_hasher_update(&hasher, data, len);
1204
+ std::vector<uint8_t> out(static_cast<size_t>(outLen));
1205
+ blake3_hasher_finalize(&hasher, out.data(), out.size());
1206
+ return MakeArrayBuffer(env, out.data(), out.size());
1207
+ }
1208
+
1209
+ napi_value Blake3GetVersion(napi_env env, napi_callback_info) {
1210
+ return MakeArrayBuffer(env, reinterpret_cast<const uint8_t*>(BLAKE3_VERSION_STRING),
1211
+ strlen(BLAKE3_VERSION_STRING));
1212
+ }
1213
+
1214
+ // ---------------------------------------------------------------------------
1215
+ // Algorithm listings (mirrors getSupportedHashAlgorithms etc.)
1216
+ // ---------------------------------------------------------------------------
1217
+
1218
+ napi_value GetHashes(napi_env env, napi_callback_info) {
1219
+ std::vector<std::string> names;
1220
+ EVP_MD_do_all(
1221
+ [](const EVP_MD* md, const char* from, const char* to, void* arg) {
1222
+ (void)md; (void)to;
1223
+ auto* names = static_cast<std::vector<std::string>*>(arg);
1224
+ if (from && strchr(from, ':') == nullptr && strchr(from, '/') == nullptr &&
1225
+ std::find(names->begin(), names->end(), from) == names->end())
1226
+ names->push_back(from);
1227
+ },
1228
+ &names);
1229
+ napi_value arr;
1230
+ napi_create_array_with_length(env, names.size(), &arr);
1231
+ for (size_t i = 0; i < names.size(); i++) {
1232
+ napi_value s;
1233
+ napi_create_string_utf8(env, names[i].c_str(), names[i].size(), &s);
1234
+ napi_set_element(env, arr, static_cast<uint32_t>(i), s);
1235
+ }
1236
+ return arr;
1237
+ }
1238
+
1239
+ napi_value GetCiphers(napi_env env, napi_callback_info) {
1240
+ std::vector<std::string> names;
1241
+ EVP_CIPHER_do_all(
1242
+ [](const EVP_CIPHER* cipher, const char* from, const char* to, void* arg) {
1243
+ (void)cipher; (void)to;
1244
+ auto* names = static_cast<std::vector<std::string>*>(arg);
1245
+ if (from && strchr(from, ':') == nullptr && strchr(from, '/') == nullptr &&
1246
+ std::find(names->begin(), names->end(), from) == names->end())
1247
+ names->push_back(from);
1248
+ },
1249
+ &names);
1250
+ napi_value arr;
1251
+ napi_create_array_with_length(env, names.size(), &arr);
1252
+ for (size_t i = 0; i < names.size(); i++) {
1253
+ napi_value s;
1254
+ napi_create_string_utf8(env, names[i].c_str(), names[i].size(), &s);
1255
+ napi_set_element(env, arr, static_cast<uint32_t>(i), s);
1256
+ }
1257
+ return arr;
1258
+ }
1259
+
1260
+ // ---------------------------------------------------------------------------
1261
+ // module registration
1262
+ // ---------------------------------------------------------------------------
1263
+
1264
+ struct Property {
1265
+ const char* name;
1266
+ napi_callback fn;
1267
+ };
1268
+
1269
+ napi_value Init(napi_env env, napi_value exports) {
1270
+ const Property props[] = {
1271
+ {"hashCreate", HashCreate},
1272
+ {"hashUpdate", HashUpdate},
1273
+ {"hashDigest", HashDigest},
1274
+ {"hashCopy", HashCopy},
1275
+ {"hash", HashOneShot},
1276
+ {"hmacCreate", HmacCreate},
1277
+ {"hmacUpdate", HmacUpdate},
1278
+ {"hmacDigest", HmacDigest},
1279
+ {"hmac", HmacOneShot},
1280
+ {"randomBytes", RandomBytes},
1281
+ {"pbkdf2Sync", Pbkdf2Sync},
1282
+ {"scryptSync", ScryptSync},
1283
+ {"hkdfSync", HkdfSync},
1284
+ {"argon2Sync", Argon2Sync},
1285
+ {"timingSafeEqual", TimingSafeEqual},
1286
+ {"cipherCreate", CipherCreate},
1287
+ {"cipherUpdate", CipherUpdate},
1288
+ {"cipherSetAAD", CipherSetAAD},
1289
+ {"cipherSetAutoPadding", CipherSetAutoPadding},
1290
+ {"cipherFinal", CipherFinal},
1291
+ {"cipherGetAuthTag", CipherGetAuthTag},
1292
+ {"cipherSetAuthTag", CipherSetAuthTag},
1293
+ {"blake3InitHash", Blake3InitHash},
1294
+ {"blake3InitKeyed", Blake3InitKeyed},
1295
+ {"blake3InitDeriveKey", Blake3InitDeriveKey},
1296
+ {"blake3Update", Blake3Update},
1297
+ {"blake3Digest", Blake3Digest},
1298
+ {"blake3Copy", Blake3Copy},
1299
+ {"blake3Reset", Blake3Reset},
1300
+ {"blake3", Blake3OneShot},
1301
+ {"blake3GetVersion", Blake3GetVersion},
1302
+ {"getHashes", GetHashes},
1303
+ {"getCiphers", GetCiphers},
1304
+ };
1305
+ for (const auto& p : props) {
1306
+ napi_value fn;
1307
+ if (napi_create_function(env, p.name, NAPI_AUTO_LENGTH, p.fn, nullptr, &fn) != napi_ok)
1308
+ return nullptr;
1309
+ if (napi_set_named_property(env, exports, p.name, fn) != napi_ok) return nullptr;
1310
+ }
1311
+ return exports;
1312
+ }
1313
+
1314
+ } // namespace
1315
+
1316
+ NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)