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.
- package/android/build.gradle +5 -1
- package/cpp/argon2/HybridArgon2.cpp +10 -3
- package/cpp/blake3/HybridBlake3.cpp +5 -3
- package/cpp/cipher/CCMCipher.cpp +29 -16
- package/cpp/cipher/CCMCipher.hpp +2 -4
- package/cpp/cipher/ChaCha20Cipher.cpp +14 -18
- package/cpp/cipher/ChaCha20Cipher.hpp +2 -4
- package/cpp/cipher/ChaCha20Poly1305Cipher.cpp +34 -23
- package/cpp/cipher/ChaCha20Poly1305Cipher.hpp +2 -4
- package/cpp/cipher/GCMCipher.cpp +14 -15
- package/cpp/cipher/HybridCipher.cpp +39 -36
- package/cpp/cipher/HybridCipher.hpp +17 -1
- package/cpp/cipher/HybridRsaCipher.cpp +74 -29
- package/cpp/cipher/OCBCipher.cpp +4 -3
- package/cpp/cipher/XChaCha20Poly1305Cipher.cpp +14 -13
- package/cpp/cipher/XSalsa20Cipher.cpp +72 -6
- package/cpp/cipher/XSalsa20Cipher.hpp +25 -3
- package/cpp/cipher/XSalsa20Poly1305Cipher.cpp +21 -25
- package/cpp/dh/HybridDiffieHellman.cpp +29 -0
- package/cpp/ec/HybridEcKeyPair.cpp +35 -33
- package/cpp/ec/HybridEcKeyPair.hpp +3 -7
- package/cpp/ecdh/HybridECDH.cpp +23 -0
- package/cpp/ed25519/HybridEdKeyPair.cpp +73 -117
- package/cpp/ed25519/HybridEdKeyPair.hpp +5 -9
- package/cpp/hash/HybridHash.cpp +5 -7
- package/cpp/hkdf/HybridHkdf.cpp +6 -4
- package/cpp/hmac/HybridHmac.cpp +4 -6
- package/cpp/kmac/HybridKmac.cpp +4 -4
- package/cpp/mldsa/HybridMlDsaKeyPair.cpp +37 -49
- package/cpp/mlkem/HybridMlKemKeyPair.cpp +39 -43
- package/cpp/pbkdf2/HybridPbkdf2.cpp +7 -8
- package/cpp/rsa/HybridRsaKeyPair.cpp +5 -8
- package/cpp/rsa/HybridRsaKeyPair.hpp +4 -7
- package/cpp/scrypt/HybridScrypt.cpp +6 -4
- package/cpp/sign/HybridSignHandle.cpp +25 -68
- package/cpp/sign/HybridVerifyHandle.cpp +23 -60
- package/cpp/utils/HybridUtils.cpp +183 -43
- package/cpp/utils/HybridUtils.hpp +9 -2
- package/cpp/utils/QuickCryptoUtils.hpp +72 -0
- package/lib/commonjs/argon2.js +51 -2
- package/lib/commonjs/argon2.js.map +1 -1
- package/lib/commonjs/cipher.js +109 -11
- package/lib/commonjs/cipher.js.map +1 -1
- package/lib/commonjs/dsa.js +8 -2
- package/lib/commonjs/dsa.js.map +1 -1
- package/lib/commonjs/hash.js +15 -5
- package/lib/commonjs/hash.js.map +1 -1
- package/lib/commonjs/hkdf.js +33 -6
- package/lib/commonjs/hkdf.js.map +1 -1
- package/lib/commonjs/hmac.js +15 -5
- package/lib/commonjs/hmac.js.map +1 -1
- package/lib/commonjs/keys/publicCipher.js +10 -4
- package/lib/commonjs/keys/publicCipher.js.map +1 -1
- package/lib/commonjs/random.js +11 -2
- package/lib/commonjs/random.js.map +1 -1
- package/lib/commonjs/rsa.js +12 -5
- package/lib/commonjs/rsa.js.map +1 -1
- package/lib/commonjs/scrypt.js +47 -6
- package/lib/commonjs/scrypt.js.map +1 -1
- package/lib/commonjs/subtle.js +76 -5
- package/lib/commonjs/subtle.js.map +1 -1
- package/lib/commonjs/utils/cipher.js +18 -7
- package/lib/commonjs/utils/cipher.js.map +1 -1
- package/lib/commonjs/utils/conversion.js +33 -9
- package/lib/commonjs/utils/conversion.js.map +1 -1
- package/lib/commonjs/utils/timingSafeEqual.js +7 -2
- package/lib/commonjs/utils/timingSafeEqual.js.map +1 -1
- package/lib/commonjs/x509certificate.js +6 -6
- package/lib/commonjs/x509certificate.js.map +1 -1
- package/lib/module/argon2.js +51 -2
- package/lib/module/argon2.js.map +1 -1
- package/lib/module/cipher.js +109 -11
- package/lib/module/cipher.js.map +1 -1
- package/lib/module/dsa.js +8 -2
- package/lib/module/dsa.js.map +1 -1
- package/lib/module/hash.js +15 -5
- package/lib/module/hash.js.map +1 -1
- package/lib/module/hkdf.js +33 -6
- package/lib/module/hkdf.js.map +1 -1
- package/lib/module/hmac.js +15 -5
- package/lib/module/hmac.js.map +1 -1
- package/lib/module/keys/publicCipher.js +10 -4
- package/lib/module/keys/publicCipher.js.map +1 -1
- package/lib/module/random.js +11 -2
- package/lib/module/random.js.map +1 -1
- package/lib/module/rsa.js +11 -4
- package/lib/module/rsa.js.map +1 -1
- package/lib/module/scrypt.js +47 -6
- package/lib/module/scrypt.js.map +1 -1
- package/lib/module/subtle.js +76 -5
- package/lib/module/subtle.js.map +1 -1
- package/lib/module/utils/cipher.js +18 -7
- package/lib/module/utils/cipher.js.map +1 -1
- package/lib/module/utils/conversion.js +33 -9
- package/lib/module/utils/conversion.js.map +1 -1
- package/lib/module/utils/timingSafeEqual.js +8 -3
- package/lib/module/utils/timingSafeEqual.js.map +1 -1
- package/lib/module/x509certificate.js +6 -6
- package/lib/module/x509certificate.js.map +1 -1
- package/lib/typescript/argon2.d.ts.map +1 -1
- package/lib/typescript/cipher.d.ts +2 -2
- package/lib/typescript/cipher.d.ts.map +1 -1
- package/lib/typescript/dsa.d.ts.map +1 -1
- package/lib/typescript/hash.d.ts +2 -2
- package/lib/typescript/hash.d.ts.map +1 -1
- package/lib/typescript/hkdf.d.ts.map +1 -1
- package/lib/typescript/hmac.d.ts +2 -2
- package/lib/typescript/hmac.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +1 -1
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/keys/publicCipher.d.ts.map +1 -1
- package/lib/typescript/random.d.ts.map +1 -1
- package/lib/typescript/rsa.d.ts.map +1 -1
- package/lib/typescript/scrypt.d.ts.map +1 -1
- package/lib/typescript/specs/utils.nitro.d.ts +0 -2
- package/lib/typescript/specs/utils.nitro.d.ts.map +1 -1
- package/lib/typescript/subtle.d.ts.map +1 -1
- package/lib/typescript/utils/cipher.d.ts +13 -1
- package/lib/typescript/utils/cipher.d.ts.map +1 -1
- package/lib/typescript/utils/conversion.d.ts +9 -6
- package/lib/typescript/utils/conversion.d.ts.map +1 -1
- package/lib/typescript/utils/timingSafeEqual.d.ts.map +1 -1
- package/lib/typescript/x509certificate.d.ts.map +1 -1
- package/nitrogen/generated/shared/c++/HybridUtilsSpec.cpp +0 -2
- package/nitrogen/generated/shared/c++/HybridUtilsSpec.hpp +0 -3
- package/package.json +37 -5
- package/src/argon2.ts +80 -2
- package/src/cipher.ts +139 -15
- package/src/dsa.ts +11 -2
- package/src/hash.ts +17 -7
- package/src/hkdf.ts +44 -6
- package/src/hmac.ts +17 -7
- package/src/keys/publicCipher.ts +10 -4
- package/src/random.ts +11 -2
- package/src/rsa.ts +18 -4
- package/src/scrypt.ts +73 -6
- package/src/specs/utils.nitro.ts +0 -2
- package/src/subtle.ts +90 -8
- package/src/utils/cipher.ts +30 -8
- package/src/utils/conversion.ts +58 -20
- package/src/utils/timingSafeEqual.ts +8 -3
- package/src/x509certificate.ts +5 -6
- package/deps/blake3/.cargo/config.toml +0 -2
- package/deps/blake3/.git-blame-ignore-revs +0 -2
- package/deps/blake3/.github/workflows/build_b3sum.py +0 -38
- package/deps/blake3/.github/workflows/ci.yml +0 -491
- package/deps/blake3/.github/workflows/tag.yml +0 -43
- package/deps/blake3/.github/workflows/upload_github_release_asset.py +0 -73
- package/deps/blake3/CONTRIBUTING.md +0 -31
- package/deps/blake3/Cargo.toml +0 -135
- package/deps/blake3/b3sum/Cargo.lock +0 -513
- package/deps/blake3/b3sum/Cargo.toml +0 -26
- package/deps/blake3/b3sum/README.md +0 -72
- package/deps/blake3/b3sum/src/main.rs +0 -564
- package/deps/blake3/b3sum/src/unit_tests.rs +0 -235
- package/deps/blake3/b3sum/tests/cli_tests.rs +0 -680
- package/deps/blake3/b3sum/what_does_check_do.md +0 -176
- package/deps/blake3/benches/bench.rs +0 -623
- package/deps/blake3/build.rs +0 -389
- package/deps/blake3/c/CMakeLists.txt +0 -383
- package/deps/blake3/c/CMakePresets.json +0 -73
- package/deps/blake3/c/Makefile.testing +0 -82
- package/deps/blake3/c/blake3-config.cmake.in +0 -14
- package/deps/blake3/c/blake3_avx2.c +0 -326
- package/deps/blake3/c/blake3_avx2_x86-64_unix.S +0 -1815
- package/deps/blake3/c/blake3_avx2_x86-64_windows_gnu.S +0 -1817
- package/deps/blake3/c/blake3_avx2_x86-64_windows_msvc.asm +0 -1828
- package/deps/blake3/c/blake3_avx512.c +0 -1388
- package/deps/blake3/c/blake3_avx512_x86-64_unix.S +0 -4824
- package/deps/blake3/c/blake3_avx512_x86-64_windows_gnu.S +0 -2615
- package/deps/blake3/c/blake3_avx512_x86-64_windows_msvc.asm +0 -2634
- package/deps/blake3/c/blake3_c_rust_bindings/Cargo.toml +0 -32
- package/deps/blake3/c/blake3_c_rust_bindings/README.md +0 -4
- package/deps/blake3/c/blake3_c_rust_bindings/benches/bench.rs +0 -477
- package/deps/blake3/c/blake3_c_rust_bindings/build.rs +0 -253
- package/deps/blake3/c/blake3_c_rust_bindings/cross_test.sh +0 -31
- package/deps/blake3/c/blake3_c_rust_bindings/src/lib.rs +0 -333
- package/deps/blake3/c/blake3_c_rust_bindings/src/test.rs +0 -696
- package/deps/blake3/c/blake3_sse2.c +0 -566
- package/deps/blake3/c/blake3_sse2_x86-64_unix.S +0 -2291
- package/deps/blake3/c/blake3_sse2_x86-64_windows_gnu.S +0 -2332
- package/deps/blake3/c/blake3_sse2_x86-64_windows_msvc.asm +0 -2350
- package/deps/blake3/c/blake3_sse41.c +0 -560
- package/deps/blake3/c/blake3_sse41_x86-64_unix.S +0 -2028
- package/deps/blake3/c/blake3_sse41_x86-64_windows_gnu.S +0 -2069
- package/deps/blake3/c/blake3_sse41_x86-64_windows_msvc.asm +0 -2089
- package/deps/blake3/c/blake3_tbb.cpp +0 -37
- package/deps/blake3/c/dependencies/CMakeLists.txt +0 -3
- package/deps/blake3/c/dependencies/tbb/CMakeLists.txt +0 -28
- package/deps/blake3/c/example.c +0 -36
- package/deps/blake3/c/example_tbb.c +0 -57
- package/deps/blake3/c/libblake3.pc.in +0 -12
- package/deps/blake3/c/main.c +0 -166
- package/deps/blake3/c/test.py +0 -97
- package/deps/blake3/media/B3.svg +0 -70
- package/deps/blake3/media/BLAKE3.svg +0 -85
- package/deps/blake3/media/speed.svg +0 -1474
- package/deps/blake3/reference_impl/Cargo.toml +0 -8
- package/deps/blake3/reference_impl/README.md +0 -14
- package/deps/blake3/reference_impl/reference_impl.rs +0 -374
- package/deps/blake3/src/ffi_avx2.rs +0 -65
- package/deps/blake3/src/ffi_avx512.rs +0 -169
- package/deps/blake3/src/ffi_neon.rs +0 -82
- package/deps/blake3/src/ffi_sse2.rs +0 -126
- package/deps/blake3/src/ffi_sse41.rs +0 -126
- package/deps/blake3/src/guts.rs +0 -60
- package/deps/blake3/src/hazmat.rs +0 -704
- package/deps/blake3/src/io.rs +0 -64
- package/deps/blake3/src/join.rs +0 -92
- package/deps/blake3/src/lib.rs +0 -1835
- package/deps/blake3/src/platform.rs +0 -587
- package/deps/blake3/src/portable.rs +0 -198
- package/deps/blake3/src/rust_avx2.rs +0 -474
- package/deps/blake3/src/rust_sse2.rs +0 -775
- package/deps/blake3/src/rust_sse41.rs +0 -766
- package/deps/blake3/src/test.rs +0 -1049
- package/deps/blake3/src/traits.rs +0 -227
- package/deps/blake3/src/wasm32_simd.rs +0 -794
- package/deps/blake3/test_vectors/Cargo.toml +0 -19
- package/deps/blake3/test_vectors/cross_test.sh +0 -25
- package/deps/blake3/test_vectors/src/bin/generate.rs +0 -4
- package/deps/blake3/test_vectors/src/lib.rs +0 -350
- package/deps/blake3/test_vectors/test_vectors.json +0 -217
- package/deps/blake3/tools/compiler_version/Cargo.toml +0 -7
- package/deps/blake3/tools/compiler_version/build.rs +0 -6
- package/deps/blake3/tools/compiler_version/src/main.rs +0 -27
- package/deps/blake3/tools/instruction_set_support/Cargo.toml +0 -6
- package/deps/blake3/tools/instruction_set_support/src/main.rs +0 -10
- package/deps/blake3/tools/release.md +0 -16
- package/deps/ncrypto/.bazelignore +0 -4
- package/deps/ncrypto/.bazelrc +0 -1
- package/deps/ncrypto/.bazelversion +0 -1
- package/deps/ncrypto/.clang-format +0 -111
- package/deps/ncrypto/.github/workflows/bazel.yml +0 -58
- package/deps/ncrypto/.github/workflows/commitlint.yml +0 -16
- package/deps/ncrypto/.github/workflows/linter.yml +0 -38
- package/deps/ncrypto/.github/workflows/macos.yml +0 -43
- package/deps/ncrypto/.github/workflows/release-please.yml +0 -16
- package/deps/ncrypto/.github/workflows/ubuntu.yml +0 -128
- package/deps/ncrypto/.github/workflows/visual-studio.yml +0 -49
- package/deps/ncrypto/.python-version +0 -1
- package/deps/ncrypto/.release-please-manifest.json +0 -3
- package/deps/ncrypto/BUILD.bazel +0 -44
- package/deps/ncrypto/CHANGELOG.md +0 -37
- package/deps/ncrypto/CMakeLists.txt +0 -79
- package/deps/ncrypto/MODULE.bazel +0 -16
- package/deps/ncrypto/MODULE.bazel.lock +0 -461
- package/deps/ncrypto/cmake/CPM.cmake +0 -1225
- package/deps/ncrypto/cmake/ncrypto-flags.cmake +0 -17
- package/deps/ncrypto/ncrypto.pc.in +0 -10
- package/deps/ncrypto/patches/0001-Expose-libdecrepit-so-NodeJS-can-use-it-for-ncrypto.patch +0 -28
- package/deps/ncrypto/pyproject.toml +0 -38
- package/deps/ncrypto/release-please-config.json +0 -11
- package/deps/ncrypto/src/CMakeLists.txt +0 -40
- package/deps/ncrypto/tests/BUILD.bazel +0 -11
- package/deps/ncrypto/tests/CMakeLists.txt +0 -7
- package/deps/ncrypto/tests/basic.cpp +0 -856
- package/deps/ncrypto/tools/run-clang-format.sh +0 -42
- package/deps/simdutf/.clang-format +0 -4
- package/deps/simdutf/.github/ISSUE_TEMPLATE/bug_report.md +0 -62
- package/deps/simdutf/.github/ISSUE_TEMPLATE/config.yml +0 -1
- package/deps/simdutf/.github/ISSUE_TEMPLATE/feature_request.md +0 -35
- package/deps/simdutf/.github/ISSUE_TEMPLATE/standard-issue-template.md +0 -29
- package/deps/simdutf/.github/pull_request_template.md +0 -51
- package/deps/simdutf/.github/workflows/aarch64.yml +0 -39
- package/deps/simdutf/.github/workflows/alpine.yml +0 -27
- package/deps/simdutf/.github/workflows/amalgamation_demos.yml +0 -34
- package/deps/simdutf/.github/workflows/armv7.yml +0 -32
- package/deps/simdutf/.github/workflows/atomic_fuzz.yml +0 -25
- package/deps/simdutf/.github/workflows/cifuzz.yml +0 -37
- package/deps/simdutf/.github/workflows/clangformat.yml +0 -36
- package/deps/simdutf/.github/workflows/debian-latestcxxstandards.yml +0 -40
- package/deps/simdutf/.github/workflows/debian.yml +0 -33
- package/deps/simdutf/.github/workflows/documentation.yml +0 -36
- package/deps/simdutf/.github/workflows/emscripten.yml +0 -19
- package/deps/simdutf/.github/workflows/loongarch64-gcc-14.2.yml +0 -39
- package/deps/simdutf/.github/workflows/macos-latest.yml +0 -29
- package/deps/simdutf/.github/workflows/msys2-clang.yml +0 -48
- package/deps/simdutf/.github/workflows/msys2.yml +0 -50
- package/deps/simdutf/.github/workflows/ppc64le.yml +0 -29
- package/deps/simdutf/.github/workflows/rvv-1024-clang-18.yml +0 -35
- package/deps/simdutf/.github/workflows/rvv-128-clang-17.yml +0 -35
- package/deps/simdutf/.github/workflows/rvv-256-gcc-14.yml +0 -31
- package/deps/simdutf/.github/workflows/s390x.yml +0 -29
- package/deps/simdutf/.github/workflows/selective-amalgamation.yml +0 -29
- package/deps/simdutf/.github/workflows/typos.yml +0 -19
- package/deps/simdutf/.github/workflows/ubuntu22-cxx20.yml +0 -30
- package/deps/simdutf/.github/workflows/ubuntu22.yml +0 -32
- package/deps/simdutf/.github/workflows/ubuntu22_gcc12.yml +0 -27
- package/deps/simdutf/.github/workflows/ubuntu22sani.yml +0 -29
- package/deps/simdutf/.github/workflows/ubuntu24-cxxstandards.yml +0 -34
- package/deps/simdutf/.github/workflows/ubuntu24-unsignedchar.yml +0 -34
- package/deps/simdutf/.github/workflows/ubuntu24.yml +0 -32
- package/deps/simdutf/.github/workflows/ubuntu24sani.yml +0 -36
- package/deps/simdutf/.github/workflows/ubuntu24sani_clang.yml +0 -29
- package/deps/simdutf/.github/workflows/vs17-arm-ci.yml +0 -21
- package/deps/simdutf/.github/workflows/vs17-ci-cxx20.yml +0 -41
- package/deps/simdutf/.github/workflows/vs17-ci.yml +0 -41
- package/deps/simdutf/.github/workflows/vs17-clang-ci.yml +0 -41
- package/deps/simdutf/.github/workflows/vs17-cxxstandards.yml +0 -36
- package/deps/simdutf/AI_USAGE_POLICY.md +0 -56
- package/deps/simdutf/AUTHORS +0 -6
- package/deps/simdutf/CMakeLists.txt +0 -231
- package/deps/simdutf/CONTRIBUTING.md +0 -214
- package/deps/simdutf/CONTRIBUTORS +0 -1
- package/deps/simdutf/Doxyfile +0 -2584
- package/deps/simdutf/Makefile.crosscompile +0 -54
- package/deps/simdutf/README-RVV.md +0 -16
- package/deps/simdutf/SECURITY.md +0 -8
- package/deps/simdutf/benchmarks/CMakeLists.txt +0 -101
- package/deps/simdutf/benchmarks/alignment.cpp +0 -150
- package/deps/simdutf/benchmarks/base64/CMakeLists.txt +0 -30
- package/deps/simdutf/benchmarks/base64/benchmark_base64.cpp +0 -875
- package/deps/simdutf/benchmarks/base64/libbase64_spaces.h +0 -49
- package/deps/simdutf/benchmarks/base64/node_base64.h +0 -227
- package/deps/simdutf/benchmarks/base64/openssl3_base64.h +0 -334
- package/deps/simdutf/benchmarks/benchmark.cpp +0 -65
- package/deps/simdutf/benchmarks/benchmark_to_well_formed_utf16.cpp +0 -347
- package/deps/simdutf/benchmarks/competition/.clang-format-ignore +0 -5
- package/deps/simdutf/benchmarks/competition/CppCon2018/utf_utils.cpp +0 -1276
- package/deps/simdutf/benchmarks/competition/CppCon2018/utf_utils.h +0 -595
- package/deps/simdutf/benchmarks/competition/README.md +0 -7
- package/deps/simdutf/benchmarks/competition/hoehrmann/hoehrmann.h +0 -91
- package/deps/simdutf/benchmarks/competition/inoue2008/inoue_utf8_to_utf16.h +0 -444
- package/deps/simdutf/benchmarks/competition/inoue2008/inoue_utf8_to_utf16_tables.h +0 -13183
- package/deps/simdutf/benchmarks/competition/inoue2008/script.py +0 -73
- package/deps/simdutf/benchmarks/competition/llvm/ConvertUTF.cpp +0 -738
- package/deps/simdutf/benchmarks/competition/llvm/ConvertUTF.h +0 -293
- package/deps/simdutf/benchmarks/competition/u8u16/COPYRIGHT +0 -8
- package/deps/simdutf/benchmarks/competition/u8u16/Makefile +0 -44
- package/deps/simdutf/benchmarks/competition/u8u16/OSL3.0.txt +0 -169
- package/deps/simdutf/benchmarks/competition/u8u16/Profiling/BOM_Profiler.h +0 -148
- package/deps/simdutf/benchmarks/competition/u8u16/Profiling/i386_timer.h +0 -45
- package/deps/simdutf/benchmarks/competition/u8u16/Profiling/ppc_timer.c +0 -34
- package/deps/simdutf/benchmarks/competition/u8u16/README +0 -56
- package/deps/simdutf/benchmarks/competition/u8u16/config/config_defs.h +0 -43
- package/deps/simdutf/benchmarks/competition/u8u16/config/g4_config.h +0 -27
- package/deps/simdutf/benchmarks/competition/u8u16/config/mmx_config.h +0 -16
- package/deps/simdutf/benchmarks/competition/u8u16/config/p4_config.h +0 -18
- package/deps/simdutf/benchmarks/competition/u8u16/config/p4_ideal_config.h +0 -16
- package/deps/simdutf/benchmarks/competition/u8u16/config/spu_config.h +0 -28
- package/deps/simdutf/benchmarks/competition/u8u16/config/ssse3_config.h +0 -20
- package/deps/simdutf/benchmarks/competition/u8u16/iconv_u8u16.c +0 -2
- package/deps/simdutf/benchmarks/competition/u8u16/lib/altivec_simd.h +0 -440
- package/deps/simdutf/benchmarks/competition/u8u16/lib/libgen/make_basic_ops.py +0 -121
- package/deps/simdutf/benchmarks/competition/u8u16/lib/libgen/make_half_operand_versions.py +0 -158
- package/deps/simdutf/benchmarks/competition/u8u16/lib/libgen/make_test.py +0 -270
- package/deps/simdutf/benchmarks/competition/u8u16/lib/mmx_simd.h +0 -141
- package/deps/simdutf/benchmarks/competition/u8u16/lib/mmx_simd_basic.h +0 -216
- package/deps/simdutf/benchmarks/competition/u8u16/lib/mmx_simd_built_in.h +0 -119
- package/deps/simdutf/benchmarks/competition/u8u16/lib/mmx_simd_modified.h +0 -2430
- package/deps/simdutf/benchmarks/competition/u8u16/lib/outline.txt +0 -39
- package/deps/simdutf/benchmarks/competition/u8u16/lib/spu_simd.h +0 -421
- package/deps/simdutf/benchmarks/competition/u8u16/lib/sse_simd.h +0 -836
- package/deps/simdutf/benchmarks/competition/u8u16/lib/stdint.h +0 -222
- package/deps/simdutf/benchmarks/competition/u8u16/libu8u16_BE.c +0 -4
- package/deps/simdutf/benchmarks/competition/u8u16/libu8u16_LE.c +0 -5
- package/deps/simdutf/benchmarks/competition/u8u16/proto/u8u16.py +0 -390
- package/deps/simdutf/benchmarks/competition/u8u16/src/Makefile +0 -18
- package/deps/simdutf/benchmarks/competition/u8u16/src/bytelex.h +0 -448
- package/deps/simdutf/benchmarks/competition/u8u16/src/charsets/ASCII_EBCDIC.h +0 -284
- package/deps/simdutf/benchmarks/competition/u8u16/src/libu8u16.c +0 -1975
- package/deps/simdutf/benchmarks/competition/u8u16/src/libu8u16.pdf +0 -0
- package/deps/simdutf/benchmarks/competition/u8u16/src/libu8u16.w +0 -2263
- package/deps/simdutf/benchmarks/competition/u8u16/src/multiliteral.h +0 -239
- package/deps/simdutf/benchmarks/competition/u8u16/src/u8u16.c +0 -232
- package/deps/simdutf/benchmarks/competition/u8u16/src/x8x16.c +0 -194
- package/deps/simdutf/benchmarks/competition/u8u16/src/xml_error.c +0 -193
- package/deps/simdutf/benchmarks/competition/u8u16/src/xml_error.h +0 -167
- package/deps/simdutf/benchmarks/competition/u8u16/src/xmldecl.c +0 -288
- package/deps/simdutf/benchmarks/competition/u8u16/src/xmldecl.h +0 -117
- package/deps/simdutf/benchmarks/competition/u8u16/u8u16_g4.c +0 -2
- package/deps/simdutf/benchmarks/competition/u8u16/u8u16_mmx.c +0 -2
- package/deps/simdutf/benchmarks/competition/u8u16/u8u16_p4.c +0 -3
- package/deps/simdutf/benchmarks/competition/u8u16/u8u16_p4_ideal.c +0 -2
- package/deps/simdutf/benchmarks/competition/u8u16/u8u16_spu.c +0 -2
- package/deps/simdutf/benchmarks/competition/u8u16/u8u16_ssse3.c +0 -3
- package/deps/simdutf/benchmarks/competition/u8u16/x8x16_p4.c +0 -2
- package/deps/simdutf/benchmarks/competition/utf8lut/LICENSE +0 -23
- package/deps/simdutf/benchmarks/competition/utf8lut/data/test_minimal.txt +0 -44
- package/deps/simdutf/benchmarks/competition/utf8lut/readme.md +0 -106
- package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_clang_corr_tests.cmd +0 -11
- package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_clang_corr_tests.sh +0 -13
- package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_gcc_corr_tests.sh +0 -13
- package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_gcc_example.sh +0 -13
- package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_gcc_file_conv.sh +0 -14
- package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_gcc_iconv_lib.sh +0 -11
- package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_gcc_iconv_sample.sh +0 -8
- package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_mingw_corr_tests.cmd +0 -12
- package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_mingw_example.cmd +0 -13
- package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_mingw_file_conv.cmd +0 -14
- package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_mingw_iconv_lib.cmd +0 -11
- package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_mingw_iconv_sample.cmd +0 -8
- package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_msvc_corr_tests.cmd +0 -11
- package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_msvc_example.cmd +0 -12
- package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_msvc_file_conv.cmd +0 -13
- package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_msvc_iconv_lib.cmd +0 -10
- package/deps/simdutf/benchmarks/competition/utf8lut/scripts/build_msvc_iconv_sample.cmd +0 -9
- package/deps/simdutf/benchmarks/competition/utf8lut/scripts/html_table.py +0 -25
- package/deps/simdutf/benchmarks/competition/utf8lut/scripts/measure.py +0 -94
- package/deps/simdutf/benchmarks/competition/utf8lut/scripts/resize.py +0 -20
- package/deps/simdutf/benchmarks/competition/utf8lut/scripts/wipe_all.cmd +0 -2
- package/deps/simdutf/benchmarks/competition/utf8lut/scripts/wipe_interm.cmd +0 -1
- package/deps/simdutf/benchmarks/competition/utf8lut/src/base/CustomMemcpy.h +0 -75
- package/deps/simdutf/benchmarks/competition/utf8lut/src/base/PerfDefs.h +0 -47
- package/deps/simdutf/benchmarks/competition/utf8lut/src/base/Timing.cpp +0 -17
- package/deps/simdutf/benchmarks/competition/utf8lut/src/base/Timing.h +0 -76
- package/deps/simdutf/benchmarks/competition/utf8lut/src/buffer/AllProcessors.cpp +0 -35
- package/deps/simdutf/benchmarks/competition/utf8lut/src/buffer/BaseBufferProcessor.cpp +0 -117
- package/deps/simdutf/benchmarks/competition/utf8lut/src/buffer/BaseBufferProcessor.h +0 -210
- package/deps/simdutf/benchmarks/competition/utf8lut/src/buffer/BufferDecoder.h +0 -158
- package/deps/simdutf/benchmarks/competition/utf8lut/src/buffer/BufferEncoder.h +0 -104
- package/deps/simdutf/benchmarks/competition/utf8lut/src/buffer/ProcessorPlugins.h +0 -334
- package/deps/simdutf/benchmarks/competition/utf8lut/src/buffer/ProcessorSelector.h +0 -186
- package/deps/simdutf/benchmarks/competition/utf8lut/src/core/DecoderLut.cpp +0 -140
- package/deps/simdutf/benchmarks/competition/utf8lut/src/core/DecoderLut.h +0 -42
- package/deps/simdutf/benchmarks/competition/utf8lut/src/core/DecoderProcess.h +0 -100
- package/deps/simdutf/benchmarks/competition/utf8lut/src/core/Dfa.h +0 -57
- package/deps/simdutf/benchmarks/competition/utf8lut/src/core/EncoderLut.cpp +0 -85
- package/deps/simdutf/benchmarks/competition/utf8lut/src/core/EncoderLut.h +0 -27
- package/deps/simdutf/benchmarks/competition/utf8lut/src/core/EncoderProcess.h +0 -126
- package/deps/simdutf/benchmarks/competition/utf8lut/src/core/ProcessTrivial.h +0 -108
- package/deps/simdutf/benchmarks/competition/utf8lut/src/iconv/iconv.cpp +0 -139
- package/deps/simdutf/benchmarks/competition/utf8lut/src/iconv/iconv.h +0 -74
- package/deps/simdutf/benchmarks/competition/utf8lut/src/message/MessageConverter.cpp +0 -65
- package/deps/simdutf/benchmarks/competition/utf8lut/src/message/MessageConverter.h +0 -91
- package/deps/simdutf/benchmarks/competition/utf8lut/src/tests/CorrectnessTests.cpp +0 -772
- package/deps/simdutf/benchmarks/competition/utf8lut/src/tests/Example.cpp +0 -12
- package/deps/simdutf/benchmarks/competition/utf8lut/src/tests/FileConverter.cpp +0 -486
- package/deps/simdutf/benchmarks/competition/utf8lut/src/tests/iconv_sample.c +0 -162
- package/deps/simdutf/benchmarks/competition/utf8lut/src/utf8lut.h +0 -15
- package/deps/simdutf/benchmarks/competition/utf8sse4/fromutf8-sse.cpp +0 -292
- package/deps/simdutf/benchmarks/competition/utfcpp/LICENSE +0 -23
- package/deps/simdutf/benchmarks/competition/utfcpp/README.md +0 -1503
- package/deps/simdutf/benchmarks/competition/utfcpp/source/utf8/checked.h +0 -335
- package/deps/simdutf/benchmarks/competition/utfcpp/source/utf8/core.h +0 -338
- package/deps/simdutf/benchmarks/competition/utfcpp/source/utf8/cpp11.h +0 -103
- package/deps/simdutf/benchmarks/competition/utfcpp/source/utf8/cpp17.h +0 -103
- package/deps/simdutf/benchmarks/competition/utfcpp/source/utf8/unchecked.h +0 -274
- package/deps/simdutf/benchmarks/competition/utfcpp/source/utf8.h +0 -34
- package/deps/simdutf/benchmarks/dataset/README.md +0 -155
- package/deps/simdutf/benchmarks/dataset/emoji.txt +0 -204
- package/deps/simdutf/benchmarks/dataset/scripts/utf8type.py +0 -40
- package/deps/simdutf/benchmarks/dataset/wikipedia_mars/Makefile +0 -80
- package/deps/simdutf/benchmarks/dataset/wikipedia_mars/convert_to_utf6.py +0 -20
- package/deps/simdutf/benchmarks/find/CMakeLists.txt +0 -6
- package/deps/simdutf/benchmarks/find/findbenchmark.cpp +0 -63
- package/deps/simdutf/benchmarks/find/findbenchmarker.h +0 -46
- package/deps/simdutf/benchmarks/shortbench.cpp +0 -555
- package/deps/simdutf/benchmarks/src/CMakeLists.txt +0 -52
- package/deps/simdutf/benchmarks/src/apple_arm_events.h +0 -1104
- package/deps/simdutf/benchmarks/src/benchmark.cpp +0 -3899
- package/deps/simdutf/benchmarks/src/benchmark.h +0 -317
- package/deps/simdutf/benchmarks/src/benchmark_base.cpp +0 -144
- package/deps/simdutf/benchmarks/src/benchmark_base.h +0 -98
- package/deps/simdutf/benchmarks/src/cmdline.cpp +0 -176
- package/deps/simdutf/benchmarks/src/cmdline.h +0 -35
- package/deps/simdutf/benchmarks/src/event_counter.h +0 -162
- package/deps/simdutf/benchmarks/src/linux-perf-events.h +0 -104
- package/deps/simdutf/benchmarks/stream.cpp +0 -209
- package/deps/simdutf/benchmarks/threaded.cpp +0 -123
- package/deps/simdutf/cmake/CPM.cmake +0 -1363
- package/deps/simdutf/cmake/JoinPaths.cmake +0 -23
- package/deps/simdutf/cmake/add_cpp_test.cmake +0 -68
- package/deps/simdutf/cmake/simdutf-config.cmake.in +0 -2
- package/deps/simdutf/cmake/simdutf-flags.cmake +0 -26
- package/deps/simdutf/cmake/toolchains-ci/riscv64-linux-gnu.cmake +0 -4
- package/deps/simdutf/cmake/toolchains-dev/README.md +0 -32
- package/deps/simdutf/cmake/toolchains-dev/aarch64.cmake +0 -14
- package/deps/simdutf/cmake/toolchains-dev/loongarch64.cmake +0 -22
- package/deps/simdutf/cmake/toolchains-dev/powerpc64.cmake +0 -16
- package/deps/simdutf/cmake/toolchains-dev/powerpc64le.cmake +0 -16
- package/deps/simdutf/cmake/toolchains-dev/riscv64.cmake +0 -16
- package/deps/simdutf/cmake/toolchains-dev/rvv-spike.cmake +0 -38
- package/deps/simdutf/doc/avx512.png +0 -0
- package/deps/simdutf/doc/logo.png +0 -0
- package/deps/simdutf/doc/logo.svg +0 -165
- package/deps/simdutf/doc/node2023.png +0 -0
- package/deps/simdutf/doc/shortinput.md +0 -78
- package/deps/simdutf/doc/utf16utf8.png +0 -0
- package/deps/simdutf/doc/utf8utf16.png +0 -0
- package/deps/simdutf/doc/widelogo.png +0 -0
- package/deps/simdutf/doxygen.py +0 -50
- package/deps/simdutf/fuzz/.clang-format +0 -9
- package/deps/simdutf/fuzz/CMakeLists.txt +0 -45
- package/deps/simdutf/fuzz/README.md +0 -168
- package/deps/simdutf/fuzz/atomic_base64.cpp +0 -448
- package/deps/simdutf/fuzz/base64.cpp +0 -278
- package/deps/simdutf/fuzz/build.sh +0 -83
- package/deps/simdutf/fuzz/conversion.cpp +0 -669
- package/deps/simdutf/fuzz/helpers/.clang-format-ignore +0 -1
- package/deps/simdutf/fuzz/helpers/common.h +0 -135
- package/deps/simdutf/fuzz/helpers/nameof.hpp +0 -1258
- package/deps/simdutf/fuzz/main.cpp +0 -72
- package/deps/simdutf/fuzz/minimize_and_cleanse.sh +0 -87
- package/deps/simdutf/fuzz/misc.cpp +0 -216
- package/deps/simdutf/fuzz/random_fuzz.sh +0 -154
- package/deps/simdutf/fuzz/roundtrip.cpp +0 -588
- package/deps/simdutf/fuzz/safe_conversion.cpp +0 -104
- package/deps/simdutf/riscv/Dockerfile +0 -16
- package/deps/simdutf/riscv/README.md +0 -24
- package/deps/simdutf/riscv/remove-docker-station +0 -8
- package/deps/simdutf/riscv/run-docker-station +0 -31
- package/deps/simdutf/scripts/.flake8 +0 -2
- package/deps/simdutf/scripts/Makefile +0 -2
- package/deps/simdutf/scripts/README_ADD_FUNCTION.md +0 -49
- package/deps/simdutf/scripts/add_function.py +0 -330
- package/deps/simdutf/scripts/amalgamation_tests.py +0 -156
- package/deps/simdutf/scripts/base64/Makefile +0 -2
- package/deps/simdutf/scripts/base64/README.md +0 -2
- package/deps/simdutf/scripts/base64/avx512.py +0 -76
- package/deps/simdutf/scripts/base64/neon_decode.py +0 -143
- package/deps/simdutf/scripts/base64/neon_generate_lut.py +0 -101
- package/deps/simdutf/scripts/base64/sse.py +0 -252
- package/deps/simdutf/scripts/base64/sseregular.py +0 -160
- package/deps/simdutf/scripts/base64/sseurl.py +0 -283
- package/deps/simdutf/scripts/base64/table.py +0 -59
- package/deps/simdutf/scripts/base64bench_print.py +0 -145
- package/deps/simdutf/scripts/benchmark-all.py +0 -119
- package/deps/simdutf/scripts/benchmark_print.py +0 -324
- package/deps/simdutf/scripts/check_feature_macros.py +0 -156
- package/deps/simdutf/scripts/check_typos.sh +0 -13
- package/deps/simdutf/scripts/clang_format.sh +0 -35
- package/deps/simdutf/scripts/clang_format_docker.sh +0 -38
- package/deps/simdutf/scripts/common.py +0 -24
- package/deps/simdutf/scripts/compilation_benchmark.py +0 -55
- package/deps/simdutf/scripts/compile_many_variations.sh +0 -64
- package/deps/simdutf/scripts/create_latex_table.py +0 -62
- package/deps/simdutf/scripts/docker/Dockerfile +0 -14
- package/deps/simdutf/scripts/docker/Makefile +0 -9
- package/deps/simdutf/scripts/docker/README.md +0 -30
- package/deps/simdutf/scripts/docker/llvm.gpg +0 -0
- package/deps/simdutf/scripts/ppc64_convert_utf16_to_utf8.py +0 -155
- package/deps/simdutf/scripts/prepare_doxygen.sh +0 -21
- package/deps/simdutf/scripts/release.py +0 -197
- package/deps/simdutf/scripts/shortinputplots.py +0 -97
- package/deps/simdutf/scripts/sse_convert_utf16_to_utf8.py +0 -422
- package/deps/simdutf/scripts/sse_convert_utf32_to_utf16.py +0 -105
- package/deps/simdutf/scripts/sse_utf8_utf16_decode.py +0 -186
- package/deps/simdutf/scripts/sse_validate_utf16le_proof.py +0 -137
- package/deps/simdutf/scripts/sse_validate_utf16le_testcases.py +0 -129
- package/deps/simdutf/scripts/table.py +0 -207
- package/deps/simdutf/scripts/tests/new.txt +0 -33
- package/deps/simdutf/scripts/tests/old.txt +0 -33
- package/deps/simdutf/scripts/tests/results.txt +0 -272
- package/deps/simdutf/simdutf.pc.in +0 -11
- package/deps/simdutf/singleheader/.flake8 +0 -2
- package/deps/simdutf/singleheader/CMakeLists.txt +0 -64
- package/deps/simdutf/singleheader/README-dev.md +0 -81
- package/deps/simdutf/singleheader/README.md +0 -19
- package/deps/simdutf/singleheader/amalgamate.py +0 -513
- package/deps/simdutf/singleheader/amalgamation_demo.c +0 -59
- package/deps/simdutf/singleheader/amalgamation_demo.cpp +0 -54
- package/deps/simdutf/singleheader/test-features.py +0 -262
- package/deps/simdutf/src/CMakeLists.txt +0 -78
- package/deps/simdutf/tests/CMakeLists.txt +0 -483
- package/deps/simdutf/tests/atomic_base64_tests.cpp +0 -2845
- package/deps/simdutf/tests/base64_tests.cpp +0 -3617
- package/deps/simdutf/tests/basic_fuzzer.cpp +0 -805
- package/deps/simdutf/tests/bele_tests.cpp +0 -182
- package/deps/simdutf/tests/constexpr_base64_tests.cpp +0 -387
- package/deps/simdutf/tests/convert_latin1_to_utf16be_tests.cpp +0 -52
- package/deps/simdutf/tests/convert_latin1_to_utf16le_tests.cpp +0 -80
- package/deps/simdutf/tests/convert_latin1_to_utf32_tests.cpp +0 -66
- package/deps/simdutf/tests/convert_latin1_to_utf8_tests.cpp +0 -120
- package/deps/simdutf/tests/convert_utf16_to_utf8_safe_tests.cpp +0 -203
- package/deps/simdutf/tests/convert_utf16_to_utf8_with_replacement_tests.cpp +0 -276
- package/deps/simdutf/tests/convert_utf16be_to_latin1_tests.cpp +0 -109
- package/deps/simdutf/tests/convert_utf16be_to_latin1_tests_with_errors.cpp +0 -136
- package/deps/simdutf/tests/convert_utf16be_to_utf32_tests.cpp +0 -193
- package/deps/simdutf/tests/convert_utf16be_to_utf32_with_errors_tests.cpp +0 -381
- package/deps/simdutf/tests/convert_utf16be_to_utf8_tests.cpp +0 -259
- package/deps/simdutf/tests/convert_utf16be_to_utf8_with_errors_tests.cpp +0 -266
- package/deps/simdutf/tests/convert_utf16le_to_latin1_tests.cpp +0 -148
- package/deps/simdutf/tests/convert_utf16le_to_latin1_tests_with_errors.cpp +0 -176
- package/deps/simdutf/tests/convert_utf16le_to_utf32_tests.cpp +0 -213
- package/deps/simdutf/tests/convert_utf16le_to_utf32_with_errors_tests.cpp +0 -318
- package/deps/simdutf/tests/convert_utf16le_to_utf8_tests.cpp +0 -343
- package/deps/simdutf/tests/convert_utf16le_to_utf8_with_errors_tests.cpp +0 -271
- package/deps/simdutf/tests/convert_utf32_to_latin1_tests.cpp +0 -111
- package/deps/simdutf/tests/convert_utf32_to_latin1_with_errors_tests.cpp +0 -96
- package/deps/simdutf/tests/convert_utf32_to_utf16be_tests.cpp +0 -148
- package/deps/simdutf/tests/convert_utf32_to_utf16be_with_errors_tests.cpp +0 -192
- package/deps/simdutf/tests/convert_utf32_to_utf16le_tests.cpp +0 -166
- package/deps/simdutf/tests/convert_utf32_to_utf16le_with_errors_tests.cpp +0 -215
- package/deps/simdutf/tests/convert_utf32_to_utf8_tests.cpp +0 -181
- package/deps/simdutf/tests/convert_utf32_to_utf8_with_errors_tests.cpp +0 -261
- package/deps/simdutf/tests/convert_utf8_to_latin1_tests.cpp +0 -516
- package/deps/simdutf/tests/convert_utf8_to_latin1_with_errors_tests.cpp +0 -579
- package/deps/simdutf/tests/convert_utf8_to_utf16be_tests.cpp +0 -412
- package/deps/simdutf/tests/convert_utf8_to_utf16be_with_errors_tests.cpp +0 -480
- package/deps/simdutf/tests/convert_utf8_to_utf16le_tests.cpp +0 -671
- package/deps/simdutf/tests/convert_utf8_to_utf16le_with_errors_tests.cpp +0 -455
- package/deps/simdutf/tests/convert_utf8_to_utf32_tests.cpp +0 -1204
- package/deps/simdutf/tests/convert_utf8_to_utf32_with_errors_tests.cpp +0 -337
- package/deps/simdutf/tests/convert_valid_utf16be_to_latin1_tests.cpp +0 -37
- package/deps/simdutf/tests/convert_valid_utf16be_to_utf32_tests.cpp +0 -97
- package/deps/simdutf/tests/convert_valid_utf16be_to_utf8_tests.cpp +0 -126
- package/deps/simdutf/tests/convert_valid_utf16le_to_latin1_tests.cpp +0 -71
- package/deps/simdutf/tests/convert_valid_utf16le_to_utf32_tests.cpp +0 -122
- package/deps/simdutf/tests/convert_valid_utf16le_to_utf8_tests.cpp +0 -244
- package/deps/simdutf/tests/convert_valid_utf32_to_latin1_tests.cpp +0 -49
- package/deps/simdutf/tests/convert_valid_utf32_to_utf16be_tests.cpp +0 -92
- package/deps/simdutf/tests/convert_valid_utf32_to_utf16le_tests.cpp +0 -114
- package/deps/simdutf/tests/convert_valid_utf32_to_utf8_tests.cpp +0 -109
- package/deps/simdutf/tests/convert_valid_utf8_to_latin1_tests.cpp +0 -84
- package/deps/simdutf/tests/convert_valid_utf8_to_utf16be_tests.cpp +0 -124
- package/deps/simdutf/tests/convert_valid_utf8_to_utf16le_tests.cpp +0 -221
- package/deps/simdutf/tests/convert_valid_utf8_to_utf32_tests.cpp +0 -155
- package/deps/simdutf/tests/count_utf16be.cpp +0 -64
- package/deps/simdutf/tests/count_utf16le.cpp +0 -61
- package/deps/simdutf/tests/count_utf8.cpp +0 -87
- package/deps/simdutf/tests/detect_encodings_tests.cpp +0 -312
- package/deps/simdutf/tests/embed/valid_utf8.txt +0 -1
- package/deps/simdutf/tests/embed_tests.cpp +0 -22
- package/deps/simdutf/tests/find_tests.cpp +0 -77
- package/deps/simdutf/tests/fixed_string_tests.cpp +0 -153
- package/deps/simdutf/tests/helpers/CMakeLists.txt +0 -25
- package/deps/simdutf/tests/helpers/compiletime_conversions.h +0 -222
- package/deps/simdutf/tests/helpers/fixed_string.h +0 -267
- package/deps/simdutf/tests/helpers/random_int.cpp +0 -30
- package/deps/simdutf/tests/helpers/random_int.h +0 -39
- package/deps/simdutf/tests/helpers/random_utf16.cpp +0 -123
- package/deps/simdutf/tests/helpers/random_utf16.h +0 -52
- package/deps/simdutf/tests/helpers/random_utf32.cpp +0 -41
- package/deps/simdutf/tests/helpers/random_utf32.h +0 -40
- package/deps/simdutf/tests/helpers/random_utf8.cpp +0 -93
- package/deps/simdutf/tests/helpers/random_utf8.h +0 -36
- package/deps/simdutf/tests/helpers/test.cpp +0 -231
- package/deps/simdutf/tests/helpers/test.h +0 -193
- package/deps/simdutf/tests/helpers/transcode_test_base.cpp +0 -1257
- package/deps/simdutf/tests/helpers/transcode_test_base.h +0 -683
- package/deps/simdutf/tests/helpers/utf16.h +0 -27
- package/deps/simdutf/tests/installation_tests/find/CMakeLists.txt +0 -43
- package/deps/simdutf/tests/installation_tests/from_fetch/CMakeLists.txt +0 -47
- package/deps/simdutf/tests/internal_tests.cpp +0 -27
- package/deps/simdutf/tests/null_safety_tests.cpp +0 -94
- package/deps/simdutf/tests/random_fuzzer.cpp +0 -779
- package/deps/simdutf/tests/readme_tests.cpp +0 -274
- package/deps/simdutf/tests/reference/CMakeLists.txt +0 -23
- package/deps/simdutf/tests/reference/decode_utf16.h +0 -81
- package/deps/simdutf/tests/reference/decode_utf32.h +0 -47
- package/deps/simdutf/tests/reference/encode_latin1.cpp +0 -1
- package/deps/simdutf/tests/reference/encode_latin1.h +0 -32
- package/deps/simdutf/tests/reference/encode_utf16.cpp +0 -49
- package/deps/simdutf/tests/reference/encode_utf16.h +0 -20
- package/deps/simdutf/tests/reference/encode_utf32.cpp +0 -1
- package/deps/simdutf/tests/reference/encode_utf32.h +0 -36
- package/deps/simdutf/tests/reference/encode_utf8.cpp +0 -1
- package/deps/simdutf/tests/reference/encode_utf8.h +0 -40
- package/deps/simdutf/tests/reference/validate_utf16.cpp +0 -60
- package/deps/simdutf/tests/reference/validate_utf16.h +0 -14
- package/deps/simdutf/tests/reference/validate_utf16_to_latin1.cpp +0 -35
- package/deps/simdutf/tests/reference/validate_utf16_to_latin1.h +0 -13
- package/deps/simdutf/tests/reference/validate_utf32.cpp +0 -27
- package/deps/simdutf/tests/reference/validate_utf32.h +0 -12
- package/deps/simdutf/tests/reference/validate_utf32_to_latin1.cpp +0 -27
- package/deps/simdutf/tests/reference/validate_utf32_to_latin1.h +0 -12
- package/deps/simdutf/tests/reference/validate_utf8.cpp +0 -82
- package/deps/simdutf/tests/reference/validate_utf8.h +0 -11
- package/deps/simdutf/tests/reference/validate_utf8_to_latin1.cpp +0 -43
- package/deps/simdutf/tests/reference/validate_utf8_to_latin1.h +0 -12
- package/deps/simdutf/tests/select_implementation.cpp +0 -43
- package/deps/simdutf/tests/simdutf_c_tests.cpp +0 -244
- package/deps/simdutf/tests/span_tests.cpp +0 -401
- package/deps/simdutf/tests/special_tests.cpp +0 -559
- package/deps/simdutf/tests/straight_c_test.c +0 -187
- package/deps/simdutf/tests/text_encoding_tests.cpp +0 -77
- package/deps/simdutf/tests/to_well_formed_utf16_tests.cpp +0 -377
- package/deps/simdutf/tests/utf8_length_from_utf16_tests.cpp +0 -202
- package/deps/simdutf/tests/validate_ascii_basic_tests.cpp +0 -165
- package/deps/simdutf/tests/validate_ascii_with_errors_tests.cpp +0 -77
- package/deps/simdutf/tests/validate_utf16be_basic_tests.cpp +0 -175
- package/deps/simdutf/tests/validate_utf16be_with_errors_tests.cpp +0 -188
- package/deps/simdutf/tests/validate_utf16le_basic_tests.cpp +0 -268
- package/deps/simdutf/tests/validate_utf16le_with_errors_tests.cpp +0 -274
- package/deps/simdutf/tests/validate_utf32_basic_tests.cpp +0 -92
- package/deps/simdutf/tests/validate_utf32_with_errors_tests.cpp +0 -114
- package/deps/simdutf/tests/validate_utf8_basic_tests.cpp +0 -178
- package/deps/simdutf/tests/validate_utf8_brute_force_tests.cpp +0 -88
- package/deps/simdutf/tests/validate_utf8_puzzler_tests.cpp +0 -33
- package/deps/simdutf/tests/validate_utf8_with_errors_tests.cpp +0 -228
- package/deps/simdutf/tools/CMakeLists.txt +0 -85
- package/deps/simdutf/tools/fastbase64.cpp +0 -250
- package/deps/simdutf/tools/sutf.cpp +0 -556
- package/deps/simdutf/tools/sutf.h +0 -40
- package/lib/tsconfig.tsbuildinfo +0 -1
|
@@ -14,12 +14,9 @@
|
|
|
14
14
|
|
|
15
15
|
namespace margelo::nitro::crypto {
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
//
|
|
53
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
254
|
-
|
|
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
|
-
|
|
268
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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);
|
package/cpp/cipher/OCBCipher.cpp
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
136
|
-
std::memcpy(tag_copy, auth_tag_, kTagSize);
|
|
137
|
-
|
|
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
|
|
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
|
-
|
|
44
|
-
|
|
45
|
-
if (
|
|
46
|
-
|
|
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
|
-
|
|
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
|
|