react-native-quick-crypto 1.1.0 → 1.1.2
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/QuickCrypto.podspec +1 -0
- package/android/CMakeLists.txt +4 -0
- 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 +35 -26
- package/cpp/cipher/CCMCipher.hpp +2 -4
- package/cpp/cipher/ChaCha20Cipher.cpp +19 -27
- package/cpp/cipher/ChaCha20Cipher.hpp +2 -4
- package/cpp/cipher/ChaCha20Poly1305Cipher.cpp +41 -36
- package/cpp/cipher/ChaCha20Poly1305Cipher.hpp +2 -4
- package/cpp/cipher/GCMCipher.cpp +17 -20
- package/cpp/cipher/HybridCipher.cpp +44 -47
- package/cpp/cipher/HybridCipher.hpp +17 -1
- package/cpp/cipher/HybridRsaCipher.cpp +93 -56
- package/cpp/cipher/OCBCipher.cpp +5 -5
- package/cpp/cipher/XChaCha20Poly1305Cipher.cpp +27 -32
- package/cpp/cipher/XSalsa20Cipher.cpp +78 -16
- package/cpp/cipher/XSalsa20Cipher.hpp +25 -3
- package/cpp/cipher/XSalsa20Poly1305Cipher.cpp +32 -41
- 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/keys/HybridKeyObjectHandle.cpp +630 -2
- package/cpp/keys/HybridKeyObjectHandle.hpp +21 -1
- 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 +47 -72
- package/cpp/sign/HybridVerifyHandle.cpp +47 -67
- package/cpp/slhdsa/HybridSlhDsaKeyPair.cpp +245 -0
- package/cpp/slhdsa/HybridSlhDsaKeyPair.hpp +48 -0
- package/cpp/turboshake/HybridTurboShake.cpp +379 -0
- package/cpp/turboshake/HybridTurboShake.hpp +28 -0
- package/cpp/utils/HybridUtils.cpp +195 -43
- package/cpp/utils/HybridUtils.hpp +9 -2
- package/cpp/utils/QuickCryptoUtils.hpp +72 -0
- package/deps/blake3/README.md +6 -7
- package/deps/blake3/c/blake3.c +3 -2
- package/deps/blake3/c/blake3.h +2 -2
- package/deps/blake3/c/blake3_dispatch.c +2 -2
- package/deps/blake3/c/blake3_impl.h +1 -1
- package/deps/blake3/c/blake3_neon.c +5 -4
- package/deps/ncrypto/include/ncrypto/version.h +2 -2
- package/deps/ncrypto/include/ncrypto.h +9 -2
- package/deps/ncrypto/src/ncrypto.cpp +130 -35
- 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/dhKeyPair.js +3 -0
- package/lib/commonjs/dhKeyPair.js.map +1 -1
- package/lib/commonjs/dsa.js +11 -2
- package/lib/commonjs/dsa.js.map +1 -1
- package/lib/commonjs/ec.js +37 -30
- package/lib/commonjs/ec.js.map +1 -1
- package/lib/commonjs/ed.js +60 -6
- package/lib/commonjs/ed.js.map +1 -1
- package/lib/commonjs/hash.js +67 -10
- 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/classes.js +33 -7
- package/lib/commonjs/keys/classes.js.map +1 -1
- package/lib/commonjs/keys/generateKeyPair.js +85 -4
- package/lib/commonjs/keys/generateKeyPair.js.map +1 -1
- package/lib/commonjs/keys/index.js +50 -2
- package/lib/commonjs/keys/index.js.map +1 -1
- package/lib/commonjs/keys/publicCipher.js +10 -4
- package/lib/commonjs/keys/publicCipher.js.map +1 -1
- package/lib/commonjs/keys/signVerify.js +9 -2
- package/lib/commonjs/keys/signVerify.js.map +1 -1
- package/lib/commonjs/keys/utils.js +59 -1
- package/lib/commonjs/keys/utils.js.map +1 -1
- package/lib/commonjs/random.js +74 -11
- package/lib/commonjs/random.js.map +1 -1
- package/lib/commonjs/rsa.js +15 -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/slhdsa.js +70 -0
- package/lib/commonjs/slhdsa.js.map +1 -0
- package/lib/commonjs/specs/slhDsaKeyPair.nitro.js +6 -0
- package/lib/commonjs/specs/slhDsaKeyPair.nitro.js.map +1 -0
- package/lib/commonjs/specs/turboshake.nitro.js +6 -0
- package/lib/commonjs/specs/turboshake.nitro.js.map +1 -0
- package/lib/commonjs/subtle.js +975 -253
- 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 +86 -28
- package/lib/commonjs/utils/conversion.js.map +1 -1
- package/lib/commonjs/utils/errors.js +63 -4
- package/lib/commonjs/utils/errors.js.map +1 -1
- package/lib/commonjs/utils/timingSafeEqual.js +7 -2
- package/lib/commonjs/utils/timingSafeEqual.js.map +1 -1
- package/lib/commonjs/utils/types.js.map +1 -1
- package/lib/commonjs/utils/validation.js +46 -0
- package/lib/commonjs/utils/validation.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/dhKeyPair.js +3 -0
- package/lib/module/dhKeyPair.js.map +1 -1
- package/lib/module/dsa.js +11 -2
- package/lib/module/dsa.js.map +1 -1
- package/lib/module/ec.js +38 -31
- package/lib/module/ec.js.map +1 -1
- package/lib/module/ed.js +61 -7
- package/lib/module/ed.js.map +1 -1
- package/lib/module/hash.js +67 -10
- 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/classes.js +31 -5
- package/lib/module/keys/classes.js.map +1 -1
- package/lib/module/keys/generateKeyPair.js +86 -5
- package/lib/module/keys/generateKeyPair.js.map +1 -1
- package/lib/module/keys/index.js +50 -2
- package/lib/module/keys/index.js.map +1 -1
- package/lib/module/keys/publicCipher.js +10 -4
- package/lib/module/keys/publicCipher.js.map +1 -1
- package/lib/module/keys/signVerify.js +9 -2
- package/lib/module/keys/signVerify.js.map +1 -1
- package/lib/module/keys/utils.js +57 -1
- package/lib/module/keys/utils.js.map +1 -1
- package/lib/module/random.js +74 -12
- package/lib/module/random.js.map +1 -1
- package/lib/module/rsa.js +14 -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/slhdsa.js +64 -0
- package/lib/module/slhdsa.js.map +1 -0
- package/lib/module/specs/slhDsaKeyPair.nitro.js +4 -0
- package/lib/module/specs/slhDsaKeyPair.nitro.js.map +1 -0
- package/lib/module/specs/turboshake.nitro.js +4 -0
- package/lib/module/specs/turboshake.nitro.js.map +1 -0
- package/lib/module/subtle.js +976 -254
- 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 +84 -28
- package/lib/module/utils/conversion.js.map +1 -1
- package/lib/module/utils/errors.js +61 -4
- package/lib/module/utils/errors.js.map +1 -1
- package/lib/module/utils/timingSafeEqual.js +8 -3
- package/lib/module/utils/timingSafeEqual.js.map +1 -1
- package/lib/module/utils/types.js.map +1 -1
- package/lib/module/utils/validation.js +44 -0
- package/lib/module/utils/validation.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/dhKeyPair.d.ts.map +1 -1
- package/lib/typescript/dsa.d.ts.map +1 -1
- package/lib/typescript/ec.d.ts.map +1 -1
- package/lib/typescript/ed.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 +13 -8
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/keys/classes.d.ts +10 -1
- package/lib/typescript/keys/classes.d.ts.map +1 -1
- package/lib/typescript/keys/generateKeyPair.d.ts +12 -1
- package/lib/typescript/keys/generateKeyPair.d.ts.map +1 -1
- package/lib/typescript/keys/index.d.ts +3 -1
- package/lib/typescript/keys/index.d.ts.map +1 -1
- package/lib/typescript/keys/publicCipher.d.ts.map +1 -1
- package/lib/typescript/keys/signVerify.d.ts.map +1 -1
- package/lib/typescript/keys/utils.d.ts +21 -4
- package/lib/typescript/keys/utils.d.ts.map +1 -1
- package/lib/typescript/random.d.ts +5 -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/slhdsa.d.ts +19 -0
- package/lib/typescript/slhdsa.d.ts.map +1 -0
- package/lib/typescript/specs/keyObjectHandle.nitro.d.ts +9 -0
- package/lib/typescript/specs/keyObjectHandle.nitro.d.ts.map +1 -1
- package/lib/typescript/specs/slhDsaKeyPair.nitro.d.ts +16 -0
- package/lib/typescript/specs/slhDsaKeyPair.nitro.d.ts.map +1 -0
- package/lib/typescript/specs/turboshake.nitro.d.ts +11 -0
- package/lib/typescript/specs/turboshake.nitro.d.ts.map +1 -0
- 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 +3 -2
- 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 +13 -9
- package/lib/typescript/utils/conversion.d.ts.map +1 -1
- package/lib/typescript/utils/errors.d.ts +12 -0
- package/lib/typescript/utils/errors.d.ts.map +1 -1
- package/lib/typescript/utils/timingSafeEqual.d.ts.map +1 -1
- package/lib/typescript/utils/types.d.ts +32 -15
- package/lib/typescript/utils/types.d.ts.map +1 -1
- package/lib/typescript/utils/validation.d.ts +3 -1
- package/lib/typescript/utils/validation.d.ts.map +1 -1
- package/lib/typescript/x509certificate.d.ts.map +1 -1
- package/nitrogen/generated/android/QuickCrypto+autolinking.cmake +2 -0
- package/nitrogen/generated/android/QuickCryptoOnLoad.cpp +20 -0
- package/nitrogen/generated/ios/QuickCryptoAutolinking.mm +20 -0
- package/nitrogen/generated/shared/c++/AsymmetricKeyType.hpp +48 -0
- package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.cpp +9 -0
- package/nitrogen/generated/shared/c++/HybridKeyObjectHandleSpec.hpp +9 -0
- package/nitrogen/generated/shared/c++/HybridSlhDsaKeyPairSpec.cpp +29 -0
- package/nitrogen/generated/shared/c++/HybridSlhDsaKeyPairSpec.hpp +72 -0
- package/nitrogen/generated/shared/c++/HybridTurboShakeSpec.cpp +22 -0
- package/nitrogen/generated/shared/c++/HybridTurboShakeSpec.hpp +70 -0
- package/nitrogen/generated/shared/c++/HybridUtilsSpec.cpp +0 -2
- package/nitrogen/generated/shared/c++/HybridUtilsSpec.hpp +0 -3
- package/nitrogen/generated/shared/c++/JWK.hpp +9 -1
- package/nitrogen/generated/shared/c++/JWKkty.hpp +4 -0
- package/nitrogen/generated/shared/c++/KangarooTwelveVariant.hpp +76 -0
- package/nitrogen/generated/shared/c++/TurboShakeVariant.hpp +76 -0
- package/package.json +38 -7
- package/src/argon2.ts +80 -2
- package/src/cipher.ts +139 -15
- package/src/dhKeyPair.ts +8 -0
- package/src/dsa.ts +19 -2
- package/src/ec.ts +52 -29
- package/src/ed.ts +95 -16
- package/src/hash.ts +125 -12
- package/src/hkdf.ts +44 -6
- package/src/hmac.ts +17 -7
- package/src/keys/classes.ts +46 -5
- package/src/keys/generateKeyPair.ts +151 -5
- package/src/keys/index.ts +73 -3
- package/src/keys/publicCipher.ts +10 -4
- package/src/keys/signVerify.ts +13 -2
- package/src/keys/utils.ts +78 -5
- package/src/random.ts +104 -11
- package/src/rsa.ts +26 -4
- package/src/scrypt.ts +73 -6
- package/src/slhdsa.ts +146 -0
- package/src/specs/keyObjectHandle.nitro.ts +17 -0
- package/src/specs/slhDsaKeyPair.nitro.ts +29 -0
- package/src/specs/turboshake.nitro.ts +21 -0
- package/src/specs/utils.nitro.ts +0 -2
- package/src/subtle.ts +1246 -333
- package/src/utils/cipher.ts +30 -8
- package/src/utils/conversion.ts +129 -40
- package/src/utils/errors.ts +72 -4
- package/src/utils/timingSafeEqual.ts +8 -3
- package/src/utils/types.ts +80 -15
- package/src/utils/validation.ts +70 -1
- 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
package/cpp/cipher/GCMCipher.cpp
CHANGED
|
@@ -7,11 +7,13 @@
|
|
|
7
7
|
namespace margelo::nitro::crypto {
|
|
8
8
|
|
|
9
9
|
void GCMCipher::init(const std::shared_ptr<ArrayBuffer> cipher_key, const std::shared_ptr<ArrayBuffer> iv) {
|
|
10
|
-
//
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
// Resetting the unique_ptr frees any previous context.
|
|
11
|
+
ctx.reset();
|
|
12
|
+
is_finalized = false;
|
|
13
|
+
has_update_called = false;
|
|
14
|
+
has_aad = false;
|
|
15
|
+
pending_auth_failed = false;
|
|
16
|
+
auth_tag_state = kAuthTagUnknown;
|
|
15
17
|
|
|
16
18
|
// 1. Get cipher implementation by name
|
|
17
19
|
const EVP_CIPHER* cipher = EVP_get_cipherbyname(cipher_type.c_str());
|
|
@@ -20,47 +22,42 @@ void GCMCipher::init(const std::shared_ptr<ArrayBuffer> cipher_key, const std::s
|
|
|
20
22
|
}
|
|
21
23
|
|
|
22
24
|
// 2. Create a new context
|
|
23
|
-
ctx
|
|
25
|
+
ctx.reset(EVP_CIPHER_CTX_new());
|
|
24
26
|
if (!ctx) {
|
|
25
27
|
throw std::runtime_error("Failed to create cipher context");
|
|
26
28
|
}
|
|
27
29
|
|
|
28
30
|
// 3. Initialize with cipher type only (no key/IV yet)
|
|
29
|
-
if (EVP_CipherInit_ex(ctx, cipher, nullptr, nullptr, nullptr, is_cipher) != 1) {
|
|
31
|
+
if (EVP_CipherInit_ex(ctx.get(), cipher, nullptr, nullptr, nullptr, is_cipher) != 1) {
|
|
30
32
|
unsigned long err = ERR_get_error();
|
|
31
33
|
char err_buf[256];
|
|
32
34
|
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
33
|
-
|
|
34
|
-
ctx = nullptr;
|
|
35
|
+
ctx.reset();
|
|
35
36
|
throw std::runtime_error("GCMCipher: Failed initial CipherInit setup: " + std::string(err_buf));
|
|
36
37
|
}
|
|
37
38
|
|
|
38
39
|
// 4. Set IV length for non-standard IV sizes (GCM default is 96 bits/12 bytes)
|
|
39
|
-
|
|
40
|
-
size_t iv_len = native_iv->size();
|
|
40
|
+
size_t iv_len = iv->size();
|
|
41
41
|
|
|
42
42
|
if (iv_len != 12) { // Only set if not the default length
|
|
43
|
-
if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, static_cast<int>(iv_len), nullptr) != 1) {
|
|
43
|
+
if (EVP_CIPHER_CTX_ctrl(ctx.get(), EVP_CTRL_GCM_SET_IVLEN, static_cast<int>(iv_len), nullptr) != 1) {
|
|
44
44
|
unsigned long err = ERR_get_error();
|
|
45
45
|
char err_buf[256];
|
|
46
46
|
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
47
|
-
|
|
48
|
-
ctx = nullptr;
|
|
47
|
+
ctx.reset();
|
|
49
48
|
throw std::runtime_error("GCMCipher: Failed to set IV length: " + std::string(err_buf));
|
|
50
49
|
}
|
|
51
50
|
}
|
|
52
51
|
|
|
53
52
|
// 5. Now set the key and IV
|
|
54
|
-
|
|
55
|
-
const unsigned char*
|
|
56
|
-
const unsigned char* iv_ptr = reinterpret_cast<const unsigned char*>(native_iv->data());
|
|
53
|
+
const unsigned char* key_ptr = reinterpret_cast<const unsigned char*>(cipher_key->data());
|
|
54
|
+
const unsigned char* iv_ptr = reinterpret_cast<const unsigned char*>(iv->data());
|
|
57
55
|
|
|
58
|
-
if (EVP_CipherInit_ex(ctx, nullptr, nullptr, key_ptr, iv_ptr, is_cipher) != 1) {
|
|
56
|
+
if (EVP_CipherInit_ex(ctx.get(), nullptr, nullptr, key_ptr, iv_ptr, is_cipher) != 1) {
|
|
59
57
|
unsigned long err = ERR_get_error();
|
|
60
58
|
char err_buf[256];
|
|
61
59
|
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
62
|
-
|
|
63
|
-
ctx = nullptr;
|
|
60
|
+
ctx.reset();
|
|
64
61
|
throw std::runtime_error("GCMCipher: Failed to set key/IV: " + std::string(err_buf));
|
|
65
62
|
}
|
|
66
63
|
}
|
|
@@ -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,35 +66,31 @@ 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
|
|
|
82
84
|
// For base hybrid cipher, set key and IV immediately.
|
|
83
85
|
// Derived classes like CCM might override init and handle this differently.
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
const unsigned char* key_ptr = reinterpret_cast<const unsigned char*>(native_key->data());
|
|
87
|
-
const unsigned char* iv_ptr = reinterpret_cast<const unsigned char*>(native_iv->data());
|
|
86
|
+
const unsigned char* key_ptr = reinterpret_cast<const unsigned char*>(cipher_key->data());
|
|
87
|
+
const unsigned char* iv_ptr = reinterpret_cast<const unsigned char*>(iv->data());
|
|
88
88
|
|
|
89
|
-
if (EVP_CipherInit_ex(ctx, nullptr, nullptr, key_ptr, iv_ptr, is_cipher) != 1) {
|
|
89
|
+
if (EVP_CipherInit_ex(ctx.get(), nullptr, nullptr, key_ptr, iv_ptr, is_cipher) != 1) {
|
|
90
90
|
unsigned long err = ERR_get_error();
|
|
91
91
|
char err_buf[256];
|
|
92
92
|
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
93
|
-
|
|
94
|
-
ctx = nullptr;
|
|
93
|
+
ctx.reset();
|
|
95
94
|
throw std::runtime_error("HybridCipher: Failed to set key/IV: " + std::string(err_buf));
|
|
96
95
|
}
|
|
97
96
|
|
|
@@ -99,49 +98,49 @@ void HybridCipher::init(const std::shared_ptr<ArrayBuffer> cipher_key, const std
|
|
|
99
98
|
std::string cipher_name(cipher_type);
|
|
100
99
|
if (cipher_name.find("-wrap") != std::string::npos) {
|
|
101
100
|
// 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);
|
|
101
|
+
EVP_CIPHER_CTX_set_flags(ctx.get(), EVP_CIPHER_CTX_FLAG_WRAP_ALLOW);
|
|
102
|
+
EVP_CIPHER_CTX_set_padding(ctx.get(), 0);
|
|
104
103
|
}
|
|
105
104
|
}
|
|
106
105
|
|
|
107
106
|
std::shared_ptr<ArrayBuffer> HybridCipher::update(const std::shared_ptr<ArrayBuffer>& data) {
|
|
108
|
-
auto native_data = ToNativeArrayBuffer(data);
|
|
109
107
|
checkCtx();
|
|
110
108
|
checkNotFinalized();
|
|
111
|
-
|
|
109
|
+
has_update_called = true;
|
|
110
|
+
size_t in_len = data->size();
|
|
112
111
|
if (in_len > INT_MAX) {
|
|
113
112
|
throw std::runtime_error("Message too long");
|
|
114
113
|
}
|
|
115
114
|
|
|
116
|
-
int out_len = in_len + EVP_CIPHER_CTX_block_size(ctx);
|
|
117
|
-
|
|
115
|
+
int out_len = in_len + EVP_CIPHER_CTX_block_size(ctx.get());
|
|
116
|
+
auto out_buf = std::make_unique<uint8_t[]>(out_len);
|
|
118
117
|
// Perform the cipher update operation. The real size of the output is
|
|
119
118
|
// returned in out_len
|
|
120
|
-
int ret = EVP_CipherUpdate(ctx,
|
|
119
|
+
int ret = EVP_CipherUpdate(ctx.get(), out_buf.get(), &out_len, data->data(), in_len);
|
|
121
120
|
|
|
122
121
|
if (!ret) {
|
|
123
122
|
unsigned long err = ERR_get_error();
|
|
124
123
|
char err_buf[256];
|
|
125
124
|
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
126
|
-
delete[] out;
|
|
127
125
|
throw std::runtime_error("Cipher update failed: " + std::string(err_buf));
|
|
128
126
|
}
|
|
129
127
|
|
|
130
128
|
// Create and return a new buffer of exact size needed
|
|
131
|
-
|
|
129
|
+
uint8_t* raw_ptr = out_buf.get();
|
|
130
|
+
return std::make_shared<NativeArrayBuffer>(out_buf.release(), out_len, [raw_ptr]() { delete[] raw_ptr; });
|
|
132
131
|
}
|
|
133
132
|
|
|
134
133
|
std::shared_ptr<ArrayBuffer> HybridCipher::final() {
|
|
135
134
|
checkCtx();
|
|
136
135
|
checkNotFinalized();
|
|
137
136
|
// 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);
|
|
137
|
+
int block_size = EVP_CIPHER_CTX_block_size(ctx.get());
|
|
139
138
|
if (block_size <= 0)
|
|
140
139
|
block_size = 16; // Default if block size is weird (e.g., 0)
|
|
141
140
|
auto out_buf = std::make_unique<uint8_t[]>(block_size);
|
|
142
141
|
int out_len = 0;
|
|
143
142
|
|
|
144
|
-
int ret = EVP_CipherFinal_ex(ctx, out_buf.get(), &out_len);
|
|
143
|
+
int ret = EVP_CipherFinal_ex(ctx.get(), out_buf.get(), &out_len);
|
|
145
144
|
if (!ret) {
|
|
146
145
|
unsigned long err = ERR_get_error();
|
|
147
146
|
char err_buf[256];
|
|
@@ -165,11 +164,10 @@ std::shared_ptr<ArrayBuffer> HybridCipher::final() {
|
|
|
165
164
|
|
|
166
165
|
bool HybridCipher::setAAD(const std::shared_ptr<ArrayBuffer>& data, std::optional<double> plaintextLength) {
|
|
167
166
|
checkCtx();
|
|
168
|
-
|
|
169
|
-
|
|
167
|
+
checkAADBeforeUpdate();
|
|
170
168
|
// Set the AAD
|
|
171
169
|
int out_len;
|
|
172
|
-
if (!EVP_CipherUpdate(ctx, nullptr, &out_len,
|
|
170
|
+
if (!EVP_CipherUpdate(ctx.get(), nullptr, &out_len, data->data(), data->size())) {
|
|
173
171
|
return false;
|
|
174
172
|
}
|
|
175
173
|
|
|
@@ -179,7 +177,7 @@ bool HybridCipher::setAAD(const std::shared_ptr<ArrayBuffer>& data, std::optiona
|
|
|
179
177
|
|
|
180
178
|
bool HybridCipher::setAutoPadding(bool autoPad) {
|
|
181
179
|
checkCtx();
|
|
182
|
-
return EVP_CIPHER_CTX_set_padding(ctx, autoPad) == 1;
|
|
180
|
+
return EVP_CIPHER_CTX_set_padding(ctx.get(), autoPad) == 1;
|
|
183
181
|
}
|
|
184
182
|
|
|
185
183
|
bool HybridCipher::setAuthTag(const std::shared_ptr<ArrayBuffer>& tag) {
|
|
@@ -189,11 +187,10 @@ bool HybridCipher::setAuthTag(const std::shared_ptr<ArrayBuffer>& tag) {
|
|
|
189
187
|
throw std::runtime_error("setAuthTag can only be called during decryption.");
|
|
190
188
|
}
|
|
191
189
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
uint8_t* tag_ptr = native_tag->data();
|
|
190
|
+
size_t tag_len = tag->size();
|
|
191
|
+
uint8_t* tag_ptr = tag->data();
|
|
195
192
|
|
|
196
|
-
int mode = EVP_CIPHER_CTX_mode(ctx);
|
|
193
|
+
int mode = EVP_CIPHER_CTX_mode(ctx.get());
|
|
197
194
|
|
|
198
195
|
if (mode == EVP_CIPH_GCM_MODE || mode == EVP_CIPH_OCB_MODE) {
|
|
199
196
|
// Use EVP_CTRL_AEAD_SET_TAG for GCM/OCB decryption
|
|
@@ -202,10 +199,10 @@ bool HybridCipher::setAuthTag(const std::shared_ptr<ArrayBuffer>& tag) {
|
|
|
202
199
|
}
|
|
203
200
|
// Add check for valid cipher in context before setting tag
|
|
204
201
|
// Use the correct OpenSSL 3 function: EVP_CIPHER_CTX_cipher
|
|
205
|
-
if (!EVP_CIPHER_CTX_cipher(ctx)) {
|
|
202
|
+
if (!EVP_CIPHER_CTX_cipher(ctx.get())) {
|
|
206
203
|
throw std::runtime_error("Context has no cipher set before setting GCM/OCB tag");
|
|
207
204
|
}
|
|
208
|
-
if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, tag_len, tag_ptr) <= 0) {
|
|
205
|
+
if (EVP_CIPHER_CTX_ctrl(ctx.get(), EVP_CTRL_AEAD_SET_TAG, tag_len, tag_ptr) <= 0) {
|
|
209
206
|
unsigned long err = ERR_get_error();
|
|
210
207
|
char err_buf[256];
|
|
211
208
|
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
@@ -235,7 +232,7 @@ bool HybridCipher::setAuthTag(const std::shared_ptr<ArrayBuffer>& tag) {
|
|
|
235
232
|
std::shared_ptr<ArrayBuffer> HybridCipher::getAuthTag() {
|
|
236
233
|
checkCtx();
|
|
237
234
|
|
|
238
|
-
int mode = EVP_CIPHER_CTX_mode(ctx);
|
|
235
|
+
int mode = EVP_CIPHER_CTX_mode(ctx.get());
|
|
239
236
|
|
|
240
237
|
if (!is_cipher) {
|
|
241
238
|
throw std::runtime_error("getAuthTag can only be called during encryption.");
|
|
@@ -246,7 +243,7 @@ std::shared_ptr<ArrayBuffer> HybridCipher::getAuthTag() {
|
|
|
246
243
|
constexpr int max_tag_len = 16; // GCM/OCB tags are typically up to 16 bytes
|
|
247
244
|
auto tag_buf = std::make_unique<uint8_t[]>(max_tag_len);
|
|
248
245
|
|
|
249
|
-
int ret = EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, max_tag_len, tag_buf.get());
|
|
246
|
+
int ret = EVP_CIPHER_CTX_ctrl(ctx.get(), EVP_CTRL_AEAD_GET_TAG, max_tag_len, tag_buf.get());
|
|
250
247
|
|
|
251
248
|
if (ret <= 0) {
|
|
252
249
|
unsigned long err = ERR_get_error();
|
|
@@ -283,7 +280,7 @@ int HybridCipher::getMode() {
|
|
|
283
280
|
if (!ctx) {
|
|
284
281
|
throw std::runtime_error("Cipher not initialized. Did you call setArgs()?");
|
|
285
282
|
}
|
|
286
|
-
return EVP_CIPHER_CTX_get_mode(ctx);
|
|
283
|
+
return EVP_CIPHER_CTX_get_mode(ctx.get());
|
|
287
284
|
}
|
|
288
285
|
|
|
289
286
|
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,
|
|
@@ -70,15 +102,14 @@ std::shared_ptr<ArrayBuffer> HybridRsaCipher::encrypt(const std::shared_ptr<Hybr
|
|
|
70
102
|
}
|
|
71
103
|
|
|
72
104
|
if (label.has_value() && label.value()->size() > 0) {
|
|
73
|
-
|
|
74
|
-
unsigned char* label_copy = (unsigned char*)OPENSSL_malloc(native_label->size());
|
|
105
|
+
unsigned char* label_copy = (unsigned char*)OPENSSL_malloc(label.value()->size());
|
|
75
106
|
if (!label_copy) {
|
|
76
107
|
EVP_PKEY_CTX_free(ctx);
|
|
77
108
|
throw std::runtime_error("Failed to allocate memory for label");
|
|
78
109
|
}
|
|
79
|
-
std::memcpy(label_copy,
|
|
110
|
+
std::memcpy(label_copy, label.value()->data(), label.value()->size());
|
|
80
111
|
|
|
81
|
-
if (EVP_PKEY_CTX_set0_rsa_oaep_label(ctx, label_copy,
|
|
112
|
+
if (EVP_PKEY_CTX_set0_rsa_oaep_label(ctx, label_copy, label.value()->size()) <= 0) {
|
|
82
113
|
OPENSSL_free(label_copy);
|
|
83
114
|
EVP_PKEY_CTX_free(ctx);
|
|
84
115
|
throw std::runtime_error("Failed to set OAEP label");
|
|
@@ -86,9 +117,8 @@ std::shared_ptr<ArrayBuffer> HybridRsaCipher::encrypt(const std::shared_ptr<Hybr
|
|
|
86
117
|
}
|
|
87
118
|
}
|
|
88
119
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
size_t inlen = native_data->size();
|
|
120
|
+
const unsigned char* in = data->data();
|
|
121
|
+
size_t inlen = data->size();
|
|
92
122
|
|
|
93
123
|
size_t outlen;
|
|
94
124
|
if (EVP_PKEY_encrypt(ctx, nullptr, &outlen, in, inlen) <= 0) {
|
|
@@ -147,6 +177,11 @@ std::shared_ptr<ArrayBuffer> HybridRsaCipher::decrypt(const std::shared_ptr<Hybr
|
|
|
147
177
|
throw std::runtime_error("Failed to set RSA padding");
|
|
148
178
|
}
|
|
149
179
|
|
|
180
|
+
if (!enableImplicitRejectionIfPkcs1(ctx, opensslPadding)) {
|
|
181
|
+
EVP_PKEY_CTX_free(ctx);
|
|
182
|
+
throw std::runtime_error("RSA PKCS#1 v1.5 decryption requires OpenSSL implicit-rejection support (>= 3.2)");
|
|
183
|
+
}
|
|
184
|
+
|
|
150
185
|
if (paddingInt == kRsaOaepPadding) {
|
|
151
186
|
const EVP_MD* md = getDigestByName(hashAlgorithm);
|
|
152
187
|
if (EVP_PKEY_CTX_set_rsa_oaep_md(ctx, md) <= 0) {
|
|
@@ -160,15 +195,14 @@ std::shared_ptr<ArrayBuffer> HybridRsaCipher::decrypt(const std::shared_ptr<Hybr
|
|
|
160
195
|
}
|
|
161
196
|
|
|
162
197
|
if (label.has_value() && label.value()->size() > 0) {
|
|
163
|
-
|
|
164
|
-
unsigned char* label_copy = (unsigned char*)OPENSSL_malloc(native_label->size());
|
|
198
|
+
unsigned char* label_copy = (unsigned char*)OPENSSL_malloc(label.value()->size());
|
|
165
199
|
if (!label_copy) {
|
|
166
200
|
EVP_PKEY_CTX_free(ctx);
|
|
167
201
|
throw std::runtime_error("Failed to allocate memory for label");
|
|
168
202
|
}
|
|
169
|
-
std::memcpy(label_copy,
|
|
203
|
+
std::memcpy(label_copy, label.value()->data(), label.value()->size());
|
|
170
204
|
|
|
171
|
-
if (EVP_PKEY_CTX_set0_rsa_oaep_label(ctx, label_copy,
|
|
205
|
+
if (EVP_PKEY_CTX_set0_rsa_oaep_label(ctx, label_copy, label.value()->size()) <= 0) {
|
|
172
206
|
OPENSSL_free(label_copy);
|
|
173
207
|
EVP_PKEY_CTX_free(ctx);
|
|
174
208
|
throw std::runtime_error("Failed to set OAEP label");
|
|
@@ -176,27 +210,23 @@ std::shared_ptr<ArrayBuffer> HybridRsaCipher::decrypt(const std::shared_ptr<Hybr
|
|
|
176
210
|
}
|
|
177
211
|
}
|
|
178
212
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
size_t inlen = native_data->size();
|
|
213
|
+
const unsigned char* in = data->data();
|
|
214
|
+
size_t inlen = data->size();
|
|
182
215
|
|
|
216
|
+
// Both decrypt calls below operate on attacker-controlled ciphertext, so
|
|
217
|
+
// any failure must be surfaced with an opaque, content-independent message.
|
|
218
|
+
// See enableImplicitRejectionIfPkcs1 / throwOpaqueDecryptFailure above.
|
|
183
219
|
size_t outlen;
|
|
184
220
|
if (EVP_PKEY_decrypt(ctx, nullptr, &outlen, in, inlen) <= 0) {
|
|
185
221
|
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));
|
|
222
|
+
throwOpaqueDecryptFailure();
|
|
190
223
|
}
|
|
191
224
|
|
|
192
225
|
auto out_buf = std::make_unique<uint8_t[]>(outlen);
|
|
193
226
|
|
|
194
227
|
if (EVP_PKEY_decrypt(ctx, out_buf.get(), &outlen, in, inlen) <= 0) {
|
|
195
228
|
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));
|
|
229
|
+
throwOpaqueDecryptFailure();
|
|
200
230
|
}
|
|
201
231
|
|
|
202
232
|
EVP_PKEY_CTX_free(ctx);
|
|
@@ -235,41 +265,49 @@ std::shared_ptr<ArrayBuffer> HybridRsaCipher::publicDecrypt(const std::shared_pt
|
|
|
235
265
|
throw std::runtime_error("Failed to set RSA padding");
|
|
236
266
|
}
|
|
237
267
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
size_t inlen = native_data->size();
|
|
268
|
+
const unsigned char* in = data->data();
|
|
269
|
+
size_t inlen = data->size();
|
|
241
270
|
|
|
271
|
+
// verify_recover acts on attacker-controlled ciphertext too — surface only
|
|
272
|
+
// an opaque error so a remote caller cannot distinguish failure modes.
|
|
242
273
|
size_t outlen;
|
|
243
274
|
if (EVP_PKEY_verify_recover(ctx, nullptr, &outlen, in, inlen) <= 0) {
|
|
244
275
|
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));
|
|
276
|
+
throwOpaqueDecryptFailure();
|
|
249
277
|
}
|
|
250
278
|
|
|
251
279
|
if (outlen == 0) {
|
|
252
280
|
EVP_PKEY_CTX_free(ctx);
|
|
253
|
-
|
|
254
|
-
|
|
281
|
+
auto empty_buf = std::make_unique<uint8_t[]>(1);
|
|
282
|
+
uint8_t* raw_ptr = empty_buf.get();
|
|
283
|
+
return std::make_shared<NativeArrayBuffer>(empty_buf.release(), 0, [raw_ptr]() { delete[] raw_ptr; });
|
|
255
284
|
}
|
|
256
285
|
|
|
257
286
|
auto out_buf = std::make_unique<uint8_t[]>(outlen);
|
|
258
287
|
|
|
259
288
|
if (EVP_PKEY_verify_recover(ctx, out_buf.get(), &outlen, in, inlen) <= 0) {
|
|
289
|
+
// Empty-plaintext recovery: when the original message was zero bytes,
|
|
290
|
+
// OpenSSL's verify_recover surfaces a specific reason code rather than
|
|
291
|
+
// returning success+outlen=0. Match the narrow code from the original
|
|
292
|
+
// implementation and return an empty buffer so `publicDecrypt(privateEncrypt(""))`
|
|
293
|
+
// round-trips. publicDecrypt is signature verification with the PUBLIC
|
|
294
|
+
// key — anyone can perform it — so the special case does not enable a
|
|
295
|
+
// Bleichenbacher-style oracle. The fall-through still uses the opaque
|
|
296
|
+
// throw helper.
|
|
297
|
+
//
|
|
298
|
+
// Use ERR_get_error (oldest in the FIFO queue) to match the inner
|
|
299
|
+
// padding-check error rather than ERR_peek_last_error which returns
|
|
300
|
+
// the outer wrapper code that doesn't satisfy the narrow match.
|
|
260
301
|
unsigned long err = ERR_get_error();
|
|
261
|
-
char err_buf[256];
|
|
262
|
-
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
263
|
-
|
|
264
302
|
if ((err & 0xFFFFFFF) == 0x1C880004 || (err & 0xFF) == 0x04) {
|
|
265
303
|
ERR_clear_error();
|
|
266
304
|
EVP_PKEY_CTX_free(ctx);
|
|
267
|
-
|
|
268
|
-
|
|
305
|
+
auto empty_buf = std::make_unique<uint8_t[]>(1);
|
|
306
|
+
uint8_t* raw_ptr = empty_buf.get();
|
|
307
|
+
return std::make_shared<NativeArrayBuffer>(empty_buf.release(), 0, [raw_ptr]() { delete[] raw_ptr; });
|
|
269
308
|
}
|
|
270
|
-
|
|
271
309
|
EVP_PKEY_CTX_free(ctx);
|
|
272
|
-
|
|
310
|
+
throwOpaqueDecryptFailure();
|
|
273
311
|
}
|
|
274
312
|
|
|
275
313
|
EVP_PKEY_CTX_free(ctx);
|
|
@@ -308,9 +346,8 @@ std::shared_ptr<ArrayBuffer> HybridRsaCipher::privateEncrypt(const std::shared_p
|
|
|
308
346
|
throw std::runtime_error("Failed to set RSA padding");
|
|
309
347
|
}
|
|
310
348
|
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
size_t inlen = native_data->size();
|
|
349
|
+
const unsigned char* in = data->data();
|
|
350
|
+
size_t inlen = data->size();
|
|
314
351
|
|
|
315
352
|
size_t outlen;
|
|
316
353
|
if (EVP_PKEY_sign(ctx, nullptr, &outlen, in, inlen) <= 0) {
|
|
@@ -369,6 +406,11 @@ std::shared_ptr<ArrayBuffer> HybridRsaCipher::privateDecrypt(const std::shared_p
|
|
|
369
406
|
throw std::runtime_error("Failed to set RSA padding");
|
|
370
407
|
}
|
|
371
408
|
|
|
409
|
+
if (!enableImplicitRejectionIfPkcs1(ctx, opensslPadding)) {
|
|
410
|
+
EVP_PKEY_CTX_free(ctx);
|
|
411
|
+
throw std::runtime_error("RSA PKCS#1 v1.5 decryption requires OpenSSL implicit-rejection support (>= 3.2)");
|
|
412
|
+
}
|
|
413
|
+
|
|
372
414
|
if (paddingInt == kRsaOaepPadding) {
|
|
373
415
|
const EVP_MD* md = getDigestByName(hashAlgorithm);
|
|
374
416
|
if (EVP_PKEY_CTX_set_rsa_oaep_md(ctx, md) <= 0) {
|
|
@@ -382,15 +424,14 @@ std::shared_ptr<ArrayBuffer> HybridRsaCipher::privateDecrypt(const std::shared_p
|
|
|
382
424
|
}
|
|
383
425
|
|
|
384
426
|
if (label.has_value() && label.value()->size() > 0) {
|
|
385
|
-
|
|
386
|
-
unsigned char* label_copy = (unsigned char*)OPENSSL_malloc(native_label->size());
|
|
427
|
+
unsigned char* label_copy = (unsigned char*)OPENSSL_malloc(label.value()->size());
|
|
387
428
|
if (!label_copy) {
|
|
388
429
|
EVP_PKEY_CTX_free(ctx);
|
|
389
430
|
throw std::runtime_error("Failed to allocate memory for label");
|
|
390
431
|
}
|
|
391
|
-
std::memcpy(label_copy,
|
|
432
|
+
std::memcpy(label_copy, label.value()->data(), label.value()->size());
|
|
392
433
|
|
|
393
|
-
if (EVP_PKEY_CTX_set0_rsa_oaep_label(ctx, label_copy,
|
|
434
|
+
if (EVP_PKEY_CTX_set0_rsa_oaep_label(ctx, label_copy, label.value()->size()) <= 0) {
|
|
394
435
|
OPENSSL_free(label_copy);
|
|
395
436
|
EVP_PKEY_CTX_free(ctx);
|
|
396
437
|
throw std::runtime_error("Failed to set OAEP label");
|
|
@@ -398,27 +439,23 @@ std::shared_ptr<ArrayBuffer> HybridRsaCipher::privateDecrypt(const std::shared_p
|
|
|
398
439
|
}
|
|
399
440
|
}
|
|
400
441
|
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
size_t inlen = native_data->size();
|
|
442
|
+
const unsigned char* in = data->data();
|
|
443
|
+
size_t inlen = data->size();
|
|
404
444
|
|
|
445
|
+
// Both decrypt calls below operate on attacker-controlled ciphertext, so
|
|
446
|
+
// any failure must be surfaced with an opaque, content-independent message.
|
|
447
|
+
// See enableImplicitRejectionIfPkcs1 / throwOpaqueDecryptFailure above.
|
|
405
448
|
size_t outlen;
|
|
406
449
|
if (EVP_PKEY_decrypt(ctx, nullptr, &outlen, in, inlen) <= 0) {
|
|
407
450
|
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));
|
|
451
|
+
throwOpaqueDecryptFailure();
|
|
412
452
|
}
|
|
413
453
|
|
|
414
454
|
auto out_buf = std::make_unique<uint8_t[]>(outlen);
|
|
415
455
|
|
|
416
456
|
if (EVP_PKEY_decrypt(ctx, out_buf.get(), &outlen, in, inlen) <= 0) {
|
|
417
457
|
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));
|
|
458
|
+
throwOpaqueDecryptFailure();
|
|
422
459
|
}
|
|
423
460
|
|
|
424
461
|
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();
|
|
@@ -40,15 +40,15 @@ bool OCBCipher::setAuthTag(const std::shared_ptr<ArrayBuffer>& tag) {
|
|
|
40
40
|
if (is_cipher) {
|
|
41
41
|
throw std::runtime_error("setAuthTag can only be called during decryption.");
|
|
42
42
|
}
|
|
43
|
-
|
|
44
|
-
size_t tag_len = native_tag->size();
|
|
43
|
+
size_t tag_len = tag->size();
|
|
45
44
|
if (tag_len < 8 || tag_len > 16) {
|
|
46
45
|
throw std::runtime_error("Invalid OCB tag length");
|
|
47
46
|
}
|
|
48
|
-
if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, tag_len,
|
|
47
|
+
if (EVP_CIPHER_CTX_ctrl(ctx.get(), EVP_CTRL_AEAD_SET_TAG, tag_len, tag->data()) != 1) {
|
|
49
48
|
throw std::runtime_error("Failed to set OCB auth tag");
|
|
50
49
|
}
|
|
51
50
|
auth_tag_len = tag_len;
|
|
51
|
+
auth_tag_state = kAuthTagPassedToOpenSSL;
|
|
52
52
|
return true;
|
|
53
53
|
}
|
|
54
54
|
|