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,695 @@
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
+ template <bool isbase64url>
30
+ size_t encode_base64(char *dst, const char *src, size_t srclen,
31
+ base64_options options) {
32
+ // credit: Wojciech Muła
33
+ // SSE (lookup: pshufb improved unrolled)
34
+ const uint8_t *input = (const uint8_t *)src;
35
+ static const char *lookup_tbl =
36
+ isbase64url
37
+ ? "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
38
+ : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
39
+ uint8_t *out = (uint8_t *)dst;
40
+
41
+ v32u8 shuf;
42
+ __m256i v_fc0fc00, v_3f03f0, shift_r, shift_l, base64_tbl0, base64_tbl1,
43
+ base64_tbl2, base64_tbl3;
44
+ if (srclen >= 28) {
45
+ shuf = v32u8{1, 0, 2, 1, 4, 3, 5, 4, 7, 6, 8, 7, 10, 9, 11, 10,
46
+ 1, 0, 2, 1, 4, 3, 5, 4, 7, 6, 8, 7, 10, 9, 11, 10};
47
+
48
+ v_fc0fc00 = __lasx_xvreplgr2vr_w(uint32_t(0x0fc0fc00));
49
+ v_3f03f0 = __lasx_xvreplgr2vr_w(uint32_t(0x003f03f0));
50
+ shift_r = __lasx_xvreplgr2vr_w(uint32_t(0x0006000a));
51
+ shift_l = __lasx_xvreplgr2vr_w(uint32_t(0x00080004));
52
+ base64_tbl0 = ____m256i(__lsx_vld(lookup_tbl, 0));
53
+ base64_tbl1 = ____m256i(__lsx_vld(lookup_tbl, 16));
54
+ base64_tbl2 = ____m256i(__lsx_vld(lookup_tbl, 32));
55
+ base64_tbl3 = ____m256i(__lsx_vld(lookup_tbl, 48));
56
+ }
57
+ size_t i = 0;
58
+ for (; i + 100 <= srclen; i += 96) {
59
+ __m128i in0_lo =
60
+ __lsx_vld(reinterpret_cast<const __m128i *>(input + i), 4 * 3 * 0);
61
+ __m128i in0_hi =
62
+ __lsx_vld(reinterpret_cast<const __m128i *>(input + i), 4 * 3 * 1);
63
+ __m128i in1_lo =
64
+ __lsx_vld(reinterpret_cast<const __m128i *>(input + i), 4 * 3 * 2);
65
+ __m128i in1_hi =
66
+ __lsx_vld(reinterpret_cast<const __m128i *>(input + i), 4 * 3 * 3);
67
+ __m128i in2_lo =
68
+ __lsx_vld(reinterpret_cast<const __m128i *>(input + i), 4 * 3 * 4);
69
+ __m128i in2_hi =
70
+ __lsx_vld(reinterpret_cast<const __m128i *>(input + i), 4 * 3 * 5);
71
+ __m128i in3_lo =
72
+ __lsx_vld(reinterpret_cast<const __m128i *>(input + i), 4 * 3 * 6);
73
+ __m128i in3_hi =
74
+ __lsx_vld(reinterpret_cast<const __m128i *>(input + i), 4 * 3 * 7);
75
+
76
+ __m256i in0 = lasx_set_q(in0_hi, in0_lo);
77
+ __m256i in1 = lasx_set_q(in1_hi, in1_lo);
78
+ __m256i in2 = lasx_set_q(in2_hi, in2_lo);
79
+ __m256i in3 = lasx_set_q(in3_hi, in3_lo);
80
+
81
+ in0 = __lasx_xvshuf_b(in0, in0, (__m256i)shuf);
82
+ in1 = __lasx_xvshuf_b(in1, in1, (__m256i)shuf);
83
+ in2 = __lasx_xvshuf_b(in2, in2, (__m256i)shuf);
84
+ in3 = __lasx_xvshuf_b(in3, in3, (__m256i)shuf);
85
+
86
+ __m256i t0_0 = __lasx_xvand_v(in0, v_fc0fc00);
87
+ __m256i t0_1 = __lasx_xvand_v(in1, v_fc0fc00);
88
+ __m256i t0_2 = __lasx_xvand_v(in2, v_fc0fc00);
89
+ __m256i t0_3 = __lasx_xvand_v(in3, v_fc0fc00);
90
+
91
+ __m256i t1_0 = __lasx_xvsrl_h(t0_0, shift_r);
92
+ __m256i t1_1 = __lasx_xvsrl_h(t0_1, shift_r);
93
+ __m256i t1_2 = __lasx_xvsrl_h(t0_2, shift_r);
94
+ __m256i t1_3 = __lasx_xvsrl_h(t0_3, shift_r);
95
+
96
+ __m256i t2_0 = __lasx_xvand_v(in0, v_3f03f0);
97
+ __m256i t2_1 = __lasx_xvand_v(in1, v_3f03f0);
98
+ __m256i t2_2 = __lasx_xvand_v(in2, v_3f03f0);
99
+ __m256i t2_3 = __lasx_xvand_v(in3, v_3f03f0);
100
+
101
+ __m256i t3_0 = __lasx_xvsll_h(t2_0, shift_l);
102
+ __m256i t3_1 = __lasx_xvsll_h(t2_1, shift_l);
103
+ __m256i t3_2 = __lasx_xvsll_h(t2_2, shift_l);
104
+ __m256i t3_3 = __lasx_xvsll_h(t2_3, shift_l);
105
+
106
+ __m256i input0 = __lasx_xvor_v(t1_0, t3_0);
107
+ __m256i input0_shuf0 = __lasx_xvshuf_b(base64_tbl1, base64_tbl0, input0);
108
+ __m256i input0_shuf1 = __lasx_xvshuf_b(
109
+ base64_tbl3, base64_tbl2, __lasx_xvsub_b(input0, __lasx_xvldi(32)));
110
+ __m256i input0_mask = __lasx_xvslei_bu(input0, 31);
111
+ __m256i input0_result =
112
+ __lasx_xvbitsel_v(input0_shuf1, input0_shuf0, input0_mask);
113
+ __lasx_xvst(input0_result, reinterpret_cast<__m256i *>(out), 0);
114
+ out += 32;
115
+
116
+ __m256i input1 = __lasx_xvor_v(t1_1, t3_1);
117
+ __m256i input1_shuf0 = __lasx_xvshuf_b(base64_tbl1, base64_tbl0, input1);
118
+ __m256i input1_shuf1 = __lasx_xvshuf_b(
119
+ base64_tbl3, base64_tbl2, __lasx_xvsub_b(input1, __lasx_xvldi(32)));
120
+ __m256i input1_mask = __lasx_xvslei_bu(input1, 31);
121
+ __m256i input1_result =
122
+ __lasx_xvbitsel_v(input1_shuf1, input1_shuf0, input1_mask);
123
+ __lasx_xvst(input1_result, reinterpret_cast<__m256i *>(out), 0);
124
+ out += 32;
125
+
126
+ __m256i input2 = __lasx_xvor_v(t1_2, t3_2);
127
+ __m256i input2_shuf0 = __lasx_xvshuf_b(base64_tbl1, base64_tbl0, input2);
128
+ __m256i input2_shuf1 = __lasx_xvshuf_b(
129
+ base64_tbl3, base64_tbl2, __lasx_xvsub_b(input2, __lasx_xvldi(32)));
130
+ __m256i input2_mask = __lasx_xvslei_bu(input2, 31);
131
+ __m256i input2_result =
132
+ __lasx_xvbitsel_v(input2_shuf1, input2_shuf0, input2_mask);
133
+ __lasx_xvst(input2_result, reinterpret_cast<__m256i *>(out), 0);
134
+ out += 32;
135
+
136
+ __m256i input3 = __lasx_xvor_v(t1_3, t3_3);
137
+ __m256i input3_shuf0 = __lasx_xvshuf_b(base64_tbl1, base64_tbl0, input3);
138
+ __m256i input3_shuf1 = __lasx_xvshuf_b(
139
+ base64_tbl3, base64_tbl2, __lasx_xvsub_b(input3, __lasx_xvldi(32)));
140
+ __m256i input3_mask = __lasx_xvslei_bu(input3, 31);
141
+ __m256i input3_result =
142
+ __lasx_xvbitsel_v(input3_shuf1, input3_shuf0, input3_mask);
143
+ __lasx_xvst(input3_result, reinterpret_cast<__m256i *>(out), 0);
144
+ out += 32;
145
+ }
146
+ for (; i + 28 <= srclen; i += 24) {
147
+
148
+ __m128i in_lo = __lsx_vld(reinterpret_cast<const __m128i *>(input + i), 0);
149
+ __m128i in_hi =
150
+ __lsx_vld(reinterpret_cast<const __m128i *>(input + i), 4 * 3 * 1);
151
+
152
+ __m256i in = lasx_set_q(in_hi, in_lo);
153
+
154
+ // bytes from groups A, B and C are needed in separate 32-bit lanes
155
+ // in = [DDDD|CCCC|BBBB|AAAA]
156
+ //
157
+ // an input triplet has layout
158
+ // [????????|ccdddddd|bbbbcccc|aaaaaabb]
159
+ // byte 3 byte 2 byte 1 byte 0 -- byte 3 comes from the next
160
+ // triplet
161
+ //
162
+ // shuffling changes the order of bytes: 1, 0, 2, 1
163
+ // [bbbbcccc|ccdddddd|aaaaaabb|bbbbcccc]
164
+ // ^^^^ ^^^^^^^^ ^^^^^^^^ ^^^^
165
+ // processed bits
166
+ in = __lasx_xvshuf_b(in, in, (__m256i)shuf);
167
+
168
+ // unpacking
169
+ // t0 = [0000cccc|cc000000|aaaaaa00|00000000]
170
+ __m256i t0 = __lasx_xvand_v(in, v_fc0fc00);
171
+ // t1 = [00000000|00cccccc|00000000|00aaaaaa]
172
+ // ((c >> 6), (a >> 10))
173
+ __m256i t1 = __lasx_xvsrl_h(t0, shift_r);
174
+
175
+ // t2 = [00000000|00dddddd|000000bb|bbbb0000]
176
+ __m256i t2 = __lasx_xvand_v(in, v_3f03f0);
177
+ // t3 = [00dddddd|00000000|00bbbbbb|00000000]
178
+ // ((d << 8), (b << 4))
179
+ __m256i t3 = __lasx_xvsll_h(t2, shift_l);
180
+
181
+ // res = [00dddddd|00cccccc|00bbbbbb|00aaaaaa] = t1 | t3
182
+ __m256i indices = __lasx_xvor_v(t1, t3);
183
+
184
+ __m256i indices_shuf0 = __lasx_xvshuf_b(base64_tbl1, base64_tbl0, indices);
185
+ __m256i indices_shuf1 = __lasx_xvshuf_b(
186
+ base64_tbl3, base64_tbl2, __lasx_xvsub_b(indices, __lasx_xvldi(32)));
187
+ __m256i indices_mask = __lasx_xvslei_bu(indices, 31);
188
+ __m256i indices_result =
189
+ __lasx_xvbitsel_v(indices_shuf1, indices_shuf0, indices_mask);
190
+ __lasx_xvst(indices_result, reinterpret_cast<__m256i *>(out), 0);
191
+ out += 32;
192
+ }
193
+
194
+ return i / 3 * 4 + scalar::base64::tail_encode_base64((char *)out, src + i,
195
+ srclen - i, options);
196
+ }
197
+
198
+ static inline void compress(__m128i data, uint16_t mask, char *output) {
199
+ if (mask == 0) {
200
+ __lsx_vst(data, reinterpret_cast<__m128i *>(output), 0);
201
+ return;
202
+ }
203
+ // this particular implementation was inspired by work done by @animetosho
204
+ // we do it in two steps, first 8 bytes and then second 8 bytes
205
+ uint8_t mask1 = uint8_t(mask); // least significant 8 bits
206
+ uint8_t mask2 = uint8_t(mask >> 8); // most significant 8 bits
207
+ // next line just loads the 64-bit values thintable_epi8[mask1] and
208
+ // thintable_epi8[mask2] into a 128-bit register, using only
209
+ // two instructions on most compilers.
210
+
211
+ v2u64 shufmask = {tables::base64::thintable_epi8[mask1],
212
+ tables::base64::thintable_epi8[mask2]};
213
+
214
+ // we increment by 0x08 the second half of the mask
215
+ const v4u32 hi = {0, 0, 0x08080808, 0x08080808};
216
+ __m128i shufmask1 = __lsx_vadd_b((__m128i)shufmask, (__m128i)hi);
217
+
218
+ // this is the version "nearly pruned"
219
+ __m128i pruned = __lsx_vshuf_b(data, data, shufmask1);
220
+ // we still need to put the two halves together.
221
+ // we compute the popcount of the first half:
222
+ int pop1 = tables::base64::BitsSetTable256mul2[mask1];
223
+ // then load the corresponding mask, what it does is to write
224
+ // only the first pop1 bytes from the first 8 bytes, and then
225
+ // it fills in with the bytes from the second 8 bytes + some filling
226
+ // at the end.
227
+ __m128i compactmask =
228
+ __lsx_vld(reinterpret_cast<const __m128i *>(
229
+ tables::base64::pshufb_combine_table + pop1 * 8),
230
+ 0);
231
+ __m128i answer = __lsx_vshuf_b(pruned, pruned, compactmask);
232
+
233
+ __lsx_vst(answer, reinterpret_cast<__m128i *>(output), 0);
234
+ }
235
+
236
+ struct block64 {
237
+ __m256i chunks[2];
238
+ };
239
+
240
+ template <bool base64_url, bool default_or_url>
241
+ static inline uint32_t to_base64_mask(__m256i *src, bool *error) {
242
+ __m256i ascii_space_tbl =
243
+ ____m256i((__m128i)v16u8{0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
244
+ 0x9, 0xa, 0x0, 0xc, 0xd, 0x0, 0x0});
245
+ // credit: aqrit
246
+ __m256i delta_asso;
247
+ if (default_or_url) {
248
+ delta_asso =
249
+ ____m256i((__m128i)v16u8{0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0,
250
+ 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x16});
251
+ } else {
252
+ delta_asso =
253
+ ____m256i((__m128i)v16u8{0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0,
254
+ 0x0, 0x0, 0x0, 0x0, 0xF, 0x0, 0xF});
255
+ }
256
+ __m256i delta_values;
257
+ if (default_or_url) {
258
+ delta_values = ____m256i(
259
+ (__m128i)v16i8{int8_t(0xBF), int8_t(0xE0), int8_t(0xB9), int8_t(0x13),
260
+ int8_t(0x04), int8_t(0xBF), int8_t(0xBF), int8_t(0xB9),
261
+ int8_t(0xB9), int8_t(0x00), int8_t(0xFF), int8_t(0x11),
262
+ int8_t(0xFF), int8_t(0xBF), int8_t(0x10), int8_t(0xB9)});
263
+ } else if (base64_url) {
264
+ delta_values = ____m256i(
265
+ (__m128i)v16i8{int8_t(0x00), int8_t(0x00), int8_t(0x00), int8_t(0x13),
266
+ int8_t(0x04), int8_t(0xBF), int8_t(0xBF), int8_t(0xB9),
267
+ int8_t(0xB9), int8_t(0x00), int8_t(0x11), int8_t(0xC3),
268
+ int8_t(0xBF), int8_t(0xE0), int8_t(0xB9), int8_t(0xB9)});
269
+ } else {
270
+ delta_values = ____m256i(
271
+ (__m128i)v16i8{int8_t(0x00), int8_t(0x00), int8_t(0x00), int8_t(0x13),
272
+ int8_t(0x04), int8_t(0xBF), int8_t(0xBF), int8_t(0xB9),
273
+ int8_t(0xB9), int8_t(0x00), int8_t(0x10), int8_t(0xC3),
274
+ int8_t(0xBF), int8_t(0xBF), int8_t(0xB9), int8_t(0xB9)});
275
+ }
276
+
277
+ __m256i check_asso;
278
+ if (default_or_url) {
279
+ check_asso = ____m256i((__m128i)v16u8{0x0D, 0x01, 0x01, 0x01, 0x01, 0x01,
280
+ 0x01, 0x01, 0x01, 0x01, 0x03, 0x07,
281
+ 0x0B, 0x0E, 0x0B, 0x06});
282
+
283
+ } else if (base64_url) {
284
+ check_asso = ____m256i((__m128i)v16u8{0x0D, 0x01, 0x01, 0x01, 0x01, 0x01,
285
+ 0x01, 0x01, 0x01, 0x01, 0x03, 0x07,
286
+ 0x0B, 0x06, 0x0B, 0x12});
287
+ } else {
288
+ check_asso = ____m256i((__m128i)v16u8{0x0D, 0x01, 0x01, 0x01, 0x01, 0x01,
289
+ 0x01, 0x01, 0x01, 0x01, 0x03, 0x07,
290
+ 0x0B, 0x0B, 0x0B, 0x0F});
291
+ }
292
+
293
+ __m256i check_values;
294
+ if (default_or_url) {
295
+
296
+ check_values = ____m256i(
297
+ (__m128i)v16i8{int8_t(0x80), int8_t(0x80), int8_t(0x80), int8_t(0x80),
298
+ int8_t(0xCF), int8_t(0xBF), int8_t(0xD5), int8_t(0xA6),
299
+ int8_t(0xB5), int8_t(0xA1), int8_t(0x00), int8_t(0x80),
300
+ int8_t(0x00), int8_t(0x80), int8_t(0x00), int8_t(0x80)});
301
+ } else if (base64_url) {
302
+ check_values = ____m256i(
303
+ (__m128i)v16i8{int8_t(0x0), int8_t(0x80), int8_t(0x80), int8_t(0x80),
304
+ int8_t(0xCF), int8_t(0xBF), int8_t(0xD3), int8_t(0xA6),
305
+ int8_t(0xB5), int8_t(0x86), int8_t(0xD0), int8_t(0x80),
306
+ int8_t(0xB0), int8_t(0x80), int8_t(0x0), int8_t(0x0)});
307
+ } else {
308
+ check_values = ____m256i(
309
+ (__m128i)v16i8{int8_t(0x80), int8_t(0x80), int8_t(0x80), int8_t(0x80),
310
+ int8_t(0xCF), int8_t(0xBF), int8_t(0xD5), int8_t(0xA6),
311
+ int8_t(0xB5), int8_t(0x86), int8_t(0xD1), int8_t(0x80),
312
+ int8_t(0xB1), int8_t(0x80), int8_t(0x91), int8_t(0x80)});
313
+ }
314
+
315
+ __m256i shifted = __lasx_xvsrli_b(*src, 3);
316
+ __m256i asso_index = __lasx_xvand_v(*src, __lasx_xvldi(0xF));
317
+ __m256i delta_hash = __lasx_xvavgr_bu(
318
+ __lasx_xvshuf_b(delta_asso, delta_asso, asso_index), shifted);
319
+ __m256i check_hash = __lasx_xvavgr_bu(
320
+ __lasx_xvshuf_b(check_asso, check_asso, asso_index), shifted);
321
+
322
+ __m256i out = __lasx_xvsadd_b(
323
+ __lasx_xvshuf_b(delta_values, delta_values, delta_hash), *src);
324
+ __m256i chk = __lasx_xvsadd_b(
325
+ __lasx_xvshuf_b(check_values, check_values, check_hash), *src);
326
+ __m256i chk_ltz = __lasx_xvmskltz_b(chk);
327
+ unsigned int mask = __lasx_xvpickve2gr_wu(chk_ltz, 0);
328
+ mask = mask | (__lsx_vpickve2gr_hu(lasx_extracti128_hi(chk_ltz), 0) << 16);
329
+ if (mask) {
330
+ __m256i ascii_space = __lasx_xvseq_b(
331
+ __lasx_xvshuf_b(ascii_space_tbl, ascii_space_tbl, asso_index), *src);
332
+ __m256i ascii_space_ltz = __lasx_xvmskltz_b(ascii_space);
333
+ unsigned int ascii_space_mask = __lasx_xvpickve2gr_wu(ascii_space_ltz, 0);
334
+ ascii_space_mask =
335
+ ascii_space_mask |
336
+ (__lsx_vpickve2gr_hu(lasx_extracti128_hi(ascii_space_ltz), 0) << 16);
337
+ *error |= (mask != ascii_space_mask);
338
+ }
339
+
340
+ *src = out;
341
+ return (uint32_t)mask;
342
+ }
343
+
344
+ template <bool base64_url, bool default_or_url>
345
+ static inline uint64_t to_base64_mask(block64 *b, bool *error) {
346
+ *error = 0;
347
+ uint64_t m0 =
348
+ to_base64_mask<base64_url, default_or_url>(&b->chunks[0], error);
349
+ uint64_t m1 =
350
+ to_base64_mask<base64_url, default_or_url>(&b->chunks[1], error);
351
+ return m0 | (m1 << 32);
352
+ }
353
+
354
+ static inline void copy_block(block64 *b, char *output) {
355
+ __lasx_xvst(b->chunks[0], reinterpret_cast<__m256i *>(output), 0);
356
+ __lasx_xvst(b->chunks[1], reinterpret_cast<__m256i *>(output), 32);
357
+ }
358
+
359
+ static inline uint64_t compress_block(block64 *b, uint64_t mask, char *output) {
360
+ uint64_t nmask = ~mask;
361
+ uint64_t count =
362
+ __lsx_vpickve2gr_d(__lsx_vpcnt_h(__lsx_vreplgr2vr_d(nmask)), 0);
363
+ uint16_t *count_ptr = (uint16_t *)&count;
364
+ compress(lasx_extracti128_lo(b->chunks[0]), uint16_t(mask), output);
365
+ compress(lasx_extracti128_hi(b->chunks[0]), uint16_t(mask >> 16),
366
+ output + count_ptr[0]);
367
+ compress(lasx_extracti128_lo(b->chunks[1]), uint16_t(mask >> 32),
368
+ output + count_ptr[0] + count_ptr[1]);
369
+ compress(lasx_extracti128_hi(b->chunks[1]), uint16_t(mask >> 48),
370
+ output + count_ptr[0] + count_ptr[1] + count_ptr[2]);
371
+ return count_ones(nmask);
372
+ }
373
+
374
+ template <typename T> bool is_power_of_two(T x) { return (x & (x - 1)) == 0; }
375
+
376
+ inline size_t compress_block_single(block64 *b, uint64_t mask, char *output) {
377
+ const size_t pos64 = trailing_zeroes(mask);
378
+ const int8_t pos = pos64 & 0xf;
379
+
380
+ // Predefine the index vector
381
+ const v16u8 v1 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
382
+
383
+ switch (pos64 >> 4) {
384
+ case 0b00: {
385
+ const __m128i lane0 = lasx_extracti128_lo(b->chunks[0]);
386
+ const __m128i lane1 = lasx_extracti128_hi(b->chunks[0]);
387
+
388
+ const __m128i v0 = __lsx_vreplgr2vr_b((uint8_t)(pos - 1));
389
+ const __m128i v2 = __lsx_vslt_b(v0, (__m128i)v1); // v1 > v0
390
+ const __m128i sh = __lsx_vsub_b((__m128i)v1, v2);
391
+ const __m128i compressed = __lsx_vshuf_b(lane0, lane0, sh);
392
+
393
+ __lsx_vst(compressed, reinterpret_cast<__m128i *>(output + 0 * 16), 0);
394
+ __lsx_vst(lane1, reinterpret_cast<__m128i *>(output + 1 * 16 - 1), 0);
395
+ __lasx_xvst(b->chunks[1], reinterpret_cast<__m256i *>(output + 2 * 16 - 1),
396
+ 0);
397
+ } break;
398
+ case 0b01: {
399
+ const __m128i lane0 = lasx_extracti128_lo(b->chunks[0]);
400
+ const __m128i lane1 = lasx_extracti128_hi(b->chunks[0]);
401
+ __lsx_vst(lane0, reinterpret_cast<__m128i *>(output + 0 * 16), 0);
402
+
403
+ const __m128i v0 = __lsx_vreplgr2vr_b((uint8_t)(pos - 1));
404
+ const __m128i v2 = __lsx_vslt_b(v0, (__m128i)v1);
405
+ const __m128i sh = __lsx_vsub_b((__m128i)v1, v2);
406
+ const __m128i compressed = __lsx_vshuf_b(lane1, lane1, sh);
407
+
408
+ __lsx_vst(compressed, reinterpret_cast<__m128i *>(output + 1 * 16), 0);
409
+ __lasx_xvst(b->chunks[1], reinterpret_cast<__m256i *>(output + 2 * 16 - 1),
410
+ 0);
411
+ } break;
412
+ case 0b10: {
413
+ __lasx_xvst(b->chunks[0], reinterpret_cast<__m256i *>(output + 0 * 16), 0);
414
+
415
+ const __m128i lane2 = lasx_extracti128_lo(b->chunks[1]);
416
+ const __m128i lane3 = lasx_extracti128_hi(b->chunks[1]);
417
+
418
+ const __m128i v0 = __lsx_vreplgr2vr_b((uint8_t)(pos - 1));
419
+ const __m128i v2 = __lsx_vslt_b(v0, (__m128i)v1);
420
+ const __m128i sh = __lsx_vsub_b((__m128i)v1, v2);
421
+ const __m128i compressed = __lsx_vshuf_b(lane2, lane2, sh);
422
+
423
+ __lsx_vst(compressed, reinterpret_cast<__m128i *>(output + 2 * 16), 0);
424
+ __lsx_vst(lane3, reinterpret_cast<__m128i *>(output + 3 * 16 - 1), 0);
425
+ } break;
426
+ case 0b11: {
427
+ __lasx_xvst(b->chunks[0], reinterpret_cast<__m256i *>(output + 0 * 16), 0);
428
+ __lsx_vst(lasx_extracti128_lo(b->chunks[1]),
429
+ reinterpret_cast<__m128i *>(output + 2 * 16), 0);
430
+
431
+ const __m128i lane3 = lasx_extracti128_hi(b->chunks[1]);
432
+
433
+ const __m128i v0 = __lsx_vreplgr2vr_b((uint8_t)(pos - 1));
434
+ const __m128i v2 = __lsx_vslt_b(v0, (__m128i)v1);
435
+ const __m128i sh = __lsx_vsub_b((__m128i)v1, v2);
436
+ const __m128i compressed = __lsx_vshuf_b(lane3, lane3, sh);
437
+
438
+ __lsx_vst(compressed, reinterpret_cast<__m128i *>(output + 3 * 16), 0);
439
+ } break;
440
+ }
441
+ return 63;
442
+ }
443
+
444
+ // The caller of this function is responsible to ensure that there are 64 bytes
445
+ // available from reading at src. The data is read into a block64 structure.
446
+ static inline void load_block(block64 *b, const char *src) {
447
+ b->chunks[0] = __lasx_xvld(reinterpret_cast<const __m256i *>(src), 0);
448
+ b->chunks[1] = __lasx_xvld(reinterpret_cast<const __m256i *>(src), 32);
449
+ }
450
+
451
+ // The caller of this function is responsible to ensure that there are 128 bytes
452
+ // available from reading at src. The data is read into a block64 structure.
453
+ static inline void load_block(block64 *b, const char16_t *src) {
454
+ __m256i m1 = __lasx_xvld(reinterpret_cast<const __m256i *>(src), 0);
455
+ __m256i m2 = __lasx_xvld(reinterpret_cast<const __m256i *>(src), 32);
456
+ __m256i m3 = __lasx_xvld(reinterpret_cast<const __m256i *>(src), 64);
457
+ __m256i m4 = __lasx_xvld(reinterpret_cast<const __m256i *>(src), 96);
458
+ b->chunks[0] = __lasx_xvpermi_d(__lasx_xvssrlni_bu_h(m2, m1, 0), 0b11011000);
459
+ b->chunks[1] = __lasx_xvpermi_d(__lasx_xvssrlni_bu_h(m4, m3, 0), 0b11011000);
460
+ }
461
+
462
+ static inline void base64_decode(char *out, __m256i str) {
463
+ __m256i t0 = __lasx_xvor_v(
464
+ __lasx_xvslli_w(str, 26),
465
+ __lasx_xvslli_w(__lasx_xvand_v(str, lasx_splat_u32(0x0000ff00)), 12));
466
+ __m256i t1 =
467
+ __lasx_xvsrli_w(__lasx_xvand_v(str, lasx_splat_u32(0x003f0000)), 2);
468
+ __m256i t2 = __lasx_xvor_v(t0, t1);
469
+ __m256i t3 = __lasx_xvor_v(t2, __lasx_xvsrli_w(str, 16));
470
+ __m256i pack_shuffle = ____m256i(
471
+ (__m128i)v16u8{3, 2, 1, 7, 6, 5, 11, 10, 9, 15, 14, 13, 0, 0, 0, 0});
472
+ t3 = __lasx_xvshuf_b(t3, t3, (__m256i)pack_shuffle);
473
+
474
+ // Store the output:
475
+ __lsx_vst(lasx_extracti128_lo(t3), out, 0);
476
+ __lsx_vst(lasx_extracti128_hi(t3), out, 12);
477
+ }
478
+ // decode 64 bytes and output 48 bytes
479
+ static inline void base64_decode_block(char *out, const char *src) {
480
+ base64_decode(out, __lasx_xvld(reinterpret_cast<const __m256i *>(src), 0));
481
+ base64_decode(out + 24,
482
+ __lasx_xvld(reinterpret_cast<const __m256i *>(src), 32));
483
+ }
484
+
485
+ static inline void base64_decode_block_safe(char *out, const char *src) {
486
+ base64_decode(out, __lasx_xvld(reinterpret_cast<const __m256i *>(src), 0));
487
+ alignas(32) char buffer[32];
488
+ base64_decode(buffer,
489
+ __lasx_xvld(reinterpret_cast<const __m256i *>(src), 32));
490
+ std::memcpy(out + 24, buffer, 24);
491
+ }
492
+
493
+ static inline void base64_decode_block(char *out, block64 *b) {
494
+ base64_decode(out, b->chunks[0]);
495
+ base64_decode(out + 24, b->chunks[1]);
496
+ }
497
+ static inline void base64_decode_block_safe(char *out, block64 *b) {
498
+ base64_decode(out, b->chunks[0]);
499
+ alignas(32) char buffer[32];
500
+ base64_decode(buffer, b->chunks[1]);
501
+ std::memcpy(out + 24, buffer, 24);
502
+ }
503
+
504
+ template <bool base64_url, bool ignore_garbage, bool default_or_url,
505
+ typename chartype>
506
+ full_result
507
+ compress_decode_base64(char *dst, const chartype *src, size_t srclen,
508
+ base64_options options,
509
+ last_chunk_handling_options last_chunk_options) {
510
+ const uint8_t *to_base64 =
511
+ default_or_url ? tables::base64::to_base64_default_or_url_value
512
+ : (base64_url ? tables::base64::to_base64_url_value
513
+ : tables::base64::to_base64_value);
514
+ auto ri = simdutf::scalar::base64::find_end(src, srclen, options);
515
+ size_t equallocation = ri.equallocation;
516
+ size_t equalsigns = ri.equalsigns;
517
+ srclen = ri.srclen;
518
+ size_t full_input_length = ri.full_input_length;
519
+ if (srclen == 0) {
520
+ if (!ignore_garbage && equalsigns > 0) {
521
+ return {INVALID_BASE64_CHARACTER, equallocation, 0};
522
+ }
523
+ return {SUCCESS, full_input_length, 0};
524
+ }
525
+ char *end_of_safe_64byte_zone =
526
+ (srclen + 3) / 4 * 3 >= 63 ? dst + (srclen + 3) / 4 * 3 - 63 : dst;
527
+
528
+ const chartype *const srcinit = src;
529
+ const char *const dstinit = dst;
530
+ const chartype *const srcend = src + srclen;
531
+
532
+ constexpr size_t block_size = 6;
533
+ static_assert(block_size >= 2, "block_size must be at least two");
534
+ char buffer[block_size * 64];
535
+ char *bufferptr = buffer;
536
+ if (srclen >= 64) {
537
+ const chartype *const srcend64 = src + srclen - 64;
538
+ while (src <= srcend64) {
539
+ block64 b;
540
+ load_block(&b, src);
541
+ src += 64;
542
+ bool error = false;
543
+ uint64_t badcharmask =
544
+ to_base64_mask<base64_url, default_or_url>(&b, &error);
545
+ if (error && !ignore_garbage) {
546
+ src -= 64;
547
+ while (src < srcend && scalar::base64::is_eight_byte(*src) &&
548
+ to_base64[uint8_t(*src)] <= 64) {
549
+ src++;
550
+ }
551
+ return {error_code::INVALID_BASE64_CHARACTER, size_t(src - srcinit),
552
+ size_t(dst - dstinit)};
553
+ }
554
+ if (badcharmask != 0) {
555
+ if (is_power_of_two(badcharmask)) {
556
+ bufferptr += compress_block_single(&b, badcharmask, bufferptr);
557
+ } else {
558
+ bufferptr += compress_block(&b, badcharmask, bufferptr);
559
+ }
560
+ } else if (bufferptr != buffer) {
561
+ copy_block(&b, bufferptr);
562
+ bufferptr += 64;
563
+ } else {
564
+ if (dst >= end_of_safe_64byte_zone) {
565
+ base64_decode_block_safe(dst, &b);
566
+ } else {
567
+ base64_decode_block(dst, &b);
568
+ }
569
+ dst += 48;
570
+ }
571
+ if (bufferptr >= (block_size - 1) * 64 + buffer) {
572
+ for (size_t i = 0; i < (block_size - 2); i++) {
573
+ base64_decode_block(dst, buffer + i * 64);
574
+ dst += 48;
575
+ }
576
+ if (dst >= end_of_safe_64byte_zone) {
577
+ base64_decode_block_safe(dst, buffer + (block_size - 2) * 64);
578
+ } else {
579
+ base64_decode_block(dst, buffer + (block_size - 2) * 64);
580
+ }
581
+ dst += 48;
582
+ std::memcpy(buffer, buffer + (block_size - 1) * 64,
583
+ 64); // 64 might be too much
584
+ bufferptr -= (block_size - 1) * 64;
585
+ }
586
+ }
587
+ }
588
+
589
+ char *buffer_start = buffer;
590
+ // Optimization note: if this is almost full, then it is worth our
591
+ // time, otherwise, we should just decode directly.
592
+ int last_block = (int)((bufferptr - buffer_start) % 64);
593
+ if (last_block != 0 && srcend - src + last_block >= 64) {
594
+
595
+ while ((bufferptr - buffer_start) % 64 != 0 && src < srcend) {
596
+ uint8_t val = to_base64[uint8_t(*src)];
597
+ *bufferptr = char(val);
598
+ if ((!scalar::base64::is_eight_byte(*src) || val > 64) &&
599
+ !ignore_garbage) {
600
+ return {error_code::INVALID_BASE64_CHARACTER, size_t(src - srcinit),
601
+ size_t(dst - dstinit)};
602
+ }
603
+ bufferptr += (val <= 63);
604
+ src++;
605
+ }
606
+ }
607
+
608
+ for (; buffer_start + 64 <= bufferptr; buffer_start += 64) {
609
+ if (dst >= end_of_safe_64byte_zone) {
610
+ base64_decode_block_safe(dst, buffer_start);
611
+ } else {
612
+ base64_decode_block(dst, buffer_start);
613
+ }
614
+ dst += 48;
615
+ }
616
+ if ((bufferptr - buffer_start) % 64 != 0) {
617
+ while (buffer_start + 4 < bufferptr) {
618
+ uint32_t triple = ((uint32_t(uint8_t(buffer_start[0])) << 3 * 6) +
619
+ (uint32_t(uint8_t(buffer_start[1])) << 2 * 6) +
620
+ (uint32_t(uint8_t(buffer_start[2])) << 1 * 6) +
621
+ (uint32_t(uint8_t(buffer_start[3])) << 0 * 6))
622
+ << 8;
623
+ // lasx is little-endian
624
+ triple = scalar::u32_swap_bytes(triple);
625
+ std::memcpy(dst, &triple, 4);
626
+
627
+ dst += 3;
628
+ buffer_start += 4;
629
+ }
630
+ if (buffer_start + 4 <= bufferptr) {
631
+ uint32_t triple = ((uint32_t(uint8_t(buffer_start[0])) << 3 * 6) +
632
+ (uint32_t(uint8_t(buffer_start[1])) << 2 * 6) +
633
+ (uint32_t(uint8_t(buffer_start[2])) << 1 * 6) +
634
+ (uint32_t(uint8_t(buffer_start[3])) << 0 * 6))
635
+ << 8;
636
+ // lasx is little-endian
637
+ triple = scalar::u32_swap_bytes(triple);
638
+ std::memcpy(dst, &triple, 3);
639
+
640
+ dst += 3;
641
+ buffer_start += 4;
642
+ }
643
+ // we may have 1, 2 or 3 bytes left and we need to decode them so let us
644
+ // backtrack
645
+ int leftover = int(bufferptr - buffer_start);
646
+ while (leftover > 0) {
647
+ if (!ignore_garbage) {
648
+ while (to_base64[uint8_t(*(src - 1))] == 64) {
649
+ src--;
650
+ }
651
+ } else {
652
+ while (to_base64[uint8_t(*(src - 1))] >= 64) {
653
+ src--;
654
+ }
655
+ }
656
+ src--;
657
+ leftover--;
658
+ }
659
+ }
660
+ if (src < srcend + equalsigns) {
661
+ full_result r = scalar::base64::base64_tail_decode(
662
+ dst, src, srcend - src, equalsigns, options, last_chunk_options);
663
+ r = scalar::base64::patch_tail_result(
664
+ r, size_t(src - srcinit), size_t(dst - dstinit), equallocation,
665
+ full_input_length, last_chunk_options);
666
+ // When is_partial(last_chunk_options) is true, we must either end with
667
+ // the end of the stream (beyond whitespace) or right after a non-ignorable
668
+ // character or at the very beginning of the stream.
669
+ // See https://tc39.es/proposal-arraybuffer-base64/spec/#sec-frombase64
670
+ if (is_partial(last_chunk_options) && r.error == error_code::SUCCESS &&
671
+ r.input_count < full_input_length) {
672
+ // First check if we can extend the input to the end of the stream
673
+ while (r.input_count < full_input_length &&
674
+ base64_ignorable(*(srcinit + r.input_count), options)) {
675
+ r.input_count++;
676
+ }
677
+ // If we are still not at the end of the stream, then we must backtrack
678
+ // to the last non-ignorable character.
679
+ if (r.input_count < full_input_length) {
680
+ while (r.input_count > 0 &&
681
+ base64_ignorable(*(srcinit + r.input_count - 1), options)) {
682
+ r.input_count--;
683
+ }
684
+ }
685
+ }
686
+ return r;
687
+ }
688
+ if (equalsigns > 0 && !ignore_garbage) {
689
+ if ((size_t(dst - dstinit) % 3 == 0) ||
690
+ ((size_t(dst - dstinit) % 3) + 1 + equalsigns != 4)) {
691
+ return {INVALID_BASE64_CHARACTER, equallocation, size_t(dst - dstinit)};
692
+ }
693
+ }
694
+ return {SUCCESS, srclen, size_t(dst - dstinit)};
695
+ }