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.
Files changed (561) hide show
  1. package/QuickCrypto.podspec +12 -38
  2. package/README.md +2 -0
  3. package/android/CMakeLists.txt +3 -0
  4. package/android/build.gradle +5 -1
  5. package/cpp/argon2/HybridArgon2.cpp +10 -3
  6. package/cpp/blake3/HybridBlake3.cpp +5 -3
  7. package/cpp/cipher/CCMCipher.cpp +29 -16
  8. package/cpp/cipher/CCMCipher.hpp +2 -4
  9. package/cpp/cipher/ChaCha20Cipher.cpp +14 -18
  10. package/cpp/cipher/ChaCha20Cipher.hpp +2 -4
  11. package/cpp/cipher/ChaCha20Poly1305Cipher.cpp +34 -23
  12. package/cpp/cipher/ChaCha20Poly1305Cipher.hpp +2 -4
  13. package/cpp/cipher/GCMCipher.cpp +14 -15
  14. package/cpp/cipher/HybridCipher.cpp +39 -36
  15. package/cpp/cipher/HybridCipher.hpp +17 -1
  16. package/cpp/cipher/HybridRsaCipher.cpp +74 -29
  17. package/cpp/cipher/OCBCipher.cpp +4 -3
  18. package/cpp/cipher/XChaCha20Poly1305Cipher.cpp +14 -13
  19. package/cpp/cipher/XSalsa20Cipher.cpp +72 -6
  20. package/cpp/cipher/XSalsa20Cipher.hpp +25 -3
  21. package/cpp/cipher/XSalsa20Poly1305Cipher.cpp +21 -25
  22. package/cpp/dh/HybridDiffieHellman.cpp +29 -0
  23. package/cpp/ec/HybridEcKeyPair.cpp +35 -33
  24. package/cpp/ec/HybridEcKeyPair.hpp +3 -7
  25. package/cpp/ecdh/HybridECDH.cpp +23 -0
  26. package/cpp/ed25519/HybridEdKeyPair.cpp +73 -117
  27. package/cpp/ed25519/HybridEdKeyPair.hpp +5 -9
  28. package/cpp/hash/HybridHash.cpp +5 -7
  29. package/cpp/hkdf/HybridHkdf.cpp +6 -4
  30. package/cpp/hmac/HybridHmac.cpp +4 -6
  31. package/cpp/kmac/HybridKmac.cpp +4 -4
  32. package/cpp/mldsa/HybridMlDsaKeyPair.cpp +37 -49
  33. package/cpp/mlkem/HybridMlKemKeyPair.cpp +39 -43
  34. package/cpp/pbkdf2/HybridPbkdf2.cpp +7 -8
  35. package/cpp/rsa/HybridRsaKeyPair.cpp +5 -8
  36. package/cpp/rsa/HybridRsaKeyPair.hpp +4 -7
  37. package/cpp/scrypt/HybridScrypt.cpp +6 -4
  38. package/cpp/sign/HybridSignHandle.cpp +25 -68
  39. package/cpp/sign/HybridVerifyHandle.cpp +23 -60
  40. package/cpp/utils/HybridUtils.cpp +213 -111
  41. package/cpp/utils/HybridUtils.hpp +9 -2
  42. package/cpp/utils/QuickCryptoUtils.hpp +72 -0
  43. package/deps/simdutf/LICENSE-APACHE +201 -0
  44. package/deps/simdutf/LICENSE-MIT +18 -0
  45. package/deps/simdutf/README.md +2782 -0
  46. package/deps/simdutf/include/simdutf/avx512.h +79 -0
  47. package/deps/simdutf/include/simdutf/base64_implementation.h +158 -0
  48. package/deps/simdutf/include/simdutf/base64_tables.h +887 -0
  49. package/deps/simdutf/include/simdutf/common_defs.h +186 -0
  50. package/deps/simdutf/include/simdutf/compiler_check.h +50 -0
  51. package/deps/simdutf/include/simdutf/constexpr_ptr.h +138 -0
  52. package/deps/simdutf/include/simdutf/encoding_types.h +189 -0
  53. package/deps/simdutf/include/simdutf/error.h +126 -0
  54. package/deps/simdutf/include/simdutf/implementation.h +7081 -0
  55. package/deps/simdutf/include/simdutf/internal/isadetection.h +325 -0
  56. package/deps/simdutf/include/simdutf/portability.h +285 -0
  57. package/deps/simdutf/include/simdutf/scalar/ascii.h +86 -0
  58. package/deps/simdutf/include/simdutf/scalar/atomic_util.h +105 -0
  59. package/deps/simdutf/include/simdutf/scalar/base64.h +911 -0
  60. package/deps/simdutf/include/simdutf/scalar/latin1.h +26 -0
  61. package/deps/simdutf/include/simdutf/scalar/latin1_to_utf16/latin1_to_utf16.h +52 -0
  62. package/deps/simdutf/include/simdutf/scalar/latin1_to_utf32/latin1_to_utf32.h +27 -0
  63. package/deps/simdutf/include/simdutf/scalar/latin1_to_utf8/latin1_to_utf8.h +191 -0
  64. package/deps/simdutf/include/simdutf/scalar/swap_bytes.h +35 -0
  65. package/deps/simdutf/include/simdutf/scalar/utf16.h +226 -0
  66. package/deps/simdutf/include/simdutf/scalar/utf16_to_latin1/utf16_to_latin1.h +108 -0
  67. package/deps/simdutf/include/simdutf/scalar/utf16_to_latin1/valid_utf16_to_latin1.h +40 -0
  68. package/deps/simdutf/include/simdutf/scalar/utf16_to_utf32/utf16_to_utf32.h +86 -0
  69. package/deps/simdutf/include/simdutf/scalar/utf16_to_utf32/valid_utf16_to_utf32.h +44 -0
  70. package/deps/simdutf/include/simdutf/scalar/utf16_to_utf8/utf16_to_utf8.h +295 -0
  71. package/deps/simdutf/include/simdutf/scalar/utf16_to_utf8/valid_utf16_to_utf8.h +91 -0
  72. package/deps/simdutf/include/simdutf/scalar/utf32.h +82 -0
  73. package/deps/simdutf/include/simdutf/scalar/utf32_to_latin1/utf32_to_latin1.h +68 -0
  74. package/deps/simdutf/include/simdutf/scalar/utf32_to_latin1/valid_utf32_to_latin1.h +67 -0
  75. package/deps/simdutf/include/simdutf/scalar/utf32_to_utf16/utf32_to_utf16.h +84 -0
  76. package/deps/simdutf/include/simdutf/scalar/utf32_to_utf16/valid_utf32_to_utf16.h +44 -0
  77. package/deps/simdutf/include/simdutf/scalar/utf32_to_utf8/utf32_to_utf8.h +142 -0
  78. package/deps/simdutf/include/simdutf/scalar/utf32_to_utf8/valid_utf32_to_utf8.h +72 -0
  79. package/deps/simdutf/include/simdutf/scalar/utf8.h +326 -0
  80. package/deps/simdutf/include/simdutf/scalar/utf8_to_latin1/utf8_to_latin1.h +225 -0
  81. package/deps/simdutf/include/simdutf/scalar/utf8_to_latin1/valid_utf8_to_latin1.h +87 -0
  82. package/deps/simdutf/include/simdutf/scalar/utf8_to_utf16/utf8_to_utf16.h +342 -0
  83. package/deps/simdutf/include/simdutf/scalar/utf8_to_utf16/valid_utf8_to_utf16.h +106 -0
  84. package/deps/simdutf/include/simdutf/scalar/utf8_to_utf32/utf8_to_utf32.h +299 -0
  85. package/deps/simdutf/include/simdutf/scalar/utf8_to_utf32/valid_utf8_to_utf32.h +83 -0
  86. package/deps/simdutf/include/simdutf/simdutf_version.h +26 -0
  87. package/deps/simdutf/include/simdutf.h +26 -0
  88. package/deps/simdutf/include/simdutf_c.h +342 -0
  89. package/deps/simdutf/src/arm64/arm_base64.cpp +791 -0
  90. package/deps/simdutf/src/arm64/arm_convert_latin1_to_utf16.cpp +24 -0
  91. package/deps/simdutf/src/arm64/arm_convert_latin1_to_utf32.cpp +24 -0
  92. package/deps/simdutf/src/arm64/arm_convert_latin1_to_utf8.cpp +70 -0
  93. package/deps/simdutf/src/arm64/arm_convert_utf16_to_latin1.cpp +61 -0
  94. package/deps/simdutf/src/arm64/arm_convert_utf16_to_utf32.cpp +185 -0
  95. package/deps/simdutf/src/arm64/arm_convert_utf16_to_utf8.cpp +780 -0
  96. package/deps/simdutf/src/arm64/arm_convert_utf32_to_latin1.cpp +60 -0
  97. package/deps/simdutf/src/arm64/arm_convert_utf32_to_utf16.cpp +208 -0
  98. package/deps/simdutf/src/arm64/arm_convert_utf32_to_utf8.cpp +505 -0
  99. package/deps/simdutf/src/arm64/arm_convert_utf8_to_latin1.cpp +69 -0
  100. package/deps/simdutf/src/arm64/arm_convert_utf8_to_utf16.cpp +313 -0
  101. package/deps/simdutf/src/arm64/arm_convert_utf8_to_utf32.cpp +179 -0
  102. package/deps/simdutf/src/arm64/arm_find.cpp +199 -0
  103. package/deps/simdutf/src/arm64/arm_utf16fix.cpp +185 -0
  104. package/deps/simdutf/src/arm64/arm_validate_utf16.cpp +165 -0
  105. package/deps/simdutf/src/arm64/arm_validate_utf32le.cpp +65 -0
  106. package/deps/simdutf/src/arm64/implementation.cpp +1442 -0
  107. package/deps/simdutf/src/encoding_types.cpp +67 -0
  108. package/deps/simdutf/src/error.cpp +3 -0
  109. package/deps/simdutf/src/fallback/implementation.cpp +589 -0
  110. package/deps/simdutf/src/generic/ascii_validation.h +50 -0
  111. package/deps/simdutf/src/generic/base64.h +233 -0
  112. package/deps/simdutf/src/generic/base64lengths.h +63 -0
  113. package/deps/simdutf/src/generic/buf_block_reader.h +109 -0
  114. package/deps/simdutf/src/generic/find.h +75 -0
  115. package/deps/simdutf/src/generic/utf16/change_endianness.h +24 -0
  116. package/deps/simdutf/src/generic/utf16/count_code_points_bytemask.h +58 -0
  117. package/deps/simdutf/src/generic/utf16/to_well_formed.h +93 -0
  118. package/deps/simdutf/src/generic/utf16/utf32_length_from_utf16.h +15 -0
  119. package/deps/simdutf/src/generic/utf16/utf8_length_from_utf16.h +35 -0
  120. package/deps/simdutf/src/generic/utf16/utf8_length_from_utf16_bytemask.h +199 -0
  121. package/deps/simdutf/src/generic/utf16.h +73 -0
  122. package/deps/simdutf/src/generic/utf32.h +136 -0
  123. package/deps/simdutf/src/generic/utf8/utf16_length_from_utf8_bytemask.h +53 -0
  124. package/deps/simdutf/src/generic/utf8.h +92 -0
  125. package/deps/simdutf/src/generic/utf8_to_latin1/utf8_to_latin1.h +316 -0
  126. package/deps/simdutf/src/generic/utf8_to_latin1/valid_utf8_to_latin1.h +78 -0
  127. package/deps/simdutf/src/generic/utf8_to_utf16/utf8_to_utf16.h +332 -0
  128. package/deps/simdutf/src/generic/utf8_to_utf16/valid_utf8_to_utf16.h +74 -0
  129. package/deps/simdutf/src/generic/utf8_to_utf32/utf8_to_utf32.h +318 -0
  130. package/deps/simdutf/src/generic/utf8_to_utf32/valid_utf8_to_utf32.h +42 -0
  131. package/deps/simdutf/src/generic/utf8_validation/utf8_lookup4_algorithm.h +223 -0
  132. package/deps/simdutf/src/generic/utf8_validation/utf8_validator.h +84 -0
  133. package/deps/simdutf/src/generic/validate_utf16.h +164 -0
  134. package/deps/simdutf/src/generic/validate_utf32.h +99 -0
  135. package/deps/simdutf/src/haswell/avx2_base64.cpp +837 -0
  136. package/deps/simdutf/src/haswell/avx2_convert_latin1_to_utf16.cpp +28 -0
  137. package/deps/simdutf/src/haswell/avx2_convert_latin1_to_utf32.cpp +20 -0
  138. package/deps/simdutf/src/haswell/avx2_convert_latin1_to_utf8.cpp +83 -0
  139. package/deps/simdutf/src/haswell/avx2_convert_utf16_to_latin1.cpp +83 -0
  140. package/deps/simdutf/src/haswell/avx2_convert_utf16_to_utf32.cpp +210 -0
  141. package/deps/simdutf/src/haswell/avx2_convert_utf16_to_utf8.cpp +602 -0
  142. package/deps/simdutf/src/haswell/avx2_convert_utf32_to_latin1.cpp +116 -0
  143. package/deps/simdutf/src/haswell/avx2_convert_utf32_to_utf16.cpp +164 -0
  144. package/deps/simdutf/src/haswell/avx2_convert_utf32_to_utf8.cpp +569 -0
  145. package/deps/simdutf/src/haswell/avx2_convert_utf8_to_latin1.cpp +60 -0
  146. package/deps/simdutf/src/haswell/avx2_convert_utf8_to_utf16.cpp +195 -0
  147. package/deps/simdutf/src/haswell/avx2_convert_utf8_to_utf32.cpp +135 -0
  148. package/deps/simdutf/src/haswell/avx2_utf16fix.cpp +173 -0
  149. package/deps/simdutf/src/haswell/avx2_validate_utf16.cpp +17 -0
  150. package/deps/simdutf/src/haswell/implementation.cpp +1447 -0
  151. package/deps/simdutf/src/icelake/icelake_ascii_validation.inl.cpp +19 -0
  152. package/deps/simdutf/src/icelake/icelake_base64.inl.cpp +630 -0
  153. package/deps/simdutf/src/icelake/icelake_common.inl.cpp +37 -0
  154. package/deps/simdutf/src/icelake/icelake_convert_latin1_to_utf16.inl.cpp +36 -0
  155. package/deps/simdutf/src/icelake/icelake_convert_latin1_to_utf32.inl.cpp +23 -0
  156. package/deps/simdutf/src/icelake/icelake_convert_latin1_to_utf8.inl.cpp +107 -0
  157. package/deps/simdutf/src/icelake/icelake_convert_utf16_to_latin1.inl.cpp +103 -0
  158. package/deps/simdutf/src/icelake/icelake_convert_utf16_to_utf32.inl.cpp +136 -0
  159. package/deps/simdutf/src/icelake/icelake_convert_utf16_to_utf8.inl.cpp +206 -0
  160. package/deps/simdutf/src/icelake/icelake_convert_utf32_to_latin1.inl.cpp +74 -0
  161. package/deps/simdutf/src/icelake/icelake_convert_utf32_to_utf16.inl.cpp +338 -0
  162. package/deps/simdutf/src/icelake/icelake_convert_utf32_to_utf8.inl.cpp +574 -0
  163. package/deps/simdutf/src/icelake/icelake_convert_utf8_to_latin1.inl.cpp +104 -0
  164. package/deps/simdutf/src/icelake/icelake_convert_utf8_to_utf16.inl.cpp +75 -0
  165. package/deps/simdutf/src/icelake/icelake_convert_valid_utf8_to_latin1.inl.cpp +69 -0
  166. package/deps/simdutf/src/icelake/icelake_find.inl.cpp +146 -0
  167. package/deps/simdutf/src/icelake/icelake_from_utf8.inl.cpp +266 -0
  168. package/deps/simdutf/src/icelake/icelake_from_valid_utf8.inl.cpp +136 -0
  169. package/deps/simdutf/src/icelake/icelake_macros.inl.cpp +143 -0
  170. package/deps/simdutf/src/icelake/icelake_utf16fix.cpp +138 -0
  171. package/deps/simdutf/src/icelake/icelake_utf32_validation.inl.cpp +63 -0
  172. package/deps/simdutf/src/icelake/icelake_utf8_common.inl.cpp +753 -0
  173. package/deps/simdutf/src/icelake/icelake_utf8_length_from_utf16.inl.cpp +269 -0
  174. package/deps/simdutf/src/icelake/icelake_utf8_validation.inl.cpp +116 -0
  175. package/deps/simdutf/src/icelake/implementation.cpp +1903 -0
  176. package/deps/simdutf/src/implementation.cpp +2526 -0
  177. package/deps/simdutf/src/lasx/implementation.cpp +1531 -0
  178. package/deps/simdutf/src/lasx/lasx_base64.cpp +695 -0
  179. package/deps/simdutf/src/lasx/lasx_convert_latin1_to_utf16.cpp +76 -0
  180. package/deps/simdutf/src/lasx/lasx_convert_latin1_to_utf32.cpp +55 -0
  181. package/deps/simdutf/src/lasx/lasx_convert_latin1_to_utf8.cpp +65 -0
  182. package/deps/simdutf/src/lasx/lasx_convert_utf16_to_latin1.cpp +64 -0
  183. package/deps/simdutf/src/lasx/lasx_convert_utf16_to_utf32.cpp +183 -0
  184. package/deps/simdutf/src/lasx/lasx_convert_utf16_to_utf8.cpp +550 -0
  185. package/deps/simdutf/src/lasx/lasx_convert_utf32_to_latin1.cpp +73 -0
  186. package/deps/simdutf/src/lasx/lasx_convert_utf32_to_utf16.cpp +218 -0
  187. package/deps/simdutf/src/lasx/lasx_convert_utf32_to_utf8.cpp +589 -0
  188. package/deps/simdutf/src/lasx/lasx_convert_utf8_to_latin1.cpp +72 -0
  189. package/deps/simdutf/src/lasx/lasx_convert_utf8_to_utf16.cpp +296 -0
  190. package/deps/simdutf/src/lasx/lasx_convert_utf8_to_utf32.cpp +190 -0
  191. package/deps/simdutf/src/lasx/lasx_find.cpp +64 -0
  192. package/deps/simdutf/src/lasx/lasx_validate_utf16.cpp +13 -0
  193. package/deps/simdutf/src/lasx/lasx_validate_utf32le.cpp +84 -0
  194. package/deps/simdutf/src/lsx/implementation.cpp +1417 -0
  195. package/deps/simdutf/src/lsx/lsx_base64.cpp +675 -0
  196. package/deps/simdutf/src/lsx/lsx_convert_latin1_to_utf16.cpp +39 -0
  197. package/deps/simdutf/src/lsx/lsx_convert_latin1_to_utf32.cpp +27 -0
  198. package/deps/simdutf/src/lsx/lsx_convert_latin1_to_utf8.cpp +56 -0
  199. package/deps/simdutf/src/lsx/lsx_convert_utf16_to_latin1.cpp +64 -0
  200. package/deps/simdutf/src/lsx/lsx_convert_utf16_to_utf32.cpp +133 -0
  201. package/deps/simdutf/src/lsx/lsx_convert_utf16_to_utf8.cpp +518 -0
  202. package/deps/simdutf/src/lsx/lsx_convert_utf32_to_latin1.cpp +66 -0
  203. package/deps/simdutf/src/lsx/lsx_convert_utf32_to_utf16.cpp +155 -0
  204. package/deps/simdutf/src/lsx/lsx_convert_utf32_to_utf8.cpp +459 -0
  205. package/deps/simdutf/src/lsx/lsx_convert_utf8_to_latin1.cpp +75 -0
  206. package/deps/simdutf/src/lsx/lsx_convert_utf8_to_utf16.cpp +291 -0
  207. package/deps/simdutf/src/lsx/lsx_convert_utf8_to_utf32.cpp +179 -0
  208. package/deps/simdutf/src/lsx/lsx_find.cpp +60 -0
  209. package/deps/simdutf/src/lsx/lsx_validate_utf16.cpp +13 -0
  210. package/deps/simdutf/src/lsx/lsx_validate_utf32le.cpp +68 -0
  211. package/deps/simdutf/src/ppc64/implementation.cpp +992 -0
  212. package/deps/simdutf/src/ppc64/ppc64_base64.cpp +480 -0
  213. package/deps/simdutf/src/ppc64/ppc64_base64_internal_tests.cpp +401 -0
  214. package/deps/simdutf/src/ppc64/ppc64_convert_latin1_to_utf16.cpp +12 -0
  215. package/deps/simdutf/src/ppc64/ppc64_convert_latin1_to_utf32.cpp +12 -0
  216. package/deps/simdutf/src/ppc64/ppc64_convert_latin1_to_utf8.cpp +149 -0
  217. package/deps/simdutf/src/ppc64/ppc64_convert_utf16_to_latin1.cpp +67 -0
  218. package/deps/simdutf/src/ppc64/ppc64_convert_utf16_to_utf32.cpp +87 -0
  219. package/deps/simdutf/src/ppc64/ppc64_convert_utf16_to_utf8.cpp +296 -0
  220. package/deps/simdutf/src/ppc64/ppc64_convert_utf32_to_latin1.cpp +57 -0
  221. package/deps/simdutf/src/ppc64/ppc64_convert_utf32_to_utf16.cpp +117 -0
  222. package/deps/simdutf/src/ppc64/ppc64_convert_utf32_to_utf8.cpp +166 -0
  223. package/deps/simdutf/src/ppc64/ppc64_convert_utf8_to_latin1.cpp +69 -0
  224. package/deps/simdutf/src/ppc64/ppc64_convert_utf8_to_utf16.cpp +211 -0
  225. package/deps/simdutf/src/ppc64/ppc64_convert_utf8_to_utf32.cpp +153 -0
  226. package/deps/simdutf/src/ppc64/ppc64_utf16_to_utf8_tables.h +1011 -0
  227. package/deps/simdutf/src/ppc64/ppc64_utf8_length_from_latin1.cpp +37 -0
  228. package/deps/simdutf/src/ppc64/ppc64_validate_utf16.cpp +19 -0
  229. package/deps/simdutf/src/ppc64/templates.cpp +91 -0
  230. package/deps/simdutf/src/rvv/implementation.cpp +138 -0
  231. package/deps/simdutf/src/rvv/rvv_find.cpp +27 -0
  232. package/deps/simdutf/src/rvv/rvv_helpers.inl.cpp +23 -0
  233. package/deps/simdutf/src/rvv/rvv_latin1_to.inl.cpp +71 -0
  234. package/deps/simdutf/src/rvv/rvv_length_from.inl.cpp +164 -0
  235. package/deps/simdutf/src/rvv/rvv_utf16_to.inl.cpp +399 -0
  236. package/deps/simdutf/src/rvv/rvv_utf16fix.cpp +110 -0
  237. package/deps/simdutf/src/rvv/rvv_utf32_to.inl.cpp +307 -0
  238. package/deps/simdutf/src/rvv/rvv_utf8_to.inl.cpp +435 -0
  239. package/deps/simdutf/src/rvv/rvv_validate.inl.cpp +275 -0
  240. package/deps/simdutf/src/simdutf/arm64/begin.h +2 -0
  241. package/deps/simdutf/src/simdutf/arm64/bitmanipulation.h +34 -0
  242. package/deps/simdutf/src/simdutf/arm64/end.h +2 -0
  243. package/deps/simdutf/src/simdutf/arm64/implementation.h +307 -0
  244. package/deps/simdutf/src/simdutf/arm64/intrinsics.h +10 -0
  245. package/deps/simdutf/src/simdutf/arm64/simd.h +547 -0
  246. package/deps/simdutf/src/simdutf/arm64/simd16-inl.h +403 -0
  247. package/deps/simdutf/src/simdutf/arm64/simd32-inl.h +129 -0
  248. package/deps/simdutf/src/simdutf/arm64/simd64-inl.h +28 -0
  249. package/deps/simdutf/src/simdutf/arm64.h +43 -0
  250. package/deps/simdutf/src/simdutf/fallback/begin.h +1 -0
  251. package/deps/simdutf/src/simdutf/fallback/bitmanipulation.h +13 -0
  252. package/deps/simdutf/src/simdutf/fallback/end.h +1 -0
  253. package/deps/simdutf/src/simdutf/fallback/implementation.h +331 -0
  254. package/deps/simdutf/src/simdutf/fallback.h +42 -0
  255. package/deps/simdutf/src/simdutf/haswell/begin.h +15 -0
  256. package/deps/simdutf/src/simdutf/haswell/bitmanipulation.h +35 -0
  257. package/deps/simdutf/src/simdutf/haswell/end.h +13 -0
  258. package/deps/simdutf/src/simdutf/haswell/implementation.h +338 -0
  259. package/deps/simdutf/src/simdutf/haswell/intrinsics.h +67 -0
  260. package/deps/simdutf/src/simdutf/haswell/simd.h +363 -0
  261. package/deps/simdutf/src/simdutf/haswell/simd16-inl.h +261 -0
  262. package/deps/simdutf/src/simdutf/haswell/simd32-inl.h +111 -0
  263. package/deps/simdutf/src/simdutf/haswell/simd64-inl.h +34 -0
  264. package/deps/simdutf/src/simdutf/haswell.h +63 -0
  265. package/deps/simdutf/src/simdutf/icelake/begin.h +14 -0
  266. package/deps/simdutf/src/simdutf/icelake/bitmanipulation.h +44 -0
  267. package/deps/simdutf/src/simdutf/icelake/end.h +12 -0
  268. package/deps/simdutf/src/simdutf/icelake/implementation.h +346 -0
  269. package/deps/simdutf/src/simdutf/icelake/intrinsics.h +138 -0
  270. package/deps/simdutf/src/simdutf/icelake/simd.h +17 -0
  271. package/deps/simdutf/src/simdutf/icelake/simd16-inl.h +90 -0
  272. package/deps/simdutf/src/simdutf/icelake/simd32-inl.h +47 -0
  273. package/deps/simdutf/src/simdutf/icelake.h +81 -0
  274. package/deps/simdutf/src/simdutf/lasx/begin.h +8 -0
  275. package/deps/simdutf/src/simdutf/lasx/bitmanipulation.h +25 -0
  276. package/deps/simdutf/src/simdutf/lasx/end.h +8 -0
  277. package/deps/simdutf/src/simdutf/lasx/implementation.h +310 -0
  278. package/deps/simdutf/src/simdutf/lasx/intrinsics.h +319 -0
  279. package/deps/simdutf/src/simdutf/lasx/simd.h +551 -0
  280. package/deps/simdutf/src/simdutf/lasx/simd16-inl.h +234 -0
  281. package/deps/simdutf/src/simdutf/lasx/simd32-inl.h +74 -0
  282. package/deps/simdutf/src/simdutf/lasx/simd64-inl.h +52 -0
  283. package/deps/simdutf/src/simdutf/lasx.h +49 -0
  284. package/deps/simdutf/src/simdutf/lsx/begin.h +2 -0
  285. package/deps/simdutf/src/simdutf/lsx/bitmanipulation.h +25 -0
  286. package/deps/simdutf/src/simdutf/lsx/end.h +2 -0
  287. package/deps/simdutf/src/simdutf/lsx/implementation.h +309 -0
  288. package/deps/simdutf/src/simdutf/lsx/intrinsics.h +196 -0
  289. package/deps/simdutf/src/simdutf/lsx/simd.h +421 -0
  290. package/deps/simdutf/src/simdutf/lsx/simd16-inl.h +242 -0
  291. package/deps/simdutf/src/simdutf/lsx/simd32-inl.h +69 -0
  292. package/deps/simdutf/src/simdutf/lsx/simd64-inl.h +50 -0
  293. package/deps/simdutf/src/simdutf/lsx.h +52 -0
  294. package/deps/simdutf/src/simdutf/ppc64/begin.h +1 -0
  295. package/deps/simdutf/src/simdutf/ppc64/bitmanipulation.h +29 -0
  296. package/deps/simdutf/src/simdutf/ppc64/end.h +1 -0
  297. package/deps/simdutf/src/simdutf/ppc64/implementation.h +348 -0
  298. package/deps/simdutf/src/simdutf/ppc64/intrinsics.h +19 -0
  299. package/deps/simdutf/src/simdutf/ppc64/simd.h +177 -0
  300. package/deps/simdutf/src/simdutf/ppc64/simd16-inl.h +327 -0
  301. package/deps/simdutf/src/simdutf/ppc64/simd32-inl.h +247 -0
  302. package/deps/simdutf/src/simdutf/ppc64/simd8-inl.h +618 -0
  303. package/deps/simdutf/src/simdutf/ppc64.h +40 -0
  304. package/deps/simdutf/src/simdutf/rvv/begin.h +7 -0
  305. package/deps/simdutf/src/simdutf/rvv/end.h +7 -0
  306. package/deps/simdutf/src/simdutf/rvv/implementation.h +321 -0
  307. package/deps/simdutf/src/simdutf/rvv/intrinsics.h +131 -0
  308. package/deps/simdutf/src/simdutf/rvv.h +41 -0
  309. package/deps/simdutf/src/simdutf/westmere/begin.h +8 -0
  310. package/deps/simdutf/src/simdutf/westmere/bitmanipulation.h +37 -0
  311. package/deps/simdutf/src/simdutf/westmere/end.h +8 -0
  312. package/deps/simdutf/src/simdutf/westmere/implementation.h +338 -0
  313. package/deps/simdutf/src/simdutf/westmere/intrinsics.h +38 -0
  314. package/deps/simdutf/src/simdutf/westmere/simd.h +379 -0
  315. package/deps/simdutf/src/simdutf/westmere/simd16-inl.h +242 -0
  316. package/deps/simdutf/src/simdutf/westmere/simd32-inl.h +151 -0
  317. package/deps/simdutf/src/simdutf/westmere/simd64-inl.h +33 -0
  318. package/deps/simdutf/src/simdutf/westmere.h +59 -0
  319. package/deps/simdutf/src/simdutf.cpp +152 -0
  320. package/deps/simdutf/src/simdutf_c.cpp +525 -0
  321. package/deps/simdutf/src/tables/utf16_to_utf8_tables.h +768 -0
  322. package/deps/simdutf/src/tables/utf32_to_utf16_tables.h +53 -0
  323. package/deps/simdutf/src/tables/utf8_to_utf16_tables.h +826 -0
  324. package/deps/simdutf/src/westmere/implementation.cpp +1479 -0
  325. package/deps/simdutf/src/westmere/internal/loader.cpp +7 -0
  326. package/deps/simdutf/src/westmere/internal/write_v_u16_11bits_to_utf8.cpp +66 -0
  327. package/deps/simdutf/src/westmere/sse_base64.cpp +672 -0
  328. package/deps/simdutf/src/westmere/sse_convert_latin1_to_utf16.cpp +21 -0
  329. package/deps/simdutf/src/westmere/sse_convert_latin1_to_utf32.cpp +31 -0
  330. package/deps/simdutf/src/westmere/sse_convert_latin1_to_utf8.cpp +71 -0
  331. package/deps/simdutf/src/westmere/sse_convert_utf16_to_latin1.cpp +70 -0
  332. package/deps/simdutf/src/westmere/sse_convert_utf16_to_utf32.cpp +206 -0
  333. package/deps/simdutf/src/westmere/sse_convert_utf16_to_utf8.cpp +504 -0
  334. package/deps/simdutf/src/westmere/sse_convert_utf32_to_latin1.cpp +82 -0
  335. package/deps/simdutf/src/westmere/sse_convert_utf32_to_utf16.cpp +209 -0
  336. package/deps/simdutf/src/westmere/sse_convert_utf32_to_utf8.cpp +589 -0
  337. package/deps/simdutf/src/westmere/sse_convert_utf8_to_latin1.cpp +58 -0
  338. package/deps/simdutf/src/westmere/sse_convert_utf8_to_utf16.cpp +197 -0
  339. package/deps/simdutf/src/westmere/sse_convert_utf8_to_utf32.cpp +141 -0
  340. package/deps/simdutf/src/westmere/sse_utf16fix.cpp +82 -0
  341. package/deps/simdutf/src/westmere/sse_validate_utf16.cpp +17 -0
  342. package/lib/commonjs/argon2.js +51 -2
  343. package/lib/commonjs/argon2.js.map +1 -1
  344. package/lib/commonjs/cipher.js +109 -11
  345. package/lib/commonjs/cipher.js.map +1 -1
  346. package/lib/commonjs/dsa.js +8 -2
  347. package/lib/commonjs/dsa.js.map +1 -1
  348. package/lib/commonjs/hash.js +15 -5
  349. package/lib/commonjs/hash.js.map +1 -1
  350. package/lib/commonjs/hkdf.js +33 -6
  351. package/lib/commonjs/hkdf.js.map +1 -1
  352. package/lib/commonjs/hmac.js +15 -5
  353. package/lib/commonjs/hmac.js.map +1 -1
  354. package/lib/commonjs/keys/publicCipher.js +10 -4
  355. package/lib/commonjs/keys/publicCipher.js.map +1 -1
  356. package/lib/commonjs/random.js +11 -2
  357. package/lib/commonjs/random.js.map +1 -1
  358. package/lib/commonjs/rsa.js +12 -5
  359. package/lib/commonjs/rsa.js.map +1 -1
  360. package/lib/commonjs/scrypt.js +47 -6
  361. package/lib/commonjs/scrypt.js.map +1 -1
  362. package/lib/commonjs/subtle.js +76 -5
  363. package/lib/commonjs/subtle.js.map +1 -1
  364. package/lib/commonjs/utils/cipher.js +18 -7
  365. package/lib/commonjs/utils/cipher.js.map +1 -1
  366. package/lib/commonjs/utils/conversion.js +33 -9
  367. package/lib/commonjs/utils/conversion.js.map +1 -1
  368. package/lib/commonjs/utils/timingSafeEqual.js +7 -2
  369. package/lib/commonjs/utils/timingSafeEqual.js.map +1 -1
  370. package/lib/commonjs/x509certificate.js +6 -6
  371. package/lib/commonjs/x509certificate.js.map +1 -1
  372. package/lib/module/argon2.js +51 -2
  373. package/lib/module/argon2.js.map +1 -1
  374. package/lib/module/cipher.js +109 -11
  375. package/lib/module/cipher.js.map +1 -1
  376. package/lib/module/dsa.js +8 -2
  377. package/lib/module/dsa.js.map +1 -1
  378. package/lib/module/hash.js +15 -5
  379. package/lib/module/hash.js.map +1 -1
  380. package/lib/module/hkdf.js +33 -6
  381. package/lib/module/hkdf.js.map +1 -1
  382. package/lib/module/hmac.js +15 -5
  383. package/lib/module/hmac.js.map +1 -1
  384. package/lib/module/keys/publicCipher.js +10 -4
  385. package/lib/module/keys/publicCipher.js.map +1 -1
  386. package/lib/module/random.js +11 -2
  387. package/lib/module/random.js.map +1 -1
  388. package/lib/module/rsa.js +11 -4
  389. package/lib/module/rsa.js.map +1 -1
  390. package/lib/module/scrypt.js +47 -6
  391. package/lib/module/scrypt.js.map +1 -1
  392. package/lib/module/subtle.js +76 -5
  393. package/lib/module/subtle.js.map +1 -1
  394. package/lib/module/utils/cipher.js +18 -7
  395. package/lib/module/utils/cipher.js.map +1 -1
  396. package/lib/module/utils/conversion.js +33 -9
  397. package/lib/module/utils/conversion.js.map +1 -1
  398. package/lib/module/utils/timingSafeEqual.js +8 -3
  399. package/lib/module/utils/timingSafeEqual.js.map +1 -1
  400. package/lib/module/x509certificate.js +6 -6
  401. package/lib/module/x509certificate.js.map +1 -1
  402. package/lib/typescript/argon2.d.ts.map +1 -1
  403. package/lib/typescript/cipher.d.ts +2 -2
  404. package/lib/typescript/cipher.d.ts.map +1 -1
  405. package/lib/typescript/dsa.d.ts.map +1 -1
  406. package/lib/typescript/hash.d.ts +2 -2
  407. package/lib/typescript/hash.d.ts.map +1 -1
  408. package/lib/typescript/hkdf.d.ts.map +1 -1
  409. package/lib/typescript/hmac.d.ts +2 -2
  410. package/lib/typescript/hmac.d.ts.map +1 -1
  411. package/lib/typescript/index.d.ts +1 -1
  412. package/lib/typescript/index.d.ts.map +1 -1
  413. package/lib/typescript/keys/publicCipher.d.ts.map +1 -1
  414. package/lib/typescript/random.d.ts.map +1 -1
  415. package/lib/typescript/rsa.d.ts.map +1 -1
  416. package/lib/typescript/scrypt.d.ts.map +1 -1
  417. package/lib/typescript/specs/utils.nitro.d.ts +0 -2
  418. package/lib/typescript/specs/utils.nitro.d.ts.map +1 -1
  419. package/lib/typescript/subtle.d.ts.map +1 -1
  420. package/lib/typescript/utils/cipher.d.ts +13 -1
  421. package/lib/typescript/utils/cipher.d.ts.map +1 -1
  422. package/lib/typescript/utils/conversion.d.ts +9 -6
  423. package/lib/typescript/utils/conversion.d.ts.map +1 -1
  424. package/lib/typescript/utils/timingSafeEqual.d.ts.map +1 -1
  425. package/lib/typescript/x509certificate.d.ts.map +1 -1
  426. package/nitrogen/generated/shared/c++/HybridUtilsSpec.cpp +0 -2
  427. package/nitrogen/generated/shared/c++/HybridUtilsSpec.hpp +0 -3
  428. package/package.json +38 -6
  429. package/src/argon2.ts +80 -2
  430. package/src/cipher.ts +139 -15
  431. package/src/dsa.ts +11 -2
  432. package/src/hash.ts +17 -7
  433. package/src/hkdf.ts +44 -6
  434. package/src/hmac.ts +17 -7
  435. package/src/keys/publicCipher.ts +10 -4
  436. package/src/random.ts +11 -2
  437. package/src/rsa.ts +18 -4
  438. package/src/scrypt.ts +73 -6
  439. package/src/specs/utils.nitro.ts +0 -2
  440. package/src/subtle.ts +90 -8
  441. package/src/utils/cipher.ts +30 -8
  442. package/src/utils/conversion.ts +58 -20
  443. package/src/utils/timingSafeEqual.ts +8 -3
  444. package/src/x509certificate.ts +5 -6
  445. package/deps/blake3/.cargo/config.toml +0 -2
  446. package/deps/blake3/.git-blame-ignore-revs +0 -2
  447. package/deps/blake3/.github/workflows/build_b3sum.py +0 -38
  448. package/deps/blake3/.github/workflows/ci.yml +0 -491
  449. package/deps/blake3/.github/workflows/tag.yml +0 -43
  450. package/deps/blake3/.github/workflows/upload_github_release_asset.py +0 -73
  451. package/deps/blake3/CONTRIBUTING.md +0 -31
  452. package/deps/blake3/Cargo.toml +0 -135
  453. package/deps/blake3/b3sum/Cargo.lock +0 -513
  454. package/deps/blake3/b3sum/Cargo.toml +0 -26
  455. package/deps/blake3/b3sum/README.md +0 -72
  456. package/deps/blake3/b3sum/src/main.rs +0 -564
  457. package/deps/blake3/b3sum/src/unit_tests.rs +0 -235
  458. package/deps/blake3/b3sum/tests/cli_tests.rs +0 -680
  459. package/deps/blake3/b3sum/what_does_check_do.md +0 -176
  460. package/deps/blake3/benches/bench.rs +0 -623
  461. package/deps/blake3/build.rs +0 -389
  462. package/deps/blake3/c/CMakeLists.txt +0 -383
  463. package/deps/blake3/c/CMakePresets.json +0 -73
  464. package/deps/blake3/c/Makefile.testing +0 -82
  465. package/deps/blake3/c/blake3-config.cmake.in +0 -14
  466. package/deps/blake3/c/blake3_avx2.c +0 -326
  467. package/deps/blake3/c/blake3_avx2_x86-64_unix.S +0 -1815
  468. package/deps/blake3/c/blake3_avx2_x86-64_windows_gnu.S +0 -1817
  469. package/deps/blake3/c/blake3_avx2_x86-64_windows_msvc.asm +0 -1828
  470. package/deps/blake3/c/blake3_avx512.c +0 -1388
  471. package/deps/blake3/c/blake3_avx512_x86-64_unix.S +0 -4824
  472. package/deps/blake3/c/blake3_avx512_x86-64_windows_gnu.S +0 -2615
  473. package/deps/blake3/c/blake3_avx512_x86-64_windows_msvc.asm +0 -2634
  474. package/deps/blake3/c/blake3_c_rust_bindings/Cargo.toml +0 -32
  475. package/deps/blake3/c/blake3_c_rust_bindings/README.md +0 -4
  476. package/deps/blake3/c/blake3_c_rust_bindings/benches/bench.rs +0 -477
  477. package/deps/blake3/c/blake3_c_rust_bindings/build.rs +0 -253
  478. package/deps/blake3/c/blake3_c_rust_bindings/cross_test.sh +0 -31
  479. package/deps/blake3/c/blake3_c_rust_bindings/src/lib.rs +0 -333
  480. package/deps/blake3/c/blake3_c_rust_bindings/src/test.rs +0 -696
  481. package/deps/blake3/c/blake3_sse2.c +0 -566
  482. package/deps/blake3/c/blake3_sse2_x86-64_unix.S +0 -2291
  483. package/deps/blake3/c/blake3_sse2_x86-64_windows_gnu.S +0 -2332
  484. package/deps/blake3/c/blake3_sse2_x86-64_windows_msvc.asm +0 -2350
  485. package/deps/blake3/c/blake3_sse41.c +0 -560
  486. package/deps/blake3/c/blake3_sse41_x86-64_unix.S +0 -2028
  487. package/deps/blake3/c/blake3_sse41_x86-64_windows_gnu.S +0 -2069
  488. package/deps/blake3/c/blake3_sse41_x86-64_windows_msvc.asm +0 -2089
  489. package/deps/blake3/c/blake3_tbb.cpp +0 -37
  490. package/deps/blake3/c/dependencies/CMakeLists.txt +0 -3
  491. package/deps/blake3/c/dependencies/tbb/CMakeLists.txt +0 -28
  492. package/deps/blake3/c/example.c +0 -36
  493. package/deps/blake3/c/example_tbb.c +0 -57
  494. package/deps/blake3/c/libblake3.pc.in +0 -12
  495. package/deps/blake3/c/main.c +0 -166
  496. package/deps/blake3/c/test.py +0 -97
  497. package/deps/blake3/media/B3.svg +0 -70
  498. package/deps/blake3/media/BLAKE3.svg +0 -85
  499. package/deps/blake3/media/speed.svg +0 -1474
  500. package/deps/blake3/reference_impl/Cargo.toml +0 -8
  501. package/deps/blake3/reference_impl/README.md +0 -14
  502. package/deps/blake3/reference_impl/reference_impl.rs +0 -374
  503. package/deps/blake3/src/ffi_avx2.rs +0 -65
  504. package/deps/blake3/src/ffi_avx512.rs +0 -169
  505. package/deps/blake3/src/ffi_neon.rs +0 -82
  506. package/deps/blake3/src/ffi_sse2.rs +0 -126
  507. package/deps/blake3/src/ffi_sse41.rs +0 -126
  508. package/deps/blake3/src/guts.rs +0 -60
  509. package/deps/blake3/src/hazmat.rs +0 -704
  510. package/deps/blake3/src/io.rs +0 -64
  511. package/deps/blake3/src/join.rs +0 -92
  512. package/deps/blake3/src/lib.rs +0 -1835
  513. package/deps/blake3/src/platform.rs +0 -587
  514. package/deps/blake3/src/portable.rs +0 -198
  515. package/deps/blake3/src/rust_avx2.rs +0 -474
  516. package/deps/blake3/src/rust_sse2.rs +0 -775
  517. package/deps/blake3/src/rust_sse41.rs +0 -766
  518. package/deps/blake3/src/test.rs +0 -1049
  519. package/deps/blake3/src/traits.rs +0 -227
  520. package/deps/blake3/src/wasm32_simd.rs +0 -794
  521. package/deps/blake3/test_vectors/Cargo.toml +0 -19
  522. package/deps/blake3/test_vectors/cross_test.sh +0 -25
  523. package/deps/blake3/test_vectors/src/bin/generate.rs +0 -4
  524. package/deps/blake3/test_vectors/src/lib.rs +0 -350
  525. package/deps/blake3/test_vectors/test_vectors.json +0 -217
  526. package/deps/blake3/tools/compiler_version/Cargo.toml +0 -7
  527. package/deps/blake3/tools/compiler_version/build.rs +0 -6
  528. package/deps/blake3/tools/compiler_version/src/main.rs +0 -27
  529. package/deps/blake3/tools/instruction_set_support/Cargo.toml +0 -6
  530. package/deps/blake3/tools/instruction_set_support/src/main.rs +0 -10
  531. package/deps/blake3/tools/release.md +0 -16
  532. package/deps/ncrypto/.bazelignore +0 -4
  533. package/deps/ncrypto/.bazelrc +0 -1
  534. package/deps/ncrypto/.bazelversion +0 -1
  535. package/deps/ncrypto/.clang-format +0 -111
  536. package/deps/ncrypto/.github/workflows/bazel.yml +0 -58
  537. package/deps/ncrypto/.github/workflows/commitlint.yml +0 -16
  538. package/deps/ncrypto/.github/workflows/linter.yml +0 -38
  539. package/deps/ncrypto/.github/workflows/macos.yml +0 -43
  540. package/deps/ncrypto/.github/workflows/release-please.yml +0 -16
  541. package/deps/ncrypto/.github/workflows/ubuntu.yml +0 -128
  542. package/deps/ncrypto/.github/workflows/visual-studio.yml +0 -49
  543. package/deps/ncrypto/.python-version +0 -1
  544. package/deps/ncrypto/.release-please-manifest.json +0 -3
  545. package/deps/ncrypto/BUILD.bazel +0 -44
  546. package/deps/ncrypto/CHANGELOG.md +0 -37
  547. package/deps/ncrypto/CMakeLists.txt +0 -79
  548. package/deps/ncrypto/MODULE.bazel +0 -16
  549. package/deps/ncrypto/MODULE.bazel.lock +0 -461
  550. package/deps/ncrypto/cmake/CPM.cmake +0 -1225
  551. package/deps/ncrypto/cmake/ncrypto-flags.cmake +0 -17
  552. package/deps/ncrypto/ncrypto.pc.in +0 -10
  553. package/deps/ncrypto/patches/0001-Expose-libdecrepit-so-NodeJS-can-use-it-for-ncrypto.patch +0 -28
  554. package/deps/ncrypto/pyproject.toml +0 -38
  555. package/deps/ncrypto/release-please-config.json +0 -11
  556. package/deps/ncrypto/src/CMakeLists.txt +0 -40
  557. package/deps/ncrypto/tests/BUILD.bazel +0 -11
  558. package/deps/ncrypto/tests/CMakeLists.txt +0 -7
  559. package/deps/ncrypto/tests/basic.cpp +0 -856
  560. package/deps/ncrypto/tools/run-clang-format.sh +0 -42
  561. package/lib/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,672 @@
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
+ // --- encoding ----------------------------------------------------
30
+ template <bool base64_url> __m128i lookup_pshufb_improved(const __m128i input) {
31
+ // credit: Wojciech Muła
32
+ // reduce 0..51 -> 0
33
+ // 52..61 -> 1 .. 10
34
+ // 62 -> 11
35
+ // 63 -> 12
36
+ __m128i result = _mm_subs_epu8(input, _mm_set1_epi8(51));
37
+
38
+ // distinguish between ranges 0..25 and 26..51:
39
+ // 0 .. 25 -> remains 0
40
+ // 26 .. 51 -> becomes 13
41
+ const __m128i less = _mm_cmpgt_epi8(_mm_set1_epi8(26), input);
42
+ result = _mm_or_si128(result, _mm_and_si128(less, _mm_set1_epi8(13)));
43
+
44
+ __m128i shift_LUT;
45
+ if (base64_url) {
46
+ shift_LUT = _mm_setr_epi8('a' - 26, '0' - 52, '0' - 52, '0' - 52, '0' - 52,
47
+ '0' - 52, '0' - 52, '0' - 52, '0' - 52, '0' - 52,
48
+ '0' - 52, '-' - 62, '_' - 63, 'A', 0, 0);
49
+ } else {
50
+ shift_LUT = _mm_setr_epi8('a' - 26, '0' - 52, '0' - 52, '0' - 52, '0' - 52,
51
+ '0' - 52, '0' - 52, '0' - 52, '0' - 52, '0' - 52,
52
+ '0' - 52, '+' - 62, '/' - 63, 'A', 0, 0);
53
+ }
54
+
55
+ // read shift
56
+ result = _mm_shuffle_epi8(shift_LUT, result);
57
+
58
+ return _mm_add_epi8(result, input);
59
+ }
60
+
61
+ inline __m128i insert_line_feed16(__m128i input, size_t K) {
62
+ static const uint8_t shuffle_masks[16][16] = {
63
+ {0x80, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14},
64
+ {0, 0x80, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14},
65
+ {0, 1, 0x80, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14},
66
+ {0, 1, 2, 0x80, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14},
67
+ {0, 1, 2, 3, 0x80, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14},
68
+ {0, 1, 2, 3, 4, 0x80, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14},
69
+ {0, 1, 2, 3, 4, 5, 0x80, 6, 7, 8, 9, 10, 11, 12, 13, 14},
70
+ {0, 1, 2, 3, 4, 5, 6, 0x80, 7, 8, 9, 10, 11, 12, 13, 14},
71
+ {0, 1, 2, 3, 4, 5, 6, 7, 0x80, 8, 9, 10, 11, 12, 13, 14},
72
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 0x80, 9, 10, 11, 12, 13, 14},
73
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0x80, 10, 11, 12, 13, 14},
74
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0x80, 11, 12, 13, 14},
75
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x80, 12, 13, 14},
76
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0x80, 13, 14},
77
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0x80, 14},
78
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0x80}};
79
+ // Prepare a vector with '\n' (0x0A)
80
+ __m128i line_feed_vector = _mm_set1_epi8('\n');
81
+
82
+ // Load the precomputed shuffle mask for K (index K-1)
83
+ __m128i mask = _mm_loadu_si128((__m128i *)shuffle_masks[K]);
84
+ __m128i lf_pos = _mm_cmpeq_epi8(mask, _mm_set1_epi8(static_cast<char>(0x80)));
85
+
86
+ // Perform the shuffle to reposition the K bytes
87
+ __m128i shuffled = _mm_shuffle_epi8(input, mask);
88
+
89
+ // Blend with line_feed_vector to insert '\n' at the appropriate positions
90
+ __m128i result = _mm_blendv_epi8(shuffled, line_feed_vector, lf_pos);
91
+
92
+ return result;
93
+ }
94
+ template <bool isbase64url, bool use_lines>
95
+ size_t encode_base64_impl(char *dst, const char *src, size_t srclen,
96
+ base64_options options,
97
+ size_t line_length = simdutf::default_line_length) {
98
+ size_t offset = 0;
99
+ if (line_length < 4) {
100
+ line_length = 4; // We do not support line_length less than 4
101
+ }
102
+ // credit: Wojciech Muła
103
+ // SSE (lookup: pshufb improved unrolled)
104
+ const uint8_t *input = (const uint8_t *)src;
105
+
106
+ uint8_t *out = (uint8_t *)dst;
107
+ const __m128i shuf =
108
+ _mm_set_epi8(10, 11, 9, 10, 7, 8, 6, 7, 4, 5, 3, 4, 1, 2, 0, 1);
109
+
110
+ size_t i = 0;
111
+ for (; i + 52 <= srclen; i += 48) {
112
+ __m128i in0 = _mm_loadu_si128(
113
+ reinterpret_cast<const __m128i *>(input + i + 4 * 3 * 0));
114
+ __m128i in1 = _mm_loadu_si128(
115
+ reinterpret_cast<const __m128i *>(input + i + 4 * 3 * 1));
116
+ __m128i in2 = _mm_loadu_si128(
117
+ reinterpret_cast<const __m128i *>(input + i + 4 * 3 * 2));
118
+ __m128i in3 = _mm_loadu_si128(
119
+ reinterpret_cast<const __m128i *>(input + i + 4 * 3 * 3));
120
+
121
+ in0 = _mm_shuffle_epi8(in0, shuf);
122
+ in1 = _mm_shuffle_epi8(in1, shuf);
123
+ in2 = _mm_shuffle_epi8(in2, shuf);
124
+ in3 = _mm_shuffle_epi8(in3, shuf);
125
+
126
+ const __m128i t0_0 = _mm_and_si128(in0, _mm_set1_epi32(0x0fc0fc00));
127
+ const __m128i t0_1 = _mm_and_si128(in1, _mm_set1_epi32(0x0fc0fc00));
128
+ const __m128i t0_2 = _mm_and_si128(in2, _mm_set1_epi32(0x0fc0fc00));
129
+ const __m128i t0_3 = _mm_and_si128(in3, _mm_set1_epi32(0x0fc0fc00));
130
+
131
+ const __m128i t1_0 = _mm_mulhi_epu16(t0_0, _mm_set1_epi32(0x04000040));
132
+ const __m128i t1_1 = _mm_mulhi_epu16(t0_1, _mm_set1_epi32(0x04000040));
133
+ const __m128i t1_2 = _mm_mulhi_epu16(t0_2, _mm_set1_epi32(0x04000040));
134
+ const __m128i t1_3 = _mm_mulhi_epu16(t0_3, _mm_set1_epi32(0x04000040));
135
+
136
+ const __m128i t2_0 = _mm_and_si128(in0, _mm_set1_epi32(0x003f03f0));
137
+ const __m128i t2_1 = _mm_and_si128(in1, _mm_set1_epi32(0x003f03f0));
138
+ const __m128i t2_2 = _mm_and_si128(in2, _mm_set1_epi32(0x003f03f0));
139
+ const __m128i t2_3 = _mm_and_si128(in3, _mm_set1_epi32(0x003f03f0));
140
+
141
+ const __m128i t3_0 = _mm_mullo_epi16(t2_0, _mm_set1_epi32(0x01000010));
142
+ const __m128i t3_1 = _mm_mullo_epi16(t2_1, _mm_set1_epi32(0x01000010));
143
+ const __m128i t3_2 = _mm_mullo_epi16(t2_2, _mm_set1_epi32(0x01000010));
144
+ const __m128i t3_3 = _mm_mullo_epi16(t2_3, _mm_set1_epi32(0x01000010));
145
+
146
+ const __m128i input0 = _mm_or_si128(t1_0, t3_0);
147
+ const __m128i input1 = _mm_or_si128(t1_1, t3_1);
148
+ const __m128i input2 = _mm_or_si128(t1_2, t3_2);
149
+ const __m128i input3 = _mm_or_si128(t1_3, t3_3);
150
+
151
+ const __m128i t0 = lookup_pshufb_improved<isbase64url>(input0);
152
+ const __m128i t1 = lookup_pshufb_improved<isbase64url>(input1);
153
+ const __m128i t2 = lookup_pshufb_improved<isbase64url>(input2);
154
+ const __m128i t3 = lookup_pshufb_improved<isbase64url>(input3);
155
+
156
+ if (use_lines) {
157
+ if (line_length >= 64) { // fast path
158
+ if (offset + 64 > line_length) {
159
+ size_t location_end = line_length - offset;
160
+ size_t to_move = 64 - location_end;
161
+ if (location_end < 16) {
162
+ // We can store or extract store. See below.
163
+ //_mm_storeu_si128(reinterpret_cast<__m128i *>(out+1), t0);
164
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(out),
165
+ insert_line_feed16(t0, location_end));
166
+ out[16] = static_cast<uint8_t>(_mm_extract_epi8(t0, 15));
167
+ out += 17;
168
+ } else {
169
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(out), t0);
170
+ out += 16;
171
+ }
172
+ if (location_end >= 16 && location_end < 32) {
173
+ // We can store or extract store. See below.
174
+ //_mm_storeu_si128(reinterpret_cast<__m128i *>(out+1), t1);
175
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(out),
176
+ insert_line_feed16(t1, location_end - 16));
177
+ out[16] = static_cast<uint8_t>(_mm_extract_epi8(t1, 15));
178
+ out += 17;
179
+ } else {
180
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(out), t1);
181
+ out += 16;
182
+ }
183
+ if (location_end >= 32 && location_end < 48) {
184
+ // We can store or extract store. See below.
185
+ //_mm_storeu_si128(reinterpret_cast<__m128i *>(out+1), t2);
186
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(out),
187
+ insert_line_feed16(t2, location_end - 32));
188
+ out[16] = static_cast<uint8_t>(_mm_extract_epi8(t2, 15));
189
+ out += 17;
190
+ } else {
191
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(out), t2);
192
+ out += 16;
193
+ }
194
+ if (location_end >= 48) {
195
+ // We can store or extract store. See below.
196
+ //_mm_storeu_si128(reinterpret_cast<__m128i *>(out+1), t3);
197
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(out),
198
+ insert_line_feed16(t3, location_end - 48));
199
+ out[16] = static_cast<uint8_t>(_mm_extract_epi8(t3, 15));
200
+ out += 17;
201
+ } else {
202
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(out), t3);
203
+ out += 16;
204
+ }
205
+ offset = to_move;
206
+ } else {
207
+
208
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(out), t0);
209
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(out + 16), t1);
210
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(out + 32), t2);
211
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(out + 48), t3);
212
+ offset += 64;
213
+ out += 64;
214
+ }
215
+ } else { // slow path
216
+ // could be optimized
217
+ alignas(64) uint8_t buffer[64];
218
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(buffer), t0);
219
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(buffer + 16), t1);
220
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(buffer + 32), t2);
221
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(buffer + 48), t3);
222
+ std::memcpy(out, buffer, 64);
223
+ size_t out_pos = 0;
224
+ size_t local_offset = offset;
225
+ for (size_t j = 0; j < 64;) {
226
+ if (local_offset == line_length) {
227
+ out[out_pos++] = '\n';
228
+ local_offset = 0;
229
+ }
230
+ out[out_pos++] = buffer[j++];
231
+ local_offset++;
232
+ }
233
+ offset = local_offset;
234
+ out += out_pos;
235
+ }
236
+ } else {
237
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(out), t0);
238
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(out + 16), t1);
239
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(out + 32), t2);
240
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(out + 48), t3);
241
+ out += 64;
242
+ }
243
+ }
244
+ for (; i + 16 <= srclen; i += 12) {
245
+
246
+ __m128i in = _mm_loadu_si128(reinterpret_cast<const __m128i *>(input + i));
247
+
248
+ // bytes from groups A, B and C are needed in separate 32-bit lanes
249
+ // in = [DDDD|CCCC|BBBB|AAAA]
250
+ //
251
+ // an input triplet has layout
252
+ // [????????|ccdddddd|bbbbcccc|aaaaaabb]
253
+ // byte 3 byte 2 byte 1 byte 0 -- byte 3 comes from the next
254
+ // triplet
255
+ //
256
+ // shuffling changes the order of bytes: 1, 0, 2, 1
257
+ // [bbbbcccc|ccdddddd|aaaaaabb|bbbbcccc]
258
+ // ^^^^ ^^^^^^^^ ^^^^^^^^ ^^^^
259
+ // processed bits
260
+ in = _mm_shuffle_epi8(in, shuf);
261
+
262
+ // unpacking
263
+
264
+ // t0 = [0000cccc|cc000000|aaaaaa00|00000000]
265
+ const __m128i t0 = _mm_and_si128(in, _mm_set1_epi32(0x0fc0fc00));
266
+ // t1 = [00000000|00cccccc|00000000|00aaaaaa]
267
+ // (c * (1 << 10), a * (1 << 6)) >> 16 (note: an unsigned
268
+ // multiplication)
269
+ const __m128i t1 = _mm_mulhi_epu16(t0, _mm_set1_epi32(0x04000040));
270
+
271
+ // t2 = [00000000|00dddddd|000000bb|bbbb0000]
272
+ const __m128i t2 = _mm_and_si128(in, _mm_set1_epi32(0x003f03f0));
273
+ // t3 = [00dddddd|00000000|00bbbbbb|00000000](
274
+ // (d * (1 << 8), b * (1 << 4))
275
+ const __m128i t3 = _mm_mullo_epi16(t2, _mm_set1_epi32(0x01000010));
276
+
277
+ // res = [00dddddd|00cccccc|00bbbbbb|00aaaaaa] = t1 | t3
278
+ const __m128i indices = _mm_or_si128(t1, t3);
279
+
280
+ const __m128i T0 = lookup_pshufb_improved<isbase64url>(indices);
281
+
282
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(out), T0);
283
+
284
+ if (use_lines) {
285
+ if (line_length >= 16) { // fast path
286
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(out), T0);
287
+ if (offset + 16 > line_length) {
288
+ size_t location_end = line_length - offset;
289
+ size_t to_move = 16 - location_end;
290
+ std::memmove(out + location_end + 1, out + location_end, to_move);
291
+ out[location_end] = '\n';
292
+ offset = to_move;
293
+ out += 16 + 1;
294
+ } else {
295
+ offset += 16;
296
+ out += 16;
297
+ }
298
+ } else { // slow path
299
+ // could be optimized
300
+ uint8_t buffer[16];
301
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(buffer), T0);
302
+ size_t out_pos = 0;
303
+ size_t local_offset = offset;
304
+ for (size_t j = 0; j < 16;) {
305
+ if (local_offset == line_length) {
306
+ out[out_pos++] = '\n';
307
+ local_offset = 0;
308
+ }
309
+ out[out_pos++] = buffer[j++];
310
+ local_offset++;
311
+ }
312
+ offset = local_offset;
313
+ out += out_pos;
314
+ }
315
+ } else {
316
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(out), T0);
317
+ out += 16;
318
+ }
319
+ }
320
+ return ((char *)out - (char *)dst) +
321
+ scalar::base64::tail_encode_base64_impl<use_lines>(
322
+ (char *)out, src + i, srclen - i, options, line_length, offset);
323
+ }
324
+
325
+ template <bool isbase64url>
326
+ size_t encode_base64(char *dst, const char *src, size_t srclen,
327
+ base64_options options) {
328
+ return encode_base64_impl<isbase64url, false>(dst, src, srclen, options);
329
+ }
330
+
331
+ // --- decoding -----------------------------------------------
332
+
333
+ static simdutf_really_inline void compress(__m128i data, uint16_t mask,
334
+ char *output) {
335
+ if (mask == 0) {
336
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(output), data);
337
+ return;
338
+ }
339
+
340
+ // this particular implementation was inspired by work done by @animetosho
341
+ // we do it in two steps, first 8 bytes and then second 8 bytes
342
+ uint8_t mask1 = uint8_t(mask); // least significant 8 bits
343
+ uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits
344
+ // next line just loads the 64-bit values thintable_epi8[mask1] and
345
+ // thintable_epi8[mask2] into a 128-bit register, using only
346
+ // two instructions on most compilers.
347
+
348
+ __m128i shufmask = _mm_set_epi64x(tables::base64::thintable_epi8[mask2],
349
+ tables::base64::thintable_epi8[mask1]);
350
+ // we increment by 0x08 the second half of the mask
351
+ shufmask =
352
+ _mm_add_epi8(shufmask, _mm_set_epi32(0x08080808, 0x08080808, 0, 0));
353
+ // this is the version "nearly pruned"
354
+ __m128i pruned = _mm_shuffle_epi8(data, shufmask);
355
+ // we still need to put the two halves together.
356
+ // we compute the popcount of the first half:
357
+ int pop1 = tables::base64::BitsSetTable256mul2[mask1];
358
+ // then load the corresponding mask, what it does is to write
359
+ // only the first pop1 bytes from the first 8 bytes, and then
360
+ // it fills in with the bytes from the second 8 bytes + some filling
361
+ // at the end.
362
+ __m128i compactmask = _mm_loadu_si128(reinterpret_cast<const __m128i *>(
363
+ tables::base64::pshufb_combine_table + pop1 * 8));
364
+ __m128i answer = _mm_shuffle_epi8(pruned, compactmask);
365
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(output), answer);
366
+ }
367
+
368
+ static simdutf_really_inline void base64_decode(char *out, __m128i str) {
369
+ // credit: aqrit
370
+
371
+ const __m128i pack_shuffle =
372
+ _mm_setr_epi8(2, 1, 0, 6, 5, 4, 10, 9, 8, 14, 13, 12, -1, -1, -1, -1);
373
+
374
+ const __m128i t0 = _mm_maddubs_epi16(str, _mm_set1_epi32(0x01400140));
375
+ const __m128i t1 = _mm_madd_epi16(t0, _mm_set1_epi32(0x00011000));
376
+ const __m128i t2 = _mm_shuffle_epi8(t1, pack_shuffle);
377
+ // Store the output:
378
+ // this writes 16 bytes, but we only need 12.
379
+ _mm_storeu_si128((__m128i *)out, t2);
380
+ }
381
+
382
+ // decode 64 bytes and output 48 bytes
383
+ static inline void base64_decode_block(char *out, const char *src) {
384
+ base64_decode(out, _mm_loadu_si128(reinterpret_cast<const __m128i *>(src)));
385
+ base64_decode(out + 12,
386
+ _mm_loadu_si128(reinterpret_cast<const __m128i *>(src + 16)));
387
+ base64_decode(out + 24,
388
+ _mm_loadu_si128(reinterpret_cast<const __m128i *>(src + 32)));
389
+ base64_decode(out + 36,
390
+ _mm_loadu_si128(reinterpret_cast<const __m128i *>(src + 48)));
391
+ }
392
+
393
+ static inline void base64_decode_block_safe(char *out, const char *src) {
394
+ base64_decode(out, _mm_loadu_si128(reinterpret_cast<const __m128i *>(src)));
395
+ base64_decode(out + 12,
396
+ _mm_loadu_si128(reinterpret_cast<const __m128i *>(src + 16)));
397
+ base64_decode(out + 24,
398
+ _mm_loadu_si128(reinterpret_cast<const __m128i *>(src + 32)));
399
+ char buffer[16];
400
+ base64_decode(buffer,
401
+ _mm_loadu_si128(reinterpret_cast<const __m128i *>(src + 48)));
402
+ std::memcpy(out + 36, buffer, 12);
403
+ }
404
+
405
+ // --- decoding - base64 class --------------------------------
406
+
407
+ class block64 {
408
+ __m128i chunks[4];
409
+
410
+ public:
411
+ // The caller of this function is responsible to ensure that there are 64
412
+ // bytes available from reading at src.
413
+ simdutf_really_inline block64(const char *src) {
414
+ chunks[0] = _mm_loadu_si128(reinterpret_cast<const __m128i *>(src));
415
+ chunks[1] = _mm_loadu_si128(reinterpret_cast<const __m128i *>(src + 16));
416
+ chunks[2] = _mm_loadu_si128(reinterpret_cast<const __m128i *>(src + 32));
417
+ chunks[3] = _mm_loadu_si128(reinterpret_cast<const __m128i *>(src + 48));
418
+ }
419
+
420
+ public:
421
+ // The caller of this function is responsible to ensure that there are 128
422
+ // bytes available from reading at src. The data is read into a block64
423
+ // structure.
424
+ simdutf_really_inline block64(const char16_t *src) {
425
+ const auto m1 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(src));
426
+ const auto m2 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(src + 8));
427
+ const auto m3 =
428
+ _mm_loadu_si128(reinterpret_cast<const __m128i *>(src + 16));
429
+ const auto m4 =
430
+ _mm_loadu_si128(reinterpret_cast<const __m128i *>(src + 24));
431
+ const auto m5 =
432
+ _mm_loadu_si128(reinterpret_cast<const __m128i *>(src + 32));
433
+ const auto m6 =
434
+ _mm_loadu_si128(reinterpret_cast<const __m128i *>(src + 40));
435
+ const auto m7 =
436
+ _mm_loadu_si128(reinterpret_cast<const __m128i *>(src + 48));
437
+ const auto m8 =
438
+ _mm_loadu_si128(reinterpret_cast<const __m128i *>(src + 56));
439
+ chunks[0] = _mm_packus_epi16(m1, m2);
440
+ chunks[1] = _mm_packus_epi16(m3, m4);
441
+ chunks[2] = _mm_packus_epi16(m5, m6);
442
+ chunks[3] = _mm_packus_epi16(m7, m8);
443
+ }
444
+
445
+ public:
446
+ simdutf_really_inline void copy_block(char *output) {
447
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(output), chunks[0]);
448
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(output + 16), chunks[1]);
449
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(output + 32), chunks[2]);
450
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(output + 48), chunks[3]);
451
+ }
452
+
453
+ public:
454
+ simdutf_really_inline uint64_t compress_block(uint64_t mask, char *output) {
455
+ if (is_power_of_two(mask)) {
456
+ return compress_block_single(mask, output);
457
+ }
458
+
459
+ uint64_t nmask = ~mask;
460
+ compress(chunks[0], uint16_t(mask), output);
461
+ compress(chunks[1], uint16_t(mask >> 16),
462
+ output + count_ones(nmask & 0xFFFF));
463
+ compress(chunks[2], uint16_t(mask >> 32),
464
+ output + count_ones(nmask & 0xFFFFFFFF));
465
+ compress(chunks[3], uint16_t(mask >> 48),
466
+ output + count_ones(nmask & 0xFFFFFFFFFFFFULL));
467
+ return count_ones(nmask);
468
+ }
469
+
470
+ private:
471
+ simdutf_really_inline size_t compress_block_single(uint64_t mask,
472
+ char *output) {
473
+ const size_t pos64 = trailing_zeroes(mask);
474
+ const int8_t pos = pos64 & 0xf;
475
+ switch (pos64 >> 4) {
476
+ case 0b00: {
477
+ const __m128i v0 = _mm_set1_epi8(char(pos - 1));
478
+ const __m128i v1 =
479
+ _mm_setr_epi8(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
480
+ const __m128i v2 = _mm_cmpgt_epi8(v1, v0);
481
+ const __m128i sh = _mm_sub_epi8(v1, v2);
482
+ const __m128i compressed = _mm_shuffle_epi8(chunks[0], sh);
483
+
484
+ _mm_storeu_si128((__m128i *)(output + 0 * 16), compressed);
485
+ _mm_storeu_si128((__m128i *)(output + 1 * 16 - 1), chunks[1]);
486
+ _mm_storeu_si128((__m128i *)(output + 2 * 16 - 1), chunks[2]);
487
+ _mm_storeu_si128((__m128i *)(output + 3 * 16 - 1), chunks[3]);
488
+ } break;
489
+ case 0b01: {
490
+ _mm_storeu_si128((__m128i *)(output + 0 * 16), chunks[0]);
491
+
492
+ const __m128i v0 = _mm_set1_epi8(char(pos - 1));
493
+ const __m128i v1 =
494
+ _mm_setr_epi8(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
495
+ const __m128i v2 = _mm_cmpgt_epi8(v1, v0);
496
+ const __m128i sh = _mm_sub_epi8(v1, v2);
497
+ const __m128i compressed = _mm_shuffle_epi8(chunks[1], sh);
498
+
499
+ _mm_storeu_si128((__m128i *)(output + 1 * 16), compressed);
500
+ _mm_storeu_si128((__m128i *)(output + 2 * 16 - 1), chunks[2]);
501
+ _mm_storeu_si128((__m128i *)(output + 3 * 16 - 1), chunks[3]);
502
+ } break;
503
+ case 0b10: {
504
+ _mm_storeu_si128((__m128i *)(output + 0 * 16), chunks[0]);
505
+ _mm_storeu_si128((__m128i *)(output + 1 * 16), chunks[1]);
506
+
507
+ const __m128i v0 = _mm_set1_epi8(char(pos - 1));
508
+ const __m128i v1 =
509
+ _mm_setr_epi8(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
510
+ const __m128i v2 = _mm_cmpgt_epi8(v1, v0);
511
+ const __m128i sh = _mm_sub_epi8(v1, v2);
512
+ const __m128i compressed = _mm_shuffle_epi8(chunks[2], sh);
513
+
514
+ _mm_storeu_si128((__m128i *)(output + 2 * 16), compressed);
515
+ _mm_storeu_si128((__m128i *)(output + 3 * 16 - 1), chunks[3]);
516
+ } break;
517
+ case 0b11: {
518
+ _mm_storeu_si128((__m128i *)(output + 0 * 16), chunks[0]);
519
+ _mm_storeu_si128((__m128i *)(output + 1 * 16), chunks[1]);
520
+ _mm_storeu_si128((__m128i *)(output + 2 * 16), chunks[2]);
521
+
522
+ const __m128i v0 = _mm_set1_epi8(char(pos - 1));
523
+ const __m128i v1 =
524
+ _mm_setr_epi8(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
525
+ const __m128i v2 = _mm_cmpgt_epi8(v1, v0);
526
+ const __m128i sh = _mm_sub_epi8(v1, v2);
527
+ const __m128i compressed = _mm_shuffle_epi8(chunks[3], sh);
528
+
529
+ _mm_storeu_si128((__m128i *)(output + 3 * 16), compressed);
530
+ } break;
531
+ }
532
+
533
+ return 63;
534
+ }
535
+
536
+ public:
537
+ template <bool base64_url, bool ignore_garbage, bool default_or_url>
538
+ simdutf_really_inline uint64_t to_base64_mask(uint64_t *error) {
539
+ uint32_t err0 = 0;
540
+ uint32_t err1 = 0;
541
+ uint32_t err2 = 0;
542
+ uint32_t err3 = 0;
543
+ uint64_t m0 = to_base64_mask<base64_url, ignore_garbage, default_or_url>(
544
+ &chunks[0], &err0);
545
+ uint64_t m1 = to_base64_mask<base64_url, ignore_garbage, default_or_url>(
546
+ &chunks[1], &err1);
547
+ uint64_t m2 = to_base64_mask<base64_url, ignore_garbage, default_or_url>(
548
+ &chunks[2], &err2);
549
+ uint64_t m3 = to_base64_mask<base64_url, ignore_garbage, default_or_url>(
550
+ &chunks[3], &err3);
551
+ if (!ignore_garbage) {
552
+ *error = (err0) | ((uint64_t)err1 << 16) | ((uint64_t)err2 << 32) |
553
+ ((uint64_t)err3 << 48);
554
+ }
555
+ return m0 | (m1 << 16) | (m2 << 32) | (m3 << 48);
556
+ }
557
+
558
+ private:
559
+ template <bool base64_url, bool ignore_garbage, bool default_or_url>
560
+ simdutf_really_inline uint16_t to_base64_mask(__m128i *src, uint32_t *error) {
561
+ const __m128i ascii_space_tbl =
562
+ _mm_setr_epi8(0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xa,
563
+ 0x0, 0xc, 0xd, 0x0, 0x0);
564
+ // credit: aqrit
565
+ __m128i delta_asso;
566
+ if (default_or_url) {
567
+ delta_asso =
568
+ _mm_setr_epi8(0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
569
+ 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x16);
570
+ } else if (base64_url) {
571
+ delta_asso = _mm_setr_epi8(0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0,
572
+ 0x0, 0x0, 0x0, 0x0, 0xF, 0x0, 0xF);
573
+ } else {
574
+ delta_asso =
575
+ _mm_setr_epi8(0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
576
+ 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x0F);
577
+ }
578
+ __m128i delta_values;
579
+ if (default_or_url) {
580
+ delta_values = _mm_setr_epi8(
581
+ uint8_t(0xBF), uint8_t(0xE0), uint8_t(0xB9), uint8_t(0x13),
582
+ uint8_t(0x04), uint8_t(0xBF), uint8_t(0xBF), uint8_t(0xB9),
583
+ uint8_t(0xB9), uint8_t(0x00), uint8_t(0xFF), uint8_t(0x11),
584
+ uint8_t(0xFF), uint8_t(0xBF), uint8_t(0x10), uint8_t(0xB9));
585
+
586
+ } else if (base64_url) {
587
+ delta_values = _mm_setr_epi8(0x0, 0x0, 0x0, 0x13, 0x4, uint8_t(0xBF),
588
+ uint8_t(0xBF), uint8_t(0xB9), uint8_t(0xB9),
589
+ 0x0, 0x11, uint8_t(0xC3), uint8_t(0xBF),
590
+ uint8_t(0xE0), uint8_t(0xB9), uint8_t(0xB9));
591
+ } else {
592
+ delta_values =
593
+ _mm_setr_epi8(int8_t(0x00), int8_t(0x00), int8_t(0x00), int8_t(0x13),
594
+ int8_t(0x04), int8_t(0xBF), int8_t(0xBF), int8_t(0xB9),
595
+ int8_t(0xB9), int8_t(0x00), int8_t(0x10), int8_t(0xC3),
596
+ int8_t(0xBF), int8_t(0xBF), int8_t(0xB9), int8_t(0xB9));
597
+ }
598
+ __m128i check_asso;
599
+ if (default_or_url) {
600
+ check_asso =
601
+ _mm_setr_epi8(0x0D, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
602
+ 0x01, 0x03, 0x07, 0x0B, 0x0E, 0x0B, 0x06);
603
+ } else if (base64_url) {
604
+ check_asso = _mm_setr_epi8(0xD, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
605
+ 0x1, 0x3, 0x7, 0xB, 0xE, 0xB, 0x6);
606
+ } else {
607
+ check_asso =
608
+ _mm_setr_epi8(0x0D, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
609
+ 0x01, 0x03, 0x07, 0x0B, 0x0B, 0x0B, 0x0F);
610
+ }
611
+ __m128i check_values;
612
+ if (default_or_url) {
613
+ check_values = _mm_setr_epi8(
614
+ uint8_t(0x80), uint8_t(0x80), uint8_t(0x80), uint8_t(0x80),
615
+ uint8_t(0xCF), uint8_t(0xBF), uint8_t(0xD5), uint8_t(0xA6),
616
+ uint8_t(0xB5), uint8_t(0xA1), uint8_t(0x00), uint8_t(0x80),
617
+ uint8_t(0x00), uint8_t(0x80), uint8_t(0x00), uint8_t(0x80));
618
+ } else if (base64_url) {
619
+ check_values = _mm_setr_epi8(uint8_t(0x80), uint8_t(0x80), uint8_t(0x80),
620
+ uint8_t(0x80), uint8_t(0xCF), uint8_t(0xBF),
621
+ uint8_t(0xB6), uint8_t(0xA6), uint8_t(0xB5),
622
+ uint8_t(0xA1), 0x0, uint8_t(0x80), 0x0,
623
+ uint8_t(0x80), 0x0, uint8_t(0x80));
624
+ } else {
625
+ check_values =
626
+ _mm_setr_epi8(int8_t(0x80), int8_t(0x80), int8_t(0x80), int8_t(0x80),
627
+ int8_t(0xCF), int8_t(0xBF), int8_t(0xD5), int8_t(0xA6),
628
+ int8_t(0xB5), int8_t(0x86), int8_t(0xD1), int8_t(0x80),
629
+ int8_t(0xB1), int8_t(0x80), int8_t(0x91), int8_t(0x80));
630
+ }
631
+ const __m128i shifted = _mm_srli_epi32(*src, 3);
632
+
633
+ __m128i delta_hash =
634
+ _mm_avg_epu8(_mm_shuffle_epi8(delta_asso, *src), shifted);
635
+ if (default_or_url) {
636
+ delta_hash = _mm_and_si128(delta_hash, _mm_set1_epi8(0xf));
637
+ }
638
+ const __m128i check_hash =
639
+ _mm_avg_epu8(_mm_shuffle_epi8(check_asso, *src), shifted);
640
+
641
+ const __m128i out =
642
+ _mm_adds_epi8(_mm_shuffle_epi8(delta_values, delta_hash), *src);
643
+ const __m128i chk =
644
+ _mm_adds_epi8(_mm_shuffle_epi8(check_values, check_hash), *src);
645
+ const int mask = _mm_movemask_epi8(chk);
646
+ if (!ignore_garbage && mask) {
647
+ __m128i ascii_space =
648
+ _mm_cmpeq_epi8(_mm_shuffle_epi8(ascii_space_tbl, *src), *src);
649
+ *error = (mask ^ _mm_movemask_epi8(ascii_space));
650
+ }
651
+ *src = out;
652
+ return (uint16_t)mask;
653
+ }
654
+
655
+ public:
656
+ simdutf_really_inline void base64_decode_block(char *out) {
657
+ base64_decode(out, chunks[0]);
658
+ base64_decode(out + 12, chunks[1]);
659
+ base64_decode(out + 24, chunks[2]);
660
+ base64_decode(out + 36, chunks[3]);
661
+ }
662
+
663
+ public:
664
+ simdutf_really_inline void base64_decode_block_safe(char *out) {
665
+ base64_decode(out, chunks[0]);
666
+ base64_decode(out + 12, chunks[1]);
667
+ base64_decode(out + 24, chunks[2]);
668
+ char buffer[16];
669
+ base64_decode(buffer, chunks[3]);
670
+ std::memcpy(out + 36, buffer, 12);
671
+ }
672
+ };
@@ -0,0 +1,21 @@
1
+ template <endianness big_endian>
2
+ std::pair<const char *, char16_t *>
3
+ sse_convert_latin1_to_utf16(const char *latin1_input, size_t len,
4
+ char16_t *utf16_output) {
5
+ size_t rounded_len = len & ~0xF; // Round down to nearest multiple of 16
6
+ for (size_t i = 0; i < rounded_len; i += 16) {
7
+ // Load 16 Latin1 characters into a 128-bit register
8
+ __m128i in =
9
+ _mm_loadu_si128(reinterpret_cast<const __m128i *>(&latin1_input[i]));
10
+ __m128i out1 = big_endian ? _mm_unpacklo_epi8(_mm_setzero_si128(), in)
11
+ : _mm_unpacklo_epi8(in, _mm_setzero_si128());
12
+ __m128i out2 = big_endian ? _mm_unpackhi_epi8(_mm_setzero_si128(), in)
13
+ : _mm_unpackhi_epi8(in, _mm_setzero_si128());
14
+ // Zero extend each Latin1 character to 16-bit integers and store the
15
+ // results back to memory
16
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(&utf16_output[i]), out1);
17
+ _mm_storeu_si128(reinterpret_cast<__m128i *>(&utf16_output[i + 8]), out2);
18
+ }
19
+ // return pointers pointing to where we left off
20
+ return std::make_pair(latin1_input + rounded_len, utf16_output + rounded_len);
21
+ }