visaljs 0.0.2 → 0.0.3

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 (1007) hide show
  1. package/cli.js +393 -62
  2. package/node/include/js_node.h +28 -5
  3. package/node/include/js_uv.h +36 -0
  4. package/node/prelude/crypto.js +7 -10
  5. package/node/prelude/dns.js +99 -0
  6. package/node/prelude/dns_promises.js +10 -0
  7. package/node/prelude/http.js +1039 -195
  8. package/node/prelude/internal/crypto/asym.js +39 -12
  9. package/node/prelude/internal/crypto/dh_groups.js +12 -0
  10. package/node/prelude/internal/crypto/diffiehellman.js +354 -0
  11. package/node/prelude/internal/crypto/hash.js +1 -1
  12. package/node/prelude/internal/crypto/key_type.js +3 -0
  13. package/node/prelude/internal/crypto/keys.js +39 -9
  14. package/node/prelude/internal/http_agent.js +249 -0
  15. package/node/prelude/internal/net.js +33 -0
  16. package/node/prelude/internal/socketaddress.js +249 -0
  17. package/node/prelude/internal/tls/common.js +306 -0
  18. package/node/prelude/internal/tls/wrap.js +1217 -0
  19. package/node/prelude/internal/tls/x509.js +394 -0
  20. package/node/prelude/net.js +1083 -50
  21. package/node/prelude/stream.js +6 -0
  22. package/node/prelude/tls.js +141 -0
  23. package/node/prelude/util.js +5 -2
  24. package/node/prelude/util_types.js +85 -0
  25. package/node/src/host_http.c +268 -270
  26. package/node/src/host_loop.c +84 -0
  27. package/node/src/host_net.c +495 -0
  28. package/node/src/host_sys.c +16 -0
  29. package/package.json +1 -1
  30. package/runtime/include/js_builtins.h +16 -0
  31. package/runtime/include/js_console.h +2 -0
  32. package/runtime/include/js_core.def +23 -0
  33. package/runtime/include/js_crypto.h +23 -0
  34. package/runtime/include/js_generator.h +2 -3
  35. package/runtime/include/js_promise.h +0 -2
  36. package/runtime/src/async_iter.c +4 -1
  37. package/runtime/src/boringssl_support.cc +34 -0
  38. package/runtime/src/builtin_table.c +8 -0
  39. package/runtime/src/components.c +10 -0
  40. package/runtime/src/console.c +6 -18
  41. package/runtime/src/core_all.c +1 -0
  42. package/runtime/src/crypto_asym.c +450 -241
  43. package/runtime/src/crypto_bn.c +91 -0
  44. package/runtime/src/crypto_cipher.c +153 -75
  45. package/runtime/src/crypto_hash.c +68 -53
  46. package/runtime/src/crypto_internal.h +55 -26
  47. package/runtime/src/crypto_pkey.c +198 -61
  48. package/runtime/src/crypto_subtle.c +42 -16
  49. package/runtime/src/crypto_tls.c +678 -0
  50. package/runtime/src/generator.c +8 -1
  51. package/runtime/src/global.c +2 -4
  52. package/runtime/src/internal.h +0 -1
  53. package/runtime/src/jobs.c +2 -1
  54. package/runtime/src/promise.c +4 -1
  55. package/runtime/src/tls_roots.gen.h +3215 -0
  56. package/runtime/src/util_types.c +52 -0
  57. package/runtime/src/weak.c +2 -1
  58. package/runtime/third_party/boringssl/LICENSE +238 -0
  59. package/runtime/third_party/boringssl/README.md +46 -0
  60. package/runtime/third_party/boringssl/VERSION +1 -0
  61. package/runtime/third_party/boringssl/crypto/aes/aes.cc +44 -0
  62. package/runtime/third_party/boringssl/crypto/armv8_feature_parsing.h +67 -0
  63. package/runtime/third_party/boringssl/crypto/asn1/a_bitstr.cc +297 -0
  64. package/runtime/third_party/boringssl/crypto/asn1/a_bool.cc +50 -0
  65. package/runtime/third_party/boringssl/crypto/asn1/a_d2i_fp.cc +47 -0
  66. package/runtime/third_party/boringssl/crypto/asn1/a_dup.cc +42 -0
  67. package/runtime/third_party/boringssl/crypto/asn1/a_gentm.cc +130 -0
  68. package/runtime/third_party/boringssl/crypto/asn1/a_i2d_fp.cc +44 -0
  69. package/runtime/third_party/boringssl/crypto/asn1/a_int.cc +467 -0
  70. package/runtime/third_party/boringssl/crypto/asn1/a_mbstr.cc +242 -0
  71. package/runtime/third_party/boringssl/crypto/asn1/a_object.cc +191 -0
  72. package/runtime/third_party/boringssl/crypto/asn1/a_octet.cc +32 -0
  73. package/runtime/third_party/boringssl/crypto/asn1/a_strex.cc +411 -0
  74. package/runtime/third_party/boringssl/crypto/asn1/a_strnid.cc +208 -0
  75. package/runtime/third_party/boringssl/crypto/asn1/a_time.cc +248 -0
  76. package/runtime/third_party/boringssl/crypto/asn1/a_type.cc +467 -0
  77. package/runtime/third_party/boringssl/crypto/asn1/a_utctm.cc +128 -0
  78. package/runtime/third_party/boringssl/crypto/asn1/asn1_lib.cc +453 -0
  79. package/runtime/third_party/boringssl/crypto/asn1/asn1_par.cc +61 -0
  80. package/runtime/third_party/boringssl/crypto/asn1/asn_pack.cc +56 -0
  81. package/runtime/third_party/boringssl/crypto/asn1/f_int.cc +63 -0
  82. package/runtime/third_party/boringssl/crypto/asn1/f_string.cc +52 -0
  83. package/runtime/third_party/boringssl/crypto/asn1/internal.h +430 -0
  84. package/runtime/third_party/boringssl/crypto/asn1/posix_time.cc +244 -0
  85. package/runtime/third_party/boringssl/crypto/asn1/tasn_dec.cc +611 -0
  86. package/runtime/third_party/boringssl/crypto/asn1/tasn_enc.cc +348 -0
  87. package/runtime/third_party/boringssl/crypto/asn1/tasn_fre.cc +163 -0
  88. package/runtime/third_party/boringssl/crypto/asn1/tasn_new.cc +274 -0
  89. package/runtime/third_party/boringssl/crypto/asn1/tasn_typ.cc +92 -0
  90. package/runtime/third_party/boringssl/crypto/asn1/tasn_utl.cc +218 -0
  91. package/runtime/third_party/boringssl/crypto/base64/base64.cc +433 -0
  92. package/runtime/third_party/boringssl/crypto/bcm_support.h +62 -0
  93. package/runtime/third_party/boringssl/crypto/bio/bio.cc +715 -0
  94. package/runtime/third_party/boringssl/crypto/bio/bio_mem.cc +260 -0
  95. package/runtime/third_party/boringssl/crypto/bio/connect.cc +463 -0
  96. package/runtime/third_party/boringssl/crypto/bio/errno.cc +52 -0
  97. package/runtime/third_party/boringssl/crypto/bio/fd.cc +193 -0
  98. package/runtime/third_party/boringssl/crypto/bio/file.cc +283 -0
  99. package/runtime/third_party/boringssl/crypto/bio/hexdump.cc +154 -0
  100. package/runtime/third_party/boringssl/crypto/bio/internal.h +128 -0
  101. package/runtime/third_party/boringssl/crypto/bio/pair.cc +426 -0
  102. package/runtime/third_party/boringssl/crypto/bio/printf.cc +59 -0
  103. package/runtime/third_party/boringssl/crypto/bio/socket.cc +210 -0
  104. package/runtime/third_party/boringssl/crypto/bio/socket_helper.cc +179 -0
  105. package/runtime/third_party/boringssl/crypto/blake2/blake2.cc +173 -0
  106. package/runtime/third_party/boringssl/crypto/bn/bn_asn1.cc +57 -0
  107. package/runtime/third_party/boringssl/crypto/bn/convert.cc +409 -0
  108. package/runtime/third_party/boringssl/crypto/bn/div.cc +102 -0
  109. package/runtime/third_party/boringssl/crypto/bn/exponentiation.cc +168 -0
  110. package/runtime/third_party/boringssl/crypto/bn/sqrt.cc +93 -0
  111. package/runtime/third_party/boringssl/crypto/buf/buf.cc +119 -0
  112. package/runtime/third_party/boringssl/crypto/bytestring/asn1_compat.cc +54 -0
  113. package/runtime/third_party/boringssl/crypto/bytestring/ber.cc +268 -0
  114. package/runtime/third_party/boringssl/crypto/bytestring/cbb.cc +787 -0
  115. package/runtime/third_party/boringssl/crypto/bytestring/cbs.cc +977 -0
  116. package/runtime/third_party/boringssl/crypto/bytestring/internal.h +134 -0
  117. package/runtime/third_party/boringssl/crypto/bytestring/unicode.cc +156 -0
  118. package/runtime/third_party/boringssl/crypto/chacha/chacha.cc +226 -0
  119. package/runtime/third_party/boringssl/crypto/chacha/internal.h +103 -0
  120. package/runtime/third_party/boringssl/crypto/cipher/derive_key.cc +106 -0
  121. package/runtime/third_party/boringssl/crypto/cipher/e_aesctrhmac.cc +294 -0
  122. package/runtime/third_party/boringssl/crypto/cipher/e_aeseax.cc +351 -0
  123. package/runtime/third_party/boringssl/crypto/cipher/e_aesgcmsiv.cc +918 -0
  124. package/runtime/third_party/boringssl/crypto/cipher/e_chacha20poly1305.cc +404 -0
  125. package/runtime/third_party/boringssl/crypto/cipher/e_des.cc +214 -0
  126. package/runtime/third_party/boringssl/crypto/cipher/e_null.cc +55 -0
  127. package/runtime/third_party/boringssl/crypto/cipher/e_rc2.cc +432 -0
  128. package/runtime/third_party/boringssl/crypto/cipher/e_rc4.cc +56 -0
  129. package/runtime/third_party/boringssl/crypto/cipher/e_tls.cc +615 -0
  130. package/runtime/third_party/boringssl/crypto/cipher/get_cipher.cc +85 -0
  131. package/runtime/third_party/boringssl/crypto/cipher/internal.h +399 -0
  132. package/runtime/third_party/boringssl/crypto/cipher/tls_cbc.cc +476 -0
  133. package/runtime/third_party/boringssl/crypto/cms/cms.cc +178 -0
  134. package/runtime/third_party/boringssl/crypto/conf/conf.cc +637 -0
  135. package/runtime/third_party/boringssl/crypto/conf/internal.h +54 -0
  136. package/runtime/third_party/boringssl/crypto/cpu_aarch64_apple.cc +76 -0
  137. package/runtime/third_party/boringssl/crypto/cpu_aarch64_fuchsia.cc +58 -0
  138. package/runtime/third_party/boringssl/crypto/cpu_aarch64_linux.cc +66 -0
  139. package/runtime/third_party/boringssl/crypto/cpu_aarch64_openbsd.cc +45 -0
  140. package/runtime/third_party/boringssl/crypto/cpu_aarch64_sysreg.cc +66 -0
  141. package/runtime/third_party/boringssl/crypto/cpu_aarch64_win.cc +52 -0
  142. package/runtime/third_party/boringssl/crypto/cpu_arm_freebsd.cc +55 -0
  143. package/runtime/third_party/boringssl/crypto/cpu_arm_linux.cc +173 -0
  144. package/runtime/third_party/boringssl/crypto/cpu_arm_linux.h +141 -0
  145. package/runtime/third_party/boringssl/crypto/cpu_intel.cc +287 -0
  146. package/runtime/third_party/boringssl/crypto/crypto.cc +152 -0
  147. package/runtime/third_party/boringssl/crypto/curve25519/asm/x25519-asm-arm.S +2124 -0
  148. package/runtime/third_party/boringssl/crypto/curve25519/cpace.cc +227 -0
  149. package/runtime/third_party/boringssl/crypto/curve25519/curve25519.cc +2436 -0
  150. package/runtime/third_party/boringssl/crypto/curve25519/curve25519_64_adx.cc +18 -0
  151. package/runtime/third_party/boringssl/crypto/curve25519/curve25519_tables.h +3264 -0
  152. package/runtime/third_party/boringssl/crypto/curve25519/internal.h +202 -0
  153. package/runtime/third_party/boringssl/crypto/curve25519/spake25519.cc +532 -0
  154. package/runtime/third_party/boringssl/crypto/des/des.cc +837 -0
  155. package/runtime/third_party/boringssl/crypto/des/internal.h +144 -0
  156. package/runtime/third_party/boringssl/crypto/dh/dh_asn1.cc +109 -0
  157. package/runtime/third_party/boringssl/crypto/dh/params.cc +411 -0
  158. package/runtime/third_party/boringssl/crypto/digest/digest_extra.cc +361 -0
  159. package/runtime/third_party/boringssl/crypto/dsa/dsa.cc +922 -0
  160. package/runtime/third_party/boringssl/crypto/dsa/dsa_asn1.cc +306 -0
  161. package/runtime/third_party/boringssl/crypto/dsa/internal.h +56 -0
  162. package/runtime/third_party/boringssl/crypto/ec/ec_asn1.cc +542 -0
  163. package/runtime/third_party/boringssl/crypto/ec/ec_derive.cc +94 -0
  164. package/runtime/third_party/boringssl/crypto/ec/hash_to_curve.cc +773 -0
  165. package/runtime/third_party/boringssl/crypto/ec/internal.h +114 -0
  166. package/runtime/third_party/boringssl/crypto/ecdh/ecdh.cc +75 -0
  167. package/runtime/third_party/boringssl/crypto/ecdsa/ecdsa_asn1.cc +337 -0
  168. package/runtime/third_party/boringssl/crypto/ecdsa/ecdsa_p1363.cc +54 -0
  169. package/runtime/third_party/boringssl/crypto/engine/engine.cc +95 -0
  170. package/runtime/third_party/boringssl/crypto/err/err.cc +820 -0
  171. package/runtime/third_party/boringssl/crypto/err/internal.h +45 -0
  172. package/runtime/third_party/boringssl/crypto/evp/evp.cc +454 -0
  173. package/runtime/third_party/boringssl/crypto/evp/evp_asn1.cc +439 -0
  174. package/runtime/third_party/boringssl/crypto/evp/evp_ctx.cc +541 -0
  175. package/runtime/third_party/boringssl/crypto/evp/evp_kem.cc +101 -0
  176. package/runtime/third_party/boringssl/crypto/evp/internal.h +427 -0
  177. package/runtime/third_party/boringssl/crypto/evp/p_dh.cc +326 -0
  178. package/runtime/third_party/boringssl/crypto/evp/p_dsa.cc +333 -0
  179. package/runtime/third_party/boringssl/crypto/evp/p_ec.cc +736 -0
  180. package/runtime/third_party/boringssl/crypto/evp/p_ed25519.cc +359 -0
  181. package/runtime/third_party/boringssl/crypto/evp/p_hkdf.cc +204 -0
  182. package/runtime/third_party/boringssl/crypto/evp/p_mldsa.cc +549 -0
  183. package/runtime/third_party/boringssl/crypto/evp/p_mlkem.cc +510 -0
  184. package/runtime/third_party/boringssl/crypto/evp/p_rsa.cc +1185 -0
  185. package/runtime/third_party/boringssl/crypto/evp/p_x25519.cc +371 -0
  186. package/runtime/third_party/boringssl/crypto/evp/p_xwing.cc +300 -0
  187. package/runtime/third_party/boringssl/crypto/evp/pbkdf.cc +105 -0
  188. package/runtime/third_party/boringssl/crypto/evp/print.cc +287 -0
  189. package/runtime/third_party/boringssl/crypto/evp/scrypt.cc +218 -0
  190. package/runtime/third_party/boringssl/crypto/evp/sign.cc +95 -0
  191. package/runtime/third_party/boringssl/crypto/ex_data.cc +140 -0
  192. package/runtime/third_party/boringssl/crypto/fipsmodule/aes/aes.cc.inc +208 -0
  193. package/runtime/third_party/boringssl/crypto/fipsmodule/aes/aes_nohw.cc.inc +1279 -0
  194. package/runtime/third_party/boringssl/crypto/fipsmodule/aes/cbc.cc.inc +132 -0
  195. package/runtime/third_party/boringssl/crypto/fipsmodule/aes/cfb.cc.inc +168 -0
  196. package/runtime/third_party/boringssl/crypto/fipsmodule/aes/ctr.cc.inc +102 -0
  197. package/runtime/third_party/boringssl/crypto/fipsmodule/aes/gcm.cc.inc +614 -0
  198. package/runtime/third_party/boringssl/crypto/fipsmodule/aes/gcm_nohw.cc.inc +304 -0
  199. package/runtime/third_party/boringssl/crypto/fipsmodule/aes/internal.h +590 -0
  200. package/runtime/third_party/boringssl/crypto/fipsmodule/aes/key_wrap.cc.inc +211 -0
  201. package/runtime/third_party/boringssl/crypto/fipsmodule/aes/mode_wrappers.cc.inc +97 -0
  202. package/runtime/third_party/boringssl/crypto/fipsmodule/aes/ofb.cc.inc +55 -0
  203. package/runtime/third_party/boringssl/crypto/fipsmodule/bcm.cc +288 -0
  204. package/runtime/third_party/boringssl/crypto/fipsmodule/bcm_interface.h +953 -0
  205. package/runtime/third_party/boringssl/crypto/fipsmodule/bn/add.cc.inc +276 -0
  206. package/runtime/third_party/boringssl/crypto/fipsmodule/bn/asm/x86_64-gcc.cc.inc +573 -0
  207. package/runtime/third_party/boringssl/crypto/fipsmodule/bn/bn.cc.inc +377 -0
  208. package/runtime/third_party/boringssl/crypto/fipsmodule/bn/bytes.cc.inc +230 -0
  209. package/runtime/third_party/boringssl/crypto/fipsmodule/bn/cmp.cc.inc +161 -0
  210. package/runtime/third_party/boringssl/crypto/fipsmodule/bn/ctx.cc.inc +127 -0
  211. package/runtime/third_party/boringssl/crypto/fipsmodule/bn/div.cc.inc +738 -0
  212. package/runtime/third_party/boringssl/crypto/fipsmodule/bn/div_extra.cc.inc +90 -0
  213. package/runtime/third_party/boringssl/crypto/fipsmodule/bn/exponentiation.cc.inc +743 -0
  214. package/runtime/third_party/boringssl/crypto/fipsmodule/bn/gcd.cc.inc +281 -0
  215. package/runtime/third_party/boringssl/crypto/fipsmodule/bn/gcd_extra.cc.inc +327 -0
  216. package/runtime/third_party/boringssl/crypto/fipsmodule/bn/generic.cc.inc +579 -0
  217. package/runtime/third_party/boringssl/crypto/fipsmodule/bn/internal.h +810 -0
  218. package/runtime/third_party/boringssl/crypto/fipsmodule/bn/jacobi.cc.inc +101 -0
  219. package/runtime/third_party/boringssl/crypto/fipsmodule/bn/montgomery.cc.inc +408 -0
  220. package/runtime/third_party/boringssl/crypto/fipsmodule/bn/montgomery_inv.cc.inc +179 -0
  221. package/runtime/third_party/boringssl/crypto/fipsmodule/bn/mul.cc.inc +347 -0
  222. package/runtime/third_party/boringssl/crypto/fipsmodule/bn/prime.cc.inc +931 -0
  223. package/runtime/third_party/boringssl/crypto/fipsmodule/bn/random.cc.inc +261 -0
  224. package/runtime/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.cc.inc +144 -0
  225. package/runtime/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.h +109 -0
  226. package/runtime/third_party/boringssl/crypto/fipsmodule/bn/shift.cc.inc +317 -0
  227. package/runtime/third_party/boringssl/crypto/fipsmodule/bn/sqrt.cc.inc +370 -0
  228. package/runtime/third_party/boringssl/crypto/fipsmodule/cipher/aead.cc.inc +619 -0
  229. package/runtime/third_party/boringssl/crypto/fipsmodule/cipher/cipher.cc.inc +837 -0
  230. package/runtime/third_party/boringssl/crypto/fipsmodule/cipher/e_aes.cc.inc +1240 -0
  231. package/runtime/third_party/boringssl/crypto/fipsmodule/cipher/e_aesccm.cc.inc +440 -0
  232. package/runtime/third_party/boringssl/crypto/fipsmodule/cipher/internal.h +461 -0
  233. package/runtime/third_party/boringssl/crypto/fipsmodule/cmac/cmac.cc.inc +293 -0
  234. package/runtime/third_party/boringssl/crypto/fipsmodule/delocate.h +95 -0
  235. package/runtime/third_party/boringssl/crypto/fipsmodule/dh/check.cc.inc +198 -0
  236. package/runtime/third_party/boringssl/crypto/fipsmodule/dh/dh.cc.inc +401 -0
  237. package/runtime/third_party/boringssl/crypto/fipsmodule/dh/internal.h +63 -0
  238. package/runtime/third_party/boringssl/crypto/fipsmodule/digest/digest.cc.inc +221 -0
  239. package/runtime/third_party/boringssl/crypto/fipsmodule/digest/digests.cc.inc +184 -0
  240. package/runtime/third_party/boringssl/crypto/fipsmodule/digest/internal.h +72 -0
  241. package/runtime/third_party/boringssl/crypto/fipsmodule/digest/md32_common.h +166 -0
  242. package/runtime/third_party/boringssl/crypto/fipsmodule/digestsign/digestsign.cc.inc +230 -0
  243. package/runtime/third_party/boringssl/crypto/fipsmodule/ec/builtin_curves.h +277 -0
  244. package/runtime/third_party/boringssl/crypto/fipsmodule/ec/ec.cc.inc +1024 -0
  245. package/runtime/third_party/boringssl/crypto/fipsmodule/ec/ec_key.cc.inc +536 -0
  246. package/runtime/third_party/boringssl/crypto/fipsmodule/ec/ec_montgomery.cc.inc +379 -0
  247. package/runtime/third_party/boringssl/crypto/fipsmodule/ec/felem.cc.inc +250 -0
  248. package/runtime/third_party/boringssl/crypto/fipsmodule/ec/internal.h +752 -0
  249. package/runtime/third_party/boringssl/crypto/fipsmodule/ec/oct.cc.inc +174 -0
  250. package/runtime/third_party/boringssl/crypto/fipsmodule/ec/p256-nistz-table.h +9502 -0
  251. package/runtime/third_party/boringssl/crypto/fipsmodule/ec/p256-nistz.cc.inc +740 -0
  252. package/runtime/third_party/boringssl/crypto/fipsmodule/ec/p256-nistz.h +207 -0
  253. package/runtime/third_party/boringssl/crypto/fipsmodule/ec/p256.cc.inc +578 -0
  254. package/runtime/third_party/boringssl/crypto/fipsmodule/ec/p256_table.h +297 -0
  255. package/runtime/third_party/boringssl/crypto/fipsmodule/ec/scalar.cc.inc +184 -0
  256. package/runtime/third_party/boringssl/crypto/fipsmodule/ec/simple.cc.inc +246 -0
  257. package/runtime/third_party/boringssl/crypto/fipsmodule/ec/simple_mul.cc.inc +274 -0
  258. package/runtime/third_party/boringssl/crypto/fipsmodule/ec/util.cc.inc +258 -0
  259. package/runtime/third_party/boringssl/crypto/fipsmodule/ec/wnaf.cc.inc +224 -0
  260. package/runtime/third_party/boringssl/crypto/fipsmodule/ecdh/ecdh.cc.inc +91 -0
  261. package/runtime/third_party/boringssl/crypto/fipsmodule/ecdsa/ecdsa.cc.inc +288 -0
  262. package/runtime/third_party/boringssl/crypto/fipsmodule/ecdsa/internal.h +57 -0
  263. package/runtime/third_party/boringssl/crypto/fipsmodule/entropy/internal.h +38 -0
  264. package/runtime/third_party/boringssl/crypto/fipsmodule/entropy/jitter.cc.inc +487 -0
  265. package/runtime/third_party/boringssl/crypto/fipsmodule/entropy/sha512.cc.inc +329 -0
  266. package/runtime/third_party/boringssl/crypto/fipsmodule/fips_shared_support.cc +28 -0
  267. package/runtime/third_party/boringssl/crypto/fipsmodule/hkdf/hkdf.cc.inc +114 -0
  268. package/runtime/third_party/boringssl/crypto/fipsmodule/hmac/hmac.cc.inc +218 -0
  269. package/runtime/third_party/boringssl/crypto/fipsmodule/keccak/internal.h +165 -0
  270. package/runtime/third_party/boringssl/crypto/fipsmodule/keccak/keccak.cc.inc +647 -0
  271. package/runtime/third_party/boringssl/crypto/fipsmodule/mldsa/fips_known_values.inc +1345 -0
  272. package/runtime/third_party/boringssl/crypto/fipsmodule/mldsa/mldsa.cc.inc +3323 -0
  273. package/runtime/third_party/boringssl/crypto/fipsmodule/mlkem/fips_known_values.inc +411 -0
  274. package/runtime/third_party/boringssl/crypto/fipsmodule/mlkem/mlkem.cc.inc +1856 -0
  275. package/runtime/third_party/boringssl/crypto/fipsmodule/rand/android_entropy_client.cc.inc +82 -0
  276. package/runtime/third_party/boringssl/crypto/fipsmodule/rand/ctrdrbg.cc.inc +401 -0
  277. package/runtime/third_party/boringssl/crypto/fipsmodule/rand/internal.h +99 -0
  278. package/runtime/third_party/boringssl/crypto/fipsmodule/rand/rand.cc.inc +486 -0
  279. package/runtime/third_party/boringssl/crypto/fipsmodule/rsa/internal.h +167 -0
  280. package/runtime/third_party/boringssl/crypto/fipsmodule/rsa/padding.cc.inc +371 -0
  281. package/runtime/third_party/boringssl/crypto/fipsmodule/rsa/rsa.cc.inc +996 -0
  282. package/runtime/third_party/boringssl/crypto/fipsmodule/rsa/rsa_impl.cc.inc +1000 -0
  283. package/runtime/third_party/boringssl/crypto/fipsmodule/self_check/fips.cc.inc +129 -0
  284. package/runtime/third_party/boringssl/crypto/fipsmodule/self_check/self_check.cc.inc +1093 -0
  285. package/runtime/third_party/boringssl/crypto/fipsmodule/service_indicator/internal.h +112 -0
  286. package/runtime/third_party/boringssl/crypto/fipsmodule/service_indicator/service_indicator.cc.inc +330 -0
  287. package/runtime/third_party/boringssl/crypto/fipsmodule/sha/internal.h +205 -0
  288. package/runtime/third_party/boringssl/crypto/fipsmodule/sha/sha1.cc.inc +404 -0
  289. package/runtime/third_party/boringssl/crypto/fipsmodule/sha/sha256.cc.inc +315 -0
  290. package/runtime/third_party/boringssl/crypto/fipsmodule/sha/sha512.cc.inc +473 -0
  291. package/runtime/third_party/boringssl/crypto/fipsmodule/slhdsa/address.h +144 -0
  292. package/runtime/third_party/boringssl/crypto/fipsmodule/slhdsa/fips_known_values.inc +674 -0
  293. package/runtime/third_party/boringssl/crypto/fipsmodule/slhdsa/fors.cc.inc +179 -0
  294. package/runtime/third_party/boringssl/crypto/fipsmodule/slhdsa/fors.h +48 -0
  295. package/runtime/third_party/boringssl/crypto/fipsmodule/slhdsa/merkle.cc.inc +164 -0
  296. package/runtime/third_party/boringssl/crypto/fipsmodule/slhdsa/merkle.h +58 -0
  297. package/runtime/third_party/boringssl/crypto/fipsmodule/slhdsa/params.h +178 -0
  298. package/runtime/third_party/boringssl/crypto/fipsmodule/slhdsa/slhdsa.cc.inc +690 -0
  299. package/runtime/third_party/boringssl/crypto/fipsmodule/slhdsa/thash.cc.inc +326 -0
  300. package/runtime/third_party/boringssl/crypto/fipsmodule/slhdsa/thash.h +71 -0
  301. package/runtime/third_party/boringssl/crypto/fipsmodule/slhdsa/wots.cc.inc +172 -0
  302. package/runtime/third_party/boringssl/crypto/fipsmodule/slhdsa/wots.h +40 -0
  303. package/runtime/third_party/boringssl/crypto/fipsmodule/tls/internal.h +33 -0
  304. package/runtime/third_party/boringssl/crypto/fipsmodule/tls/kdf.cc.inc +180 -0
  305. package/runtime/third_party/boringssl/crypto/fuzzer_mode.cc +30 -0
  306. package/runtime/third_party/boringssl/crypto/hpke/hpke.cc +1514 -0
  307. package/runtime/third_party/boringssl/crypto/hrss/asm/poly_rq_mul.S +8489 -0
  308. package/runtime/third_party/boringssl/crypto/hrss/hrss.cc +2189 -0
  309. package/runtime/third_party/boringssl/crypto/hrss/internal.h +64 -0
  310. package/runtime/third_party/boringssl/crypto/internal.h +1767 -0
  311. package/runtime/third_party/boringssl/crypto/lhash/internal.h +222 -0
  312. package/runtime/third_party/boringssl/crypto/lhash/lhash.cc +312 -0
  313. package/runtime/third_party/boringssl/crypto/md4/md4.cc +207 -0
  314. package/runtime/third_party/boringssl/crypto/md5/internal.h +34 -0
  315. package/runtime/third_party/boringssl/crypto/md5/md5.cc +255 -0
  316. package/runtime/third_party/boringssl/crypto/mem.cc +577 -0
  317. package/runtime/third_party/boringssl/crypto/mem_internal.h +706 -0
  318. package/runtime/third_party/boringssl/crypto/mldsa/mldsa.cc +296 -0
  319. package/runtime/third_party/boringssl/crypto/mlkem/mlkem.cc +108 -0
  320. package/runtime/third_party/boringssl/crypto/obj/obj.cc +494 -0
  321. package/runtime/third_party/boringssl/crypto/obj/obj_dat.h +11722 -0
  322. package/runtime/third_party/boringssl/crypto/obj/obj_xref.cc +83 -0
  323. package/runtime/third_party/boringssl/crypto/params_internal.h +30 -0
  324. package/runtime/third_party/boringssl/crypto/pem/internal.h +135 -0
  325. package/runtime/third_party/boringssl/crypto/pem/pem_all.cc +153 -0
  326. package/runtime/third_party/boringssl/crypto/pem/pem_info.cc +250 -0
  327. package/runtime/third_party/boringssl/crypto/pem/pem_lib.cc +707 -0
  328. package/runtime/third_party/boringssl/crypto/pem/pem_oth.cc +45 -0
  329. package/runtime/third_party/boringssl/crypto/pem/pem_pk8.cc +211 -0
  330. package/runtime/third_party/boringssl/crypto/pem/pem_pkey.cc +147 -0
  331. package/runtime/third_party/boringssl/crypto/pem/pem_x509.cc +25 -0
  332. package/runtime/third_party/boringssl/crypto/pem/pem_xaux.cc +25 -0
  333. package/runtime/third_party/boringssl/crypto/pkcs7/internal.h +67 -0
  334. package/runtime/third_party/boringssl/crypto/pkcs7/pkcs7.cc +198 -0
  335. package/runtime/third_party/boringssl/crypto/pkcs7/pkcs7_x509.cc +527 -0
  336. package/runtime/third_party/boringssl/crypto/pkcs8/internal.h +98 -0
  337. package/runtime/third_party/boringssl/crypto/pkcs8/p5_pbev2.cc +286 -0
  338. package/runtime/third_party/boringssl/crypto/pkcs8/pkcs8.cc +473 -0
  339. package/runtime/third_party/boringssl/crypto/pkcs8/pkcs8_x509.cc +1328 -0
  340. package/runtime/third_party/boringssl/crypto/poly1305/internal.h +54 -0
  341. package/runtime/third_party/boringssl/crypto/poly1305/poly1305.cc +315 -0
  342. package/runtime/third_party/boringssl/crypto/poly1305/poly1305_arm.cc +294 -0
  343. package/runtime/third_party/boringssl/crypto/poly1305/poly1305_arm_asm.S +2017 -0
  344. package/runtime/third_party/boringssl/crypto/poly1305/poly1305_vec.cc +853 -0
  345. package/runtime/third_party/boringssl/crypto/pool/internal.h +95 -0
  346. package/runtime/third_party/boringssl/crypto/pool/pool.cc +282 -0
  347. package/runtime/third_party/boringssl/crypto/rand/deterministic.cc +58 -0
  348. package/runtime/third_party/boringssl/crypto/rand/fork_detect.cc +222 -0
  349. package/runtime/third_party/boringssl/crypto/rand/forkunsafe.cc +44 -0
  350. package/runtime/third_party/boringssl/crypto/rand/getentropy.cc +53 -0
  351. package/runtime/third_party/boringssl/crypto/rand/internal.h +67 -0
  352. package/runtime/third_party/boringssl/crypto/rand/ios.cc +35 -0
  353. package/runtime/third_party/boringssl/crypto/rand/rand.cc +79 -0
  354. package/runtime/third_party/boringssl/crypto/rand/trusty.cc +39 -0
  355. package/runtime/third_party/boringssl/crypto/rand/urandom.cc +149 -0
  356. package/runtime/third_party/boringssl/crypto/rand/windows.cc +91 -0
  357. package/runtime/third_party/boringssl/crypto/rc4/rc4.cc +56 -0
  358. package/runtime/third_party/boringssl/crypto/refcount.cc +49 -0
  359. package/runtime/third_party/boringssl/crypto/rsa/internal.h +51 -0
  360. package/runtime/third_party/boringssl/crypto/rsa/rsa_asn1.cc +404 -0
  361. package/runtime/third_party/boringssl/crypto/rsa/rsa_crypt.cc +530 -0
  362. package/runtime/third_party/boringssl/crypto/rsa/rsa_extra.cc +30 -0
  363. package/runtime/third_party/boringssl/crypto/rsa/rsa_print.cc +25 -0
  364. package/runtime/third_party/boringssl/crypto/sha/sha1.cc +55 -0
  365. package/runtime/third_party/boringssl/crypto/sha/sha256.cc +89 -0
  366. package/runtime/third_party/boringssl/crypto/sha/sha512.cc +106 -0
  367. package/runtime/third_party/boringssl/crypto/siphash/siphash.cc +81 -0
  368. package/runtime/third_party/boringssl/crypto/slhdsa/slhdsa.cc +167 -0
  369. package/runtime/third_party/boringssl/crypto/spake2plus/internal.h +204 -0
  370. package/runtime/third_party/boringssl/crypto/spake2plus/spake2plus.cc +501 -0
  371. package/runtime/third_party/boringssl/crypto/stack/stack.cc +462 -0
  372. package/runtime/third_party/boringssl/crypto/thread.cc +68 -0
  373. package/runtime/third_party/boringssl/crypto/thread_none.cc +48 -0
  374. package/runtime/third_party/boringssl/crypto/thread_pthread.cc +138 -0
  375. package/runtime/third_party/boringssl/crypto/thread_win.cc +227 -0
  376. package/runtime/third_party/boringssl/crypto/trust_token/internal.h +405 -0
  377. package/runtime/third_party/boringssl/crypto/trust_token/pmbtoken.cc +1672 -0
  378. package/runtime/third_party/boringssl/crypto/trust_token/trust_token.cc +701 -0
  379. package/runtime/third_party/boringssl/crypto/trust_token/voprf.cc +1266 -0
  380. package/runtime/third_party/boringssl/crypto/x509/a_digest.cc +52 -0
  381. package/runtime/third_party/boringssl/crypto/x509/a_sign.cc +100 -0
  382. package/runtime/third_party/boringssl/crypto/x509/a_verify.cc +77 -0
  383. package/runtime/third_party/boringssl/crypto/x509/algorithm.cc +167 -0
  384. package/runtime/third_party/boringssl/crypto/x509/asn1_gen.cc +540 -0
  385. package/runtime/third_party/boringssl/crypto/x509/by_dir.cc +301 -0
  386. package/runtime/third_party/boringssl/crypto/x509/by_file.cc +226 -0
  387. package/runtime/third_party/boringssl/crypto/x509/i2d_pr.cc +37 -0
  388. package/runtime/third_party/boringssl/crypto/x509/internal.h +697 -0
  389. package/runtime/third_party/boringssl/crypto/x509/name_print.cc +187 -0
  390. package/runtime/third_party/boringssl/crypto/x509/policy.cc +686 -0
  391. package/runtime/third_party/boringssl/crypto/x509/rsa_pss.cc +187 -0
  392. package/runtime/third_party/boringssl/crypto/x509/t_crl.cc +106 -0
  393. package/runtime/third_party/boringssl/crypto/x509/t_req.cc +206 -0
  394. package/runtime/third_party/boringssl/crypto/x509/t_x509.cc +292 -0
  395. package/runtime/third_party/boringssl/crypto/x509/t_x509a.cc +81 -0
  396. package/runtime/third_party/boringssl/crypto/x509/v3_akey.cc +174 -0
  397. package/runtime/third_party/boringssl/crypto/x509/v3_akeya.cc +31 -0
  398. package/runtime/third_party/boringssl/crypto/x509/v3_alt.cc +636 -0
  399. package/runtime/third_party/boringssl/crypto/x509/v3_bcons.cc +96 -0
  400. package/runtime/third_party/boringssl/crypto/x509/v3_bitst.cc +100 -0
  401. package/runtime/third_party/boringssl/crypto/x509/v3_conf.cc +369 -0
  402. package/runtime/third_party/boringssl/crypto/x509/v3_cpols.cc +417 -0
  403. package/runtime/third_party/boringssl/crypto/x509/v3_crld.cc +471 -0
  404. package/runtime/third_party/boringssl/crypto/x509/v3_enum.cc +74 -0
  405. package/runtime/third_party/boringssl/crypto/x509/v3_extku.cc +97 -0
  406. package/runtime/third_party/boringssl/crypto/x509/v3_genn.cc +238 -0
  407. package/runtime/third_party/boringssl/crypto/x509/v3_ia5.cc +83 -0
  408. package/runtime/third_party/boringssl/crypto/x509/v3_info.cc +162 -0
  409. package/runtime/third_party/boringssl/crypto/x509/v3_int.cc +83 -0
  410. package/runtime/third_party/boringssl/crypto/x509/v3_lib.cc +349 -0
  411. package/runtime/third_party/boringssl/crypto/x509/v3_ncons.cc +798 -0
  412. package/runtime/third_party/boringssl/crypto/x509/v3_ocsp.cc +92 -0
  413. package/runtime/third_party/boringssl/crypto/x509/v3_pcons.cc +102 -0
  414. package/runtime/third_party/boringssl/crypto/x509/v3_pmaps.cc +110 -0
  415. package/runtime/third_party/boringssl/crypto/x509/v3_prn.cc +183 -0
  416. package/runtime/third_party/boringssl/crypto/x509/v3_purp.cc +580 -0
  417. package/runtime/third_party/boringssl/crypto/x509/v3_skey.cc +128 -0
  418. package/runtime/third_party/boringssl/crypto/x509/v3_utl.cc +1311 -0
  419. package/runtime/third_party/boringssl/crypto/x509/x509.cc +47 -0
  420. package/runtime/third_party/boringssl/crypto/x509/x509_att.cc +188 -0
  421. package/runtime/third_party/boringssl/crypto/x509/x509_cmp.cc +243 -0
  422. package/runtime/third_party/boringssl/crypto/x509/x509_d2.cc +66 -0
  423. package/runtime/third_party/boringssl/crypto/x509/x509_def.cc +42 -0
  424. package/runtime/third_party/boringssl/crypto/x509/x509_ext.cc +161 -0
  425. package/runtime/third_party/boringssl/crypto/x509/x509_lu.cc +570 -0
  426. package/runtime/third_party/boringssl/crypto/x509/x509_mtc.cc +598 -0
  427. package/runtime/third_party/boringssl/crypto/x509/x509_obj.cc +169 -0
  428. package/runtime/third_party/boringssl/crypto/x509/x509_req.cc +248 -0
  429. package/runtime/third_party/boringssl/crypto/x509/x509_set.cc +166 -0
  430. package/runtime/third_party/boringssl/crypto/x509/x509_trs.cc +123 -0
  431. package/runtime/third_party/boringssl/crypto/x509/x509_txt.cc +147 -0
  432. package/runtime/third_party/boringssl/crypto/x509/x509_v3.cc +249 -0
  433. package/runtime/third_party/boringssl/crypto/x509/x509_vfy.cc +1531 -0
  434. package/runtime/third_party/boringssl/crypto/x509/x509_vpm.cc +449 -0
  435. package/runtime/third_party/boringssl/crypto/x509/x509cset.cc +222 -0
  436. package/runtime/third_party/boringssl/crypto/x509/x509name.cc +377 -0
  437. package/runtime/third_party/boringssl/crypto/x509/x509rset.cc +55 -0
  438. package/runtime/third_party/boringssl/crypto/x509/x509spki.cc +91 -0
  439. package/runtime/third_party/boringssl/crypto/x509/x_algor.cc +223 -0
  440. package/runtime/third_party/boringssl/crypto/x509/x_all.cc +352 -0
  441. package/runtime/third_party/boringssl/crypto/x509/x_attrib.cc +61 -0
  442. package/runtime/third_party/boringssl/crypto/x509/x_crl.cc +325 -0
  443. package/runtime/third_party/boringssl/crypto/x509/x_exten.cc +42 -0
  444. package/runtime/third_party/boringssl/crypto/x509/x_name.cc +407 -0
  445. package/runtime/third_party/boringssl/crypto/x509/x_pubkey.cc +199 -0
  446. package/runtime/third_party/boringssl/crypto/x509/x_req.cc +80 -0
  447. package/runtime/third_party/boringssl/crypto/x509/x_sig.cc +51 -0
  448. package/runtime/third_party/boringssl/crypto/x509/x_spki.cc +44 -0
  449. package/runtime/third_party/boringssl/crypto/x509/x_x509.cc +495 -0
  450. package/runtime/third_party/boringssl/crypto/x509/x_x509a.cc +169 -0
  451. package/runtime/third_party/boringssl/crypto/xwing/xwing.cc +257 -0
  452. package/runtime/third_party/boringssl/gen/bcm/aes-gcm-avx2-x86_64-apple.S +1326 -0
  453. package/runtime/third_party/boringssl/gen/bcm/aes-gcm-avx2-x86_64-linux.S +1327 -0
  454. package/runtime/third_party/boringssl/gen/bcm/aes-gcm-avx512-x86_64-apple.S +1252 -0
  455. package/runtime/third_party/boringssl/gen/bcm/aes-gcm-avx512-x86_64-linux.S +1253 -0
  456. package/runtime/third_party/boringssl/gen/bcm/aesni-gcm-x86_64-apple.S +873 -0
  457. package/runtime/third_party/boringssl/gen/bcm/aesni-gcm-x86_64-linux.S +885 -0
  458. package/runtime/third_party/boringssl/gen/bcm/aesni-x86-apple.S +2490 -0
  459. package/runtime/third_party/boringssl/gen/bcm/aesni-x86-linux.S +2530 -0
  460. package/runtime/third_party/boringssl/gen/bcm/aesni-x86_64-apple.S +2413 -0
  461. package/runtime/third_party/boringssl/gen/bcm/aesni-x86_64-linux.S +2397 -0
  462. package/runtime/third_party/boringssl/gen/bcm/aesv8-armv7-linux.S +784 -0
  463. package/runtime/third_party/boringssl/gen/bcm/aesv8-armv8-apple.S +792 -0
  464. package/runtime/third_party/boringssl/gen/bcm/aesv8-armv8-linux.S +786 -0
  465. package/runtime/third_party/boringssl/gen/bcm/aesv8-armv8-win.S +798 -0
  466. package/runtime/third_party/boringssl/gen/bcm/aesv8-gcm-armv8-apple.S +2912 -0
  467. package/runtime/third_party/boringssl/gen/bcm/aesv8-gcm-armv8-linux.S +2907 -0
  468. package/runtime/third_party/boringssl/gen/bcm/aesv8-gcm-armv8-win.S +2915 -0
  469. package/runtime/third_party/boringssl/gen/bcm/armv4-mont-linux.S +932 -0
  470. package/runtime/third_party/boringssl/gen/bcm/armv8-mont-apple.S +1440 -0
  471. package/runtime/third_party/boringssl/gen/bcm/armv8-mont-linux.S +1440 -0
  472. package/runtime/third_party/boringssl/gen/bcm/armv8-mont-win.S +1446 -0
  473. package/runtime/third_party/boringssl/gen/bcm/bn-586-apple.S +530 -0
  474. package/runtime/third_party/boringssl/gen/bcm/bn-586-linux.S +540 -0
  475. package/runtime/third_party/boringssl/gen/bcm/bn-armv8-apple.S +88 -0
  476. package/runtime/third_party/boringssl/gen/bcm/bn-armv8-linux.S +87 -0
  477. package/runtime/third_party/boringssl/gen/bcm/bn-armv8-win.S +87 -0
  478. package/runtime/third_party/boringssl/gen/bcm/bsaes-armv7-linux.S +1520 -0
  479. package/runtime/third_party/boringssl/gen/bcm/co-586-apple.S +1256 -0
  480. package/runtime/third_party/boringssl/gen/bcm/co-586-linux.S +1264 -0
  481. package/runtime/third_party/boringssl/gen/bcm/ghash-armv4-linux.S +242 -0
  482. package/runtime/third_party/boringssl/gen/bcm/ghash-neon-armv8-apple.S +337 -0
  483. package/runtime/third_party/boringssl/gen/bcm/ghash-neon-armv8-linux.S +335 -0
  484. package/runtime/third_party/boringssl/gen/bcm/ghash-neon-armv8-win.S +341 -0
  485. package/runtime/third_party/boringssl/gen/bcm/ghash-ssse3-x86-apple.S +288 -0
  486. package/runtime/third_party/boringssl/gen/bcm/ghash-ssse3-x86-linux.S +292 -0
  487. package/runtime/third_party/boringssl/gen/bcm/ghash-ssse3-x86_64-apple.S +426 -0
  488. package/runtime/third_party/boringssl/gen/bcm/ghash-ssse3-x86_64-linux.S +425 -0
  489. package/runtime/third_party/boringssl/gen/bcm/ghash-x86-apple.S +322 -0
  490. package/runtime/third_party/boringssl/gen/bcm/ghash-x86-linux.S +328 -0
  491. package/runtime/third_party/boringssl/gen/bcm/ghash-x86_64-apple.S +1134 -0
  492. package/runtime/third_party/boringssl/gen/bcm/ghash-x86_64-linux.S +1129 -0
  493. package/runtime/third_party/boringssl/gen/bcm/ghashv8-armv7-linux.S +244 -0
  494. package/runtime/third_party/boringssl/gen/bcm/ghashv8-armv8-apple.S +567 -0
  495. package/runtime/third_party/boringssl/gen/bcm/ghashv8-armv8-linux.S +563 -0
  496. package/runtime/third_party/boringssl/gen/bcm/ghashv8-armv8-win.S +571 -0
  497. package/runtime/third_party/boringssl/gen/bcm/p256-armv8-asm-apple.S +1744 -0
  498. package/runtime/third_party/boringssl/gen/bcm/p256-armv8-asm-linux.S +1725 -0
  499. package/runtime/third_party/boringssl/gen/bcm/p256-armv8-asm-win.S +1765 -0
  500. package/runtime/third_party/boringssl/gen/bcm/p256-x86_64-asm-apple.S +4544 -0
  501. package/runtime/third_party/boringssl/gen/bcm/p256-x86_64-asm-linux.S +4600 -0
  502. package/runtime/third_party/boringssl/gen/bcm/p256_beeu-armv8-asm-apple.S +310 -0
  503. package/runtime/third_party/boringssl/gen/bcm/p256_beeu-armv8-asm-linux.S +310 -0
  504. package/runtime/third_party/boringssl/gen/bcm/p256_beeu-armv8-asm-win.S +310 -0
  505. package/runtime/third_party/boringssl/gen/bcm/p256_beeu-x86_64-asm-apple.S +321 -0
  506. package/runtime/third_party/boringssl/gen/bcm/p256_beeu-x86_64-asm-linux.S +335 -0
  507. package/runtime/third_party/boringssl/gen/bcm/rdrand-x86_64-apple.S +58 -0
  508. package/runtime/third_party/boringssl/gen/bcm/rdrand-x86_64-linux.S +57 -0
  509. package/runtime/third_party/boringssl/gen/bcm/rsaz-avx2-apple.S +1756 -0
  510. package/runtime/third_party/boringssl/gen/bcm/rsaz-avx2-linux.S +1751 -0
  511. package/runtime/third_party/boringssl/gen/bcm/sha1-586-apple.S +3782 -0
  512. package/runtime/third_party/boringssl/gen/bcm/sha1-586-linux.S +3788 -0
  513. package/runtime/third_party/boringssl/gen/bcm/sha1-armv4-large-linux.S +1479 -0
  514. package/runtime/third_party/boringssl/gen/bcm/sha1-armv8-apple.S +1219 -0
  515. package/runtime/third_party/boringssl/gen/bcm/sha1-armv8-linux.S +1218 -0
  516. package/runtime/third_party/boringssl/gen/bcm/sha1-armv8-win.S +1222 -0
  517. package/runtime/third_party/boringssl/gen/bcm/sha1-x86_64-apple.S +5454 -0
  518. package/runtime/third_party/boringssl/gen/bcm/sha1-x86_64-linux.S +5450 -0
  519. package/runtime/third_party/boringssl/gen/bcm/sha256-586-apple.S +5593 -0
  520. package/runtime/third_party/boringssl/gen/bcm/sha256-586-linux.S +5599 -0
  521. package/runtime/third_party/boringssl/gen/bcm/sha256-armv4-linux.S +2840 -0
  522. package/runtime/third_party/boringssl/gen/bcm/sha256-armv8-apple.S +1195 -0
  523. package/runtime/third_party/boringssl/gen/bcm/sha256-armv8-linux.S +1194 -0
  524. package/runtime/third_party/boringssl/gen/bcm/sha256-armv8-win.S +1198 -0
  525. package/runtime/third_party/boringssl/gen/bcm/sha256-x86_64-apple.S +4173 -0
  526. package/runtime/third_party/boringssl/gen/bcm/sha256-x86_64-linux.S +4170 -0
  527. package/runtime/third_party/boringssl/gen/bcm/sha512-586-apple.S +2406 -0
  528. package/runtime/third_party/boringssl/gen/bcm/sha512-586-linux.S +2410 -0
  529. package/runtime/third_party/boringssl/gen/bcm/sha512-armv4-linux.S +1857 -0
  530. package/runtime/third_party/boringssl/gen/bcm/sha512-armv8-apple.S +1598 -0
  531. package/runtime/third_party/boringssl/gen/bcm/sha512-armv8-linux.S +1597 -0
  532. package/runtime/third_party/boringssl/gen/bcm/sha512-armv8-win.S +1601 -0
  533. package/runtime/third_party/boringssl/gen/bcm/sha512-x86_64-apple.S +2979 -0
  534. package/runtime/third_party/boringssl/gen/bcm/sha512-x86_64-linux.S +2978 -0
  535. package/runtime/third_party/boringssl/gen/bcm/vpaes-armv7-linux.S +1225 -0
  536. package/runtime/third_party/boringssl/gen/bcm/vpaes-armv8-apple.S +1238 -0
  537. package/runtime/third_party/boringssl/gen/bcm/vpaes-armv8-linux.S +1220 -0
  538. package/runtime/third_party/boringssl/gen/bcm/vpaes-armv8-win.S +1256 -0
  539. package/runtime/third_party/boringssl/gen/bcm/vpaes-x86-apple.S +680 -0
  540. package/runtime/third_party/boringssl/gen/bcm/vpaes-x86-linux.S +706 -0
  541. package/runtime/third_party/boringssl/gen/bcm/vpaes-x86_64-apple.S +1146 -0
  542. package/runtime/third_party/boringssl/gen/bcm/vpaes-x86_64-linux.S +1133 -0
  543. package/runtime/third_party/boringssl/gen/bcm/x86-mont-apple.S +216 -0
  544. package/runtime/third_party/boringssl/gen/bcm/x86-mont-linux.S +218 -0
  545. package/runtime/third_party/boringssl/gen/bcm/x86_64-mont-apple.S +1238 -0
  546. package/runtime/third_party/boringssl/gen/bcm/x86_64-mont-linux.S +1237 -0
  547. package/runtime/third_party/boringssl/gen/bcm/x86_64-mont5-apple.S +3644 -0
  548. package/runtime/third_party/boringssl/gen/bcm/x86_64-mont5-linux.S +3628 -0
  549. package/runtime/third_party/boringssl/gen/boringssl_prefix_symbols_internal_x86_64_win_asm.inc +325 -0
  550. package/runtime/third_party/boringssl/gen/boringssl_prefix_symbols_internal_x86_win_asm.inc +325 -0
  551. package/runtime/third_party/boringssl/gen/crypto/aes128gcmsiv-x86_64-apple.S +3113 -0
  552. package/runtime/third_party/boringssl/gen/crypto/aes128gcmsiv-x86_64-linux.S +3091 -0
  553. package/runtime/third_party/boringssl/gen/crypto/chacha-armv4-linux.S +1450 -0
  554. package/runtime/third_party/boringssl/gen/crypto/chacha-armv8-apple.S +1969 -0
  555. package/runtime/third_party/boringssl/gen/crypto/chacha-armv8-linux.S +1967 -0
  556. package/runtime/third_party/boringssl/gen/crypto/chacha-armv8-win.S +1973 -0
  557. package/runtime/third_party/boringssl/gen/crypto/chacha-x86-apple.S +957 -0
  558. package/runtime/third_party/boringssl/gen/crypto/chacha-x86-linux.S +961 -0
  559. package/runtime/third_party/boringssl/gen/crypto/chacha-x86_64-apple.S +1608 -0
  560. package/runtime/third_party/boringssl/gen/crypto/chacha-x86_64-linux.S +1611 -0
  561. package/runtime/third_party/boringssl/gen/crypto/chacha20_poly1305_armv8-apple.S +3010 -0
  562. package/runtime/third_party/boringssl/gen/crypto/chacha20_poly1305_armv8-linux.S +3008 -0
  563. package/runtime/third_party/boringssl/gen/crypto/chacha20_poly1305_armv8-win.S +3014 -0
  564. package/runtime/third_party/boringssl/gen/crypto/chacha20_poly1305_x86_64-apple.S +8903 -0
  565. package/runtime/third_party/boringssl/gen/crypto/chacha20_poly1305_x86_64-linux.S +8940 -0
  566. package/runtime/third_party/boringssl/gen/crypto/err_data.cc +1578 -0
  567. package/runtime/third_party/boringssl/gen/crypto/md5-586-apple.S +684 -0
  568. package/runtime/third_party/boringssl/gen/crypto/md5-586-linux.S +686 -0
  569. package/runtime/third_party/boringssl/gen/crypto/md5-x86_64-apple.S +690 -0
  570. package/runtime/third_party/boringssl/gen/crypto/md5-x86_64-linux.S +695 -0
  571. package/runtime/third_party/boringssl/include/openssl/aead.h +650 -0
  572. package/runtime/third_party/boringssl/include/openssl/aes.h +173 -0
  573. package/runtime/third_party/boringssl/include/openssl/arm_arch.h +24 -0
  574. package/runtime/third_party/boringssl/include/openssl/asm_base.h +219 -0
  575. package/runtime/third_party/boringssl/include/openssl/asn1.h +2002 -0
  576. package/runtime/third_party/boringssl/include/openssl/asn1_mac.h +18 -0
  577. package/runtime/third_party/boringssl/include/openssl/asn1t.h +584 -0
  578. package/runtime/third_party/boringssl/include/openssl/base.h +548 -0
  579. package/runtime/third_party/boringssl/include/openssl/base64.h +156 -0
  580. package/runtime/third_party/boringssl/include/openssl/bio.h +1061 -0
  581. package/runtime/third_party/boringssl/include/openssl/blake2.h +63 -0
  582. package/runtime/third_party/boringssl/include/openssl/blowfish.h +58 -0
  583. package/runtime/third_party/boringssl/include/openssl/bn.h +986 -0
  584. package/runtime/third_party/boringssl/include/openssl/buf.h +95 -0
  585. package/runtime/third_party/boringssl/include/openssl/buffer.h +18 -0
  586. package/runtime/third_party/boringssl/include/openssl/bytestring.h +798 -0
  587. package/runtime/third_party/boringssl/include/openssl/cast.h +91 -0
  588. package/runtime/third_party/boringssl/include/openssl/chacha.h +47 -0
  589. package/runtime/third_party/boringssl/include/openssl/cipher.h +819 -0
  590. package/runtime/third_party/boringssl/include/openssl/cmac.h +91 -0
  591. package/runtime/third_party/boringssl/include/openssl/cms.h +147 -0
  592. package/runtime/third_party/boringssl/include/openssl/conf.h +136 -0
  593. package/runtime/third_party/boringssl/include/openssl/configuration.h +18 -0
  594. package/runtime/third_party/boringssl/include/openssl/cpu.h +18 -0
  595. package/runtime/third_party/boringssl/include/openssl/crypto.h +235 -0
  596. package/runtime/third_party/boringssl/include/openssl/ctrdrbg.h +116 -0
  597. package/runtime/third_party/boringssl/include/openssl/curve25519.h +309 -0
  598. package/runtime/third_party/boringssl/include/openssl/des.h +134 -0
  599. package/runtime/third_party/boringssl/include/openssl/dh.h +336 -0
  600. package/runtime/third_party/boringssl/include/openssl/digest.h +399 -0
  601. package/runtime/third_party/boringssl/include/openssl/dsa.h +392 -0
  602. package/runtime/third_party/boringssl/include/openssl/dtls1.h +16 -0
  603. package/runtime/third_party/boringssl/include/openssl/e_os2.h +18 -0
  604. package/runtime/third_party/boringssl/include/openssl/ec.h +530 -0
  605. package/runtime/third_party/boringssl/include/openssl/ec_key.h +358 -0
  606. package/runtime/third_party/boringssl/include/openssl/ecdh.h +67 -0
  607. package/runtime/third_party/boringssl/include/openssl/ecdsa.h +242 -0
  608. package/runtime/third_party/boringssl/include/openssl/engine.h +109 -0
  609. package/runtime/third_party/boringssl/include/openssl/err.h +416 -0
  610. package/runtime/third_party/boringssl/include/openssl/evp.h +1645 -0
  611. package/runtime/third_party/boringssl/include/openssl/evp_errors.h +66 -0
  612. package/runtime/third_party/boringssl/include/openssl/ex_data.h +117 -0
  613. package/runtime/third_party/boringssl/include/openssl/hkdf.h +68 -0
  614. package/runtime/third_party/boringssl/include/openssl/hmac.h +151 -0
  615. package/runtime/third_party/boringssl/include/openssl/hpke.h +456 -0
  616. package/runtime/third_party/boringssl/include/openssl/hrss.h +108 -0
  617. package/runtime/third_party/boringssl/include/openssl/is_boringssl.h +16 -0
  618. package/runtime/third_party/boringssl/include/openssl/kdf.h +92 -0
  619. package/runtime/third_party/boringssl/include/openssl/lhash.h +18 -0
  620. package/runtime/third_party/boringssl/include/openssl/md4.h +73 -0
  621. package/runtime/third_party/boringssl/include/openssl/md5.h +67 -0
  622. package/runtime/third_party/boringssl/include/openssl/mem.h +215 -0
  623. package/runtime/third_party/boringssl/include/openssl/mldsa.h +486 -0
  624. package/runtime/third_party/boringssl/include/openssl/mlkem.h +222 -0
  625. package/runtime/third_party/boringssl/include/openssl/nid.h +5561 -0
  626. package/runtime/third_party/boringssl/include/openssl/obj.h +225 -0
  627. package/runtime/third_party/boringssl/include/openssl/obj_mac.h +18 -0
  628. package/runtime/third_party/boringssl/include/openssl/objects.h +18 -0
  629. package/runtime/third_party/boringssl/include/openssl/opensslconf.h +108 -0
  630. package/runtime/third_party/boringssl/include/openssl/opensslv.h +18 -0
  631. package/runtime/third_party/boringssl/include/openssl/ossl_typ.h +18 -0
  632. package/runtime/third_party/boringssl/include/openssl/params.h +42 -0
  633. package/runtime/third_party/boringssl/include/openssl/pem.h +769 -0
  634. package/runtime/third_party/boringssl/include/openssl/pkcs12.h +18 -0
  635. package/runtime/third_party/boringssl/include/openssl/pkcs7.h +239 -0
  636. package/runtime/third_party/boringssl/include/openssl/pkcs8.h +267 -0
  637. package/runtime/third_party/boringssl/include/openssl/poly1305.h +52 -0
  638. package/runtime/third_party/boringssl/include/openssl/pool.h +137 -0
  639. package/runtime/third_party/boringssl/include/openssl/posix_time.h +51 -0
  640. package/runtime/third_party/boringssl/include/openssl/prefix_symbols.h +8000 -0
  641. package/runtime/third_party/boringssl/include/openssl/prefix_symbols_internal_S.h +633 -0
  642. package/runtime/third_party/boringssl/include/openssl/prefix_symbols_internal_c.h +329 -0
  643. package/runtime/third_party/boringssl/include/openssl/rand.h +138 -0
  644. package/runtime/third_party/boringssl/include/openssl/rc4.h +54 -0
  645. package/runtime/third_party/boringssl/include/openssl/ripemd.h +71 -0
  646. package/runtime/third_party/boringssl/include/openssl/rsa.h +893 -0
  647. package/runtime/third_party/boringssl/include/openssl/safestack.h +16 -0
  648. package/runtime/third_party/boringssl/include/openssl/service_indicator.h +19 -0
  649. package/runtime/third_party/boringssl/include/openssl/sha.h +108 -0
  650. package/runtime/third_party/boringssl/include/openssl/sha2.h +201 -0
  651. package/runtime/third_party/boringssl/include/openssl/siphash.h +37 -0
  652. package/runtime/third_party/boringssl/include/openssl/slhdsa.h +250 -0
  653. package/runtime/third_party/boringssl/include/openssl/span.h +376 -0
  654. package/runtime/third_party/boringssl/include/openssl/srtp.h +18 -0
  655. package/runtime/third_party/boringssl/include/openssl/ssl.h +7211 -0
  656. package/runtime/third_party/boringssl/include/openssl/ssl3.h +171 -0
  657. package/runtime/third_party/boringssl/include/openssl/stack.h +688 -0
  658. package/runtime/third_party/boringssl/include/openssl/target.h +246 -0
  659. package/runtime/third_party/boringssl/include/openssl/thread.h +114 -0
  660. package/runtime/third_party/boringssl/include/openssl/time.h +22 -0
  661. package/runtime/third_party/boringssl/include/openssl/tls1.h +263 -0
  662. package/runtime/third_party/boringssl/include/openssl/tls_prf.h +47 -0
  663. package/runtime/third_party/boringssl/include/openssl/trust_token.h +349 -0
  664. package/runtime/third_party/boringssl/include/openssl/type_check.h +37 -0
  665. package/runtime/third_party/boringssl/include/openssl/types.h +18 -0
  666. package/runtime/third_party/boringssl/include/openssl/x509.h +5404 -0
  667. package/runtime/third_party/boringssl/include/openssl/x509_vfy.h +18 -0
  668. package/runtime/third_party/boringssl/include/openssl/x509v3.h +63 -0
  669. package/runtime/third_party/boringssl/include/openssl/x509v3_errors.h +84 -0
  670. package/runtime/third_party/boringssl/include/openssl/xwing.h +115 -0
  671. package/runtime/third_party/boringssl/sources.json +696 -0
  672. package/runtime/third_party/boringssl/ssl/bio_ssl.cc +196 -0
  673. package/runtime/third_party/boringssl/ssl/d1_both.cc +1137 -0
  674. package/runtime/third_party/boringssl/ssl/d1_lib.cc +245 -0
  675. package/runtime/third_party/boringssl/ssl/d1_pkt.cc +322 -0
  676. package/runtime/third_party/boringssl/ssl/d1_srtp.cc +128 -0
  677. package/runtime/third_party/boringssl/ssl/dtls_method.cc +216 -0
  678. package/runtime/third_party/boringssl/ssl/dtls_record.cc +586 -0
  679. package/runtime/third_party/boringssl/ssl/encrypted_client_hello.cc +1110 -0
  680. package/runtime/third_party/boringssl/ssl/extensions.cc +5368 -0
  681. package/runtime/third_party/boringssl/ssl/handoff.cc +625 -0
  682. package/runtime/third_party/boringssl/ssl/handshake.cc +694 -0
  683. package/runtime/third_party/boringssl/ssl/handshake_client.cc +1958 -0
  684. package/runtime/third_party/boringssl/ssl/handshake_server.cc +1875 -0
  685. package/runtime/third_party/boringssl/ssl/internal.h +4506 -0
  686. package/runtime/third_party/boringssl/ssl/s3_both.cc +555 -0
  687. package/runtime/third_party/boringssl/ssl/s3_lib.cc +88 -0
  688. package/runtime/third_party/boringssl/ssl/s3_pkt.cc +396 -0
  689. package/runtime/third_party/boringssl/ssl/ssl_aead_ctx.cc +416 -0
  690. package/runtime/third_party/boringssl/ssl/ssl_asn1.cc +851 -0
  691. package/runtime/third_party/boringssl/ssl/ssl_buffer.cc +304 -0
  692. package/runtime/third_party/boringssl/ssl/ssl_cert.cc +723 -0
  693. package/runtime/third_party/boringssl/ssl/ssl_cipher.cc +1762 -0
  694. package/runtime/third_party/boringssl/ssl/ssl_credential.cc +913 -0
  695. package/runtime/third_party/boringssl/ssl/ssl_file.cc +375 -0
  696. package/runtime/third_party/boringssl/ssl/ssl_key_share.cc +445 -0
  697. package/runtime/third_party/boringssl/ssl/ssl_lib.cc +4132 -0
  698. package/runtime/third_party/boringssl/ssl/ssl_privkey.cc +973 -0
  699. package/runtime/third_party/boringssl/ssl/ssl_session.cc +1273 -0
  700. package/runtime/third_party/boringssl/ssl/ssl_stat.cc +162 -0
  701. package/runtime/third_party/boringssl/ssl/ssl_transcript.cc +224 -0
  702. package/runtime/third_party/boringssl/ssl/ssl_versions.cc +436 -0
  703. package/runtime/third_party/boringssl/ssl/ssl_x509.cc +1229 -0
  704. package/runtime/third_party/boringssl/ssl/t1_enc.cc +266 -0
  705. package/runtime/third_party/boringssl/ssl/tls13_both.cc +764 -0
  706. package/runtime/third_party/boringssl/ssl/tls13_client.cc +1325 -0
  707. package/runtime/third_party/boringssl/ssl/tls13_enc.cc +746 -0
  708. package/runtime/third_party/boringssl/ssl/tls13_server.cc +1623 -0
  709. package/runtime/third_party/boringssl/ssl/tls_method.cc +266 -0
  710. package/runtime/third_party/boringssl/ssl/tls_record.cc +524 -0
  711. package/runtime/third_party/boringssl/third_party/fiat/asm/fiat_curve25519_adx_mul.S +178 -0
  712. package/runtime/third_party/boringssl/third_party/fiat/asm/fiat_curve25519_adx_square.S +146 -0
  713. package/runtime/third_party/boringssl/third_party/fiat/asm/fiat_p256_adx_mul.S +177 -0
  714. package/runtime/third_party/boringssl/third_party/fiat/asm/fiat_p256_adx_sqr.S +166 -0
  715. package/runtime/third_party/boringssl/third_party/fiat/bedrock_unverified_bareminimum.c.inc +47 -0
  716. package/runtime/third_party/boringssl/third_party/fiat/bedrock_unverified_platform.c.inc +137 -0
  717. package/runtime/third_party/boringssl/third_party/fiat/curve25519_32.h +1571 -0
  718. package/runtime/third_party/boringssl/third_party/fiat/curve25519_64.h +978 -0
  719. package/runtime/third_party/boringssl/third_party/fiat/curve25519_64_adx.h +700 -0
  720. package/runtime/third_party/boringssl/third_party/fiat/curve25519_64_msvc.h +1281 -0
  721. package/runtime/third_party/boringssl/third_party/fiat/p256_32.h +4760 -0
  722. package/runtime/third_party/boringssl/third_party/fiat/p256_64.h +1984 -0
  723. package/runtime/third_party/boringssl/third_party/fiat/p256_64_msvc.h +1939 -0
  724. package/runtime/third_party/boringssl/third_party/fiat/p256_field.c.inc +26 -0
  725. package/runtime/third_party/boringssl/third_party/fiat/p256_field_32.br.c.inc +71 -0
  726. package/runtime/third_party/boringssl/third_party/fiat/p256_field_64.br.c.inc +84 -0
  727. package/runtime/third_party/boringssl/third_party/fiat/p256_point.br.c.inc +112 -0
  728. package/runtime/third_party/v8-ieee754/README.md +2 -1
  729. package/runtime/third_party/v8-ieee754/convert.py +4 -0
  730. package/runtime/third_party/v8-ieee754/ieee754.c +1 -1
  731. package/runtime/third_party/bearssl/LICENSE.txt +0 -21
  732. package/runtime/third_party/bearssl/README.txt +0 -136
  733. package/runtime/third_party/bearssl/VERSION +0 -1
  734. package/runtime/third_party/bearssl/inc/bearssl.h +0 -183
  735. package/runtime/third_party/bearssl/inc/bearssl_aead.h +0 -1059
  736. package/runtime/third_party/bearssl/inc/bearssl_block.h +0 -2618
  737. package/runtime/third_party/bearssl/inc/bearssl_ec.h +0 -967
  738. package/runtime/third_party/bearssl/inc/bearssl_hash.h +0 -1346
  739. package/runtime/third_party/bearssl/inc/bearssl_hmac.h +0 -241
  740. package/runtime/third_party/bearssl/inc/bearssl_kdf.h +0 -284
  741. package/runtime/third_party/bearssl/inc/bearssl_pem.h +0 -294
  742. package/runtime/third_party/bearssl/inc/bearssl_prf.h +0 -150
  743. package/runtime/third_party/bearssl/inc/bearssl_rand.h +0 -397
  744. package/runtime/third_party/bearssl/inc/bearssl_rsa.h +0 -1655
  745. package/runtime/third_party/bearssl/inc/bearssl_ssl.h +0 -4296
  746. package/runtime/third_party/bearssl/inc/bearssl_x509.h +0 -1474
  747. package/runtime/third_party/bearssl/src/aead/ccm.c +0 -346
  748. package/runtime/third_party/bearssl/src/aead/eax.c +0 -525
  749. package/runtime/third_party/bearssl/src/aead/gcm.c +0 -318
  750. package/runtime/third_party/bearssl/src/codec/ccopy.c +0 -44
  751. package/runtime/third_party/bearssl/src/codec/dec16be.c +0 -38
  752. package/runtime/third_party/bearssl/src/codec/dec16le.c +0 -38
  753. package/runtime/third_party/bearssl/src/codec/dec32be.c +0 -38
  754. package/runtime/third_party/bearssl/src/codec/dec32le.c +0 -38
  755. package/runtime/third_party/bearssl/src/codec/dec64be.c +0 -38
  756. package/runtime/third_party/bearssl/src/codec/dec64le.c +0 -38
  757. package/runtime/third_party/bearssl/src/codec/enc16be.c +0 -38
  758. package/runtime/third_party/bearssl/src/codec/enc16le.c +0 -38
  759. package/runtime/third_party/bearssl/src/codec/enc32be.c +0 -38
  760. package/runtime/third_party/bearssl/src/codec/enc32le.c +0 -38
  761. package/runtime/third_party/bearssl/src/codec/enc64be.c +0 -38
  762. package/runtime/third_party/bearssl/src/codec/enc64le.c +0 -38
  763. package/runtime/third_party/bearssl/src/codec/pemdec.c +0 -526
  764. package/runtime/third_party/bearssl/src/codec/pemdec.t0 +0 -314
  765. package/runtime/third_party/bearssl/src/codec/pemenc.c +0 -173
  766. package/runtime/third_party/bearssl/src/config.h +0 -247
  767. package/runtime/third_party/bearssl/src/ec/ec_all_m15.c +0 -121
  768. package/runtime/third_party/bearssl/src/ec/ec_all_m31.c +0 -171
  769. package/runtime/third_party/bearssl/src/ec/ec_c25519_i15.c +0 -398
  770. package/runtime/third_party/bearssl/src/ec/ec_c25519_i31.c +0 -390
  771. package/runtime/third_party/bearssl/src/ec/ec_c25519_m15.c +0 -1478
  772. package/runtime/third_party/bearssl/src/ec/ec_c25519_m31.c +0 -800
  773. package/runtime/third_party/bearssl/src/ec/ec_c25519_m62.c +0 -605
  774. package/runtime/third_party/bearssl/src/ec/ec_c25519_m64.c +0 -831
  775. package/runtime/third_party/bearssl/src/ec/ec_curve25519.c +0 -46
  776. package/runtime/third_party/bearssl/src/ec/ec_default.c +0 -36
  777. package/runtime/third_party/bearssl/src/ec/ec_keygen.c +0 -86
  778. package/runtime/third_party/bearssl/src/ec/ec_p256_m15.c +0 -2124
  779. package/runtime/third_party/bearssl/src/ec/ec_p256_m31.c +0 -1469
  780. package/runtime/third_party/bearssl/src/ec/ec_p256_m62.c +0 -1765
  781. package/runtime/third_party/bearssl/src/ec/ec_p256_m64.c +0 -1781
  782. package/runtime/third_party/bearssl/src/ec/ec_prime_i15.c +0 -824
  783. package/runtime/third_party/bearssl/src/ec/ec_prime_i31.c +0 -826
  784. package/runtime/third_party/bearssl/src/ec/ec_pubkey.c +0 -85
  785. package/runtime/third_party/bearssl/src/ec/ec_secp256r1.c +0 -51
  786. package/runtime/third_party/bearssl/src/ec/ec_secp384r1.c +0 -57
  787. package/runtime/third_party/bearssl/src/ec/ec_secp521r1.c +0 -64
  788. package/runtime/third_party/bearssl/src/ec/ecdsa_atr.c +0 -134
  789. package/runtime/third_party/bearssl/src/ec/ecdsa_default_sign_asn1.c +0 -36
  790. package/runtime/third_party/bearssl/src/ec/ecdsa_default_sign_raw.c +0 -36
  791. package/runtime/third_party/bearssl/src/ec/ecdsa_default_vrfy_asn1.c +0 -36
  792. package/runtime/third_party/bearssl/src/ec/ecdsa_default_vrfy_raw.c +0 -36
  793. package/runtime/third_party/bearssl/src/ec/ecdsa_i15_bits.c +0 -47
  794. package/runtime/third_party/bearssl/src/ec/ecdsa_i15_sign_asn1.c +0 -45
  795. package/runtime/third_party/bearssl/src/ec/ecdsa_i15_sign_raw.c +0 -174
  796. package/runtime/third_party/bearssl/src/ec/ecdsa_i15_vrfy_asn1.c +0 -48
  797. package/runtime/third_party/bearssl/src/ec/ecdsa_i15_vrfy_raw.c +0 -166
  798. package/runtime/third_party/bearssl/src/ec/ecdsa_i31_bits.c +0 -47
  799. package/runtime/third_party/bearssl/src/ec/ecdsa_i31_sign_asn1.c +0 -45
  800. package/runtime/third_party/bearssl/src/ec/ecdsa_i31_sign_raw.c +0 -173
  801. package/runtime/third_party/bearssl/src/ec/ecdsa_i31_vrfy_asn1.c +0 -48
  802. package/runtime/third_party/bearssl/src/ec/ecdsa_i31_vrfy_raw.c +0 -165
  803. package/runtime/third_party/bearssl/src/ec/ecdsa_rta.c +0 -121
  804. package/runtime/third_party/bearssl/src/hash/dig_oid.c +0 -84
  805. package/runtime/third_party/bearssl/src/hash/dig_size.c +0 -50
  806. package/runtime/third_party/bearssl/src/hash/ghash_ctmul.c +0 -345
  807. package/runtime/third_party/bearssl/src/hash/ghash_ctmul32.c +0 -251
  808. package/runtime/third_party/bearssl/src/hash/ghash_ctmul64.c +0 -154
  809. package/runtime/third_party/bearssl/src/hash/ghash_pclmul.c +0 -389
  810. package/runtime/third_party/bearssl/src/hash/ghash_pwr8.c +0 -411
  811. package/runtime/third_party/bearssl/src/hash/md5.c +0 -208
  812. package/runtime/third_party/bearssl/src/hash/md5sha1.c +0 -141
  813. package/runtime/third_party/bearssl/src/hash/mgf1.c +0 -56
  814. package/runtime/third_party/bearssl/src/hash/multihash.c +0 -166
  815. package/runtime/third_party/bearssl/src/hash/sha1.c +0 -191
  816. package/runtime/third_party/bearssl/src/hash/sha2big.c +0 -285
  817. package/runtime/third_party/bearssl/src/hash/sha2small.c +0 -341
  818. package/runtime/third_party/bearssl/src/inner.h +0 -2577
  819. package/runtime/third_party/bearssl/src/int/i15_add.c +0 -46
  820. package/runtime/third_party/bearssl/src/int/i15_bitlen.c +0 -44
  821. package/runtime/third_party/bearssl/src/int/i15_decmod.c +0 -124
  822. package/runtime/third_party/bearssl/src/int/i15_decode.c +0 -56
  823. package/runtime/third_party/bearssl/src/int/i15_decred.c +0 -100
  824. package/runtime/third_party/bearssl/src/int/i15_encode.c +0 -56
  825. package/runtime/third_party/bearssl/src/int/i15_fmont.c +0 -59
  826. package/runtime/third_party/bearssl/src/int/i15_iszero.c +0 -39
  827. package/runtime/third_party/bearssl/src/int/i15_moddiv.c +0 -465
  828. package/runtime/third_party/bearssl/src/int/i15_modpow.c +0 -50
  829. package/runtime/third_party/bearssl/src/int/i15_modpow2.c +0 -160
  830. package/runtime/third_party/bearssl/src/int/i15_montmul.c +0 -184
  831. package/runtime/third_party/bearssl/src/int/i15_mulacc.c +0 -61
  832. package/runtime/third_party/bearssl/src/int/i15_muladd.c +0 -173
  833. package/runtime/third_party/bearssl/src/int/i15_ninv15.c +0 -38
  834. package/runtime/third_party/bearssl/src/int/i15_reduce.c +0 -66
  835. package/runtime/third_party/bearssl/src/int/i15_rshift.c +0 -47
  836. package/runtime/third_party/bearssl/src/int/i15_sub.c +0 -46
  837. package/runtime/third_party/bearssl/src/int/i15_tmont.c +0 -36
  838. package/runtime/third_party/bearssl/src/int/i31_add.c +0 -46
  839. package/runtime/third_party/bearssl/src/int/i31_bitlen.c +0 -44
  840. package/runtime/third_party/bearssl/src/int/i31_decmod.c +0 -124
  841. package/runtime/third_party/bearssl/src/int/i31_decode.c +0 -57
  842. package/runtime/third_party/bearssl/src/int/i31_decred.c +0 -103
  843. package/runtime/third_party/bearssl/src/int/i31_encode.c +0 -79
  844. package/runtime/third_party/bearssl/src/int/i31_fmont.c +0 -60
  845. package/runtime/third_party/bearssl/src/int/i31_iszero.c +0 -39
  846. package/runtime/third_party/bearssl/src/int/i31_moddiv.c +0 -488
  847. package/runtime/third_party/bearssl/src/int/i31_modpow.c +0 -65
  848. package/runtime/third_party/bearssl/src/int/i31_modpow2.c +0 -160
  849. package/runtime/third_party/bearssl/src/int/i31_montmul.c +0 -127
  850. package/runtime/third_party/bearssl/src/int/i31_mulacc.c +0 -74
  851. package/runtime/third_party/bearssl/src/int/i31_muladd.c +0 -157
  852. package/runtime/third_party/bearssl/src/int/i31_ninv31.c +0 -39
  853. package/runtime/third_party/bearssl/src/int/i31_reduce.c +0 -66
  854. package/runtime/third_party/bearssl/src/int/i31_rshift.c +0 -47
  855. package/runtime/third_party/bearssl/src/int/i31_sub.c +0 -46
  856. package/runtime/third_party/bearssl/src/int/i31_tmont.c +0 -36
  857. package/runtime/third_party/bearssl/src/int/i32_add.c +0 -51
  858. package/runtime/third_party/bearssl/src/int/i32_bitlen.c +0 -44
  859. package/runtime/third_party/bearssl/src/int/i32_decmod.c +0 -77
  860. package/runtime/third_party/bearssl/src/int/i32_decode.c +0 -63
  861. package/runtime/third_party/bearssl/src/int/i32_decred.c +0 -107
  862. package/runtime/third_party/bearssl/src/int/i32_div32.c +0 -56
  863. package/runtime/third_party/bearssl/src/int/i32_encode.c +0 -72
  864. package/runtime/third_party/bearssl/src/int/i32_fmont.c +0 -60
  865. package/runtime/third_party/bearssl/src/int/i32_iszero.c +0 -39
  866. package/runtime/third_party/bearssl/src/int/i32_modpow.c +0 -65
  867. package/runtime/third_party/bearssl/src/int/i32_montmul.c +0 -69
  868. package/runtime/third_party/bearssl/src/int/i32_mulacc.c +0 -56
  869. package/runtime/third_party/bearssl/src/int/i32_muladd.c +0 -138
  870. package/runtime/third_party/bearssl/src/int/i32_ninv32.c +0 -39
  871. package/runtime/third_party/bearssl/src/int/i32_reduce.c +0 -66
  872. package/runtime/third_party/bearssl/src/int/i32_sub.c +0 -51
  873. package/runtime/third_party/bearssl/src/int/i32_tmont.c +0 -36
  874. package/runtime/third_party/bearssl/src/int/i62_modpow2.c +0 -493
  875. package/runtime/third_party/bearssl/src/kdf/hkdf.c +0 -107
  876. package/runtime/third_party/bearssl/src/kdf/shake.c +0 -590
  877. package/runtime/third_party/bearssl/src/mac/hmac.c +0 -122
  878. package/runtime/third_party/bearssl/src/mac/hmac_ct.c +0 -193
  879. package/runtime/third_party/bearssl/src/rand/aesctr_drbg.c +0 -206
  880. package/runtime/third_party/bearssl/src/rand/hmac_drbg.c +0 -157
  881. package/runtime/third_party/bearssl/src/rand/sysrng.c +0 -252
  882. package/runtime/third_party/bearssl/src/rsa/rsa_default_keygen.c +0 -38
  883. package/runtime/third_party/bearssl/src/rsa/rsa_default_modulus.c +0 -36
  884. package/runtime/third_party/bearssl/src/rsa/rsa_default_oaep_decrypt.c +0 -38
  885. package/runtime/third_party/bearssl/src/rsa/rsa_default_oaep_encrypt.c +0 -38
  886. package/runtime/third_party/bearssl/src/rsa/rsa_default_pkcs1_sign.c +0 -38
  887. package/runtime/third_party/bearssl/src/rsa/rsa_default_pkcs1_vrfy.c +0 -38
  888. package/runtime/third_party/bearssl/src/rsa/rsa_default_priv.c +0 -38
  889. package/runtime/third_party/bearssl/src/rsa/rsa_default_privexp.c +0 -36
  890. package/runtime/third_party/bearssl/src/rsa/rsa_default_pss_sign.c +0 -38
  891. package/runtime/third_party/bearssl/src/rsa/rsa_default_pss_vrfy.c +0 -38
  892. package/runtime/third_party/bearssl/src/rsa/rsa_default_pub.c +0 -38
  893. package/runtime/third_party/bearssl/src/rsa/rsa_default_pubexp.c +0 -36
  894. package/runtime/third_party/bearssl/src/rsa/rsa_i15_keygen.c +0 -583
  895. package/runtime/third_party/bearssl/src/rsa/rsa_i15_modulus.c +0 -99
  896. package/runtime/third_party/bearssl/src/rsa/rsa_i15_oaep_decrypt.c +0 -41
  897. package/runtime/third_party/bearssl/src/rsa/rsa_i15_oaep_encrypt.c +0 -44
  898. package/runtime/third_party/bearssl/src/rsa/rsa_i15_pkcs1_sign.c +0 -37
  899. package/runtime/third_party/bearssl/src/rsa/rsa_i15_pkcs1_vrfy.c +0 -43
  900. package/runtime/third_party/bearssl/src/rsa/rsa_i15_priv.c +0 -209
  901. package/runtime/third_party/bearssl/src/rsa/rsa_i15_privexp.c +0 -320
  902. package/runtime/third_party/bearssl/src/rsa/rsa_i15_pss_sign.c +0 -40
  903. package/runtime/third_party/bearssl/src/rsa/rsa_i15_pss_vrfy.c +0 -44
  904. package/runtime/third_party/bearssl/src/rsa/rsa_i15_pub.c +0 -113
  905. package/runtime/third_party/bearssl/src/rsa/rsa_i15_pubexp.c +0 -152
  906. package/runtime/third_party/bearssl/src/rsa/rsa_i31_keygen.c +0 -37
  907. package/runtime/third_party/bearssl/src/rsa/rsa_i31_keygen_inner.c +0 -608
  908. package/runtime/third_party/bearssl/src/rsa/rsa_i31_modulus.c +0 -99
  909. package/runtime/third_party/bearssl/src/rsa/rsa_i31_oaep_decrypt.c +0 -41
  910. package/runtime/third_party/bearssl/src/rsa/rsa_i31_oaep_encrypt.c +0 -44
  911. package/runtime/third_party/bearssl/src/rsa/rsa_i31_pkcs1_sign.c +0 -37
  912. package/runtime/third_party/bearssl/src/rsa/rsa_i31_pkcs1_vrfy.c +0 -43
  913. package/runtime/third_party/bearssl/src/rsa/rsa_i31_priv.c +0 -203
  914. package/runtime/third_party/bearssl/src/rsa/rsa_i31_privexp.c +0 -318
  915. package/runtime/third_party/bearssl/src/rsa/rsa_i31_pss_sign.c +0 -40
  916. package/runtime/third_party/bearssl/src/rsa/rsa_i31_pss_vrfy.c +0 -44
  917. package/runtime/third_party/bearssl/src/rsa/rsa_i31_pub.c +0 -106
  918. package/runtime/third_party/bearssl/src/rsa/rsa_i31_pubexp.c +0 -152
  919. package/runtime/third_party/bearssl/src/rsa/rsa_i32_oaep_decrypt.c +0 -41
  920. package/runtime/third_party/bearssl/src/rsa/rsa_i32_oaep_encrypt.c +0 -44
  921. package/runtime/third_party/bearssl/src/rsa/rsa_i32_pkcs1_sign.c +0 -37
  922. package/runtime/third_party/bearssl/src/rsa/rsa_i32_pkcs1_vrfy.c +0 -43
  923. package/runtime/third_party/bearssl/src/rsa/rsa_i32_priv.c +0 -160
  924. package/runtime/third_party/bearssl/src/rsa/rsa_i32_pss_sign.c +0 -40
  925. package/runtime/third_party/bearssl/src/rsa/rsa_i32_pss_vrfy.c +0 -44
  926. package/runtime/third_party/bearssl/src/rsa/rsa_i32_pub.c +0 -77
  927. package/runtime/third_party/bearssl/src/rsa/rsa_i62_keygen.c +0 -57
  928. package/runtime/third_party/bearssl/src/rsa/rsa_i62_oaep_decrypt.c +0 -61
  929. package/runtime/third_party/bearssl/src/rsa/rsa_i62_oaep_encrypt.c +0 -64
  930. package/runtime/third_party/bearssl/src/rsa/rsa_i62_pkcs1_sign.c +0 -57
  931. package/runtime/third_party/bearssl/src/rsa/rsa_i62_pkcs1_vrfy.c +0 -63
  932. package/runtime/third_party/bearssl/src/rsa/rsa_i62_priv.c +0 -223
  933. package/runtime/third_party/bearssl/src/rsa/rsa_i62_pss_sign.c +0 -60
  934. package/runtime/third_party/bearssl/src/rsa/rsa_i62_pss_vrfy.c +0 -64
  935. package/runtime/third_party/bearssl/src/rsa/rsa_i62_pub.c +0 -125
  936. package/runtime/third_party/bearssl/src/rsa/rsa_oaep_pad.c +0 -112
  937. package/runtime/third_party/bearssl/src/rsa/rsa_oaep_unpad.c +0 -145
  938. package/runtime/third_party/bearssl/src/rsa/rsa_pkcs1_sig_pad.c +0 -100
  939. package/runtime/third_party/bearssl/src/rsa/rsa_pkcs1_sig_unpad.c +0 -121
  940. package/runtime/third_party/bearssl/src/rsa/rsa_pss_sig_pad.c +0 -106
  941. package/runtime/third_party/bearssl/src/rsa/rsa_pss_sig_unpad.c +0 -121
  942. package/runtime/third_party/bearssl/src/rsa/rsa_ssl_decrypt.c +0 -52
  943. package/runtime/third_party/bearssl/src/settings.c +0 -306
  944. package/runtime/third_party/bearssl/src/symcipher/aes_big_cbcdec.c +0 -69
  945. package/runtime/third_party/bearssl/src/symcipher/aes_big_cbcenc.c +0 -67
  946. package/runtime/third_party/bearssl/src/symcipher/aes_big_ctr.c +0 -84
  947. package/runtime/third_party/bearssl/src/symcipher/aes_big_ctrcbc.c +0 -142
  948. package/runtime/third_party/bearssl/src/symcipher/aes_big_dec.c +0 -254
  949. package/runtime/third_party/bearssl/src/symcipher/aes_big_enc.c +0 -157
  950. package/runtime/third_party/bearssl/src/symcipher/aes_common.c +0 -112
  951. package/runtime/third_party/bearssl/src/symcipher/aes_ct.c +0 -328
  952. package/runtime/third_party/bearssl/src/symcipher/aes_ct64.c +0 -398
  953. package/runtime/third_party/bearssl/src/symcipher/aes_ct64_cbcdec.c +0 -104
  954. package/runtime/third_party/bearssl/src/symcipher/aes_ct64_cbcenc.c +0 -81
  955. package/runtime/third_party/bearssl/src/symcipher/aes_ct64_ctr.c +0 -114
  956. package/runtime/third_party/bearssl/src/symcipher/aes_ct64_ctrcbc.c +0 -433
  957. package/runtime/third_party/bearssl/src/symcipher/aes_ct64_dec.c +0 -159
  958. package/runtime/third_party/bearssl/src/symcipher/aes_ct64_enc.c +0 -115
  959. package/runtime/third_party/bearssl/src/symcipher/aes_ct_cbcdec.c +0 -111
  960. package/runtime/third_party/bearssl/src/symcipher/aes_ct_cbcenc.c +0 -91
  961. package/runtime/third_party/bearssl/src/symcipher/aes_ct_ctr.c +0 -116
  962. package/runtime/third_party/bearssl/src/symcipher/aes_ct_ctrcbc.c +0 -422
  963. package/runtime/third_party/bearssl/src/symcipher/aes_ct_dec.c +0 -170
  964. package/runtime/third_party/bearssl/src/symcipher/aes_ct_enc.c +0 -112
  965. package/runtime/third_party/bearssl/src/symcipher/aes_pwr8.c +0 -445
  966. package/runtime/third_party/bearssl/src/symcipher/aes_pwr8_cbcdec.c +0 -670
  967. package/runtime/third_party/bearssl/src/symcipher/aes_pwr8_cbcenc.c +0 -417
  968. package/runtime/third_party/bearssl/src/symcipher/aes_pwr8_ctr.c +0 -717
  969. package/runtime/third_party/bearssl/src/symcipher/aes_pwr8_ctrcbc.c +0 -946
  970. package/runtime/third_party/bearssl/src/symcipher/aes_small_cbcdec.c +0 -69
  971. package/runtime/third_party/bearssl/src/symcipher/aes_small_cbcenc.c +0 -67
  972. package/runtime/third_party/bearssl/src/symcipher/aes_small_ctr.c +0 -84
  973. package/runtime/third_party/bearssl/src/symcipher/aes_small_ctrcbc.c +0 -142
  974. package/runtime/third_party/bearssl/src/symcipher/aes_small_dec.c +0 -176
  975. package/runtime/third_party/bearssl/src/symcipher/aes_small_enc.c +0 -129
  976. package/runtime/third_party/bearssl/src/symcipher/aes_x86ni.c +0 -240
  977. package/runtime/third_party/bearssl/src/symcipher/aes_x86ni_cbcdec.c +0 -223
  978. package/runtime/third_party/bearssl/src/symcipher/aes_x86ni_cbcenc.c +0 -122
  979. package/runtime/third_party/bearssl/src/symcipher/aes_x86ni_ctr.c +0 -211
  980. package/runtime/third_party/bearssl/src/symcipher/aes_x86ni_ctrcbc.c +0 -596
  981. package/runtime/third_party/bearssl/src/symcipher/chacha20_ct.c +0 -106
  982. package/runtime/third_party/bearssl/src/symcipher/chacha20_sse2.c +0 -237
  983. package/runtime/third_party/bearssl/src/symcipher/des_ct.c +0 -411
  984. package/runtime/third_party/bearssl/src/symcipher/des_ct_cbcdec.c +0 -87
  985. package/runtime/third_party/bearssl/src/symcipher/des_ct_cbcenc.c +0 -69
  986. package/runtime/third_party/bearssl/src/symcipher/des_support.c +0 -166
  987. package/runtime/third_party/bearssl/src/symcipher/des_tab.c +0 -310
  988. package/runtime/third_party/bearssl/src/symcipher/des_tab_cbcdec.c +0 -85
  989. package/runtime/third_party/bearssl/src/symcipher/des_tab_cbcenc.c +0 -67
  990. package/runtime/third_party/bearssl/src/symcipher/poly1305_ctmul.c +0 -260
  991. package/runtime/third_party/bearssl/src/symcipher/poly1305_ctmul32.c +0 -297
  992. package/runtime/third_party/bearssl/src/symcipher/poly1305_ctmulq.c +0 -475
  993. package/runtime/third_party/bearssl/src/symcipher/poly1305_i15.c +0 -221
  994. package/runtime/third_party/bearssl/src/x509/asn1.t0 +0 -757
  995. package/runtime/third_party/bearssl/src/x509/asn1enc.c +0 -93
  996. package/runtime/third_party/bearssl/src/x509/encode_ec_pk8der.c +0 -110
  997. package/runtime/third_party/bearssl/src/x509/encode_ec_rawder.c +0 -161
  998. package/runtime/third_party/bearssl/src/x509/encode_rsa_pk8der.c +0 -97
  999. package/runtime/third_party/bearssl/src/x509/encode_rsa_rawder.c +0 -96
  1000. package/runtime/third_party/bearssl/src/x509/skey_decoder.c +0 -653
  1001. package/runtime/third_party/bearssl/src/x509/skey_decoder.t0 +0 -376
  1002. package/runtime/third_party/bearssl/src/x509/x509_decoder.c +0 -776
  1003. package/runtime/third_party/bearssl/src/x509/x509_decoder.t0 +0 -324
  1004. package/runtime/third_party/bearssl/src/x509/x509_knownkey.c +0 -105
  1005. package/runtime/third_party/bearssl/src/x509/x509_minimal.c +0 -1722
  1006. package/runtime/third_party/bearssl/src/x509/x509_minimal.t0 +0 -1526
  1007. package/runtime/third_party/bearssl/src/x509/x509_minimal_full.c +0 -59
