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
|
@@ -0,0 +1,791 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* References and further reading:
|
|
3
|
+
*
|
|
4
|
+
* Wojciech Muła, Daniel Lemire, Base64 encoding and decoding at almost the
|
|
5
|
+
* speed of a memory copy, Software: Practice and Experience 50 (2), 2020.
|
|
6
|
+
* https://arxiv.org/abs/1910.05109
|
|
7
|
+
*
|
|
8
|
+
* Wojciech Muła, Daniel Lemire, Faster Base64 Encoding and Decoding using AVX2
|
|
9
|
+
* Instructions, ACM Transactions on the Web 12 (3), 2018.
|
|
10
|
+
* https://arxiv.org/abs/1704.00605
|
|
11
|
+
*
|
|
12
|
+
* Simon Josefsson. 2006. The Base16, Base32, and Base64 Data Encodings.
|
|
13
|
+
* https://tools.ietf.org/html/rfc4648. (2006). Internet Engineering Task Force,
|
|
14
|
+
* Request for Comments: 4648.
|
|
15
|
+
*
|
|
16
|
+
* Alfred Klomp. 2014a. Fast Base64 encoding/decoding with SSE vectorization.
|
|
17
|
+
* http://www.alfredklomp.com/programming/sse-base64/. (2014).
|
|
18
|
+
*
|
|
19
|
+
* Alfred Klomp. 2014b. Fast Base64 stream encoder/decoder in C99, with SIMD
|
|
20
|
+
* acceleration. https://github.com/aklomp/base64. (2014).
|
|
21
|
+
*
|
|
22
|
+
* Hanson Char. 2014. A Fast and Correct Base 64 Codec. (2014).
|
|
23
|
+
* https://aws.amazon.com/blogs/developer/a-fast-and-correct-base-64-codec/
|
|
24
|
+
*
|
|
25
|
+
* Nick Kopp. 2013. Base64 Encoding on a GPU.
|
|
26
|
+
* https://www.codeproject.com/Articles/276993/Base-Encoding-on-a-GPU. (2013).
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Insert a line feed character in the 16-byte input at index K in [0,16).
|
|
31
|
+
*/
|
|
32
|
+
inline uint8x16_t insert_line_feed16(uint8x16_t input, size_t K) {
|
|
33
|
+
static const uint8_t shuffle_masks[16][16] = {
|
|
34
|
+
{0x80, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14},
|
|
35
|
+
{0, 0x80, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14},
|
|
36
|
+
{0, 1, 0x80, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14},
|
|
37
|
+
{0, 1, 2, 0x80, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14},
|
|
38
|
+
{0, 1, 2, 3, 0x80, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14},
|
|
39
|
+
{0, 1, 2, 3, 4, 0x80, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14},
|
|
40
|
+
{0, 1, 2, 3, 4, 5, 0x80, 6, 7, 8, 9, 10, 11, 12, 13, 14},
|
|
41
|
+
{0, 1, 2, 3, 4, 5, 6, 0x80, 7, 8, 9, 10, 11, 12, 13, 14},
|
|
42
|
+
{0, 1, 2, 3, 4, 5, 6, 7, 0x80, 8, 9, 10, 11, 12, 13, 14},
|
|
43
|
+
{0, 1, 2, 3, 4, 5, 6, 7, 8, 0x80, 9, 10, 11, 12, 13, 14},
|
|
44
|
+
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0x80, 10, 11, 12, 13, 14},
|
|
45
|
+
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0x80, 11, 12, 13, 14},
|
|
46
|
+
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x80, 12, 13, 14},
|
|
47
|
+
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0x80, 13, 14},
|
|
48
|
+
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0x80, 14},
|
|
49
|
+
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0x80}};
|
|
50
|
+
// Prepare a vector with '\n' (0x0A)
|
|
51
|
+
uint8x16_t line_feed_vector = vdupq_n_u8('\n');
|
|
52
|
+
|
|
53
|
+
// Load the precomputed shuffle mask for K
|
|
54
|
+
uint8x16_t mask = vld1q_u8(shuffle_masks[K]);
|
|
55
|
+
|
|
56
|
+
// Create a mask where 0x80 indicates the line feed position
|
|
57
|
+
uint8x16_t lf_pos = vceqq_u8(mask, vdupq_n_u8(0x80));
|
|
58
|
+
|
|
59
|
+
uint8x16_t result = vqtbl1q_u8(input, mask);
|
|
60
|
+
|
|
61
|
+
// Use vbsl to select '\n' where lf_pos is true, else keep input bytes
|
|
62
|
+
return vbslq_u8(lf_pos, line_feed_vector, result);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// offset is the number of characters in the current line.
|
|
66
|
+
// It can range from 0 to line_length (inclusive).
|
|
67
|
+
// If offset == line_length, we need to insert a line feed before writing
|
|
68
|
+
// anything.
|
|
69
|
+
size_t write_output_with_line_feeds(uint8_t *dst, uint8x16_t src,
|
|
70
|
+
size_t line_length, size_t &offset) {
|
|
71
|
+
// Fast path: no need to insert line feeds
|
|
72
|
+
// If we are at offset, we would write from [offset, offset + 16).
|
|
73
|
+
// We need that line_length >= offset + 16.
|
|
74
|
+
if (offset + 16 <= line_length) {
|
|
75
|
+
// No need to insert line feeds
|
|
76
|
+
vst1q_u8(dst, src);
|
|
77
|
+
offset += 16; // offset could be line_length here.
|
|
78
|
+
return 16;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// We have that offset + 16 >= line_length
|
|
82
|
+
// the common case is that line_length is greater than 16
|
|
83
|
+
if (simdutf_likely(line_length >= 16)) {
|
|
84
|
+
// offset <= line_length.
|
|
85
|
+
// offset + 16 > line_length
|
|
86
|
+
// So line_length - offset < 16
|
|
87
|
+
// and line_length - offset >= 0
|
|
88
|
+
uint8x16_t chunk = insert_line_feed16(src, line_length - offset);
|
|
89
|
+
vst1q_u8(dst, chunk);
|
|
90
|
+
// Not ideal to pull the last element and write it separately but
|
|
91
|
+
// it simplifies the code.
|
|
92
|
+
*(dst + 16) = vgetq_lane_u8(src, 15);
|
|
93
|
+
offset += 16 - line_length;
|
|
94
|
+
return 16 + 1; // we wrote 16 bytes plus one line feed
|
|
95
|
+
}
|
|
96
|
+
// Uncommon case where line_length < 16
|
|
97
|
+
// This is going to be SLOW.
|
|
98
|
+
else {
|
|
99
|
+
uint8_t buffer[16];
|
|
100
|
+
vst1q_u8(buffer, src);
|
|
101
|
+
size_t out_pos = 0;
|
|
102
|
+
size_t local_offset = offset;
|
|
103
|
+
for (size_t i = 0; i < 16;) {
|
|
104
|
+
if (local_offset == line_length) {
|
|
105
|
+
dst[out_pos++] = '\n';
|
|
106
|
+
local_offset = 0;
|
|
107
|
+
}
|
|
108
|
+
dst[out_pos++] = buffer[i++];
|
|
109
|
+
local_offset++;
|
|
110
|
+
}
|
|
111
|
+
offset = local_offset;
|
|
112
|
+
return out_pos;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
template <bool insert_line_feeds>
|
|
117
|
+
size_t encode_base64_impl(char *dst, const char *src, size_t srclen,
|
|
118
|
+
base64_options options,
|
|
119
|
+
size_t line_length = simdutf::default_line_length) {
|
|
120
|
+
size_t offset = 0;
|
|
121
|
+
if (line_length < 4) {
|
|
122
|
+
line_length = 4; // We do not support line_length less than 4
|
|
123
|
+
}
|
|
124
|
+
// credit: Wojciech Muła
|
|
125
|
+
uint8_t *out = (uint8_t *)dst;
|
|
126
|
+
constexpr static uint8_t source_table[64] = {
|
|
127
|
+
'A', 'Q', 'g', 'w', 'B', 'R', 'h', 'x', 'C', 'S', 'i', 'y', 'D',
|
|
128
|
+
'T', 'j', 'z', 'E', 'U', 'k', '0', 'F', 'V', 'l', '1', 'G', 'W',
|
|
129
|
+
'm', '2', 'H', 'X', 'n', '3', 'I', 'Y', 'o', '4', 'J', 'Z', 'p',
|
|
130
|
+
'5', 'K', 'a', 'q', '6', 'L', 'b', 'r', '7', 'M', 'c', 's', '8',
|
|
131
|
+
'N', 'd', 't', '9', 'O', 'e', 'u', '+', 'P', 'f', 'v', '/',
|
|
132
|
+
};
|
|
133
|
+
constexpr static uint8_t source_table_url[64] = {
|
|
134
|
+
'A', 'Q', 'g', 'w', 'B', 'R', 'h', 'x', 'C', 'S', 'i', 'y', 'D',
|
|
135
|
+
'T', 'j', 'z', 'E', 'U', 'k', '0', 'F', 'V', 'l', '1', 'G', 'W',
|
|
136
|
+
'm', '2', 'H', 'X', 'n', '3', 'I', 'Y', 'o', '4', 'J', 'Z', 'p',
|
|
137
|
+
'5', 'K', 'a', 'q', '6', 'L', 'b', 'r', '7', 'M', 'c', 's', '8',
|
|
138
|
+
'N', 'd', 't', '9', 'O', 'e', 'u', '-', 'P', 'f', 'v', '_',
|
|
139
|
+
};
|
|
140
|
+
const uint8x16_t v3f = vdupq_n_u8(0x3f);
|
|
141
|
+
#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
|
|
142
|
+
// When trying to load a uint8_t array, Visual Studio might
|
|
143
|
+
// error with: error C2664: '__n128x4 neon_ld4m_q8(const char *)':
|
|
144
|
+
// cannot convert argument 1 from 'const uint8_t [64]' to 'const char *
|
|
145
|
+
const uint8x16x4_t table = vld4q_u8(
|
|
146
|
+
(reinterpret_cast<const char *>(options & base64_url) ? source_table_url
|
|
147
|
+
: source_table));
|
|
148
|
+
#else
|
|
149
|
+
const uint8x16x4_t table =
|
|
150
|
+
vld4q_u8((options & base64_url) ? source_table_url : source_table);
|
|
151
|
+
#endif
|
|
152
|
+
size_t i = 0;
|
|
153
|
+
for (; i + 16 * 3 <= srclen; i += 16 * 3) {
|
|
154
|
+
const uint8x16x3_t in = vld3q_u8((const uint8_t *)src + i);
|
|
155
|
+
uint8x16x4_t result;
|
|
156
|
+
result.val[0] = vshrq_n_u8(in.val[0], 2);
|
|
157
|
+
result.val[1] =
|
|
158
|
+
vandq_u8(vsliq_n_u8(vshrq_n_u8(in.val[1], 4), in.val[0], 4), v3f);
|
|
159
|
+
result.val[2] =
|
|
160
|
+
vandq_u8(vsliq_n_u8(vshrq_n_u8(in.val[2], 6), in.val[1], 2), v3f);
|
|
161
|
+
result.val[3] = vandq_u8(in.val[2], v3f);
|
|
162
|
+
result.val[0] = vqtbl4q_u8(table, result.val[0]);
|
|
163
|
+
result.val[1] = vqtbl4q_u8(table, result.val[1]);
|
|
164
|
+
result.val[2] = vqtbl4q_u8(table, result.val[2]);
|
|
165
|
+
result.val[3] = vqtbl4q_u8(table, result.val[3]);
|
|
166
|
+
if (insert_line_feeds) {
|
|
167
|
+
if (line_length >= 64) { // fast path
|
|
168
|
+
vst4q_u8(out, result);
|
|
169
|
+
if (offset + 64 > line_length) {
|
|
170
|
+
size_t location_end = line_length - offset;
|
|
171
|
+
size_t to_move = 64 - location_end;
|
|
172
|
+
std::memmove(out + location_end + 1, out + location_end, to_move);
|
|
173
|
+
out[location_end] = '\n';
|
|
174
|
+
offset = to_move;
|
|
175
|
+
out += 64 + 1;
|
|
176
|
+
} else {
|
|
177
|
+
offset += 64;
|
|
178
|
+
out += 64;
|
|
179
|
+
}
|
|
180
|
+
} else { // slow path
|
|
181
|
+
uint8x16x2_t Z0 = vzipq_u8(result.val[0], result.val[1]);
|
|
182
|
+
uint8x16x2_t Z1 = vzipq_u8(result.val[2], result.val[3]);
|
|
183
|
+
uint16x8x2_t Z2 = vzipq_u16(vreinterpretq_u16_u8(Z0.val[0]),
|
|
184
|
+
vreinterpretq_u16_u8(Z1.val[0]));
|
|
185
|
+
uint16x8x2_t Z3 = vzipq_u16(vreinterpretq_u16_u8(Z0.val[1]),
|
|
186
|
+
vreinterpretq_u16_u8(Z1.val[1]));
|
|
187
|
+
uint8x16_t T0 = vreinterpretq_u8_u16(Z2.val[0]);
|
|
188
|
+
uint8x16_t T1 = vreinterpretq_u8_u16(Z2.val[1]);
|
|
189
|
+
uint8x16_t T2 = vreinterpretq_u8_u16(Z3.val[0]);
|
|
190
|
+
uint8x16_t T3 = vreinterpretq_u8_u16(Z3.val[1]);
|
|
191
|
+
out += write_output_with_line_feeds(out, T0, line_length, offset);
|
|
192
|
+
out += write_output_with_line_feeds(out, T1, line_length, offset);
|
|
193
|
+
out += write_output_with_line_feeds(out, T2, line_length, offset);
|
|
194
|
+
out += write_output_with_line_feeds(out, T3, line_length, offset);
|
|
195
|
+
}
|
|
196
|
+
} else {
|
|
197
|
+
vst4q_u8(out, result);
|
|
198
|
+
out += 64;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
if (i + 24 <= srclen) {
|
|
203
|
+
const uint8x8_t v3f_d = vdup_n_u8(0x3f);
|
|
204
|
+
const uint8x8x3_t in = vld3_u8((const uint8_t *)src + i);
|
|
205
|
+
uint8x8x4_t result;
|
|
206
|
+
result.val[0] = vshr_n_u8(in.val[0], 2);
|
|
207
|
+
result.val[1] =
|
|
208
|
+
vand_u8(vsli_n_u8(vshr_n_u8(in.val[1], 4), in.val[0], 4), v3f_d);
|
|
209
|
+
result.val[2] =
|
|
210
|
+
vand_u8(vsli_n_u8(vshr_n_u8(in.val[2], 6), in.val[1], 2), v3f_d);
|
|
211
|
+
result.val[3] = vand_u8(in.val[2], v3f_d);
|
|
212
|
+
result.val[0] = vqtbl4_u8(table, result.val[0]);
|
|
213
|
+
result.val[1] = vqtbl4_u8(table, result.val[1]);
|
|
214
|
+
result.val[2] = vqtbl4_u8(table, result.val[2]);
|
|
215
|
+
result.val[3] = vqtbl4_u8(table, result.val[3]);
|
|
216
|
+
if (insert_line_feeds) {
|
|
217
|
+
if (line_length >= 32) { // fast path
|
|
218
|
+
vst4_u8(out, result);
|
|
219
|
+
if (offset + 32 > line_length) {
|
|
220
|
+
size_t location_end = line_length - offset;
|
|
221
|
+
size_t to_move = 32 - location_end;
|
|
222
|
+
std::memmove(out + location_end + 1, out + location_end, to_move);
|
|
223
|
+
out[location_end] = '\n';
|
|
224
|
+
offset = to_move;
|
|
225
|
+
out += 32 + 1;
|
|
226
|
+
} else {
|
|
227
|
+
offset += 32;
|
|
228
|
+
out += 32;
|
|
229
|
+
}
|
|
230
|
+
} else { // slow path
|
|
231
|
+
uint8x8x2_t Z0 = vzip_u8(result.val[0], result.val[1]);
|
|
232
|
+
uint8x8x2_t Z1 = vzip_u8(result.val[2], result.val[3]);
|
|
233
|
+
uint16x4x2_t Z2 = vzip_u16(vreinterpret_u16_u8(Z0.val[0]),
|
|
234
|
+
vreinterpret_u16_u8(Z1.val[0]));
|
|
235
|
+
uint16x4x2_t Z3 = vzip_u16(vreinterpret_u16_u8(Z0.val[1]),
|
|
236
|
+
vreinterpret_u16_u8(Z1.val[1]));
|
|
237
|
+
uint8x8_t T0 = vreinterpret_u8_u16(Z2.val[0]);
|
|
238
|
+
uint8x8_t T1 = vreinterpret_u8_u16(Z2.val[1]);
|
|
239
|
+
uint8x8_t T2 = vreinterpret_u8_u16(Z3.val[0]);
|
|
240
|
+
uint8x8_t T3 = vreinterpret_u8_u16(Z3.val[1]);
|
|
241
|
+
uint8x16_t TT0 = vcombine_u8(T0, T1);
|
|
242
|
+
uint8x16_t TT1 = vcombine_u8(T2, T3);
|
|
243
|
+
out += write_output_with_line_feeds(out, TT0, line_length, offset);
|
|
244
|
+
out += write_output_with_line_feeds(out, TT1, line_length, offset);
|
|
245
|
+
}
|
|
246
|
+
} else {
|
|
247
|
+
vst4_u8(out, result);
|
|
248
|
+
out += 32;
|
|
249
|
+
}
|
|
250
|
+
i += 24;
|
|
251
|
+
}
|
|
252
|
+
out += scalar::base64::tail_encode_base64_impl<insert_line_feeds>(
|
|
253
|
+
(char *)out, src + i, srclen - i, options, line_length, offset);
|
|
254
|
+
return size_t((char *)out - dst);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
size_t encode_base64(char *dst, const char *src, size_t srclen,
|
|
258
|
+
base64_options options) {
|
|
259
|
+
return encode_base64_impl<false>(dst, src, srclen, options);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
static inline void compress(uint8x16_t data, uint16_t mask, char *output) {
|
|
263
|
+
if (mask == 0) {
|
|
264
|
+
vst1q_u8((uint8_t *)output, data);
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
uint8_t mask1 = uint8_t(mask); // least significant 8 bits
|
|
268
|
+
uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits
|
|
269
|
+
uint64x2_t compactmasku64 = {tables::base64::thintable_epi8[mask1],
|
|
270
|
+
tables::base64::thintable_epi8[mask2]};
|
|
271
|
+
uint8x16_t compactmask = vreinterpretq_u8_u64(compactmasku64);
|
|
272
|
+
#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
|
|
273
|
+
const uint8x16_t off =
|
|
274
|
+
simdutf_make_uint8x16_t(0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8);
|
|
275
|
+
#else
|
|
276
|
+
const uint8x16_t off = {0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8};
|
|
277
|
+
#endif
|
|
278
|
+
|
|
279
|
+
compactmask = vaddq_u8(compactmask, off);
|
|
280
|
+
uint8x16_t pruned = vqtbl1q_u8(data, compactmask);
|
|
281
|
+
|
|
282
|
+
int pop1 = tables::base64::BitsSetTable256mul2[mask1];
|
|
283
|
+
// then load the corresponding mask, what it does is to write
|
|
284
|
+
// only the first pop1 bytes from the first 8 bytes, and then
|
|
285
|
+
// it fills in with the bytes from the second 8 bytes + some filling
|
|
286
|
+
// at the end.
|
|
287
|
+
compactmask = vld1q_u8(tables::base64::pshufb_combine_table + pop1 * 8);
|
|
288
|
+
uint8x16_t answer = vqtbl1q_u8(pruned, compactmask);
|
|
289
|
+
vst1q_u8((uint8_t *)output, answer);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
struct block64 {
|
|
293
|
+
uint8x16_t chunks[4];
|
|
294
|
+
};
|
|
295
|
+
|
|
296
|
+
static_assert(sizeof(block64) == 64, "block64 is not 64 bytes");
|
|
297
|
+
template <bool base64_url, bool default_or_url>
|
|
298
|
+
uint64_t to_base64_mask(block64 *b, bool *error) {
|
|
299
|
+
uint8x16_t v0f = vdupq_n_u8(0xf);
|
|
300
|
+
uint8x16_t v01 = vdupq_n_u8(0x1);
|
|
301
|
+
|
|
302
|
+
uint8x16_t lo_nibbles0 = vandq_u8(b->chunks[0], v0f);
|
|
303
|
+
uint8x16_t lo_nibbles1 = vandq_u8(b->chunks[1], v0f);
|
|
304
|
+
uint8x16_t lo_nibbles2 = vandq_u8(b->chunks[2], v0f);
|
|
305
|
+
uint8x16_t lo_nibbles3 = vandq_u8(b->chunks[3], v0f);
|
|
306
|
+
|
|
307
|
+
// Needed by the decoding step.
|
|
308
|
+
uint8x16_t hi_bits0 = vshrq_n_u8(b->chunks[0], 3);
|
|
309
|
+
uint8x16_t hi_bits1 = vshrq_n_u8(b->chunks[1], 3);
|
|
310
|
+
uint8x16_t hi_bits2 = vshrq_n_u8(b->chunks[2], 3);
|
|
311
|
+
uint8x16_t hi_bits3 = vshrq_n_u8(b->chunks[3], 3);
|
|
312
|
+
uint8x16_t lut_lo;
|
|
313
|
+
#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
|
|
314
|
+
if (default_or_url) {
|
|
315
|
+
lut_lo =
|
|
316
|
+
simdutf_make_uint8x16_t(0xa9, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8,
|
|
317
|
+
0xf8, 0xf9, 0xf1, 0xa2, 0xa1, 0xa5, 0xa0, 0xa6);
|
|
318
|
+
} else if (base64_url) {
|
|
319
|
+
lut_lo =
|
|
320
|
+
simdutf_make_uint8x16_t(0xa9, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8,
|
|
321
|
+
0xf8, 0xf9, 0xf1, 0xa0, 0xa1, 0xa5, 0xa0, 0xa2);
|
|
322
|
+
} else {
|
|
323
|
+
lut_lo =
|
|
324
|
+
simdutf_make_uint8x16_t(0xa9, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8,
|
|
325
|
+
0xf8, 0xf9, 0xf1, 0xa2, 0xa1, 0xa1, 0xa0, 0xa4);
|
|
326
|
+
}
|
|
327
|
+
#else
|
|
328
|
+
if (default_or_url) {
|
|
329
|
+
lut_lo = uint8x16_t{0xa9, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8,
|
|
330
|
+
0xf8, 0xf9, 0xf1, 0xa2, 0xa1, 0xa5, 0xa0, 0xa6};
|
|
331
|
+
} else if (base64_url) {
|
|
332
|
+
lut_lo = uint8x16_t{0xa9, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8,
|
|
333
|
+
0xf8, 0xf9, 0xf1, 0xa0, 0xa1, 0xa5, 0xa0, 0xa2};
|
|
334
|
+
} else {
|
|
335
|
+
lut_lo = uint8x16_t{0xa9, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8,
|
|
336
|
+
0xf8, 0xf9, 0xf1, 0xa2, 0xa1, 0xa1, 0xa0, 0xa4};
|
|
337
|
+
}
|
|
338
|
+
#endif
|
|
339
|
+
uint8x16_t lo0 = vqtbl1q_u8(lut_lo, lo_nibbles0);
|
|
340
|
+
uint8x16_t lo1 = vqtbl1q_u8(lut_lo, lo_nibbles1);
|
|
341
|
+
uint8x16_t lo2 = vqtbl1q_u8(lut_lo, lo_nibbles2);
|
|
342
|
+
uint8x16_t lo3 = vqtbl1q_u8(lut_lo, lo_nibbles3);
|
|
343
|
+
uint8x16_t lut_hi;
|
|
344
|
+
#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
|
|
345
|
+
if (default_or_url) {
|
|
346
|
+
lut_hi =
|
|
347
|
+
simdutf_make_uint8x16_t(0x0, 0x1, 0x0, 0x0, 0x1, 0x6, 0x8, 0x8, 0x10,
|
|
348
|
+
0x20, 0x20, 0x12, 0x40, 0x80, 0x80, 0x40);
|
|
349
|
+
} else if (base64_url) {
|
|
350
|
+
lut_hi =
|
|
351
|
+
simdutf_make_uint8x16_t(0x0, 0x1, 0x0, 0x0, 0x1, 0x6, 0x8, 0x8, 0x10,
|
|
352
|
+
0x20, 0x20, 0x12, 0x40, 0x80, 0x80, 0x40);
|
|
353
|
+
} else {
|
|
354
|
+
lut_hi =
|
|
355
|
+
simdutf_make_uint8x16_t(0x0, 0x1, 0x0, 0x0, 0x1, 0x6, 0x8, 0x8, 0x10,
|
|
356
|
+
0x20, 0x20, 0x10, 0x40, 0x80, 0x80, 0x40);
|
|
357
|
+
}
|
|
358
|
+
#else
|
|
359
|
+
if (default_or_url) {
|
|
360
|
+
lut_hi = uint8x16_t{0x0, 0x1, 0x0, 0x0, 0x1, 0x6, 0x8, 0x8,
|
|
361
|
+
0x10, 0x20, 0x20, 0x12, 0x40, 0x80, 0x80, 0x40};
|
|
362
|
+
} else if (base64_url) {
|
|
363
|
+
lut_hi = uint8x16_t{0x0, 0x1, 0x0, 0x0, 0x1, 0x4, 0x8, 0x8,
|
|
364
|
+
0x10, 0x20, 0x20, 0x12, 0x40, 0x80, 0x80, 0x40};
|
|
365
|
+
} else {
|
|
366
|
+
lut_hi = uint8x16_t{0x0, 0x1, 0x0, 0x0, 0x1, 0x6, 0x8, 0x8,
|
|
367
|
+
0x10, 0x20, 0x20, 0x10, 0x40, 0x80, 0x80, 0x40};
|
|
368
|
+
}
|
|
369
|
+
#endif
|
|
370
|
+
uint8x16_t hi0 = vqtbl1q_u8(lut_hi, hi_bits0);
|
|
371
|
+
uint8x16_t hi1 = vqtbl1q_u8(lut_hi, hi_bits1);
|
|
372
|
+
uint8x16_t hi2 = vqtbl1q_u8(lut_hi, hi_bits2);
|
|
373
|
+
uint8x16_t hi3 = vqtbl1q_u8(lut_hi, hi_bits3);
|
|
374
|
+
|
|
375
|
+
// maps error byte to 0 and space byte to 1, valid bytes are >1
|
|
376
|
+
uint8x16_t res0 = vandq_u8(lo0, hi0);
|
|
377
|
+
uint8x16_t res1 = vandq_u8(lo1, hi1);
|
|
378
|
+
uint8x16_t res2 = vandq_u8(lo2, hi2);
|
|
379
|
+
uint8x16_t res3 = vandq_u8(lo3, hi3);
|
|
380
|
+
|
|
381
|
+
uint8_t checks =
|
|
382
|
+
vminvq_u8(vminq_u8(vminq_u8(res0, res1), vminq_u8(res2, res3)));
|
|
383
|
+
#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
|
|
384
|
+
const uint8x16_t bit_mask =
|
|
385
|
+
simdutf_make_uint8x16_t(0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80,
|
|
386
|
+
0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80);
|
|
387
|
+
#else
|
|
388
|
+
const uint8x16_t bit_mask = {0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80,
|
|
389
|
+
0x01, 0x02, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80};
|
|
390
|
+
#endif
|
|
391
|
+
uint64_t badcharmask = 0;
|
|
392
|
+
*error = checks == 0;
|
|
393
|
+
if (checks <= 1) {
|
|
394
|
+
// Add each of the elements next to each other, successively, to stuff each
|
|
395
|
+
// 8 byte mask into one.
|
|
396
|
+
uint8x16_t test0 = vcleq_u8(res0, v01);
|
|
397
|
+
uint8x16_t test1 = vcleq_u8(res1, v01);
|
|
398
|
+
uint8x16_t test2 = vcleq_u8(res2, v01);
|
|
399
|
+
uint8x16_t test3 = vcleq_u8(res3, v01);
|
|
400
|
+
uint8x16_t sum0 =
|
|
401
|
+
vpaddq_u8(vandq_u8(test0, bit_mask), vandq_u8(test1, bit_mask));
|
|
402
|
+
uint8x16_t sum1 =
|
|
403
|
+
vpaddq_u8(vandq_u8(test2, bit_mask), vandq_u8(test3, bit_mask));
|
|
404
|
+
sum0 = vpaddq_u8(sum0, sum1);
|
|
405
|
+
sum0 = vpaddq_u8(sum0, sum0);
|
|
406
|
+
badcharmask = vgetq_lane_u64(vreinterpretq_u64_u8(sum0), 0);
|
|
407
|
+
}
|
|
408
|
+
// This is the transformation step that can be done while we are waiting for
|
|
409
|
+
// sum0
|
|
410
|
+
uint8x16_t roll_lut;
|
|
411
|
+
#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
|
|
412
|
+
if (default_or_url) {
|
|
413
|
+
roll_lut =
|
|
414
|
+
simdutf_make_uint8x16_t(0xBF, 0xE0, 0xB9, 0x13, 0x04, 0xBF, 0xBF, 0xB9,
|
|
415
|
+
0xB9, 0x00, 0xFF, 0x11, 0xFF, 0xBF, 0x10, 0xB9);
|
|
416
|
+
} else if (base64_url) {
|
|
417
|
+
roll_lut =
|
|
418
|
+
simdutf_make_uint8x16_t(0xB9, 0xB9, 0xBF, 0xBF, 0x04, 0x11, 0xE0, 0x00,
|
|
419
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
|
|
420
|
+
} else {
|
|
421
|
+
roll_lut =
|
|
422
|
+
simdutf_make_uint8x16_t(0xB9, 0xB9, 0xBF, 0xBF, 0x04, 0x10, 0x13, 0x00,
|
|
423
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
|
|
424
|
+
}
|
|
425
|
+
#else
|
|
426
|
+
if (default_or_url) {
|
|
427
|
+
roll_lut = uint8x16_t{0xBF, 0xE0, 0xB9, 0x13, 0x04, 0xBF, 0xBF, 0xB9,
|
|
428
|
+
0xB9, 0x00, 0xFF, 0x11, 0xFF, 0xBF, 0x10, 0xB9};
|
|
429
|
+
} else if (base64_url) {
|
|
430
|
+
roll_lut = uint8x16_t{0xB9, 0xB9, 0xBF, 0xBF, 0x04, 0x11, 0xE0, 0x00,
|
|
431
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
|
432
|
+
} else {
|
|
433
|
+
roll_lut = uint8x16_t{0xB9, 0xB9, 0xBF, 0xBF, 0x04, 0x10, 0x13, 0x00,
|
|
434
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
|
435
|
+
}
|
|
436
|
+
#endif
|
|
437
|
+
uint8x16_t roll0, roll1, roll2, roll3;
|
|
438
|
+
if (default_or_url) {
|
|
439
|
+
#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
|
|
440
|
+
const uint8x16_t delta_asso =
|
|
441
|
+
simdutf_make_uint8x16_t(0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
|
442
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x16);
|
|
443
|
+
#else
|
|
444
|
+
const uint8x16_t delta_asso =
|
|
445
|
+
uint8x16_t{0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
|
|
446
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x16};
|
|
447
|
+
#endif
|
|
448
|
+
// the logic of translating is based on westmere
|
|
449
|
+
uint8x16_t delta_hash0 =
|
|
450
|
+
vrhaddq_u8(vqtbl1q_u8(delta_asso, lo_nibbles0), hi_bits0);
|
|
451
|
+
uint8x16_t delta_hash1 =
|
|
452
|
+
vrhaddq_u8(vqtbl1q_u8(delta_asso, lo_nibbles1), hi_bits1);
|
|
453
|
+
uint8x16_t delta_hash2 =
|
|
454
|
+
vrhaddq_u8(vqtbl1q_u8(delta_asso, lo_nibbles2), hi_bits2);
|
|
455
|
+
uint8x16_t delta_hash3 =
|
|
456
|
+
vrhaddq_u8(vqtbl1q_u8(delta_asso, lo_nibbles3), hi_bits3);
|
|
457
|
+
const uint8x16x2_t roll_lut_2 = {roll_lut, roll_lut};
|
|
458
|
+
roll0 = vqtbl2q_u8(roll_lut_2, delta_hash0);
|
|
459
|
+
roll1 = vqtbl2q_u8(roll_lut_2, delta_hash1);
|
|
460
|
+
roll2 = vqtbl2q_u8(roll_lut_2, delta_hash2);
|
|
461
|
+
roll3 = vqtbl2q_u8(roll_lut_2, delta_hash3);
|
|
462
|
+
} else {
|
|
463
|
+
uint8x16_t delta_hash0 = vclzq_u8(res0);
|
|
464
|
+
uint8x16_t delta_hash1 = vclzq_u8(res1);
|
|
465
|
+
uint8x16_t delta_hash2 = vclzq_u8(res2);
|
|
466
|
+
uint8x16_t delta_hash3 = vclzq_u8(res3);
|
|
467
|
+
roll0 = vqtbl1q_u8(roll_lut, delta_hash0);
|
|
468
|
+
roll1 = vqtbl1q_u8(roll_lut, delta_hash1);
|
|
469
|
+
roll2 = vqtbl1q_u8(roll_lut, delta_hash2);
|
|
470
|
+
roll3 = vqtbl1q_u8(roll_lut, delta_hash3);
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
b->chunks[0] = vaddq_u8(b->chunks[0], roll0);
|
|
474
|
+
b->chunks[1] = vaddq_u8(b->chunks[1], roll1);
|
|
475
|
+
b->chunks[2] = vaddq_u8(b->chunks[2], roll2);
|
|
476
|
+
b->chunks[3] = vaddq_u8(b->chunks[3], roll3);
|
|
477
|
+
return badcharmask;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
void copy_block(block64 *b, char *output) {
|
|
481
|
+
vst1q_u8((uint8_t *)output, b->chunks[0]);
|
|
482
|
+
vst1q_u8((uint8_t *)output + 16, b->chunks[1]);
|
|
483
|
+
vst1q_u8((uint8_t *)output + 32, b->chunks[2]);
|
|
484
|
+
vst1q_u8((uint8_t *)output + 48, b->chunks[3]);
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
uint64_t compress_block(block64 *b, uint64_t mask, char *output) {
|
|
488
|
+
uint64_t popcounts =
|
|
489
|
+
vget_lane_u64(vreinterpret_u64_u8(vcnt_u8(vcreate_u8(~mask))), 0);
|
|
490
|
+
uint64_t offsets = popcounts * 0x0101010101010101;
|
|
491
|
+
compress(b->chunks[0], uint16_t(mask), output);
|
|
492
|
+
compress(b->chunks[1], uint16_t(mask >> 16), &output[(offsets >> 8) & 0xFF]);
|
|
493
|
+
compress(b->chunks[2], uint16_t(mask >> 32), &output[(offsets >> 24) & 0xFF]);
|
|
494
|
+
compress(b->chunks[3], uint16_t(mask >> 48), &output[(offsets >> 40) & 0xFF]);
|
|
495
|
+
return offsets >> 56;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
// The caller of this function is responsible to ensure that there are 64 bytes
|
|
499
|
+
// available from reading at src. The data is read into a block64 structure.
|
|
500
|
+
void load_block(block64 *b, const char *src) {
|
|
501
|
+
b->chunks[0] = vld1q_u8(reinterpret_cast<const uint8_t *>(src));
|
|
502
|
+
b->chunks[1] = vld1q_u8(reinterpret_cast<const uint8_t *>(src) + 16);
|
|
503
|
+
b->chunks[2] = vld1q_u8(reinterpret_cast<const uint8_t *>(src) + 32);
|
|
504
|
+
b->chunks[3] = vld1q_u8(reinterpret_cast<const uint8_t *>(src) + 48);
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
// The caller of this function is responsible to ensure that there are 32 bytes
|
|
508
|
+
// available from reading at data. It returns a 16-byte value, narrowing with
|
|
509
|
+
// saturation the 16-bit words.
|
|
510
|
+
inline uint8x16_t load_satured(const uint16_t *data) {
|
|
511
|
+
uint16x8_t in1 = vld1q_u16(data);
|
|
512
|
+
uint16x8_t in2 = vld1q_u16(data + 8);
|
|
513
|
+
return vqmovn_high_u16(vqmovn_u16(in1), in2);
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
// The caller of this function is responsible to ensure that there are 128 bytes
|
|
517
|
+
// available from reading at src. The data is read into a block64 structure.
|
|
518
|
+
void load_block(block64 *b, const char16_t *src) {
|
|
519
|
+
b->chunks[0] = load_satured(reinterpret_cast<const uint16_t *>(src));
|
|
520
|
+
b->chunks[1] = load_satured(reinterpret_cast<const uint16_t *>(src) + 16);
|
|
521
|
+
b->chunks[2] = load_satured(reinterpret_cast<const uint16_t *>(src) + 32);
|
|
522
|
+
b->chunks[3] = load_satured(reinterpret_cast<const uint16_t *>(src) + 48);
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
// decode 64 bytes and output 48 bytes
|
|
526
|
+
void base64_decode_block(char *out, const char *src) {
|
|
527
|
+
uint8x16x4_t str = vld4q_u8((uint8_t *)src);
|
|
528
|
+
uint8x16x3_t outvec;
|
|
529
|
+
outvec.val[0] = vsliq_n_u8(vshrq_n_u8(str.val[1], 4), str.val[0], 2);
|
|
530
|
+
outvec.val[1] = vsliq_n_u8(vshrq_n_u8(str.val[2], 2), str.val[1], 4);
|
|
531
|
+
outvec.val[2] = vsliq_n_u8(str.val[3], str.val[2], 6);
|
|
532
|
+
vst3q_u8((uint8_t *)out, outvec);
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
static size_t compress_block_single(block64 *b, uint64_t mask, char *output) {
|
|
536
|
+
const size_t pos64 = trailing_zeroes(mask);
|
|
537
|
+
const int8_t pos = pos64 & 0xf;
|
|
538
|
+
|
|
539
|
+
// Predefine the index vector
|
|
540
|
+
#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
|
|
541
|
+
const uint8x16_t v1 = simdutf_make_uint8x16_t(0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
|
|
542
|
+
10, 11, 12, 13, 14, 15);
|
|
543
|
+
#else // SIMDUTF_REGULAR_VISUAL_STUDIO
|
|
544
|
+
const uint8x16_t v1 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
|
|
545
|
+
#endif // SIMDUTF_REGULAR_VISUAL_STUDIO
|
|
546
|
+
|
|
547
|
+
switch (pos64 >> 4) {
|
|
548
|
+
case 0b00: {
|
|
549
|
+
const uint8x16_t v0 = vmovq_n_u8((uint8_t)(pos - 1));
|
|
550
|
+
const uint8x16_t v2 =
|
|
551
|
+
vcgtq_s8(vreinterpretq_s8_u8(v1),
|
|
552
|
+
vreinterpretq_s8_u8(v0)); // Compare greater than
|
|
553
|
+
const uint8x16_t sh = vsubq_u8(v1, v2); // Subtract
|
|
554
|
+
const uint8x16_t compressed =
|
|
555
|
+
vqtbl1q_u8(b->chunks[0], sh); // Table lookup (shuffle)
|
|
556
|
+
|
|
557
|
+
vst1q_u8((uint8_t *)(output + 0 * 16), compressed);
|
|
558
|
+
vst1q_u8((uint8_t *)(output + 1 * 16 - 1), b->chunks[1]);
|
|
559
|
+
vst1q_u8((uint8_t *)(output + 2 * 16 - 1), b->chunks[2]);
|
|
560
|
+
vst1q_u8((uint8_t *)(output + 3 * 16 - 1), b->chunks[3]);
|
|
561
|
+
} break;
|
|
562
|
+
|
|
563
|
+
case 0b01: {
|
|
564
|
+
vst1q_u8((uint8_t *)(output + 0 * 16), b->chunks[0]);
|
|
565
|
+
|
|
566
|
+
const uint8x16_t v0 = vmovq_n_u8((uint8_t)(pos - 1));
|
|
567
|
+
const uint8x16_t v2 =
|
|
568
|
+
vcgtq_s8(vreinterpretq_s8_u8(v1), vreinterpretq_s8_u8(v0));
|
|
569
|
+
const uint8x16_t sh = vsubq_u8(v1, v2);
|
|
570
|
+
const uint8x16_t compressed = vqtbl1q_u8(b->chunks[1], sh);
|
|
571
|
+
|
|
572
|
+
vst1q_u8((uint8_t *)(output + 1 * 16), compressed);
|
|
573
|
+
vst1q_u8((uint8_t *)(output + 2 * 16 - 1), b->chunks[2]);
|
|
574
|
+
vst1q_u8((uint8_t *)(output + 3 * 16 - 1), b->chunks[3]);
|
|
575
|
+
} break;
|
|
576
|
+
|
|
577
|
+
case 0b10: {
|
|
578
|
+
vst1q_u8((uint8_t *)(output + 0 * 16), b->chunks[0]);
|
|
579
|
+
vst1q_u8((uint8_t *)(output + 1 * 16), b->chunks[1]);
|
|
580
|
+
|
|
581
|
+
const uint8x16_t v0 = vmovq_n_u8((uint8_t)(pos - 1));
|
|
582
|
+
const uint8x16_t v2 =
|
|
583
|
+
vcgtq_s8(vreinterpretq_s8_u8(v1), vreinterpretq_s8_u8(v0));
|
|
584
|
+
const uint8x16_t sh = vsubq_u8(v1, v2);
|
|
585
|
+
const uint8x16_t compressed = vqtbl1q_u8(b->chunks[2], sh);
|
|
586
|
+
|
|
587
|
+
vst1q_u8((uint8_t *)(output + 2 * 16), compressed);
|
|
588
|
+
vst1q_u8((uint8_t *)(output + 3 * 16 - 1), b->chunks[3]);
|
|
589
|
+
} break;
|
|
590
|
+
|
|
591
|
+
case 0b11: {
|
|
592
|
+
vst1q_u8((uint8_t *)(output + 0 * 16), b->chunks[0]);
|
|
593
|
+
vst1q_u8((uint8_t *)(output + 1 * 16), b->chunks[1]);
|
|
594
|
+
vst1q_u8((uint8_t *)(output + 2 * 16), b->chunks[2]);
|
|
595
|
+
|
|
596
|
+
const uint8x16_t v0 = vmovq_n_u8((uint8_t)(pos - 1));
|
|
597
|
+
const uint8x16_t v2 =
|
|
598
|
+
vcgtq_s8(vreinterpretq_s8_u8(v1), vreinterpretq_s8_u8(v0));
|
|
599
|
+
const uint8x16_t sh = vsubq_u8(v1, v2);
|
|
600
|
+
const uint8x16_t compressed = vqtbl1q_u8(b->chunks[3], sh);
|
|
601
|
+
|
|
602
|
+
vst1q_u8((uint8_t *)(output + 3 * 16), compressed);
|
|
603
|
+
} break;
|
|
604
|
+
}
|
|
605
|
+
return 63;
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
template <typename T> bool is_power_of_two(T x) { return (x & (x - 1)) == 0; }
|
|
609
|
+
|
|
610
|
+
template <bool base64_url, bool ignore_garbage, bool default_or_url,
|
|
611
|
+
typename char_type>
|
|
612
|
+
full_result
|
|
613
|
+
compress_decode_base64(char *dst, const char_type *src, size_t srclen,
|
|
614
|
+
base64_options options,
|
|
615
|
+
last_chunk_handling_options last_chunk_options) {
|
|
616
|
+
const uint8_t *to_base64 =
|
|
617
|
+
default_or_url ? tables::base64::to_base64_default_or_url_value
|
|
618
|
+
: (base64_url ? tables::base64::to_base64_url_value
|
|
619
|
+
: tables::base64::to_base64_value);
|
|
620
|
+
auto ri = simdutf::scalar::base64::find_end(src, srclen, options);
|
|
621
|
+
size_t equallocation = ri.equallocation;
|
|
622
|
+
size_t equalsigns = ri.equalsigns;
|
|
623
|
+
srclen = ri.srclen;
|
|
624
|
+
size_t full_input_length = ri.full_input_length;
|
|
625
|
+
if (srclen == 0) {
|
|
626
|
+
if (!ignore_garbage && equalsigns > 0) {
|
|
627
|
+
return {INVALID_BASE64_CHARACTER, equallocation, 0};
|
|
628
|
+
}
|
|
629
|
+
return {SUCCESS, full_input_length, 0};
|
|
630
|
+
}
|
|
631
|
+
const char_type *const srcinit = src;
|
|
632
|
+
const char *const dstinit = dst;
|
|
633
|
+
const char_type *const srcend = src + srclen;
|
|
634
|
+
|
|
635
|
+
constexpr size_t block_size = 10;
|
|
636
|
+
char buffer[block_size * 64];
|
|
637
|
+
char *bufferptr = buffer;
|
|
638
|
+
if (srclen >= 64) {
|
|
639
|
+
const char_type *const srcend64 = src + srclen - 64;
|
|
640
|
+
while (src <= srcend64) {
|
|
641
|
+
block64 b;
|
|
642
|
+
load_block(&b, src);
|
|
643
|
+
src += 64;
|
|
644
|
+
bool error = false;
|
|
645
|
+
uint64_t badcharmask =
|
|
646
|
+
to_base64_mask<base64_url, default_or_url>(&b, &error);
|
|
647
|
+
if (badcharmask) {
|
|
648
|
+
if (error && !ignore_garbage) {
|
|
649
|
+
src -= 64;
|
|
650
|
+
while (src < srcend && scalar::base64::is_eight_byte(*src) &&
|
|
651
|
+
to_base64[uint8_t(*src)] <= 64) {
|
|
652
|
+
src++;
|
|
653
|
+
}
|
|
654
|
+
if (src < srcend) {
|
|
655
|
+
// should never happen
|
|
656
|
+
}
|
|
657
|
+
return {error_code::INVALID_BASE64_CHARACTER, size_t(src - srcinit),
|
|
658
|
+
size_t(dst - dstinit)};
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
if (badcharmask != 0) {
|
|
663
|
+
// optimization opportunity: check for simple masks like those made of
|
|
664
|
+
// continuous 1s followed by continuous 0s. And masks containing a
|
|
665
|
+
// single bad character.
|
|
666
|
+
if (is_power_of_two(badcharmask)) {
|
|
667
|
+
bufferptr += compress_block_single(&b, badcharmask, bufferptr);
|
|
668
|
+
} else {
|
|
669
|
+
bufferptr += compress_block(&b, badcharmask, bufferptr);
|
|
670
|
+
}
|
|
671
|
+
} else {
|
|
672
|
+
// optimization opportunity: if bufferptr == buffer and mask == 0, we
|
|
673
|
+
// can avoid the call to compress_block and decode directly.
|
|
674
|
+
copy_block(&b, bufferptr);
|
|
675
|
+
bufferptr += 64;
|
|
676
|
+
}
|
|
677
|
+
if (bufferptr >= (block_size - 1) * 64 + buffer) {
|
|
678
|
+
for (size_t i = 0; i < (block_size - 1); i++) {
|
|
679
|
+
base64_decode_block(dst, buffer + i * 64);
|
|
680
|
+
dst += 48;
|
|
681
|
+
}
|
|
682
|
+
std::memcpy(buffer, buffer + (block_size - 1) * 64,
|
|
683
|
+
64); // 64 might be too much
|
|
684
|
+
bufferptr -= (block_size - 1) * 64;
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
char *buffer_start = buffer;
|
|
689
|
+
// Optimization note: if this is almost full, then it is worth our
|
|
690
|
+
// time, otherwise, we should just decode directly.
|
|
691
|
+
int last_block = (int)((bufferptr - buffer_start) % 64);
|
|
692
|
+
if (last_block != 0 && srcend - src + last_block >= 64) {
|
|
693
|
+
while ((bufferptr - buffer_start) % 64 != 0 && src < srcend) {
|
|
694
|
+
uint8_t val = to_base64[uint8_t(*src)];
|
|
695
|
+
*bufferptr = char(val);
|
|
696
|
+
if ((!scalar::base64::is_eight_byte(*src) || val > 64) &&
|
|
697
|
+
!ignore_garbage) {
|
|
698
|
+
return {error_code::INVALID_BASE64_CHARACTER, size_t(src - srcinit),
|
|
699
|
+
size_t(dst - dstinit)};
|
|
700
|
+
}
|
|
701
|
+
bufferptr += (val <= 63);
|
|
702
|
+
src++;
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
for (; buffer_start + 64 <= bufferptr; buffer_start += 64) {
|
|
707
|
+
base64_decode_block(dst, buffer_start);
|
|
708
|
+
dst += 48;
|
|
709
|
+
}
|
|
710
|
+
if ((bufferptr - buffer_start) % 64 != 0) {
|
|
711
|
+
while (buffer_start + 4 < bufferptr) {
|
|
712
|
+
uint32_t triple = ((uint32_t(uint8_t(buffer_start[0])) << 3 * 6) +
|
|
713
|
+
(uint32_t(uint8_t(buffer_start[1])) << 2 * 6) +
|
|
714
|
+
(uint32_t(uint8_t(buffer_start[2])) << 1 * 6) +
|
|
715
|
+
(uint32_t(uint8_t(buffer_start[3])) << 0 * 6))
|
|
716
|
+
<< 8;
|
|
717
|
+
#if !SIMDUTF_IS_BIG_ENDIAN
|
|
718
|
+
triple = scalar::u32_swap_bytes(triple);
|
|
719
|
+
#endif
|
|
720
|
+
std::memcpy(dst, &triple, 4);
|
|
721
|
+
|
|
722
|
+
dst += 3;
|
|
723
|
+
buffer_start += 4;
|
|
724
|
+
}
|
|
725
|
+
if (buffer_start + 4 <= bufferptr) {
|
|
726
|
+
uint32_t triple = ((uint32_t(uint8_t(buffer_start[0])) << 3 * 6) +
|
|
727
|
+
(uint32_t(uint8_t(buffer_start[1])) << 2 * 6) +
|
|
728
|
+
(uint32_t(uint8_t(buffer_start[2])) << 1 * 6) +
|
|
729
|
+
(uint32_t(uint8_t(buffer_start[3])) << 0 * 6))
|
|
730
|
+
<< 8;
|
|
731
|
+
#if !SIMDUTF_IS_BIG_ENDIAN
|
|
732
|
+
triple = scalar::u32_swap_bytes(triple);
|
|
733
|
+
#endif
|
|
734
|
+
std::memcpy(dst, &triple, 3);
|
|
735
|
+
|
|
736
|
+
dst += 3;
|
|
737
|
+
buffer_start += 4;
|
|
738
|
+
}
|
|
739
|
+
// we may have 1, 2 or 3 bytes left and we need to decode them so let us
|
|
740
|
+
// backtrack
|
|
741
|
+
int leftover = int(bufferptr - buffer_start);
|
|
742
|
+
while (leftover > 0) {
|
|
743
|
+
if (!ignore_garbage) {
|
|
744
|
+
while (to_base64[uint8_t(*(src - 1))] == 64) {
|
|
745
|
+
src--;
|
|
746
|
+
}
|
|
747
|
+
} else {
|
|
748
|
+
while (to_base64[uint8_t(*(src - 1))] >= 64) {
|
|
749
|
+
src--;
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
src--;
|
|
753
|
+
leftover--;
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
if (src < srcend + equalsigns) {
|
|
757
|
+
full_result r = scalar::base64::base64_tail_decode(
|
|
758
|
+
dst, src, srcend - src, equalsigns, options, last_chunk_options);
|
|
759
|
+
r = scalar::base64::patch_tail_result(
|
|
760
|
+
r, size_t(src - srcinit), size_t(dst - dstinit), equallocation,
|
|
761
|
+
full_input_length, last_chunk_options);
|
|
762
|
+
// When is_partial(last_chunk_options) is true, we must either end with
|
|
763
|
+
// the end of the stream (beyond whitespace) or right after a non-ignorable
|
|
764
|
+
// character or at the very beginning of the stream.
|
|
765
|
+
// See https://tc39.es/proposal-arraybuffer-base64/spec/#sec-frombase64
|
|
766
|
+
if (is_partial(last_chunk_options) && r.error == error_code::SUCCESS &&
|
|
767
|
+
r.input_count < full_input_length) {
|
|
768
|
+
// First check if we can extend the input to the end of the stream
|
|
769
|
+
while (r.input_count < full_input_length &&
|
|
770
|
+
base64_ignorable(*(srcinit + r.input_count), options)) {
|
|
771
|
+
r.input_count++;
|
|
772
|
+
}
|
|
773
|
+
// If we are still not at the end of the stream, then we must backtrack
|
|
774
|
+
// to the last non-ignorable character.
|
|
775
|
+
if (r.input_count < full_input_length) {
|
|
776
|
+
while (r.input_count > 0 &&
|
|
777
|
+
base64_ignorable(*(srcinit + r.input_count - 1), options)) {
|
|
778
|
+
r.input_count--;
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
return r;
|
|
783
|
+
}
|
|
784
|
+
if (equalsigns > 0 && !ignore_garbage) {
|
|
785
|
+
if ((size_t(dst - dstinit) % 3 == 0) ||
|
|
786
|
+
((size_t(dst - dstinit) % 3) + 1 + equalsigns != 4)) {
|
|
787
|
+
return {INVALID_BASE64_CHARACTER, equallocation, size_t(dst - dstinit)};
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
return {SUCCESS, srclen, size_t(dst - dstinit)};
|
|
791
|
+
}
|