react-native-quick-crypto 1.0.19 → 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/QuickCrypto.podspec +12 -38
- package/README.md +2 -0
- package/android/CMakeLists.txt +3 -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 +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 +213 -111
- package/cpp/utils/HybridUtils.hpp +9 -2
- package/cpp/utils/QuickCryptoUtils.hpp +72 -0
- package/deps/simdutf/LICENSE-APACHE +201 -0
- package/deps/simdutf/LICENSE-MIT +18 -0
- package/deps/simdutf/README.md +2782 -0
- package/deps/simdutf/include/simdutf/avx512.h +79 -0
- package/deps/simdutf/include/simdutf/base64_implementation.h +158 -0
- package/deps/simdutf/include/simdutf/base64_tables.h +887 -0
- package/deps/simdutf/include/simdutf/common_defs.h +186 -0
- package/deps/simdutf/include/simdutf/compiler_check.h +50 -0
- package/deps/simdutf/include/simdutf/constexpr_ptr.h +138 -0
- package/deps/simdutf/include/simdutf/encoding_types.h +189 -0
- package/deps/simdutf/include/simdutf/error.h +126 -0
- package/deps/simdutf/include/simdutf/implementation.h +7081 -0
- package/deps/simdutf/include/simdutf/internal/isadetection.h +325 -0
- package/deps/simdutf/include/simdutf/portability.h +285 -0
- package/deps/simdutf/include/simdutf/scalar/ascii.h +86 -0
- package/deps/simdutf/include/simdutf/scalar/atomic_util.h +105 -0
- package/deps/simdutf/include/simdutf/scalar/base64.h +911 -0
- package/deps/simdutf/include/simdutf/scalar/latin1.h +26 -0
- package/deps/simdutf/include/simdutf/scalar/latin1_to_utf16/latin1_to_utf16.h +52 -0
- package/deps/simdutf/include/simdutf/scalar/latin1_to_utf32/latin1_to_utf32.h +27 -0
- package/deps/simdutf/include/simdutf/scalar/latin1_to_utf8/latin1_to_utf8.h +191 -0
- package/deps/simdutf/include/simdutf/scalar/swap_bytes.h +35 -0
- package/deps/simdutf/include/simdutf/scalar/utf16.h +226 -0
- package/deps/simdutf/include/simdutf/scalar/utf16_to_latin1/utf16_to_latin1.h +108 -0
- package/deps/simdutf/include/simdutf/scalar/utf16_to_latin1/valid_utf16_to_latin1.h +40 -0
- package/deps/simdutf/include/simdutf/scalar/utf16_to_utf32/utf16_to_utf32.h +86 -0
- package/deps/simdutf/include/simdutf/scalar/utf16_to_utf32/valid_utf16_to_utf32.h +44 -0
- package/deps/simdutf/include/simdutf/scalar/utf16_to_utf8/utf16_to_utf8.h +295 -0
- package/deps/simdutf/include/simdutf/scalar/utf16_to_utf8/valid_utf16_to_utf8.h +91 -0
- package/deps/simdutf/include/simdutf/scalar/utf32.h +82 -0
- package/deps/simdutf/include/simdutf/scalar/utf32_to_latin1/utf32_to_latin1.h +68 -0
- package/deps/simdutf/include/simdutf/scalar/utf32_to_latin1/valid_utf32_to_latin1.h +67 -0
- package/deps/simdutf/include/simdutf/scalar/utf32_to_utf16/utf32_to_utf16.h +84 -0
- package/deps/simdutf/include/simdutf/scalar/utf32_to_utf16/valid_utf32_to_utf16.h +44 -0
- package/deps/simdutf/include/simdutf/scalar/utf32_to_utf8/utf32_to_utf8.h +142 -0
- package/deps/simdutf/include/simdutf/scalar/utf32_to_utf8/valid_utf32_to_utf8.h +72 -0
- package/deps/simdutf/include/simdutf/scalar/utf8.h +326 -0
- package/deps/simdutf/include/simdutf/scalar/utf8_to_latin1/utf8_to_latin1.h +225 -0
- package/deps/simdutf/include/simdutf/scalar/utf8_to_latin1/valid_utf8_to_latin1.h +87 -0
- package/deps/simdutf/include/simdutf/scalar/utf8_to_utf16/utf8_to_utf16.h +342 -0
- package/deps/simdutf/include/simdutf/scalar/utf8_to_utf16/valid_utf8_to_utf16.h +106 -0
- package/deps/simdutf/include/simdutf/scalar/utf8_to_utf32/utf8_to_utf32.h +299 -0
- package/deps/simdutf/include/simdutf/scalar/utf8_to_utf32/valid_utf8_to_utf32.h +83 -0
- package/deps/simdutf/include/simdutf/simdutf_version.h +26 -0
- package/deps/simdutf/include/simdutf.h +26 -0
- package/deps/simdutf/include/simdutf_c.h +342 -0
- package/deps/simdutf/src/arm64/arm_base64.cpp +791 -0
- package/deps/simdutf/src/arm64/arm_convert_latin1_to_utf16.cpp +24 -0
- package/deps/simdutf/src/arm64/arm_convert_latin1_to_utf32.cpp +24 -0
- package/deps/simdutf/src/arm64/arm_convert_latin1_to_utf8.cpp +70 -0
- package/deps/simdutf/src/arm64/arm_convert_utf16_to_latin1.cpp +61 -0
- package/deps/simdutf/src/arm64/arm_convert_utf16_to_utf32.cpp +185 -0
- package/deps/simdutf/src/arm64/arm_convert_utf16_to_utf8.cpp +780 -0
- package/deps/simdutf/src/arm64/arm_convert_utf32_to_latin1.cpp +60 -0
- package/deps/simdutf/src/arm64/arm_convert_utf32_to_utf16.cpp +208 -0
- package/deps/simdutf/src/arm64/arm_convert_utf32_to_utf8.cpp +505 -0
- package/deps/simdutf/src/arm64/arm_convert_utf8_to_latin1.cpp +69 -0
- package/deps/simdutf/src/arm64/arm_convert_utf8_to_utf16.cpp +313 -0
- package/deps/simdutf/src/arm64/arm_convert_utf8_to_utf32.cpp +179 -0
- package/deps/simdutf/src/arm64/arm_find.cpp +199 -0
- package/deps/simdutf/src/arm64/arm_utf16fix.cpp +185 -0
- package/deps/simdutf/src/arm64/arm_validate_utf16.cpp +165 -0
- package/deps/simdutf/src/arm64/arm_validate_utf32le.cpp +65 -0
- package/deps/simdutf/src/arm64/implementation.cpp +1442 -0
- package/deps/simdutf/src/encoding_types.cpp +67 -0
- package/deps/simdutf/src/error.cpp +3 -0
- package/deps/simdutf/src/fallback/implementation.cpp +589 -0
- package/deps/simdutf/src/generic/ascii_validation.h +50 -0
- package/deps/simdutf/src/generic/base64.h +233 -0
- package/deps/simdutf/src/generic/base64lengths.h +63 -0
- package/deps/simdutf/src/generic/buf_block_reader.h +109 -0
- package/deps/simdutf/src/generic/find.h +75 -0
- package/deps/simdutf/src/generic/utf16/change_endianness.h +24 -0
- package/deps/simdutf/src/generic/utf16/count_code_points_bytemask.h +58 -0
- package/deps/simdutf/src/generic/utf16/to_well_formed.h +93 -0
- package/deps/simdutf/src/generic/utf16/utf32_length_from_utf16.h +15 -0
- package/deps/simdutf/src/generic/utf16/utf8_length_from_utf16.h +35 -0
- package/deps/simdutf/src/generic/utf16/utf8_length_from_utf16_bytemask.h +199 -0
- package/deps/simdutf/src/generic/utf16.h +73 -0
- package/deps/simdutf/src/generic/utf32.h +136 -0
- package/deps/simdutf/src/generic/utf8/utf16_length_from_utf8_bytemask.h +53 -0
- package/deps/simdutf/src/generic/utf8.h +92 -0
- package/deps/simdutf/src/generic/utf8_to_latin1/utf8_to_latin1.h +316 -0
- package/deps/simdutf/src/generic/utf8_to_latin1/valid_utf8_to_latin1.h +78 -0
- package/deps/simdutf/src/generic/utf8_to_utf16/utf8_to_utf16.h +332 -0
- package/deps/simdutf/src/generic/utf8_to_utf16/valid_utf8_to_utf16.h +74 -0
- package/deps/simdutf/src/generic/utf8_to_utf32/utf8_to_utf32.h +318 -0
- package/deps/simdutf/src/generic/utf8_to_utf32/valid_utf8_to_utf32.h +42 -0
- package/deps/simdutf/src/generic/utf8_validation/utf8_lookup4_algorithm.h +223 -0
- package/deps/simdutf/src/generic/utf8_validation/utf8_validator.h +84 -0
- package/deps/simdutf/src/generic/validate_utf16.h +164 -0
- package/deps/simdutf/src/generic/validate_utf32.h +99 -0
- package/deps/simdutf/src/haswell/avx2_base64.cpp +837 -0
- package/deps/simdutf/src/haswell/avx2_convert_latin1_to_utf16.cpp +28 -0
- package/deps/simdutf/src/haswell/avx2_convert_latin1_to_utf32.cpp +20 -0
- package/deps/simdutf/src/haswell/avx2_convert_latin1_to_utf8.cpp +83 -0
- package/deps/simdutf/src/haswell/avx2_convert_utf16_to_latin1.cpp +83 -0
- package/deps/simdutf/src/haswell/avx2_convert_utf16_to_utf32.cpp +210 -0
- package/deps/simdutf/src/haswell/avx2_convert_utf16_to_utf8.cpp +602 -0
- package/deps/simdutf/src/haswell/avx2_convert_utf32_to_latin1.cpp +116 -0
- package/deps/simdutf/src/haswell/avx2_convert_utf32_to_utf16.cpp +164 -0
- package/deps/simdutf/src/haswell/avx2_convert_utf32_to_utf8.cpp +569 -0
- package/deps/simdutf/src/haswell/avx2_convert_utf8_to_latin1.cpp +60 -0
- package/deps/simdutf/src/haswell/avx2_convert_utf8_to_utf16.cpp +195 -0
- package/deps/simdutf/src/haswell/avx2_convert_utf8_to_utf32.cpp +135 -0
- package/deps/simdutf/src/haswell/avx2_utf16fix.cpp +173 -0
- package/deps/simdutf/src/haswell/avx2_validate_utf16.cpp +17 -0
- package/deps/simdutf/src/haswell/implementation.cpp +1447 -0
- package/deps/simdutf/src/icelake/icelake_ascii_validation.inl.cpp +19 -0
- package/deps/simdutf/src/icelake/icelake_base64.inl.cpp +630 -0
- package/deps/simdutf/src/icelake/icelake_common.inl.cpp +37 -0
- package/deps/simdutf/src/icelake/icelake_convert_latin1_to_utf16.inl.cpp +36 -0
- package/deps/simdutf/src/icelake/icelake_convert_latin1_to_utf32.inl.cpp +23 -0
- package/deps/simdutf/src/icelake/icelake_convert_latin1_to_utf8.inl.cpp +107 -0
- package/deps/simdutf/src/icelake/icelake_convert_utf16_to_latin1.inl.cpp +103 -0
- package/deps/simdutf/src/icelake/icelake_convert_utf16_to_utf32.inl.cpp +136 -0
- package/deps/simdutf/src/icelake/icelake_convert_utf16_to_utf8.inl.cpp +206 -0
- package/deps/simdutf/src/icelake/icelake_convert_utf32_to_latin1.inl.cpp +74 -0
- package/deps/simdutf/src/icelake/icelake_convert_utf32_to_utf16.inl.cpp +338 -0
- package/deps/simdutf/src/icelake/icelake_convert_utf32_to_utf8.inl.cpp +574 -0
- package/deps/simdutf/src/icelake/icelake_convert_utf8_to_latin1.inl.cpp +104 -0
- package/deps/simdutf/src/icelake/icelake_convert_utf8_to_utf16.inl.cpp +75 -0
- package/deps/simdutf/src/icelake/icelake_convert_valid_utf8_to_latin1.inl.cpp +69 -0
- package/deps/simdutf/src/icelake/icelake_find.inl.cpp +146 -0
- package/deps/simdutf/src/icelake/icelake_from_utf8.inl.cpp +266 -0
- package/deps/simdutf/src/icelake/icelake_from_valid_utf8.inl.cpp +136 -0
- package/deps/simdutf/src/icelake/icelake_macros.inl.cpp +143 -0
- package/deps/simdutf/src/icelake/icelake_utf16fix.cpp +138 -0
- package/deps/simdutf/src/icelake/icelake_utf32_validation.inl.cpp +63 -0
- package/deps/simdutf/src/icelake/icelake_utf8_common.inl.cpp +753 -0
- package/deps/simdutf/src/icelake/icelake_utf8_length_from_utf16.inl.cpp +269 -0
- package/deps/simdutf/src/icelake/icelake_utf8_validation.inl.cpp +116 -0
- package/deps/simdutf/src/icelake/implementation.cpp +1903 -0
- package/deps/simdutf/src/implementation.cpp +2526 -0
- package/deps/simdutf/src/lasx/implementation.cpp +1531 -0
- package/deps/simdutf/src/lasx/lasx_base64.cpp +695 -0
- package/deps/simdutf/src/lasx/lasx_convert_latin1_to_utf16.cpp +76 -0
- package/deps/simdutf/src/lasx/lasx_convert_latin1_to_utf32.cpp +55 -0
- package/deps/simdutf/src/lasx/lasx_convert_latin1_to_utf8.cpp +65 -0
- package/deps/simdutf/src/lasx/lasx_convert_utf16_to_latin1.cpp +64 -0
- package/deps/simdutf/src/lasx/lasx_convert_utf16_to_utf32.cpp +183 -0
- package/deps/simdutf/src/lasx/lasx_convert_utf16_to_utf8.cpp +550 -0
- package/deps/simdutf/src/lasx/lasx_convert_utf32_to_latin1.cpp +73 -0
- package/deps/simdutf/src/lasx/lasx_convert_utf32_to_utf16.cpp +218 -0
- package/deps/simdutf/src/lasx/lasx_convert_utf32_to_utf8.cpp +589 -0
- package/deps/simdutf/src/lasx/lasx_convert_utf8_to_latin1.cpp +72 -0
- package/deps/simdutf/src/lasx/lasx_convert_utf8_to_utf16.cpp +296 -0
- package/deps/simdutf/src/lasx/lasx_convert_utf8_to_utf32.cpp +190 -0
- package/deps/simdutf/src/lasx/lasx_find.cpp +64 -0
- package/deps/simdutf/src/lasx/lasx_validate_utf16.cpp +13 -0
- package/deps/simdutf/src/lasx/lasx_validate_utf32le.cpp +84 -0
- package/deps/simdutf/src/lsx/implementation.cpp +1417 -0
- package/deps/simdutf/src/lsx/lsx_base64.cpp +675 -0
- package/deps/simdutf/src/lsx/lsx_convert_latin1_to_utf16.cpp +39 -0
- package/deps/simdutf/src/lsx/lsx_convert_latin1_to_utf32.cpp +27 -0
- package/deps/simdutf/src/lsx/lsx_convert_latin1_to_utf8.cpp +56 -0
- package/deps/simdutf/src/lsx/lsx_convert_utf16_to_latin1.cpp +64 -0
- package/deps/simdutf/src/lsx/lsx_convert_utf16_to_utf32.cpp +133 -0
- package/deps/simdutf/src/lsx/lsx_convert_utf16_to_utf8.cpp +518 -0
- package/deps/simdutf/src/lsx/lsx_convert_utf32_to_latin1.cpp +66 -0
- package/deps/simdutf/src/lsx/lsx_convert_utf32_to_utf16.cpp +155 -0
- package/deps/simdutf/src/lsx/lsx_convert_utf32_to_utf8.cpp +459 -0
- package/deps/simdutf/src/lsx/lsx_convert_utf8_to_latin1.cpp +75 -0
- package/deps/simdutf/src/lsx/lsx_convert_utf8_to_utf16.cpp +291 -0
- package/deps/simdutf/src/lsx/lsx_convert_utf8_to_utf32.cpp +179 -0
- package/deps/simdutf/src/lsx/lsx_find.cpp +60 -0
- package/deps/simdutf/src/lsx/lsx_validate_utf16.cpp +13 -0
- package/deps/simdutf/src/lsx/lsx_validate_utf32le.cpp +68 -0
- package/deps/simdutf/src/ppc64/implementation.cpp +992 -0
- package/deps/simdutf/src/ppc64/ppc64_base64.cpp +480 -0
- package/deps/simdutf/src/ppc64/ppc64_base64_internal_tests.cpp +401 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_latin1_to_utf16.cpp +12 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_latin1_to_utf32.cpp +12 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_latin1_to_utf8.cpp +149 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_utf16_to_latin1.cpp +67 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_utf16_to_utf32.cpp +87 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_utf16_to_utf8.cpp +296 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_utf32_to_latin1.cpp +57 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_utf32_to_utf16.cpp +117 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_utf32_to_utf8.cpp +166 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_utf8_to_latin1.cpp +69 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_utf8_to_utf16.cpp +211 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_utf8_to_utf32.cpp +153 -0
- package/deps/simdutf/src/ppc64/ppc64_utf16_to_utf8_tables.h +1011 -0
- package/deps/simdutf/src/ppc64/ppc64_utf8_length_from_latin1.cpp +37 -0
- package/deps/simdutf/src/ppc64/ppc64_validate_utf16.cpp +19 -0
- package/deps/simdutf/src/ppc64/templates.cpp +91 -0
- package/deps/simdutf/src/rvv/implementation.cpp +138 -0
- package/deps/simdutf/src/rvv/rvv_find.cpp +27 -0
- package/deps/simdutf/src/rvv/rvv_helpers.inl.cpp +23 -0
- package/deps/simdutf/src/rvv/rvv_latin1_to.inl.cpp +71 -0
- package/deps/simdutf/src/rvv/rvv_length_from.inl.cpp +164 -0
- package/deps/simdutf/src/rvv/rvv_utf16_to.inl.cpp +399 -0
- package/deps/simdutf/src/rvv/rvv_utf16fix.cpp +110 -0
- package/deps/simdutf/src/rvv/rvv_utf32_to.inl.cpp +307 -0
- package/deps/simdutf/src/rvv/rvv_utf8_to.inl.cpp +435 -0
- package/deps/simdutf/src/rvv/rvv_validate.inl.cpp +275 -0
- package/deps/simdutf/src/simdutf/arm64/begin.h +2 -0
- package/deps/simdutf/src/simdutf/arm64/bitmanipulation.h +34 -0
- package/deps/simdutf/src/simdutf/arm64/end.h +2 -0
- package/deps/simdutf/src/simdutf/arm64/implementation.h +307 -0
- package/deps/simdutf/src/simdutf/arm64/intrinsics.h +10 -0
- package/deps/simdutf/src/simdutf/arm64/simd.h +547 -0
- package/deps/simdutf/src/simdutf/arm64/simd16-inl.h +403 -0
- package/deps/simdutf/src/simdutf/arm64/simd32-inl.h +129 -0
- package/deps/simdutf/src/simdutf/arm64/simd64-inl.h +28 -0
- package/deps/simdutf/src/simdutf/arm64.h +43 -0
- package/deps/simdutf/src/simdutf/fallback/begin.h +1 -0
- package/deps/simdutf/src/simdutf/fallback/bitmanipulation.h +13 -0
- package/deps/simdutf/src/simdutf/fallback/end.h +1 -0
- package/deps/simdutf/src/simdutf/fallback/implementation.h +331 -0
- package/deps/simdutf/src/simdutf/fallback.h +42 -0
- package/deps/simdutf/src/simdutf/haswell/begin.h +15 -0
- package/deps/simdutf/src/simdutf/haswell/bitmanipulation.h +35 -0
- package/deps/simdutf/src/simdutf/haswell/end.h +13 -0
- package/deps/simdutf/src/simdutf/haswell/implementation.h +338 -0
- package/deps/simdutf/src/simdutf/haswell/intrinsics.h +67 -0
- package/deps/simdutf/src/simdutf/haswell/simd.h +363 -0
- package/deps/simdutf/src/simdutf/haswell/simd16-inl.h +261 -0
- package/deps/simdutf/src/simdutf/haswell/simd32-inl.h +111 -0
- package/deps/simdutf/src/simdutf/haswell/simd64-inl.h +34 -0
- package/deps/simdutf/src/simdutf/haswell.h +63 -0
- package/deps/simdutf/src/simdutf/icelake/begin.h +14 -0
- package/deps/simdutf/src/simdutf/icelake/bitmanipulation.h +44 -0
- package/deps/simdutf/src/simdutf/icelake/end.h +12 -0
- package/deps/simdutf/src/simdutf/icelake/implementation.h +346 -0
- package/deps/simdutf/src/simdutf/icelake/intrinsics.h +138 -0
- package/deps/simdutf/src/simdutf/icelake/simd.h +17 -0
- package/deps/simdutf/src/simdutf/icelake/simd16-inl.h +90 -0
- package/deps/simdutf/src/simdutf/icelake/simd32-inl.h +47 -0
- package/deps/simdutf/src/simdutf/icelake.h +81 -0
- package/deps/simdutf/src/simdutf/lasx/begin.h +8 -0
- package/deps/simdutf/src/simdutf/lasx/bitmanipulation.h +25 -0
- package/deps/simdutf/src/simdutf/lasx/end.h +8 -0
- package/deps/simdutf/src/simdutf/lasx/implementation.h +310 -0
- package/deps/simdutf/src/simdutf/lasx/intrinsics.h +319 -0
- package/deps/simdutf/src/simdutf/lasx/simd.h +551 -0
- package/deps/simdutf/src/simdutf/lasx/simd16-inl.h +234 -0
- package/deps/simdutf/src/simdutf/lasx/simd32-inl.h +74 -0
- package/deps/simdutf/src/simdutf/lasx/simd64-inl.h +52 -0
- package/deps/simdutf/src/simdutf/lasx.h +49 -0
- package/deps/simdutf/src/simdutf/lsx/begin.h +2 -0
- package/deps/simdutf/src/simdutf/lsx/bitmanipulation.h +25 -0
- package/deps/simdutf/src/simdutf/lsx/end.h +2 -0
- package/deps/simdutf/src/simdutf/lsx/implementation.h +309 -0
- package/deps/simdutf/src/simdutf/lsx/intrinsics.h +196 -0
- package/deps/simdutf/src/simdutf/lsx/simd.h +421 -0
- package/deps/simdutf/src/simdutf/lsx/simd16-inl.h +242 -0
- package/deps/simdutf/src/simdutf/lsx/simd32-inl.h +69 -0
- package/deps/simdutf/src/simdutf/lsx/simd64-inl.h +50 -0
- package/deps/simdutf/src/simdutf/lsx.h +52 -0
- package/deps/simdutf/src/simdutf/ppc64/begin.h +1 -0
- package/deps/simdutf/src/simdutf/ppc64/bitmanipulation.h +29 -0
- package/deps/simdutf/src/simdutf/ppc64/end.h +1 -0
- package/deps/simdutf/src/simdutf/ppc64/implementation.h +348 -0
- package/deps/simdutf/src/simdutf/ppc64/intrinsics.h +19 -0
- package/deps/simdutf/src/simdutf/ppc64/simd.h +177 -0
- package/deps/simdutf/src/simdutf/ppc64/simd16-inl.h +327 -0
- package/deps/simdutf/src/simdutf/ppc64/simd32-inl.h +247 -0
- package/deps/simdutf/src/simdutf/ppc64/simd8-inl.h +618 -0
- package/deps/simdutf/src/simdutf/ppc64.h +40 -0
- package/deps/simdutf/src/simdutf/rvv/begin.h +7 -0
- package/deps/simdutf/src/simdutf/rvv/end.h +7 -0
- package/deps/simdutf/src/simdutf/rvv/implementation.h +321 -0
- package/deps/simdutf/src/simdutf/rvv/intrinsics.h +131 -0
- package/deps/simdutf/src/simdutf/rvv.h +41 -0
- package/deps/simdutf/src/simdutf/westmere/begin.h +8 -0
- package/deps/simdutf/src/simdutf/westmere/bitmanipulation.h +37 -0
- package/deps/simdutf/src/simdutf/westmere/end.h +8 -0
- package/deps/simdutf/src/simdutf/westmere/implementation.h +338 -0
- package/deps/simdutf/src/simdutf/westmere/intrinsics.h +38 -0
- package/deps/simdutf/src/simdutf/westmere/simd.h +379 -0
- package/deps/simdutf/src/simdutf/westmere/simd16-inl.h +242 -0
- package/deps/simdutf/src/simdutf/westmere/simd32-inl.h +151 -0
- package/deps/simdutf/src/simdutf/westmere/simd64-inl.h +33 -0
- package/deps/simdutf/src/simdutf/westmere.h +59 -0
- package/deps/simdutf/src/simdutf.cpp +152 -0
- package/deps/simdutf/src/simdutf_c.cpp +525 -0
- package/deps/simdutf/src/tables/utf16_to_utf8_tables.h +768 -0
- package/deps/simdutf/src/tables/utf32_to_utf16_tables.h +53 -0
- package/deps/simdutf/src/tables/utf8_to_utf16_tables.h +826 -0
- package/deps/simdutf/src/westmere/implementation.cpp +1479 -0
- package/deps/simdutf/src/westmere/internal/loader.cpp +7 -0
- package/deps/simdutf/src/westmere/internal/write_v_u16_11bits_to_utf8.cpp +66 -0
- package/deps/simdutf/src/westmere/sse_base64.cpp +672 -0
- package/deps/simdutf/src/westmere/sse_convert_latin1_to_utf16.cpp +21 -0
- package/deps/simdutf/src/westmere/sse_convert_latin1_to_utf32.cpp +31 -0
- package/deps/simdutf/src/westmere/sse_convert_latin1_to_utf8.cpp +71 -0
- package/deps/simdutf/src/westmere/sse_convert_utf16_to_latin1.cpp +70 -0
- package/deps/simdutf/src/westmere/sse_convert_utf16_to_utf32.cpp +206 -0
- package/deps/simdutf/src/westmere/sse_convert_utf16_to_utf8.cpp +504 -0
- package/deps/simdutf/src/westmere/sse_convert_utf32_to_latin1.cpp +82 -0
- package/deps/simdutf/src/westmere/sse_convert_utf32_to_utf16.cpp +209 -0
- package/deps/simdutf/src/westmere/sse_convert_utf32_to_utf8.cpp +589 -0
- package/deps/simdutf/src/westmere/sse_convert_utf8_to_latin1.cpp +58 -0
- package/deps/simdutf/src/westmere/sse_convert_utf8_to_utf16.cpp +197 -0
- package/deps/simdutf/src/westmere/sse_convert_utf8_to_utf32.cpp +141 -0
- package/deps/simdutf/src/westmere/sse_utf16fix.cpp +82 -0
- package/deps/simdutf/src/westmere/sse_validate_utf16.cpp +17 -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 +38 -6
- 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/lib/tsconfig.tsbuildinfo +0 -1
package/QuickCrypto.podspec
CHANGED
|
@@ -42,41 +42,14 @@ Pod::Spec.new do |s|
|
|
|
42
42
|
end
|
|
43
43
|
end
|
|
44
44
|
|
|
45
|
-
# OpenSSL 3.6+ vendored xcframework (not yet on CocoaPods trunk)
|
|
46
|
-
openssl_version = "3.6.0001"
|
|
47
|
-
openssl_url = "https://github.com/krzyzanowskim/OpenSSL/releases/download/#{openssl_version}/OpenSSL.xcframework.zip"
|
|
48
|
-
|
|
49
|
-
# Ensure OpenSSL.xcframework is present during podspec evaluation.
|
|
50
|
-
# This is necessary because prepare_command is skipped for :path pods,
|
|
51
|
-
# which is how React Native native modules are installed.
|
|
52
|
-
# See: https://github.com/margelo/react-native-quick-crypto/issues/882
|
|
53
|
-
openssl_dir = File.join(__dir__, "OpenSSL.xcframework")
|
|
54
|
-
openssl_plist = File.join(openssl_dir, "Info.plist")
|
|
55
|
-
unless File.exist?(openssl_plist)
|
|
56
|
-
# Clean up any partial download
|
|
57
|
-
FileUtils.rm_rf(openssl_dir) if File.directory?(openssl_dir)
|
|
58
|
-
FileUtils.rm_f(File.join(__dir__, "OpenSSL.xcframework.zip"))
|
|
59
|
-
|
|
60
|
-
Pod::UI.puts "[QuickCrypto] ⬇️ Downloading OpenSSL.xcframework..."
|
|
61
|
-
Dir.chdir(__dir__) do
|
|
62
|
-
system("curl -sSfL --connect-timeout 30 --max-time 300 -o OpenSSL.xcframework.zip #{openssl_url}") || raise("Failed to download OpenSSL")
|
|
63
|
-
system("unzip -q -o OpenSSL.xcframework.zip") || raise("Failed to unzip OpenSSL")
|
|
64
|
-
File.delete("OpenSSL.xcframework.zip") if File.exist?("OpenSSL.xcframework.zip")
|
|
65
|
-
end
|
|
66
|
-
Pod::UI.puts "[QuickCrypto] ✅ OpenSSL.xcframework downloaded successfully"
|
|
67
|
-
end
|
|
68
|
-
|
|
69
45
|
if sodium_enabled
|
|
70
46
|
# Build libsodium from source for XSalsa20 cipher support
|
|
71
47
|
# CocoaPods packages are outdated (1.0.12) and SPM causes module conflicts
|
|
72
48
|
s.prepare_command = <<-CMD
|
|
73
49
|
set -e
|
|
74
|
-
#
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
unzip -o OpenSSL.xcframework.zip
|
|
78
|
-
rm -f OpenSSL.xcframework.zip
|
|
79
|
-
fi
|
|
50
|
+
# Clean up vendored OpenSSL.xcframework from pre-1.0.20 installs
|
|
51
|
+
rm -rf OpenSSL.xcframework
|
|
52
|
+
rm -f OpenSSL.xcframework.zip
|
|
80
53
|
# Build libsodium
|
|
81
54
|
mkdir -p ios
|
|
82
55
|
curl -L -o ios/libsodium.tar.gz https://download.libsodium.org/libsodium/releases/libsodium-1.0.20-stable.tar.gz
|
|
@@ -90,20 +63,15 @@ Pod::Spec.new do |s|
|
|
|
90
63
|
else
|
|
91
64
|
s.prepare_command = <<-CMD
|
|
92
65
|
set -e
|
|
93
|
-
# Download OpenSSL.xcframework
|
|
94
|
-
if [ ! -d "OpenSSL.xcframework" ]; then
|
|
95
|
-
curl -L -o OpenSSL.xcframework.zip #{openssl_url}
|
|
96
|
-
unzip -o OpenSSL.xcframework.zip
|
|
97
|
-
rm -f OpenSSL.xcframework.zip
|
|
98
|
-
fi
|
|
99
66
|
# Clean up libsodium if previously built
|
|
100
67
|
rm -rf ios/libsodium-stable
|
|
101
68
|
rm -f ios/libsodium.tar.gz
|
|
69
|
+
# Clean up vendored OpenSSL.xcframework from pre-1.0.20 installs
|
|
70
|
+
rm -rf OpenSSL.xcframework
|
|
71
|
+
rm -f OpenSSL.xcframework.zip
|
|
102
72
|
CMD
|
|
103
73
|
end
|
|
104
74
|
|
|
105
|
-
s.vendored_frameworks = "OpenSSL.xcframework"
|
|
106
|
-
|
|
107
75
|
base_source_files = [
|
|
108
76
|
# implementation (Swift)
|
|
109
77
|
"ios/**/*.{swift}",
|
|
@@ -114,6 +82,9 @@ Pod::Spec.new do |s|
|
|
|
114
82
|
# dependencies (C++) - ncrypto
|
|
115
83
|
"deps/ncrypto/include/**/*.{h}",
|
|
116
84
|
"deps/ncrypto/src/*.{cpp}",
|
|
85
|
+
# dependencies (C++) - simdutf
|
|
86
|
+
"deps/simdutf/include/**/*.{h}",
|
|
87
|
+
"deps/simdutf/src/simdutf.cpp",
|
|
117
88
|
# dependencies (C) - exclude BLAKE3 x86 SIMD files (only use portable + NEON for ARM)
|
|
118
89
|
"deps/blake3/c/*.{h,c}",
|
|
119
90
|
"deps/fastpbkdf2/*.{h,c}",
|
|
@@ -183,6 +154,8 @@ Pod::Spec.new do |s|
|
|
|
183
154
|
"\"$(PODS_TARGET_SRCROOT)/cpp/ecdh\"",
|
|
184
155
|
"\"$(PODS_TARGET_SRCROOT)/nitrogen/generated/shared/c++\"",
|
|
185
156
|
"\"$(PODS_TARGET_SRCROOT)/deps/ncrypto/include\"",
|
|
157
|
+
"\"$(PODS_TARGET_SRCROOT)/deps/simdutf/include\"",
|
|
158
|
+
"\"$(PODS_TARGET_SRCROOT)/deps/simdutf/src\"",
|
|
186
159
|
"\"$(PODS_TARGET_SRCROOT)/deps/blake3/c\"",
|
|
187
160
|
"\"$(PODS_TARGET_SRCROOT)/deps/fastpbkdf2\""
|
|
188
161
|
]
|
|
@@ -210,6 +183,7 @@ Pod::Spec.new do |s|
|
|
|
210
183
|
load "nitrogen/generated/ios/QuickCrypto+autolinking.rb"
|
|
211
184
|
add_nitrogen_files(s)
|
|
212
185
|
|
|
186
|
+
s.dependency "OpenSSL-Universal", "~> 3.6"
|
|
213
187
|
s.dependency "React-jsi"
|
|
214
188
|
s.dependency "React-callinvoker"
|
|
215
189
|
|
package/README.md
CHANGED
|
@@ -143,6 +143,8 @@ const hashed = QuickCrypto.createHash('sha256')
|
|
|
143
143
|
.digest('hex');
|
|
144
144
|
```
|
|
145
145
|
|
|
146
|
+
More details can be found on the [documentation](https://margelo.github.io/react-native-quick-crypto/).
|
|
147
|
+
|
|
146
148
|
## Limitations
|
|
147
149
|
|
|
148
150
|
Not all cryptographic algorithms are supported yet. See the [implementation coverage](./.docs/implementation-coverage.md) document for more details. If you need a specific algorithm, please open a `feature request` issue and we'll see what we can do.
|
package/android/CMakeLists.txt
CHANGED
|
@@ -67,6 +67,7 @@ add_library(
|
|
|
67
67
|
../deps/ncrypto/src/aead.cpp
|
|
68
68
|
../deps/ncrypto/src/engine.cpp
|
|
69
69
|
../deps/ncrypto/src/ncrypto.cpp
|
|
70
|
+
../deps/simdutf/src/simdutf.cpp
|
|
70
71
|
)
|
|
71
72
|
|
|
72
73
|
# add Nitrogen specs
|
|
@@ -102,6 +103,8 @@ include_directories(
|
|
|
102
103
|
"../deps/blake3/c"
|
|
103
104
|
"../deps/fastpbkdf2"
|
|
104
105
|
"../deps/ncrypto/include"
|
|
106
|
+
"../deps/simdutf/include"
|
|
107
|
+
"../deps/simdutf/src"
|
|
105
108
|
)
|
|
106
109
|
|
|
107
110
|
# Third party libraries (Prefabs)
|
package/android/build.gradle
CHANGED
|
@@ -7,7 +7,7 @@ buildscript {
|
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
dependencies {
|
|
10
|
-
classpath "com.android.tools.build:gradle:8.
|
|
10
|
+
classpath "com.android.tools.build:gradle:8.12.2"
|
|
11
11
|
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}"
|
|
12
12
|
}
|
|
13
13
|
}
|
|
@@ -113,6 +113,10 @@ packagingOptions {
|
|
|
113
113
|
|
|
114
114
|
lintOptions {
|
|
115
115
|
disable "GradleCompatible"
|
|
116
|
+
// AGP version is constrained by RN 0.81 + Gradle 8.14.3 + JDK 17.
|
|
117
|
+
// AGP 9.x requires Gradle 9 and JDK 21 — not viable until RN bumps its toolchain.
|
|
118
|
+
disable "AndroidGradlePluginVersion"
|
|
119
|
+
disable "GradleDependency"
|
|
116
120
|
}
|
|
117
121
|
|
|
118
122
|
compileOptions {
|
|
@@ -30,6 +30,15 @@ static std::shared_ptr<ArrayBuffer> hashImpl(const std::string& algorithm, const
|
|
|
30
30
|
|
|
31
31
|
auto type = parseAlgorithm(algorithm);
|
|
32
32
|
|
|
33
|
+
// Validate every numeric parameter before the cast. The previous code did
|
|
34
|
+
// `static_cast<uint32_t>(parallelism)` etc. naked, which is undefined
|
|
35
|
+
// behavior for NaN, +/-Infinity, or negative input — see audit Phase 1.1.
|
|
36
|
+
uint32_t parallelismU = validateUInt<uint32_t>(parallelism, "Argon2 parallelism");
|
|
37
|
+
size_t tagLengthU = validateUInt<size_t>(tagLength, "Argon2 tagLength");
|
|
38
|
+
uint32_t memoryU = validateUInt<uint32_t>(memory, "Argon2 memory");
|
|
39
|
+
uint32_t passesU = validateUInt<uint32_t>(passes, "Argon2 passes");
|
|
40
|
+
uint32_t versionU = validateUInt<uint32_t>(version, "Argon2 version");
|
|
41
|
+
|
|
33
42
|
ncrypto::Buffer<const char> passBuf{message->size() > 0 ? reinterpret_cast<const char*>(message->data()) : "", message->size()};
|
|
34
43
|
|
|
35
44
|
ncrypto::Buffer<const unsigned char> saltBuf{nonce->size() > 0 ? reinterpret_cast<const unsigned char*>(nonce->data())
|
|
@@ -46,9 +55,7 @@ static std::shared_ptr<ArrayBuffer> hashImpl(const std::string& algorithm, const
|
|
|
46
55
|
adBuf = {reinterpret_cast<const unsigned char*>(associatedData.value()->data()), associatedData.value()->size()};
|
|
47
56
|
}
|
|
48
57
|
|
|
49
|
-
auto result =
|
|
50
|
-
ncrypto::argon2(passBuf, saltBuf, static_cast<uint32_t>(parallelism), static_cast<size_t>(tagLength), static_cast<uint32_t>(memory),
|
|
51
|
-
static_cast<uint32_t>(passes), static_cast<uint32_t>(version), secretBuf, adBuf, type);
|
|
58
|
+
auto result = ncrypto::argon2(passBuf, saltBuf, parallelismU, tagLengthU, memoryU, passesU, versionU, secretBuf, adBuf, type);
|
|
52
59
|
|
|
53
60
|
if (!result) {
|
|
54
61
|
unsigned long err = ERR_peek_last_error();
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
#include <NitroModules/ArrayBuffer.hpp>
|
|
4
4
|
#include <cstring>
|
|
5
|
+
#include <memory>
|
|
5
6
|
#include <stdexcept>
|
|
6
7
|
|
|
7
8
|
#include "QuickCryptoUtils.hpp"
|
|
@@ -67,10 +68,11 @@ std::shared_ptr<ArrayBuffer> HybridBlake3::digest(std::optional<double> length)
|
|
|
67
68
|
outLen = static_cast<size_t>(len);
|
|
68
69
|
}
|
|
69
70
|
|
|
70
|
-
auto output =
|
|
71
|
-
blake3_hasher_finalize(&hasher, output, outLen);
|
|
71
|
+
auto output = std::make_unique<uint8_t[]>(outLen);
|
|
72
|
+
blake3_hasher_finalize(&hasher, output.get(), outLen);
|
|
72
73
|
|
|
73
|
-
|
|
74
|
+
uint8_t* raw_ptr = output.get();
|
|
75
|
+
return std::make_shared<margelo::nitro::NativeArrayBuffer>(output.release(), outLen, [raw_ptr]() { delete[] raw_ptr; });
|
|
74
76
|
}
|
|
75
77
|
|
|
76
78
|
void HybridBlake3::reset() {
|
package/cpp/cipher/CCMCipher.cpp
CHANGED
|
@@ -22,7 +22,7 @@ void CCMCipher::init(const std::shared_ptr<ArrayBuffer> cipher_key, const std::s
|
|
|
22
22
|
size_t iv_len = native_iv->size();
|
|
23
23
|
|
|
24
24
|
// Set the IV length using CCM-specific control
|
|
25
|
-
if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_IVLEN, iv_len, nullptr) != 1) {
|
|
25
|
+
if (EVP_CIPHER_CTX_ctrl(ctx.get(), EVP_CTRL_CCM_SET_IVLEN, iv_len, nullptr) != 1) {
|
|
26
26
|
unsigned long err = ERR_get_error();
|
|
27
27
|
char err_buf[256];
|
|
28
28
|
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
@@ -31,7 +31,7 @@ void CCMCipher::init(const std::shared_ptr<ArrayBuffer> cipher_key, const std::s
|
|
|
31
31
|
|
|
32
32
|
// Set the expected/output tag length using CCM-specific control.
|
|
33
33
|
// auth_tag_len should have been defaulted or set via setArgs in the base init.
|
|
34
|
-
if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_TAG, auth_tag_len, nullptr) != 1) {
|
|
34
|
+
if (EVP_CIPHER_CTX_ctrl(ctx.get(), EVP_CTRL_CCM_SET_TAG, auth_tag_len, nullptr) != 1) {
|
|
35
35
|
unsigned long err = ERR_get_error();
|
|
36
36
|
char err_buf[256];
|
|
37
37
|
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
@@ -44,7 +44,7 @@ void CCMCipher::init(const std::shared_ptr<ArrayBuffer> cipher_key, const std::s
|
|
|
44
44
|
const unsigned char* iv_ptr = reinterpret_cast<const unsigned char*>(native_iv->data());
|
|
45
45
|
|
|
46
46
|
// The last argument (is_cipher) should be consistent with the initial setup call.
|
|
47
|
-
if (EVP_CipherInit_ex(ctx, nullptr, nullptr, key_ptr, iv_ptr, is_cipher) != 1) {
|
|
47
|
+
if (EVP_CipherInit_ex(ctx.get(), nullptr, nullptr, key_ptr, iv_ptr, is_cipher) != 1) {
|
|
48
48
|
unsigned long err = ERR_get_error();
|
|
49
49
|
char err_buf[256];
|
|
50
50
|
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
@@ -55,6 +55,7 @@ void CCMCipher::init(const std::shared_ptr<ArrayBuffer> cipher_key, const std::s
|
|
|
55
55
|
std::shared_ptr<ArrayBuffer> CCMCipher::update(const std::shared_ptr<ArrayBuffer>& data) {
|
|
56
56
|
checkCtx();
|
|
57
57
|
checkNotFinalized();
|
|
58
|
+
has_update_called = true;
|
|
58
59
|
auto native_data = ToNativeArrayBuffer(data);
|
|
59
60
|
size_t in_len = native_data->size();
|
|
60
61
|
if (in_len < 0 || in_len > INT_MAX) {
|
|
@@ -66,7 +67,7 @@ std::shared_ptr<ArrayBuffer> CCMCipher::update(const std::shared_ptr<ArrayBuffer
|
|
|
66
67
|
maybePassAuthTagToOpenSSL();
|
|
67
68
|
}
|
|
68
69
|
|
|
69
|
-
int block_size = EVP_CIPHER_CTX_block_size(ctx);
|
|
70
|
+
int block_size = EVP_CIPHER_CTX_block_size(ctx.get());
|
|
70
71
|
if (block_size <= 0) {
|
|
71
72
|
throw std::runtime_error("Invalid block size in update");
|
|
72
73
|
}
|
|
@@ -79,13 +80,17 @@ std::shared_ptr<ArrayBuffer> CCMCipher::update(const std::shared_ptr<ArrayBuffer
|
|
|
79
80
|
const uint8_t* in = reinterpret_cast<const uint8_t*>(native_data->data());
|
|
80
81
|
|
|
81
82
|
int actual_out_len = 0;
|
|
82
|
-
int ret = EVP_CipherUpdate(ctx, out_buf.get(), &actual_out_len, in, in_len);
|
|
83
|
+
int ret = EVP_CipherUpdate(ctx.get(), out_buf.get(), &actual_out_len, in, in_len);
|
|
83
84
|
|
|
84
85
|
if (!is_cipher) {
|
|
85
|
-
// Decryption:
|
|
86
|
+
// Decryption: tag verification happens during update for CCM. Don't
|
|
87
|
+
// throw here — defer the failure to final() so callers see the standard
|
|
88
|
+
// "auth tag mismatch on final" semantics. This also covers the misuse
|
|
89
|
+
// case where setAuthTag() was never called: ret <= 0 here, we record
|
|
90
|
+
// it, and final() turns it into a thrown error.
|
|
86
91
|
if (ret <= 0) {
|
|
87
|
-
|
|
88
|
-
|
|
92
|
+
pending_auth_failed = true;
|
|
93
|
+
actual_out_len = 0;
|
|
89
94
|
}
|
|
90
95
|
} else {
|
|
91
96
|
// Encryption: Check for standard errors
|
|
@@ -107,22 +112,29 @@ std::shared_ptr<ArrayBuffer> CCMCipher::final() {
|
|
|
107
112
|
checkCtx();
|
|
108
113
|
checkNotFinalized();
|
|
109
114
|
|
|
110
|
-
// CCM decryption does not use final
|
|
115
|
+
// CCM decryption does not use final for the verification step itself
|
|
116
|
+
// (that happens in update()), but final() is still where misuse must
|
|
117
|
+
// surface — both "setAuthTag was never called" and "the tag we did set
|
|
118
|
+
// didn't match the ciphertext" land here.
|
|
111
119
|
if (!is_cipher) {
|
|
112
120
|
is_finalized = true;
|
|
113
|
-
|
|
114
|
-
|
|
121
|
+
if (auth_tag_state == kAuthTagUnknown || pending_auth_failed) {
|
|
122
|
+
throw std::runtime_error("Unsupported state or unable to authenticate data");
|
|
123
|
+
}
|
|
124
|
+
auto empty_output = std::make_unique<unsigned char[]>(0);
|
|
125
|
+
unsigned char* raw_ptr = empty_output.get();
|
|
126
|
+
return std::make_shared<NativeArrayBuffer>(empty_output.release(), 0, [raw_ptr]() { delete[] raw_ptr; });
|
|
115
127
|
}
|
|
116
128
|
|
|
117
129
|
// Proceed only for encryption
|
|
118
|
-
int block_size = EVP_CIPHER_CTX_block_size(ctx);
|
|
130
|
+
int block_size = EVP_CIPHER_CTX_block_size(ctx.get());
|
|
119
131
|
if (block_size <= 0) {
|
|
120
132
|
throw std::runtime_error("Invalid block size");
|
|
121
133
|
}
|
|
122
134
|
auto out_buf = std::make_unique<unsigned char[]>(block_size);
|
|
123
135
|
int out_len = 0;
|
|
124
136
|
|
|
125
|
-
if (!EVP_CipherFinal_ex(ctx, out_buf.get(), &out_len)) {
|
|
137
|
+
if (!EVP_CipherFinal_ex(ctx.get(), out_buf.get(), &out_len)) {
|
|
126
138
|
unsigned long err = ERR_get_error();
|
|
127
139
|
char err_buf[256];
|
|
128
140
|
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
@@ -133,7 +145,7 @@ std::shared_ptr<ArrayBuffer> CCMCipher::final() {
|
|
|
133
145
|
auth_tag_len = sizeof(auth_tag);
|
|
134
146
|
}
|
|
135
147
|
|
|
136
|
-
if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_GET_TAG, auth_tag_len, auth_tag) != 1) {
|
|
148
|
+
if (EVP_CIPHER_CTX_ctrl(ctx.get(), EVP_CTRL_CCM_GET_TAG, auth_tag_len, auth_tag) != 1) {
|
|
137
149
|
unsigned long err = ERR_get_error();
|
|
138
150
|
char err_buf[256];
|
|
139
151
|
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
@@ -148,6 +160,7 @@ std::shared_ptr<ArrayBuffer> CCMCipher::final() {
|
|
|
148
160
|
|
|
149
161
|
bool CCMCipher::setAAD(const std::shared_ptr<ArrayBuffer>& data, std::optional<double> plaintextLength) {
|
|
150
162
|
checkCtx();
|
|
163
|
+
checkAADBeforeUpdate();
|
|
151
164
|
if (!plaintextLength.has_value()) {
|
|
152
165
|
throw std::runtime_error("CCM mode requires plaintextLength to be set");
|
|
153
166
|
}
|
|
@@ -179,7 +192,7 @@ bool CCMCipher::setAAD(const std::shared_ptr<ArrayBuffer>& data, std::optional<d
|
|
|
179
192
|
// BUT the wiki says "(only needed if AAD is passed)". Let's skip if decrypting and AAD length is 0.
|
|
180
193
|
bool should_set_total_length = is_cipher || aad_len > 0;
|
|
181
194
|
if (should_set_total_length) {
|
|
182
|
-
if (EVP_CipherUpdate(ctx, nullptr, &out_len, nullptr, data_len) != 1) {
|
|
195
|
+
if (EVP_CipherUpdate(ctx.get(), nullptr, &out_len, nullptr, data_len) != 1) {
|
|
183
196
|
unsigned long err = ERR_get_error();
|
|
184
197
|
char err_buf[256];
|
|
185
198
|
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
@@ -190,7 +203,7 @@ bool CCMCipher::setAAD(const std::shared_ptr<ArrayBuffer>& data, std::optional<d
|
|
|
190
203
|
// 2. Process AAD Data
|
|
191
204
|
// Per OpenSSL CCM decryption examples, this MUST be called even if aad_len is 0.
|
|
192
205
|
// Pass nullptr as the output buffer, the AAD data pointer, and its length.
|
|
193
|
-
if (EVP_CipherUpdate(ctx, nullptr, &out_len, native_aad->data(), aad_len) != 1) {
|
|
206
|
+
if (EVP_CipherUpdate(ctx.get(), nullptr, &out_len, native_aad->data(), aad_len) != 1) {
|
|
194
207
|
unsigned long err = ERR_get_error();
|
|
195
208
|
char err_buf[256];
|
|
196
209
|
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
package/cpp/cipher/CCMCipher.hpp
CHANGED
|
@@ -7,10 +7,8 @@ namespace margelo::nitro::crypto {
|
|
|
7
7
|
class CCMCipher : public HybridCipher {
|
|
8
8
|
public:
|
|
9
9
|
CCMCipher() : HybridObject(TAG) {}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
ctx = nullptr;
|
|
13
|
-
}
|
|
10
|
+
// Destructor defaulted: HybridCipher's unique_ptr ctx frees itself.
|
|
11
|
+
~CCMCipher() override = default;
|
|
14
12
|
|
|
15
13
|
void init(const std::shared_ptr<ArrayBuffer> cipher_key, const std::shared_ptr<ArrayBuffer> iv) override;
|
|
16
14
|
std::shared_ptr<ArrayBuffer> update(const std::shared_ptr<ArrayBuffer>& data) override;
|
|
@@ -7,11 +7,8 @@
|
|
|
7
7
|
namespace margelo::nitro::crypto {
|
|
8
8
|
|
|
9
9
|
void ChaCha20Cipher::init(const std::shared_ptr<ArrayBuffer> cipher_key, const std::shared_ptr<ArrayBuffer> iv) {
|
|
10
|
-
//
|
|
11
|
-
|
|
12
|
-
EVP_CIPHER_CTX_free(ctx);
|
|
13
|
-
ctx = nullptr;
|
|
14
|
-
}
|
|
10
|
+
// Resetting the unique_ptr frees any previous context.
|
|
11
|
+
ctx.reset();
|
|
15
12
|
|
|
16
13
|
// Get ChaCha20 cipher implementation
|
|
17
14
|
const EVP_CIPHER* cipher = EVP_chacha20();
|
|
@@ -20,18 +17,17 @@ void ChaCha20Cipher::init(const std::shared_ptr<ArrayBuffer> cipher_key, const s
|
|
|
20
17
|
}
|
|
21
18
|
|
|
22
19
|
// Create a new context
|
|
23
|
-
ctx
|
|
20
|
+
ctx.reset(EVP_CIPHER_CTX_new());
|
|
24
21
|
if (!ctx) {
|
|
25
22
|
throw std::runtime_error("Failed to create cipher context");
|
|
26
23
|
}
|
|
27
24
|
|
|
28
25
|
// Initialize the encryption/decryption operation
|
|
29
|
-
if (EVP_CipherInit_ex(ctx, cipher, nullptr, nullptr, nullptr, is_cipher) != 1) {
|
|
26
|
+
if (EVP_CipherInit_ex(ctx.get(), cipher, nullptr, nullptr, nullptr, is_cipher) != 1) {
|
|
30
27
|
unsigned long err = ERR_get_error();
|
|
31
28
|
char err_buf[256];
|
|
32
29
|
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
33
|
-
|
|
34
|
-
ctx = nullptr;
|
|
30
|
+
ctx.reset();
|
|
35
31
|
throw std::runtime_error("ChaCha20Cipher: Failed initial CipherInit setup: " + std::string(err_buf));
|
|
36
32
|
}
|
|
37
33
|
|
|
@@ -52,12 +48,11 @@ void ChaCha20Cipher::init(const std::shared_ptr<ArrayBuffer> cipher_key, const s
|
|
|
52
48
|
const unsigned char* key_ptr = reinterpret_cast<const unsigned char*>(native_key->data());
|
|
53
49
|
const unsigned char* iv_ptr = reinterpret_cast<const unsigned char*>(native_iv->data());
|
|
54
50
|
|
|
55
|
-
if (EVP_CipherInit_ex(ctx, nullptr, nullptr, key_ptr, iv_ptr, is_cipher) != 1) {
|
|
51
|
+
if (EVP_CipherInit_ex(ctx.get(), nullptr, nullptr, key_ptr, iv_ptr, is_cipher) != 1) {
|
|
56
52
|
unsigned long err = ERR_get_error();
|
|
57
53
|
char err_buf[256];
|
|
58
54
|
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
59
|
-
|
|
60
|
-
ctx = nullptr;
|
|
55
|
+
ctx.reset();
|
|
61
56
|
throw std::runtime_error("ChaCha20Cipher: Failed to set key/IV: " + std::string(err_buf));
|
|
62
57
|
}
|
|
63
58
|
}
|
|
@@ -73,11 +68,10 @@ std::shared_ptr<ArrayBuffer> ChaCha20Cipher::update(const std::shared_ptr<ArrayB
|
|
|
73
68
|
|
|
74
69
|
// For ChaCha20, output size equals input size since it's a stream cipher
|
|
75
70
|
int out_len = in_len;
|
|
76
|
-
|
|
71
|
+
auto out_buf = std::make_unique<uint8_t[]>(out_len);
|
|
77
72
|
|
|
78
73
|
// Perform the cipher update operation
|
|
79
|
-
if (EVP_CipherUpdate(ctx,
|
|
80
|
-
delete[] out;
|
|
74
|
+
if (EVP_CipherUpdate(ctx.get(), out_buf.get(), &out_len, native_data->data(), in_len) != 1) {
|
|
81
75
|
unsigned long err = ERR_get_error();
|
|
82
76
|
char err_buf[256];
|
|
83
77
|
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
@@ -85,15 +79,17 @@ std::shared_ptr<ArrayBuffer> ChaCha20Cipher::update(const std::shared_ptr<ArrayB
|
|
|
85
79
|
}
|
|
86
80
|
|
|
87
81
|
// Create and return a new buffer of exact size needed
|
|
88
|
-
|
|
82
|
+
uint8_t* raw_ptr = out_buf.get();
|
|
83
|
+
return std::make_shared<NativeArrayBuffer>(out_buf.release(), out_len, [raw_ptr]() { delete[] raw_ptr; });
|
|
89
84
|
}
|
|
90
85
|
|
|
91
86
|
std::shared_ptr<ArrayBuffer> ChaCha20Cipher::final() {
|
|
92
87
|
checkCtx();
|
|
93
88
|
checkNotFinalized();
|
|
94
89
|
is_finalized = true;
|
|
95
|
-
|
|
96
|
-
|
|
90
|
+
auto empty_buf = std::make_unique<unsigned char[]>(0);
|
|
91
|
+
unsigned char* raw_ptr = empty_buf.get();
|
|
92
|
+
return std::make_shared<NativeArrayBuffer>(empty_buf.release(), 0, [raw_ptr]() { delete[] raw_ptr; });
|
|
97
93
|
}
|
|
98
94
|
|
|
99
95
|
} // namespace margelo::nitro::crypto
|
|
@@ -7,10 +7,8 @@ namespace margelo::nitro::crypto {
|
|
|
7
7
|
class ChaCha20Cipher : public HybridCipher {
|
|
8
8
|
public:
|
|
9
9
|
ChaCha20Cipher() : HybridObject(TAG) {}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
ctx = nullptr;
|
|
13
|
-
}
|
|
10
|
+
// Destructor defaulted: HybridCipher's unique_ptr ctx frees itself.
|
|
11
|
+
~ChaCha20Cipher() override = default;
|
|
14
12
|
|
|
15
13
|
void init(const std::shared_ptr<ArrayBuffer> cipher_key, const std::shared_ptr<ArrayBuffer> iv) override;
|
|
16
14
|
std::shared_ptr<ArrayBuffer> update(const std::shared_ptr<ArrayBuffer>& data) override;
|
|
@@ -7,11 +7,8 @@
|
|
|
7
7
|
namespace margelo::nitro::crypto {
|
|
8
8
|
|
|
9
9
|
void ChaCha20Poly1305Cipher::init(const std::shared_ptr<ArrayBuffer> cipher_key, const std::shared_ptr<ArrayBuffer> iv) {
|
|
10
|
-
//
|
|
11
|
-
|
|
12
|
-
EVP_CIPHER_CTX_free(ctx);
|
|
13
|
-
ctx = nullptr;
|
|
14
|
-
}
|
|
10
|
+
// Resetting the unique_ptr frees any previous context.
|
|
11
|
+
ctx.reset();
|
|
15
12
|
|
|
16
13
|
// Get ChaCha20-Poly1305 cipher implementation
|
|
17
14
|
const EVP_CIPHER* cipher = EVP_chacha20_poly1305();
|
|
@@ -20,18 +17,17 @@ void ChaCha20Poly1305Cipher::init(const std::shared_ptr<ArrayBuffer> cipher_key,
|
|
|
20
17
|
}
|
|
21
18
|
|
|
22
19
|
// Create a new context
|
|
23
|
-
ctx
|
|
20
|
+
ctx.reset(EVP_CIPHER_CTX_new());
|
|
24
21
|
if (!ctx) {
|
|
25
22
|
throw std::runtime_error("Failed to create cipher context");
|
|
26
23
|
}
|
|
27
24
|
|
|
28
25
|
// Initialize the encryption/decryption operation
|
|
29
|
-
if (EVP_CipherInit_ex(ctx, cipher, nullptr, nullptr, nullptr, is_cipher) != 1) {
|
|
26
|
+
if (EVP_CipherInit_ex(ctx.get(), cipher, nullptr, nullptr, nullptr, is_cipher) != 1) {
|
|
30
27
|
unsigned long err = ERR_get_error();
|
|
31
28
|
char err_buf[256];
|
|
32
29
|
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
33
|
-
|
|
34
|
-
ctx = nullptr;
|
|
30
|
+
ctx.reset();
|
|
35
31
|
throw std::runtime_error("ChaCha20Poly1305Cipher: Failed initial CipherInit setup: " + std::string(err_buf));
|
|
36
32
|
}
|
|
37
33
|
|
|
@@ -52,20 +48,24 @@ void ChaCha20Poly1305Cipher::init(const std::shared_ptr<ArrayBuffer> cipher_key,
|
|
|
52
48
|
const unsigned char* key_ptr = reinterpret_cast<const unsigned char*>(native_key->data());
|
|
53
49
|
const unsigned char* iv_ptr = reinterpret_cast<const unsigned char*>(native_iv->data());
|
|
54
50
|
|
|
55
|
-
if (EVP_CipherInit_ex(ctx, nullptr, nullptr, key_ptr, iv_ptr, is_cipher) != 1) {
|
|
51
|
+
if (EVP_CipherInit_ex(ctx.get(), nullptr, nullptr, key_ptr, iv_ptr, is_cipher) != 1) {
|
|
56
52
|
unsigned long err = ERR_get_error();
|
|
57
53
|
char err_buf[256];
|
|
58
54
|
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
59
|
-
|
|
60
|
-
ctx = nullptr;
|
|
55
|
+
ctx.reset();
|
|
61
56
|
throw std::runtime_error("ChaCha20Poly1305Cipher: Failed to set key/IV: " + std::string(err_buf));
|
|
62
57
|
}
|
|
63
58
|
is_finalized = false;
|
|
59
|
+
has_update_called = false;
|
|
60
|
+
has_aad = false;
|
|
61
|
+
pending_auth_failed = false;
|
|
62
|
+
auth_tag_state = kAuthTagUnknown;
|
|
64
63
|
}
|
|
65
64
|
|
|
66
65
|
std::shared_ptr<ArrayBuffer> ChaCha20Poly1305Cipher::update(const std::shared_ptr<ArrayBuffer>& data) {
|
|
67
66
|
checkCtx();
|
|
68
67
|
checkNotFinalized();
|
|
68
|
+
has_update_called = true;
|
|
69
69
|
auto native_data = ToNativeArrayBuffer(data);
|
|
70
70
|
size_t in_len = native_data->size();
|
|
71
71
|
if (in_len > INT_MAX) {
|
|
@@ -74,11 +74,10 @@ std::shared_ptr<ArrayBuffer> ChaCha20Poly1305Cipher::update(const std::shared_pt
|
|
|
74
74
|
|
|
75
75
|
// For ChaCha20-Poly1305, output size equals input size since it's a stream cipher
|
|
76
76
|
int out_len = in_len;
|
|
77
|
-
|
|
77
|
+
auto out_buf = std::make_unique<uint8_t[]>(out_len);
|
|
78
78
|
|
|
79
79
|
// Perform the cipher update operation
|
|
80
|
-
if (EVP_CipherUpdate(ctx,
|
|
81
|
-
delete[] out;
|
|
80
|
+
if (EVP_CipherUpdate(ctx.get(), out_buf.get(), &out_len, native_data->data(), in_len) != 1) {
|
|
82
81
|
unsigned long err = ERR_get_error();
|
|
83
82
|
char err_buf[256];
|
|
84
83
|
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
@@ -86,19 +85,28 @@ std::shared_ptr<ArrayBuffer> ChaCha20Poly1305Cipher::update(const std::shared_pt
|
|
|
86
85
|
}
|
|
87
86
|
|
|
88
87
|
// Create and return a new buffer of exact size needed
|
|
89
|
-
|
|
88
|
+
uint8_t* raw_ptr = out_buf.get();
|
|
89
|
+
return std::make_shared<NativeArrayBuffer>(out_buf.release(), out_len, [raw_ptr]() { delete[] raw_ptr; });
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
std::shared_ptr<ArrayBuffer> ChaCha20Poly1305Cipher::final() {
|
|
93
93
|
checkCtx();
|
|
94
94
|
checkNotFinalized();
|
|
95
95
|
|
|
96
|
+
// For decryption, the auth tag must have been provided via setAuthTag
|
|
97
|
+
// before final(). OpenSSL's ChaCha20-Poly1305 EVP_CipherFinal_ex does
|
|
98
|
+
// not flag a missing tag as an error (it simply doesn't verify), which
|
|
99
|
+
// would silently accept unauthenticated ciphertext — defeating the whole
|
|
100
|
+
// point of an AEAD. Enforce the precondition explicitly.
|
|
101
|
+
if (!is_cipher && auth_tag_state == kAuthTagUnknown) {
|
|
102
|
+
throw std::runtime_error("Unsupported state or unable to authenticate data");
|
|
103
|
+
}
|
|
104
|
+
|
|
96
105
|
// For ChaCha20-Poly1305, we need to call final to generate the tag
|
|
97
106
|
int out_len = 0;
|
|
98
|
-
|
|
107
|
+
auto out_buf = std::make_unique<unsigned char[]>(0);
|
|
99
108
|
|
|
100
|
-
if (EVP_CipherFinal_ex(ctx,
|
|
101
|
-
delete[] out;
|
|
109
|
+
if (EVP_CipherFinal_ex(ctx.get(), out_buf.get(), &out_len) != 1) {
|
|
102
110
|
unsigned long err = ERR_get_error();
|
|
103
111
|
char err_buf[256];
|
|
104
112
|
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
@@ -106,17 +114,19 @@ std::shared_ptr<ArrayBuffer> ChaCha20Poly1305Cipher::final() {
|
|
|
106
114
|
}
|
|
107
115
|
|
|
108
116
|
is_finalized = true;
|
|
109
|
-
|
|
117
|
+
unsigned char* raw_ptr = out_buf.get();
|
|
118
|
+
return std::make_shared<NativeArrayBuffer>(out_buf.release(), out_len, [raw_ptr]() { delete[] raw_ptr; });
|
|
110
119
|
}
|
|
111
120
|
|
|
112
121
|
bool ChaCha20Poly1305Cipher::setAAD(const std::shared_ptr<ArrayBuffer>& data, std::optional<double> plaintextLength) {
|
|
113
122
|
checkCtx();
|
|
123
|
+
checkAADBeforeUpdate();
|
|
114
124
|
auto native_aad = ToNativeArrayBuffer(data);
|
|
115
125
|
size_t aad_len = native_aad->size();
|
|
116
126
|
|
|
117
127
|
// Set AAD data
|
|
118
128
|
int out_len = 0;
|
|
119
|
-
if (EVP_CipherUpdate(ctx, nullptr, &out_len, native_aad->data(), aad_len) != 1) {
|
|
129
|
+
if (EVP_CipherUpdate(ctx.get(), nullptr, &out_len, native_aad->data(), aad_len) != 1) {
|
|
120
130
|
unsigned long err = ERR_get_error();
|
|
121
131
|
char err_buf[256];
|
|
122
132
|
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
@@ -136,7 +146,7 @@ std::shared_ptr<ArrayBuffer> ChaCha20Poly1305Cipher::getAuthTag() {
|
|
|
136
146
|
|
|
137
147
|
// Get the authentication tag
|
|
138
148
|
auto tag_buf = std::make_unique<uint8_t[]>(kTagSize);
|
|
139
|
-
if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, kTagSize, tag_buf.get()) != 1) {
|
|
149
|
+
if (EVP_CIPHER_CTX_ctrl(ctx.get(), EVP_CTRL_AEAD_GET_TAG, kTagSize, tag_buf.get()) != 1) {
|
|
140
150
|
unsigned long err = ERR_get_error();
|
|
141
151
|
char err_buf[256];
|
|
142
152
|
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
@@ -158,12 +168,13 @@ bool ChaCha20Poly1305Cipher::setAuthTag(const std::shared_ptr<ArrayBuffer>& tag)
|
|
|
158
168
|
throw std::runtime_error("ChaCha20-Poly1305 tag must be 16 bytes");
|
|
159
169
|
}
|
|
160
170
|
|
|
161
|
-
if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, kTagSize, native_tag->data()) != 1) {
|
|
171
|
+
if (EVP_CIPHER_CTX_ctrl(ctx.get(), EVP_CTRL_AEAD_SET_TAG, kTagSize, native_tag->data()) != 1) {
|
|
162
172
|
unsigned long err = ERR_get_error();
|
|
163
173
|
char err_buf[256];
|
|
164
174
|
ERR_error_string_n(err, err_buf, sizeof(err_buf));
|
|
165
175
|
throw std::runtime_error("ChaCha20Poly1305Cipher: Failed to set auth tag: " + std::string(err_buf));
|
|
166
176
|
}
|
|
177
|
+
auth_tag_state = kAuthTagPassedToOpenSSL;
|
|
167
178
|
return true;
|
|
168
179
|
}
|
|
169
180
|
|
|
@@ -7,10 +7,8 @@ namespace margelo::nitro::crypto {
|
|
|
7
7
|
class ChaCha20Poly1305Cipher : public HybridCipher {
|
|
8
8
|
public:
|
|
9
9
|
ChaCha20Poly1305Cipher() : HybridObject(TAG) {}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
ctx = nullptr;
|
|
13
|
-
}
|
|
10
|
+
// Destructor defaulted: HybridCipher's unique_ptr ctx frees itself.
|
|
11
|
+
~ChaCha20Poly1305Cipher() override = default;
|
|
14
12
|
|
|
15
13
|
void init(const std::shared_ptr<ArrayBuffer> cipher_key, const std::shared_ptr<ArrayBuffer> iv) override;
|
|
16
14
|
std::shared_ptr<ArrayBuffer> update(const std::shared_ptr<ArrayBuffer>& data) override;
|