@@ -0,0 +1,2912 @@
1
+ // This file is generated from a similarly-named Perl script in the BoringSSL
2
+ // source tree. Do not edit by hand.
3
+
4
+ #include <openssl/asm_base.h>
5
+
6
+ #if !defined(OPENSSL_NO_ASM) && defined(OPENSSL_AARCH64) && defined(__APPLE__)
7
+ #if __ARM_MAX_ARCH__ >= 8
8
+ .arch_extension crypto
9
+ .arch_extension sha3
10
+
11
+ .text
12
+ .globl _aes_gcm_enc_kernel
13
+ .private_extern _aes_gcm_enc_kernel
14
+
15
+ .align 4
16
+ _aes_gcm_enc_kernel:
17
+ AARCH64_SIGN_LINK_REGISTER
18
+ stp x29, x30, [sp, #-224]!
19
+ mov x29, sp
20
+ ld1 { v0.16b}, [x4] // Load initial counter block
21
+ stp x19, x20, [sp, #16]
22
+ mov v1.16b, v0.16b // Initialize ctr1-3 from ctr0
23
+ mov v2.16b, v0.16b
24
+ mov v3.16b, v0.16b
25
+ mov x16, x4 // Pointer to counter block in memory
26
+ mov x8, x5 // Pointer to AES key schedule context
27
+ stp x21, x22, [sp, #32]
28
+ // [sp, #48] is unused but allocated to align the stack layout with aes_gcm_dec_kernel
29
+ stp d8, d9, [sp, #64] // Save Neon registers
30
+ stp d10, d11, [sp, #80]
31
+ stp d12, d13, [sp, #96]
32
+ stp d14, d15, [sp, #112]
33
+ ldr w17, [x8, #240] // Load number of AES rounds
34
+ add x7, x8, x17, lsl #4 // Calculate pointer to the last round key
35
+ ldp x13, x14, [x7] // load round N key (for final XOR)
36
+ ldr q31, [x7, #-16] // load round N-1 key
37
+ add x4, x0, x1, lsr #3 // Calculate end of input
38
+ lsr x5, x1, #3 // Total byte length
39
+ mov x15, x5
40
+ ldr w12, [x16, #12] // Load counter's low 32 bits
41
+ sub x5, x5, #1 // byte_len - 1
42
+ ldr q18, [x8, #0] // load rk0
43
+ and x5, x5, #0xffffffffffffffc0 // Align main loop end to a multiple of 64 bytes
44
+ add x5, x5, x0
45
+ rev w12, w12 // Reverse for big-endian increment
46
+ uxtw x10, w12 // Zero extend reversed w12 into x10 for final counter update
47
+ // Pre-compute this value instead of using two instructions to reconstruct it every iteration
48
+ mov x21, #0xc200000000000000 // GHASH reduction constant
49
+ str x21, [sp, #128]
50
+ // We maintain four copies of ctr values on the stack. Each loop iteration we
51
+ // store the updated ctr value to the last four bytes (e.g., 160 + 12).
52
+ // We then load the four values. This avoids a singificant number of
53
+ // expensive GPR->NEON and NEON->NEON moves. To avoid LDST forwarding we
54
+ // calculate and store the values one iteration ahead so they have time to
55
+ // drain before we load them.
56
+ str q0, [sp, #160] // Store base counter for block 0-3
57
+ str q0, [sp, #176]
58
+ str q0, [sp, #192]
59
+ str q0, [sp, #208]
60
+ // Since we need the values right away don't go through the stack this first
61
+ // time. Manually insert the incremented big-endian counter values.
62
+ rev w20, w12
63
+ mov v0.s[3], w20 // ctr0 + 0
64
+ add w20, w12, #1
65
+ rev w20, w20
66
+ mov v1.s[3], w20 // ctr0 + 1
67
+ add w20, w12, #2
68
+ rev w20, w20
69
+ mov v2.s[3], w20 // ctr0 + 2
70
+ add w20, w12, #3
71
+ rev w20, w20
72
+ mov v3.s[3], w20 // ctr0 + 3
73
+ // Calculate the ctr values for the *next* (not current) group of four
74
+ // blocks. Store the incremented parts to the stack.
75
+ add w20, w12, #4
76
+ rev w20, w20
77
+ str w20, [sp, #172] // ctr0 + 4 for next iter
78
+ add w20, w12, #5
79
+ rev w20, w20
80
+ str w20, [sp, #188] // ctr0 + 5 for next iter
81
+ add w20, w12, #6
82
+ rev w20, w20
83
+ str w20, [sp, #204] // ctr0 + 6 for next iter
84
+ add w20, w12, #7
85
+ rev w20, w20
86
+ str w20, [sp, #220] // ctr0 + 7 for next iter
87
+ add w12, w12, #8 // Advance counter past these two sets
88
+ // --- Start AES for first 4 blocks ---
89
+ aese v0.16b, v18.16b
90
+ aesmc v0.16b, v0.16b // AES block 0 - round 0
91
+ ldp q19, q20, [x8, #16] // load rk1, rk2
92
+ aese v1.16b, v18.16b
93
+ aesmc v1.16b, v1.16b // AES block 1 - round 0
94
+ ldp q21, q22, [x8, #48] // load rk3, rk4
95
+ aese v2.16b, v18.16b
96
+ aesmc v2.16b, v2.16b // AES block 2 - round 0
97
+ ldp q23, q24, [x8, #80] // load rk5, rk6
98
+ aese v3.16b, v18.16b
99
+ aesmc v3.16b, v3.16b // AES block 3 - round 0
100
+ ldp q13, q14, [x6, #32] // load H2, H3 (GHASH keys)
101
+ aese v0.16b, v19.16b
102
+ aesmc v0.16b, v0.16b // AES block 0 - round 1
103
+ ldp q25, q26, [x8, #112] // load rk7, rk8
104
+ aese v1.16b, v19.16b
105
+ aesmc v1.16b, v1.16b // AES block 1 - round 1
106
+ aese v2.16b, v19.16b
107
+ aesmc v2.16b, v2.16b // AES block 2 - round 1
108
+ aese v3.16b, v19.16b
109
+ aesmc v3.16b, v3.16b // AES block 3 - round 1
110
+ aese v0.16b, v20.16b
111
+ aesmc v0.16b, v0.16b // AES block 0 - round 2
112
+ ext v14.16b, v14.16b, v14.16b, #8 // Byte swap H3 for GHASH
113
+ aese v1.16b, v20.16b
114
+ aesmc v1.16b, v1.16b // AES block 1 - round 2
115
+ ext v13.16b, v13.16b, v13.16b, #8 // Byte swap H2 for GHASH
116
+ aese v2.16b, v20.16b
117
+ aesmc v2.16b, v2.16b // AES block 2 - round 2
118
+ ldr q15, [x6, #80] // load H4
119
+ aese v3.16b, v20.16b
120
+ aesmc v3.16b, v3.16b // AES block 3 - round 2
121
+ ext v15.16b, v15.16b, v15.16b, #8 // Byte swap H4 for GHASH
122
+ aese v0.16b, v21.16b
123
+ aesmc v0.16b, v0.16b // AES block 0 - round 3
124
+ ld1 { v11.16b}, [x3] // Load initial GHASH accumulator (T)
125
+ aese v1.16b, v21.16b
126
+ aesmc v1.16b, v1.16b // AES block 1 - round 3
127
+ ext v11.16b, v11.16b, v11.16b, #8 // Byte swap T for GHASH
128
+ aese v2.16b, v21.16b
129
+ aesmc v2.16b, v2.16b // AES block 2 - round 3
130
+ rev64 v11.16b, v11.16b // Correct byte order within 64-bit lanes
131
+ aese v3.16b, v21.16b
132
+ aesmc v3.16b, v3.16b // AES block 3 - round 3
133
+ trn2 v17.2d, v14.2d, v15.2d // Karatsuba key: H4_low | H3_low
134
+ aese v0.16b, v22.16b
135
+ aesmc v0.16b, v0.16b // AES block 0 - round 4
136
+ ldr q12, [x6] // load H1
137
+ aese v1.16b, v22.16b
138
+ aesmc v1.16b, v1.16b // AES block 1 - round 4
139
+ ext v12.16b, v12.16b, v12.16b, #8 // Byte swap H1 for GHASH
140
+ aese v2.16b, v22.16b
141
+ aesmc v2.16b, v2.16b // AES block 2 - round 4
142
+ trn1 v9.2d, v14.2d, v15.2d // Karatsuba key: H4_high | H3_high
143
+ aese v3.16b, v22.16b
144
+ aesmc v3.16b, v3.16b // AES block 3 - round 4
145
+ trn2 v16.2d, v12.2d, v13.2d // Karatsuba key: H2_low | H1_low
146
+ aese v0.16b, v23.16b
147
+ aesmc v0.16b, v0.16b // AES block 0 - round 5
148
+ ldr q30, [x7] // Preload round N key for final EOR
149
+ aese v1.16b, v23.16b
150
+ aesmc v1.16b, v1.16b // AES block 1 - round 5
151
+ aese v3.16b, v23.16b
152
+ aesmc v3.16b, v3.16b // AES block 3 - round 5
153
+ aese v2.16b, v23.16b
154
+ aesmc v2.16b, v2.16b // AES block 2 - round 5
155
+ aese v0.16b, v24.16b
156
+ aesmc v0.16b, v0.16b // AES block 0 - round 6
157
+ aese v1.16b, v24.16b
158
+ aesmc v1.16b, v1.16b // AES block 1 - round 6
159
+ aese v2.16b, v24.16b
160
+ aesmc v2.16b, v2.16b // AES block 2 - round 6
161
+ aese v3.16b, v24.16b
162
+ aesmc v3.16b, v3.16b // AES block 3 - round 6
163
+ aese v0.16b, v25.16b
164
+ aesmc v0.16b, v0.16b // AES block 0 - round 7
165
+ aese v1.16b, v25.16b
166
+ aesmc v1.16b, v1.16b // AES block 1 - round 7
167
+ aese v2.16b, v25.16b
168
+ aesmc v2.16b, v2.16b // AES block 2 - round 7
169
+ aese v3.16b, v25.16b
170
+ aesmc v3.16b, v3.16b // AES block 3 - round 7
171
+ aese v0.16b, v26.16b
172
+ aesmc v0.16b, v0.16b // AES block 0 - round 8
173
+ aese v1.16b, v26.16b
174
+ aesmc v1.16b, v1.16b // AES block 1 - round 8
175
+ aese v2.16b, v26.16b
176
+ aesmc v2.16b, v2.16b // AES block 2 - round 8
177
+ aese v3.16b, v26.16b
178
+ aesmc v3.16b, v3.16b // AES block 3 - round 8
179
+ cmp x17, #12 // setup flags for AES-128/192/256 check
180
+ b.lt Lenc_finish_first_blocks // branch if AES-128
181
+ ldp q27, q28, [x8, #144] // load rk9, rk10
182
+ aese v1.16b, v27.16b
183
+ aesmc v1.16b, v1.16b // AES block 1 - round 9
184
+ aese v2.16b, v27.16b
185
+ aesmc v2.16b, v2.16b // AES block 2 - round 9
186
+ aese v3.16b, v27.16b
187
+ aesmc v3.16b, v3.16b // AES block 3 - round 9
188
+ aese v0.16b, v27.16b
189
+ aesmc v0.16b, v0.16b // AES block 0 - round 9
190
+ aese v1.16b, v28.16b
191
+ aesmc v1.16b, v1.16b // AES block 1 - round 10
192
+ aese v2.16b, v28.16b
193
+ aesmc v2.16b, v2.16b // AES block 2 - round 10
194
+ aese v3.16b, v28.16b
195
+ aesmc v3.16b, v3.16b // AES block 3 - round 10
196
+ aese v0.16b, v28.16b
197
+ aesmc v0.16b, v0.16b // AES block 0 - round 10
198
+ b.eq Lenc_finish_first_blocks // branch if AES-192
199
+ ldp q27, q28, [x8, #176] // load rk11, rk12
200
+ aese v1.16b, v27.16b
201
+ aesmc v1.16b, v1.16b // AES block 1 - round 11
202
+ aese v2.16b, v27.16b
203
+ aesmc v2.16b, v2.16b // AES block 2 - round 11
204
+ aese v3.16b, v27.16b
205
+ aesmc v3.16b, v3.16b // AES block 3 - round 11
206
+ aese v0.16b, v27.16b
207
+ aesmc v0.16b, v0.16b // AES block 0 - round 11
208
+ aese v1.16b, v28.16b
209
+ aesmc v1.16b, v1.16b // AES block 1 - round 12
210
+ aese v2.16b, v28.16b
211
+ aesmc v2.16b, v2.16b // AES block 2 - round 12
212
+ aese v3.16b, v28.16b
213
+ aesmc v3.16b, v3.16b // AES block 3 - round 12
214
+ aese v0.16b, v28.16b
215
+ aesmc v0.16b, v0.16b // AES block 0 - round 12
216
+ Lenc_finish_first_blocks:
217
+ cmp x0, x5 // check if we have <= 4 blocks to process in the tail
218
+ eor v17.16b, v17.16b, v9.16b // Karatsuba key: H3^H4
219
+ aese v0.16b, v31.16b // AES block 0 - round N-1
220
+ aese v1.16b, v31.16b // AES block 1 - round N-1
221
+ aese v2.16b, v31.16b // AES block 2 - round N-1
222
+ aese v3.16b, v31.16b // AES block 3 - round N-1
223
+ trn1 v8.2d, v12.2d, v13.2d // Karatsuba key: H2_high | H1_high
224
+ eor v16.16b, v16.16b, v8.16b // Karatsuba key: H1^H2
225
+ b.ge Lenc_tail // handle tail if no more full 4-block sets
226
+ ldp q6, q7, [x0, #32] // AES blocks 2,3 load plaintext
227
+ ldp q4, q5, [x0], #64 // AES blocks 0,1 load plaintext
228
+ // Compute and store first 4 ciphertext blocks
229
+ eor v4.16b, v4.16b, v30.16b
230
+ eor v4.16b, v4.16b, v0.16b // AES block 0 - result = PT ^ AES(ctr0)
231
+ eor v5.16b, v5.16b, v30.16b
232
+ eor v5.16b, v5.16b, v1.16b // AES block 1 - result = PT ^ AES(ctr1)
233
+ eor v6.16b, v6.16b, v30.16b
234
+ eor v6.16b, v6.16b, v2.16b // AES block 2 - result = PT ^ AES(ctr2)
235
+ eor v7.16b, v7.16b, v30.16b
236
+ eor v7.16b, v7.16b, v3.16b // AES block 3 - result = PT ^ AES(ctr3)
237
+ st1 { v4.16b, v5.16b, v6.16b, v7.16b}, [x2], #64 // AES blocks 0-3 - store result
238
+ // Load counter values for the second iteration from the stack
239
+ ldp q0, q1, [sp, #160]
240
+ ldp q2, q3, [sp, #192]
241
+ // Prepare and store counter values for the third iteration
242
+ rev w20, w12
243
+ str w20, [sp, #172] // ctr + 8
244
+ add w20, w12, #1
245
+ rev w20, w20
246
+ str w20, [sp, #188] // ctr + 9
247
+ add w20, w12, #2
248
+ rev w20, w20
249
+ str w20, [sp, #204] // ctr + 10
250
+ add w20, w12, #3
251
+ rev w20, w20
252
+ str w20, [sp, #220] // ctr + 11
253
+ add w12, w12, #4 // Advance counter base
254
+ cmp x0, x5 // check if we have <= 4 blocks remaining
255
+ b.ge Lenc_prepretail // go to prepretail if < 2 full loops left
256
+ Lenc_main_loop: // main loop start (processes 4 blocks per iteration)
257
+ // --- AES Pipeline for blocks 4k+4 to 4k+7 ---
258
+ aese v0.16b, v18.16b
259
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 0
260
+ aese v1.16b, v18.16b
261
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 0
262
+ aese v2.16b, v18.16b
263
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 0
264
+ aese v3.16b, v18.16b
265
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 0
266
+ ldr d8, [sp, #128] // Load GHASH reduction constant
267
+ aese v0.16b, v19.16b
268
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 1
269
+ aese v1.16b, v19.16b
270
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 1
271
+ aese v2.16b, v19.16b
272
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 1
273
+ aese v3.16b, v19.16b
274
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 1
275
+ // --- GHASH Pipeline (interleaved with AES) for blocks 4k to 4k+3 ---
276
+ rev64 v4.16b, v4.16b // GHASH block 4k - Byte swap CT
277
+ rev64 v5.16b, v5.16b // GHASH block 4k+1 - Byte swap CT
278
+ rev64 v6.16b, v6.16b // GHASH block 4k+2 - Byte swap CT
279
+ rev64 v7.16b, v7.16b // GHASH block 4k+3 - Byte swap CT
280
+ aese v0.16b, v20.16b
281
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 2
282
+ ext v11.16b, v11.16b, v11.16b, #8 // GHASH - prepare acc for XOR
283
+ aese v1.16b, v20.16b
284
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 2
285
+ eor v4.16b, v4.16b, v11.16b // GHASH block 4k - Y_i = CT_i ^ Y_{i-1}
286
+ aese v2.16b, v20.16b
287
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 2
288
+ pmull v11.1q, v4.1d, v15.1d // GHASH block 4k - low
289
+ aese v3.16b, v20.16b
290
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 2
291
+ pmull2 v9.1q, v6.2d, v13.2d // GHASH block 4k+2 - high
292
+ aese v0.16b, v21.16b
293
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 3
294
+ mov d10, v17.d[1] // GHASH block 4k - mid Karatsuba key
295
+ aese v1.16b, v21.16b
296
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 3
297
+ mov d20, v4.d[1] // GHASH block 4k - mid
298
+ aese v2.16b, v21.16b
299
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 3
300
+ eor v20.8b, v20.8b, v4.8b // GHASH block 4k - mid
301
+ aese v3.16b, v21.16b
302
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 3
303
+ mov d21, v5.d[1] // GHASH block 4k+1 - mid
304
+ aese v0.16b, v22.16b
305
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 4
306
+ eor v21.8b, v21.8b, v5.8b // GHASH block 4k+1 - mid
307
+ aese v1.16b, v22.16b
308
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 4
309
+ pmull v10.1q, v20.1d, v10.1d // GHASH block 4k - mid
310
+ aese v2.16b, v22.16b
311
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 4
312
+ pmull v21.1q, v21.1d, v17.1d // GHASH block 4k+1 - mid
313
+ aese v3.16b, v22.16b
314
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 4
315
+ eor v10.16b, v10.16b, v21.16b // GHASH block 4k+1 - mid
316
+ aese v0.16b, v23.16b
317
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 5
318
+ ext v22.16b, v22.16b, v6.16b, #8 // GHASH block 4k+2 - mid
319
+ aese v1.16b, v23.16b
320
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 5
321
+ eor v22.16b, v22.16b, v6.16b // GHASH block 4k+2 - mid
322
+ aese v2.16b, v23.16b
323
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 5
324
+ pmull2 v22.1q, v22.2d, v16.2d // GHASH block 4k+2 - mid
325
+ aese v3.16b, v23.16b
326
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 5
327
+ mov d23, v7.d[1] // GHASH block 4k+3 - mid
328
+ aese v0.16b, v24.16b
329
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 6
330
+ eor v23.8b, v23.8b, v7.8b // GHASH block 4k+3 - mid
331
+ aese v1.16b, v24.16b
332
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 6
333
+ pmull v23.1q, v23.1d, v16.1d // GHASH block 4k+3 - mid
334
+ aese v2.16b, v24.16b
335
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 6
336
+ eor v10.16b, v10.16b, v22.16b
337
+ eor v10.16b, v10.16b, v23.16b // GHASH block 4k+2/3 - mid
338
+ aese v3.16b, v24.16b
339
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 6
340
+ pmull2 v22.1q, v4.2d, v15.2d // GHASH block 4k - high
341
+ aese v0.16b, v25.16b
342
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 7
343
+ pmull2 v21.1q, v7.2d, v12.2d // GHASH block 4k+3 - high
344
+ eor v22.16b, v22.16b, v21.16b // GHASH block 4k+3 - high
345
+ aese v1.16b, v25.16b
346
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 7
347
+ pmull2 v23.1q, v5.2d, v14.2d // GHASH block 4k+1 - high
348
+ aese v2.16b, v25.16b
349
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 7
350
+ pmull v21.1q, v6.1d, v13.1d // GHASH block 4k+2 - low
351
+ aese v3.16b, v25.16b
352
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 7
353
+ pmull v20.1q, v5.1d, v14.1d // GHASH block 4k+1 - low
354
+ eor v9.16b, v9.16b, v22.16b
355
+ eor v9.16b, v9.16b, v23.16b // GHASH block 4k/1/2/3 - high
356
+ pmull v22.1q, v7.1d, v12.1d // GHASH block 4k+3 - low
357
+ ldp q6, q7, [x0, #32]
358
+ ldp q4, q5, [x0], #64
359
+ eor v20.16b, v20.16b, v21.16b // GHASH block 4k+1 - low
360
+ aese v0.16b, v26.16b
361
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 8
362
+ eor v11.16b, v11.16b, v22.16b
363
+ eor v11.16b, v11.16b, v20.16b // GHASH block 4k/1/2/3 - low
364
+ aese v1.16b, v26.16b
365
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 8
366
+ eor v10.16b, v10.16b, v9.16b
367
+ eor v10.16b, v10.16b, v11.16b // MODULO - karatsuba tidy up
368
+ aese v2.16b, v26.16b
369
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 8
370
+ pmull v20.1q, v9.1d, v8.1d // MODULO - top 64b align with mid
371
+ aese v3.16b, v26.16b
372
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 8
373
+ cmp x17, #12 // setup flags for AES-128/192/256 check
374
+ b.lt Lenc_main_loop_continue // branch if AES-128
375
+ ldp q27, q28, [x8, #144] // load rk9, rk10
376
+ aese v0.16b, v27.16b
377
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 9
378
+ aese v1.16b, v27.16b
379
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 9
380
+ aese v2.16b, v27.16b
381
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 9
382
+ aese v3.16b, v27.16b
383
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 9
384
+ aese v0.16b, v28.16b
385
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 10
386
+ aese v1.16b, v28.16b
387
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 10
388
+ aese v2.16b, v28.16b
389
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 10
390
+ aese v3.16b, v28.16b
391
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 10
392
+ b.eq Lenc_main_loop_continue // branch if AES-192
393
+ ldp q27, q28, [x8, #176] // load rk11, rk12
394
+ aese v0.16b, v27.16b
395
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 11
396
+ aese v1.16b, v27.16b
397
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 11
398
+ aese v2.16b, v27.16b
399
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 11
400
+ aese v3.16b, v27.16b
401
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 11
402
+ aese v0.16b, v28.16b
403
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 12
404
+ aese v1.16b, v28.16b
405
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 12
406
+ aese v2.16b, v28.16b
407
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 12
408
+ aese v3.16b, v28.16b
409
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 12
410
+ Lenc_main_loop_continue:
411
+ ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment
412
+ eor v10.16b, v10.16b, v20.16b
413
+ eor v10.16b, v10.16b, v9.16b // MODULO - fold into mid
414
+ pmull v9.1q, v10.1d, v8.1d // MODULO - mid 64b align with low
415
+ ext v20.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment
416
+ eor v11.16b, v9.16b, v11.16b
417
+ eor v11.16b, v11.16b, v20.16b // MODULO - fold into low
418
+ aese v0.16b, v31.16b // AES block 4k+4 - round N-1
419
+ eor v4.16b, v4.16b, v30.16b
420
+ eor v4.16b, v4.16b, v0.16b // AES block 4k+4 - result
421
+ aese v1.16b, v31.16b // AES block 4k+5 - round N-1
422
+ eor v5.16b, v5.16b, v30.16b
423
+ eor v5.16b, v5.16b, v1.16b // AES block 4k+5 - result
424
+ aese v2.16b, v31.16b // AES block 4k+6 - round N-1
425
+ eor v6.16b, v6.16b, v30.16b
426
+ eor v6.16b, v6.16b, v2.16b // AES block 4k+6 - result
427
+ aese v3.16b, v31.16b // AES block 4k+7 - round N-1
428
+ eor v7.16b, v7.16b, v30.16b
429
+ eor v7.16b, v7.16b, v3.16b // AES block 4k+7 - result
430
+ ldp q0, q1, [sp, #160]
431
+ ldp q2, q3, [sp, #192]
432
+ // We used these registers as temporaries above so reload the RKs.
433
+ ldp q20, q21, [x8, #32] // load rk2, rk3
434
+ ldp q22, q23, [x8, #64] // load rk4, rk5
435
+ st1 { v4.16b, v5.16b, v6.16b, v7.16b}, [x2], #64 // AES blocks 4k+4-7 - store result
436
+ rev w20, w12
437
+ str w20, [sp, #172]
438
+ add w20, w12, #1
439
+ rev w20, w20
440
+ str w20, [sp, #188]
441
+ add w20, w12, #2
442
+ rev w20, w20
443
+ str w20, [sp, #204]
444
+ add w20, w12, #3
445
+ rev w20, w20
446
+ str w20, [sp, #220]
447
+ add w12, w12, #4
448
+ cmp x0, x5 // LOOP CONTROL
449
+ b.lt Lenc_main_loop
450
+ Lenc_prepretail: // PREPRETAIL
451
+ aese v1.16b, v18.16b
452
+ aesmc v1.16b, v1.16b // AES block 1 - round 0
453
+ rev64 v6.16b, v6.16b // GHASH block 2
454
+ aese v2.16b, v18.16b
455
+ aesmc v2.16b, v2.16b // AES block 2 - round 0
456
+ aese v0.16b, v18.16b
457
+ aesmc v0.16b, v0.16b // AES block 0 - round 0
458
+ rev64 v4.16b, v4.16b // GHASH block 0
459
+ ext v11.16b, v11.16b, v11.16b, #8 // PRE 0
460
+ aese v2.16b, v19.16b
461
+ aesmc v2.16b, v2.16b // AES block 2 - round 1
462
+ aese v0.16b, v19.16b
463
+ aesmc v0.16b, v0.16b // AES block 0 - round 1
464
+ eor v4.16b, v4.16b, v11.16b // PRE 1
465
+ rev64 v5.16b, v5.16b // GHASH block 1
466
+ aese v2.16b, v20.16b
467
+ aesmc v2.16b, v2.16b // AES block 2 - round 2
468
+ aese v3.16b, v18.16b
469
+ aesmc v3.16b, v3.16b // AES block 3 - round 0
470
+ mov d10, v17.d[1] // GHASH block 0 - mid Karatsuba key
471
+ aese v1.16b, v19.16b
472
+ aesmc v1.16b, v1.16b // AES block 1 - round 1
473
+ pmull v11.1q, v4.1d, v15.1d // GHASH block 0 - low
474
+ mov d8, v4.d[1] // GHASH block 0 - mid
475
+ pmull2 v9.1q, v4.2d, v15.2d // GHASH block 0 - high
476
+ aese v2.16b, v21.16b
477
+ aesmc v2.16b, v2.16b // AES block 2 - round 3
478
+ aese v1.16b, v20.16b
479
+ aesmc v1.16b, v1.16b // AES block 1 - round 2
480
+ eor v8.8b, v8.8b, v4.8b // GHASH block 0 - mid
481
+ aese v0.16b, v20.16b
482
+ aesmc v0.16b, v0.16b // AES block 0 - round 2
483
+ aese v3.16b, v19.16b
484
+ aesmc v3.16b, v3.16b // AES block 3 - round 1
485
+ aese v1.16b, v21.16b
486
+ aesmc v1.16b, v1.16b // AES block 1 - round 3
487
+ pmull v10.1q, v8.1d, v10.1d // GHASH block 0 - mid
488
+ pmull2 v4.1q, v5.2d, v14.2d // GHASH block 1 - high
489
+ pmull v8.1q, v5.1d, v14.1d // GHASH block 1 - low
490
+ aese v3.16b, v20.16b
491
+ aesmc v3.16b, v3.16b // AES block 3 - round 2
492
+ eor v9.16b, v9.16b, v4.16b // GHASH block 1 - high
493
+ mov d4, v5.d[1] // GHASH block 1 - mid
494
+ aese v0.16b, v21.16b
495
+ aesmc v0.16b, v0.16b // AES block 0 - round 3
496
+ eor v11.16b, v11.16b, v8.16b // GHASH block 1 - low
497
+ aese v3.16b, v21.16b
498
+ aesmc v3.16b, v3.16b // AES block 3 - round 3
499
+ eor v4.8b, v4.8b, v5.8b // GHASH block 1 - mid
500
+ mov d8, v6.d[1] // GHASH block 2 - mid
501
+ aese v0.16b, v22.16b
502
+ aesmc v0.16b, v0.16b // AES block 0 - round 4
503
+ rev64 v7.16b, v7.16b // GHASH block 3
504
+ aese v3.16b, v22.16b
505
+ aesmc v3.16b, v3.16b // AES block 3 - round 4
506
+ pmull v4.1q, v4.1d, v17.1d // GHASH block 1 - mid
507
+ eor v8.8b, v8.8b, v6.8b // GHASH block 2 - mid
508
+ pmull v5.1q, v6.1d, v13.1d // GHASH block 2 - low
509
+ aese v3.16b, v23.16b
510
+ aesmc v3.16b, v3.16b // AES block 3 - round 5
511
+ aese v2.16b, v22.16b
512
+ aesmc v2.16b, v2.16b // AES block 2 - round 4
513
+ eor v10.16b, v10.16b, v4.16b // GHASH block 1 - mid
514
+ pmull2 v4.1q, v6.2d, v13.2d // GHASH block 2 - high
515
+ eor v11.16b, v11.16b, v5.16b // GHASH block 2 - low
516
+ ins v8.d[1], v8.d[0] // GHASH block 2 - mid
517
+ aese v2.16b, v23.16b
518
+ aesmc v2.16b, v2.16b // AES block 2 - round 5
519
+ eor v9.16b, v9.16b, v4.16b // GHASH block 2 - high
520
+ mov d4, v7.d[1] // GHASH block 3 - mid
521
+ aese v1.16b, v22.16b
522
+ aesmc v1.16b, v1.16b // AES block 1 - round 4
523
+ pmull2 v8.1q, v8.2d, v16.2d // GHASH block 2 - mid
524
+ eor v4.8b, v4.8b, v7.8b // GHASH block 3 - mid
525
+ pmull2 v5.1q, v7.2d, v12.2d // GHASH block 3 - high
526
+ aese v1.16b, v23.16b
527
+ aesmc v1.16b, v1.16b // AES block 1 - round 5
528
+ pmull v4.1q, v4.1d, v16.1d // GHASH block 3 - mid
529
+ eor v10.16b, v10.16b, v8.16b // GHASH block 2 - mid
530
+ aese v0.16b, v23.16b
531
+ aesmc v0.16b, v0.16b // AES block 0 - round 5
532
+ aese v1.16b, v24.16b
533
+ aesmc v1.16b, v1.16b // AES block 1 - round 6
534
+ aese v2.16b, v24.16b
535
+ aesmc v2.16b, v2.16b // AES block 2 - round 6
536
+ aese v0.16b, v24.16b
537
+ aesmc v0.16b, v0.16b // AES block 0 - round 6
538
+ aese v3.16b, v24.16b
539
+ aesmc v3.16b, v3.16b // AES block 3 - round 6
540
+ aese v1.16b, v25.16b
541
+ aesmc v1.16b, v1.16b // AES block 1 - round 7
542
+ eor v9.16b, v9.16b, v5.16b // GHASH block 3 - high
543
+ aese v0.16b, v25.16b
544
+ aesmc v0.16b, v0.16b // AES block 0 - round 7
545
+ aese v3.16b, v25.16b
546
+ aesmc v3.16b, v3.16b // AES block 3 - round 7
547
+ ldr d8, [sp, #128]
548
+ aese v1.16b, v26.16b
549
+ aesmc v1.16b, v1.16b // AES block 1 - round 8
550
+ eor v10.16b, v10.16b, v4.16b // GHASH block 3 - mid
551
+ pmull v6.1q, v7.1d, v12.1d // GHASH block 3 - low
552
+ aese v3.16b, v26.16b
553
+ aesmc v3.16b, v3.16b // AES block 3 - round 8
554
+ cmp x17, #12 // setup flags for AES-128/192/256 check
555
+ aese v0.16b, v26.16b
556
+ aesmc v0.16b, v0.16b // AES block 0 - round 8
557
+ eor v11.16b, v11.16b, v6.16b // GHASH block 3 - low
558
+ aese v2.16b, v25.16b
559
+ aesmc v2.16b, v2.16b // AES block 2 - round 7
560
+ eor v10.16b, v10.16b, v9.16b // karatsuba tidy up
561
+ aese v2.16b, v26.16b
562
+ aesmc v2.16b, v2.16b // AES block 2 - round 8
563
+ pmull v4.1q, v9.1d, v8.1d
564
+ ext v9.16b, v9.16b, v9.16b, #8
565
+ eor v10.16b, v10.16b, v11.16b
566
+ b.lt Lenc_finish_prepretail // branch if AES-128
567
+ ldp q27, q28, [x8, #144] // load rk9, rk10
568
+ aese v0.16b, v27.16b
569
+ aesmc v0.16b, v0.16b // AES block 0 - round 9
570
+ aese v1.16b, v27.16b
571
+ aesmc v1.16b, v1.16b // AES block 1 - round 9
572
+ aese v2.16b, v27.16b
573
+ aesmc v2.16b, v2.16b // AES block 2 - round 9
574
+ aese v3.16b, v27.16b
575
+ aesmc v3.16b, v3.16b // AES block 3 - round 9
576
+ aese v0.16b, v28.16b
577
+ aesmc v0.16b, v0.16b // AES block 0 - round 10
578
+ aese v1.16b, v28.16b
579
+ aesmc v1.16b, v1.16b // AES block 1 - round 10
580
+ aese v2.16b, v28.16b
581
+ aesmc v2.16b, v2.16b // AES block 2 - round 10
582
+ aese v3.16b, v28.16b
583
+ aesmc v3.16b, v3.16b // AES block 3 - round 10
584
+ b.eq Lenc_finish_prepretail // branch if AES-192
585
+ ldp q27, q28, [x8, #176] // load rk11, rk12
586
+ aese v0.16b, v27.16b
587
+ aesmc v0.16b, v0.16b // AES block 0 - round 11
588
+ aese v1.16b, v27.16b
589
+ aesmc v1.16b, v1.16b // AES block 1 - round 11
590
+ aese v2.16b, v27.16b
591
+ aesmc v2.16b, v2.16b // AES block 2 - round 11
592
+ aese v3.16b, v27.16b
593
+ aesmc v3.16b, v3.16b // AES block 3 - round 11
594
+ aese v0.16b, v28.16b
595
+ aesmc v0.16b, v0.16b // AES block 0 - round 12
596
+ aese v1.16b, v28.16b
597
+ aesmc v1.16b, v1.16b // AES block 1 - round 12
598
+ aese v2.16b, v28.16b
599
+ aesmc v2.16b, v2.16b // AES block 2 - round 12
600
+ aese v3.16b, v28.16b
601
+ aesmc v3.16b, v3.16b // AES block 3 - round 12
602
+ Lenc_finish_prepretail:
603
+ aese v0.16b, v31.16b // AES block 0 - round N-1
604
+ aese v1.16b, v31.16b // AES block 1 - round N-1
605
+ aese v2.16b, v31.16b // AES block 2 - round N-1
606
+ aese v3.16b, v31.16b // AES block 3 - round N-1
607
+ eor v10.16b, v10.16b, v4.16b
608
+ eor v10.16b, v10.16b, v9.16b
609
+ pmull v4.1q, v10.1d, v8.1d
610
+ ext v10.16b, v10.16b, v10.16b, #8
611
+ eor v11.16b, v11.16b, v4.16b
612
+ eor v11.16b, v11.16b, v10.16b
613
+ Lenc_tail: // TAIL: Process remaining 0 to 3 blocks
614
+ ext v8.16b, v11.16b, v11.16b, #8 // Save current GHASH state for partial tag feed-in
615
+ sub x5, x4, x0 // main_end_input_ptr is number of bytes left to process
616
+ ldp x6, x7, [x0], #16 // AES block 0 - load plaintext
617
+ eor x6, x6, x13 // AES block 0 - round N low
618
+ eor x7, x7, x14 // AES block 0 - round N high
619
+ cmp x5, #48
620
+ fmov d4, x6 // AES block 0 - mov low
621
+ fmov v4.d[1], x7 // AES block 0 - mov high
622
+ eor v5.16b, v4.16b, v0.16b // AES block 0 - result
623
+ b.gt Lenc_blocks_more_than_3
624
+ cmp x5, #32
625
+ mov v3.16b, v2.16b
626
+ movi v11.8b, #0
627
+ movi v9.8b, #0
628
+ mov v2.16b, v1.16b
629
+ movi v10.8b, #0
630
+ b.gt Lenc_blocks_more_than_2
631
+ mov v3.16b, v1.16b
632
+ cmp x5, #16
633
+ b.gt Lenc_blocks_more_than_1
634
+ b Lenc_blocks_less_than_1
635
+ Lenc_blocks_more_than_3: // blocks left > 3
636
+ st1 { v5.16b}, [x2], #16 // AES final-2 block - store result
637
+ ldp x6, x7, [x0], #16 // AES final-2 block - load input low & high
638
+ rev64 v4.16b, v5.16b // GHASH final-3 block
639
+ eor x6, x6, x13 // AES final-2 block - round N low
640
+ eor v4.16b, v4.16b, v8.16b // feed in partial tag
641
+ eor x7, x7, x14 // AES final-2 block - round N high
642
+ mov d22, v4.d[1] // GHASH final-3 block - mid
643
+ fmov d5, x6 // AES final-2 block - mov low
644
+ fmov v5.d[1], x7 // AES final-2 block - mov high
645
+ eor v22.8b, v22.8b, v4.8b // GHASH final-3 block - mid
646
+ movi v8.8b, #0 // suppress further partial tag feed in
647
+ mov d10, v17.d[1] // GHASH final-3 block - mid
648
+ pmull v11.1q, v4.1d, v15.1d // GHASH final-3 block - low
649
+ pmull2 v9.1q, v4.2d, v15.2d // GHASH final-3 block - high
650
+ pmull v10.1q, v22.1d, v10.1d // GHASH final-3 block - mid
651
+ eor v5.16b, v5.16b, v1.16b // AES final-2 block - result
652
+ Lenc_blocks_more_than_2: // blocks left > 2
653
+ st1 { v5.16b}, [x2], #16 // AES final-2 block - store result
654
+ ldp x6, x7, [x0], #16 // AES final-1 block - load input low & high
655
+ rev64 v4.16b, v5.16b // GHASH final-2 block
656
+ eor x6, x6, x13 // AES final-1 block - round N low
657
+ eor v4.16b, v4.16b, v8.16b // feed in partial tag
658
+ fmov d5, x6 // AES final-1 block - mov low
659
+ eor x7, x7, x14 // AES final-1 block - round N high
660
+ fmov v5.d[1], x7 // AES final-1 block - mov high
661
+ movi v8.8b, #0 // suppress further partial tag feed in
662
+ pmull2 v20.1q, v4.2d, v14.2d // GHASH final-2 block - high
663
+ mov d22, v4.d[1] // GHASH final-2 block - mid
664
+ pmull v21.1q, v4.1d, v14.1d // GHASH final-2 block - low
665
+ eor v22.8b, v22.8b, v4.8b // GHASH final-2 block - mid
666
+ eor v5.16b, v5.16b, v2.16b // AES final-1 block - result
667
+ eor v9.16b, v9.16b, v20.16b // GHASH final-2 block - high
668
+ pmull v22.1q, v22.1d, v17.1d // GHASH final-2 block - mid
669
+ eor v11.16b, v11.16b, v21.16b // GHASH final-2 block - low
670
+ eor v10.16b, v10.16b, v22.16b // GHASH final-2 block - mid
671
+ Lenc_blocks_more_than_1: // blocks left > 1
672
+ st1 { v5.16b}, [x2], #16 // AES final-1 block - store result
673
+ rev64 v4.16b, v5.16b // GHASH final-1 block: Byte Swap CT
674
+ ldp x6, x7, [x0], #16 // AES final block - load plaintext
675
+ eor v4.16b, v4.16b, v8.16b // Feed in partial tag
676
+ movi v8.8b, #0 // Clear for next block
677
+ eor x6, x6, x13 // AES final block - round N low
678
+ mov d22, v4.d[1] // GHASH final-1 block - mid
679
+ pmull2 v20.1q, v4.2d, v13.2d // GHASH final-1 block - high
680
+ eor x7, x7, x14 // AES final block - round N high
681
+ eor v22.8b, v22.8b, v4.8b // GHASH final-1 block - mid
682
+ eor v9.16b, v9.16b, v20.16b // GHASH final-1 block - high
683
+ ins v22.d[1], v22.d[0] // GHASH final-1 block - mid
684
+ fmov d5, x6 // AES final block - mov low
685
+ fmov v5.d[1], x7 // AES final block - mov high
686
+ pmull2 v22.1q, v22.2d, v16.2d // GHASH final-1 block - mid
687
+ pmull v21.1q, v4.1d, v13.1d // GHASH final-1 block - low
688
+ eor v5.16b, v5.16b, v3.16b // AES final block - result
689
+ eor v10.16b, v10.16b, v22.16b // GHASH final-1 block - mid
690
+ eor v11.16b, v11.16b, v21.16b // GHASH final-1 block - low
691
+ Lenc_blocks_less_than_1: // Last partial block handling
692
+ add x10, x10, x1, lsr #7 // Calculate the updated counter based on the number of 16B chunks we processed
693
+ rev w10, w10
694
+ str w10, [x16, #12] // store the updated counter
695
+ and x1, x1, #127 // bit_length %= 128
696
+ mvn x13, xzr // Mask for low 64 bits
697
+ sub x1, x1, #128 //
698
+ neg x1, x1 // Valid bits in the last block (1-128)
699
+ ldr q18, [x2] // Load destination for merging
700
+ mvn x14, xzr // Mask for high 64 bits
701
+ and x1, x1, #127 // bit_length %= 128
702
+ lsr x14, x14, x1 // rkN_h is mask for top 64b of last block
703
+ cmp x1, #64
704
+ csel x6, x13, x14, lt
705
+ csel x7, x14, xzr, lt
706
+ fmov d0, x6 // ctr0d is mask for last block
707
+ fmov v0.d[1], x7
708
+ and v5.16b, v5.16b, v0.16b // Mask out unused bits of the last CT block
709
+ rev64 v4.16b, v5.16b // GHASH final block - byte swap
710
+ eor v4.16b, v4.16b, v8.16b // Feed in partial tag
711
+ bif v5.16b, v18.16b, v0.16b // Bitwise Insert: merge with existing data at output_ptr
712
+ pmull2 v20.1q, v4.2d, v12.2d // GHASH final block - high
713
+ mov d8, v4.d[1] // GHASH final block - mid
714
+ pmull v21.1q, v4.1d, v12.1d // GHASH final block - low
715
+ eor v9.16b, v9.16b, v20.16b // GHASH final block - high
716
+ eor v8.8b, v8.8b, v4.8b // GHASH final block - mid
717
+ pmull v8.1q, v8.1d, v16.1d // GHASH final block - mid
718
+ eor v11.16b, v11.16b, v21.16b // GHASH final block - low
719
+ eor v10.16b, v10.16b, v8.16b // GHASH final block - mid
720
+ eor v4.16b, v11.16b, v9.16b // MODULO - karatsuba tidy up
721
+ fmov d8, x21
722
+ eor v10.16b, v10.16b, v4.16b // MODULO - karatsuba tidy up
723
+ pmull v7.1q, v9.1d, v8.1d // MODULO - top 64b align with mid
724
+ ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment
725
+ eor v10.16b, v10.16b, v7.16b
726
+ eor v10.16b, v10.16b, v9.16b // MODULO - fold into mid
727
+ pmull v9.1q, v10.1d, v8.1d // MODULO - mid 64b align with low
728
+ ext v10.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment
729
+ st1 { v5.16b}, [x2] // store all 16B
730
+ eor v11.16b, v11.16b, v9.16b
731
+ eor v11.16b, v11.16b, v10.16b // MODULO - fold into low
732
+ ext v11.16b, v11.16b, v11.16b, #8 // Byte swap GHASH result
733
+ rev64 v11.16b, v11.16b // Final Tag
734
+ mov x0, x15
735
+ st1 { v11.16b }, [x3] // Store final tag
736
+ ldp x19, x20, [sp, #16]
737
+ ldp x21, x22, [sp, #32]
738
+ ldp d8, d9, [sp, #64]
739
+ ldp d10, d11, [sp, #80]
740
+ ldp d12, d13, [sp, #96]
741
+ ldp d14, d15, [sp, #112]
742
+ ldp x29, x30, [sp], #224
743
+ AARCH64_VALIDATE_LINK_REGISTER
744
+ ret
745
+
746
+ .globl _aes_gcm_dec_kernel
747
+ .private_extern _aes_gcm_dec_kernel
748
+
749
+ .align 4
750
+ .alt_entry _aes_gcm_dec_kernel
751
+ _aes_gcm_dec_kernel:
752
+ AARCH64_SIGN_LINK_REGISTER
753
+ stp x29, x30, [sp, #-224]!
754
+ mov x29, sp
755
+ stp x19, x20, [sp, #16]
756
+ ld1 { v0.16b}, [x4]
757
+ mov v1.16b, v0.16b
758
+ mov v2.16b, v0.16b
759
+ mov v3.16b, v0.16b
760
+ mov x16, x4
761
+ mov x8, x5
762
+ stp x21, x22, [sp, #32]
763
+ stp x23, x24, [sp, #48]
764
+ stp d8, d9, [sp, #64]
765
+ stp d10, d11, [sp, #80]
766
+ stp d12, d13, [sp, #96]
767
+ stp d14, d15, [sp, #112]
768
+ ldr w17, [x8, #240] // Load number of AES rounds
769
+ add x19, x8, x17, lsl #4 // borrow input_l1 for last key
770
+ ldp x13, x14, [x19] // load round N keys
771
+ ldr q31, [x19, #-16] // load round N-1 keys
772
+ add x4, x0, x1, lsr #3 // end_input_ptr
773
+ lsr x5, x1, #3 // byte_len
774
+ mov x15, x5
775
+ ldr w9, [x16, #12] // Load scalar 32-bit counter (CTR)
776
+ sub x5, x5, #1 // byte_len - 1
777
+ ldr q18, [x8, #0] // load rk0
778
+ and x5, x5, #0xffffffffffffffc0 // number of bytes to be processed in main loop (at least 1 byte must be handled by tail)
779
+ add x5, x5, x0
780
+ rev w9, w9 // Reverse it once for big-endian incrementing
781
+ uxtw x10, w9 // Zero extend reversed w9 into x10
782
+ str q0, [sp, #160]
783
+ str q0, [sp, #176]
784
+ str q0, [sp, #192]
785
+ str q0, [sp, #208]
786
+ rev w20, w9
787
+ mov v0.s[3], w20
788
+ add w20, w9, #1
789
+ rev w20, w20
790
+ mov v1.s[3], w20
791
+ add w20, w9, #2
792
+ rev w20, w20
793
+ mov v2.s[3], w20
794
+ add w20, w9, #3
795
+ rev w20, w20
796
+ mov v3.s[3], w20
797
+ add w20, w9, #4
798
+ rev w20, w20
799
+ str w20, [sp, #172]
800
+ add w20, w9, #5
801
+ rev w20, w20
802
+ str w20, [sp, #188]
803
+ add w20, w9, #6
804
+ rev w20, w20
805
+ str w20, [sp, #204]
806
+ add w20, w9, #7
807
+ rev w20, w20
808
+ str w20, [sp, #220]
809
+ add w9, w9, #8
810
+ // Pre-compute this value instead of using two instructions for moving and then shifting in the main loop
811
+ mov x21, #0xc200000000000000
812
+ str x21, [sp, #128]
813
+ aese v0.16b, v18.16b
814
+ aesmc v0.16b, v0.16b // AES block 0 - round 0
815
+ ldp q19, q20, [x8, #16] // load rk1, rk2
816
+ aese v1.16b, v18.16b
817
+ aesmc v1.16b, v1.16b // AES block 1 - round 0
818
+ ldp q21, q22, [x8, #48] // load rk3, rk4
819
+ aese v2.16b, v18.16b
820
+ aesmc v2.16b, v2.16b // AES block 2 - round 0
821
+ ldp q23, q24, [x8, #80] // load rk5, rk6
822
+ aese v3.16b, v18.16b
823
+ aesmc v3.16b, v3.16b // AES block 3 - round 0
824
+ ldp q13, q14, [x6, #32] // load h2, h3
825
+ aese v0.16b, v19.16b
826
+ aesmc v0.16b, v0.16b // AES block 0 - round 1
827
+ ldp q25, q26, [x8, #112] // load rk7, rk8
828
+ aese v1.16b, v19.16b
829
+ aesmc v1.16b, v1.16b // AES block 1 - round 1
830
+ aese v2.16b, v19.16b
831
+ aesmc v2.16b, v2.16b // AES block 2 - round 1
832
+ aese v3.16b, v19.16b
833
+ aesmc v3.16b, v3.16b // AES block 3 - round 1
834
+ aese v0.16b, v20.16b
835
+ aesmc v0.16b, v0.16b // AES block 0 - round 2
836
+ ext v14.16b, v14.16b, v14.16b, #8
837
+ aese v1.16b, v20.16b
838
+ aesmc v1.16b, v1.16b // AES block 1 - round 2
839
+ ext v13.16b, v13.16b, v13.16b, #8
840
+ ldr q15, [x6, #80] // load h4
841
+ aese v2.16b, v20.16b
842
+ aesmc v2.16b, v2.16b // AES block 2 - round 2
843
+ aese v3.16b, v20.16b
844
+ aesmc v3.16b, v3.16b // AES block 3 - round 2
845
+ ext v15.16b, v15.16b, v15.16b, #8
846
+ aese v0.16b, v21.16b
847
+ aesmc v0.16b, v0.16b // AES block 0 - round 3
848
+ ld1 { v11.16b}, [x3]
849
+ aese v1.16b, v21.16b
850
+ aesmc v1.16b, v1.16b // AES block 1 - round 3
851
+ ext v11.16b, v11.16b, v11.16b, #8
852
+ aese v2.16b, v21.16b
853
+ aesmc v2.16b, v2.16b // AES block 2 - round 3
854
+ rev64 v11.16b, v11.16b
855
+ aese v3.16b, v21.16b
856
+ aesmc v3.16b, v3.16b // AES block 3 - round 3
857
+ trn2 v17.2d, v14.2d, v15.2d // h4l | h3l
858
+ aese v0.16b, v22.16b
859
+ aesmc v0.16b, v0.16b // AES block 0 - round 4
860
+ ldr q12, [x6] // load h1
861
+ aese v1.16b, v22.16b
862
+ aesmc v1.16b, v1.16b // AES block 1 - round 4
863
+ ext v12.16b, v12.16b, v12.16b, #8
864
+ aese v2.16b, v22.16b
865
+ aesmc v2.16b, v2.16b // AES block 2 - round 4
866
+ trn1 v9.2d, v14.2d, v15.2d // h4h | h3h
867
+ aese v3.16b, v22.16b
868
+ aesmc v3.16b, v3.16b // AES block 3 - round 4
869
+ trn2 v16.2d, v12.2d, v13.2d // h2l | h1l
870
+ aese v0.16b, v23.16b
871
+ aesmc v0.16b, v0.16b // AES block 0 - round 5
872
+ aese v1.16b, v23.16b
873
+ aesmc v1.16b, v1.16b // AES block 1 - round 5
874
+ aese v3.16b, v23.16b
875
+ aesmc v3.16b, v3.16b // AES block 3 - round 5
876
+ aese v2.16b, v23.16b
877
+ aesmc v2.16b, v2.16b // AES block 2 - round 5
878
+ aese v0.16b, v24.16b
879
+ aesmc v0.16b, v0.16b // AES block 0 - round 6
880
+ aese v1.16b, v24.16b
881
+ aesmc v1.16b, v1.16b // AES block 1 - round 6
882
+ aese v2.16b, v24.16b
883
+ aesmc v2.16b, v2.16b // AES block 2 - round 6
884
+ aese v3.16b, v24.16b
885
+ aesmc v3.16b, v3.16b // AES block 3 - round 6
886
+ aese v0.16b, v25.16b
887
+ aesmc v0.16b, v0.16b // AES block 0 - round 7
888
+ aese v1.16b, v25.16b
889
+ aesmc v1.16b, v1.16b // AES block 1 - round 7
890
+ aese v2.16b, v25.16b
891
+ aesmc v2.16b, v2.16b // AES block 2 - round 7
892
+ aese v3.16b, v25.16b
893
+ aesmc v3.16b, v3.16b // AES block 3 - round 7
894
+ aese v0.16b, v26.16b
895
+ aesmc v0.16b, v0.16b // AES block 0 - round 8
896
+ aese v1.16b, v26.16b
897
+ aesmc v1.16b, v1.16b // AES block 1 - round 8
898
+ aese v2.16b, v26.16b
899
+ aesmc v2.16b, v2.16b // AES block 2 - round 8
900
+ aese v3.16b, v26.16b
901
+ aesmc v3.16b, v3.16b // AES block 3 - round 8
902
+ cmp x17, #12 // setup flags for AES-128/192/256 check
903
+ b.lt Ldec_finish_first_blocks // branch if AES-128
904
+ ldp q27, q28, [x8, #144] // load rk9, rk10
905
+ aese v0.16b, v27.16b
906
+ aesmc v0.16b, v0.16b // AES block 0 - round 9
907
+ aese v1.16b, v27.16b
908
+ aesmc v1.16b, v1.16b // AES block 1 - round 9
909
+ aese v2.16b, v27.16b
910
+ aesmc v2.16b, v2.16b // AES block 2 - round 9
911
+ aese v3.16b, v27.16b
912
+ aesmc v3.16b, v3.16b // AES block 3 - round 9
913
+ aese v0.16b, v28.16b
914
+ aesmc v0.16b, v0.16b // AES block 0 - round 10
915
+ aese v1.16b, v28.16b
916
+ aesmc v1.16b, v1.16b // AES block 1 - round 10
917
+ aese v2.16b, v28.16b
918
+ aesmc v2.16b, v2.16b // AES block 2 - round 10
919
+ aese v3.16b, v28.16b
920
+ aesmc v3.16b, v3.16b // AES block 3 - round 10
921
+ b.eq Ldec_finish_first_blocks // branch if AES-192
922
+ ldp q27, q28, [x8, #176] // load rk11, rk12
923
+ aese v0.16b, v27.16b
924
+ aesmc v0.16b, v0.16b // AES block 0 - round 11
925
+ aese v1.16b, v27.16b
926
+ aesmc v1.16b, v1.16b // AES block 1 - round 11
927
+ aese v2.16b, v27.16b
928
+ aesmc v2.16b, v2.16b // AES block 2 - round 11
929
+ aese v3.16b, v27.16b
930
+ aesmc v3.16b, v3.16b // AES block 3 - round 11
931
+ aese v0.16b, v28.16b
932
+ aesmc v0.16b, v0.16b // AES block 0 - round 12
933
+ aese v1.16b, v28.16b
934
+ aesmc v1.16b, v1.16b // AES block 1 - round 12
935
+ aese v2.16b, v28.16b
936
+ aesmc v2.16b, v2.16b // AES block 2 - round 12
937
+ aese v3.16b, v28.16b
938
+ aesmc v3.16b, v3.16b // AES block 3 - round 12
939
+ Ldec_finish_first_blocks:
940
+ ldr q27, [x19] // load rkN
941
+ cmp x0, x5 // check if we have <= 4 blocks
942
+ eor v17.16b, v17.16b, v9.16b // h4k | h3k
943
+ aese v1.16b, v31.16b // AES block 1 - round N-1
944
+ aese v2.16b, v31.16b // AES block 2 - round N-1
945
+ aese v3.16b, v31.16b // AES block 3 - round N-1
946
+ aese v0.16b, v31.16b // AES block 0 - round N-1
947
+ trn1 v8.2d, v12.2d, v13.2d // h2h | h1h
948
+ eor v16.16b, v16.16b, v8.16b // h2k | h1k
949
+ b.ge Ldec_tail // handle tail
950
+ // Setup for AES blocks 0-3 is done purely on NEON side instead of mixing NEON and scalar instructions.
951
+ // This is because the final result of the AES block needs to be EORd with the final round key
952
+ // value (v30). This avoids several fmovs.
953
+ ldp q6, q7, [x0, #32] // AES blocks 2,3 load ciphertext
954
+ ldp q4, q5, [x0], #64 // AES blocks 0,1 load ciphertext
955
+ eor v0.16b, v4.16b, v0.16b
956
+ eor v0.16b, v0.16b, v27.16b // AES block 0 - result
957
+ eor v1.16b, v5.16b, v1.16b
958
+ eor v1.16b, v1.16b, v27.16b // AES block 1 - result
959
+ eor v2.16b, v6.16b, v2.16b
960
+ eor v2.16b, v2.16b, v27.16b // AES block 2 - result
961
+ eor v3.16b, v7.16b, v3.16b
962
+ eor v3.16b, v3.16b, v27.16b // AES block 3 - result
963
+ st1 { v0.16b, v1.16b, v2.16b, v3.16b}, [x2], #64 // AES blocks 0-3 - store result
964
+ ldr q0, [sp, #160]
965
+ ldr q1, [sp, #176]
966
+ ldr q2, [sp, #192]
967
+ ldr q3, [sp, #208]
968
+ rev w20, w9
969
+ str w20, [sp, #172]
970
+ add w20, w9, #1
971
+ rev w20, w20
972
+ str w20, [sp, #188]
973
+ add w20, w9, #2
974
+ rev w20, w20
975
+ str w20, [sp, #204]
976
+ add w20, w9, #3
977
+ rev w20, w20
978
+ str w20, [sp, #220]
979
+ add w9, w9, #4
980
+ cmp x0, x5 // check if we have <= 4 blocks
981
+ b.ge Ldec_prepretail // do prepretail
982
+ Ldec_main_loop: // main loop start
983
+ aese v0.16b, v18.16b
984
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 0
985
+ aese v1.16b, v18.16b
986
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 0
987
+ aese v2.16b, v18.16b
988
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 0
989
+ aese v3.16b, v18.16b
990
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 0
991
+ aese v0.16b, v19.16b
992
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 1
993
+ aese v1.16b, v19.16b
994
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 1
995
+ aese v2.16b, v19.16b
996
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 1
997
+ aese v3.16b, v19.16b
998
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 1
999
+ rev64 v4.16b, v4.16b // GHASH block 4k
1000
+ rev64 v5.16b, v5.16b // GHASH block 4k+1
1001
+ rev64 v6.16b, v6.16b // GHASH block 4k+2
1002
+ rev64 v7.16b, v7.16b // GHASH block 4k+3
1003
+ aese v0.16b, v20.16b
1004
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 2
1005
+ ext v11.16b, v11.16b, v11.16b, #8 // PRE 0
1006
+ aese v1.16b, v20.16b
1007
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 2
1008
+ eor v4.16b, v4.16b, v11.16b // PRE 1
1009
+ aese v2.16b, v20.16b
1010
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 2
1011
+ pmull v11.1q, v4.1d, v15.1d // GHASH block 4k - low
1012
+ aese v3.16b, v20.16b
1013
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 2
1014
+ pmull2 v9.1q, v4.2d, v15.2d // GHASH block 4k - high
1015
+ aese v0.16b, v21.16b
1016
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 3
1017
+ mov d10, v17.d[1] // GHASH block 4k - mid
1018
+ aese v1.16b, v21.16b
1019
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 3
1020
+ mov d8, v4.d[1] // GHASH block 4k - mid
1021
+ aese v2.16b, v21.16b
1022
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 3
1023
+ eor v8.8b, v8.8b, v4.8b // GHASH block 4k - mid
1024
+ aese v3.16b, v21.16b
1025
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 3
1026
+ aese v0.16b, v22.16b
1027
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 4
1028
+ pmull2 v4.1q, v5.2d, v14.2d // GHASH block 4k+1 - high
1029
+ aese v1.16b, v22.16b
1030
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 4
1031
+ eor v9.16b, v9.16b, v4.16b // GHASH block 4k+1 - high
1032
+ aese v2.16b, v22.16b
1033
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 4
1034
+ mov d4, v5.d[1] // GHASH block 4k+1 - mid
1035
+ aese v3.16b, v22.16b
1036
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 4
1037
+ pmull v10.1q, v8.1d, v10.1d // GHASH block 4k - mid
1038
+ aese v0.16b, v23.16b
1039
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 5
1040
+ pmull v8.1q, v5.1d, v14.1d // GHASH block 4k+1 - low
1041
+ aese v1.16b, v23.16b
1042
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 5
1043
+ eor v4.8b, v4.8b, v5.8b // GHASH block 4k+1 - mid
1044
+ aese v3.16b, v23.16b
1045
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 5
1046
+ aese v2.16b, v23.16b
1047
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 5
1048
+ pmull v5.1q, v6.1d, v13.1d // GHASH block 4k+2 - low
1049
+ aese v0.16b, v24.16b
1050
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 6
1051
+ eor v11.16b, v11.16b, v8.16b
1052
+ eor v11.16b, v11.16b, v5.16b // GHASH block 4k+1 - low & GHASH block 4k+2 - low
1053
+ aese v1.16b, v24.16b
1054
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 6
1055
+ mov d8, v6.d[1] // GHASH block 4k+2 - mid
1056
+ aese v2.16b, v24.16b
1057
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 6
1058
+ eor v8.8b, v8.8b, v6.8b // GHASH block 4k+2 - mid
1059
+ pmull v4.1q, v4.1d, v17.1d // GHASH block 4k+1 - mid
1060
+ ins v8.d[1], v8.d[0] // GHASH block 4k+2 - mid
1061
+ aese v3.16b, v24.16b
1062
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 6
1063
+ pmull2 v28.1q, v6.2d, v13.2d // GHASH block 4k+2 - high
1064
+ mov d6, v7.d[1] // GHASH block 4k+3 - mid
1065
+ aese v0.16b, v25.16b
1066
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 7
1067
+ pmull2 v8.1q, v8.2d, v16.2d // GHASH block 4k+2 - mid
1068
+ aese v1.16b, v25.16b
1069
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 7
1070
+ pmull v27.1q, v7.1d, v12.1d // GHASH block 4k+3 - low
1071
+ aese v2.16b, v25.16b
1072
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 7
1073
+ eor v10.16b, v10.16b, v4.16b
1074
+ eor v10.16b, v10.16b, v8.16b // GHASH block 4k+1 - mid & GHASH block 4k+2 - mid
1075
+ aese v3.16b, v25.16b
1076
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 7
1077
+ pmull2 v5.1q, v7.2d, v12.2d // GHASH block 4k+3 - high
1078
+ eor v6.8b, v6.8b, v7.8b // GHASH block 4k+3 - mid
1079
+ eor v9.16b, v9.16b, v28.16b
1080
+ eor v9.16b, v9.16b, v5.16b // GHASH block 4k+2 - high & GHASH block 4k+3 - high
1081
+ aese v0.16b, v26.16b
1082
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 8
1083
+ aese v1.16b, v26.16b
1084
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 8
1085
+ aese v2.16b, v26.16b
1086
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 8
1087
+ pmull v6.1q, v6.1d, v16.1d // GHASH block 4k+3 - mid
1088
+ ldr d8, [sp, #128]
1089
+ aese v3.16b, v26.16b
1090
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 8
1091
+ pmull v7.1q, v9.1d, v8.1d // MODULO - top 64b align with mid
1092
+ eor v10.16b, v10.16b, v6.16b
1093
+ eor v10.16b, v10.16b, v7.16b // GHASH block 4k+3 - mid & MODULO - fold into mid
1094
+ eor v11.16b, v11.16b, v27.16b // GHASH block 4k+3 - low
1095
+ eor v6.16b, v11.16b, v9.16b // MODULO - karatsuba tidy up
1096
+ ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment
1097
+ eor v10.16b, v10.16b, v6.16b
1098
+ eor v10.16b, v10.16b, v9.16b // MODULO - karatsuba tidy up & MODULO - fold into mid
1099
+ pmull v8.1q, v10.1d, v8.1d // MODULO - mid 64b align with low
1100
+ ext v10.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment
1101
+ eor v11.16b, v11.16b, v8.16b
1102
+ eor v11.16b, v11.16b, v10.16b // MODULO - fold into low
1103
+ cmp w17, #12 // setup flags for AES-128/192/256 check
1104
+ b.lt Ldec_main_loop_continue // branch if AES-128
1105
+ ldp q27, q28, [x8, #144] // load rk9, rk10
1106
+ aese v0.16b, v27.16b
1107
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 9
1108
+ aese v1.16b, v27.16b
1109
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 9
1110
+ aese v2.16b, v27.16b
1111
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 9
1112
+ aese v3.16b, v27.16b
1113
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 9
1114
+ aese v0.16b, v28.16b
1115
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 10
1116
+ aese v1.16b, v28.16b
1117
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 10
1118
+ aese v2.16b, v28.16b
1119
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 10
1120
+ aese v3.16b, v28.16b
1121
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 10
1122
+ b.eq Ldec_main_loop_continue // branch if AES-192
1123
+ ldp q27, q28, [x8, #176] // load rk11, rk12
1124
+ aese v0.16b, v27.16b
1125
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 11
1126
+ aese v1.16b, v27.16b
1127
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 11
1128
+ aese v2.16b, v27.16b
1129
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 11
1130
+ aese v3.16b, v27.16b
1131
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 11
1132
+ aese v0.16b, v28.16b
1133
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 12
1134
+ aese v1.16b, v28.16b
1135
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 12
1136
+ aese v2.16b, v28.16b
1137
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 12
1138
+ aese v3.16b, v28.16b
1139
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 12
1140
+ Ldec_main_loop_continue:
1141
+ ldr q27, [x19] // load rkN
1142
+ ldp q6, q7, [x0, #32] // AES blocks 2,3 load ciphertext
1143
+ ldp q4, q5, [x0], #64 // AES blocks 0,1 load ciphertext
1144
+ aese v0.16b, v31.16b // AES block 4k+4 - round N-1
1145
+ eor v0.16b, v4.16b, v0.16b
1146
+ eor v0.16b, v0.16b, v27.16b // AES block 4k+4 - result
1147
+ aese v1.16b, v31.16b // AES block 4k+5 - round N-1
1148
+ eor v1.16b, v5.16b, v1.16b
1149
+ eor v1.16b, v1.16b, v27.16b // AES block 4k+5 - result
1150
+ aese v2.16b, v31.16b // AES block 4k+6 - round N-1
1151
+ eor v2.16b, v6.16b, v2.16b
1152
+ eor v2.16b, v2.16b, v27.16b // AES block 4k+6 - result
1153
+ aese v3.16b, v31.16b // AES block 4k+7 - round N-1
1154
+ eor v3.16b, v7.16b, v3.16b
1155
+ eor v3.16b, v3.16b, v27.16b // AES block 4k+7 - result
1156
+ st1 { v0.16b, v1.16b, v2.16b, v3.16b}, [x2], #64 // AES blocks 4k+4-7 - store result
1157
+ ldr q0, [sp, #160]
1158
+ ldr q1, [sp, #176]
1159
+ ldr q2, [sp, #192]
1160
+ ldr q3, [sp, #208]
1161
+ rev w20, w9
1162
+ str w20, [sp, #172]
1163
+ add w20, w9, #1
1164
+ rev w20, w20
1165
+ str w20, [sp, #188]
1166
+ add w20, w9, #2
1167
+ rev w20, w20
1168
+ str w20, [sp, #204]
1169
+ add w20, w9, #3
1170
+ rev w20, w20
1171
+ str w20, [sp, #220]
1172
+ add w9, w9, #4
1173
+ cmp x0, x5
1174
+ b.lt Ldec_main_loop
1175
+ Ldec_prepretail: // PREPRETAIL
1176
+ rev64 v4.16b, v4.16b // GHASH block 0
1177
+ rev64 v5.16b, v5.16b // GHASH block 1
1178
+ ext v11.16b, v11.16b, v11.16b, #8 // PRE 0
1179
+ aese v0.16b, v18.16b
1180
+ aesmc v0.16b, v0.16b // AES block 0 - round 0
1181
+ aese v1.16b, v18.16b
1182
+ aesmc v1.16b, v1.16b // AES block 1 - round 0
1183
+ eor v4.16b, v4.16b, v11.16b // PRE 1
1184
+ rev64 v6.16b, v6.16b // GHASH block 2
1185
+ aese v1.16b, v19.16b
1186
+ aesmc v1.16b, v1.16b // AES block 1 - round 1
1187
+ pmull v11.1q, v4.1d, v15.1d // GHASH block 0 - low
1188
+ mov d8, v4.d[1] // GHASH block 0 - mid
1189
+ pmull2 v9.1q, v4.2d, v15.2d // GHASH block 0 - high
1190
+ aese v2.16b, v18.16b
1191
+ aesmc v2.16b, v2.16b // AES block 2 - round 0
1192
+ mov d10, v17.d[1] // GHASH block 0 - mid
1193
+ aese v0.16b, v19.16b
1194
+ aesmc v0.16b, v0.16b // AES block 0 - round 1
1195
+ eor v8.8b, v8.8b, v4.8b // GHASH block 0 - mid
1196
+ pmull2 v4.1q, v5.2d, v14.2d // GHASH block 1 - high
1197
+ aese v2.16b, v19.16b
1198
+ aesmc v2.16b, v2.16b // AES block 2 - round 1
1199
+ rev64 v7.16b, v7.16b // GHASH block 3
1200
+ aese v3.16b, v18.16b
1201
+ aesmc v3.16b, v3.16b // AES block 3 - round 0
1202
+ pmull v10.1q, v8.1d, v10.1d // GHASH block 0 - mid
1203
+ eor v9.16b, v9.16b, v4.16b // GHASH block 1 - high
1204
+ pmull v8.1q, v5.1d, v14.1d // GHASH block 1 - low
1205
+ aese v3.16b, v19.16b
1206
+ aesmc v3.16b, v3.16b // AES block 3 - round 1
1207
+ mov d4, v5.d[1] // GHASH block 1 - mid
1208
+ aese v0.16b, v20.16b
1209
+ aesmc v0.16b, v0.16b // AES block 0 - round 2
1210
+ aese v1.16b, v20.16b
1211
+ aesmc v1.16b, v1.16b // AES block 1 - round 2
1212
+ eor v11.16b, v11.16b, v8.16b // GHASH block 1 - low
1213
+ aese v2.16b, v20.16b
1214
+ aesmc v2.16b, v2.16b // AES block 2 - round 2
1215
+ aese v0.16b, v21.16b
1216
+ aesmc v0.16b, v0.16b // AES block 0 - round 3
1217
+ mov d8, v6.d[1] // GHASH block 2 - mid
1218
+ aese v3.16b, v20.16b
1219
+ aesmc v3.16b, v3.16b // AES block 3 - round 2
1220
+ eor v4.8b, v4.8b, v5.8b // GHASH block 1 - mid
1221
+ pmull v5.1q, v6.1d, v13.1d // GHASH block 2 - low
1222
+ aese v0.16b, v22.16b
1223
+ aesmc v0.16b, v0.16b // AES block 0 - round 4
1224
+ aese v3.16b, v21.16b
1225
+ aesmc v3.16b, v3.16b // AES block 3 - round 3
1226
+ eor v8.8b, v8.8b, v6.8b // GHASH block 2 - mid
1227
+ pmull v4.1q, v4.1d, v17.1d // GHASH block 1 - mid
1228
+ aese v0.16b, v23.16b
1229
+ aesmc v0.16b, v0.16b // AES block 0 - round 5
1230
+ eor v11.16b, v11.16b, v5.16b // GHASH block 2 - low
1231
+ aese v3.16b, v22.16b
1232
+ aesmc v3.16b, v3.16b // AES block 3 - round 4
1233
+ pmull2 v5.1q, v7.2d, v12.2d // GHASH block 3 - high
1234
+ eor v10.16b, v10.16b, v4.16b // GHASH block 1 - mid
1235
+ pmull2 v4.1q, v6.2d, v13.2d // GHASH block 2 - high
1236
+ aese v3.16b, v23.16b
1237
+ aesmc v3.16b, v3.16b // AES block 3 - round 5
1238
+ ins v8.d[1], v8.d[0] // GHASH block 2 - mid
1239
+ aese v2.16b, v21.16b
1240
+ aesmc v2.16b, v2.16b // AES block 2 - round 3
1241
+ aese v1.16b, v21.16b
1242
+ aesmc v1.16b, v1.16b // AES block 1 - round 3
1243
+ eor v9.16b, v9.16b, v4.16b
1244
+ eor v9.16b, v9.16b, v5.16b // GHASH block 2 - high & GHASH block 3 - high
1245
+ pmull v4.1q, v7.1d, v12.1d // GHASH block 3 - low
1246
+ aese v2.16b, v22.16b
1247
+ aesmc v2.16b, v2.16b // AES block 2 - round 4
1248
+ mov d6, v7.d[1] // GHASH block 3 - mid
1249
+ aese v1.16b, v22.16b
1250
+ aesmc v1.16b, v1.16b // AES block 1 - round 4
1251
+ pmull2 v8.1q, v8.2d, v16.2d // GHASH block 2 - mid
1252
+ aese v2.16b, v23.16b
1253
+ aesmc v2.16b, v2.16b // AES block 2 - round 5
1254
+ eor v6.8b, v6.8b, v7.8b // GHASH block 3 - mid
1255
+ aese v1.16b, v23.16b
1256
+ aesmc v1.16b, v1.16b // AES block 1 - round 5
1257
+ aese v3.16b, v24.16b
1258
+ aesmc v3.16b, v3.16b // AES block 3 - round 6
1259
+ eor v10.16b, v10.16b, v8.16b // GHASH block 2 - mid
1260
+ aese v2.16b, v24.16b
1261
+ aesmc v2.16b, v2.16b // AES block 2 - round 6
1262
+ aese v0.16b, v24.16b
1263
+ aesmc v0.16b, v0.16b // AES block 0 - round 6
1264
+ movi v8.8b, #0xc2
1265
+ aese v1.16b, v24.16b
1266
+ aesmc v1.16b, v1.16b // AES block 1 - round 6
1267
+ eor v11.16b, v11.16b, v4.16b // GHASH block 3 - low
1268
+ pmull v6.1q, v6.1d, v16.1d // GHASH block 3 - mid
1269
+ aese v3.16b, v25.16b
1270
+ aesmc v3.16b, v3.16b // AES block 3 - round 7
1271
+ aese v1.16b, v25.16b
1272
+ aesmc v1.16b, v1.16b // AES block 1 - round 7
1273
+ aese v0.16b, v25.16b
1274
+ aesmc v0.16b, v0.16b // AES block 0 - round 7
1275
+ eor v10.16b, v10.16b, v6.16b // GHASH block 3 - mid
1276
+ aese v3.16b, v26.16b
1277
+ aesmc v3.16b, v3.16b // AES block 3 - round 8
1278
+ aese v2.16b, v25.16b
1279
+ aesmc v2.16b, v2.16b // AES block 2 - round 7
1280
+ eor v6.16b, v11.16b, v9.16b // MODULO - karatsuba tidy up
1281
+ aese v1.16b, v26.16b
1282
+ aesmc v1.16b, v1.16b // AES block 1 - round 8
1283
+ aese v0.16b, v26.16b
1284
+ aesmc v0.16b, v0.16b // AES block 0 - round 8
1285
+ shl d8, d8, #56 // mod_constant
1286
+ aese v2.16b, v26.16b
1287
+ aesmc v2.16b, v2.16b // AES block 2 - round 8
1288
+ cmp w17, #12 // setup flags for AES-128/192/256 check
1289
+ b.lt Ldec_finish_prepretail // branch if AES-128
1290
+ ldp q27, q28, [x8, #144] // load rk9, rk10
1291
+ aese v0.16b, v27.16b
1292
+ aesmc v0.16b, v0.16b // AES block 0 - round 9
1293
+ aese v1.16b, v27.16b
1294
+ aesmc v1.16b, v1.16b // AES block 1 - round 9
1295
+ aese v2.16b, v27.16b
1296
+ aesmc v2.16b, v2.16b // AES block 2 - round 9
1297
+ aese v3.16b, v27.16b
1298
+ aesmc v3.16b, v3.16b // AES block 3 - round 9
1299
+ aese v0.16b, v28.16b
1300
+ aesmc v0.16b, v0.16b // AES block 0 - round 10
1301
+ aese v1.16b, v28.16b
1302
+ aesmc v1.16b, v1.16b // AES block 1 - round 10
1303
+ aese v2.16b, v28.16b
1304
+ aesmc v2.16b, v2.16b // AES block 2 - round 10
1305
+ aese v3.16b, v28.16b
1306
+ aesmc v3.16b, v3.16b // AES block 3 - round 10
1307
+ b.eq Ldec_finish_prepretail // branch if AES-192
1308
+ ldp q27, q28, [x8, #176] // load rk11, rk12
1309
+ aese v0.16b, v27.16b
1310
+ aesmc v0.16b, v0.16b // AES block 0 - round 11
1311
+ aese v1.16b, v27.16b
1312
+ aesmc v1.16b, v1.16b // AES block 1 - round 11
1313
+ aese v2.16b, v27.16b
1314
+ aesmc v2.16b, v2.16b // AES block 2 - round 11
1315
+ aese v3.16b, v27.16b
1316
+ aesmc v3.16b, v3.16b // AES block 3 - round 11
1317
+ aese v0.16b, v28.16b
1318
+ aesmc v0.16b, v0.16b // AES block 0 - round 12
1319
+ aese v1.16b, v28.16b
1320
+ aesmc v1.16b, v1.16b // AES block 1 - round 12
1321
+ aese v2.16b, v28.16b
1322
+ aesmc v2.16b, v2.16b // AES block 2 - round 12
1323
+ aese v3.16b, v28.16b
1324
+ aesmc v3.16b, v3.16b // AES block 3 - round 12
1325
+ Ldec_finish_prepretail:
1326
+ eor v10.16b, v10.16b, v6.16b // MODULO - karatsuba tidy up
1327
+ pmull v7.1q, v9.1d, v8.1d // MODULO - top 64b align with mid
1328
+ ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment
1329
+ eor v10.16b, v10.16b, v7.16b
1330
+ eor v10.16b, v10.16b, v9.16b // MODULO - fold into mid
1331
+ pmull v8.1q, v10.1d, v8.1d // MODULO - mid 64b align with low
1332
+ ext v10.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment
1333
+ eor v11.16b, v11.16b, v8.16b
1334
+ eor v11.16b, v11.16b, v10.16b // MODULO - fold into low
1335
+ aese v1.16b, v31.16b // AES block 1 - round N-1
1336
+ aese v0.16b, v31.16b // AES block 0 - round N-1
1337
+ aese v3.16b, v31.16b // AES block 3 - round N-1
1338
+ aese v2.16b, v31.16b // AES block 2 - round N-1
1339
+ Ldec_tail: // TAIL
1340
+ sub x5, x4, x0 // main_end_input_ptr is number of bytes left to process
1341
+ ld1 { v5.16b}, [x0], #16 // AES block 0 - load ciphertext
1342
+ eor v0.16b, v5.16b, v0.16b // AES block 0 - result
1343
+ mov x6, v0.d[0] // AES block 0 - mov low
1344
+ mov x7, v0.d[1] // AES block 0 - mov high
1345
+ ext v8.16b, v11.16b, v11.16b, #8 // prepare final partial tag
1346
+ eor x6, x6, x13 // AES block 0 - round N low
1347
+ eor x7, x7, x14 // AES block 0 - round N high
1348
+ cmp x5, #48
1349
+ b.gt Ldec_blocks_more_than_3
1350
+ mov v3.16b, v2.16b
1351
+ movi v10.8b, #0
1352
+ movi v11.8b, #0
1353
+ movi v9.8b, #0
1354
+ mov v2.16b, v1.16b
1355
+ cmp x5, #32
1356
+ b.gt Ldec_blocks_more_than_2
1357
+ mov v3.16b, v1.16b
1358
+ cmp x5, #16
1359
+ b.gt Ldec_blocks_more_than_1
1360
+ b Ldec_blocks_less_than_1
1361
+ Ldec_blocks_more_than_3: // blocks left > 3
1362
+ rev64 v4.16b, v5.16b // GHASH final-3 block
1363
+ ld1 { v5.16b}, [x0], #16 // AES final-2 block - load ciphertext
1364
+ stp x6, x7, [x2], #16 // AES final-3 block - store result
1365
+ mov d10, v17.d[1] // GHASH final-3 block - mid
1366
+ eor v4.16b, v4.16b, v8.16b // feed in partial tag
1367
+ eor v0.16b, v5.16b, v1.16b // AES final-2 block - result
1368
+ mov d22, v4.d[1] // GHASH final-3 block - mid
1369
+ mov x6, v0.d[0] // AES final-2 block - mov low
1370
+ mov x7, v0.d[1] // AES final-2 block - mov high
1371
+ eor v22.8b, v22.8b, v4.8b // GHASH final-3 block - mid
1372
+ movi v8.8b, #0 // suppress further partial tag feed in
1373
+ pmull2 v9.1q, v4.2d, v15.2d // GHASH final-3 block - high
1374
+ pmull v10.1q, v22.1d, v10.1d // GHASH final-3 block - mid
1375
+ eor x6, x6, x13 // AES final-2 block - round N low
1376
+ pmull v11.1q, v4.1d, v15.1d // GHASH final-3 block - low
1377
+ eor x7, x7, x14 // AES final-2 block - round N high
1378
+ Ldec_blocks_more_than_2: // blocks left > 2
1379
+ rev64 v4.16b, v5.16b // GHASH final-2 block
1380
+ ld1 { v5.16b}, [x0], #16 // AES final-1 block - load ciphertext
1381
+ eor v4.16b, v4.16b, v8.16b // feed in partial tag
1382
+ stp x6, x7, [x2], #16 // AES final-2 block - store result
1383
+ eor v0.16b, v5.16b, v2.16b // AES final-1 block - result
1384
+ mov d22, v4.d[1] // GHASH final-2 block - mid
1385
+ pmull v21.1q, v4.1d, v14.1d // GHASH final-2 block - low
1386
+ pmull2 v20.1q, v4.2d, v14.2d // GHASH final-2 block - high
1387
+ eor v22.8b, v22.8b, v4.8b // GHASH final-2 block - mid
1388
+ mov x6, v0.d[0] // AES final-1 block - mov low
1389
+ mov x7, v0.d[1] // AES final-1 block - mov high
1390
+ eor v11.16b, v11.16b, v21.16b // GHASH final-2 block - low
1391
+ movi v8.8b, #0 // suppress further partial tag feed in
1392
+ pmull v22.1q, v22.1d, v17.1d // GHASH final-2 block - mid
1393
+ eor v9.16b, v9.16b, v20.16b // GHASH final-2 block - high
1394
+ eor x6, x6, x13 // AES final-1 block - round N low
1395
+ eor v10.16b, v10.16b, v22.16b // GHASH final-2 block - mid
1396
+ eor x7, x7, x14 // AES final-1 block - round N high
1397
+ Ldec_blocks_more_than_1: // blocks left > 1
1398
+ stp x6, x7, [x2], #16 // AES final-1 block - store result
1399
+ rev64 v4.16b, v5.16b // GHASH final-1 block
1400
+ ld1 { v5.16b}, [x0], #16 // AES final block - load ciphertext
1401
+ eor v4.16b, v4.16b, v8.16b // feed in partial tag
1402
+ movi v8.8b, #0 // suppress further partial tag feed in
1403
+ mov d22, v4.d[1] // GHASH final-1 block - mid
1404
+ eor v0.16b, v5.16b, v3.16b // AES final block - result
1405
+ pmull2 v20.1q, v4.2d, v13.2d // GHASH final-1 block - high
1406
+ eor v22.8b, v22.8b, v4.8b // GHASH final-1 block - mid
1407
+ pmull v21.1q, v4.1d, v13.1d // GHASH final-1 block - low
1408
+ mov x6, v0.d[0] // AES final block - mov low
1409
+ ins v22.d[1], v22.d[0] // GHASH final-1 block - mid
1410
+ mov x7, v0.d[1] // AES final block - mov high
1411
+ pmull2 v22.1q, v22.2d, v16.2d // GHASH final-1 block - mid
1412
+ eor x6, x6, x13 // AES final block - round N low
1413
+ eor v11.16b, v11.16b, v21.16b // GHASH final-1 block - low
1414
+ eor v9.16b, v9.16b, v20.16b // GHASH final-1 block - high
1415
+ eor v10.16b, v10.16b, v22.16b // GHASH final-1 block - mid
1416
+ eor x7, x7, x14 // AES final block - round N high
1417
+ Ldec_blocks_less_than_1: // blocks left <= 1
1418
+ add x10, x10, x1, lsr #7 // Calculate the updated counter based on the number of 16B chunks we processed
1419
+ rev w10, w10
1420
+ str w10, [x16, #12] // store the updated counter
1421
+ and x1, x1, #127 // bit_length %= 128
1422
+ mvn x14, xzr // rkN_h = 0xffffffffffffffff
1423
+ sub x1, x1, #128 // bit_length -= 128
1424
+ mvn x13, xzr // rkN_l = 0xffffffffffffffff
1425
+ ldp x4, x5, [x2] // load existing bytes we need to not overwrite
1426
+ neg x1, x1 // bit_length = 128 - #bits in input (in range [1,128])
1427
+ and x1, x1, #127 // bit_length %= 128
1428
+ lsr x14, x14, x1 // rkN_h is mask for top 64b of last block
1429
+ cmp x1, #64
1430
+ csel x9, x13, x14, lt
1431
+ csel x10, x14, xzr, lt
1432
+ fmov d0, x9 // ctr0b is mask for last block
1433
+ and x6, x6, x9
1434
+ mov v0.d[1], x10
1435
+ bic x4, x4, x9 // mask out low existing bytes
1436
+ bic x5, x5, x10 // mask out high existing bytes
1437
+ orr x6, x6, x4
1438
+ and x7, x7, x10
1439
+ orr x7, x7, x5
1440
+ and v5.16b, v5.16b, v0.16b // possibly partial last block has zeroes in highest bits
1441
+ rev64 v4.16b, v5.16b // GHASH final block
1442
+ eor v4.16b, v4.16b, v8.16b // feed in partial tag
1443
+ pmull v21.1q, v4.1d, v12.1d // GHASH final block - low
1444
+ mov d8, v4.d[1] // GHASH final block - mid
1445
+ eor v8.8b, v8.8b, v4.8b // GHASH final block - mid
1446
+ pmull2 v20.1q, v4.2d, v12.2d // GHASH final block - high
1447
+ pmull v8.1q, v8.1d, v16.1d // GHASH final block - mid
1448
+ eor v9.16b, v9.16b, v20.16b // GHASH final block - high
1449
+ eor v11.16b, v11.16b, v21.16b // GHASH final block - low
1450
+ eor v10.16b, v10.16b, v8.16b // GHASH final block - mid
1451
+ ldr d8, [sp, #128]
1452
+ eor v6.16b, v11.16b, v9.16b // MODULO - karatsuba tidy up
1453
+ eor v10.16b, v10.16b, v6.16b // MODULO - karatsuba tidy up
1454
+ pmull v7.1q, v9.1d, v8.1d // MODULO - top 64b align with mid
1455
+ ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment
1456
+ eor v10.16b, v10.16b, v7.16b // MODULO - fold into mid
1457
+ eor v10.16b, v10.16b, v9.16b // MODULO - fold into mid
1458
+ pmull v8.1q, v10.1d, v8.1d // MODULO - mid 64b align with low
1459
+ ext v10.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment
1460
+ eor v11.16b, v11.16b, v8.16b // MODULO - fold into low
1461
+ stp x6, x7, [x2]
1462
+ eor v11.16b, v11.16b, v10.16b // MODULO - fold into low
1463
+ ext v11.16b, v11.16b, v11.16b, #8
1464
+ rev64 v11.16b, v11.16b // Final Tag
1465
+ mov x0, x15
1466
+ st1 { v11.16b }, [x3] // Store final tag
1467
+ ldp x19, x20, [sp, #16]
1468
+ ldp x21, x22, [sp, #32]
1469
+ ldp x23, x24, [sp, #48]
1470
+ ldp d8, d9, [sp, #64]
1471
+ ldp d10, d11, [sp, #80]
1472
+ ldp d12, d13, [sp, #96]
1473
+ ldp d14, d15, [sp, #112]
1474
+ ldp x29, x30, [sp], #224
1475
+ AARCH64_VALIDATE_LINK_REGISTER
1476
+ ret
1477
+
1478
+
1479
+ .globl _aes_gcm_enc_kernel_eor3
1480
+ .private_extern _aes_gcm_enc_kernel_eor3
1481
+
1482
+ .align 4
1483
+ .alt_entry _aes_gcm_enc_kernel_eor3
1484
+ _aes_gcm_enc_kernel_eor3:
1485
+ AARCH64_SIGN_LINK_REGISTER
1486
+ stp x29, x30, [sp, #-224]!
1487
+ mov x29, sp
1488
+ ld1 { v0.16b}, [x4] // Load initial counter block
1489
+ stp x19, x20, [sp, #16]
1490
+ mov v1.16b, v0.16b // Initialize ctr1-3 from ctr0
1491
+ mov v2.16b, v0.16b
1492
+ mov v3.16b, v0.16b
1493
+ mov x16, x4 // Pointer to counter block in memory
1494
+ mov x8, x5 // Pointer to AES key schedule context
1495
+ stp x21, x22, [sp, #32]
1496
+ // [sp, #48] is unused but allocated to align the stack layout with aes_gcm_dec_kernel_eor3
1497
+ stp d8, d9, [sp, #64] // Save Neon registers
1498
+ stp d10, d11, [sp, #80]
1499
+ stp d12, d13, [sp, #96]
1500
+ stp d14, d15, [sp, #112]
1501
+ ldr w17, [x8, #240] // Load number of AES rounds
1502
+ add x7, x8, x17, lsl #4 // Calculate pointer to the last round key
1503
+ ldp x13, x14, [x7] // load round N key (for final XOR)
1504
+ ldr q31, [x7, #-16] // load round N-1 key
1505
+ add x4, x0, x1, lsr #3 // Calculate end of input
1506
+ lsr x5, x1, #3 // Total byte length
1507
+ mov x15, x5
1508
+ ldr w12, [x16, #12] // Load counter's low 32 bits
1509
+ sub x5, x5, #1 // byte_len - 1
1510
+ ldr q18, [x8, #0] // load rk0
1511
+ and x5, x5, #0xffffffffffffffc0 // Align main loop end to a multiple of 64 bytes
1512
+ add x5, x5, x0
1513
+ rev w12, w12 // Reverse for big-endian increment
1514
+ uxtw x10, w12 // Zero extend reversed w12 into x10 for final counter update
1515
+ // Pre-compute this value instead of using two instructions to reconstruct it every iteration
1516
+ mov x21, #0xc200000000000000 // GHASH reduction constant
1517
+ str x21, [sp, #128]
1518
+ // We maintain four copies of ctr values on the stack. Each loop iteration we
1519
+ // store the updated ctr value to the last four bytes (e.g., 160 + 12).
1520
+ // We then load the four values. This avoids a singificant number of
1521
+ // expensive GPR->NEON and NEON->NEON moves. To avoid LDST forwarding we
1522
+ // calculate and store the values one iteration ahead so they have time to
1523
+ // drain before we load them.
1524
+ str q0, [sp, #160] // Store base counter for block 0-3
1525
+ str q0, [sp, #176]
1526
+ str q0, [sp, #192]
1527
+ str q0, [sp, #208]
1528
+ // Since we need the values right away don't go through the stack this first
1529
+ // time. Manually insert the incremented big-endian counter values.
1530
+ rev w20, w12
1531
+ mov v0.s[3], w20 // ctr0 + 0
1532
+ add w20, w12, #1
1533
+ rev w20, w20
1534
+ mov v1.s[3], w20 // ctr0 + 1
1535
+ add w20, w12, #2
1536
+ rev w20, w20
1537
+ mov v2.s[3], w20 // ctr0 + 2
1538
+ add w20, w12, #3
1539
+ rev w20, w20
1540
+ mov v3.s[3], w20 // ctr0 + 3
1541
+ // Calculate the ctr values for the *next* (not current) group of four
1542
+ // blocks. Store the incremented parts to the stack.
1543
+ add w20, w12, #4
1544
+ rev w20, w20
1545
+ str w20, [sp, #172] // ctr0 + 4 for next iter
1546
+ add w20, w12, #5
1547
+ rev w20, w20
1548
+ str w20, [sp, #188] // ctr0 + 5 for next iter
1549
+ add w20, w12, #6
1550
+ rev w20, w20
1551
+ str w20, [sp, #204] // ctr0 + 6 for next iter
1552
+ add w20, w12, #7
1553
+ rev w20, w20
1554
+ str w20, [sp, #220] // ctr0 + 7 for next iter
1555
+ add w12, w12, #8 // Advance counter past these two sets
1556
+ // --- Start AES for first 4 blocks ---
1557
+ aese v0.16b, v18.16b
1558
+ aesmc v0.16b, v0.16b // AES block 0 - round 0
1559
+ ldp q19, q20, [x8, #16] // load rk1, rk2
1560
+ aese v1.16b, v18.16b
1561
+ aesmc v1.16b, v1.16b // AES block 1 - round 0
1562
+ ldp q21, q22, [x8, #48] // load rk3, rk4
1563
+ aese v2.16b, v18.16b
1564
+ aesmc v2.16b, v2.16b // AES block 2 - round 0
1565
+ ldp q23, q24, [x8, #80] // load rk5, rk6
1566
+ aese v3.16b, v18.16b
1567
+ aesmc v3.16b, v3.16b // AES block 3 - round 0
1568
+ ldp q13, q14, [x6, #32] // load H2, H3 (GHASH keys)
1569
+ aese v0.16b, v19.16b
1570
+ aesmc v0.16b, v0.16b // AES block 0 - round 1
1571
+ ldp q25, q26, [x8, #112] // load rk7, rk8
1572
+ aese v1.16b, v19.16b
1573
+ aesmc v1.16b, v1.16b // AES block 1 - round 1
1574
+ aese v2.16b, v19.16b
1575
+ aesmc v2.16b, v2.16b // AES block 2 - round 1
1576
+ aese v3.16b, v19.16b
1577
+ aesmc v3.16b, v3.16b // AES block 3 - round 1
1578
+ aese v0.16b, v20.16b
1579
+ aesmc v0.16b, v0.16b // AES block 0 - round 2
1580
+ ext v14.16b, v14.16b, v14.16b, #8 // Byte swap H3 for GHASH
1581
+ aese v1.16b, v20.16b
1582
+ aesmc v1.16b, v1.16b // AES block 1 - round 2
1583
+ ext v13.16b, v13.16b, v13.16b, #8 // Byte swap H2 for GHASH
1584
+ aese v2.16b, v20.16b
1585
+ aesmc v2.16b, v2.16b // AES block 2 - round 2
1586
+ ldr q15, [x6, #80] // load H4
1587
+ aese v3.16b, v20.16b
1588
+ aesmc v3.16b, v3.16b // AES block 3 - round 2
1589
+ ext v15.16b, v15.16b, v15.16b, #8 // Byte swap H4 for GHASH
1590
+ aese v0.16b, v21.16b
1591
+ aesmc v0.16b, v0.16b // AES block 0 - round 3
1592
+ ld1 { v11.16b}, [x3] // Load initial GHASH accumulator (T)
1593
+ aese v1.16b, v21.16b
1594
+ aesmc v1.16b, v1.16b // AES block 1 - round 3
1595
+ ext v11.16b, v11.16b, v11.16b, #8 // Byte swap T for GHASH
1596
+ aese v2.16b, v21.16b
1597
+ aesmc v2.16b, v2.16b // AES block 2 - round 3
1598
+ rev64 v11.16b, v11.16b // Correct byte order within 64-bit lanes
1599
+ aese v3.16b, v21.16b
1600
+ aesmc v3.16b, v3.16b // AES block 3 - round 3
1601
+ trn2 v17.2d, v14.2d, v15.2d // Karatsuba key: H4_low | H3_low
1602
+ aese v0.16b, v22.16b
1603
+ aesmc v0.16b, v0.16b // AES block 0 - round 4
1604
+ ldr q12, [x6] // load H1
1605
+ aese v1.16b, v22.16b
1606
+ aesmc v1.16b, v1.16b // AES block 1 - round 4
1607
+ ext v12.16b, v12.16b, v12.16b, #8 // Byte swap H1 for GHASH
1608
+ aese v2.16b, v22.16b
1609
+ aesmc v2.16b, v2.16b // AES block 2 - round 4
1610
+ trn1 v9.2d, v14.2d, v15.2d // Karatsuba key: H4_high | H3_high
1611
+ aese v3.16b, v22.16b
1612
+ aesmc v3.16b, v3.16b // AES block 3 - round 4
1613
+ trn2 v16.2d, v12.2d, v13.2d // Karatsuba key: H2_low | H1_low
1614
+ aese v0.16b, v23.16b
1615
+ aesmc v0.16b, v0.16b // AES block 0 - round 5
1616
+ ldr q30, [x7] // Preload round N key for final EOR
1617
+ aese v1.16b, v23.16b
1618
+ aesmc v1.16b, v1.16b // AES block 1 - round 5
1619
+ aese v3.16b, v23.16b
1620
+ aesmc v3.16b, v3.16b // AES block 3 - round 5
1621
+ aese v2.16b, v23.16b
1622
+ aesmc v2.16b, v2.16b // AES block 2 - round 5
1623
+ aese v0.16b, v24.16b
1624
+ aesmc v0.16b, v0.16b // AES block 0 - round 6
1625
+ aese v1.16b, v24.16b
1626
+ aesmc v1.16b, v1.16b // AES block 1 - round 6
1627
+ aese v2.16b, v24.16b
1628
+ aesmc v2.16b, v2.16b // AES block 2 - round 6
1629
+ aese v3.16b, v24.16b
1630
+ aesmc v3.16b, v3.16b // AES block 3 - round 6
1631
+ aese v0.16b, v25.16b
1632
+ aesmc v0.16b, v0.16b // AES block 0 - round 7
1633
+ aese v1.16b, v25.16b
1634
+ aesmc v1.16b, v1.16b // AES block 1 - round 7
1635
+ aese v2.16b, v25.16b
1636
+ aesmc v2.16b, v2.16b // AES block 2 - round 7
1637
+ aese v3.16b, v25.16b
1638
+ aesmc v3.16b, v3.16b // AES block 3 - round 7
1639
+ aese v0.16b, v26.16b
1640
+ aesmc v0.16b, v0.16b // AES block 0 - round 8
1641
+ aese v1.16b, v26.16b
1642
+ aesmc v1.16b, v1.16b // AES block 1 - round 8
1643
+ aese v2.16b, v26.16b
1644
+ aesmc v2.16b, v2.16b // AES block 2 - round 8
1645
+ aese v3.16b, v26.16b
1646
+ aesmc v3.16b, v3.16b // AES block 3 - round 8
1647
+ cmp x17, #12 // setup flags for AES-128/192/256 check
1648
+ b.lt Lenc_finish_first_blocks_eor3 // branch if AES-128
1649
+ ldp q27, q28, [x8, #144] // load rk9, rk10
1650
+ aese v1.16b, v27.16b
1651
+ aesmc v1.16b, v1.16b // AES block 1 - round 9
1652
+ aese v2.16b, v27.16b
1653
+ aesmc v2.16b, v2.16b // AES block 2 - round 9
1654
+ aese v3.16b, v27.16b
1655
+ aesmc v3.16b, v3.16b // AES block 3 - round 9
1656
+ aese v0.16b, v27.16b
1657
+ aesmc v0.16b, v0.16b // AES block 0 - round 9
1658
+ aese v1.16b, v28.16b
1659
+ aesmc v1.16b, v1.16b // AES block 1 - round 10
1660
+ aese v2.16b, v28.16b
1661
+ aesmc v2.16b, v2.16b // AES block 2 - round 10
1662
+ aese v3.16b, v28.16b
1663
+ aesmc v3.16b, v3.16b // AES block 3 - round 10
1664
+ aese v0.16b, v28.16b
1665
+ aesmc v0.16b, v0.16b // AES block 0 - round 10
1666
+ b.eq Lenc_finish_first_blocks_eor3 // branch if AES-192
1667
+ ldp q27, q28, [x8, #176] // load rk11, rk12
1668
+ aese v1.16b, v27.16b
1669
+ aesmc v1.16b, v1.16b // AES block 1 - round 11
1670
+ aese v2.16b, v27.16b
1671
+ aesmc v2.16b, v2.16b // AES block 2 - round 11
1672
+ aese v3.16b, v27.16b
1673
+ aesmc v3.16b, v3.16b // AES block 3 - round 11
1674
+ aese v0.16b, v27.16b
1675
+ aesmc v0.16b, v0.16b // AES block 0 - round 11
1676
+ aese v1.16b, v28.16b
1677
+ aesmc v1.16b, v1.16b // AES block 1 - round 12
1678
+ aese v2.16b, v28.16b
1679
+ aesmc v2.16b, v2.16b // AES block 2 - round 12
1680
+ aese v3.16b, v28.16b
1681
+ aesmc v3.16b, v3.16b // AES block 3 - round 12
1682
+ aese v0.16b, v28.16b
1683
+ aesmc v0.16b, v0.16b // AES block 0 - round 12
1684
+ Lenc_finish_first_blocks_eor3:
1685
+ cmp x0, x5 // check if we have <= 4 blocks to process in the tail
1686
+ eor v17.16b, v17.16b, v9.16b // Karatsuba key: H3^H4
1687
+ aese v0.16b, v31.16b // AES block 0 - round N-1
1688
+ aese v1.16b, v31.16b // AES block 1 - round N-1
1689
+ aese v2.16b, v31.16b // AES block 2 - round N-1
1690
+ aese v3.16b, v31.16b // AES block 3 - round N-1
1691
+ trn1 v8.2d, v12.2d, v13.2d // Karatsuba key: H2_high | H1_high
1692
+ eor v16.16b, v16.16b, v8.16b // Karatsuba key: H1^H2
1693
+ b.ge Lenc_tail_eor3 // handle tail if no more full 4-block sets
1694
+ ldp q6, q7, [x0, #32] // AES blocks 2,3 load plaintext
1695
+ ldp q4, q5, [x0], #64 // AES blocks 0,1 load plaintext
1696
+ // Compute and store first 4 ciphertext blocks
1697
+ eor3 v4.16b, v4.16b, v30.16b, v0.16b // AES block 0 - result = PT ^ AES(ctr0)
1698
+ eor3 v5.16b, v5.16b, v30.16b, v1.16b // AES block 1 - result = PT ^ AES(ctr1)
1699
+ eor3 v6.16b, v6.16b, v30.16b, v2.16b // AES block 2 - result = PT ^ AES(ctr2)
1700
+ eor3 v7.16b, v7.16b, v30.16b, v3.16b // AES block 3 - result = PT ^ AES(ctr3)
1701
+ st1 { v4.16b, v5.16b, v6.16b, v7.16b}, [x2], #64 // AES blocks 0-3 - store result
1702
+ // Load counter values for the second iteration from the stack
1703
+ ldp q0, q1, [sp, #160]
1704
+ ldp q2, q3, [sp, #192]
1705
+ // Prepare and store counter values for the third iteration
1706
+ rev w20, w12
1707
+ str w20, [sp, #172] // ctr + 8
1708
+ add w20, w12, #1
1709
+ rev w20, w20
1710
+ str w20, [sp, #188] // ctr + 9
1711
+ add w20, w12, #2
1712
+ rev w20, w20
1713
+ str w20, [sp, #204] // ctr + 10
1714
+ add w20, w12, #3
1715
+ rev w20, w20
1716
+ str w20, [sp, #220] // ctr + 11
1717
+ add w12, w12, #4 // Advance counter base
1718
+ cmp x0, x5 // check if we have <= 4 blocks remaining
1719
+ b.ge Lenc_prepretail_eor3 // go to prepretail if < 2 full loops left
1720
+ Lenc_main_loop_eor3: // main loop start (processes 4 blocks per iteration)
1721
+ // --- AES Pipeline for blocks 4k+4 to 4k+7 ---
1722
+ aese v0.16b, v18.16b
1723
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 0
1724
+ aese v1.16b, v18.16b
1725
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 0
1726
+ aese v2.16b, v18.16b
1727
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 0
1728
+ aese v3.16b, v18.16b
1729
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 0
1730
+ ldr d8, [sp, #128] // Load GHASH reduction constant
1731
+ aese v0.16b, v19.16b
1732
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 1
1733
+ aese v1.16b, v19.16b
1734
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 1
1735
+ aese v2.16b, v19.16b
1736
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 1
1737
+ aese v3.16b, v19.16b
1738
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 1
1739
+ // --- GHASH Pipeline (interleaved with AES) for blocks 4k to 4k+3 ---
1740
+ rev64 v4.16b, v4.16b // GHASH block 4k - Byte swap CT
1741
+ rev64 v5.16b, v5.16b // GHASH block 4k+1 - Byte swap CT
1742
+ rev64 v6.16b, v6.16b // GHASH block 4k+2 - Byte swap CT
1743
+ rev64 v7.16b, v7.16b // GHASH block 4k+3 - Byte swap CT
1744
+ aese v0.16b, v20.16b
1745
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 2
1746
+ ext v11.16b, v11.16b, v11.16b, #8 // GHASH - prepare acc for XOR
1747
+ aese v1.16b, v20.16b
1748
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 2
1749
+ eor v4.16b, v4.16b, v11.16b // GHASH block 4k - Y_i = CT_i ^ Y_{i-1}
1750
+ aese v2.16b, v20.16b
1751
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 2
1752
+ pmull v11.1q, v4.1d, v15.1d // GHASH block 4k - low
1753
+ aese v3.16b, v20.16b
1754
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 2
1755
+ pmull2 v9.1q, v6.2d, v13.2d // GHASH block 4k+2 - high
1756
+ aese v0.16b, v21.16b
1757
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 3
1758
+ mov d10, v17.d[1] // GHASH block 4k - mid Karatsuba key
1759
+ aese v1.16b, v21.16b
1760
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 3
1761
+ mov d20, v4.d[1] // GHASH block 4k - mid
1762
+ aese v2.16b, v21.16b
1763
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 3
1764
+ eor v20.8b, v20.8b, v4.8b // GHASH block 4k - mid
1765
+ aese v3.16b, v21.16b
1766
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 3
1767
+ mov d21, v5.d[1] // GHASH block 4k+1 - mid
1768
+ aese v0.16b, v22.16b
1769
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 4
1770
+ eor v21.8b, v21.8b, v5.8b // GHASH block 4k+1 - mid
1771
+ aese v1.16b, v22.16b
1772
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 4
1773
+ pmull v10.1q, v20.1d, v10.1d // GHASH block 4k - mid
1774
+ aese v2.16b, v22.16b
1775
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 4
1776
+ pmull v21.1q, v21.1d, v17.1d // GHASH block 4k+1 - mid
1777
+ aese v3.16b, v22.16b
1778
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 4
1779
+ eor v10.16b, v10.16b, v21.16b // GHASH block 4k+1 - mid
1780
+ aese v0.16b, v23.16b
1781
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 5
1782
+ ext v22.16b, v22.16b, v6.16b, #8 // GHASH block 4k+2 - mid
1783
+ aese v1.16b, v23.16b
1784
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 5
1785
+ eor v22.16b, v22.16b, v6.16b // GHASH block 4k+2 - mid
1786
+ aese v2.16b, v23.16b
1787
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 5
1788
+ pmull2 v22.1q, v22.2d, v16.2d // GHASH block 4k+2 - mid
1789
+ aese v3.16b, v23.16b
1790
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 5
1791
+ mov d23, v7.d[1] // GHASH block 4k+3 - mid
1792
+ aese v0.16b, v24.16b
1793
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 6
1794
+ eor v23.8b, v23.8b, v7.8b // GHASH block 4k+3 - mid
1795
+ aese v1.16b, v24.16b
1796
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 6
1797
+ pmull v23.1q, v23.1d, v16.1d // GHASH block 4k+3 - mid
1798
+ aese v2.16b, v24.16b
1799
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 6
1800
+ eor3 v10.16b, v10.16b, v22.16b, v23.16b // GHASH block 4k+2/3 - mid
1801
+ aese v3.16b, v24.16b
1802
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 6
1803
+ pmull2 v22.1q, v4.2d, v15.2d // GHASH block 4k - high
1804
+ aese v0.16b, v25.16b
1805
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 7
1806
+ pmull2 v21.1q, v7.2d, v12.2d // GHASH block 4k+3 - high
1807
+ eor v22.16b, v22.16b, v21.16b // GHASH block 4k+3 - high
1808
+ aese v1.16b, v25.16b
1809
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 7
1810
+ pmull2 v23.1q, v5.2d, v14.2d // GHASH block 4k+1 - high
1811
+ aese v2.16b, v25.16b
1812
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 7
1813
+ pmull v21.1q, v6.1d, v13.1d // GHASH block 4k+2 - low
1814
+ aese v3.16b, v25.16b
1815
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 7
1816
+ pmull v20.1q, v5.1d, v14.1d // GHASH block 4k+1 - low
1817
+ eor3 v9.16b, v9.16b, v22.16b, v23.16b // GHASH block 4k/1/2/3 - high
1818
+ pmull v22.1q, v7.1d, v12.1d // GHASH block 4k+3 - low
1819
+ ldp q6, q7, [x0, #32]
1820
+ ldp q4, q5, [x0], #64
1821
+ eor v20.16b, v20.16b, v21.16b // GHASH block 4k+1 - low
1822
+ aese v0.16b, v26.16b
1823
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 8
1824
+ eor3 v11.16b, v11.16b, v22.16b, v20.16b // GHASH block 4k/1/2/3 - low
1825
+ aese v1.16b, v26.16b
1826
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 8
1827
+ eor3 v10.16b, v10.16b, v9.16b, v11.16b // MODULO - karatsuba tidy up
1828
+ aese v2.16b, v26.16b
1829
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 8
1830
+ pmull v20.1q, v9.1d, v8.1d // MODULO - top 64b align with mid
1831
+ aese v3.16b, v26.16b
1832
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 8
1833
+ cmp x17, #12 // setup flags for AES-128/192/256 check
1834
+ b.lt Lenc_main_loop_continue_eor3 // branch if AES-128
1835
+ ldp q27, q28, [x8, #144] // load rk9, rk10
1836
+ aese v0.16b, v27.16b
1837
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 9
1838
+ aese v1.16b, v27.16b
1839
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 9
1840
+ aese v2.16b, v27.16b
1841
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 9
1842
+ aese v3.16b, v27.16b
1843
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 9
1844
+ aese v0.16b, v28.16b
1845
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 10
1846
+ aese v1.16b, v28.16b
1847
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 10
1848
+ aese v2.16b, v28.16b
1849
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 10
1850
+ aese v3.16b, v28.16b
1851
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 10
1852
+ b.eq Lenc_main_loop_continue_eor3 // branch if AES-192
1853
+ ldp q27, q28, [x8, #176] // load rk11, rk12
1854
+ aese v0.16b, v27.16b
1855
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 11
1856
+ aese v1.16b, v27.16b
1857
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 11
1858
+ aese v2.16b, v27.16b
1859
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 11
1860
+ aese v3.16b, v27.16b
1861
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 11
1862
+ aese v0.16b, v28.16b
1863
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 12
1864
+ aese v1.16b, v28.16b
1865
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 12
1866
+ aese v2.16b, v28.16b
1867
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 12
1868
+ aese v3.16b, v28.16b
1869
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 12
1870
+ Lenc_main_loop_continue_eor3:
1871
+ ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment
1872
+ eor3 v10.16b, v10.16b, v20.16b, v9.16b // MODULO - fold into mid
1873
+ pmull v9.1q, v10.1d, v8.1d // MODULO - mid 64b align with low
1874
+ ext v20.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment
1875
+ eor3 v11.16b, v9.16b, v11.16b, v20.16b // MODULO - fold into low
1876
+ aese v0.16b, v31.16b // AES block 4k+4 - round N-1
1877
+ eor3 v4.16b, v4.16b, v30.16b, v0.16b // AES block 4k+4 - result
1878
+ aese v1.16b, v31.16b // AES block 4k+5 - round N-1
1879
+ eor3 v5.16b, v5.16b, v30.16b, v1.16b // AES block 4k+5 - result
1880
+ aese v2.16b, v31.16b // AES block 4k+6 - round N-1
1881
+ eor3 v6.16b, v6.16b, v30.16b, v2.16b // AES block 4k+6 - result
1882
+ aese v3.16b, v31.16b // AES block 4k+7 - round N-1
1883
+ eor3 v7.16b, v7.16b, v30.16b, v3.16b // AES block 4k+7 - result
1884
+ ldp q0, q1, [sp, #160]
1885
+ ldp q2, q3, [sp, #192]
1886
+ // We used these registers as temporaries above so reload the RKs.
1887
+ ldp q20, q21, [x8, #32] // load rk2, rk3
1888
+ ldp q22, q23, [x8, #64] // load rk4, rk5
1889
+ st1 { v4.16b, v5.16b, v6.16b, v7.16b}, [x2], #64 // AES blocks 4k+4-7 - store result
1890
+ rev w20, w12
1891
+ str w20, [sp, #172]
1892
+ add w20, w12, #1
1893
+ rev w20, w20
1894
+ str w20, [sp, #188]
1895
+ add w20, w12, #2
1896
+ rev w20, w20
1897
+ str w20, [sp, #204]
1898
+ add w20, w12, #3
1899
+ rev w20, w20
1900
+ str w20, [sp, #220]
1901
+ add w12, w12, #4
1902
+ cmp x0, x5 // LOOP_eor3 CONTROL
1903
+ b.lt Lenc_main_loop_eor3
1904
+ Lenc_prepretail_eor3: // PREPRETAIL
1905
+ aese v1.16b, v18.16b
1906
+ aesmc v1.16b, v1.16b // AES block 1 - round 0
1907
+ rev64 v6.16b, v6.16b // GHASH block 2
1908
+ aese v2.16b, v18.16b
1909
+ aesmc v2.16b, v2.16b // AES block 2 - round 0
1910
+ aese v0.16b, v18.16b
1911
+ aesmc v0.16b, v0.16b // AES block 0 - round 0
1912
+ rev64 v4.16b, v4.16b // GHASH block 0
1913
+ ext v11.16b, v11.16b, v11.16b, #8 // PRE 0
1914
+ aese v2.16b, v19.16b
1915
+ aesmc v2.16b, v2.16b // AES block 2 - round 1
1916
+ aese v0.16b, v19.16b
1917
+ aesmc v0.16b, v0.16b // AES block 0 - round 1
1918
+ eor v4.16b, v4.16b, v11.16b // PRE 1
1919
+ rev64 v5.16b, v5.16b // GHASH block 1
1920
+ aese v2.16b, v20.16b
1921
+ aesmc v2.16b, v2.16b // AES block 2 - round 2
1922
+ aese v3.16b, v18.16b
1923
+ aesmc v3.16b, v3.16b // AES block 3 - round 0
1924
+ mov d10, v17.d[1] // GHASH block 0 - mid Karatsuba key
1925
+ aese v1.16b, v19.16b
1926
+ aesmc v1.16b, v1.16b // AES block 1 - round 1
1927
+ pmull v11.1q, v4.1d, v15.1d // GHASH block 0 - low
1928
+ mov d8, v4.d[1] // GHASH block 0 - mid
1929
+ pmull2 v9.1q, v4.2d, v15.2d // GHASH block 0 - high
1930
+ aese v2.16b, v21.16b
1931
+ aesmc v2.16b, v2.16b // AES block 2 - round 3
1932
+ aese v1.16b, v20.16b
1933
+ aesmc v1.16b, v1.16b // AES block 1 - round 2
1934
+ eor v8.8b, v8.8b, v4.8b // GHASH block 0 - mid
1935
+ aese v0.16b, v20.16b
1936
+ aesmc v0.16b, v0.16b // AES block 0 - round 2
1937
+ aese v3.16b, v19.16b
1938
+ aesmc v3.16b, v3.16b // AES block 3 - round 1
1939
+ aese v1.16b, v21.16b
1940
+ aesmc v1.16b, v1.16b // AES block 1 - round 3
1941
+ pmull v10.1q, v8.1d, v10.1d // GHASH block 0 - mid
1942
+ pmull2 v4.1q, v5.2d, v14.2d // GHASH block 1 - high
1943
+ pmull v8.1q, v5.1d, v14.1d // GHASH block 1 - low
1944
+ aese v3.16b, v20.16b
1945
+ aesmc v3.16b, v3.16b // AES block 3 - round 2
1946
+ eor v9.16b, v9.16b, v4.16b // GHASH block 1 - high
1947
+ mov d4, v5.d[1] // GHASH block 1 - mid
1948
+ aese v0.16b, v21.16b
1949
+ aesmc v0.16b, v0.16b // AES block 0 - round 3
1950
+ eor v11.16b, v11.16b, v8.16b // GHASH block 1 - low
1951
+ aese v3.16b, v21.16b
1952
+ aesmc v3.16b, v3.16b // AES block 3 - round 3
1953
+ eor v4.8b, v4.8b, v5.8b // GHASH block 1 - mid
1954
+ mov d8, v6.d[1] // GHASH block 2 - mid
1955
+ aese v0.16b, v22.16b
1956
+ aesmc v0.16b, v0.16b // AES block 0 - round 4
1957
+ rev64 v7.16b, v7.16b // GHASH block 3
1958
+ aese v3.16b, v22.16b
1959
+ aesmc v3.16b, v3.16b // AES block 3 - round 4
1960
+ pmull v4.1q, v4.1d, v17.1d // GHASH block 1 - mid
1961
+ eor v8.8b, v8.8b, v6.8b // GHASH block 2 - mid
1962
+ pmull v5.1q, v6.1d, v13.1d // GHASH block 2 - low
1963
+ aese v3.16b, v23.16b
1964
+ aesmc v3.16b, v3.16b // AES block 3 - round 5
1965
+ aese v2.16b, v22.16b
1966
+ aesmc v2.16b, v2.16b // AES block 2 - round 4
1967
+ eor v10.16b, v10.16b, v4.16b // GHASH block 1 - mid
1968
+ pmull2 v4.1q, v6.2d, v13.2d // GHASH block 2 - high
1969
+ eor v11.16b, v11.16b, v5.16b // GHASH block 2 - low
1970
+ ins v8.d[1], v8.d[0] // GHASH block 2 - mid
1971
+ aese v2.16b, v23.16b
1972
+ aesmc v2.16b, v2.16b // AES block 2 - round 5
1973
+ eor v9.16b, v9.16b, v4.16b // GHASH block 2 - high
1974
+ mov d4, v7.d[1] // GHASH block 3 - mid
1975
+ aese v1.16b, v22.16b
1976
+ aesmc v1.16b, v1.16b // AES block 1 - round 4
1977
+ pmull2 v8.1q, v8.2d, v16.2d // GHASH block 2 - mid
1978
+ eor v4.8b, v4.8b, v7.8b // GHASH block 3 - mid
1979
+ pmull2 v5.1q, v7.2d, v12.2d // GHASH block 3 - high
1980
+ aese v1.16b, v23.16b
1981
+ aesmc v1.16b, v1.16b // AES block 1 - round 5
1982
+ pmull v4.1q, v4.1d, v16.1d // GHASH block 3 - mid
1983
+ eor v10.16b, v10.16b, v8.16b // GHASH block 2 - mid
1984
+ aese v0.16b, v23.16b
1985
+ aesmc v0.16b, v0.16b // AES block 0 - round 5
1986
+ aese v1.16b, v24.16b
1987
+ aesmc v1.16b, v1.16b // AES block 1 - round 6
1988
+ aese v2.16b, v24.16b
1989
+ aesmc v2.16b, v2.16b // AES block 2 - round 6
1990
+ aese v0.16b, v24.16b
1991
+ aesmc v0.16b, v0.16b // AES block 0 - round 6
1992
+ aese v3.16b, v24.16b
1993
+ aesmc v3.16b, v3.16b // AES block 3 - round 6
1994
+ aese v1.16b, v25.16b
1995
+ aesmc v1.16b, v1.16b // AES block 1 - round 7
1996
+ eor v9.16b, v9.16b, v5.16b // GHASH block 3 - high
1997
+ aese v0.16b, v25.16b
1998
+ aesmc v0.16b, v0.16b // AES block 0 - round 7
1999
+ aese v3.16b, v25.16b
2000
+ aesmc v3.16b, v3.16b // AES block 3 - round 7
2001
+ ldr d8, [sp, #128]
2002
+ aese v1.16b, v26.16b
2003
+ aesmc v1.16b, v1.16b // AES block 1 - round 8
2004
+ eor v10.16b, v10.16b, v4.16b // GHASH block 3 - mid
2005
+ pmull v6.1q, v7.1d, v12.1d // GHASH block 3 - low
2006
+ aese v3.16b, v26.16b
2007
+ aesmc v3.16b, v3.16b // AES block 3 - round 8
2008
+ cmp x17, #12 // setup flags for AES-128/192/256 check
2009
+ aese v0.16b, v26.16b
2010
+ aesmc v0.16b, v0.16b // AES block 0 - round 8
2011
+ eor v11.16b, v11.16b, v6.16b // GHASH block 3 - low
2012
+ aese v2.16b, v25.16b
2013
+ aesmc v2.16b, v2.16b // AES block 2 - round 7
2014
+ eor v10.16b, v10.16b, v9.16b // karatsuba tidy up
2015
+ aese v2.16b, v26.16b
2016
+ aesmc v2.16b, v2.16b // AES block 2 - round 8
2017
+ pmull v4.1q, v9.1d, v8.1d
2018
+ ext v9.16b, v9.16b, v9.16b, #8
2019
+ eor v10.16b, v10.16b, v11.16b
2020
+ b.lt Lenc_finish_prepretail_eor3 // branch if AES-128
2021
+ ldp q27, q28, [x8, #144] // load rk9, rk10
2022
+ aese v0.16b, v27.16b
2023
+ aesmc v0.16b, v0.16b // AES block 0 - round 9
2024
+ aese v1.16b, v27.16b
2025
+ aesmc v1.16b, v1.16b // AES block 1 - round 9
2026
+ aese v2.16b, v27.16b
2027
+ aesmc v2.16b, v2.16b // AES block 2 - round 9
2028
+ aese v3.16b, v27.16b
2029
+ aesmc v3.16b, v3.16b // AES block 3 - round 9
2030
+ aese v0.16b, v28.16b
2031
+ aesmc v0.16b, v0.16b // AES block 0 - round 10
2032
+ aese v1.16b, v28.16b
2033
+ aesmc v1.16b, v1.16b // AES block 1 - round 10
2034
+ aese v2.16b, v28.16b
2035
+ aesmc v2.16b, v2.16b // AES block 2 - round 10
2036
+ aese v3.16b, v28.16b
2037
+ aesmc v3.16b, v3.16b // AES block 3 - round 10
2038
+ b.eq Lenc_finish_prepretail_eor3 // branch if AES-192
2039
+ ldp q27, q28, [x8, #176] // load rk11, rk12
2040
+ aese v0.16b, v27.16b
2041
+ aesmc v0.16b, v0.16b // AES block 0 - round 11
2042
+ aese v1.16b, v27.16b
2043
+ aesmc v1.16b, v1.16b // AES block 1 - round 11
2044
+ aese v2.16b, v27.16b
2045
+ aesmc v2.16b, v2.16b // AES block 2 - round 11
2046
+ aese v3.16b, v27.16b
2047
+ aesmc v3.16b, v3.16b // AES block 3 - round 11
2048
+ aese v0.16b, v28.16b
2049
+ aesmc v0.16b, v0.16b // AES block 0 - round 12
2050
+ aese v1.16b, v28.16b
2051
+ aesmc v1.16b, v1.16b // AES block 1 - round 12
2052
+ aese v2.16b, v28.16b
2053
+ aesmc v2.16b, v2.16b // AES block 2 - round 12
2054
+ aese v3.16b, v28.16b
2055
+ aesmc v3.16b, v3.16b // AES block 3 - round 12
2056
+ Lenc_finish_prepretail_eor3:
2057
+ aese v0.16b, v31.16b // AES block 0 - round N-1
2058
+ aese v1.16b, v31.16b // AES block 1 - round N-1
2059
+ aese v2.16b, v31.16b // AES block 2 - round N-1
2060
+ aese v3.16b, v31.16b // AES block 3 - round N-1
2061
+ eor3 v10.16b, v10.16b, v4.16b, v9.16b
2062
+ pmull v4.1q, v10.1d, v8.1d
2063
+ ext v10.16b, v10.16b, v10.16b, #8
2064
+ eor3 v11.16b, v11.16b, v4.16b, v10.16b
2065
+ Lenc_tail_eor3: // TAIL: Process remaining 0 to 3 blocks
2066
+ ext v8.16b, v11.16b, v11.16b, #8 // Save current GHASH state for partial tag feed-in
2067
+ sub x5, x4, x0 // main_end_input_ptr is number of bytes left to process
2068
+ ldp x6, x7, [x0], #16 // AES block 0 - load plaintext
2069
+ eor x6, x6, x13 // AES block 0 - round N low
2070
+ eor x7, x7, x14 // AES block 0 - round N high
2071
+ cmp x5, #48
2072
+ fmov d4, x6 // AES block 0 - mov low
2073
+ fmov v4.d[1], x7 // AES block 0 - mov high
2074
+ eor v5.16b, v4.16b, v0.16b // AES block 0 - result
2075
+ b.gt Lenc_blocks_more_than_3_eor3
2076
+ cmp x5, #32
2077
+ mov v3.16b, v2.16b
2078
+ movi v11.8b, #0
2079
+ movi v9.8b, #0
2080
+ mov v2.16b, v1.16b
2081
+ movi v10.8b, #0
2082
+ b.gt Lenc_blocks_more_than_2_eor3
2083
+ mov v3.16b, v1.16b
2084
+ cmp x5, #16
2085
+ b.gt Lenc_blocks_more_than_1_eor3
2086
+ b Lenc_blocks_less_than_1_eor3
2087
+ Lenc_blocks_more_than_3_eor3: // blocks left > 3
2088
+ st1 { v5.16b}, [x2], #16 // AES final-2 block - store result
2089
+ ldp x6, x7, [x0], #16 // AES final-2 block - load input low & high
2090
+ rev64 v4.16b, v5.16b // GHASH final-3 block
2091
+ eor x6, x6, x13 // AES final-2 block - round N low
2092
+ eor v4.16b, v4.16b, v8.16b // feed in partial tag
2093
+ eor x7, x7, x14 // AES final-2 block - round N high
2094
+ mov d22, v4.d[1] // GHASH final-3 block - mid
2095
+ fmov d5, x6 // AES final-2 block - mov low
2096
+ fmov v5.d[1], x7 // AES final-2 block - mov high
2097
+ eor v22.8b, v22.8b, v4.8b // GHASH final-3 block - mid
2098
+ movi v8.8b, #0 // suppress further partial tag feed in
2099
+ mov d10, v17.d[1] // GHASH final-3 block - mid
2100
+ pmull v11.1q, v4.1d, v15.1d // GHASH final-3 block - low
2101
+ pmull2 v9.1q, v4.2d, v15.2d // GHASH final-3 block - high
2102
+ pmull v10.1q, v22.1d, v10.1d // GHASH final-3 block - mid
2103
+ eor v5.16b, v5.16b, v1.16b // AES final-2 block - result
2104
+ Lenc_blocks_more_than_2_eor3: // blocks left > 2
2105
+ st1 { v5.16b}, [x2], #16 // AES final-2 block - store result
2106
+ ldp x6, x7, [x0], #16 // AES final-1 block - load input low & high
2107
+ rev64 v4.16b, v5.16b // GHASH final-2 block
2108
+ eor x6, x6, x13 // AES final-1 block - round N low
2109
+ eor v4.16b, v4.16b, v8.16b // feed in partial tag
2110
+ fmov d5, x6 // AES final-1 block - mov low
2111
+ eor x7, x7, x14 // AES final-1 block - round N high
2112
+ fmov v5.d[1], x7 // AES final-1 block - mov high
2113
+ movi v8.8b, #0 // suppress further partial tag feed in
2114
+ pmull2 v20.1q, v4.2d, v14.2d // GHASH final-2 block - high
2115
+ mov d22, v4.d[1] // GHASH final-2 block - mid
2116
+ pmull v21.1q, v4.1d, v14.1d // GHASH final-2 block - low
2117
+ eor v22.8b, v22.8b, v4.8b // GHASH final-2 block - mid
2118
+ eor v5.16b, v5.16b, v2.16b // AES final-1 block - result
2119
+ eor v9.16b, v9.16b, v20.16b // GHASH final-2 block - high
2120
+ pmull v22.1q, v22.1d, v17.1d // GHASH final-2 block - mid
2121
+ eor v11.16b, v11.16b, v21.16b // GHASH final-2 block - low
2122
+ eor v10.16b, v10.16b, v22.16b // GHASH final-2 block - mid
2123
+ Lenc_blocks_more_than_1_eor3: // blocks left > 1
2124
+ st1 { v5.16b}, [x2], #16 // AES final-1 block - store result
2125
+ rev64 v4.16b, v5.16b // GHASH final-1 block: Byte Swap CT
2126
+ ldp x6, x7, [x0], #16 // AES final block - load plaintext
2127
+ eor v4.16b, v4.16b, v8.16b // Feed in partial tag
2128
+ movi v8.8b, #0 // Clear for next block
2129
+ eor x6, x6, x13 // AES final block - round N low
2130
+ mov d22, v4.d[1] // GHASH final-1 block - mid
2131
+ pmull2 v20.1q, v4.2d, v13.2d // GHASH final-1 block - high
2132
+ eor x7, x7, x14 // AES final block - round N high
2133
+ eor v22.8b, v22.8b, v4.8b // GHASH final-1 block - mid
2134
+ eor v9.16b, v9.16b, v20.16b // GHASH final-1 block - high
2135
+ ins v22.d[1], v22.d[0] // GHASH final-1 block - mid
2136
+ fmov d5, x6 // AES final block - mov low
2137
+ fmov v5.d[1], x7 // AES final block - mov high
2138
+ pmull2 v22.1q, v22.2d, v16.2d // GHASH final-1 block - mid
2139
+ pmull v21.1q, v4.1d, v13.1d // GHASH final-1 block - low
2140
+ eor v5.16b, v5.16b, v3.16b // AES final block - result
2141
+ eor v10.16b, v10.16b, v22.16b // GHASH final-1 block - mid
2142
+ eor v11.16b, v11.16b, v21.16b // GHASH final-1 block - low
2143
+ Lenc_blocks_less_than_1_eor3: // Last partial block handling
2144
+ add x10, x10, x1, lsr #7 // Calculate the updated counter based on the number of 16B chunks we processed
2145
+ rev w10, w10
2146
+ str w10, [x16, #12] // store the updated counter
2147
+ and x1, x1, #127 // bit_length %= 128
2148
+ mvn x13, xzr // Mask for low 64 bits
2149
+ sub x1, x1, #128 //
2150
+ neg x1, x1 // Valid bits in the last block (1-128)
2151
+ ldr q18, [x2] // Load destination for merging
2152
+ mvn x14, xzr // Mask for high 64 bits
2153
+ and x1, x1, #127 // bit_length %= 128
2154
+ lsr x14, x14, x1 // rkN_h is mask for top 64b of last block
2155
+ cmp x1, #64
2156
+ csel x6, x13, x14, lt
2157
+ csel x7, x14, xzr, lt
2158
+ fmov d0, x6 // ctr0d is mask for last block
2159
+ fmov v0.d[1], x7
2160
+ and v5.16b, v5.16b, v0.16b // Mask out unused bits of the last CT block
2161
+ rev64 v4.16b, v5.16b // GHASH final block - byte swap
2162
+ eor v4.16b, v4.16b, v8.16b // Feed in partial tag
2163
+ bif v5.16b, v18.16b, v0.16b // Bitwise Insert: merge with existing data at output_ptr
2164
+ pmull2 v20.1q, v4.2d, v12.2d // GHASH final block - high
2165
+ mov d8, v4.d[1] // GHASH final block - mid
2166
+ pmull v21.1q, v4.1d, v12.1d // GHASH final block - low
2167
+ eor v9.16b, v9.16b, v20.16b // GHASH final block - high
2168
+ eor v8.8b, v8.8b, v4.8b // GHASH final block - mid
2169
+ pmull v8.1q, v8.1d, v16.1d // GHASH final block - mid
2170
+ eor v11.16b, v11.16b, v21.16b // GHASH final block - low
2171
+ eor v10.16b, v10.16b, v8.16b // GHASH final block - mid
2172
+ eor v4.16b, v11.16b, v9.16b // MODULO - karatsuba tidy up
2173
+ fmov d8, x21
2174
+ eor v10.16b, v10.16b, v4.16b // MODULO - karatsuba tidy up
2175
+ pmull v7.1q, v9.1d, v8.1d // MODULO - top 64b align with mid
2176
+ ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment
2177
+ eor3 v10.16b, v10.16b, v7.16b, v9.16b // MODULO - fold into mid
2178
+ pmull v9.1q, v10.1d, v8.1d // MODULO - mid 64b align with low
2179
+ ext v10.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment
2180
+ st1 { v5.16b}, [x2] // store all 16B
2181
+ eor3 v11.16b, v11.16b, v9.16b, v10.16b // MODULO - fold into low
2182
+ ext v11.16b, v11.16b, v11.16b, #8 // Byte swap GHASH result
2183
+ rev64 v11.16b, v11.16b // Final Tag
2184
+ mov x0, x15
2185
+ st1 { v11.16b }, [x3] // Store final tag
2186
+ ldp x19, x20, [sp, #16]
2187
+ ldp x21, x22, [sp, #32]
2188
+ ldp d8, d9, [sp, #64]
2189
+ ldp d10, d11, [sp, #80]
2190
+ ldp d12, d13, [sp, #96]
2191
+ ldp d14, d15, [sp, #112]
2192
+ ldp x29, x30, [sp], #224
2193
+ AARCH64_VALIDATE_LINK_REGISTER
2194
+ ret
2195
+
2196
+ .globl _aes_gcm_dec_kernel_eor3
2197
+ .private_extern _aes_gcm_dec_kernel_eor3
2198
+
2199
+ .align 4
2200
+ .alt_entry _aes_gcm_dec_kernel_eor3
2201
+ _aes_gcm_dec_kernel_eor3:
2202
+ AARCH64_SIGN_LINK_REGISTER
2203
+ stp x29, x30, [sp, #-224]!
2204
+ mov x29, sp
2205
+ stp x19, x20, [sp, #16]
2206
+ ld1 { v0.16b}, [x4]
2207
+ mov v1.16b, v0.16b
2208
+ mov v2.16b, v0.16b
2209
+ mov v3.16b, v0.16b
2210
+ mov x16, x4
2211
+ mov x8, x5
2212
+ stp x21, x22, [sp, #32]
2213
+ stp x23, x24, [sp, #48]
2214
+ stp d8, d9, [sp, #64]
2215
+ stp d10, d11, [sp, #80]
2216
+ stp d12, d13, [sp, #96]
2217
+ stp d14, d15, [sp, #112]
2218
+ ldr w17, [x8, #240] // Load number of AES rounds
2219
+ add x19, x8, x17, lsl #4 // borrow input_l1 for last key
2220
+ ldp x13, x14, [x19] // load round N keys
2221
+ ldr q31, [x19, #-16] // load round N-1 keys
2222
+ add x4, x0, x1, lsr #3 // end_input_ptr
2223
+ lsr x5, x1, #3 // byte_len
2224
+ mov x15, x5
2225
+ ldr w9, [x16, #12] // Load scalar 32-bit counter (CTR)
2226
+ sub x5, x5, #1 // byte_len - 1
2227
+ ldr q18, [x8, #0] // load rk0
2228
+ and x5, x5, #0xffffffffffffffc0 // number of bytes to be processed in main loop (at least 1 byte must be handled by tail)
2229
+ add x5, x5, x0
2230
+ rev w9, w9 // Reverse it once for big-endian incrementing
2231
+ uxtw x10, w9 // Zero extend reversed w9 into x10
2232
+ str q0, [sp, #160]
2233
+ str q0, [sp, #176]
2234
+ str q0, [sp, #192]
2235
+ str q0, [sp, #208]
2236
+ rev w20, w9
2237
+ mov v0.s[3], w20
2238
+ add w20, w9, #1
2239
+ rev w20, w20
2240
+ mov v1.s[3], w20
2241
+ add w20, w9, #2
2242
+ rev w20, w20
2243
+ mov v2.s[3], w20
2244
+ add w20, w9, #3
2245
+ rev w20, w20
2246
+ mov v3.s[3], w20
2247
+ add w20, w9, #4
2248
+ rev w20, w20
2249
+ str w20, [sp, #172]
2250
+ add w20, w9, #5
2251
+ rev w20, w20
2252
+ str w20, [sp, #188]
2253
+ add w20, w9, #6
2254
+ rev w20, w20
2255
+ str w20, [sp, #204]
2256
+ add w20, w9, #7
2257
+ rev w20, w20
2258
+ str w20, [sp, #220]
2259
+ add w9, w9, #8
2260
+ // Pre-compute this value instead of using two instructions for moving and then shifting in the main loop
2261
+ mov x21, #0xc200000000000000
2262
+ str x21, [sp, #128]
2263
+ aese v0.16b, v18.16b
2264
+ aesmc v0.16b, v0.16b // AES block 0 - round 0
2265
+ ldp q19, q20, [x8, #16] // load rk1, rk2
2266
+ aese v1.16b, v18.16b
2267
+ aesmc v1.16b, v1.16b // AES block 1 - round 0
2268
+ ldp q21, q22, [x8, #48] // load rk3, rk4
2269
+ aese v2.16b, v18.16b
2270
+ aesmc v2.16b, v2.16b // AES block 2 - round 0
2271
+ ldp q23, q24, [x8, #80] // load rk5, rk6
2272
+ aese v3.16b, v18.16b
2273
+ aesmc v3.16b, v3.16b // AES block 3 - round 0
2274
+ ldp q13, q14, [x6, #32] // load h2, h3
2275
+ aese v0.16b, v19.16b
2276
+ aesmc v0.16b, v0.16b // AES block 0 - round 1
2277
+ ldp q25, q26, [x8, #112] // load rk7, rk8
2278
+ aese v1.16b, v19.16b
2279
+ aesmc v1.16b, v1.16b // AES block 1 - round 1
2280
+ aese v2.16b, v19.16b
2281
+ aesmc v2.16b, v2.16b // AES block 2 - round 1
2282
+ aese v3.16b, v19.16b
2283
+ aesmc v3.16b, v3.16b // AES block 3 - round 1
2284
+ aese v0.16b, v20.16b
2285
+ aesmc v0.16b, v0.16b // AES block 0 - round 2
2286
+ ext v14.16b, v14.16b, v14.16b, #8
2287
+ aese v1.16b, v20.16b
2288
+ aesmc v1.16b, v1.16b // AES block 1 - round 2
2289
+ ext v13.16b, v13.16b, v13.16b, #8
2290
+ ldr q15, [x6, #80] // load h4
2291
+ aese v2.16b, v20.16b
2292
+ aesmc v2.16b, v2.16b // AES block 2 - round 2
2293
+ aese v3.16b, v20.16b
2294
+ aesmc v3.16b, v3.16b // AES block 3 - round 2
2295
+ ext v15.16b, v15.16b, v15.16b, #8
2296
+ aese v0.16b, v21.16b
2297
+ aesmc v0.16b, v0.16b // AES block 0 - round 3
2298
+ ld1 { v11.16b}, [x3]
2299
+ aese v1.16b, v21.16b
2300
+ aesmc v1.16b, v1.16b // AES block 1 - round 3
2301
+ ext v11.16b, v11.16b, v11.16b, #8
2302
+ aese v2.16b, v21.16b
2303
+ aesmc v2.16b, v2.16b // AES block 2 - round 3
2304
+ rev64 v11.16b, v11.16b
2305
+ aese v3.16b, v21.16b
2306
+ aesmc v3.16b, v3.16b // AES block 3 - round 3
2307
+ trn2 v17.2d, v14.2d, v15.2d // h4l | h3l
2308
+ aese v0.16b, v22.16b
2309
+ aesmc v0.16b, v0.16b // AES block 0 - round 4
2310
+ ldr q12, [x6] // load h1
2311
+ aese v1.16b, v22.16b
2312
+ aesmc v1.16b, v1.16b // AES block 1 - round 4
2313
+ ext v12.16b, v12.16b, v12.16b, #8
2314
+ aese v2.16b, v22.16b
2315
+ aesmc v2.16b, v2.16b // AES block 2 - round 4
2316
+ trn1 v9.2d, v14.2d, v15.2d // h4h | h3h
2317
+ aese v3.16b, v22.16b
2318
+ aesmc v3.16b, v3.16b // AES block 3 - round 4
2319
+ trn2 v16.2d, v12.2d, v13.2d // h2l | h1l
2320
+ aese v0.16b, v23.16b
2321
+ aesmc v0.16b, v0.16b // AES block 0 - round 5
2322
+ aese v1.16b, v23.16b
2323
+ aesmc v1.16b, v1.16b // AES block 1 - round 5
2324
+ aese v3.16b, v23.16b
2325
+ aesmc v3.16b, v3.16b // AES block 3 - round 5
2326
+ aese v2.16b, v23.16b
2327
+ aesmc v2.16b, v2.16b // AES block 2 - round 5
2328
+ aese v0.16b, v24.16b
2329
+ aesmc v0.16b, v0.16b // AES block 0 - round 6
2330
+ aese v1.16b, v24.16b
2331
+ aesmc v1.16b, v1.16b // AES block 1 - round 6
2332
+ aese v2.16b, v24.16b
2333
+ aesmc v2.16b, v2.16b // AES block 2 - round 6
2334
+ aese v3.16b, v24.16b
2335
+ aesmc v3.16b, v3.16b // AES block 3 - round 6
2336
+ aese v0.16b, v25.16b
2337
+ aesmc v0.16b, v0.16b // AES block 0 - round 7
2338
+ aese v1.16b, v25.16b
2339
+ aesmc v1.16b, v1.16b // AES block 1 - round 7
2340
+ aese v2.16b, v25.16b
2341
+ aesmc v2.16b, v2.16b // AES block 2 - round 7
2342
+ aese v3.16b, v25.16b
2343
+ aesmc v3.16b, v3.16b // AES block 3 - round 7
2344
+ aese v0.16b, v26.16b
2345
+ aesmc v0.16b, v0.16b // AES block 0 - round 8
2346
+ aese v1.16b, v26.16b
2347
+ aesmc v1.16b, v1.16b // AES block 1 - round 8
2348
+ aese v2.16b, v26.16b
2349
+ aesmc v2.16b, v2.16b // AES block 2 - round 8
2350
+ aese v3.16b, v26.16b
2351
+ aesmc v3.16b, v3.16b // AES block 3 - round 8
2352
+ cmp x17, #12 // setup flags for AES-128/192/256 check
2353
+ b.lt Ldec_finish_first_blocks_eor3 // branch if AES-128
2354
+ ldp q27, q28, [x8, #144] // load rk9, rk10
2355
+ aese v0.16b, v27.16b
2356
+ aesmc v0.16b, v0.16b // AES block 0 - round 9
2357
+ aese v1.16b, v27.16b
2358
+ aesmc v1.16b, v1.16b // AES block 1 - round 9
2359
+ aese v2.16b, v27.16b
2360
+ aesmc v2.16b, v2.16b // AES block 2 - round 9
2361
+ aese v3.16b, v27.16b
2362
+ aesmc v3.16b, v3.16b // AES block 3 - round 9
2363
+ aese v0.16b, v28.16b
2364
+ aesmc v0.16b, v0.16b // AES block 0 - round 10
2365
+ aese v1.16b, v28.16b
2366
+ aesmc v1.16b, v1.16b // AES block 1 - round 10
2367
+ aese v2.16b, v28.16b
2368
+ aesmc v2.16b, v2.16b // AES block 2 - round 10
2369
+ aese v3.16b, v28.16b
2370
+ aesmc v3.16b, v3.16b // AES block 3 - round 10
2371
+ b.eq Ldec_finish_first_blocks_eor3 // branch if AES-192
2372
+ ldp q27, q28, [x8, #176] // load rk11, rk12
2373
+ aese v0.16b, v27.16b
2374
+ aesmc v0.16b, v0.16b // AES block 0 - round 11
2375
+ aese v1.16b, v27.16b
2376
+ aesmc v1.16b, v1.16b // AES block 1 - round 11
2377
+ aese v2.16b, v27.16b
2378
+ aesmc v2.16b, v2.16b // AES block 2 - round 11
2379
+ aese v3.16b, v27.16b
2380
+ aesmc v3.16b, v3.16b // AES block 3 - round 11
2381
+ aese v0.16b, v28.16b
2382
+ aesmc v0.16b, v0.16b // AES block 0 - round 12
2383
+ aese v1.16b, v28.16b
2384
+ aesmc v1.16b, v1.16b // AES block 1 - round 12
2385
+ aese v2.16b, v28.16b
2386
+ aesmc v2.16b, v2.16b // AES block 2 - round 12
2387
+ aese v3.16b, v28.16b
2388
+ aesmc v3.16b, v3.16b // AES block 3 - round 12
2389
+ Ldec_finish_first_blocks_eor3:
2390
+ ldr q27, [x19] // load rkN
2391
+ cmp x0, x5 // check if we have <= 4 blocks
2392
+ eor v17.16b, v17.16b, v9.16b // h4k | h3k
2393
+ aese v1.16b, v31.16b // AES block 1 - round N-1
2394
+ aese v2.16b, v31.16b // AES block 2 - round N-1
2395
+ aese v3.16b, v31.16b // AES block 3 - round N-1
2396
+ aese v0.16b, v31.16b // AES block 0 - round N-1
2397
+ trn1 v8.2d, v12.2d, v13.2d // h2h | h1h
2398
+ eor v16.16b, v16.16b, v8.16b // h2k | h1k
2399
+ b.ge Ldec_tail_eor3 // handle tail
2400
+ // Setup for AES blocks 0-3 is done purely on NEON side instead of mixing NEON and scalar instructions.
2401
+ // This is because the final result of the AES block needs to be EORd with the final round key
2402
+ // value (v30). This avoids several fmovs.
2403
+ ldp q6, q7, [x0, #32] // AES blocks 2,3 load ciphertext
2404
+ ldp q4, q5, [x0], #64 // AES blocks 0,1 load ciphertext
2405
+ eor3 v0.16b, v4.16b, v0.16b, v27.16b // AES block 0 - result
2406
+ eor3 v1.16b, v5.16b, v1.16b, v27.16b // AES block 1 - result
2407
+ eor3 v2.16b, v6.16b, v2.16b, v27.16b // AES block 2 - result
2408
+ eor3 v3.16b, v7.16b, v3.16b, v27.16b // AES block 3 - result
2409
+ st1 { v0.16b, v1.16b, v2.16b, v3.16b}, [x2], #64 // AES blocks 0-3 - store result
2410
+ ldr q0, [sp, #160]
2411
+ ldr q1, [sp, #176]
2412
+ ldr q2, [sp, #192]
2413
+ ldr q3, [sp, #208]
2414
+ rev w20, w9
2415
+ str w20, [sp, #172]
2416
+ add w20, w9, #1
2417
+ rev w20, w20
2418
+ str w20, [sp, #188]
2419
+ add w20, w9, #2
2420
+ rev w20, w20
2421
+ str w20, [sp, #204]
2422
+ add w20, w9, #3
2423
+ rev w20, w20
2424
+ str w20, [sp, #220]
2425
+ add w9, w9, #4
2426
+ cmp x0, x5 // check if we have <= 4 blocks
2427
+ b.ge Ldec_prepretail_eor3 // do prepretail
2428
+ Ldec_main_loop_eor3: // main loop start
2429
+ aese v0.16b, v18.16b
2430
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 0
2431
+ aese v1.16b, v18.16b
2432
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 0
2433
+ aese v2.16b, v18.16b
2434
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 0
2435
+ aese v3.16b, v18.16b
2436
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 0
2437
+ aese v0.16b, v19.16b
2438
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 1
2439
+ aese v1.16b, v19.16b
2440
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 1
2441
+ aese v2.16b, v19.16b
2442
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 1
2443
+ aese v3.16b, v19.16b
2444
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 1
2445
+ rev64 v4.16b, v4.16b // GHASH block 4k
2446
+ rev64 v5.16b, v5.16b // GHASH block 4k+1
2447
+ rev64 v6.16b, v6.16b // GHASH block 4k+2
2448
+ rev64 v7.16b, v7.16b // GHASH block 4k+3
2449
+ aese v0.16b, v20.16b
2450
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 2
2451
+ ext v11.16b, v11.16b, v11.16b, #8 // PRE 0
2452
+ aese v1.16b, v20.16b
2453
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 2
2454
+ eor v4.16b, v4.16b, v11.16b // PRE 1
2455
+ aese v2.16b, v20.16b
2456
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 2
2457
+ pmull v11.1q, v4.1d, v15.1d // GHASH block 4k - low
2458
+ aese v3.16b, v20.16b
2459
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 2
2460
+ pmull2 v9.1q, v4.2d, v15.2d // GHASH block 4k - high
2461
+ aese v0.16b, v21.16b
2462
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 3
2463
+ mov d10, v17.d[1] // GHASH block 4k - mid
2464
+ aese v1.16b, v21.16b
2465
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 3
2466
+ mov d8, v4.d[1] // GHASH block 4k - mid
2467
+ aese v2.16b, v21.16b
2468
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 3
2469
+ eor v8.8b, v8.8b, v4.8b // GHASH block 4k - mid
2470
+ aese v3.16b, v21.16b
2471
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 3
2472
+ aese v0.16b, v22.16b
2473
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 4
2474
+ pmull2 v4.1q, v5.2d, v14.2d // GHASH block 4k+1 - high
2475
+ aese v1.16b, v22.16b
2476
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 4
2477
+ eor v9.16b, v9.16b, v4.16b // GHASH block 4k+1 - high
2478
+ aese v2.16b, v22.16b
2479
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 4
2480
+ mov d4, v5.d[1] // GHASH block 4k+1 - mid
2481
+ aese v3.16b, v22.16b
2482
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 4
2483
+ pmull v10.1q, v8.1d, v10.1d // GHASH block 4k - mid
2484
+ aese v0.16b, v23.16b
2485
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 5
2486
+ pmull v8.1q, v5.1d, v14.1d // GHASH block 4k+1 - low
2487
+ aese v1.16b, v23.16b
2488
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 5
2489
+ eor v4.8b, v4.8b, v5.8b // GHASH block 4k+1 - mid
2490
+ aese v3.16b, v23.16b
2491
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 5
2492
+ aese v2.16b, v23.16b
2493
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 5
2494
+ pmull v5.1q, v6.1d, v13.1d // GHASH block 4k+2 - low
2495
+ aese v0.16b, v24.16b
2496
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 6
2497
+ eor3 v11.16b, v11.16b, v8.16b, v5.16b // GHASH block 4k+1 - low & GHASH block 4k+2 - low
2498
+ aese v1.16b, v24.16b
2499
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 6
2500
+ mov d8, v6.d[1] // GHASH block 4k+2 - mid
2501
+ aese v2.16b, v24.16b
2502
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 6
2503
+ eor v8.8b, v8.8b, v6.8b // GHASH block 4k+2 - mid
2504
+ pmull v4.1q, v4.1d, v17.1d // GHASH block 4k+1 - mid
2505
+ ins v8.d[1], v8.d[0] // GHASH block 4k+2 - mid
2506
+ aese v3.16b, v24.16b
2507
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 6
2508
+ pmull2 v28.1q, v6.2d, v13.2d // GHASH block 4k+2 - high
2509
+ mov d6, v7.d[1] // GHASH block 4k+3 - mid
2510
+ aese v0.16b, v25.16b
2511
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 7
2512
+ pmull2 v8.1q, v8.2d, v16.2d // GHASH block 4k+2 - mid
2513
+ aese v1.16b, v25.16b
2514
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 7
2515
+ pmull v27.1q, v7.1d, v12.1d // GHASH block 4k+3 - low
2516
+ aese v2.16b, v25.16b
2517
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 7
2518
+ eor3 v10.16b, v10.16b, v4.16b, v8.16b // GHASH block 4k+1 - mid & GHASH block 4k+2 - mid
2519
+ aese v3.16b, v25.16b
2520
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 7
2521
+ pmull2 v5.1q, v7.2d, v12.2d // GHASH block 4k+3 - high
2522
+ eor v6.8b, v6.8b, v7.8b // GHASH block 4k+3 - mid
2523
+ eor3 v9.16b, v9.16b, v28.16b, v5.16b // GHASH block 4k+2 - high & GHASH block 4k+3 - high
2524
+ aese v0.16b, v26.16b
2525
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 8
2526
+ aese v1.16b, v26.16b
2527
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 8
2528
+ aese v2.16b, v26.16b
2529
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 8
2530
+ pmull v6.1q, v6.1d, v16.1d // GHASH block 4k+3 - mid
2531
+ ldr d8, [sp, #128]
2532
+ aese v3.16b, v26.16b
2533
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 8
2534
+ pmull v7.1q, v9.1d, v8.1d // MODULO - top 64b align with mid
2535
+ eor3 v10.16b, v10.16b, v6.16b, v7.16b // GHASH block 4k+3 - mid & MODULO - fold into mid
2536
+ eor v11.16b, v11.16b, v27.16b // GHASH block 4k+3 - low
2537
+ eor v6.16b, v11.16b, v9.16b // MODULO - karatsuba tidy up
2538
+ ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment
2539
+ eor3 v10.16b, v10.16b, v6.16b, v9.16b // MODULO - karatsuba tidy up & MODULO - fold into mid
2540
+ pmull v8.1q, v10.1d, v8.1d // MODULO - mid 64b align with low
2541
+ ext v10.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment
2542
+ eor3 v11.16b, v11.16b, v8.16b, v10.16b // MODULO - fold into low
2543
+ cmp w17, #12 // setup flags for AES-128/192/256 check
2544
+ b.lt Ldec_main_loop_continue_eor3 // branch if AES-128
2545
+ ldp q27, q28, [x8, #144] // load rk9, rk10
2546
+ aese v0.16b, v27.16b
2547
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 9
2548
+ aese v1.16b, v27.16b
2549
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 9
2550
+ aese v2.16b, v27.16b
2551
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 9
2552
+ aese v3.16b, v27.16b
2553
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 9
2554
+ aese v0.16b, v28.16b
2555
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 10
2556
+ aese v1.16b, v28.16b
2557
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 10
2558
+ aese v2.16b, v28.16b
2559
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 10
2560
+ aese v3.16b, v28.16b
2561
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 10
2562
+ b.eq Ldec_main_loop_continue_eor3 // branch if AES-192
2563
+ ldp q27, q28, [x8, #176] // load rk11, rk12
2564
+ aese v0.16b, v27.16b
2565
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 11
2566
+ aese v1.16b, v27.16b
2567
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 11
2568
+ aese v2.16b, v27.16b
2569
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 11
2570
+ aese v3.16b, v27.16b
2571
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 11
2572
+ aese v0.16b, v28.16b
2573
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 12
2574
+ aese v1.16b, v28.16b
2575
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 12
2576
+ aese v2.16b, v28.16b
2577
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 12
2578
+ aese v3.16b, v28.16b
2579
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 12
2580
+ Ldec_main_loop_continue_eor3:
2581
+ ldr q27, [x19] // load rkN
2582
+ ldp q6, q7, [x0, #32] // AES blocks 2,3 load ciphertext
2583
+ ldp q4, q5, [x0], #64 // AES blocks 0,1 load ciphertext
2584
+ aese v0.16b, v31.16b // AES block 4k+4 - round N-1
2585
+ eor3 v0.16b, v4.16b, v0.16b, v27.16b // AES block 4k+4 - result
2586
+ aese v1.16b, v31.16b // AES block 4k+5 - round N-1
2587
+ eor3 v1.16b, v5.16b, v1.16b, v27.16b // AES block 4k+5 - result
2588
+ aese v2.16b, v31.16b // AES block 4k+6 - round N-1
2589
+ eor3 v2.16b, v6.16b, v2.16b, v27.16b // AES block 4k+6 - result
2590
+ aese v3.16b, v31.16b // AES block 4k+7 - round N-1
2591
+ eor3 v3.16b, v7.16b, v3.16b, v27.16b // AES block 4k+7 - result
2592
+ st1 { v0.16b, v1.16b, v2.16b, v3.16b}, [x2], #64 // AES blocks 4k+4-7 - store result
2593
+ ldr q0, [sp, #160]
2594
+ ldr q1, [sp, #176]
2595
+ ldr q2, [sp, #192]
2596
+ ldr q3, [sp, #208]
2597
+ rev w20, w9
2598
+ str w20, [sp, #172]
2599
+ add w20, w9, #1
2600
+ rev w20, w20
2601
+ str w20, [sp, #188]
2602
+ add w20, w9, #2
2603
+ rev w20, w20
2604
+ str w20, [sp, #204]
2605
+ add w20, w9, #3
2606
+ rev w20, w20
2607
+ str w20, [sp, #220]
2608
+ add w9, w9, #4
2609
+ cmp x0, x5
2610
+ b.lt Ldec_main_loop_eor3
2611
+ Ldec_prepretail_eor3: // PREPRETAIL
2612
+ rev64 v4.16b, v4.16b // GHASH block 0
2613
+ rev64 v5.16b, v5.16b // GHASH block 1
2614
+ ext v11.16b, v11.16b, v11.16b, #8 // PRE 0
2615
+ aese v0.16b, v18.16b
2616
+ aesmc v0.16b, v0.16b // AES block 0 - round 0
2617
+ aese v1.16b, v18.16b
2618
+ aesmc v1.16b, v1.16b // AES block 1 - round 0
2619
+ eor v4.16b, v4.16b, v11.16b // PRE 1
2620
+ rev64 v6.16b, v6.16b // GHASH block 2
2621
+ aese v1.16b, v19.16b
2622
+ aesmc v1.16b, v1.16b // AES block 1 - round 1
2623
+ pmull v11.1q, v4.1d, v15.1d // GHASH block 0 - low
2624
+ mov d8, v4.d[1] // GHASH block 0 - mid
2625
+ pmull2 v9.1q, v4.2d, v15.2d // GHASH block 0 - high
2626
+ aese v2.16b, v18.16b
2627
+ aesmc v2.16b, v2.16b // AES block 2 - round 0
2628
+ mov d10, v17.d[1] // GHASH block 0 - mid
2629
+ aese v0.16b, v19.16b
2630
+ aesmc v0.16b, v0.16b // AES block 0 - round 1
2631
+ eor v8.8b, v8.8b, v4.8b // GHASH block 0 - mid
2632
+ pmull2 v4.1q, v5.2d, v14.2d // GHASH block 1 - high
2633
+ aese v2.16b, v19.16b
2634
+ aesmc v2.16b, v2.16b // AES block 2 - round 1
2635
+ rev64 v7.16b, v7.16b // GHASH block 3
2636
+ aese v3.16b, v18.16b
2637
+ aesmc v3.16b, v3.16b // AES block 3 - round 0
2638
+ pmull v10.1q, v8.1d, v10.1d // GHASH block 0 - mid
2639
+ eor v9.16b, v9.16b, v4.16b // GHASH block 1 - high
2640
+ pmull v8.1q, v5.1d, v14.1d // GHASH block 1 - low
2641
+ aese v3.16b, v19.16b
2642
+ aesmc v3.16b, v3.16b // AES block 3 - round 1
2643
+ mov d4, v5.d[1] // GHASH block 1 - mid
2644
+ aese v0.16b, v20.16b
2645
+ aesmc v0.16b, v0.16b // AES block 0 - round 2
2646
+ aese v1.16b, v20.16b
2647
+ aesmc v1.16b, v1.16b // AES block 1 - round 2
2648
+ eor v11.16b, v11.16b, v8.16b // GHASH block 1 - low
2649
+ aese v2.16b, v20.16b
2650
+ aesmc v2.16b, v2.16b // AES block 2 - round 2
2651
+ aese v0.16b, v21.16b
2652
+ aesmc v0.16b, v0.16b // AES block 0 - round 3
2653
+ mov d8, v6.d[1] // GHASH block 2 - mid
2654
+ aese v3.16b, v20.16b
2655
+ aesmc v3.16b, v3.16b // AES block 3 - round 2
2656
+ eor v4.8b, v4.8b, v5.8b // GHASH block 1 - mid
2657
+ pmull v5.1q, v6.1d, v13.1d // GHASH block 2 - low
2658
+ aese v0.16b, v22.16b
2659
+ aesmc v0.16b, v0.16b // AES block 0 - round 4
2660
+ aese v3.16b, v21.16b
2661
+ aesmc v3.16b, v3.16b // AES block 3 - round 3
2662
+ eor v8.8b, v8.8b, v6.8b // GHASH block 2 - mid
2663
+ pmull v4.1q, v4.1d, v17.1d // GHASH block 1 - mid
2664
+ aese v0.16b, v23.16b
2665
+ aesmc v0.16b, v0.16b // AES block 0 - round 5
2666
+ eor v11.16b, v11.16b, v5.16b // GHASH block 2 - low
2667
+ aese v3.16b, v22.16b
2668
+ aesmc v3.16b, v3.16b // AES block 3 - round 4
2669
+ pmull2 v5.1q, v7.2d, v12.2d // GHASH block 3 - high
2670
+ eor v10.16b, v10.16b, v4.16b // GHASH block 1 - mid
2671
+ pmull2 v4.1q, v6.2d, v13.2d // GHASH block 2 - high
2672
+ aese v3.16b, v23.16b
2673
+ aesmc v3.16b, v3.16b // AES block 3 - round 5
2674
+ ins v8.d[1], v8.d[0] // GHASH block 2 - mid
2675
+ aese v2.16b, v21.16b
2676
+ aesmc v2.16b, v2.16b // AES block 2 - round 3
2677
+ aese v1.16b, v21.16b
2678
+ aesmc v1.16b, v1.16b // AES block 1 - round 3
2679
+ eor3 v9.16b, v9.16b, v4.16b, v5.16b // GHASH block 2 - high & GHASH block 3 - high
2680
+ pmull v4.1q, v7.1d, v12.1d // GHASH block 3 - low
2681
+ aese v2.16b, v22.16b
2682
+ aesmc v2.16b, v2.16b // AES block 2 - round 4
2683
+ mov d6, v7.d[1] // GHASH block 3 - mid
2684
+ aese v1.16b, v22.16b
2685
+ aesmc v1.16b, v1.16b // AES block 1 - round 4
2686
+ pmull2 v8.1q, v8.2d, v16.2d // GHASH block 2 - mid
2687
+ aese v2.16b, v23.16b
2688
+ aesmc v2.16b, v2.16b // AES block 2 - round 5
2689
+ eor v6.8b, v6.8b, v7.8b // GHASH block 3 - mid
2690
+ aese v1.16b, v23.16b
2691
+ aesmc v1.16b, v1.16b // AES block 1 - round 5
2692
+ aese v3.16b, v24.16b
2693
+ aesmc v3.16b, v3.16b // AES block 3 - round 6
2694
+ eor v10.16b, v10.16b, v8.16b // GHASH block 2 - mid
2695
+ aese v2.16b, v24.16b
2696
+ aesmc v2.16b, v2.16b // AES block 2 - round 6
2697
+ aese v0.16b, v24.16b
2698
+ aesmc v0.16b, v0.16b // AES block 0 - round 6
2699
+ movi v8.8b, #0xc2
2700
+ aese v1.16b, v24.16b
2701
+ aesmc v1.16b, v1.16b // AES block 1 - round 6
2702
+ eor v11.16b, v11.16b, v4.16b // GHASH block 3 - low
2703
+ pmull v6.1q, v6.1d, v16.1d // GHASH block 3 - mid
2704
+ aese v3.16b, v25.16b
2705
+ aesmc v3.16b, v3.16b // AES block 3 - round 7
2706
+ aese v1.16b, v25.16b
2707
+ aesmc v1.16b, v1.16b // AES block 1 - round 7
2708
+ aese v0.16b, v25.16b
2709
+ aesmc v0.16b, v0.16b // AES block 0 - round 7
2710
+ eor v10.16b, v10.16b, v6.16b // GHASH block 3 - mid
2711
+ aese v3.16b, v26.16b
2712
+ aesmc v3.16b, v3.16b // AES block 3 - round 8
2713
+ aese v2.16b, v25.16b
2714
+ aesmc v2.16b, v2.16b // AES block 2 - round 7
2715
+ eor v6.16b, v11.16b, v9.16b // MODULO - karatsuba tidy up
2716
+ aese v1.16b, v26.16b
2717
+ aesmc v1.16b, v1.16b // AES block 1 - round 8
2718
+ aese v0.16b, v26.16b
2719
+ aesmc v0.16b, v0.16b // AES block 0 - round 8
2720
+ shl d8, d8, #56 // mod_constant
2721
+ aese v2.16b, v26.16b
2722
+ aesmc v2.16b, v2.16b // AES block 2 - round 8
2723
+ cmp w17, #12 // setup flags for AES-128/192/256 check
2724
+ b.lt Ldec_finish_prepretail_eor3 // branch if AES-128
2725
+ ldp q27, q28, [x8, #144] // load rk9, rk10
2726
+ aese v0.16b, v27.16b
2727
+ aesmc v0.16b, v0.16b // AES block 0 - round 9
2728
+ aese v1.16b, v27.16b
2729
+ aesmc v1.16b, v1.16b // AES block 1 - round 9
2730
+ aese v2.16b, v27.16b
2731
+ aesmc v2.16b, v2.16b // AES block 2 - round 9
2732
+ aese v3.16b, v27.16b
2733
+ aesmc v3.16b, v3.16b // AES block 3 - round 9
2734
+ aese v0.16b, v28.16b
2735
+ aesmc v0.16b, v0.16b // AES block 0 - round 10
2736
+ aese v1.16b, v28.16b
2737
+ aesmc v1.16b, v1.16b // AES block 1 - round 10
2738
+ aese v2.16b, v28.16b
2739
+ aesmc v2.16b, v2.16b // AES block 2 - round 10
2740
+ aese v3.16b, v28.16b
2741
+ aesmc v3.16b, v3.16b // AES block 3 - round 10
2742
+ b.eq Ldec_finish_prepretail_eor3 // branch if AES-192
2743
+ ldp q27, q28, [x8, #176] // load rk11, rk12
2744
+ aese v0.16b, v27.16b
2745
+ aesmc v0.16b, v0.16b // AES block 0 - round 11
2746
+ aese v1.16b, v27.16b
2747
+ aesmc v1.16b, v1.16b // AES block 1 - round 11
2748
+ aese v2.16b, v27.16b
2749
+ aesmc v2.16b, v2.16b // AES block 2 - round 11
2750
+ aese v3.16b, v27.16b
2751
+ aesmc v3.16b, v3.16b // AES block 3 - round 11
2752
+ aese v0.16b, v28.16b
2753
+ aesmc v0.16b, v0.16b // AES block 0 - round 12
2754
+ aese v1.16b, v28.16b
2755
+ aesmc v1.16b, v1.16b // AES block 1 - round 12
2756
+ aese v2.16b, v28.16b
2757
+ aesmc v2.16b, v2.16b // AES block 2 - round 12
2758
+ aese v3.16b, v28.16b
2759
+ aesmc v3.16b, v3.16b // AES block 3 - round 12
2760
+ Ldec_finish_prepretail_eor3:
2761
+ eor v10.16b, v10.16b, v6.16b // MODULO - karatsuba tidy up
2762
+ pmull v7.1q, v9.1d, v8.1d // MODULO - top 64b align with mid
2763
+ ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment
2764
+ eor3 v10.16b, v10.16b, v7.16b, v9.16b // MODULO - fold into mid
2765
+ pmull v8.1q, v10.1d, v8.1d // MODULO - mid 64b align with low
2766
+ ext v10.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment
2767
+ eor3 v11.16b, v11.16b, v8.16b, v10.16b // MODULO - fold into low
2768
+ aese v1.16b, v31.16b // AES block 1 - round N-1
2769
+ aese v0.16b, v31.16b // AES block 0 - round N-1
2770
+ aese v3.16b, v31.16b // AES block 3 - round N-1
2771
+ aese v2.16b, v31.16b // AES block 2 - round N-1
2772
+ Ldec_tail_eor3: // TAIL
2773
+ sub x5, x4, x0 // main_end_input_ptr is number of bytes left to process
2774
+ ld1 { v5.16b}, [x0], #16 // AES block 0 - load ciphertext
2775
+ eor v0.16b, v5.16b, v0.16b // AES block 0 - result
2776
+ mov x6, v0.d[0] // AES block 0 - mov low
2777
+ mov x7, v0.d[1] // AES block 0 - mov high
2778
+ ext v8.16b, v11.16b, v11.16b, #8 // prepare final partial tag
2779
+ eor x6, x6, x13 // AES block 0 - round N low
2780
+ eor x7, x7, x14 // AES block 0 - round N high
2781
+ cmp x5, #48
2782
+ b.gt Ldec_blocks_more_than_3_eor3
2783
+ mov v3.16b, v2.16b
2784
+ movi v10.8b, #0
2785
+ movi v11.8b, #0
2786
+ movi v9.8b, #0
2787
+ mov v2.16b, v1.16b
2788
+ cmp x5, #32
2789
+ b.gt Ldec_blocks_more_than_2_eor3
2790
+ mov v3.16b, v1.16b
2791
+ cmp x5, #16
2792
+ b.gt Ldec_blocks_more_than_1_eor3
2793
+ b Ldec_blocks_less_than_1_eor3
2794
+ Ldec_blocks_more_than_3_eor3: // blocks left > 3
2795
+ rev64 v4.16b, v5.16b // GHASH final-3 block
2796
+ ld1 { v5.16b}, [x0], #16 // AES final-2 block - load ciphertext
2797
+ stp x6, x7, [x2], #16 // AES final-3 block - store result
2798
+ mov d10, v17.d[1] // GHASH final-3 block - mid
2799
+ eor v4.16b, v4.16b, v8.16b // feed in partial tag
2800
+ eor v0.16b, v5.16b, v1.16b // AES final-2 block - result
2801
+ mov d22, v4.d[1] // GHASH final-3 block - mid
2802
+ mov x6, v0.d[0] // AES final-2 block - mov low
2803
+ mov x7, v0.d[1] // AES final-2 block - mov high
2804
+ eor v22.8b, v22.8b, v4.8b // GHASH final-3 block - mid
2805
+ movi v8.8b, #0 // suppress further partial tag feed in
2806
+ pmull2 v9.1q, v4.2d, v15.2d // GHASH final-3 block - high
2807
+ pmull v10.1q, v22.1d, v10.1d // GHASH final-3 block - mid
2808
+ eor x6, x6, x13 // AES final-2 block - round N low
2809
+ pmull v11.1q, v4.1d, v15.1d // GHASH final-3 block - low
2810
+ eor x7, x7, x14 // AES final-2 block - round N high
2811
+ Ldec_blocks_more_than_2_eor3: // blocks left > 2
2812
+ rev64 v4.16b, v5.16b // GHASH final-2 block
2813
+ ld1 { v5.16b}, [x0], #16 // AES final-1 block - load ciphertext
2814
+ eor v4.16b, v4.16b, v8.16b // feed in partial tag
2815
+ stp x6, x7, [x2], #16 // AES final-2 block - store result
2816
+ eor v0.16b, v5.16b, v2.16b // AES final-1 block - result
2817
+ mov d22, v4.d[1] // GHASH final-2 block - mid
2818
+ pmull v21.1q, v4.1d, v14.1d // GHASH final-2 block - low
2819
+ pmull2 v20.1q, v4.2d, v14.2d // GHASH final-2 block - high
2820
+ eor v22.8b, v22.8b, v4.8b // GHASH final-2 block - mid
2821
+ mov x6, v0.d[0] // AES final-1 block - mov low
2822
+ mov x7, v0.d[1] // AES final-1 block - mov high
2823
+ eor v11.16b, v11.16b, v21.16b // GHASH final-2 block - low
2824
+ movi v8.8b, #0 // suppress further partial tag feed in
2825
+ pmull v22.1q, v22.1d, v17.1d // GHASH final-2 block - mid
2826
+ eor v9.16b, v9.16b, v20.16b // GHASH final-2 block - high
2827
+ eor x6, x6, x13 // AES final-1 block - round N low
2828
+ eor v10.16b, v10.16b, v22.16b // GHASH final-2 block - mid
2829
+ eor x7, x7, x14 // AES final-1 block - round N high
2830
+ Ldec_blocks_more_than_1_eor3: // blocks left > 1
2831
+ stp x6, x7, [x2], #16 // AES final-1 block - store result
2832
+ rev64 v4.16b, v5.16b // GHASH final-1 block
2833
+ ld1 { v5.16b}, [x0], #16 // AES final block - load ciphertext
2834
+ eor v4.16b, v4.16b, v8.16b // feed in partial tag
2835
+ movi v8.8b, #0 // suppress further partial tag feed in
2836
+ mov d22, v4.d[1] // GHASH final-1 block - mid
2837
+ eor v0.16b, v5.16b, v3.16b // AES final block - result
2838
+ pmull2 v20.1q, v4.2d, v13.2d // GHASH final-1 block - high
2839
+ eor v22.8b, v22.8b, v4.8b // GHASH final-1 block - mid
2840
+ pmull v21.1q, v4.1d, v13.1d // GHASH final-1 block - low
2841
+ mov x6, v0.d[0] // AES final block - mov low
2842
+ ins v22.d[1], v22.d[0] // GHASH final-1 block - mid
2843
+ mov x7, v0.d[1] // AES final block - mov high
2844
+ pmull2 v22.1q, v22.2d, v16.2d // GHASH final-1 block - mid
2845
+ eor x6, x6, x13 // AES final block - round N low
2846
+ eor v11.16b, v11.16b, v21.16b // GHASH final-1 block - low
2847
+ eor v9.16b, v9.16b, v20.16b // GHASH final-1 block - high
2848
+ eor v10.16b, v10.16b, v22.16b // GHASH final-1 block - mid
2849
+ eor x7, x7, x14 // AES final block - round N high
2850
+ Ldec_blocks_less_than_1_eor3: // blocks left <= 1
2851
+ add x10, x10, x1, lsr #7 // Calculate the updated counter based on the number of 16B chunks we processed
2852
+ rev w10, w10
2853
+ str w10, [x16, #12] // store the updated counter
2854
+ and x1, x1, #127 // bit_length %= 128
2855
+ mvn x14, xzr // rkN_h = 0xffffffffffffffff
2856
+ sub x1, x1, #128 // bit_length -= 128
2857
+ mvn x13, xzr // rkN_l = 0xffffffffffffffff
2858
+ ldp x4, x5, [x2] // load existing bytes we need to not overwrite
2859
+ neg x1, x1 // bit_length = 128 - #bits in input (in range [1,128])
2860
+ and x1, x1, #127 // bit_length %= 128
2861
+ lsr x14, x14, x1 // rkN_h is mask for top 64b of last block
2862
+ cmp x1, #64
2863
+ csel x9, x13, x14, lt
2864
+ csel x10, x14, xzr, lt
2865
+ fmov d0, x9 // ctr0b is mask for last block
2866
+ and x6, x6, x9
2867
+ mov v0.d[1], x10
2868
+ bic x4, x4, x9 // mask out low existing bytes
2869
+ bic x5, x5, x10 // mask out high existing bytes
2870
+ orr x6, x6, x4
2871
+ and x7, x7, x10
2872
+ orr x7, x7, x5
2873
+ and v5.16b, v5.16b, v0.16b // possibly partial last block has zeroes in highest bits
2874
+ rev64 v4.16b, v5.16b // GHASH final block
2875
+ eor v4.16b, v4.16b, v8.16b // feed in partial tag
2876
+ pmull v21.1q, v4.1d, v12.1d // GHASH final block - low
2877
+ mov d8, v4.d[1] // GHASH final block - mid
2878
+ eor v8.8b, v8.8b, v4.8b // GHASH final block - mid
2879
+ pmull2 v20.1q, v4.2d, v12.2d // GHASH final block - high
2880
+ pmull v8.1q, v8.1d, v16.1d // GHASH final block - mid
2881
+ eor v9.16b, v9.16b, v20.16b // GHASH final block - high
2882
+ eor v11.16b, v11.16b, v21.16b // GHASH final block - low
2883
+ eor v10.16b, v10.16b, v8.16b // GHASH final block - mid
2884
+ ldr d8, [sp, #128]
2885
+ eor v6.16b, v11.16b, v9.16b // MODULO - karatsuba tidy up
2886
+ eor v10.16b, v10.16b, v6.16b // MODULO - karatsuba tidy up
2887
+ pmull v7.1q, v9.1d, v8.1d // MODULO - top 64b align with mid
2888
+ ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment
2889
+ eor v10.16b, v10.16b, v7.16b // MODULO - fold into mid
2890
+ eor v10.16b, v10.16b, v9.16b // MODULO - fold into mid
2891
+ pmull v8.1q, v10.1d, v8.1d // MODULO - mid 64b align with low
2892
+ ext v10.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment
2893
+ eor v11.16b, v11.16b, v8.16b // MODULO - fold into low
2894
+ stp x6, x7, [x2]
2895
+ eor v11.16b, v11.16b, v10.16b // MODULO - fold into low
2896
+ ext v11.16b, v11.16b, v11.16b, #8
2897
+ rev64 v11.16b, v11.16b // Final Tag
2898
+ mov x0, x15
2899
+ st1 { v11.16b }, [x3] // Store final tag
2900
+ ldp x19, x20, [sp, #16]
2901
+ ldp x21, x22, [sp, #32]
2902
+ ldp x23, x24, [sp, #48]
2903
+ ldp d8, d9, [sp, #64]
2904
+ ldp d10, d11, [sp, #80]
2905
+ ldp d12, d13, [sp, #96]
2906
+ ldp d14, d15, [sp, #112]
2907
+ ldp x29, x30, [sp], #224
2908
+ AARCH64_VALIDATE_LINK_REGISTER
2909
+ ret
2910
+
2911
+ #endif // __ARM_MAX_ARCH__ >= 8
2912
+ #endif // !OPENSSL_NO_ASM && defined(OPENSSL_AARCH64) && defined(__APPLE__)