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,19 @@
1
+ // file included directly
2
+
3
+ bool validate_ascii(const char *buf, size_t len) {
4
+ const char *end = buf + len;
5
+ const __m512i ascii = _mm512_set1_epi8((uint8_t)0x80);
6
+ __m512i running_or = _mm512_setzero_si512();
7
+ for (; end - buf >= 64; buf += 64) {
8
+ const __m512i utf8 = _mm512_loadu_si512((const __m512i *)buf);
9
+ running_or = _mm512_ternarylogic_epi32(running_or, utf8, ascii,
10
+ 0xf8); // running_or | (utf8 & ascii)
11
+ }
12
+ if (buf < end) {
13
+ const __m512i utf8 = _mm512_maskz_loadu_epi8(
14
+ (uint64_t(1) << (end - buf)) - 1, (const __m512i *)buf);
15
+ running_or = _mm512_ternarylogic_epi32(running_or, utf8, ascii,
16
+ 0xf8); // running_or | (utf8 & ascii)
17
+ }
18
+ return (_mm512_test_epi8_mask(running_or, running_or) == 0);
19
+ }
@@ -0,0 +1,630 @@
1
+ // file included directly
2
+ /**
3
+ * References and further reading:
4
+ *
5
+ * Wojciech Muła, Daniel Lemire, Base64 encoding and decoding at almost the
6
+ * speed of a memory copy, Software: Practice and Experience 50 (2), 2020.
7
+ * https://arxiv.org/abs/1910.05109
8
+ *
9
+ * Wojciech Muła, Daniel Lemire, Faster Base64 Encoding and Decoding using AVX2
10
+ * Instructions, ACM Transactions on the Web 12 (3), 2018.
11
+ * https://arxiv.org/abs/1704.00605
12
+ *
13
+ * Simon Josefsson. 2006. The Base16, Base32, and Base64 Data Encodings.
14
+ * https://tools.ietf.org/html/rfc4648. (2006). Internet Engineering Task Force,
15
+ * Request for Comments: 4648.
16
+ *
17
+ * Alfred Klomp. 2014a. Fast Base64 encoding/decoding with SSE vectorization.
18
+ * http://www.alfredklomp.com/programming/sse-base64/. (2014).
19
+ *
20
+ * Alfred Klomp. 2014b. Fast Base64 stream encoder/decoder in C99, with SIMD
21
+ * acceleration. https://github.com/aklomp/base64. (2014).
22
+ *
23
+ * Hanson Char. 2014. A Fast and Correct Base 64 Codec. (2014).
24
+ * https://aws.amazon.com/blogs/developer/a-fast-and-correct-base-64-codec/
25
+ *
26
+ * Nick Kopp. 2013. Base64 Encoding on a GPU.
27
+ * https://www.codeproject.com/Articles/276993/Base-Encoding-on-a-GPU. (2013).
28
+ */
29
+
30
+ struct block64 {
31
+ __m512i chunks[1];
32
+ };
33
+
34
+ template <bool base64_url, bool use_lines>
35
+ size_t encode_base64_impl(char *dst, const char *src, size_t srclen,
36
+ base64_options options,
37
+ size_t line_length = simdutf::default_line_length) {
38
+ size_t offset = 0;
39
+ if (line_length < 4) {
40
+ line_length = 4; // We do not support line_length less than 4
41
+ }
42
+ // credit: Wojciech Muła
43
+ const uint8_t *input = (const uint8_t *)src;
44
+
45
+ uint8_t *out = (uint8_t *)dst;
46
+ static const char *lookup_tbl =
47
+ base64_url
48
+ ? "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
49
+ : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
50
+ const __m512i shuffle_input = _mm512_setr_epi32(
51
+ 0x01020001, 0x04050304, 0x07080607, 0x0a0b090a, 0x0d0e0c0d, 0x10110f10,
52
+ 0x13141213, 0x16171516, 0x191a1819, 0x1c1d1b1c, 0x1f201e1f, 0x22232122,
53
+ 0x25262425, 0x28292728, 0x2b2c2a2b, 0x2e2f2d2e);
54
+ const __m512i lookup =
55
+ _mm512_loadu_si512(reinterpret_cast<const __m512i *>(lookup_tbl));
56
+ const __m512i multi_shifts = _mm512_set1_epi64(UINT64_C(0x3036242a1016040a));
57
+ size_t size = srclen;
58
+ __mmask64 input_mask = 0xffffffffffff; // (1 << 48) - 1
59
+ // We want that input == end_input means that we must stop.
60
+ const uint8_t *end_input = input + (size - (size % 48));
61
+ while (input != end_input) {
62
+ const __m512i v = _mm512_maskz_loadu_epi8(
63
+ input_mask, reinterpret_cast<const __m512i *>(input));
64
+ const __m512i in = _mm512_permutexvar_epi8(shuffle_input, v);
65
+ const __m512i indices = _mm512_multishift_epi64_epi8(multi_shifts, in);
66
+ const __m512i result = _mm512_permutexvar_epi8(indices, lookup);
67
+ if (use_lines) {
68
+ if (offset + 64 > line_length) {
69
+ if (line_length >= 64) {
70
+ __m512i expanded = _mm512_mask_expand_epi8(
71
+ _mm512_set1_epi8('\n'), ~(1ULL << ((line_length - offset))),
72
+ result);
73
+ _mm512_storeu_si512(reinterpret_cast<__m512i *>(out), expanded);
74
+ __m128i last_lane =
75
+ _mm512_extracti32x4_epi32(result, 3); // Lane 3 (bytes 48-63)
76
+ uint8_t last_byte =
77
+ static_cast<uint8_t>(_mm_extract_epi8(last_lane, 15));
78
+ out[64] = last_byte;
79
+ out += 65;
80
+ offset = 64 - (line_length - offset);
81
+ } else { // slow path
82
+ alignas(64) uint8_t local_buffer[64];
83
+ _mm512_storeu_si512(reinterpret_cast<__m512i *>(local_buffer),
84
+ result);
85
+ size_t out_pos = 0;
86
+ size_t local_offset = offset;
87
+ for (size_t j = 0; j < 64;) {
88
+ if (local_offset == line_length) {
89
+ out[out_pos++] = '\n';
90
+ local_offset = 0;
91
+ }
92
+ out[out_pos++] = local_buffer[j++];
93
+ local_offset++;
94
+ }
95
+ offset = local_offset;
96
+ out += out_pos;
97
+ }
98
+ } else {
99
+ _mm512_storeu_si512(reinterpret_cast<__m512i *>(out), result);
100
+ offset += 64;
101
+ out += 64;
102
+ }
103
+ } else {
104
+ _mm512_storeu_si512(reinterpret_cast<__m512i *>(out), result);
105
+ out += 64;
106
+ }
107
+ input += 48;
108
+ }
109
+ size = size % 48;
110
+
111
+ input_mask = ((__mmask64)1 << size) - 1;
112
+ const __m512i v = _mm512_maskz_loadu_epi8(
113
+ input_mask, reinterpret_cast<const __m512i *>(input));
114
+ const __m512i in = _mm512_permutexvar_epi8(shuffle_input, v);
115
+ const __m512i indices = _mm512_multishift_epi64_epi8(multi_shifts, in);
116
+ bool padding_needed =
117
+ (((options & base64_url) == 0) ^
118
+ ((options & base64_reverse_padding) == base64_reverse_padding));
119
+ size_t padding_amount = ((size % 3) > 0) ? (3 - (size % 3)) : 0;
120
+ size_t output_len = ((size + 2) / 3) * 4;
121
+ size_t non_padded_output_len = output_len - padding_amount;
122
+ if (!padding_needed) {
123
+ output_len = non_padded_output_len;
124
+ }
125
+ // If no output, we are done.
126
+ if (output_len == 0) {
127
+ return (size_t)(out - (uint8_t *)dst);
128
+ }
129
+ __mmask64 output_mask = 0xFFFFFFFFFFFFFFFF >> (64 - output_len);
130
+ __m512i result = _mm512_mask_permutexvar_epi8(
131
+ _mm512_set1_epi8('='), ((__mmask64)1 << non_padded_output_len) - 1,
132
+ indices, lookup);
133
+ if (use_lines) {
134
+ if (offset + output_len > line_length) {
135
+ if (line_length >= 64) {
136
+ __m512i expanded = _mm512_mask_expand_epi8(
137
+ _mm512_set1_epi8('\n'), ~(1ULL << ((line_length - offset))),
138
+ result);
139
+ if (output_len == 64) {
140
+ _mm512_storeu_si512(reinterpret_cast<__m512i *>(out), expanded);
141
+ out += 64;
142
+ _mm512_mask_storeu_epi8(reinterpret_cast<__m512i *>(out - 63),
143
+ 1ULL << 63, result);
144
+ out++;
145
+ } else {
146
+ output_mask = 0xFFFFFFFFFFFFFFFF >> (64 - output_len - 1);
147
+ _mm512_mask_storeu_epi8(reinterpret_cast<__m512i *>(out), output_mask,
148
+ expanded);
149
+ out += output_len + 1;
150
+ }
151
+ } else {
152
+ alignas(64) uint8_t local_buffer[64];
153
+ _mm512_storeu_si512(reinterpret_cast<__m512i *>(local_buffer), result);
154
+ size_t out_pos = 0;
155
+ size_t local_offset = offset;
156
+ for (size_t j = 0; j < output_len;) {
157
+ if (local_offset == line_length) {
158
+ out[out_pos++] = '\n';
159
+ local_offset = 0;
160
+ }
161
+ out[out_pos++] = local_buffer[j++];
162
+ local_offset++;
163
+ }
164
+ offset = local_offset;
165
+ out += out_pos;
166
+ }
167
+ } else {
168
+ _mm512_mask_storeu_epi8(reinterpret_cast<__m512i *>(out), output_mask,
169
+ result);
170
+ out += output_len;
171
+ }
172
+ } else {
173
+ _mm512_mask_storeu_epi8(reinterpret_cast<__m512i *>(out), output_mask,
174
+ result);
175
+ out += output_len;
176
+ }
177
+ return (size_t)(out - (uint8_t *)dst);
178
+ }
179
+
180
+ template <bool base64_url>
181
+ size_t encode_base64(char *dst, const char *src, size_t srclen,
182
+ base64_options options) {
183
+ return encode_base64_impl<base64_url, false>(dst, src, srclen, options);
184
+ }
185
+
186
+ template <bool base64_url, bool ignore_garbage, bool default_or_url>
187
+ static inline uint64_t to_base64_mask(block64 *b, uint64_t *error,
188
+ uint64_t input_mask = UINT64_MAX) {
189
+ __m512i input = b->chunks[0];
190
+ const __m512i ascii_space_tbl = _mm512_set_epi8(
191
+ 0, 0, 13, 12, 0, 10, 9, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 13, 12, 0, 10,
192
+ 9, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 13, 12, 0, 10, 9, 0, 0, 0, 0, 0, 0,
193
+ 0, 0, 32, 0, 0, 13, 12, 0, 10, 9, 0, 0, 0, 0, 0, 0, 0, 0, 32);
194
+ __m512i lookup0;
195
+ if (default_or_url) {
196
+ lookup0 = _mm512_set_epi8(
197
+ -128, -128, -128, -128, -128, -128, 61, 60, 59, 58, 57, 56, 55, 54, 53,
198
+ 52, 63, -128, 62, -128, 62, -128, -128, -128, -128, -128, -128, -128,
199
+ -128, -128, -128, -1, -128, -128, -128, -128, -128, -128, -128, -128,
200
+ -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -1, -128,
201
+ -128, -1, -1, -128, -128, -128, -128, -128, -128, -128, -128, -1);
202
+ } else if (base64_url) {
203
+ lookup0 = _mm512_set_epi8(
204
+ -128, -128, -128, -128, -128, -128, 61, 60, 59, 58, 57, 56, 55, 54, 53,
205
+ 52, -128, -128, 62, -128, -128, -128, -128, -128, -128, -128, -128,
206
+ -128, -128, -128, -128, -1, -128, -128, -128, -128, -128, -128, -128,
207
+ -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -1,
208
+ -128, -128, -1, -1, -128, -128, -128, -128, -128, -128, -128, -128, -1);
209
+ } else {
210
+ lookup0 = _mm512_set_epi8(
211
+ -128, -128, -128, -128, -128, -128, 61, 60, 59, 58, 57, 56, 55, 54, 53,
212
+ 52, 63, -128, -128, -128, 62, -128, -128, -128, -128, -128, -128, -128,
213
+ -128, -128, -128, -1, -128, -128, -128, -128, -128, -128, -128, -128,
214
+ -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -1, -128,
215
+ -128, -1, -1, -128, -128, -128, -128, -128, -128, -128, -128, -128);
216
+ }
217
+ __m512i lookup1;
218
+ if (default_or_url) {
219
+ lookup1 = _mm512_set_epi8(
220
+ -128, -128, -128, -128, -128, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42,
221
+ 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, -128,
222
+ 63, -128, -128, -128, -128, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15,
223
+ 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -128);
224
+ } else if (base64_url) {
225
+ lookup1 = _mm512_set_epi8(
226
+ -128, -128, -128, -128, -128, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42,
227
+ 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, -128,
228
+ 63, -128, -128, -128, -128, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15,
229
+ 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -128);
230
+ } else {
231
+ lookup1 = _mm512_set_epi8(
232
+ -128, -128, -128, -128, -128, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42,
233
+ 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, -128,
234
+ -128, -128, -128, -128, -128, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16,
235
+ 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -128);
236
+ }
237
+
238
+ const __m512i translated = _mm512_permutex2var_epi8(lookup0, input, lookup1);
239
+ const __m512i combined = _mm512_or_si512(translated, input);
240
+ const __mmask64 mask = _mm512_movepi8_mask(combined) & input_mask;
241
+ if (!ignore_garbage && mask) {
242
+ const __mmask64 spaces =
243
+ _mm512_cmpeq_epi8_mask(_mm512_shuffle_epi8(ascii_space_tbl, input),
244
+ input) &
245
+ input_mask;
246
+ *error = (mask ^ spaces);
247
+ }
248
+ b->chunks[0] = translated;
249
+
250
+ return mask | (~input_mask);
251
+ }
252
+
253
+ static inline void copy_block(block64 *b, char *output) {
254
+ _mm512_storeu_si512(reinterpret_cast<__m512i *>(output), b->chunks[0]);
255
+ }
256
+
257
+ static inline uint64_t compress_block(block64 *b, uint64_t mask, char *output) {
258
+ uint64_t nmask = ~mask;
259
+ __m512i c = _mm512_maskz_compress_epi8(nmask, b->chunks[0]);
260
+ _mm512_storeu_si512(reinterpret_cast<__m512i *>(output), c);
261
+ return _mm_popcnt_u64(nmask);
262
+ }
263
+
264
+ // The caller of this function is responsible to ensure that there are 64 bytes
265
+ // available from reading at src. The data is read into a block64 structure.
266
+ static inline void load_block(block64 *b, const char *src) {
267
+ b->chunks[0] = _mm512_loadu_si512(reinterpret_cast<const __m512i *>(src));
268
+ }
269
+
270
+ static inline void load_block_partial(block64 *b, const char *src,
271
+ __mmask64 input_mask) {
272
+ b->chunks[0] = _mm512_maskz_loadu_epi8(
273
+ input_mask, reinterpret_cast<const __m512i *>(src));
274
+ }
275
+
276
+ // The caller of this function is responsible to ensure that there are 128 bytes
277
+ // available from reading at src. The data is read into a block64 structure.
278
+ static inline void load_block(block64 *b, const char16_t *src) {
279
+ __m512i m1 = _mm512_loadu_si512(reinterpret_cast<const __m512i *>(src));
280
+ __m512i m2 = _mm512_loadu_si512(reinterpret_cast<const __m512i *>(src + 32));
281
+ __m512i p = _mm512_packus_epi16(m1, m2);
282
+ b->chunks[0] =
283
+ _mm512_permutexvar_epi64(_mm512_setr_epi64(0, 2, 4, 6, 1, 3, 5, 7), p);
284
+ }
285
+
286
+ static inline void load_block_partial(block64 *b, const char16_t *src,
287
+ __mmask64 input_mask) {
288
+ __m512i m1 = _mm512_maskz_loadu_epi16((__mmask32)input_mask,
289
+ reinterpret_cast<const __m512i *>(src));
290
+ __m512i m2 =
291
+ _mm512_maskz_loadu_epi16((__mmask32)(input_mask >> 32),
292
+ reinterpret_cast<const __m512i *>(src + 32));
293
+ __m512i p = _mm512_packus_epi16(m1, m2);
294
+ b->chunks[0] =
295
+ _mm512_permutexvar_epi64(_mm512_setr_epi64(0, 2, 4, 6, 1, 3, 5, 7), p);
296
+ }
297
+
298
+ static inline void base64_decode(char *out, __m512i str) {
299
+ const __m512i merge_ab_and_bc =
300
+ _mm512_maddubs_epi16(str, _mm512_set1_epi32(0x01400140));
301
+ const __m512i merged =
302
+ _mm512_madd_epi16(merge_ab_and_bc, _mm512_set1_epi32(0x00011000));
303
+ const __m512i pack = _mm512_set_epi8(
304
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 61, 62, 56, 57, 58,
305
+ 52, 53, 54, 48, 49, 50, 44, 45, 46, 40, 41, 42, 36, 37, 38, 32, 33, 34,
306
+ 28, 29, 30, 24, 25, 26, 20, 21, 22, 16, 17, 18, 12, 13, 14, 8, 9, 10, 4,
307
+ 5, 6, 0, 1, 2);
308
+ const __m512i shuffled = _mm512_permutexvar_epi8(pack, merged);
309
+ _mm512_mask_storeu_epi8(
310
+ (__m512i *)out, 0xffffffffffff,
311
+ shuffled); // mask would be 0xffffffffffff since we write 48 bytes.
312
+ }
313
+ // decode 64 bytes and output 48 bytes
314
+ static inline void base64_decode_block(char *out, const char *src) {
315
+ base64_decode(out,
316
+ _mm512_loadu_si512(reinterpret_cast<const __m512i *>(src)));
317
+ }
318
+ static inline void base64_decode_block(char *out, block64 *b) {
319
+ base64_decode(out, b->chunks[0]);
320
+ }
321
+
322
+ template <bool base64_url, bool ignore_garbage, bool default_or_url,
323
+ typename chartype>
324
+ full_result
325
+ compress_decode_base64(char *dst, const chartype *src, size_t srclen,
326
+ base64_options options,
327
+ last_chunk_handling_options last_chunk_options) {
328
+ (void)options;
329
+ const uint8_t *to_base64 =
330
+ default_or_url ? tables::base64::to_base64_default_or_url_value
331
+ : (base64_url ? tables::base64::to_base64_url_value
332
+ : tables::base64::to_base64_value);
333
+ auto ri = simdutf::scalar::base64::find_end(src, srclen, options);
334
+ size_t equallocation = ri.equallocation;
335
+ size_t padding_characters = ri.equalsigns;
336
+ srclen = ri.srclen;
337
+ size_t full_input_length = ri.full_input_length;
338
+ if (srclen == 0) {
339
+ if (!ignore_garbage && padding_characters > 0) {
340
+ return {INVALID_BASE64_CHARACTER, equallocation, 0};
341
+ }
342
+ return {SUCCESS, full_input_length, 0};
343
+ }
344
+ const chartype *const srcinit = src;
345
+ const char *const dstinit = dst;
346
+ const chartype *const srcend = src + srclen;
347
+
348
+ // figure out why block_size == 2 is sometimes best???
349
+ constexpr size_t block_size = 6;
350
+ char buffer[block_size * 64];
351
+ char *bufferptr = buffer;
352
+ if (srclen >= 64) {
353
+ const chartype *const srcend64 = src + srclen - 64;
354
+ while (src <= srcend64) {
355
+ block64 b;
356
+ load_block(&b, src);
357
+ src += 64;
358
+ uint64_t error = 0;
359
+ uint64_t badcharmask =
360
+ to_base64_mask<base64_url, ignore_garbage, default_or_url>(&b,
361
+ &error);
362
+ if (!ignore_garbage && error) {
363
+ src -= 64;
364
+ size_t error_offset = _tzcnt_u64(error);
365
+ return {error_code::INVALID_BASE64_CHARACTER,
366
+ size_t(src - srcinit + error_offset), size_t(dst - dstinit)};
367
+ }
368
+ if (badcharmask != 0) {
369
+ // optimization opportunity: check for simple masks like those made of
370
+ // continuous 1s followed by continuous 0s. And masks containing a
371
+ // single bad character.
372
+ bufferptr += compress_block(&b, badcharmask, bufferptr);
373
+ } else if (bufferptr != buffer) {
374
+ copy_block(&b, bufferptr);
375
+ bufferptr += 64;
376
+ } else {
377
+ base64_decode_block(dst, &b);
378
+ dst += 48;
379
+ }
380
+ if (bufferptr >= (block_size - 1) * 64 + buffer) {
381
+ for (size_t i = 0; i < (block_size - 1); i++) {
382
+ base64_decode_block(dst, buffer + i * 64);
383
+ dst += 48;
384
+ }
385
+ std::memcpy(buffer, buffer + (block_size - 1) * 64,
386
+ 64); // 64 might be too much
387
+ bufferptr -= (block_size - 1) * 64;
388
+ }
389
+ }
390
+ }
391
+
392
+ int last_block_len = (int)(srcend - src);
393
+ if (last_block_len != 0) {
394
+ __mmask64 input_mask = ((__mmask64)1 << last_block_len) - 1;
395
+ block64 b;
396
+ load_block_partial(&b, src, input_mask);
397
+ uint64_t error = 0;
398
+ uint64_t badcharmask =
399
+ to_base64_mask<base64_url, ignore_garbage, default_or_url>(&b, &error,
400
+ input_mask);
401
+ if (!ignore_garbage && error) {
402
+ size_t error_offset = _tzcnt_u64(error);
403
+ return {error_code::INVALID_BASE64_CHARACTER,
404
+ size_t(src - srcinit + error_offset), size_t(dst - dstinit)};
405
+ }
406
+ src += last_block_len;
407
+ bufferptr += compress_block(&b, badcharmask, bufferptr);
408
+ }
409
+
410
+ char *buffer_start = buffer;
411
+ for (; buffer_start + 64 <= bufferptr; buffer_start += 64) {
412
+ base64_decode_block(dst, buffer_start);
413
+ dst += 48;
414
+ }
415
+ if ((bufferptr - buffer_start) != 0) {
416
+ // For efficiency reasons, we end up reproducing much of the code
417
+ // in base64_tail_decode_impl. Better engineering would be to
418
+ // refactor the code so that we can call it without a performance hit.
419
+ size_t rem = (bufferptr - buffer_start);
420
+ int idx = rem % 4;
421
+ __mmask64 mask = ((__mmask64)1 << rem) - 1;
422
+ __m512i input = _mm512_maskz_loadu_epi8(mask, buffer_start);
423
+ size_t output_len = (rem / 4) * 3;
424
+ __mmask64 output_mask = mask >> (rem - output_len);
425
+ const __m512i merge_ab_and_bc =
426
+ _mm512_maddubs_epi16(input, _mm512_set1_epi32(0x01400140));
427
+ const __m512i merged =
428
+ _mm512_madd_epi16(merge_ab_and_bc, _mm512_set1_epi32(0x00011000));
429
+ const __m512i pack = _mm512_set_epi8(
430
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 61, 62, 56, 57, 58,
431
+ 52, 53, 54, 48, 49, 50, 44, 45, 46, 40, 41, 42, 36, 37, 38, 32, 33, 34,
432
+ 28, 29, 30, 24, 25, 26, 20, 21, 22, 16, 17, 18, 12, 13, 14, 8, 9, 10, 4,
433
+ 5, 6, 0, 1, 2);
434
+ const __m512i shuffled = _mm512_permutexvar_epi8(pack, merged);
435
+ // We never should have that the number of base64 characters + the
436
+ // number of padding characters is more than 4.
437
+ if (!ignore_garbage && (idx + padding_characters > 4)) {
438
+ return {INVALID_BASE64_CHARACTER, size_t(src - srcinit),
439
+ size_t(dst - dstinit), true};
440
+ }
441
+ // The idea here is that in loose mode,
442
+ // if there is padding at all, it must be used
443
+ // to form 4-wise chunk. However, in loose mode,
444
+ // we do accept no padding at all.
445
+ if (!ignore_garbage &&
446
+ last_chunk_options == last_chunk_handling_options::loose &&
447
+ (idx >= 2) && padding_characters > 0 &&
448
+ ((idx + padding_characters) & 3) != 0) {
449
+ return {INVALID_BASE64_CHARACTER, size_t(src - srcinit),
450
+ size_t(dst - dstinit), true};
451
+ } else
452
+ // The idea here is that in strict mode, we do not want to accept
453
+ // incomplete base64 chunks. So if the chunk was otherwise valid, we
454
+ // return BASE64_INPUT_REMAINDER.
455
+ if (!ignore_garbage &&
456
+ last_chunk_options == last_chunk_handling_options::strict &&
457
+ (idx >= 2) && ((idx + padding_characters) & 3) != 0) {
458
+ // The partial chunk was at src - idx
459
+ _mm512_mask_storeu_epi8((__m512i *)dst, output_mask, shuffled);
460
+ dst += output_len;
461
+ return {BASE64_INPUT_REMAINDER, equallocation, size_t(dst - dstinit)};
462
+ } else
463
+ // If there is a partial chunk with insufficient padding, with
464
+ // stop_before_partial, we need to just ignore it. In "only full" mode,
465
+ // skip the minute there are padding characters.
466
+ if ((last_chunk_options ==
467
+ last_chunk_handling_options::stop_before_partial &&
468
+ (padding_characters + idx < 4) && (idx != 0) &&
469
+ (idx >= 2 || padding_characters == 0)) ||
470
+ (last_chunk_options ==
471
+ last_chunk_handling_options::only_full_chunks &&
472
+ (idx >= 2 || padding_characters == 0))) {
473
+ _mm512_mask_storeu_epi8((__m512i *)dst, output_mask, shuffled);
474
+ dst += output_len;
475
+ // we need to rewind src to before the partial chunk
476
+ size_t characters_to_skip = idx;
477
+ while (characters_to_skip > 0) {
478
+ src--;
479
+ auto c = *src;
480
+ uint8_t code = to_base64[uint8_t(c)];
481
+ if (simdutf::scalar::base64::is_eight_byte(c) && code <= 63) {
482
+ characters_to_skip--;
483
+ }
484
+ }
485
+ // And then we need to skip ignored characters
486
+ // See https://github.com/simdutf/simdutf/issues/824
487
+ while (src > srcinit) {
488
+ auto c = *(src - 1);
489
+ uint8_t code = to_base64[uint8_t(c)];
490
+ if (simdutf::scalar::base64::is_eight_byte(c) && code <= 63) {
491
+ break;
492
+ }
493
+ src--;
494
+ }
495
+ return {SUCCESS, size_t(src - srcinit), size_t(dst - dstinit)};
496
+ } else {
497
+ if (idx == 2) {
498
+ if (!ignore_garbage &&
499
+ last_chunk_options == last_chunk_handling_options::strict) {
500
+ uint32_t triple = (uint32_t(bufferptr[-2]) << 3 * 6) +
501
+ (uint32_t(bufferptr[-1]) << 2 * 6);
502
+ if (triple & 0xffff) {
503
+ _mm512_mask_storeu_epi8((__m512i *)dst, output_mask, shuffled);
504
+ dst += output_len;
505
+ return {BASE64_EXTRA_BITS, size_t(src - srcinit),
506
+ size_t(dst - dstinit)};
507
+ }
508
+ }
509
+ output_mask = (output_mask << 1) | 1;
510
+ output_len += 1;
511
+ _mm512_mask_storeu_epi8((__m512i *)dst, output_mask, shuffled);
512
+ dst += output_len;
513
+ } else if (idx == 3) {
514
+ if (!ignore_garbage &&
515
+ last_chunk_options == last_chunk_handling_options::strict) {
516
+ uint32_t triple = (uint32_t(bufferptr[-3]) << 3 * 6) +
517
+ (uint32_t(bufferptr[-2]) << 2 * 6) +
518
+ (uint32_t(bufferptr[-1]) << 1 * 6);
519
+ if (triple & 0xff) {
520
+ _mm512_mask_storeu_epi8((__m512i *)dst, output_mask, shuffled);
521
+ dst += output_len;
522
+ return {BASE64_EXTRA_BITS, size_t(src - srcinit),
523
+ size_t(dst - dstinit)};
524
+ }
525
+ }
526
+ output_mask = (output_mask << 2) | 3;
527
+ output_len += 2;
528
+ _mm512_mask_storeu_epi8((__m512i *)dst, output_mask, shuffled);
529
+ dst += output_len;
530
+ } else if (!ignore_garbage && idx == 1 &&
531
+ (!is_partial(last_chunk_options) ||
532
+ (is_partial(last_chunk_options) &&
533
+ padding_characters > 0))) {
534
+ _mm512_mask_storeu_epi8((__m512i *)dst, output_mask, shuffled);
535
+ dst += output_len;
536
+ return {BASE64_INPUT_REMAINDER, size_t(src - srcinit),
537
+ size_t(dst - dstinit)};
538
+ } else if (!ignore_garbage && idx == 0 && padding_characters > 0) {
539
+ _mm512_mask_storeu_epi8((__m512i *)dst, output_mask, shuffled);
540
+ dst += output_len;
541
+ return {INVALID_BASE64_CHARACTER, equallocation,
542
+ size_t(dst - dstinit)};
543
+ } else {
544
+ _mm512_mask_storeu_epi8((__m512i *)dst, output_mask, shuffled);
545
+ dst += output_len;
546
+ }
547
+ }
548
+ if (!ignore_garbage && !is_partial(last_chunk_options) &&
549
+ padding_characters > 0) {
550
+ size_t output_count = size_t(dst - dstinit);
551
+ if ((output_count % 3 == 0) ||
552
+ ((output_count % 3) + 1 + padding_characters != 4)) {
553
+ return {INVALID_BASE64_CHARACTER, equallocation, output_count};
554
+ }
555
+ }
556
+ return {SUCCESS, full_input_length, size_t(dst - dstinit)};
557
+ }
558
+
559
+ if (!ignore_garbage && padding_characters > 0) {
560
+ if ((size_t(dst - dstinit) % 3 == 0) ||
561
+ ((size_t(dst - dstinit) % 3) + 1 + padding_characters != 4)) {
562
+ return {INVALID_BASE64_CHARACTER, equallocation, size_t(dst - dstinit)};
563
+ }
564
+ }
565
+ return {SUCCESS, srclen, size_t(dst - dstinit)};
566
+ }
567
+
568
+ simdutf_warn_unused size_t icelake_binary_length_from_base64(const char *input,
569
+ size_t length) {
570
+ size_t count = 0;
571
+ const char *ptr = input;
572
+ const char *end = input + length;
573
+
574
+ __m512i spaces = _mm512_set1_epi8(0x20);
575
+ while (ptr + 64 <= end) {
576
+ __m512i data = _mm512_loadu_si512(reinterpret_cast<const __m512i *>(ptr));
577
+ uint64_t mask = _mm512_cmpgt_epi8_mask(data, spaces);
578
+ count += count_ones(mask);
579
+ ptr += 64;
580
+ }
581
+
582
+ while (ptr < end) {
583
+ count += (*ptr > 0x20) ? 1 : 0;
584
+ ptr++;
585
+ }
586
+
587
+ size_t padding = 0;
588
+ size_t pos = length;
589
+ while (pos > 0 && padding < 2) {
590
+ char c = input[--pos];
591
+ if (c == '=') {
592
+ padding++;
593
+ } else if (c > ' ') {
594
+ break;
595
+ }
596
+ }
597
+ return ((count - padding) * 3) / 4;
598
+ }
599
+
600
+ simdutf_warn_unused size_t
601
+ icelake_binary_length_from_base64(const char16_t *input, size_t length) {
602
+ size_t count = 0;
603
+ const char16_t *ptr = input;
604
+ const char16_t *end = input + length;
605
+
606
+ __m512i spaces = _mm512_set1_epi16(0x20);
607
+ while (ptr + 32 <= end) {
608
+ __m512i data = _mm512_loadu_si512(reinterpret_cast<const __m512i *>(ptr));
609
+ __mmask32 mask = _mm512_cmpgt_epi16_mask(data, spaces);
610
+ count += _mm_popcnt_u32(mask);
611
+ ptr += 32;
612
+ }
613
+
614
+ while (ptr < end) {
615
+ count += (*ptr > 0x20) ? 1 : 0;
616
+ ptr++;
617
+ }
618
+
619
+ size_t padding = 0;
620
+ size_t pos = length;
621
+ while (pos > 0 && padding < 2) {
622
+ char16_t c = input[--pos];
623
+ if (c == '=') {
624
+ padding++;
625
+ } else if (c > ' ') {
626
+ break;
627
+ }
628
+ }
629
+ return ((count - padding) * 3) / 4;
630
+ }
@@ -0,0 +1,37 @@
1
+ // file included directly
2
+ /**
3
+ * Store the last N bytes of previous followed by 512-N bytes from input.
4
+ */
5
+ template <int N> __m512i prev(__m512i input, __m512i previous) {
6
+ static_assert(N <= 32, "N must be no larger than 32");
7
+ const __m512i movemask =
8
+ _mm512_setr_epi32(28, 29, 30, 31, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
9
+ const __m512i rotated = _mm512_permutex2var_epi32(input, movemask, previous);
10
+ #if SIMDUTF_GCC8 || SIMDUTF_GCC9
11
+ constexpr int shift = 16 - N; // workaround for GCC8,9
12
+ return _mm512_alignr_epi8(input, rotated, shift);
13
+ #else
14
+ return _mm512_alignr_epi8(input, rotated, 16 - N);
15
+ #endif // SIMDUTF_GCC8 || SIMDUTF_GCC9
16
+ }
17
+
18
+ template <unsigned idx0, unsigned idx1, unsigned idx2, unsigned idx3>
19
+ __m512i shuffle_epi128(__m512i v) {
20
+ static_assert((idx0 >= 0 && idx0 <= 3), "idx0 must be in range 0..3");
21
+ static_assert((idx1 >= 0 && idx1 <= 3), "idx1 must be in range 0..3");
22
+ static_assert((idx2 >= 0 && idx2 <= 3), "idx2 must be in range 0..3");
23
+ static_assert((idx3 >= 0 && idx3 <= 3), "idx3 must be in range 0..3");
24
+
25
+ constexpr unsigned shuffle = idx0 | (idx1 << 2) | (idx2 << 4) | (idx3 << 6);
26
+ return _mm512_shuffle_i32x4(v, v, shuffle);
27
+ }
28
+
29
+ template <unsigned idx> constexpr __m512i broadcast_epi128(__m512i v) {
30
+ return shuffle_epi128<idx, idx, idx, idx>(v);
31
+ }
32
+
33
+ simdutf_really_inline __m512i broadcast_128bit_lane(__m128i lane) {
34
+ const __m512i tmp = _mm512_castsi128_si512(lane);
35
+
36
+ return broadcast_epi128<0>(tmp);
37
+ }