react-native-quick-crypto 1.1.0 → 1.1.1

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 (687) hide show
  1. package/android/build.gradle +5 -1
  2. package/cpp/argon2/HybridArgon2.cpp +10 -3
  3. package/cpp/blake3/HybridBlake3.cpp +5 -3
  4. package/cpp/cipher/CCMCipher.cpp +29 -16
  5. package/cpp/cipher/CCMCipher.hpp +2 -4
  6. package/cpp/cipher/ChaCha20Cipher.cpp +14 -18
  7. package/cpp/cipher/ChaCha20Cipher.hpp +2 -4
  8. package/cpp/cipher/ChaCha20Poly1305Cipher.cpp +34 -23
  9. package/cpp/cipher/ChaCha20Poly1305Cipher.hpp +2 -4
  10. package/cpp/cipher/GCMCipher.cpp +14 -15
  11. package/cpp/cipher/HybridCipher.cpp +39 -36
  12. package/cpp/cipher/HybridCipher.hpp +17 -1
  13. package/cpp/cipher/HybridRsaCipher.cpp +74 -29
  14. package/cpp/cipher/OCBCipher.cpp +4 -3
  15. package/cpp/cipher/XChaCha20Poly1305Cipher.cpp +14 -13
  16. package/cpp/cipher/XSalsa20Cipher.cpp +72 -6
  17. package/cpp/cipher/XSalsa20Cipher.hpp +25 -3
  18. package/cpp/cipher/XSalsa20Poly1305Cipher.cpp +21 -25
  19. package/cpp/dh/HybridDiffieHellman.cpp +29 -0
  20. package/cpp/ec/HybridEcKeyPair.cpp +35 -33
  21. package/cpp/ec/HybridEcKeyPair.hpp +3 -7
  22. package/cpp/ecdh/HybridECDH.cpp +23 -0
  23. package/cpp/ed25519/HybridEdKeyPair.cpp +73 -117
  24. package/cpp/ed25519/HybridEdKeyPair.hpp +5 -9
  25. package/cpp/hash/HybridHash.cpp +5 -7
  26. package/cpp/hkdf/HybridHkdf.cpp +6 -4
  27. package/cpp/hmac/HybridHmac.cpp +4 -6
  28. package/cpp/kmac/HybridKmac.cpp +4 -4
  29. package/cpp/mldsa/HybridMlDsaKeyPair.cpp +37 -49
  30. package/cpp/mlkem/HybridMlKemKeyPair.cpp +39 -43
  31. package/cpp/pbkdf2/HybridPbkdf2.cpp +7 -8
  32. package/cpp/rsa/HybridRsaKeyPair.cpp +5 -8
  33. package/cpp/rsa/HybridRsaKeyPair.hpp +4 -7
  34. package/cpp/scrypt/HybridScrypt.cpp +6 -4
  35. package/cpp/sign/HybridSignHandle.cpp +25 -68
  36. package/cpp/sign/HybridVerifyHandle.cpp +23 -60
  37. package/cpp/utils/HybridUtils.cpp +183 -43
  38. package/cpp/utils/HybridUtils.hpp +9 -2
  39. package/cpp/utils/QuickCryptoUtils.hpp +72 -0
  40. package/lib/commonjs/argon2.js +51 -2
  41. package/lib/commonjs/argon2.js.map +1 -1
  42. package/lib/commonjs/cipher.js +109 -11
  43. package/lib/commonjs/cipher.js.map +1 -1
  44. package/lib/commonjs/dsa.js +8 -2
  45. package/lib/commonjs/dsa.js.map +1 -1
  46. package/lib/commonjs/hash.js +15 -5
  47. package/lib/commonjs/hash.js.map +1 -1
  48. package/lib/commonjs/hkdf.js +33 -6
  49. package/lib/commonjs/hkdf.js.map +1 -1
  50. package/lib/commonjs/hmac.js +15 -5
  51. package/lib/commonjs/hmac.js.map +1 -1
  52. package/lib/commonjs/keys/publicCipher.js +10 -4
  53. package/lib/commonjs/keys/publicCipher.js.map +1 -1
  54. package/lib/commonjs/random.js +11 -2
  55. package/lib/commonjs/random.js.map +1 -1
  56. package/lib/commonjs/rsa.js +12 -5
  57. package/lib/commonjs/rsa.js.map +1 -1
  58. package/lib/commonjs/scrypt.js +47 -6
  59. package/lib/commonjs/scrypt.js.map +1 -1
  60. package/lib/commonjs/subtle.js +76 -5
  61. package/lib/commonjs/subtle.js.map +1 -1
  62. package/lib/commonjs/utils/cipher.js +18 -7
  63. package/lib/commonjs/utils/cipher.js.map +1 -1
  64. package/lib/commonjs/utils/conversion.js +33 -9
  65. package/lib/commonjs/utils/conversion.js.map +1 -1
  66. package/lib/commonjs/utils/timingSafeEqual.js +7 -2
  67. package/lib/commonjs/utils/timingSafeEqual.js.map +1 -1
  68. package/lib/commonjs/x509certificate.js +6 -6
  69. package/lib/commonjs/x509certificate.js.map +1 -1
  70. package/lib/module/argon2.js +51 -2
  71. package/lib/module/argon2.js.map +1 -1
  72. package/lib/module/cipher.js +109 -11
  73. package/lib/module/cipher.js.map +1 -1
  74. package/lib/module/dsa.js +8 -2
  75. package/lib/module/dsa.js.map +1 -1
  76. package/lib/module/hash.js +15 -5
  77. package/lib/module/hash.js.map +1 -1
  78. package/lib/module/hkdf.js +33 -6
  79. package/lib/module/hkdf.js.map +1 -1
  80. package/lib/module/hmac.js +15 -5
  81. package/lib/module/hmac.js.map +1 -1
  82. package/lib/module/keys/publicCipher.js +10 -4
  83. package/lib/module/keys/publicCipher.js.map +1 -1
  84. package/lib/module/random.js +11 -2
  85. package/lib/module/random.js.map +1 -1
  86. package/lib/module/rsa.js +11 -4
  87. package/lib/module/rsa.js.map +1 -1
  88. package/lib/module/scrypt.js +47 -6
  89. package/lib/module/scrypt.js.map +1 -1
  90. package/lib/module/subtle.js +76 -5
  91. package/lib/module/subtle.js.map +1 -1
  92. package/lib/module/utils/cipher.js +18 -7
  93. package/lib/module/utils/cipher.js.map +1 -1
  94. package/lib/module/utils/conversion.js +33 -9
  95. package/lib/module/utils/conversion.js.map +1 -1
  96. package/lib/module/utils/timingSafeEqual.js +8 -3
  97. package/lib/module/utils/timingSafeEqual.js.map +1 -1
  98. package/lib/module/x509certificate.js +6 -6
  99. package/lib/module/x509certificate.js.map +1 -1
  100. package/lib/typescript/argon2.d.ts.map +1 -1
  101. package/lib/typescript/cipher.d.ts +2 -2
  102. package/lib/typescript/cipher.d.ts.map +1 -1
  103. package/lib/typescript/dsa.d.ts.map +1 -1
  104. package/lib/typescript/hash.d.ts +2 -2
  105. package/lib/typescript/hash.d.ts.map +1 -1
  106. package/lib/typescript/hkdf.d.ts.map +1 -1
  107. package/lib/typescript/hmac.d.ts +2 -2
  108. package/lib/typescript/hmac.d.ts.map +1 -1
  109. package/lib/typescript/index.d.ts +1 -1
  110. package/lib/typescript/index.d.ts.map +1 -1
  111. package/lib/typescript/keys/publicCipher.d.ts.map +1 -1
  112. package/lib/typescript/random.d.ts.map +1 -1
  113. package/lib/typescript/rsa.d.ts.map +1 -1
  114. package/lib/typescript/scrypt.d.ts.map +1 -1
  115. package/lib/typescript/specs/utils.nitro.d.ts +0 -2
  116. package/lib/typescript/specs/utils.nitro.d.ts.map +1 -1
  117. package/lib/typescript/subtle.d.ts.map +1 -1
  118. package/lib/typescript/utils/cipher.d.ts +13 -1
  119. package/lib/typescript/utils/cipher.d.ts.map +1 -1
  120. package/lib/typescript/utils/conversion.d.ts +9 -6
  121. package/lib/typescript/utils/conversion.d.ts.map +1 -1
  122. package/lib/typescript/utils/timingSafeEqual.d.ts.map +1 -1
  123. package/lib/typescript/x509certificate.d.ts.map +1 -1
  124. package/nitrogen/generated/shared/c++/HybridUtilsSpec.cpp +0 -2
  125. package/nitrogen/generated/shared/c++/HybridUtilsSpec.hpp +0 -3
  126. package/package.json +37 -5
  127. package/src/argon2.ts +80 -2
  128. package/src/cipher.ts +139 -15
  129. package/src/dsa.ts +11 -2
  130. package/src/hash.ts +17 -7
  131. package/src/hkdf.ts +44 -6
  132. package/src/hmac.ts +17 -7
  133. package/src/keys/publicCipher.ts +10 -4
  134. package/src/random.ts +11 -2
  135. package/src/rsa.ts +18 -4
  136. package/src/scrypt.ts +73 -6
  137. package/src/specs/utils.nitro.ts +0 -2
  138. package/src/subtle.ts +90 -8
  139. package/src/utils/cipher.ts +30 -8
  140. package/src/utils/conversion.ts +58 -20
  141. package/src/utils/timingSafeEqual.ts +8 -3
  142. package/src/x509certificate.ts +5 -6
  143. package/deps/blake3/.cargo/config.toml +0 -2
  144. package/deps/blake3/.git-blame-ignore-revs +0 -2
  145. package/deps/blake3/.github/workflows/build_b3sum.py +0 -38
  146. package/deps/blake3/.github/workflows/ci.yml +0 -491
  147. package/deps/blake3/.github/workflows/tag.yml +0 -43
  148. package/deps/blake3/.github/workflows/upload_github_release_asset.py +0 -73
  149. package/deps/blake3/CONTRIBUTING.md +0 -31
  150. package/deps/blake3/Cargo.toml +0 -135
  151. package/deps/blake3/b3sum/Cargo.lock +0 -513
  152. package/deps/blake3/b3sum/Cargo.toml +0 -26
  153. package/deps/blake3/b3sum/README.md +0 -72
  154. package/deps/blake3/b3sum/src/main.rs +0 -564
  155. package/deps/blake3/b3sum/src/unit_tests.rs +0 -235
  156. package/deps/blake3/b3sum/tests/cli_tests.rs +0 -680
  157. package/deps/blake3/b3sum/what_does_check_do.md +0 -176
  158. package/deps/blake3/benches/bench.rs +0 -623
  159. package/deps/blake3/build.rs +0 -389
  160. package/deps/blake3/c/CMakeLists.txt +0 -383
  161. package/deps/blake3/c/CMakePresets.json +0 -73
  162. package/deps/blake3/c/Makefile.testing +0 -82
  163. package/deps/blake3/c/blake3-config.cmake.in +0 -14
  164. package/deps/blake3/c/blake3_avx2.c +0 -326
  165. package/deps/blake3/c/blake3_avx2_x86-64_unix.S +0 -1815
  166. package/deps/blake3/c/blake3_avx2_x86-64_windows_gnu.S +0 -1817
  167. package/deps/blake3/c/blake3_avx2_x86-64_windows_msvc.asm +0 -1828
  168. package/deps/blake3/c/blake3_avx512.c +0 -1388
  169. package/deps/blake3/c/blake3_avx512_x86-64_unix.S +0 -4824
  170. package/deps/blake3/c/blake3_avx512_x86-64_windows_gnu.S +0 -2615
  171. package/deps/blake3/c/blake3_avx512_x86-64_windows_msvc.asm +0 -2634
  172. package/deps/blake3/c/blake3_c_rust_bindings/Cargo.toml +0 -32
  173. package/deps/blake3/c/blake3_c_rust_bindings/README.md +0 -4
  174. package/deps/blake3/c/blake3_c_rust_bindings/benches/bench.rs +0 -477
  175. package/deps/blake3/c/blake3_c_rust_bindings/build.rs +0 -253
  176. package/deps/blake3/c/blake3_c_rust_bindings/cross_test.sh +0 -31
  177. package/deps/blake3/c/blake3_c_rust_bindings/src/lib.rs +0 -333
  178. package/deps/blake3/c/blake3_c_rust_bindings/src/test.rs +0 -696
  179. package/deps/blake3/c/blake3_sse2.c +0 -566
  180. package/deps/blake3/c/blake3_sse2_x86-64_unix.S +0 -2291
  181. package/deps/blake3/c/blake3_sse2_x86-64_windows_gnu.S +0 -2332
  182. package/deps/blake3/c/blake3_sse2_x86-64_windows_msvc.asm +0 -2350
  183. package/deps/blake3/c/blake3_sse41.c +0 -560
  184. package/deps/blake3/c/blake3_sse41_x86-64_unix.S +0 -2028
  185. package/deps/blake3/c/blake3_sse41_x86-64_windows_gnu.S +0 -2069
  186. package/deps/blake3/c/blake3_sse41_x86-64_windows_msvc.asm +0 -2089
  187. package/deps/blake3/c/blake3_tbb.cpp +0 -37
  188. package/deps/blake3/c/dependencies/CMakeLists.txt +0 -3
  189. package/deps/blake3/c/dependencies/tbb/CMakeLists.txt +0 -28
  190. package/deps/blake3/c/example.c +0 -36
  191. package/deps/blake3/c/example_tbb.c +0 -57
  192. package/deps/blake3/c/libblake3.pc.in +0 -12
  193. package/deps/blake3/c/main.c +0 -166
  194. package/deps/blake3/c/test.py +0 -97
  195. package/deps/blake3/media/B3.svg +0 -70
  196. package/deps/blake3/media/BLAKE3.svg +0 -85
  197. package/deps/blake3/media/speed.svg +0 -1474
  198. package/deps/blake3/reference_impl/Cargo.toml +0 -8
  199. package/deps/blake3/reference_impl/README.md +0 -14
  200. package/deps/blake3/reference_impl/reference_impl.rs +0 -374
  201. package/deps/blake3/src/ffi_avx2.rs +0 -65
  202. package/deps/blake3/src/ffi_avx512.rs +0 -169
  203. package/deps/blake3/src/ffi_neon.rs +0 -82
  204. package/deps/blake3/src/ffi_sse2.rs +0 -126
  205. package/deps/blake3/src/ffi_sse41.rs +0 -126
  206. package/deps/blake3/src/guts.rs +0 -60
  207. package/deps/blake3/src/hazmat.rs +0 -704
  208. package/deps/blake3/src/io.rs +0 -64
  209. package/deps/blake3/src/join.rs +0 -92
  210. package/deps/blake3/src/lib.rs +0 -1835
  211. package/deps/blake3/src/platform.rs +0 -587
  212. package/deps/blake3/src/portable.rs +0 -198
  213. package/deps/blake3/src/rust_avx2.rs +0 -474
  214. package/deps/blake3/src/rust_sse2.rs +0 -775
  215. package/deps/blake3/src/rust_sse41.rs +0 -766
  216. package/deps/blake3/src/test.rs +0 -1049
  217. package/deps/blake3/src/traits.rs +0 -227
  218. package/deps/blake3/src/wasm32_simd.rs +0 -794
  219. package/deps/blake3/test_vectors/Cargo.toml +0 -19
  220. package/deps/blake3/test_vectors/cross_test.sh +0 -25
  221. package/deps/blake3/test_vectors/src/bin/generate.rs +0 -4
  222. package/deps/blake3/test_vectors/src/lib.rs +0 -350
  223. package/deps/blake3/test_vectors/test_vectors.json +0 -217
  224. package/deps/blake3/tools/compiler_version/Cargo.toml +0 -7
  225. package/deps/blake3/tools/compiler_version/build.rs +0 -6
  226. package/deps/blake3/tools/compiler_version/src/main.rs +0 -27
  227. package/deps/blake3/tools/instruction_set_support/Cargo.toml +0 -6
  228. package/deps/blake3/tools/instruction_set_support/src/main.rs +0 -10
  229. package/deps/blake3/tools/release.md +0 -16
  230. package/deps/ncrypto/.bazelignore +0 -4
  231. package/deps/ncrypto/.bazelrc +0 -1
  232. package/deps/ncrypto/.bazelversion +0 -1
  233. package/deps/ncrypto/.clang-format +0 -111
  234. package/deps/ncrypto/.github/workflows/bazel.yml +0 -58
  235. package/deps/ncrypto/.github/workflows/commitlint.yml +0 -16
  236. package/deps/ncrypto/.github/workflows/linter.yml +0 -38
  237. package/deps/ncrypto/.github/workflows/macos.yml +0 -43
  238. package/deps/ncrypto/.github/workflows/release-please.yml +0 -16
  239. package/deps/ncrypto/.github/workflows/ubuntu.yml +0 -128
  240. package/deps/ncrypto/.github/workflows/visual-studio.yml +0 -49
  241. package/deps/ncrypto/.python-version +0 -1
  242. package/deps/ncrypto/.release-please-manifest.json +0 -3
  243. package/deps/ncrypto/BUILD.bazel +0 -44
  244. package/deps/ncrypto/CHANGELOG.md +0 -37
  245. package/deps/ncrypto/CMakeLists.txt +0 -79
  246. package/deps/ncrypto/MODULE.bazel +0 -16
  247. package/deps/ncrypto/MODULE.bazel.lock +0 -461
  248. package/deps/ncrypto/cmake/CPM.cmake +0 -1225
  249. package/deps/ncrypto/cmake/ncrypto-flags.cmake +0 -17
  250. package/deps/ncrypto/ncrypto.pc.in +0 -10
  251. package/deps/ncrypto/patches/0001-Expose-libdecrepit-so-NodeJS-can-use-it-for-ncrypto.patch +0 -28
  252. package/deps/ncrypto/pyproject.toml +0 -38
  253. package/deps/ncrypto/release-please-config.json +0 -11
  254. package/deps/ncrypto/src/CMakeLists.txt +0 -40
  255. package/deps/ncrypto/tests/BUILD.bazel +0 -11
  256. package/deps/ncrypto/tests/CMakeLists.txt +0 -7
  257. package/deps/ncrypto/tests/basic.cpp +0 -856
  258. package/deps/ncrypto/tools/run-clang-format.sh +0 -42
  259. package/deps/simdutf/.clang-format +0 -4
  260. package/deps/simdutf/.github/ISSUE_TEMPLATE/bug_report.md +0 -62
  261. package/deps/simdutf/.github/ISSUE_TEMPLATE/config.yml +0 -1
  262. package/deps/simdutf/.github/ISSUE_TEMPLATE/feature_request.md +0 -35
  263. package/deps/simdutf/.github/ISSUE_TEMPLATE/standard-issue-template.md +0 -29
  264. package/deps/simdutf/.github/pull_request_template.md +0 -51
  265. package/deps/simdutf/.github/workflows/aarch64.yml +0 -39
  266. package/deps/simdutf/.github/workflows/alpine.yml +0 -27
  267. package/deps/simdutf/.github/workflows/amalgamation_demos.yml +0 -34
  268. package/deps/simdutf/.github/workflows/armv7.yml +0 -32
  269. package/deps/simdutf/.github/workflows/atomic_fuzz.yml +0 -25
  270. package/deps/simdutf/.github/workflows/cifuzz.yml +0 -37
  271. package/deps/simdutf/.github/workflows/clangformat.yml +0 -36
  272. package/deps/simdutf/.github/workflows/debian-latestcxxstandards.yml +0 -40
  273. package/deps/simdutf/.github/workflows/debian.yml +0 -33
  274. package/deps/simdutf/.github/workflows/documentation.yml +0 -36
  275. package/deps/simdutf/.github/workflows/emscripten.yml +0 -19
  276. package/deps/simdutf/.github/workflows/loongarch64-gcc-14.2.yml +0 -39
  277. package/deps/simdutf/.github/workflows/macos-latest.yml +0 -29
  278. package/deps/simdutf/.github/workflows/msys2-clang.yml +0 -48
  279. package/deps/simdutf/.github/workflows/msys2.yml +0 -50
  280. package/deps/simdutf/.github/workflows/ppc64le.yml +0 -29
  281. package/deps/simdutf/.github/workflows/rvv-1024-clang-18.yml +0 -35
  282. package/deps/simdutf/.github/workflows/rvv-128-clang-17.yml +0 -35
  283. package/deps/simdutf/.github/workflows/rvv-256-gcc-14.yml +0 -31
  284. package/deps/simdutf/.github/workflows/s390x.yml +0 -29
  285. package/deps/simdutf/.github/workflows/selective-amalgamation.yml +0 -29
  286. package/deps/simdutf/.github/workflows/typos.yml +0 -19
  287. package/deps/simdutf/.github/workflows/ubuntu22-cxx20.yml +0 -30
  288. package/deps/simdutf/.github/workflows/ubuntu22.yml +0 -32
  289. package/deps/simdutf/.github/workflows/ubuntu22_gcc12.yml +0 -27
  290. package/deps/simdutf/.github/workflows/ubuntu22sani.yml +0 -29
  291. package/deps/simdutf/.github/workflows/ubuntu24-cxxstandards.yml +0 -34
  292. package/deps/simdutf/.github/workflows/ubuntu24-unsignedchar.yml +0 -34
  293. package/deps/simdutf/.github/workflows/ubuntu24.yml +0 -32
  294. package/deps/simdutf/.github/workflows/ubuntu24sani.yml +0 -36
  295. package/deps/simdutf/.github/workflows/ubuntu24sani_clang.yml +0 -29
  296. package/deps/simdutf/.github/workflows/vs17-arm-ci.yml +0 -21
  297. package/deps/simdutf/.github/workflows/vs17-ci-cxx20.yml +0 -41
  298. package/deps/simdutf/.github/workflows/vs17-ci.yml +0 -41
  299. package/deps/simdutf/.github/workflows/vs17-clang-ci.yml +0 -41
  300. package/deps/simdutf/.github/workflows/vs17-cxxstandards.yml +0 -36
  301. package/deps/simdutf/AI_USAGE_POLICY.md +0 -56
  302. package/deps/simdutf/AUTHORS +0 -6
  303. package/deps/simdutf/CMakeLists.txt +0 -231
  304. package/deps/simdutf/CONTRIBUTING.md +0 -214
  305. package/deps/simdutf/CONTRIBUTORS +0 -1
  306. package/deps/simdutf/Doxyfile +0 -2584
  307. package/deps/simdutf/Makefile.crosscompile +0 -54
  308. package/deps/simdutf/README-RVV.md +0 -16
  309. package/deps/simdutf/SECURITY.md +0 -8
  310. package/deps/simdutf/benchmarks/CMakeLists.txt +0 -101
  311. package/deps/simdutf/benchmarks/alignment.cpp +0 -150
  312. package/deps/simdutf/benchmarks/base64/CMakeLists.txt +0 -30
  313. package/deps/simdutf/benchmarks/base64/benchmark_base64.cpp +0 -875
  314. package/deps/simdutf/benchmarks/base64/libbase64_spaces.h +0 -49
  315. package/deps/simdutf/benchmarks/base64/node_base64.h +0 -227
  316. package/deps/simdutf/benchmarks/base64/openssl3_base64.h +0 -334
  317. package/deps/simdutf/benchmarks/benchmark.cpp +0 -65
  318. package/deps/simdutf/benchmarks/benchmark_to_well_formed_utf16.cpp +0 -347
  319. package/deps/simdutf/benchmarks/competition/.clang-format-ignore +0 -5
  320. package/deps/simdutf/benchmarks/competition/CppCon2018/utf_utils.cpp +0 -1276
  321. package/deps/simdutf/benchmarks/competition/CppCon2018/utf_utils.h +0 -595
  322. package/deps/simdutf/benchmarks/competition/README.md +0 -7
  323. package/deps/simdutf/benchmarks/competition/hoehrmann/hoehrmann.h +0 -91
  324. package/deps/simdutf/benchmarks/competition/inoue2008/inoue_utf8_to_utf16.h +0 -444
  325. package/deps/simdutf/benchmarks/competition/inoue2008/inoue_utf8_to_utf16_tables.h +0 -13183
  326. package/deps/simdutf/benchmarks/competition/inoue2008/script.py +0 -73
  327. package/deps/simdutf/benchmarks/competition/llvm/ConvertUTF.cpp +0 -738
  328. package/deps/simdutf/benchmarks/competition/llvm/ConvertUTF.h +0 -293
  329. package/deps/simdutf/benchmarks/competition/u8u16/COPYRIGHT +0 -8
  330. package/deps/simdutf/benchmarks/competition/u8u16/Makefile +0 -44
  331. package/deps/simdutf/benchmarks/competition/u8u16/OSL3.0.txt +0 -169
  332. package/deps/simdutf/benchmarks/competition/u8u16/Profiling/BOM_Profiler.h +0 -148
  333. package/deps/simdutf/benchmarks/competition/u8u16/Profiling/i386_timer.h +0 -45
  334. package/deps/simdutf/benchmarks/competition/u8u16/Profiling/ppc_timer.c +0 -34
  335. package/deps/simdutf/benchmarks/competition/u8u16/README +0 -56
  336. package/deps/simdutf/benchmarks/competition/u8u16/config/config_defs.h +0 -43
  337. package/deps/simdutf/benchmarks/competition/u8u16/config/g4_config.h +0 -27
  338. package/deps/simdutf/benchmarks/competition/u8u16/config/mmx_config.h +0 -16
  339. package/deps/simdutf/benchmarks/competition/u8u16/config/p4_config.h +0 -18
  340. package/deps/simdutf/benchmarks/competition/u8u16/config/p4_ideal_config.h +0 -16
  341. package/deps/simdutf/benchmarks/competition/u8u16/config/spu_config.h +0 -28
  342. package/deps/simdutf/benchmarks/competition/u8u16/config/ssse3_config.h +0 -20
  343. package/deps/simdutf/benchmarks/competition/u8u16/iconv_u8u16.c +0 -2
  344. package/deps/simdutf/benchmarks/competition/u8u16/lib/altivec_simd.h +0 -440
  345. package/deps/simdutf/benchmarks/competition/u8u16/lib/libgen/make_basic_ops.py +0 -121
  346. package/deps/simdutf/benchmarks/competition/u8u16/lib/libgen/make_half_operand_versions.py +0 -158
  347. package/deps/simdutf/benchmarks/competition/u8u16/lib/libgen/make_test.py +0 -270
  348. package/deps/simdutf/benchmarks/competition/u8u16/lib/mmx_simd.h +0 -141
  349. package/deps/simdutf/benchmarks/competition/u8u16/lib/mmx_simd_basic.h +0 -216
  350. package/deps/simdutf/benchmarks/competition/u8u16/lib/mmx_simd_built_in.h +0 -119
  351. package/deps/simdutf/benchmarks/competition/u8u16/lib/mmx_simd_modified.h +0 -2430
  352. package/deps/simdutf/benchmarks/competition/u8u16/lib/outline.txt +0 -39
  353. package/deps/simdutf/benchmarks/competition/u8u16/lib/spu_simd.h +0 -421
  354. package/deps/simdutf/benchmarks/competition/u8u16/lib/sse_simd.h +0 -836
  355. package/deps/simdutf/benchmarks/competition/u8u16/lib/stdint.h +0 -222
  356. package/deps/simdutf/benchmarks/competition/u8u16/libu8u16_BE.c +0 -4
  357. package/deps/simdutf/benchmarks/competition/u8u16/libu8u16_LE.c +0 -5
  358. package/deps/simdutf/benchmarks/competition/u8u16/proto/u8u16.py +0 -390
  359. package/deps/simdutf/benchmarks/competition/u8u16/src/Makefile +0 -18
  360. package/deps/simdutf/benchmarks/competition/u8u16/src/bytelex.h +0 -448
  361. package/deps/simdutf/benchmarks/competition/u8u16/src/charsets/ASCII_EBCDIC.h +0 -284
  362. package/deps/simdutf/benchmarks/competition/u8u16/src/libu8u16.c +0 -1975
  363. package/deps/simdutf/benchmarks/competition/u8u16/src/libu8u16.pdf +0 -0
  364. package/deps/simdutf/benchmarks/competition/u8u16/src/libu8u16.w +0 -2263
  365. package/deps/simdutf/benchmarks/competition/u8u16/src/multiliteral.h +0 -239
  366. package/deps/simdutf/benchmarks/competition/u8u16/src/u8u16.c +0 -232
  367. package/deps/simdutf/benchmarks/competition/u8u16/src/x8x16.c +0 -194
  368. package/deps/simdutf/benchmarks/competition/u8u16/src/xml_error.c +0 -193
  369. package/deps/simdutf/benchmarks/competition/u8u16/src/xml_error.h +0 -167
  370. package/deps/simdutf/benchmarks/competition/u8u16/src/xmldecl.c +0 -288
  371. package/deps/simdutf/benchmarks/competition/u8u16/src/xmldecl.h +0 -117
  372. package/deps/simdutf/benchmarks/competition/u8u16/u8u16_g4.c +0 -2
  373. package/deps/simdutf/benchmarks/competition/u8u16/u8u16_mmx.c +0 -2
  374. package/deps/simdutf/benchmarks/competition/u8u16/u8u16_p4.c +0 -3
  375. package/deps/simdutf/benchmarks/competition/u8u16/u8u16_p4_ideal.c +0 -2
  376. package/deps/simdutf/benchmarks/competition/u8u16/u8u16_spu.c +0 -2
  377. package/deps/simdutf/benchmarks/competition/u8u16/u8u16_ssse3.c +0 -3
  378. package/deps/simdutf/benchmarks/competition/u8u16/x8x16_p4.c +0 -2
  379. package/deps/simdutf/benchmarks/competition/utf8lut/LICENSE +0 -23
  380. package/deps/simdutf/benchmarks/competition/utf8lut/data/test_minimal.txt +0 -44
  381. package/deps/simdutf/benchmarks/competition/utf8lut/readme.md +0 -106
  382. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_clang_corr_tests.cmd +0 -11
  383. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_clang_corr_tests.sh +0 -13
  384. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_gcc_corr_tests.sh +0 -13
  385. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_gcc_example.sh +0 -13
  386. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_gcc_file_conv.sh +0 -14
  387. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_gcc_iconv_lib.sh +0 -11
  388. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_gcc_iconv_sample.sh +0 -8
  389. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_mingw_corr_tests.cmd +0 -12
  390. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_mingw_example.cmd +0 -13
  391. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_mingw_file_conv.cmd +0 -14
  392. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_mingw_iconv_lib.cmd +0 -11
  393. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_mingw_iconv_sample.cmd +0 -8
  394. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_msvc_corr_tests.cmd +0 -11
  395. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_msvc_example.cmd +0 -12
  396. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_msvc_file_conv.cmd +0 -13
  397. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_msvc_iconv_lib.cmd +0 -10
  398. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_msvc_iconv_sample.cmd +0 -9
  399. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/html_table.py +0 -25
  400. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/measure.py +0 -94
  401. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/resize.py +0 -20
  402. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/wipe_all.cmd +0 -2
  403. package/deps/simdutf/benchmarks/competition/utf8lut/scripts/wipe_interm.cmd +0 -1
  404. package/deps/simdutf/benchmarks/competition/utf8lut/src/base/CustomMemcpy.h +0 -75
  405. package/deps/simdutf/benchmarks/competition/utf8lut/src/base/PerfDefs.h +0 -47
  406. package/deps/simdutf/benchmarks/competition/utf8lut/src/base/Timing.cpp +0 -17
  407. package/deps/simdutf/benchmarks/competition/utf8lut/src/base/Timing.h +0 -76
  408. package/deps/simdutf/benchmarks/competition/utf8lut/src/buffer/AllProcessors.cpp +0 -35
  409. package/deps/simdutf/benchmarks/competition/utf8lut/src/buffer/BaseBufferProcessor.cpp +0 -117
  410. package/deps/simdutf/benchmarks/competition/utf8lut/src/buffer/BaseBufferProcessor.h +0 -210
  411. package/deps/simdutf/benchmarks/competition/utf8lut/src/buffer/BufferDecoder.h +0 -158
  412. package/deps/simdutf/benchmarks/competition/utf8lut/src/buffer/BufferEncoder.h +0 -104
  413. package/deps/simdutf/benchmarks/competition/utf8lut/src/buffer/ProcessorPlugins.h +0 -334
  414. package/deps/simdutf/benchmarks/competition/utf8lut/src/buffer/ProcessorSelector.h +0 -186
  415. package/deps/simdutf/benchmarks/competition/utf8lut/src/core/DecoderLut.cpp +0 -140
  416. package/deps/simdutf/benchmarks/competition/utf8lut/src/core/DecoderLut.h +0 -42
  417. package/deps/simdutf/benchmarks/competition/utf8lut/src/core/DecoderProcess.h +0 -100
  418. package/deps/simdutf/benchmarks/competition/utf8lut/src/core/Dfa.h +0 -57
  419. package/deps/simdutf/benchmarks/competition/utf8lut/src/core/EncoderLut.cpp +0 -85
  420. package/deps/simdutf/benchmarks/competition/utf8lut/src/core/EncoderLut.h +0 -27
  421. package/deps/simdutf/benchmarks/competition/utf8lut/src/core/EncoderProcess.h +0 -126
  422. package/deps/simdutf/benchmarks/competition/utf8lut/src/core/ProcessTrivial.h +0 -108
  423. package/deps/simdutf/benchmarks/competition/utf8lut/src/iconv/iconv.cpp +0 -139
  424. package/deps/simdutf/benchmarks/competition/utf8lut/src/iconv/iconv.h +0 -74
  425. package/deps/simdutf/benchmarks/competition/utf8lut/src/message/MessageConverter.cpp +0 -65
  426. package/deps/simdutf/benchmarks/competition/utf8lut/src/message/MessageConverter.h +0 -91
  427. package/deps/simdutf/benchmarks/competition/utf8lut/src/tests/CorrectnessTests.cpp +0 -772
  428. package/deps/simdutf/benchmarks/competition/utf8lut/src/tests/Example.cpp +0 -12
  429. package/deps/simdutf/benchmarks/competition/utf8lut/src/tests/FileConverter.cpp +0 -486
  430. package/deps/simdutf/benchmarks/competition/utf8lut/src/tests/iconv_sample.c +0 -162
  431. package/deps/simdutf/benchmarks/competition/utf8lut/src/utf8lut.h +0 -15
  432. package/deps/simdutf/benchmarks/competition/utf8sse4/fromutf8-sse.cpp +0 -292
  433. package/deps/simdutf/benchmarks/competition/utfcpp/LICENSE +0 -23
  434. package/deps/simdutf/benchmarks/competition/utfcpp/README.md +0 -1503
  435. package/deps/simdutf/benchmarks/competition/utfcpp/source/utf8/checked.h +0 -335
  436. package/deps/simdutf/benchmarks/competition/utfcpp/source/utf8/core.h +0 -338
  437. package/deps/simdutf/benchmarks/competition/utfcpp/source/utf8/cpp11.h +0 -103
  438. package/deps/simdutf/benchmarks/competition/utfcpp/source/utf8/cpp17.h +0 -103
  439. package/deps/simdutf/benchmarks/competition/utfcpp/source/utf8/unchecked.h +0 -274
  440. package/deps/simdutf/benchmarks/competition/utfcpp/source/utf8.h +0 -34
  441. package/deps/simdutf/benchmarks/dataset/README.md +0 -155
  442. package/deps/simdutf/benchmarks/dataset/emoji.txt +0 -204
  443. package/deps/simdutf/benchmarks/dataset/scripts/utf8type.py +0 -40
  444. package/deps/simdutf/benchmarks/dataset/wikipedia_mars/Makefile +0 -80
  445. package/deps/simdutf/benchmarks/dataset/wikipedia_mars/convert_to_utf6.py +0 -20
  446. package/deps/simdutf/benchmarks/find/CMakeLists.txt +0 -6
  447. package/deps/simdutf/benchmarks/find/findbenchmark.cpp +0 -63
  448. package/deps/simdutf/benchmarks/find/findbenchmarker.h +0 -46
  449. package/deps/simdutf/benchmarks/shortbench.cpp +0 -555
  450. package/deps/simdutf/benchmarks/src/CMakeLists.txt +0 -52
  451. package/deps/simdutf/benchmarks/src/apple_arm_events.h +0 -1104
  452. package/deps/simdutf/benchmarks/src/benchmark.cpp +0 -3899
  453. package/deps/simdutf/benchmarks/src/benchmark.h +0 -317
  454. package/deps/simdutf/benchmarks/src/benchmark_base.cpp +0 -144
  455. package/deps/simdutf/benchmarks/src/benchmark_base.h +0 -98
  456. package/deps/simdutf/benchmarks/src/cmdline.cpp +0 -176
  457. package/deps/simdutf/benchmarks/src/cmdline.h +0 -35
  458. package/deps/simdutf/benchmarks/src/event_counter.h +0 -162
  459. package/deps/simdutf/benchmarks/src/linux-perf-events.h +0 -104
  460. package/deps/simdutf/benchmarks/stream.cpp +0 -209
  461. package/deps/simdutf/benchmarks/threaded.cpp +0 -123
  462. package/deps/simdutf/cmake/CPM.cmake +0 -1363
  463. package/deps/simdutf/cmake/JoinPaths.cmake +0 -23
  464. package/deps/simdutf/cmake/add_cpp_test.cmake +0 -68
  465. package/deps/simdutf/cmake/simdutf-config.cmake.in +0 -2
  466. package/deps/simdutf/cmake/simdutf-flags.cmake +0 -26
  467. package/deps/simdutf/cmake/toolchains-ci/riscv64-linux-gnu.cmake +0 -4
  468. package/deps/simdutf/cmake/toolchains-dev/README.md +0 -32
  469. package/deps/simdutf/cmake/toolchains-dev/aarch64.cmake +0 -14
  470. package/deps/simdutf/cmake/toolchains-dev/loongarch64.cmake +0 -22
  471. package/deps/simdutf/cmake/toolchains-dev/powerpc64.cmake +0 -16
  472. package/deps/simdutf/cmake/toolchains-dev/powerpc64le.cmake +0 -16
  473. package/deps/simdutf/cmake/toolchains-dev/riscv64.cmake +0 -16
  474. package/deps/simdutf/cmake/toolchains-dev/rvv-spike.cmake +0 -38
  475. package/deps/simdutf/doc/avx512.png +0 -0
  476. package/deps/simdutf/doc/logo.png +0 -0
  477. package/deps/simdutf/doc/logo.svg +0 -165
  478. package/deps/simdutf/doc/node2023.png +0 -0
  479. package/deps/simdutf/doc/shortinput.md +0 -78
  480. package/deps/simdutf/doc/utf16utf8.png +0 -0
  481. package/deps/simdutf/doc/utf8utf16.png +0 -0
  482. package/deps/simdutf/doc/widelogo.png +0 -0
  483. package/deps/simdutf/doxygen.py +0 -50
  484. package/deps/simdutf/fuzz/.clang-format +0 -9
  485. package/deps/simdutf/fuzz/CMakeLists.txt +0 -45
  486. package/deps/simdutf/fuzz/README.md +0 -168
  487. package/deps/simdutf/fuzz/atomic_base64.cpp +0 -448
  488. package/deps/simdutf/fuzz/base64.cpp +0 -278
  489. package/deps/simdutf/fuzz/build.sh +0 -83
  490. package/deps/simdutf/fuzz/conversion.cpp +0 -669
  491. package/deps/simdutf/fuzz/helpers/.clang-format-ignore +0 -1
  492. package/deps/simdutf/fuzz/helpers/common.h +0 -135
  493. package/deps/simdutf/fuzz/helpers/nameof.hpp +0 -1258
  494. package/deps/simdutf/fuzz/main.cpp +0 -72
  495. package/deps/simdutf/fuzz/minimize_and_cleanse.sh +0 -87
  496. package/deps/simdutf/fuzz/misc.cpp +0 -216
  497. package/deps/simdutf/fuzz/random_fuzz.sh +0 -154
  498. package/deps/simdutf/fuzz/roundtrip.cpp +0 -588
  499. package/deps/simdutf/fuzz/safe_conversion.cpp +0 -104
  500. package/deps/simdutf/riscv/Dockerfile +0 -16
  501. package/deps/simdutf/riscv/README.md +0 -24
  502. package/deps/simdutf/riscv/remove-docker-station +0 -8
  503. package/deps/simdutf/riscv/run-docker-station +0 -31
  504. package/deps/simdutf/scripts/.flake8 +0 -2
  505. package/deps/simdutf/scripts/Makefile +0 -2
  506. package/deps/simdutf/scripts/README_ADD_FUNCTION.md +0 -49
  507. package/deps/simdutf/scripts/add_function.py +0 -330
  508. package/deps/simdutf/scripts/amalgamation_tests.py +0 -156
  509. package/deps/simdutf/scripts/base64/Makefile +0 -2
  510. package/deps/simdutf/scripts/base64/README.md +0 -2
  511. package/deps/simdutf/scripts/base64/avx512.py +0 -76
  512. package/deps/simdutf/scripts/base64/neon_decode.py +0 -143
  513. package/deps/simdutf/scripts/base64/neon_generate_lut.py +0 -101
  514. package/deps/simdutf/scripts/base64/sse.py +0 -252
  515. package/deps/simdutf/scripts/base64/sseregular.py +0 -160
  516. package/deps/simdutf/scripts/base64/sseurl.py +0 -283
  517. package/deps/simdutf/scripts/base64/table.py +0 -59
  518. package/deps/simdutf/scripts/base64bench_print.py +0 -145
  519. package/deps/simdutf/scripts/benchmark-all.py +0 -119
  520. package/deps/simdutf/scripts/benchmark_print.py +0 -324
  521. package/deps/simdutf/scripts/check_feature_macros.py +0 -156
  522. package/deps/simdutf/scripts/check_typos.sh +0 -13
  523. package/deps/simdutf/scripts/clang_format.sh +0 -35
  524. package/deps/simdutf/scripts/clang_format_docker.sh +0 -38
  525. package/deps/simdutf/scripts/common.py +0 -24
  526. package/deps/simdutf/scripts/compilation_benchmark.py +0 -55
  527. package/deps/simdutf/scripts/compile_many_variations.sh +0 -64
  528. package/deps/simdutf/scripts/create_latex_table.py +0 -62
  529. package/deps/simdutf/scripts/docker/Dockerfile +0 -14
  530. package/deps/simdutf/scripts/docker/Makefile +0 -9
  531. package/deps/simdutf/scripts/docker/README.md +0 -30
  532. package/deps/simdutf/scripts/docker/llvm.gpg +0 -0
  533. package/deps/simdutf/scripts/ppc64_convert_utf16_to_utf8.py +0 -155
  534. package/deps/simdutf/scripts/prepare_doxygen.sh +0 -21
  535. package/deps/simdutf/scripts/release.py +0 -197
  536. package/deps/simdutf/scripts/shortinputplots.py +0 -97
  537. package/deps/simdutf/scripts/sse_convert_utf16_to_utf8.py +0 -422
  538. package/deps/simdutf/scripts/sse_convert_utf32_to_utf16.py +0 -105
  539. package/deps/simdutf/scripts/sse_utf8_utf16_decode.py +0 -186
  540. package/deps/simdutf/scripts/sse_validate_utf16le_proof.py +0 -137
  541. package/deps/simdutf/scripts/sse_validate_utf16le_testcases.py +0 -129
  542. package/deps/simdutf/scripts/table.py +0 -207
  543. package/deps/simdutf/scripts/tests/new.txt +0 -33
  544. package/deps/simdutf/scripts/tests/old.txt +0 -33
  545. package/deps/simdutf/scripts/tests/results.txt +0 -272
  546. package/deps/simdutf/simdutf.pc.in +0 -11
  547. package/deps/simdutf/singleheader/.flake8 +0 -2
  548. package/deps/simdutf/singleheader/CMakeLists.txt +0 -64
  549. package/deps/simdutf/singleheader/README-dev.md +0 -81
  550. package/deps/simdutf/singleheader/README.md +0 -19
  551. package/deps/simdutf/singleheader/amalgamate.py +0 -513
  552. package/deps/simdutf/singleheader/amalgamation_demo.c +0 -59
  553. package/deps/simdutf/singleheader/amalgamation_demo.cpp +0 -54
  554. package/deps/simdutf/singleheader/test-features.py +0 -262
  555. package/deps/simdutf/src/CMakeLists.txt +0 -78
  556. package/deps/simdutf/tests/CMakeLists.txt +0 -483
  557. package/deps/simdutf/tests/atomic_base64_tests.cpp +0 -2845
  558. package/deps/simdutf/tests/base64_tests.cpp +0 -3617
  559. package/deps/simdutf/tests/basic_fuzzer.cpp +0 -805
  560. package/deps/simdutf/tests/bele_tests.cpp +0 -182
  561. package/deps/simdutf/tests/constexpr_base64_tests.cpp +0 -387
  562. package/deps/simdutf/tests/convert_latin1_to_utf16be_tests.cpp +0 -52
  563. package/deps/simdutf/tests/convert_latin1_to_utf16le_tests.cpp +0 -80
  564. package/deps/simdutf/tests/convert_latin1_to_utf32_tests.cpp +0 -66
  565. package/deps/simdutf/tests/convert_latin1_to_utf8_tests.cpp +0 -120
  566. package/deps/simdutf/tests/convert_utf16_to_utf8_safe_tests.cpp +0 -203
  567. package/deps/simdutf/tests/convert_utf16_to_utf8_with_replacement_tests.cpp +0 -276
  568. package/deps/simdutf/tests/convert_utf16be_to_latin1_tests.cpp +0 -109
  569. package/deps/simdutf/tests/convert_utf16be_to_latin1_tests_with_errors.cpp +0 -136
  570. package/deps/simdutf/tests/convert_utf16be_to_utf32_tests.cpp +0 -193
  571. package/deps/simdutf/tests/convert_utf16be_to_utf32_with_errors_tests.cpp +0 -381
  572. package/deps/simdutf/tests/convert_utf16be_to_utf8_tests.cpp +0 -259
  573. package/deps/simdutf/tests/convert_utf16be_to_utf8_with_errors_tests.cpp +0 -266
  574. package/deps/simdutf/tests/convert_utf16le_to_latin1_tests.cpp +0 -148
  575. package/deps/simdutf/tests/convert_utf16le_to_latin1_tests_with_errors.cpp +0 -176
  576. package/deps/simdutf/tests/convert_utf16le_to_utf32_tests.cpp +0 -213
  577. package/deps/simdutf/tests/convert_utf16le_to_utf32_with_errors_tests.cpp +0 -318
  578. package/deps/simdutf/tests/convert_utf16le_to_utf8_tests.cpp +0 -343
  579. package/deps/simdutf/tests/convert_utf16le_to_utf8_with_errors_tests.cpp +0 -271
  580. package/deps/simdutf/tests/convert_utf32_to_latin1_tests.cpp +0 -111
  581. package/deps/simdutf/tests/convert_utf32_to_latin1_with_errors_tests.cpp +0 -96
  582. package/deps/simdutf/tests/convert_utf32_to_utf16be_tests.cpp +0 -148
  583. package/deps/simdutf/tests/convert_utf32_to_utf16be_with_errors_tests.cpp +0 -192
  584. package/deps/simdutf/tests/convert_utf32_to_utf16le_tests.cpp +0 -166
  585. package/deps/simdutf/tests/convert_utf32_to_utf16le_with_errors_tests.cpp +0 -215
  586. package/deps/simdutf/tests/convert_utf32_to_utf8_tests.cpp +0 -181
  587. package/deps/simdutf/tests/convert_utf32_to_utf8_with_errors_tests.cpp +0 -261
  588. package/deps/simdutf/tests/convert_utf8_to_latin1_tests.cpp +0 -516
  589. package/deps/simdutf/tests/convert_utf8_to_latin1_with_errors_tests.cpp +0 -579
  590. package/deps/simdutf/tests/convert_utf8_to_utf16be_tests.cpp +0 -412
  591. package/deps/simdutf/tests/convert_utf8_to_utf16be_with_errors_tests.cpp +0 -480
  592. package/deps/simdutf/tests/convert_utf8_to_utf16le_tests.cpp +0 -671
  593. package/deps/simdutf/tests/convert_utf8_to_utf16le_with_errors_tests.cpp +0 -455
  594. package/deps/simdutf/tests/convert_utf8_to_utf32_tests.cpp +0 -1204
  595. package/deps/simdutf/tests/convert_utf8_to_utf32_with_errors_tests.cpp +0 -337
  596. package/deps/simdutf/tests/convert_valid_utf16be_to_latin1_tests.cpp +0 -37
  597. package/deps/simdutf/tests/convert_valid_utf16be_to_utf32_tests.cpp +0 -97
  598. package/deps/simdutf/tests/convert_valid_utf16be_to_utf8_tests.cpp +0 -126
  599. package/deps/simdutf/tests/convert_valid_utf16le_to_latin1_tests.cpp +0 -71
  600. package/deps/simdutf/tests/convert_valid_utf16le_to_utf32_tests.cpp +0 -122
  601. package/deps/simdutf/tests/convert_valid_utf16le_to_utf8_tests.cpp +0 -244
  602. package/deps/simdutf/tests/convert_valid_utf32_to_latin1_tests.cpp +0 -49
  603. package/deps/simdutf/tests/convert_valid_utf32_to_utf16be_tests.cpp +0 -92
  604. package/deps/simdutf/tests/convert_valid_utf32_to_utf16le_tests.cpp +0 -114
  605. package/deps/simdutf/tests/convert_valid_utf32_to_utf8_tests.cpp +0 -109
  606. package/deps/simdutf/tests/convert_valid_utf8_to_latin1_tests.cpp +0 -84
  607. package/deps/simdutf/tests/convert_valid_utf8_to_utf16be_tests.cpp +0 -124
  608. package/deps/simdutf/tests/convert_valid_utf8_to_utf16le_tests.cpp +0 -221
  609. package/deps/simdutf/tests/convert_valid_utf8_to_utf32_tests.cpp +0 -155
  610. package/deps/simdutf/tests/count_utf16be.cpp +0 -64
  611. package/deps/simdutf/tests/count_utf16le.cpp +0 -61
  612. package/deps/simdutf/tests/count_utf8.cpp +0 -87
  613. package/deps/simdutf/tests/detect_encodings_tests.cpp +0 -312
  614. package/deps/simdutf/tests/embed/valid_utf8.txt +0 -1
  615. package/deps/simdutf/tests/embed_tests.cpp +0 -22
  616. package/deps/simdutf/tests/find_tests.cpp +0 -77
  617. package/deps/simdutf/tests/fixed_string_tests.cpp +0 -153
  618. package/deps/simdutf/tests/helpers/CMakeLists.txt +0 -25
  619. package/deps/simdutf/tests/helpers/compiletime_conversions.h +0 -222
  620. package/deps/simdutf/tests/helpers/fixed_string.h +0 -267
  621. package/deps/simdutf/tests/helpers/random_int.cpp +0 -30
  622. package/deps/simdutf/tests/helpers/random_int.h +0 -39
  623. package/deps/simdutf/tests/helpers/random_utf16.cpp +0 -123
  624. package/deps/simdutf/tests/helpers/random_utf16.h +0 -52
  625. package/deps/simdutf/tests/helpers/random_utf32.cpp +0 -41
  626. package/deps/simdutf/tests/helpers/random_utf32.h +0 -40
  627. package/deps/simdutf/tests/helpers/random_utf8.cpp +0 -93
  628. package/deps/simdutf/tests/helpers/random_utf8.h +0 -36
  629. package/deps/simdutf/tests/helpers/test.cpp +0 -231
  630. package/deps/simdutf/tests/helpers/test.h +0 -193
  631. package/deps/simdutf/tests/helpers/transcode_test_base.cpp +0 -1257
  632. package/deps/simdutf/tests/helpers/transcode_test_base.h +0 -683
  633. package/deps/simdutf/tests/helpers/utf16.h +0 -27
  634. package/deps/simdutf/tests/installation_tests/find/CMakeLists.txt +0 -43
  635. package/deps/simdutf/tests/installation_tests/from_fetch/CMakeLists.txt +0 -47
  636. package/deps/simdutf/tests/internal_tests.cpp +0 -27
  637. package/deps/simdutf/tests/null_safety_tests.cpp +0 -94
  638. package/deps/simdutf/tests/random_fuzzer.cpp +0 -779
  639. package/deps/simdutf/tests/readme_tests.cpp +0 -274
  640. package/deps/simdutf/tests/reference/CMakeLists.txt +0 -23
  641. package/deps/simdutf/tests/reference/decode_utf16.h +0 -81
  642. package/deps/simdutf/tests/reference/decode_utf32.h +0 -47
  643. package/deps/simdutf/tests/reference/encode_latin1.cpp +0 -1
  644. package/deps/simdutf/tests/reference/encode_latin1.h +0 -32
  645. package/deps/simdutf/tests/reference/encode_utf16.cpp +0 -49
  646. package/deps/simdutf/tests/reference/encode_utf16.h +0 -20
  647. package/deps/simdutf/tests/reference/encode_utf32.cpp +0 -1
  648. package/deps/simdutf/tests/reference/encode_utf32.h +0 -36
  649. package/deps/simdutf/tests/reference/encode_utf8.cpp +0 -1
  650. package/deps/simdutf/tests/reference/encode_utf8.h +0 -40
  651. package/deps/simdutf/tests/reference/validate_utf16.cpp +0 -60
  652. package/deps/simdutf/tests/reference/validate_utf16.h +0 -14
  653. package/deps/simdutf/tests/reference/validate_utf16_to_latin1.cpp +0 -35
  654. package/deps/simdutf/tests/reference/validate_utf16_to_latin1.h +0 -13
  655. package/deps/simdutf/tests/reference/validate_utf32.cpp +0 -27
  656. package/deps/simdutf/tests/reference/validate_utf32.h +0 -12
  657. package/deps/simdutf/tests/reference/validate_utf32_to_latin1.cpp +0 -27
  658. package/deps/simdutf/tests/reference/validate_utf32_to_latin1.h +0 -12
  659. package/deps/simdutf/tests/reference/validate_utf8.cpp +0 -82
  660. package/deps/simdutf/tests/reference/validate_utf8.h +0 -11
  661. package/deps/simdutf/tests/reference/validate_utf8_to_latin1.cpp +0 -43
  662. package/deps/simdutf/tests/reference/validate_utf8_to_latin1.h +0 -12
  663. package/deps/simdutf/tests/select_implementation.cpp +0 -43
  664. package/deps/simdutf/tests/simdutf_c_tests.cpp +0 -244
  665. package/deps/simdutf/tests/span_tests.cpp +0 -401
  666. package/deps/simdutf/tests/special_tests.cpp +0 -559
  667. package/deps/simdutf/tests/straight_c_test.c +0 -187
  668. package/deps/simdutf/tests/text_encoding_tests.cpp +0 -77
  669. package/deps/simdutf/tests/to_well_formed_utf16_tests.cpp +0 -377
  670. package/deps/simdutf/tests/utf8_length_from_utf16_tests.cpp +0 -202
  671. package/deps/simdutf/tests/validate_ascii_basic_tests.cpp +0 -165
  672. package/deps/simdutf/tests/validate_ascii_with_errors_tests.cpp +0 -77
  673. package/deps/simdutf/tests/validate_utf16be_basic_tests.cpp +0 -175
  674. package/deps/simdutf/tests/validate_utf16be_with_errors_tests.cpp +0 -188
  675. package/deps/simdutf/tests/validate_utf16le_basic_tests.cpp +0 -268
  676. package/deps/simdutf/tests/validate_utf16le_with_errors_tests.cpp +0 -274
  677. package/deps/simdutf/tests/validate_utf32_basic_tests.cpp +0 -92
  678. package/deps/simdutf/tests/validate_utf32_with_errors_tests.cpp +0 -114
  679. package/deps/simdutf/tests/validate_utf8_basic_tests.cpp +0 -178
  680. package/deps/simdutf/tests/validate_utf8_brute_force_tests.cpp +0 -88
  681. package/deps/simdutf/tests/validate_utf8_puzzler_tests.cpp +0 -33
  682. package/deps/simdutf/tests/validate_utf8_with_errors_tests.cpp +0 -228
  683. package/deps/simdutf/tools/CMakeLists.txt +0 -85
  684. package/deps/simdutf/tools/fastbase64.cpp +0 -250
  685. package/deps/simdutf/tools/sutf.cpp +0 -556
  686. package/deps/simdutf/tools/sutf.h +0 -40
  687. package/lib/tsconfig.tsbuildinfo +0 -1
@@ -14,12 +14,9 @@
14
14
 
15
15
  namespace margelo::nitro::crypto {
16
16
 
17
- HybridCipher::~HybridCipher() {
18
- if (ctx) {
19
- EVP_CIPHER_CTX_free(ctx);
20
- // No need to set ctx = nullptr here, object is being destroyed
21
- }
22
- }
17
+ // The unique_ptr in the base class destroys ctx automatically — nothing for
18
+ // us to do here. Subclasses MUST NOT touch ctx in their own destructors.
19
+ HybridCipher::~HybridCipher() = default;
23
20
 
24
21
  void HybridCipher::checkCtx() const {
25
22
  if (!ctx) {
@@ -33,11 +30,17 @@ void HybridCipher::checkNotFinalized() const {
33
30
  }
34
31
  }
35
32
 
33
+ void HybridCipher::checkAADBeforeUpdate() const {
34
+ if (has_update_called) {
35
+ throw std::runtime_error("setAAD must be called before update");
36
+ }
37
+ }
38
+
36
39
  bool HybridCipher::maybePassAuthTagToOpenSSL() {
37
40
  if (auth_tag_state == kAuthTagKnown) {
38
41
  OSSL_PARAM params[] = {OSSL_PARAM_construct_octet_string(OSSL_CIPHER_PARAM_AEAD_TAG, auth_tag, auth_tag_len),
39
42
  OSSL_PARAM_construct_end()};
40
- if (!EVP_CIPHER_CTX_set_params(ctx, params)) {
43
+ if (!EVP_CIPHER_CTX_set_params(ctx.get(), params)) {
41
44
  unsigned long err = ERR_get_error();
42
45
  char err_buf[256];
43
46
  ERR_error_string_n(err, err_buf, sizeof(err_buf));
@@ -49,12 +52,12 @@ bool HybridCipher::maybePassAuthTagToOpenSSL() {
49
52
  }
50
53
 
51
54
  void HybridCipher::init(const std::shared_ptr<ArrayBuffer> cipher_key, const std::shared_ptr<ArrayBuffer> iv) {
52
- // Clean up any existing context
53
- if (ctx) {
54
- EVP_CIPHER_CTX_free(ctx);
55
- ctx = nullptr;
56
- }
55
+ // Resetting the unique_ptr frees any previous context.
56
+ ctx.reset();
57
57
  is_finalized = false;
58
+ has_update_called = false;
59
+ has_aad = false;
60
+ pending_auth_failed = false;
58
61
 
59
62
  // 1. Get cipher implementation by name
60
63
  const EVP_CIPHER* cipher = EVP_get_cipherbyname(cipher_type.c_str());
@@ -63,19 +66,18 @@ void HybridCipher::init(const std::shared_ptr<ArrayBuffer> cipher_key, const std
63
66
  }
64
67
 
65
68
  // 2. Create a new context
66
- ctx = EVP_CIPHER_CTX_new();
69
+ ctx.reset(EVP_CIPHER_CTX_new());
67
70
  if (!ctx) {
68
71
  throw std::runtime_error("Failed to create cipher context");
69
72
  }
70
73
 
71
74
  // Initialise the encryption/decryption operation with the cipher type.
72
75
  // Key and IV will be set later by the derived class if needed.
73
- if (EVP_CipherInit_ex(ctx, cipher, nullptr, nullptr, nullptr, is_cipher) != 1) {
76
+ if (EVP_CipherInit_ex(ctx.get(), cipher, nullptr, nullptr, nullptr, is_cipher) != 1) {
74
77
  unsigned long err = ERR_get_error();
75
78
  char err_buf[256];
76
79
  ERR_error_string_n(err, err_buf, sizeof(err_buf));
77
- EVP_CIPHER_CTX_free(ctx);
78
- ctx = nullptr;
80
+ ctx.reset();
79
81
  throw std::runtime_error("HybridCipher: Failed initial CipherInit setup: " + std::string(err_buf));
80
82
  }
81
83
 
@@ -86,12 +88,11 @@ void HybridCipher::init(const std::shared_ptr<ArrayBuffer> cipher_key, const std
86
88
  const unsigned char* key_ptr = reinterpret_cast<const unsigned char*>(native_key->data());
87
89
  const unsigned char* iv_ptr = reinterpret_cast<const unsigned char*>(native_iv->data());
88
90
 
89
- if (EVP_CipherInit_ex(ctx, nullptr, nullptr, key_ptr, iv_ptr, is_cipher) != 1) {
91
+ if (EVP_CipherInit_ex(ctx.get(), nullptr, nullptr, key_ptr, iv_ptr, is_cipher) != 1) {
90
92
  unsigned long err = ERR_get_error();
91
93
  char err_buf[256];
92
94
  ERR_error_string_n(err, err_buf, sizeof(err_buf));
93
- EVP_CIPHER_CTX_free(ctx);
94
- ctx = nullptr;
95
+ ctx.reset();
95
96
  throw std::runtime_error("HybridCipher: Failed to set key/IV: " + std::string(err_buf));
96
97
  }
97
98
 
@@ -99,8 +100,8 @@ void HybridCipher::init(const std::shared_ptr<ArrayBuffer> cipher_key, const std
99
100
  std::string cipher_name(cipher_type);
100
101
  if (cipher_name.find("-wrap") != std::string::npos) {
101
102
  // This flag is required for AES-KW in OpenSSL 3.x
102
- EVP_CIPHER_CTX_set_flags(ctx, EVP_CIPHER_CTX_FLAG_WRAP_ALLOW);
103
- EVP_CIPHER_CTX_set_padding(ctx, 0);
103
+ EVP_CIPHER_CTX_set_flags(ctx.get(), EVP_CIPHER_CTX_FLAG_WRAP_ALLOW);
104
+ EVP_CIPHER_CTX_set_padding(ctx.get(), 0);
104
105
  }
105
106
  }
106
107
 
@@ -108,40 +109,41 @@ std::shared_ptr<ArrayBuffer> HybridCipher::update(const std::shared_ptr<ArrayBuf
108
109
  auto native_data = ToNativeArrayBuffer(data);
109
110
  checkCtx();
110
111
  checkNotFinalized();
112
+ has_update_called = true;
111
113
  size_t in_len = native_data->size();
112
114
  if (in_len > INT_MAX) {
113
115
  throw std::runtime_error("Message too long");
114
116
  }
115
117
 
116
- int out_len = in_len + EVP_CIPHER_CTX_block_size(ctx);
117
- uint8_t* out = new uint8_t[out_len];
118
+ int out_len = in_len + EVP_CIPHER_CTX_block_size(ctx.get());
119
+ auto out_buf = std::make_unique<uint8_t[]>(out_len);
118
120
  // Perform the cipher update operation. The real size of the output is
119
121
  // returned in out_len
120
- int ret = EVP_CipherUpdate(ctx, out, &out_len, native_data->data(), in_len);
122
+ int ret = EVP_CipherUpdate(ctx.get(), out_buf.get(), &out_len, native_data->data(), in_len);
121
123
 
122
124
  if (!ret) {
123
125
  unsigned long err = ERR_get_error();
124
126
  char err_buf[256];
125
127
  ERR_error_string_n(err, err_buf, sizeof(err_buf));
126
- delete[] out;
127
128
  throw std::runtime_error("Cipher update failed: " + std::string(err_buf));
128
129
  }
129
130
 
130
131
  // Create and return a new buffer of exact size needed
131
- return std::make_shared<NativeArrayBuffer>(out, out_len, [=]() { delete[] out; });
132
+ uint8_t* raw_ptr = out_buf.get();
133
+ return std::make_shared<NativeArrayBuffer>(out_buf.release(), out_len, [raw_ptr]() { delete[] raw_ptr; });
132
134
  }
133
135
 
134
136
  std::shared_ptr<ArrayBuffer> HybridCipher::final() {
135
137
  checkCtx();
136
138
  checkNotFinalized();
137
139
  // Block size is max output size for final, unless EVP_CIPH_NO_PADDING is set
138
- int block_size = EVP_CIPHER_CTX_block_size(ctx);
140
+ int block_size = EVP_CIPHER_CTX_block_size(ctx.get());
139
141
  if (block_size <= 0)
140
142
  block_size = 16; // Default if block size is weird (e.g., 0)
141
143
  auto out_buf = std::make_unique<uint8_t[]>(block_size);
142
144
  int out_len = 0;
143
145
 
144
- int ret = EVP_CipherFinal_ex(ctx, out_buf.get(), &out_len);
146
+ int ret = EVP_CipherFinal_ex(ctx.get(), out_buf.get(), &out_len);
145
147
  if (!ret) {
146
148
  unsigned long err = ERR_get_error();
147
149
  char err_buf[256];
@@ -165,11 +167,12 @@ std::shared_ptr<ArrayBuffer> HybridCipher::final() {
165
167
 
166
168
  bool HybridCipher::setAAD(const std::shared_ptr<ArrayBuffer>& data, std::optional<double> plaintextLength) {
167
169
  checkCtx();
170
+ checkAADBeforeUpdate();
168
171
  auto native_data = ToNativeArrayBuffer(data);
169
172
 
170
173
  // Set the AAD
171
174
  int out_len;
172
- if (!EVP_CipherUpdate(ctx, nullptr, &out_len, native_data->data(), native_data->size())) {
175
+ if (!EVP_CipherUpdate(ctx.get(), nullptr, &out_len, native_data->data(), native_data->size())) {
173
176
  return false;
174
177
  }
175
178
 
@@ -179,7 +182,7 @@ bool HybridCipher::setAAD(const std::shared_ptr<ArrayBuffer>& data, std::optiona
179
182
 
180
183
  bool HybridCipher::setAutoPadding(bool autoPad) {
181
184
  checkCtx();
182
- return EVP_CIPHER_CTX_set_padding(ctx, autoPad) == 1;
185
+ return EVP_CIPHER_CTX_set_padding(ctx.get(), autoPad) == 1;
183
186
  }
184
187
 
185
188
  bool HybridCipher::setAuthTag(const std::shared_ptr<ArrayBuffer>& tag) {
@@ -193,7 +196,7 @@ bool HybridCipher::setAuthTag(const std::shared_ptr<ArrayBuffer>& tag) {
193
196
  size_t tag_len = native_tag->size();
194
197
  uint8_t* tag_ptr = native_tag->data();
195
198
 
196
- int mode = EVP_CIPHER_CTX_mode(ctx);
199
+ int mode = EVP_CIPHER_CTX_mode(ctx.get());
197
200
 
198
201
  if (mode == EVP_CIPH_GCM_MODE || mode == EVP_CIPH_OCB_MODE) {
199
202
  // Use EVP_CTRL_AEAD_SET_TAG for GCM/OCB decryption
@@ -202,10 +205,10 @@ bool HybridCipher::setAuthTag(const std::shared_ptr<ArrayBuffer>& tag) {
202
205
  }
203
206
  // Add check for valid cipher in context before setting tag
204
207
  // Use the correct OpenSSL 3 function: EVP_CIPHER_CTX_cipher
205
- if (!EVP_CIPHER_CTX_cipher(ctx)) {
208
+ if (!EVP_CIPHER_CTX_cipher(ctx.get())) {
206
209
  throw std::runtime_error("Context has no cipher set before setting GCM/OCB tag");
207
210
  }
208
- if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, tag_len, tag_ptr) <= 0) {
211
+ if (EVP_CIPHER_CTX_ctrl(ctx.get(), EVP_CTRL_AEAD_SET_TAG, tag_len, tag_ptr) <= 0) {
209
212
  unsigned long err = ERR_get_error();
210
213
  char err_buf[256];
211
214
  ERR_error_string_n(err, err_buf, sizeof(err_buf));
@@ -235,7 +238,7 @@ bool HybridCipher::setAuthTag(const std::shared_ptr<ArrayBuffer>& tag) {
235
238
  std::shared_ptr<ArrayBuffer> HybridCipher::getAuthTag() {
236
239
  checkCtx();
237
240
 
238
- int mode = EVP_CIPHER_CTX_mode(ctx);
241
+ int mode = EVP_CIPHER_CTX_mode(ctx.get());
239
242
 
240
243
  if (!is_cipher) {
241
244
  throw std::runtime_error("getAuthTag can only be called during encryption.");
@@ -246,7 +249,7 @@ std::shared_ptr<ArrayBuffer> HybridCipher::getAuthTag() {
246
249
  constexpr int max_tag_len = 16; // GCM/OCB tags are typically up to 16 bytes
247
250
  auto tag_buf = std::make_unique<uint8_t[]>(max_tag_len);
248
251
 
249
- int ret = EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, max_tag_len, tag_buf.get());
252
+ int ret = EVP_CIPHER_CTX_ctrl(ctx.get(), EVP_CTRL_AEAD_GET_TAG, max_tag_len, tag_buf.get());
250
253
 
251
254
  if (ret <= 0) {
252
255
  unsigned long err = ERR_get_error();
@@ -283,7 +286,7 @@ int HybridCipher::getMode() {
283
286
  if (!ctx) {
284
287
  throw std::runtime_error("Cipher not initialized. Did you call setArgs()?");
285
288
  }
286
- return EVP_CIPHER_CTX_get_mode(ctx);
289
+ return EVP_CIPHER_CTX_get_mode(ctx.get());
287
290
  }
288
291
 
289
292
  void HybridCipher::setArgs(const CipherArgs& args) {
@@ -1,5 +1,6 @@
1
1
  #pragma once
2
2
 
3
+ #include <memory>
3
4
  #include <openssl/core_names.h>
4
5
  #include <openssl/err.h>
5
6
  #include <openssl/evp.h>
@@ -13,6 +14,15 @@
13
14
 
14
15
  namespace margelo::nitro::crypto {
15
16
 
17
+ // Owning smart pointer for EVP_CIPHER_CTX. Living in the base class means
18
+ // subclasses never have to remember to free it — the destruction order
19
+ // (subclass → base) automatically calls the deleter when the cipher object
20
+ // goes away. The previous design required each subclass to handle ctx in
21
+ // its destructor, and three subclasses (CCM, ChaCha20, ChaCha20-Poly1305)
22
+ // got it wrong by setting `ctx = nullptr` without calling the free first,
23
+ // leaking the OpenSSL cipher context. See audit Phase 1.3.
24
+ using EvpCipherCtxPtr = std::unique_ptr<EVP_CIPHER_CTX, decltype(&EVP_CIPHER_CTX_free)>;
25
+
16
26
  // Default tag length for OCB, SIV, CCM, ChaCha20-Poly1305
17
27
  constexpr unsigned kDefaultAuthTagLength = 16;
18
28
 
@@ -55,9 +65,14 @@ class HybridCipher : public HybridCipherSpec {
55
65
  bool is_cipher = true;
56
66
  bool is_finalized = false;
57
67
  std::string cipher_type;
58
- EVP_CIPHER_CTX* ctx = nullptr;
68
+ EvpCipherCtxPtr ctx{nullptr, EVP_CIPHER_CTX_free};
59
69
  bool pending_auth_failed = false;
60
70
  bool has_aad = false;
71
+ // Tracks whether update() has been called on this cipher. Used to enforce
72
+ // the AEAD ordering invariant that setAAD() must precede any update() call;
73
+ // OpenSSL silently accepts misordered AAD/data on some modes (OCB,
74
+ // ChaCha20-Poly1305), letting an attacker truncate authenticated data.
75
+ bool has_update_called = false;
61
76
  uint8_t auth_tag[EVP_GCM_TLS_TAG_LEN];
62
77
  AuthTagState auth_tag_state;
63
78
  unsigned int auth_tag_len = 0;
@@ -68,6 +83,7 @@ class HybridCipher : public HybridCipherSpec {
68
83
  int getMode();
69
84
  void checkCtx() const;
70
85
  void checkNotFinalized() const;
86
+ void checkAADBeforeUpdate() const;
71
87
  bool maybePassAuthTagToOpenSSL();
72
88
  };
73
89
 
@@ -25,6 +25,38 @@ int toOpenSSLPadding(int padding) {
25
25
  }
26
26
  }
27
27
 
28
+ // Bleichenbacher mitigation. For RSA PKCS#1 v1.5 decryption, ask OpenSSL to
29
+ // substitute random-looking plaintext on padding-check failure rather than
30
+ // surfacing a distinguishable error. This closes the "padding-valid /
31
+ // padding-invalid" oracle that the Million Message Attack depends on. The
32
+ // `EVP_PKEY_CTX_ctrl_str` knob was added in OpenSSL 3.2; if the underlying
33
+ // build does not support it (BoringSSL, older OpenSSL) we refuse to perform
34
+ // PKCS#1 v1.5 decryption rather than silently fall back to a configuration
35
+ // that leaves the timing-side oracle open. Node.js (`crypto_cipher.cc`)
36
+ // applies the same hard-fail policy. Returns true if implicit rejection is
37
+ // engaged or not applicable (OAEP); false if PKCS#1 v1.5 was requested but
38
+ // the knob failed. Always clears the OpenSSL error stack on failure so a
39
+ // rejected knob does not leak through to a later operation.
40
+ [[nodiscard]] static bool enableImplicitRejectionIfPkcs1(EVP_PKEY_CTX* ctx, int opensslPadding) {
41
+ if (opensslPadding != RSA_PKCS1_PADDING) {
42
+ return true;
43
+ }
44
+ bool ok = EVP_PKEY_CTX_ctrl_str(ctx, "rsa_pkcs1_implicit_rejection", "1") > 0;
45
+ if (!ok) {
46
+ ERR_clear_error();
47
+ }
48
+ return ok;
49
+ }
50
+
51
+ // Throw the SAME message regardless of the underlying OpenSSL error so that
52
+ // callers (and remote attackers in oracle-style scenarios) cannot distinguish
53
+ // "padding invalid" from "data too large", "bad version", "wrong key", etc.
54
+ // The OpenSSL error stack is cleared so it is not observable later.
55
+ [[noreturn]] static void throwOpaqueDecryptFailure() {
56
+ ERR_clear_error();
57
+ throw std::runtime_error("RSA decryption failed");
58
+ }
59
+
28
60
  std::shared_ptr<ArrayBuffer> HybridRsaCipher::encrypt(const std::shared_ptr<HybridKeyObjectHandleSpec>& keyHandle,
29
61
  const std::shared_ptr<ArrayBuffer>& data, double padding,
30
62
  const std::string& hashAlgorithm,
@@ -147,6 +179,11 @@ std::shared_ptr<ArrayBuffer> HybridRsaCipher::decrypt(const std::shared_ptr<Hybr
147
179
  throw std::runtime_error("Failed to set RSA padding");
148
180
  }
149
181
 
182
+ if (!enableImplicitRejectionIfPkcs1(ctx, opensslPadding)) {
183
+ EVP_PKEY_CTX_free(ctx);
184
+ throw std::runtime_error("RSA PKCS#1 v1.5 decryption requires OpenSSL implicit-rejection support (>= 3.2)");
185
+ }
186
+
150
187
  if (paddingInt == kRsaOaepPadding) {
151
188
  const EVP_MD* md = getDigestByName(hashAlgorithm);
152
189
  if (EVP_PKEY_CTX_set_rsa_oaep_md(ctx, md) <= 0) {
@@ -180,23 +217,20 @@ std::shared_ptr<ArrayBuffer> HybridRsaCipher::decrypt(const std::shared_ptr<Hybr
180
217
  const unsigned char* in = native_data->data();
181
218
  size_t inlen = native_data->size();
182
219
 
220
+ // Both decrypt calls below operate on attacker-controlled ciphertext, so
221
+ // any failure must be surfaced with an opaque, content-independent message.
222
+ // See enableImplicitRejectionIfPkcs1 / throwOpaqueDecryptFailure above.
183
223
  size_t outlen;
184
224
  if (EVP_PKEY_decrypt(ctx, nullptr, &outlen, in, inlen) <= 0) {
185
225
  EVP_PKEY_CTX_free(ctx);
186
- unsigned long err = ERR_get_error();
187
- char err_buf[256];
188
- ERR_error_string_n(err, err_buf, sizeof(err_buf));
189
- throw std::runtime_error("Failed to determine output length: " + std::string(err_buf));
226
+ throwOpaqueDecryptFailure();
190
227
  }
191
228
 
192
229
  auto out_buf = std::make_unique<uint8_t[]>(outlen);
193
230
 
194
231
  if (EVP_PKEY_decrypt(ctx, out_buf.get(), &outlen, in, inlen) <= 0) {
195
232
  EVP_PKEY_CTX_free(ctx);
196
- unsigned long err = ERR_get_error();
197
- char err_buf[256];
198
- ERR_error_string_n(err, err_buf, sizeof(err_buf));
199
- throw std::runtime_error("Decryption failed: " + std::string(err_buf));
233
+ throwOpaqueDecryptFailure();
200
234
  }
201
235
 
202
236
  EVP_PKEY_CTX_free(ctx);
@@ -239,37 +273,46 @@ std::shared_ptr<ArrayBuffer> HybridRsaCipher::publicDecrypt(const std::shared_pt
239
273
  const unsigned char* in = native_data->data();
240
274
  size_t inlen = native_data->size();
241
275
 
276
+ // verify_recover acts on attacker-controlled ciphertext too — surface only
277
+ // an opaque error so a remote caller cannot distinguish failure modes.
242
278
  size_t outlen;
243
279
  if (EVP_PKEY_verify_recover(ctx, nullptr, &outlen, in, inlen) <= 0) {
244
280
  EVP_PKEY_CTX_free(ctx);
245
- unsigned long err = ERR_get_error();
246
- char err_buf[256];
247
- ERR_error_string_n(err, err_buf, sizeof(err_buf));
248
- throw std::runtime_error("Failed to determine output length: " + std::string(err_buf));
281
+ throwOpaqueDecryptFailure();
249
282
  }
250
283
 
251
284
  if (outlen == 0) {
252
285
  EVP_PKEY_CTX_free(ctx);
253
- uint8_t* empty_buf = new uint8_t[1];
254
- return std::make_shared<NativeArrayBuffer>(empty_buf, 0, [empty_buf]() { delete[] empty_buf; });
286
+ auto empty_buf = std::make_unique<uint8_t[]>(1);
287
+ uint8_t* raw_ptr = empty_buf.get();
288
+ return std::make_shared<NativeArrayBuffer>(empty_buf.release(), 0, [raw_ptr]() { delete[] raw_ptr; });
255
289
  }
256
290
 
257
291
  auto out_buf = std::make_unique<uint8_t[]>(outlen);
258
292
 
259
293
  if (EVP_PKEY_verify_recover(ctx, out_buf.get(), &outlen, in, inlen) <= 0) {
294
+ // Empty-plaintext recovery: when the original message was zero bytes,
295
+ // OpenSSL's verify_recover surfaces a specific reason code rather than
296
+ // returning success+outlen=0. Match the narrow code from the original
297
+ // implementation and return an empty buffer so `publicDecrypt(privateEncrypt(""))`
298
+ // round-trips. publicDecrypt is signature verification with the PUBLIC
299
+ // key — anyone can perform it — so the special case does not enable a
300
+ // Bleichenbacher-style oracle. The fall-through still uses the opaque
301
+ // throw helper.
302
+ //
303
+ // Use ERR_get_error (oldest in the FIFO queue) to match the inner
304
+ // padding-check error rather than ERR_peek_last_error which returns
305
+ // the outer wrapper code that doesn't satisfy the narrow match.
260
306
  unsigned long err = ERR_get_error();
261
- char err_buf[256];
262
- ERR_error_string_n(err, err_buf, sizeof(err_buf));
263
-
264
307
  if ((err & 0xFFFFFFF) == 0x1C880004 || (err & 0xFF) == 0x04) {
265
308
  ERR_clear_error();
266
309
  EVP_PKEY_CTX_free(ctx);
267
- uint8_t* empty_buf = new uint8_t[1];
268
- return std::make_shared<NativeArrayBuffer>(empty_buf, 0, [empty_buf]() { delete[] empty_buf; });
310
+ auto empty_buf = std::make_unique<uint8_t[]>(1);
311
+ uint8_t* raw_ptr = empty_buf.get();
312
+ return std::make_shared<NativeArrayBuffer>(empty_buf.release(), 0, [raw_ptr]() { delete[] raw_ptr; });
269
313
  }
270
-
271
314
  EVP_PKEY_CTX_free(ctx);
272
- throw std::runtime_error("Public decryption failed: " + std::string(err_buf));
315
+ throwOpaqueDecryptFailure();
273
316
  }
274
317
 
275
318
  EVP_PKEY_CTX_free(ctx);
@@ -369,6 +412,11 @@ std::shared_ptr<ArrayBuffer> HybridRsaCipher::privateDecrypt(const std::shared_p
369
412
  throw std::runtime_error("Failed to set RSA padding");
370
413
  }
371
414
 
415
+ if (!enableImplicitRejectionIfPkcs1(ctx, opensslPadding)) {
416
+ EVP_PKEY_CTX_free(ctx);
417
+ throw std::runtime_error("RSA PKCS#1 v1.5 decryption requires OpenSSL implicit-rejection support (>= 3.2)");
418
+ }
419
+
372
420
  if (paddingInt == kRsaOaepPadding) {
373
421
  const EVP_MD* md = getDigestByName(hashAlgorithm);
374
422
  if (EVP_PKEY_CTX_set_rsa_oaep_md(ctx, md) <= 0) {
@@ -402,23 +450,20 @@ std::shared_ptr<ArrayBuffer> HybridRsaCipher::privateDecrypt(const std::shared_p
402
450
  const unsigned char* in = native_data->data();
403
451
  size_t inlen = native_data->size();
404
452
 
453
+ // Both decrypt calls below operate on attacker-controlled ciphertext, so
454
+ // any failure must be surfaced with an opaque, content-independent message.
455
+ // See enableImplicitRejectionIfPkcs1 / throwOpaqueDecryptFailure above.
405
456
  size_t outlen;
406
457
  if (EVP_PKEY_decrypt(ctx, nullptr, &outlen, in, inlen) <= 0) {
407
458
  EVP_PKEY_CTX_free(ctx);
408
- unsigned long err = ERR_get_error();
409
- char err_buf[256];
410
- ERR_error_string_n(err, err_buf, sizeof(err_buf));
411
- throw std::runtime_error("Failed to determine output length: " + std::string(err_buf));
459
+ throwOpaqueDecryptFailure();
412
460
  }
413
461
 
414
462
  auto out_buf = std::make_unique<uint8_t[]>(outlen);
415
463
 
416
464
  if (EVP_PKEY_decrypt(ctx, out_buf.get(), &outlen, in, inlen) <= 0) {
417
465
  EVP_PKEY_CTX_free(ctx);
418
- unsigned long err = ERR_get_error();
419
- char err_buf[256];
420
- ERR_error_string_n(err, err_buf, sizeof(err_buf));
421
- throw std::runtime_error("Private decryption failed: " + std::string(err_buf));
466
+ throwOpaqueDecryptFailure();
422
467
  }
423
468
 
424
469
  EVP_PKEY_CTX_free(ctx);
@@ -17,7 +17,7 @@ void OCBCipher::init(const std::shared_ptr<ArrayBuffer>& key, const std::shared_
17
17
  if (auth_tag_len < 8 || auth_tag_len > 16) {
18
18
  throw std::runtime_error("OCB tag length must be between 8 and 16 bytes");
19
19
  }
20
- if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, auth_tag_len, nullptr) != 1) {
20
+ if (EVP_CIPHER_CTX_ctrl(ctx.get(), EVP_CTRL_AEAD_SET_TAG, auth_tag_len, nullptr) != 1) {
21
21
  throw std::runtime_error("Failed to set OCB tag length");
22
22
  }
23
23
  }
@@ -28,7 +28,7 @@ std::shared_ptr<ArrayBuffer> OCBCipher::getAuthTag() {
28
28
  throw std::runtime_error("getAuthTag can only be called during encryption.");
29
29
  }
30
30
  auto tag_buf = std::make_unique<uint8_t[]>(auth_tag_len);
31
- if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, auth_tag_len, tag_buf.get()) != 1) {
31
+ if (EVP_CIPHER_CTX_ctrl(ctx.get(), EVP_CTRL_AEAD_GET_TAG, auth_tag_len, tag_buf.get()) != 1) {
32
32
  throw std::runtime_error("Failed to get OCB auth tag");
33
33
  }
34
34
  uint8_t* raw_ptr = tag_buf.get();
@@ -45,10 +45,11 @@ bool OCBCipher::setAuthTag(const std::shared_ptr<ArrayBuffer>& tag) {
45
45
  if (tag_len < 8 || tag_len > 16) {
46
46
  throw std::runtime_error("Invalid OCB tag length");
47
47
  }
48
- if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, tag_len, native_tag->data()) != 1) {
48
+ if (EVP_CIPHER_CTX_ctrl(ctx.get(), EVP_CTRL_AEAD_SET_TAG, tag_len, native_tag->data()) != 1) {
49
49
  throw std::runtime_error("Failed to set OCB auth tag");
50
50
  }
51
51
  auth_tag_len = tag_len;
52
+ auth_tag_state = kAuthTagPassedToOpenSSL;
52
53
  return true;
53
54
  }
54
55
 
@@ -70,42 +70,42 @@ std::shared_ptr<ArrayBuffer> XChaCha20Poly1305Cipher::final() {
70
70
  throw std::runtime_error("XChaCha20Poly1305Cipher: libsodium must be enabled (BLSALLOC_SODIUM)");
71
71
  #else
72
72
  if (is_cipher) {
73
- uint8_t* ciphertext = new uint8_t[data_buffer_.size()];
73
+ auto ciphertext = std::make_unique<uint8_t[]>(data_buffer_.size());
74
74
 
75
75
  int result =
76
- crypto_aead_xchacha20poly1305_ietf_encrypt_detached(ciphertext, auth_tag_, nullptr, data_buffer_.data(), data_buffer_.size(),
76
+ crypto_aead_xchacha20poly1305_ietf_encrypt_detached(ciphertext.get(), auth_tag_, nullptr, data_buffer_.data(), data_buffer_.size(),
77
77
  aad_.empty() ? nullptr : aad_.data(), aad_.size(), nullptr, nonce_, key_);
78
78
 
79
79
  if (result != 0) {
80
- sodium_memzero(ciphertext, data_buffer_.size());
81
- delete[] ciphertext;
80
+ sodium_memzero(ciphertext.get(), data_buffer_.size());
82
81
  throw std::runtime_error("XChaCha20Poly1305Cipher: encryption failed");
83
82
  }
84
83
 
85
84
  is_finalized = true;
86
85
  size_t ct_len = data_buffer_.size();
87
- return std::make_shared<NativeArrayBuffer>(ciphertext, ct_len, [=]() { delete[] ciphertext; });
86
+ uint8_t* raw_ptr = ciphertext.get();
87
+ return std::make_shared<NativeArrayBuffer>(ciphertext.release(), ct_len, [raw_ptr]() { delete[] raw_ptr; });
88
88
  } else {
89
89
  if (data_buffer_.empty()) {
90
90
  is_finalized = true;
91
91
  return std::make_shared<NativeArrayBuffer>(nullptr, 0, nullptr);
92
92
  }
93
93
 
94
- uint8_t* plaintext = new uint8_t[data_buffer_.size()];
94
+ auto plaintext = std::make_unique<uint8_t[]>(data_buffer_.size());
95
95
 
96
96
  int result =
97
- crypto_aead_xchacha20poly1305_ietf_decrypt_detached(plaintext, nullptr, data_buffer_.data(), data_buffer_.size(), auth_tag_,
97
+ crypto_aead_xchacha20poly1305_ietf_decrypt_detached(plaintext.get(), nullptr, data_buffer_.data(), data_buffer_.size(), auth_tag_,
98
98
  aad_.empty() ? nullptr : aad_.data(), aad_.size(), nonce_, key_);
99
99
 
100
100
  if (result != 0) {
101
- sodium_memzero(plaintext, data_buffer_.size());
102
- delete[] plaintext;
101
+ sodium_memzero(plaintext.get(), data_buffer_.size());
103
102
  throw std::runtime_error("XChaCha20Poly1305Cipher: decryption failed - authentication tag mismatch");
104
103
  }
105
104
 
106
105
  is_finalized = true;
107
106
  size_t pt_len = data_buffer_.size();
108
- return std::make_shared<NativeArrayBuffer>(plaintext, pt_len, [=]() { delete[] plaintext; });
107
+ uint8_t* raw_ptr = plaintext.get();
108
+ return std::make_shared<NativeArrayBuffer>(plaintext.release(), pt_len, [raw_ptr]() { delete[] raw_ptr; });
109
109
  }
110
110
  #endif
111
111
  }
@@ -132,9 +132,10 @@ std::shared_ptr<ArrayBuffer> XChaCha20Poly1305Cipher::getAuthTag() {
132
132
  throw std::runtime_error("getAuthTag must be called after final()");
133
133
  }
134
134
 
135
- uint8_t* tag_copy = new uint8_t[kTagSize];
136
- std::memcpy(tag_copy, auth_tag_, kTagSize);
137
- return std::make_shared<NativeArrayBuffer>(tag_copy, kTagSize, [=]() { delete[] tag_copy; });
135
+ auto tag_copy = std::make_unique<uint8_t[]>(kTagSize);
136
+ std::memcpy(tag_copy.get(), auth_tag_, kTagSize);
137
+ uint8_t* raw_ptr = tag_copy.get();
138
+ return std::make_shared<NativeArrayBuffer>(tag_copy.release(), kTagSize, [raw_ptr]() { delete[] raw_ptr; });
138
139
  #endif
139
140
  }
140
141
 
@@ -1,4 +1,6 @@
1
+ #include <algorithm>
1
2
  #include <cstring> // For std::memcpy
3
+ #include <memory> // For std::unique_ptr
2
4
  #include <stdexcept> // For std::runtime_error
3
5
 
4
6
  #include "NitroModules/ArrayBuffer.hpp"
@@ -28,11 +30,27 @@ void XSalsa20Cipher::init(const std::shared_ptr<ArrayBuffer> cipher_key, const s
28
30
  // Copy key and nonce data
29
31
  std::memcpy(key, native_key->data(), crypto_stream_KEYBYTES);
30
32
  std::memcpy(nonce, native_iv->data(), crypto_stream_NONCEBYTES);
33
+
34
+ // Reset streaming state so a re-init'd cipher does not accidentally reuse
35
+ // keystream bytes from a previous session.
36
+ block_counter = 0;
37
+ leftover_offset = kSalsa20BlockBytes;
38
+
31
39
  is_finalized = false;
32
40
  }
33
41
 
34
42
  /**
35
- * xsalsa20 call to sodium implementation
43
+ * xsalsa20 update encrypts/decrypts `data` while keeping the keystream
44
+ * advancing across successive update() calls.
45
+ *
46
+ * Implementation notes:
47
+ * 1. First, drain any unused keystream bytes left over from the previous
48
+ * chunk's trailing partial block.
49
+ * 2. Then process as many aligned whole 64-byte blocks as possible by
50
+ * jumping the keystream to `block_counter` via crypto_stream_xsalsa20_xor_ic.
51
+ * 3. For the remaining tail (< 64 bytes), generate one full keystream
52
+ * block, XOR the requested prefix, and stash the unused suffix for the
53
+ * next update() call.
36
54
  */
37
55
  std::shared_ptr<ArrayBuffer> XSalsa20Cipher::update(const std::shared_ptr<ArrayBuffer>& data) {
38
56
  checkNotFinalized();
@@ -40,12 +58,60 @@ std::shared_ptr<ArrayBuffer> XSalsa20Cipher::update(const std::shared_ptr<ArrayB
40
58
  throw std::runtime_error("XSalsa20Cipher: libsodium must be enabled to use this cipher (BLSALLOC_SODIUM is not defined).");
41
59
  #else
42
60
  auto native_data = ToNativeArrayBuffer(data);
43
- auto output = new uint8_t[native_data->size()];
44
- int result = crypto_stream_xor(output, native_data->data(), native_data->size(), nonce, key);
45
- if (result != 0) {
46
- throw std::runtime_error("XSalsa20Cipher: Failed to update");
61
+ const std::size_t data_size = native_data->size();
62
+
63
+ if (data_size == 0) {
64
+ return std::make_shared<NativeArrayBuffer>(nullptr, 0, nullptr);
65
+ }
66
+
67
+ // Owning buffer: prevents leaking `output` if we throw on the way out.
68
+ auto output = std::make_unique<uint8_t[]>(data_size);
69
+ const uint8_t* input = native_data->data();
70
+ std::size_t pos = 0;
71
+
72
+ // (1) Drain any unused keystream from the previous update()'s tail block.
73
+ if (leftover_offset < kSalsa20BlockBytes) {
74
+ const std::size_t avail = kSalsa20BlockBytes - leftover_offset;
75
+ const std::size_t take = std::min(avail, data_size);
76
+ for (std::size_t i = 0; i < take; ++i) {
77
+ output[i] = input[i] ^ leftover_keystream[leftover_offset + i];
78
+ }
79
+ leftover_offset += take;
80
+ pos = take;
47
81
  }
48
- return std::make_shared<NativeArrayBuffer>(output, native_data->size(), [=]() { delete[] output; });
82
+
83
+ // (2) Encrypt the aligned whole blocks at the current block counter.
84
+ const std::size_t remaining = data_size - pos;
85
+ const std::size_t whole_blocks = remaining / kSalsa20BlockBytes;
86
+ const std::size_t whole_bytes = whole_blocks * kSalsa20BlockBytes;
87
+ if (whole_bytes > 0) {
88
+ int rc = crypto_stream_xsalsa20_xor_ic(output.get() + pos, input + pos, whole_bytes, nonce, block_counter, key);
89
+ if (rc != 0) {
90
+ throw std::runtime_error("XSalsa20Cipher: crypto_stream_xsalsa20_xor_ic failed");
91
+ }
92
+ block_counter += whole_blocks;
93
+ pos += whole_bytes;
94
+ }
95
+
96
+ // (3) For any trailing partial block, generate one full keystream block,
97
+ // XOR the requested prefix, and stash the unused keystream bytes for
98
+ // the next update() call.
99
+ const std::size_t tail = data_size - pos;
100
+ if (tail > 0) {
101
+ uint8_t zeros[kSalsa20BlockBytes] = {};
102
+ int rc = crypto_stream_xsalsa20_xor_ic(leftover_keystream, zeros, kSalsa20BlockBytes, nonce, block_counter, key);
103
+ if (rc != 0) {
104
+ throw std::runtime_error("XSalsa20Cipher: crypto_stream_xsalsa20_xor_ic failed");
105
+ }
106
+ for (std::size_t i = 0; i < tail; ++i) {
107
+ output[pos + i] = input[pos + i] ^ leftover_keystream[i];
108
+ }
109
+ leftover_offset = tail;
110
+ block_counter += 1;
111
+ }
112
+
113
+ uint8_t* raw = output.release();
114
+ return std::make_shared<NativeArrayBuffer>(raw, data_size, [=]() { delete[] raw; });
49
115
  #endif
50
116
  }
51
117