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,2915 @@
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(_WIN32)
7
+ #if __ARM_MAX_ARCH__ >= 8
8
+ .arch armv8.2-a+crypto+sha3
9
+ .text
10
+ .globl aes_gcm_enc_kernel
11
+
12
+ .def aes_gcm_enc_kernel
13
+ .type 32
14
+ .endef
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
+
748
+ .def aes_gcm_dec_kernel
749
+ .type 32
750
+ .endef
751
+ .align 4
752
+ aes_gcm_dec_kernel:
753
+ AARCH64_SIGN_LINK_REGISTER
754
+ stp x29, x30, [sp, #-224]!
755
+ mov x29, sp
756
+ stp x19, x20, [sp, #16]
757
+ ld1 { v0.16b}, [x4]
758
+ mov v1.16b, v0.16b
759
+ mov v2.16b, v0.16b
760
+ mov v3.16b, v0.16b
761
+ mov x16, x4
762
+ mov x8, x5
763
+ stp x21, x22, [sp, #32]
764
+ stp x23, x24, [sp, #48]
765
+ stp d8, d9, [sp, #64]
766
+ stp d10, d11, [sp, #80]
767
+ stp d12, d13, [sp, #96]
768
+ stp d14, d15, [sp, #112]
769
+ ldr w17, [x8, #240] // Load number of AES rounds
770
+ add x19, x8, x17, lsl #4 // borrow input_l1 for last key
771
+ ldp x13, x14, [x19] // load round N keys
772
+ ldr q31, [x19, #-16] // load round N-1 keys
773
+ add x4, x0, x1, lsr #3 // end_input_ptr
774
+ lsr x5, x1, #3 // byte_len
775
+ mov x15, x5
776
+ ldr w9, [x16, #12] // Load scalar 32-bit counter (CTR)
777
+ sub x5, x5, #1 // byte_len - 1
778
+ ldr q18, [x8, #0] // load rk0
779
+ and x5, x5, #0xffffffffffffffc0 // number of bytes to be processed in main loop (at least 1 byte must be handled by tail)
780
+ add x5, x5, x0
781
+ rev w9, w9 // Reverse it once for big-endian incrementing
782
+ uxtw x10, w9 // Zero extend reversed w9 into x10
783
+ str q0, [sp, #160]
784
+ str q0, [sp, #176]
785
+ str q0, [sp, #192]
786
+ str q0, [sp, #208]
787
+ rev w20, w9
788
+ mov v0.s[3], w20
789
+ add w20, w9, #1
790
+ rev w20, w20
791
+ mov v1.s[3], w20
792
+ add w20, w9, #2
793
+ rev w20, w20
794
+ mov v2.s[3], w20
795
+ add w20, w9, #3
796
+ rev w20, w20
797
+ mov v3.s[3], w20
798
+ add w20, w9, #4
799
+ rev w20, w20
800
+ str w20, [sp, #172]
801
+ add w20, w9, #5
802
+ rev w20, w20
803
+ str w20, [sp, #188]
804
+ add w20, w9, #6
805
+ rev w20, w20
806
+ str w20, [sp, #204]
807
+ add w20, w9, #7
808
+ rev w20, w20
809
+ str w20, [sp, #220]
810
+ add w9, w9, #8
811
+ // Pre-compute this value instead of using two instructions for moving and then shifting in the main loop
812
+ mov x21, #0xc200000000000000
813
+ str x21, [sp, #128]
814
+ aese v0.16b, v18.16b
815
+ aesmc v0.16b, v0.16b // AES block 0 - round 0
816
+ ldp q19, q20, [x8, #16] // load rk1, rk2
817
+ aese v1.16b, v18.16b
818
+ aesmc v1.16b, v1.16b // AES block 1 - round 0
819
+ ldp q21, q22, [x8, #48] // load rk3, rk4
820
+ aese v2.16b, v18.16b
821
+ aesmc v2.16b, v2.16b // AES block 2 - round 0
822
+ ldp q23, q24, [x8, #80] // load rk5, rk6
823
+ aese v3.16b, v18.16b
824
+ aesmc v3.16b, v3.16b // AES block 3 - round 0
825
+ ldp q13, q14, [x6, #32] // load h2, h3
826
+ aese v0.16b, v19.16b
827
+ aesmc v0.16b, v0.16b // AES block 0 - round 1
828
+ ldp q25, q26, [x8, #112] // load rk7, rk8
829
+ aese v1.16b, v19.16b
830
+ aesmc v1.16b, v1.16b // AES block 1 - round 1
831
+ aese v2.16b, v19.16b
832
+ aesmc v2.16b, v2.16b // AES block 2 - round 1
833
+ aese v3.16b, v19.16b
834
+ aesmc v3.16b, v3.16b // AES block 3 - round 1
835
+ aese v0.16b, v20.16b
836
+ aesmc v0.16b, v0.16b // AES block 0 - round 2
837
+ ext v14.16b, v14.16b, v14.16b, #8
838
+ aese v1.16b, v20.16b
839
+ aesmc v1.16b, v1.16b // AES block 1 - round 2
840
+ ext v13.16b, v13.16b, v13.16b, #8
841
+ ldr q15, [x6, #80] // load h4
842
+ aese v2.16b, v20.16b
843
+ aesmc v2.16b, v2.16b // AES block 2 - round 2
844
+ aese v3.16b, v20.16b
845
+ aesmc v3.16b, v3.16b // AES block 3 - round 2
846
+ ext v15.16b, v15.16b, v15.16b, #8
847
+ aese v0.16b, v21.16b
848
+ aesmc v0.16b, v0.16b // AES block 0 - round 3
849
+ ld1 { v11.16b}, [x3]
850
+ aese v1.16b, v21.16b
851
+ aesmc v1.16b, v1.16b // AES block 1 - round 3
852
+ ext v11.16b, v11.16b, v11.16b, #8
853
+ aese v2.16b, v21.16b
854
+ aesmc v2.16b, v2.16b // AES block 2 - round 3
855
+ rev64 v11.16b, v11.16b
856
+ aese v3.16b, v21.16b
857
+ aesmc v3.16b, v3.16b // AES block 3 - round 3
858
+ trn2 v17.2d, v14.2d, v15.2d // h4l | h3l
859
+ aese v0.16b, v22.16b
860
+ aesmc v0.16b, v0.16b // AES block 0 - round 4
861
+ ldr q12, [x6] // load h1
862
+ aese v1.16b, v22.16b
863
+ aesmc v1.16b, v1.16b // AES block 1 - round 4
864
+ ext v12.16b, v12.16b, v12.16b, #8
865
+ aese v2.16b, v22.16b
866
+ aesmc v2.16b, v2.16b // AES block 2 - round 4
867
+ trn1 v9.2d, v14.2d, v15.2d // h4h | h3h
868
+ aese v3.16b, v22.16b
869
+ aesmc v3.16b, v3.16b // AES block 3 - round 4
870
+ trn2 v16.2d, v12.2d, v13.2d // h2l | h1l
871
+ aese v0.16b, v23.16b
872
+ aesmc v0.16b, v0.16b // AES block 0 - round 5
873
+ aese v1.16b, v23.16b
874
+ aesmc v1.16b, v1.16b // AES block 1 - round 5
875
+ aese v3.16b, v23.16b
876
+ aesmc v3.16b, v3.16b // AES block 3 - round 5
877
+ aese v2.16b, v23.16b
878
+ aesmc v2.16b, v2.16b // AES block 2 - round 5
879
+ aese v0.16b, v24.16b
880
+ aesmc v0.16b, v0.16b // AES block 0 - round 6
881
+ aese v1.16b, v24.16b
882
+ aesmc v1.16b, v1.16b // AES block 1 - round 6
883
+ aese v2.16b, v24.16b
884
+ aesmc v2.16b, v2.16b // AES block 2 - round 6
885
+ aese v3.16b, v24.16b
886
+ aesmc v3.16b, v3.16b // AES block 3 - round 6
887
+ aese v0.16b, v25.16b
888
+ aesmc v0.16b, v0.16b // AES block 0 - round 7
889
+ aese v1.16b, v25.16b
890
+ aesmc v1.16b, v1.16b // AES block 1 - round 7
891
+ aese v2.16b, v25.16b
892
+ aesmc v2.16b, v2.16b // AES block 2 - round 7
893
+ aese v3.16b, v25.16b
894
+ aesmc v3.16b, v3.16b // AES block 3 - round 7
895
+ aese v0.16b, v26.16b
896
+ aesmc v0.16b, v0.16b // AES block 0 - round 8
897
+ aese v1.16b, v26.16b
898
+ aesmc v1.16b, v1.16b // AES block 1 - round 8
899
+ aese v2.16b, v26.16b
900
+ aesmc v2.16b, v2.16b // AES block 2 - round 8
901
+ aese v3.16b, v26.16b
902
+ aesmc v3.16b, v3.16b // AES block 3 - round 8
903
+ cmp x17, #12 // setup flags for AES-128/192/256 check
904
+ b.lt Ldec_finish_first_blocks // branch if AES-128
905
+ ldp q27, q28, [x8, #144] // load rk9, rk10
906
+ aese v0.16b, v27.16b
907
+ aesmc v0.16b, v0.16b // AES block 0 - round 9
908
+ aese v1.16b, v27.16b
909
+ aesmc v1.16b, v1.16b // AES block 1 - round 9
910
+ aese v2.16b, v27.16b
911
+ aesmc v2.16b, v2.16b // AES block 2 - round 9
912
+ aese v3.16b, v27.16b
913
+ aesmc v3.16b, v3.16b // AES block 3 - round 9
914
+ aese v0.16b, v28.16b
915
+ aesmc v0.16b, v0.16b // AES block 0 - round 10
916
+ aese v1.16b, v28.16b
917
+ aesmc v1.16b, v1.16b // AES block 1 - round 10
918
+ aese v2.16b, v28.16b
919
+ aesmc v2.16b, v2.16b // AES block 2 - round 10
920
+ aese v3.16b, v28.16b
921
+ aesmc v3.16b, v3.16b // AES block 3 - round 10
922
+ b.eq Ldec_finish_first_blocks // branch if AES-192
923
+ ldp q27, q28, [x8, #176] // load rk11, rk12
924
+ aese v0.16b, v27.16b
925
+ aesmc v0.16b, v0.16b // AES block 0 - round 11
926
+ aese v1.16b, v27.16b
927
+ aesmc v1.16b, v1.16b // AES block 1 - round 11
928
+ aese v2.16b, v27.16b
929
+ aesmc v2.16b, v2.16b // AES block 2 - round 11
930
+ aese v3.16b, v27.16b
931
+ aesmc v3.16b, v3.16b // AES block 3 - round 11
932
+ aese v0.16b, v28.16b
933
+ aesmc v0.16b, v0.16b // AES block 0 - round 12
934
+ aese v1.16b, v28.16b
935
+ aesmc v1.16b, v1.16b // AES block 1 - round 12
936
+ aese v2.16b, v28.16b
937
+ aesmc v2.16b, v2.16b // AES block 2 - round 12
938
+ aese v3.16b, v28.16b
939
+ aesmc v3.16b, v3.16b // AES block 3 - round 12
940
+ Ldec_finish_first_blocks:
941
+ ldr q27, [x19] // load rkN
942
+ cmp x0, x5 // check if we have <= 4 blocks
943
+ eor v17.16b, v17.16b, v9.16b // h4k | h3k
944
+ aese v1.16b, v31.16b // AES block 1 - round N-1
945
+ aese v2.16b, v31.16b // AES block 2 - round N-1
946
+ aese v3.16b, v31.16b // AES block 3 - round N-1
947
+ aese v0.16b, v31.16b // AES block 0 - round N-1
948
+ trn1 v8.2d, v12.2d, v13.2d // h2h | h1h
949
+ eor v16.16b, v16.16b, v8.16b // h2k | h1k
950
+ b.ge Ldec_tail // handle tail
951
+ // Setup for AES blocks 0-3 is done purely on NEON side instead of mixing NEON and scalar instructions.
952
+ // This is because the final result of the AES block needs to be EORd with the final round key
953
+ // value (v30). This avoids several fmovs.
954
+ ldp q6, q7, [x0, #32] // AES blocks 2,3 load ciphertext
955
+ ldp q4, q5, [x0], #64 // AES blocks 0,1 load ciphertext
956
+ eor v0.16b, v4.16b, v0.16b
957
+ eor v0.16b, v0.16b, v27.16b // AES block 0 - result
958
+ eor v1.16b, v5.16b, v1.16b
959
+ eor v1.16b, v1.16b, v27.16b // AES block 1 - result
960
+ eor v2.16b, v6.16b, v2.16b
961
+ eor v2.16b, v2.16b, v27.16b // AES block 2 - result
962
+ eor v3.16b, v7.16b, v3.16b
963
+ eor v3.16b, v3.16b, v27.16b // AES block 3 - result
964
+ st1 { v0.16b, v1.16b, v2.16b, v3.16b}, [x2], #64 // AES blocks 0-3 - store result
965
+ ldr q0, [sp, #160]
966
+ ldr q1, [sp, #176]
967
+ ldr q2, [sp, #192]
968
+ ldr q3, [sp, #208]
969
+ rev w20, w9
970
+ str w20, [sp, #172]
971
+ add w20, w9, #1
972
+ rev w20, w20
973
+ str w20, [sp, #188]
974
+ add w20, w9, #2
975
+ rev w20, w20
976
+ str w20, [sp, #204]
977
+ add w20, w9, #3
978
+ rev w20, w20
979
+ str w20, [sp, #220]
980
+ add w9, w9, #4
981
+ cmp x0, x5 // check if we have <= 4 blocks
982
+ b.ge Ldec_prepretail // do prepretail
983
+ Ldec_main_loop: // main loop start
984
+ aese v0.16b, v18.16b
985
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 0
986
+ aese v1.16b, v18.16b
987
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 0
988
+ aese v2.16b, v18.16b
989
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 0
990
+ aese v3.16b, v18.16b
991
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 0
992
+ aese v0.16b, v19.16b
993
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 1
994
+ aese v1.16b, v19.16b
995
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 1
996
+ aese v2.16b, v19.16b
997
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 1
998
+ aese v3.16b, v19.16b
999
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 1
1000
+ rev64 v4.16b, v4.16b // GHASH block 4k
1001
+ rev64 v5.16b, v5.16b // GHASH block 4k+1
1002
+ rev64 v6.16b, v6.16b // GHASH block 4k+2
1003
+ rev64 v7.16b, v7.16b // GHASH block 4k+3
1004
+ aese v0.16b, v20.16b
1005
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 2
1006
+ ext v11.16b, v11.16b, v11.16b, #8 // PRE 0
1007
+ aese v1.16b, v20.16b
1008
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 2
1009
+ eor v4.16b, v4.16b, v11.16b // PRE 1
1010
+ aese v2.16b, v20.16b
1011
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 2
1012
+ pmull v11.1q, v4.1d, v15.1d // GHASH block 4k - low
1013
+ aese v3.16b, v20.16b
1014
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 2
1015
+ pmull2 v9.1q, v4.2d, v15.2d // GHASH block 4k - high
1016
+ aese v0.16b, v21.16b
1017
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 3
1018
+ mov d10, v17.d[1] // GHASH block 4k - mid
1019
+ aese v1.16b, v21.16b
1020
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 3
1021
+ mov d8, v4.d[1] // GHASH block 4k - mid
1022
+ aese v2.16b, v21.16b
1023
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 3
1024
+ eor v8.8b, v8.8b, v4.8b // GHASH block 4k - mid
1025
+ aese v3.16b, v21.16b
1026
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 3
1027
+ aese v0.16b, v22.16b
1028
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 4
1029
+ pmull2 v4.1q, v5.2d, v14.2d // GHASH block 4k+1 - high
1030
+ aese v1.16b, v22.16b
1031
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 4
1032
+ eor v9.16b, v9.16b, v4.16b // GHASH block 4k+1 - high
1033
+ aese v2.16b, v22.16b
1034
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 4
1035
+ mov d4, v5.d[1] // GHASH block 4k+1 - mid
1036
+ aese v3.16b, v22.16b
1037
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 4
1038
+ pmull v10.1q, v8.1d, v10.1d // GHASH block 4k - mid
1039
+ aese v0.16b, v23.16b
1040
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 5
1041
+ pmull v8.1q, v5.1d, v14.1d // GHASH block 4k+1 - low
1042
+ aese v1.16b, v23.16b
1043
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 5
1044
+ eor v4.8b, v4.8b, v5.8b // GHASH block 4k+1 - mid
1045
+ aese v3.16b, v23.16b
1046
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 5
1047
+ aese v2.16b, v23.16b
1048
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 5
1049
+ pmull v5.1q, v6.1d, v13.1d // GHASH block 4k+2 - low
1050
+ aese v0.16b, v24.16b
1051
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 6
1052
+ eor v11.16b, v11.16b, v8.16b
1053
+ eor v11.16b, v11.16b, v5.16b // GHASH block 4k+1 - low & GHASH block 4k+2 - low
1054
+ aese v1.16b, v24.16b
1055
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 6
1056
+ mov d8, v6.d[1] // GHASH block 4k+2 - mid
1057
+ aese v2.16b, v24.16b
1058
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 6
1059
+ eor v8.8b, v8.8b, v6.8b // GHASH block 4k+2 - mid
1060
+ pmull v4.1q, v4.1d, v17.1d // GHASH block 4k+1 - mid
1061
+ ins v8.d[1], v8.d[0] // GHASH block 4k+2 - mid
1062
+ aese v3.16b, v24.16b
1063
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 6
1064
+ pmull2 v28.1q, v6.2d, v13.2d // GHASH block 4k+2 - high
1065
+ mov d6, v7.d[1] // GHASH block 4k+3 - mid
1066
+ aese v0.16b, v25.16b
1067
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 7
1068
+ pmull2 v8.1q, v8.2d, v16.2d // GHASH block 4k+2 - mid
1069
+ aese v1.16b, v25.16b
1070
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 7
1071
+ pmull v27.1q, v7.1d, v12.1d // GHASH block 4k+3 - low
1072
+ aese v2.16b, v25.16b
1073
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 7
1074
+ eor v10.16b, v10.16b, v4.16b
1075
+ eor v10.16b, v10.16b, v8.16b // GHASH block 4k+1 - mid & GHASH block 4k+2 - mid
1076
+ aese v3.16b, v25.16b
1077
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 7
1078
+ pmull2 v5.1q, v7.2d, v12.2d // GHASH block 4k+3 - high
1079
+ eor v6.8b, v6.8b, v7.8b // GHASH block 4k+3 - mid
1080
+ eor v9.16b, v9.16b, v28.16b
1081
+ eor v9.16b, v9.16b, v5.16b // GHASH block 4k+2 - high & GHASH block 4k+3 - high
1082
+ aese v0.16b, v26.16b
1083
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 8
1084
+ aese v1.16b, v26.16b
1085
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 8
1086
+ aese v2.16b, v26.16b
1087
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 8
1088
+ pmull v6.1q, v6.1d, v16.1d // GHASH block 4k+3 - mid
1089
+ ldr d8, [sp, #128]
1090
+ aese v3.16b, v26.16b
1091
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 8
1092
+ pmull v7.1q, v9.1d, v8.1d // MODULO - top 64b align with mid
1093
+ eor v10.16b, v10.16b, v6.16b
1094
+ eor v10.16b, v10.16b, v7.16b // GHASH block 4k+3 - mid & MODULO - fold into mid
1095
+ eor v11.16b, v11.16b, v27.16b // GHASH block 4k+3 - low
1096
+ eor v6.16b, v11.16b, v9.16b // MODULO - karatsuba tidy up
1097
+ ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment
1098
+ eor v10.16b, v10.16b, v6.16b
1099
+ eor v10.16b, v10.16b, v9.16b // MODULO - karatsuba tidy up & MODULO - fold into mid
1100
+ pmull v8.1q, v10.1d, v8.1d // MODULO - mid 64b align with low
1101
+ ext v10.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment
1102
+ eor v11.16b, v11.16b, v8.16b
1103
+ eor v11.16b, v11.16b, v10.16b // MODULO - fold into low
1104
+ cmp w17, #12 // setup flags for AES-128/192/256 check
1105
+ b.lt Ldec_main_loop_continue // branch if AES-128
1106
+ ldp q27, q28, [x8, #144] // load rk9, rk10
1107
+ aese v0.16b, v27.16b
1108
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 9
1109
+ aese v1.16b, v27.16b
1110
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 9
1111
+ aese v2.16b, v27.16b
1112
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 9
1113
+ aese v3.16b, v27.16b
1114
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 9
1115
+ aese v0.16b, v28.16b
1116
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 10
1117
+ aese v1.16b, v28.16b
1118
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 10
1119
+ aese v2.16b, v28.16b
1120
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 10
1121
+ aese v3.16b, v28.16b
1122
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 10
1123
+ b.eq Ldec_main_loop_continue // branch if AES-192
1124
+ ldp q27, q28, [x8, #176] // load rk11, rk12
1125
+ aese v0.16b, v27.16b
1126
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 11
1127
+ aese v1.16b, v27.16b
1128
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 11
1129
+ aese v2.16b, v27.16b
1130
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 11
1131
+ aese v3.16b, v27.16b
1132
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 11
1133
+ aese v0.16b, v28.16b
1134
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 12
1135
+ aese v1.16b, v28.16b
1136
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 12
1137
+ aese v2.16b, v28.16b
1138
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 12
1139
+ aese v3.16b, v28.16b
1140
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 12
1141
+ Ldec_main_loop_continue:
1142
+ ldr q27, [x19] // load rkN
1143
+ ldp q6, q7, [x0, #32] // AES blocks 2,3 load ciphertext
1144
+ ldp q4, q5, [x0], #64 // AES blocks 0,1 load ciphertext
1145
+ aese v0.16b, v31.16b // AES block 4k+4 - round N-1
1146
+ eor v0.16b, v4.16b, v0.16b
1147
+ eor v0.16b, v0.16b, v27.16b // AES block 4k+4 - result
1148
+ aese v1.16b, v31.16b // AES block 4k+5 - round N-1
1149
+ eor v1.16b, v5.16b, v1.16b
1150
+ eor v1.16b, v1.16b, v27.16b // AES block 4k+5 - result
1151
+ aese v2.16b, v31.16b // AES block 4k+6 - round N-1
1152
+ eor v2.16b, v6.16b, v2.16b
1153
+ eor v2.16b, v2.16b, v27.16b // AES block 4k+6 - result
1154
+ aese v3.16b, v31.16b // AES block 4k+7 - round N-1
1155
+ eor v3.16b, v7.16b, v3.16b
1156
+ eor v3.16b, v3.16b, v27.16b // AES block 4k+7 - result
1157
+ st1 { v0.16b, v1.16b, v2.16b, v3.16b}, [x2], #64 // AES blocks 4k+4-7 - store result
1158
+ ldr q0, [sp, #160]
1159
+ ldr q1, [sp, #176]
1160
+ ldr q2, [sp, #192]
1161
+ ldr q3, [sp, #208]
1162
+ rev w20, w9
1163
+ str w20, [sp, #172]
1164
+ add w20, w9, #1
1165
+ rev w20, w20
1166
+ str w20, [sp, #188]
1167
+ add w20, w9, #2
1168
+ rev w20, w20
1169
+ str w20, [sp, #204]
1170
+ add w20, w9, #3
1171
+ rev w20, w20
1172
+ str w20, [sp, #220]
1173
+ add w9, w9, #4
1174
+ cmp x0, x5
1175
+ b.lt Ldec_main_loop
1176
+ Ldec_prepretail: // PREPRETAIL
1177
+ rev64 v4.16b, v4.16b // GHASH block 0
1178
+ rev64 v5.16b, v5.16b // GHASH block 1
1179
+ ext v11.16b, v11.16b, v11.16b, #8 // PRE 0
1180
+ aese v0.16b, v18.16b
1181
+ aesmc v0.16b, v0.16b // AES block 0 - round 0
1182
+ aese v1.16b, v18.16b
1183
+ aesmc v1.16b, v1.16b // AES block 1 - round 0
1184
+ eor v4.16b, v4.16b, v11.16b // PRE 1
1185
+ rev64 v6.16b, v6.16b // GHASH block 2
1186
+ aese v1.16b, v19.16b
1187
+ aesmc v1.16b, v1.16b // AES block 1 - round 1
1188
+ pmull v11.1q, v4.1d, v15.1d // GHASH block 0 - low
1189
+ mov d8, v4.d[1] // GHASH block 0 - mid
1190
+ pmull2 v9.1q, v4.2d, v15.2d // GHASH block 0 - high
1191
+ aese v2.16b, v18.16b
1192
+ aesmc v2.16b, v2.16b // AES block 2 - round 0
1193
+ mov d10, v17.d[1] // GHASH block 0 - mid
1194
+ aese v0.16b, v19.16b
1195
+ aesmc v0.16b, v0.16b // AES block 0 - round 1
1196
+ eor v8.8b, v8.8b, v4.8b // GHASH block 0 - mid
1197
+ pmull2 v4.1q, v5.2d, v14.2d // GHASH block 1 - high
1198
+ aese v2.16b, v19.16b
1199
+ aesmc v2.16b, v2.16b // AES block 2 - round 1
1200
+ rev64 v7.16b, v7.16b // GHASH block 3
1201
+ aese v3.16b, v18.16b
1202
+ aesmc v3.16b, v3.16b // AES block 3 - round 0
1203
+ pmull v10.1q, v8.1d, v10.1d // GHASH block 0 - mid
1204
+ eor v9.16b, v9.16b, v4.16b // GHASH block 1 - high
1205
+ pmull v8.1q, v5.1d, v14.1d // GHASH block 1 - low
1206
+ aese v3.16b, v19.16b
1207
+ aesmc v3.16b, v3.16b // AES block 3 - round 1
1208
+ mov d4, v5.d[1] // GHASH block 1 - mid
1209
+ aese v0.16b, v20.16b
1210
+ aesmc v0.16b, v0.16b // AES block 0 - round 2
1211
+ aese v1.16b, v20.16b
1212
+ aesmc v1.16b, v1.16b // AES block 1 - round 2
1213
+ eor v11.16b, v11.16b, v8.16b // GHASH block 1 - low
1214
+ aese v2.16b, v20.16b
1215
+ aesmc v2.16b, v2.16b // AES block 2 - round 2
1216
+ aese v0.16b, v21.16b
1217
+ aesmc v0.16b, v0.16b // AES block 0 - round 3
1218
+ mov d8, v6.d[1] // GHASH block 2 - mid
1219
+ aese v3.16b, v20.16b
1220
+ aesmc v3.16b, v3.16b // AES block 3 - round 2
1221
+ eor v4.8b, v4.8b, v5.8b // GHASH block 1 - mid
1222
+ pmull v5.1q, v6.1d, v13.1d // GHASH block 2 - low
1223
+ aese v0.16b, v22.16b
1224
+ aesmc v0.16b, v0.16b // AES block 0 - round 4
1225
+ aese v3.16b, v21.16b
1226
+ aesmc v3.16b, v3.16b // AES block 3 - round 3
1227
+ eor v8.8b, v8.8b, v6.8b // GHASH block 2 - mid
1228
+ pmull v4.1q, v4.1d, v17.1d // GHASH block 1 - mid
1229
+ aese v0.16b, v23.16b
1230
+ aesmc v0.16b, v0.16b // AES block 0 - round 5
1231
+ eor v11.16b, v11.16b, v5.16b // GHASH block 2 - low
1232
+ aese v3.16b, v22.16b
1233
+ aesmc v3.16b, v3.16b // AES block 3 - round 4
1234
+ pmull2 v5.1q, v7.2d, v12.2d // GHASH block 3 - high
1235
+ eor v10.16b, v10.16b, v4.16b // GHASH block 1 - mid
1236
+ pmull2 v4.1q, v6.2d, v13.2d // GHASH block 2 - high
1237
+ aese v3.16b, v23.16b
1238
+ aesmc v3.16b, v3.16b // AES block 3 - round 5
1239
+ ins v8.d[1], v8.d[0] // GHASH block 2 - mid
1240
+ aese v2.16b, v21.16b
1241
+ aesmc v2.16b, v2.16b // AES block 2 - round 3
1242
+ aese v1.16b, v21.16b
1243
+ aesmc v1.16b, v1.16b // AES block 1 - round 3
1244
+ eor v9.16b, v9.16b, v4.16b
1245
+ eor v9.16b, v9.16b, v5.16b // GHASH block 2 - high & GHASH block 3 - high
1246
+ pmull v4.1q, v7.1d, v12.1d // GHASH block 3 - low
1247
+ aese v2.16b, v22.16b
1248
+ aesmc v2.16b, v2.16b // AES block 2 - round 4
1249
+ mov d6, v7.d[1] // GHASH block 3 - mid
1250
+ aese v1.16b, v22.16b
1251
+ aesmc v1.16b, v1.16b // AES block 1 - round 4
1252
+ pmull2 v8.1q, v8.2d, v16.2d // GHASH block 2 - mid
1253
+ aese v2.16b, v23.16b
1254
+ aesmc v2.16b, v2.16b // AES block 2 - round 5
1255
+ eor v6.8b, v6.8b, v7.8b // GHASH block 3 - mid
1256
+ aese v1.16b, v23.16b
1257
+ aesmc v1.16b, v1.16b // AES block 1 - round 5
1258
+ aese v3.16b, v24.16b
1259
+ aesmc v3.16b, v3.16b // AES block 3 - round 6
1260
+ eor v10.16b, v10.16b, v8.16b // GHASH block 2 - mid
1261
+ aese v2.16b, v24.16b
1262
+ aesmc v2.16b, v2.16b // AES block 2 - round 6
1263
+ aese v0.16b, v24.16b
1264
+ aesmc v0.16b, v0.16b // AES block 0 - round 6
1265
+ movi v8.8b, #0xc2
1266
+ aese v1.16b, v24.16b
1267
+ aesmc v1.16b, v1.16b // AES block 1 - round 6
1268
+ eor v11.16b, v11.16b, v4.16b // GHASH block 3 - low
1269
+ pmull v6.1q, v6.1d, v16.1d // GHASH block 3 - mid
1270
+ aese v3.16b, v25.16b
1271
+ aesmc v3.16b, v3.16b // AES block 3 - round 7
1272
+ aese v1.16b, v25.16b
1273
+ aesmc v1.16b, v1.16b // AES block 1 - round 7
1274
+ aese v0.16b, v25.16b
1275
+ aesmc v0.16b, v0.16b // AES block 0 - round 7
1276
+ eor v10.16b, v10.16b, v6.16b // GHASH block 3 - mid
1277
+ aese v3.16b, v26.16b
1278
+ aesmc v3.16b, v3.16b // AES block 3 - round 8
1279
+ aese v2.16b, v25.16b
1280
+ aesmc v2.16b, v2.16b // AES block 2 - round 7
1281
+ eor v6.16b, v11.16b, v9.16b // MODULO - karatsuba tidy up
1282
+ aese v1.16b, v26.16b
1283
+ aesmc v1.16b, v1.16b // AES block 1 - round 8
1284
+ aese v0.16b, v26.16b
1285
+ aesmc v0.16b, v0.16b // AES block 0 - round 8
1286
+ shl d8, d8, #56 // mod_constant
1287
+ aese v2.16b, v26.16b
1288
+ aesmc v2.16b, v2.16b // AES block 2 - round 8
1289
+ cmp w17, #12 // setup flags for AES-128/192/256 check
1290
+ b.lt Ldec_finish_prepretail // branch if AES-128
1291
+ ldp q27, q28, [x8, #144] // load rk9, rk10
1292
+ aese v0.16b, v27.16b
1293
+ aesmc v0.16b, v0.16b // AES block 0 - round 9
1294
+ aese v1.16b, v27.16b
1295
+ aesmc v1.16b, v1.16b // AES block 1 - round 9
1296
+ aese v2.16b, v27.16b
1297
+ aesmc v2.16b, v2.16b // AES block 2 - round 9
1298
+ aese v3.16b, v27.16b
1299
+ aesmc v3.16b, v3.16b // AES block 3 - round 9
1300
+ aese v0.16b, v28.16b
1301
+ aesmc v0.16b, v0.16b // AES block 0 - round 10
1302
+ aese v1.16b, v28.16b
1303
+ aesmc v1.16b, v1.16b // AES block 1 - round 10
1304
+ aese v2.16b, v28.16b
1305
+ aesmc v2.16b, v2.16b // AES block 2 - round 10
1306
+ aese v3.16b, v28.16b
1307
+ aesmc v3.16b, v3.16b // AES block 3 - round 10
1308
+ b.eq Ldec_finish_prepretail // branch if AES-192
1309
+ ldp q27, q28, [x8, #176] // load rk11, rk12
1310
+ aese v0.16b, v27.16b
1311
+ aesmc v0.16b, v0.16b // AES block 0 - round 11
1312
+ aese v1.16b, v27.16b
1313
+ aesmc v1.16b, v1.16b // AES block 1 - round 11
1314
+ aese v2.16b, v27.16b
1315
+ aesmc v2.16b, v2.16b // AES block 2 - round 11
1316
+ aese v3.16b, v27.16b
1317
+ aesmc v3.16b, v3.16b // AES block 3 - round 11
1318
+ aese v0.16b, v28.16b
1319
+ aesmc v0.16b, v0.16b // AES block 0 - round 12
1320
+ aese v1.16b, v28.16b
1321
+ aesmc v1.16b, v1.16b // AES block 1 - round 12
1322
+ aese v2.16b, v28.16b
1323
+ aesmc v2.16b, v2.16b // AES block 2 - round 12
1324
+ aese v3.16b, v28.16b
1325
+ aesmc v3.16b, v3.16b // AES block 3 - round 12
1326
+ Ldec_finish_prepretail:
1327
+ eor v10.16b, v10.16b, v6.16b // MODULO - karatsuba tidy up
1328
+ pmull v7.1q, v9.1d, v8.1d // MODULO - top 64b align with mid
1329
+ ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment
1330
+ eor v10.16b, v10.16b, v7.16b
1331
+ eor v10.16b, v10.16b, v9.16b // MODULO - fold into mid
1332
+ pmull v8.1q, v10.1d, v8.1d // MODULO - mid 64b align with low
1333
+ ext v10.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment
1334
+ eor v11.16b, v11.16b, v8.16b
1335
+ eor v11.16b, v11.16b, v10.16b // MODULO - fold into low
1336
+ aese v1.16b, v31.16b // AES block 1 - round N-1
1337
+ aese v0.16b, v31.16b // AES block 0 - round N-1
1338
+ aese v3.16b, v31.16b // AES block 3 - round N-1
1339
+ aese v2.16b, v31.16b // AES block 2 - round N-1
1340
+ Ldec_tail: // TAIL
1341
+ sub x5, x4, x0 // main_end_input_ptr is number of bytes left to process
1342
+ ld1 { v5.16b}, [x0], #16 // AES block 0 - load ciphertext
1343
+ eor v0.16b, v5.16b, v0.16b // AES block 0 - result
1344
+ mov x6, v0.d[0] // AES block 0 - mov low
1345
+ mov x7, v0.d[1] // AES block 0 - mov high
1346
+ ext v8.16b, v11.16b, v11.16b, #8 // prepare final partial tag
1347
+ eor x6, x6, x13 // AES block 0 - round N low
1348
+ eor x7, x7, x14 // AES block 0 - round N high
1349
+ cmp x5, #48
1350
+ b.gt Ldec_blocks_more_than_3
1351
+ mov v3.16b, v2.16b
1352
+ movi v10.8b, #0
1353
+ movi v11.8b, #0
1354
+ movi v9.8b, #0
1355
+ mov v2.16b, v1.16b
1356
+ cmp x5, #32
1357
+ b.gt Ldec_blocks_more_than_2
1358
+ mov v3.16b, v1.16b
1359
+ cmp x5, #16
1360
+ b.gt Ldec_blocks_more_than_1
1361
+ b Ldec_blocks_less_than_1
1362
+ Ldec_blocks_more_than_3: // blocks left > 3
1363
+ rev64 v4.16b, v5.16b // GHASH final-3 block
1364
+ ld1 { v5.16b}, [x0], #16 // AES final-2 block - load ciphertext
1365
+ stp x6, x7, [x2], #16 // AES final-3 block - store result
1366
+ mov d10, v17.d[1] // GHASH final-3 block - mid
1367
+ eor v4.16b, v4.16b, v8.16b // feed in partial tag
1368
+ eor v0.16b, v5.16b, v1.16b // AES final-2 block - result
1369
+ mov d22, v4.d[1] // GHASH final-3 block - mid
1370
+ mov x6, v0.d[0] // AES final-2 block - mov low
1371
+ mov x7, v0.d[1] // AES final-2 block - mov high
1372
+ eor v22.8b, v22.8b, v4.8b // GHASH final-3 block - mid
1373
+ movi v8.8b, #0 // suppress further partial tag feed in
1374
+ pmull2 v9.1q, v4.2d, v15.2d // GHASH final-3 block - high
1375
+ pmull v10.1q, v22.1d, v10.1d // GHASH final-3 block - mid
1376
+ eor x6, x6, x13 // AES final-2 block - round N low
1377
+ pmull v11.1q, v4.1d, v15.1d // GHASH final-3 block - low
1378
+ eor x7, x7, x14 // AES final-2 block - round N high
1379
+ Ldec_blocks_more_than_2: // blocks left > 2
1380
+ rev64 v4.16b, v5.16b // GHASH final-2 block
1381
+ ld1 { v5.16b}, [x0], #16 // AES final-1 block - load ciphertext
1382
+ eor v4.16b, v4.16b, v8.16b // feed in partial tag
1383
+ stp x6, x7, [x2], #16 // AES final-2 block - store result
1384
+ eor v0.16b, v5.16b, v2.16b // AES final-1 block - result
1385
+ mov d22, v4.d[1] // GHASH final-2 block - mid
1386
+ pmull v21.1q, v4.1d, v14.1d // GHASH final-2 block - low
1387
+ pmull2 v20.1q, v4.2d, v14.2d // GHASH final-2 block - high
1388
+ eor v22.8b, v22.8b, v4.8b // GHASH final-2 block - mid
1389
+ mov x6, v0.d[0] // AES final-1 block - mov low
1390
+ mov x7, v0.d[1] // AES final-1 block - mov high
1391
+ eor v11.16b, v11.16b, v21.16b // GHASH final-2 block - low
1392
+ movi v8.8b, #0 // suppress further partial tag feed in
1393
+ pmull v22.1q, v22.1d, v17.1d // GHASH final-2 block - mid
1394
+ eor v9.16b, v9.16b, v20.16b // GHASH final-2 block - high
1395
+ eor x6, x6, x13 // AES final-1 block - round N low
1396
+ eor v10.16b, v10.16b, v22.16b // GHASH final-2 block - mid
1397
+ eor x7, x7, x14 // AES final-1 block - round N high
1398
+ Ldec_blocks_more_than_1: // blocks left > 1
1399
+ stp x6, x7, [x2], #16 // AES final-1 block - store result
1400
+ rev64 v4.16b, v5.16b // GHASH final-1 block
1401
+ ld1 { v5.16b}, [x0], #16 // AES final block - load ciphertext
1402
+ eor v4.16b, v4.16b, v8.16b // feed in partial tag
1403
+ movi v8.8b, #0 // suppress further partial tag feed in
1404
+ mov d22, v4.d[1] // GHASH final-1 block - mid
1405
+ eor v0.16b, v5.16b, v3.16b // AES final block - result
1406
+ pmull2 v20.1q, v4.2d, v13.2d // GHASH final-1 block - high
1407
+ eor v22.8b, v22.8b, v4.8b // GHASH final-1 block - mid
1408
+ pmull v21.1q, v4.1d, v13.1d // GHASH final-1 block - low
1409
+ mov x6, v0.d[0] // AES final block - mov low
1410
+ ins v22.d[1], v22.d[0] // GHASH final-1 block - mid
1411
+ mov x7, v0.d[1] // AES final block - mov high
1412
+ pmull2 v22.1q, v22.2d, v16.2d // GHASH final-1 block - mid
1413
+ eor x6, x6, x13 // AES final block - round N low
1414
+ eor v11.16b, v11.16b, v21.16b // GHASH final-1 block - low
1415
+ eor v9.16b, v9.16b, v20.16b // GHASH final-1 block - high
1416
+ eor v10.16b, v10.16b, v22.16b // GHASH final-1 block - mid
1417
+ eor x7, x7, x14 // AES final block - round N high
1418
+ Ldec_blocks_less_than_1: // blocks left <= 1
1419
+ add x10, x10, x1, lsr #7 // Calculate the updated counter based on the number of 16B chunks we processed
1420
+ rev w10, w10
1421
+ str w10, [x16, #12] // store the updated counter
1422
+ and x1, x1, #127 // bit_length %= 128
1423
+ mvn x14, xzr // rkN_h = 0xffffffffffffffff
1424
+ sub x1, x1, #128 // bit_length -= 128
1425
+ mvn x13, xzr // rkN_l = 0xffffffffffffffff
1426
+ ldp x4, x5, [x2] // load existing bytes we need to not overwrite
1427
+ neg x1, x1 // bit_length = 128 - #bits in input (in range [1,128])
1428
+ and x1, x1, #127 // bit_length %= 128
1429
+ lsr x14, x14, x1 // rkN_h is mask for top 64b of last block
1430
+ cmp x1, #64
1431
+ csel x9, x13, x14, lt
1432
+ csel x10, x14, xzr, lt
1433
+ fmov d0, x9 // ctr0b is mask for last block
1434
+ and x6, x6, x9
1435
+ mov v0.d[1], x10
1436
+ bic x4, x4, x9 // mask out low existing bytes
1437
+ bic x5, x5, x10 // mask out high existing bytes
1438
+ orr x6, x6, x4
1439
+ and x7, x7, x10
1440
+ orr x7, x7, x5
1441
+ and v5.16b, v5.16b, v0.16b // possibly partial last block has zeroes in highest bits
1442
+ rev64 v4.16b, v5.16b // GHASH final block
1443
+ eor v4.16b, v4.16b, v8.16b // feed in partial tag
1444
+ pmull v21.1q, v4.1d, v12.1d // GHASH final block - low
1445
+ mov d8, v4.d[1] // GHASH final block - mid
1446
+ eor v8.8b, v8.8b, v4.8b // GHASH final block - mid
1447
+ pmull2 v20.1q, v4.2d, v12.2d // GHASH final block - high
1448
+ pmull v8.1q, v8.1d, v16.1d // GHASH final block - mid
1449
+ eor v9.16b, v9.16b, v20.16b // GHASH final block - high
1450
+ eor v11.16b, v11.16b, v21.16b // GHASH final block - low
1451
+ eor v10.16b, v10.16b, v8.16b // GHASH final block - mid
1452
+ ldr d8, [sp, #128]
1453
+ eor v6.16b, v11.16b, v9.16b // MODULO - karatsuba tidy up
1454
+ eor v10.16b, v10.16b, v6.16b // MODULO - karatsuba tidy up
1455
+ pmull v7.1q, v9.1d, v8.1d // MODULO - top 64b align with mid
1456
+ ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment
1457
+ eor v10.16b, v10.16b, v7.16b // MODULO - fold into mid
1458
+ eor v10.16b, v10.16b, v9.16b // MODULO - fold into mid
1459
+ pmull v8.1q, v10.1d, v8.1d // MODULO - mid 64b align with low
1460
+ ext v10.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment
1461
+ eor v11.16b, v11.16b, v8.16b // MODULO - fold into low
1462
+ stp x6, x7, [x2]
1463
+ eor v11.16b, v11.16b, v10.16b // MODULO - fold into low
1464
+ ext v11.16b, v11.16b, v11.16b, #8
1465
+ rev64 v11.16b, v11.16b // Final Tag
1466
+ mov x0, x15
1467
+ st1 { v11.16b }, [x3] // Store final tag
1468
+ ldp x19, x20, [sp, #16]
1469
+ ldp x21, x22, [sp, #32]
1470
+ ldp x23, x24, [sp, #48]
1471
+ ldp d8, d9, [sp, #64]
1472
+ ldp d10, d11, [sp, #80]
1473
+ ldp d12, d13, [sp, #96]
1474
+ ldp d14, d15, [sp, #112]
1475
+ ldp x29, x30, [sp], #224
1476
+ AARCH64_VALIDATE_LINK_REGISTER
1477
+ ret
1478
+
1479
+
1480
+ .globl aes_gcm_enc_kernel_eor3
1481
+
1482
+ .def aes_gcm_enc_kernel_eor3
1483
+ .type 32
1484
+ .endef
1485
+ .align 4
1486
+ aes_gcm_enc_kernel_eor3:
1487
+ AARCH64_SIGN_LINK_REGISTER
1488
+ stp x29, x30, [sp, #-224]!
1489
+ mov x29, sp
1490
+ ld1 { v0.16b}, [x4] // Load initial counter block
1491
+ stp x19, x20, [sp, #16]
1492
+ mov v1.16b, v0.16b // Initialize ctr1-3 from ctr0
1493
+ mov v2.16b, v0.16b
1494
+ mov v3.16b, v0.16b
1495
+ mov x16, x4 // Pointer to counter block in memory
1496
+ mov x8, x5 // Pointer to AES key schedule context
1497
+ stp x21, x22, [sp, #32]
1498
+ // [sp, #48] is unused but allocated to align the stack layout with aes_gcm_dec_kernel_eor3
1499
+ stp d8, d9, [sp, #64] // Save Neon registers
1500
+ stp d10, d11, [sp, #80]
1501
+ stp d12, d13, [sp, #96]
1502
+ stp d14, d15, [sp, #112]
1503
+ ldr w17, [x8, #240] // Load number of AES rounds
1504
+ add x7, x8, x17, lsl #4 // Calculate pointer to the last round key
1505
+ ldp x13, x14, [x7] // load round N key (for final XOR)
1506
+ ldr q31, [x7, #-16] // load round N-1 key
1507
+ add x4, x0, x1, lsr #3 // Calculate end of input
1508
+ lsr x5, x1, #3 // Total byte length
1509
+ mov x15, x5
1510
+ ldr w12, [x16, #12] // Load counter's low 32 bits
1511
+ sub x5, x5, #1 // byte_len - 1
1512
+ ldr q18, [x8, #0] // load rk0
1513
+ and x5, x5, #0xffffffffffffffc0 // Align main loop end to a multiple of 64 bytes
1514
+ add x5, x5, x0
1515
+ rev w12, w12 // Reverse for big-endian increment
1516
+ uxtw x10, w12 // Zero extend reversed w12 into x10 for final counter update
1517
+ // Pre-compute this value instead of using two instructions to reconstruct it every iteration
1518
+ mov x21, #0xc200000000000000 // GHASH reduction constant
1519
+ str x21, [sp, #128]
1520
+ // We maintain four copies of ctr values on the stack. Each loop iteration we
1521
+ // store the updated ctr value to the last four bytes (e.g., 160 + 12).
1522
+ // We then load the four values. This avoids a singificant number of
1523
+ // expensive GPR->NEON and NEON->NEON moves. To avoid LDST forwarding we
1524
+ // calculate and store the values one iteration ahead so they have time to
1525
+ // drain before we load them.
1526
+ str q0, [sp, #160] // Store base counter for block 0-3
1527
+ str q0, [sp, #176]
1528
+ str q0, [sp, #192]
1529
+ str q0, [sp, #208]
1530
+ // Since we need the values right away don't go through the stack this first
1531
+ // time. Manually insert the incremented big-endian counter values.
1532
+ rev w20, w12
1533
+ mov v0.s[3], w20 // ctr0 + 0
1534
+ add w20, w12, #1
1535
+ rev w20, w20
1536
+ mov v1.s[3], w20 // ctr0 + 1
1537
+ add w20, w12, #2
1538
+ rev w20, w20
1539
+ mov v2.s[3], w20 // ctr0 + 2
1540
+ add w20, w12, #3
1541
+ rev w20, w20
1542
+ mov v3.s[3], w20 // ctr0 + 3
1543
+ // Calculate the ctr values for the *next* (not current) group of four
1544
+ // blocks. Store the incremented parts to the stack.
1545
+ add w20, w12, #4
1546
+ rev w20, w20
1547
+ str w20, [sp, #172] // ctr0 + 4 for next iter
1548
+ add w20, w12, #5
1549
+ rev w20, w20
1550
+ str w20, [sp, #188] // ctr0 + 5 for next iter
1551
+ add w20, w12, #6
1552
+ rev w20, w20
1553
+ str w20, [sp, #204] // ctr0 + 6 for next iter
1554
+ add w20, w12, #7
1555
+ rev w20, w20
1556
+ str w20, [sp, #220] // ctr0 + 7 for next iter
1557
+ add w12, w12, #8 // Advance counter past these two sets
1558
+ // --- Start AES for first 4 blocks ---
1559
+ aese v0.16b, v18.16b
1560
+ aesmc v0.16b, v0.16b // AES block 0 - round 0
1561
+ ldp q19, q20, [x8, #16] // load rk1, rk2
1562
+ aese v1.16b, v18.16b
1563
+ aesmc v1.16b, v1.16b // AES block 1 - round 0
1564
+ ldp q21, q22, [x8, #48] // load rk3, rk4
1565
+ aese v2.16b, v18.16b
1566
+ aesmc v2.16b, v2.16b // AES block 2 - round 0
1567
+ ldp q23, q24, [x8, #80] // load rk5, rk6
1568
+ aese v3.16b, v18.16b
1569
+ aesmc v3.16b, v3.16b // AES block 3 - round 0
1570
+ ldp q13, q14, [x6, #32] // load H2, H3 (GHASH keys)
1571
+ aese v0.16b, v19.16b
1572
+ aesmc v0.16b, v0.16b // AES block 0 - round 1
1573
+ ldp q25, q26, [x8, #112] // load rk7, rk8
1574
+ aese v1.16b, v19.16b
1575
+ aesmc v1.16b, v1.16b // AES block 1 - round 1
1576
+ aese v2.16b, v19.16b
1577
+ aesmc v2.16b, v2.16b // AES block 2 - round 1
1578
+ aese v3.16b, v19.16b
1579
+ aesmc v3.16b, v3.16b // AES block 3 - round 1
1580
+ aese v0.16b, v20.16b
1581
+ aesmc v0.16b, v0.16b // AES block 0 - round 2
1582
+ ext v14.16b, v14.16b, v14.16b, #8 // Byte swap H3 for GHASH
1583
+ aese v1.16b, v20.16b
1584
+ aesmc v1.16b, v1.16b // AES block 1 - round 2
1585
+ ext v13.16b, v13.16b, v13.16b, #8 // Byte swap H2 for GHASH
1586
+ aese v2.16b, v20.16b
1587
+ aesmc v2.16b, v2.16b // AES block 2 - round 2
1588
+ ldr q15, [x6, #80] // load H4
1589
+ aese v3.16b, v20.16b
1590
+ aesmc v3.16b, v3.16b // AES block 3 - round 2
1591
+ ext v15.16b, v15.16b, v15.16b, #8 // Byte swap H4 for GHASH
1592
+ aese v0.16b, v21.16b
1593
+ aesmc v0.16b, v0.16b // AES block 0 - round 3
1594
+ ld1 { v11.16b}, [x3] // Load initial GHASH accumulator (T)
1595
+ aese v1.16b, v21.16b
1596
+ aesmc v1.16b, v1.16b // AES block 1 - round 3
1597
+ ext v11.16b, v11.16b, v11.16b, #8 // Byte swap T for GHASH
1598
+ aese v2.16b, v21.16b
1599
+ aesmc v2.16b, v2.16b // AES block 2 - round 3
1600
+ rev64 v11.16b, v11.16b // Correct byte order within 64-bit lanes
1601
+ aese v3.16b, v21.16b
1602
+ aesmc v3.16b, v3.16b // AES block 3 - round 3
1603
+ trn2 v17.2d, v14.2d, v15.2d // Karatsuba key: H4_low | H3_low
1604
+ aese v0.16b, v22.16b
1605
+ aesmc v0.16b, v0.16b // AES block 0 - round 4
1606
+ ldr q12, [x6] // load H1
1607
+ aese v1.16b, v22.16b
1608
+ aesmc v1.16b, v1.16b // AES block 1 - round 4
1609
+ ext v12.16b, v12.16b, v12.16b, #8 // Byte swap H1 for GHASH
1610
+ aese v2.16b, v22.16b
1611
+ aesmc v2.16b, v2.16b // AES block 2 - round 4
1612
+ trn1 v9.2d, v14.2d, v15.2d // Karatsuba key: H4_high | H3_high
1613
+ aese v3.16b, v22.16b
1614
+ aesmc v3.16b, v3.16b // AES block 3 - round 4
1615
+ trn2 v16.2d, v12.2d, v13.2d // Karatsuba key: H2_low | H1_low
1616
+ aese v0.16b, v23.16b
1617
+ aesmc v0.16b, v0.16b // AES block 0 - round 5
1618
+ ldr q30, [x7] // Preload round N key for final EOR
1619
+ aese v1.16b, v23.16b
1620
+ aesmc v1.16b, v1.16b // AES block 1 - round 5
1621
+ aese v3.16b, v23.16b
1622
+ aesmc v3.16b, v3.16b // AES block 3 - round 5
1623
+ aese v2.16b, v23.16b
1624
+ aesmc v2.16b, v2.16b // AES block 2 - round 5
1625
+ aese v0.16b, v24.16b
1626
+ aesmc v0.16b, v0.16b // AES block 0 - round 6
1627
+ aese v1.16b, v24.16b
1628
+ aesmc v1.16b, v1.16b // AES block 1 - round 6
1629
+ aese v2.16b, v24.16b
1630
+ aesmc v2.16b, v2.16b // AES block 2 - round 6
1631
+ aese v3.16b, v24.16b
1632
+ aesmc v3.16b, v3.16b // AES block 3 - round 6
1633
+ aese v0.16b, v25.16b
1634
+ aesmc v0.16b, v0.16b // AES block 0 - round 7
1635
+ aese v1.16b, v25.16b
1636
+ aesmc v1.16b, v1.16b // AES block 1 - round 7
1637
+ aese v2.16b, v25.16b
1638
+ aesmc v2.16b, v2.16b // AES block 2 - round 7
1639
+ aese v3.16b, v25.16b
1640
+ aesmc v3.16b, v3.16b // AES block 3 - round 7
1641
+ aese v0.16b, v26.16b
1642
+ aesmc v0.16b, v0.16b // AES block 0 - round 8
1643
+ aese v1.16b, v26.16b
1644
+ aesmc v1.16b, v1.16b // AES block 1 - round 8
1645
+ aese v2.16b, v26.16b
1646
+ aesmc v2.16b, v2.16b // AES block 2 - round 8
1647
+ aese v3.16b, v26.16b
1648
+ aesmc v3.16b, v3.16b // AES block 3 - round 8
1649
+ cmp x17, #12 // setup flags for AES-128/192/256 check
1650
+ b.lt Lenc_finish_first_blocks_eor3 // branch if AES-128
1651
+ ldp q27, q28, [x8, #144] // load rk9, rk10
1652
+ aese v1.16b, v27.16b
1653
+ aesmc v1.16b, v1.16b // AES block 1 - round 9
1654
+ aese v2.16b, v27.16b
1655
+ aesmc v2.16b, v2.16b // AES block 2 - round 9
1656
+ aese v3.16b, v27.16b
1657
+ aesmc v3.16b, v3.16b // AES block 3 - round 9
1658
+ aese v0.16b, v27.16b
1659
+ aesmc v0.16b, v0.16b // AES block 0 - round 9
1660
+ aese v1.16b, v28.16b
1661
+ aesmc v1.16b, v1.16b // AES block 1 - round 10
1662
+ aese v2.16b, v28.16b
1663
+ aesmc v2.16b, v2.16b // AES block 2 - round 10
1664
+ aese v3.16b, v28.16b
1665
+ aesmc v3.16b, v3.16b // AES block 3 - round 10
1666
+ aese v0.16b, v28.16b
1667
+ aesmc v0.16b, v0.16b // AES block 0 - round 10
1668
+ b.eq Lenc_finish_first_blocks_eor3 // branch if AES-192
1669
+ ldp q27, q28, [x8, #176] // load rk11, rk12
1670
+ aese v1.16b, v27.16b
1671
+ aesmc v1.16b, v1.16b // AES block 1 - round 11
1672
+ aese v2.16b, v27.16b
1673
+ aesmc v2.16b, v2.16b // AES block 2 - round 11
1674
+ aese v3.16b, v27.16b
1675
+ aesmc v3.16b, v3.16b // AES block 3 - round 11
1676
+ aese v0.16b, v27.16b
1677
+ aesmc v0.16b, v0.16b // AES block 0 - round 11
1678
+ aese v1.16b, v28.16b
1679
+ aesmc v1.16b, v1.16b // AES block 1 - round 12
1680
+ aese v2.16b, v28.16b
1681
+ aesmc v2.16b, v2.16b // AES block 2 - round 12
1682
+ aese v3.16b, v28.16b
1683
+ aesmc v3.16b, v3.16b // AES block 3 - round 12
1684
+ aese v0.16b, v28.16b
1685
+ aesmc v0.16b, v0.16b // AES block 0 - round 12
1686
+ Lenc_finish_first_blocks_eor3:
1687
+ cmp x0, x5 // check if we have <= 4 blocks to process in the tail
1688
+ eor v17.16b, v17.16b, v9.16b // Karatsuba key: H3^H4
1689
+ aese v0.16b, v31.16b // AES block 0 - round N-1
1690
+ aese v1.16b, v31.16b // AES block 1 - round N-1
1691
+ aese v2.16b, v31.16b // AES block 2 - round N-1
1692
+ aese v3.16b, v31.16b // AES block 3 - round N-1
1693
+ trn1 v8.2d, v12.2d, v13.2d // Karatsuba key: H2_high | H1_high
1694
+ eor v16.16b, v16.16b, v8.16b // Karatsuba key: H1^H2
1695
+ b.ge Lenc_tail_eor3 // handle tail if no more full 4-block sets
1696
+ ldp q6, q7, [x0, #32] // AES blocks 2,3 load plaintext
1697
+ ldp q4, q5, [x0], #64 // AES blocks 0,1 load plaintext
1698
+ // Compute and store first 4 ciphertext blocks
1699
+ eor3 v4.16b, v4.16b, v30.16b, v0.16b // AES block 0 - result = PT ^ AES(ctr0)
1700
+ eor3 v5.16b, v5.16b, v30.16b, v1.16b // AES block 1 - result = PT ^ AES(ctr1)
1701
+ eor3 v6.16b, v6.16b, v30.16b, v2.16b // AES block 2 - result = PT ^ AES(ctr2)
1702
+ eor3 v7.16b, v7.16b, v30.16b, v3.16b // AES block 3 - result = PT ^ AES(ctr3)
1703
+ st1 { v4.16b, v5.16b, v6.16b, v7.16b}, [x2], #64 // AES blocks 0-3 - store result
1704
+ // Load counter values for the second iteration from the stack
1705
+ ldp q0, q1, [sp, #160]
1706
+ ldp q2, q3, [sp, #192]
1707
+ // Prepare and store counter values for the third iteration
1708
+ rev w20, w12
1709
+ str w20, [sp, #172] // ctr + 8
1710
+ add w20, w12, #1
1711
+ rev w20, w20
1712
+ str w20, [sp, #188] // ctr + 9
1713
+ add w20, w12, #2
1714
+ rev w20, w20
1715
+ str w20, [sp, #204] // ctr + 10
1716
+ add w20, w12, #3
1717
+ rev w20, w20
1718
+ str w20, [sp, #220] // ctr + 11
1719
+ add w12, w12, #4 // Advance counter base
1720
+ cmp x0, x5 // check if we have <= 4 blocks remaining
1721
+ b.ge Lenc_prepretail_eor3 // go to prepretail if < 2 full loops left
1722
+ Lenc_main_loop_eor3: // main loop start (processes 4 blocks per iteration)
1723
+ // --- AES Pipeline for blocks 4k+4 to 4k+7 ---
1724
+ aese v0.16b, v18.16b
1725
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 0
1726
+ aese v1.16b, v18.16b
1727
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 0
1728
+ aese v2.16b, v18.16b
1729
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 0
1730
+ aese v3.16b, v18.16b
1731
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 0
1732
+ ldr d8, [sp, #128] // Load GHASH reduction constant
1733
+ aese v0.16b, v19.16b
1734
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 1
1735
+ aese v1.16b, v19.16b
1736
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 1
1737
+ aese v2.16b, v19.16b
1738
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 1
1739
+ aese v3.16b, v19.16b
1740
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 1
1741
+ // --- GHASH Pipeline (interleaved with AES) for blocks 4k to 4k+3 ---
1742
+ rev64 v4.16b, v4.16b // GHASH block 4k - Byte swap CT
1743
+ rev64 v5.16b, v5.16b // GHASH block 4k+1 - Byte swap CT
1744
+ rev64 v6.16b, v6.16b // GHASH block 4k+2 - Byte swap CT
1745
+ rev64 v7.16b, v7.16b // GHASH block 4k+3 - Byte swap CT
1746
+ aese v0.16b, v20.16b
1747
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 2
1748
+ ext v11.16b, v11.16b, v11.16b, #8 // GHASH - prepare acc for XOR
1749
+ aese v1.16b, v20.16b
1750
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 2
1751
+ eor v4.16b, v4.16b, v11.16b // GHASH block 4k - Y_i = CT_i ^ Y_{i-1}
1752
+ aese v2.16b, v20.16b
1753
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 2
1754
+ pmull v11.1q, v4.1d, v15.1d // GHASH block 4k - low
1755
+ aese v3.16b, v20.16b
1756
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 2
1757
+ pmull2 v9.1q, v6.2d, v13.2d // GHASH block 4k+2 - high
1758
+ aese v0.16b, v21.16b
1759
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 3
1760
+ mov d10, v17.d[1] // GHASH block 4k - mid Karatsuba key
1761
+ aese v1.16b, v21.16b
1762
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 3
1763
+ mov d20, v4.d[1] // GHASH block 4k - mid
1764
+ aese v2.16b, v21.16b
1765
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 3
1766
+ eor v20.8b, v20.8b, v4.8b // GHASH block 4k - mid
1767
+ aese v3.16b, v21.16b
1768
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 3
1769
+ mov d21, v5.d[1] // GHASH block 4k+1 - mid
1770
+ aese v0.16b, v22.16b
1771
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 4
1772
+ eor v21.8b, v21.8b, v5.8b // GHASH block 4k+1 - mid
1773
+ aese v1.16b, v22.16b
1774
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 4
1775
+ pmull v10.1q, v20.1d, v10.1d // GHASH block 4k - mid
1776
+ aese v2.16b, v22.16b
1777
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 4
1778
+ pmull v21.1q, v21.1d, v17.1d // GHASH block 4k+1 - mid
1779
+ aese v3.16b, v22.16b
1780
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 4
1781
+ eor v10.16b, v10.16b, v21.16b // GHASH block 4k+1 - mid
1782
+ aese v0.16b, v23.16b
1783
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 5
1784
+ ext v22.16b, v22.16b, v6.16b, #8 // GHASH block 4k+2 - mid
1785
+ aese v1.16b, v23.16b
1786
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 5
1787
+ eor v22.16b, v22.16b, v6.16b // GHASH block 4k+2 - mid
1788
+ aese v2.16b, v23.16b
1789
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 5
1790
+ pmull2 v22.1q, v22.2d, v16.2d // GHASH block 4k+2 - mid
1791
+ aese v3.16b, v23.16b
1792
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 5
1793
+ mov d23, v7.d[1] // GHASH block 4k+3 - mid
1794
+ aese v0.16b, v24.16b
1795
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 6
1796
+ eor v23.8b, v23.8b, v7.8b // GHASH block 4k+3 - mid
1797
+ aese v1.16b, v24.16b
1798
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 6
1799
+ pmull v23.1q, v23.1d, v16.1d // GHASH block 4k+3 - mid
1800
+ aese v2.16b, v24.16b
1801
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 6
1802
+ eor3 v10.16b, v10.16b, v22.16b, v23.16b // GHASH block 4k+2/3 - mid
1803
+ aese v3.16b, v24.16b
1804
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 6
1805
+ pmull2 v22.1q, v4.2d, v15.2d // GHASH block 4k - high
1806
+ aese v0.16b, v25.16b
1807
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 7
1808
+ pmull2 v21.1q, v7.2d, v12.2d // GHASH block 4k+3 - high
1809
+ eor v22.16b, v22.16b, v21.16b // GHASH block 4k+3 - high
1810
+ aese v1.16b, v25.16b
1811
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 7
1812
+ pmull2 v23.1q, v5.2d, v14.2d // GHASH block 4k+1 - high
1813
+ aese v2.16b, v25.16b
1814
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 7
1815
+ pmull v21.1q, v6.1d, v13.1d // GHASH block 4k+2 - low
1816
+ aese v3.16b, v25.16b
1817
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 7
1818
+ pmull v20.1q, v5.1d, v14.1d // GHASH block 4k+1 - low
1819
+ eor3 v9.16b, v9.16b, v22.16b, v23.16b // GHASH block 4k/1/2/3 - high
1820
+ pmull v22.1q, v7.1d, v12.1d // GHASH block 4k+3 - low
1821
+ ldp q6, q7, [x0, #32]
1822
+ ldp q4, q5, [x0], #64
1823
+ eor v20.16b, v20.16b, v21.16b // GHASH block 4k+1 - low
1824
+ aese v0.16b, v26.16b
1825
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 8
1826
+ eor3 v11.16b, v11.16b, v22.16b, v20.16b // GHASH block 4k/1/2/3 - low
1827
+ aese v1.16b, v26.16b
1828
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 8
1829
+ eor3 v10.16b, v10.16b, v9.16b, v11.16b // MODULO - karatsuba tidy up
1830
+ aese v2.16b, v26.16b
1831
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 8
1832
+ pmull v20.1q, v9.1d, v8.1d // MODULO - top 64b align with mid
1833
+ aese v3.16b, v26.16b
1834
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 8
1835
+ cmp x17, #12 // setup flags for AES-128/192/256 check
1836
+ b.lt Lenc_main_loop_continue_eor3 // branch if AES-128
1837
+ ldp q27, q28, [x8, #144] // load rk9, rk10
1838
+ aese v0.16b, v27.16b
1839
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 9
1840
+ aese v1.16b, v27.16b
1841
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 9
1842
+ aese v2.16b, v27.16b
1843
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 9
1844
+ aese v3.16b, v27.16b
1845
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 9
1846
+ aese v0.16b, v28.16b
1847
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 10
1848
+ aese v1.16b, v28.16b
1849
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 10
1850
+ aese v2.16b, v28.16b
1851
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 10
1852
+ aese v3.16b, v28.16b
1853
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 10
1854
+ b.eq Lenc_main_loop_continue_eor3 // branch if AES-192
1855
+ ldp q27, q28, [x8, #176] // load rk11, rk12
1856
+ aese v0.16b, v27.16b
1857
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 11
1858
+ aese v1.16b, v27.16b
1859
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 11
1860
+ aese v2.16b, v27.16b
1861
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 11
1862
+ aese v3.16b, v27.16b
1863
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 11
1864
+ aese v0.16b, v28.16b
1865
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 12
1866
+ aese v1.16b, v28.16b
1867
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 12
1868
+ aese v2.16b, v28.16b
1869
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 12
1870
+ aese v3.16b, v28.16b
1871
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 12
1872
+ Lenc_main_loop_continue_eor3:
1873
+ ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment
1874
+ eor3 v10.16b, v10.16b, v20.16b, v9.16b // MODULO - fold into mid
1875
+ pmull v9.1q, v10.1d, v8.1d // MODULO - mid 64b align with low
1876
+ ext v20.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment
1877
+ eor3 v11.16b, v9.16b, v11.16b, v20.16b // MODULO - fold into low
1878
+ aese v0.16b, v31.16b // AES block 4k+4 - round N-1
1879
+ eor3 v4.16b, v4.16b, v30.16b, v0.16b // AES block 4k+4 - result
1880
+ aese v1.16b, v31.16b // AES block 4k+5 - round N-1
1881
+ eor3 v5.16b, v5.16b, v30.16b, v1.16b // AES block 4k+5 - result
1882
+ aese v2.16b, v31.16b // AES block 4k+6 - round N-1
1883
+ eor3 v6.16b, v6.16b, v30.16b, v2.16b // AES block 4k+6 - result
1884
+ aese v3.16b, v31.16b // AES block 4k+7 - round N-1
1885
+ eor3 v7.16b, v7.16b, v30.16b, v3.16b // AES block 4k+7 - result
1886
+ ldp q0, q1, [sp, #160]
1887
+ ldp q2, q3, [sp, #192]
1888
+ // We used these registers as temporaries above so reload the RKs.
1889
+ ldp q20, q21, [x8, #32] // load rk2, rk3
1890
+ ldp q22, q23, [x8, #64] // load rk4, rk5
1891
+ st1 { v4.16b, v5.16b, v6.16b, v7.16b}, [x2], #64 // AES blocks 4k+4-7 - store result
1892
+ rev w20, w12
1893
+ str w20, [sp, #172]
1894
+ add w20, w12, #1
1895
+ rev w20, w20
1896
+ str w20, [sp, #188]
1897
+ add w20, w12, #2
1898
+ rev w20, w20
1899
+ str w20, [sp, #204]
1900
+ add w20, w12, #3
1901
+ rev w20, w20
1902
+ str w20, [sp, #220]
1903
+ add w12, w12, #4
1904
+ cmp x0, x5 // LOOP_eor3 CONTROL
1905
+ b.lt Lenc_main_loop_eor3
1906
+ Lenc_prepretail_eor3: // PREPRETAIL
1907
+ aese v1.16b, v18.16b
1908
+ aesmc v1.16b, v1.16b // AES block 1 - round 0
1909
+ rev64 v6.16b, v6.16b // GHASH block 2
1910
+ aese v2.16b, v18.16b
1911
+ aesmc v2.16b, v2.16b // AES block 2 - round 0
1912
+ aese v0.16b, v18.16b
1913
+ aesmc v0.16b, v0.16b // AES block 0 - round 0
1914
+ rev64 v4.16b, v4.16b // GHASH block 0
1915
+ ext v11.16b, v11.16b, v11.16b, #8 // PRE 0
1916
+ aese v2.16b, v19.16b
1917
+ aesmc v2.16b, v2.16b // AES block 2 - round 1
1918
+ aese v0.16b, v19.16b
1919
+ aesmc v0.16b, v0.16b // AES block 0 - round 1
1920
+ eor v4.16b, v4.16b, v11.16b // PRE 1
1921
+ rev64 v5.16b, v5.16b // GHASH block 1
1922
+ aese v2.16b, v20.16b
1923
+ aesmc v2.16b, v2.16b // AES block 2 - round 2
1924
+ aese v3.16b, v18.16b
1925
+ aesmc v3.16b, v3.16b // AES block 3 - round 0
1926
+ mov d10, v17.d[1] // GHASH block 0 - mid Karatsuba key
1927
+ aese v1.16b, v19.16b
1928
+ aesmc v1.16b, v1.16b // AES block 1 - round 1
1929
+ pmull v11.1q, v4.1d, v15.1d // GHASH block 0 - low
1930
+ mov d8, v4.d[1] // GHASH block 0 - mid
1931
+ pmull2 v9.1q, v4.2d, v15.2d // GHASH block 0 - high
1932
+ aese v2.16b, v21.16b
1933
+ aesmc v2.16b, v2.16b // AES block 2 - round 3
1934
+ aese v1.16b, v20.16b
1935
+ aesmc v1.16b, v1.16b // AES block 1 - round 2
1936
+ eor v8.8b, v8.8b, v4.8b // GHASH block 0 - mid
1937
+ aese v0.16b, v20.16b
1938
+ aesmc v0.16b, v0.16b // AES block 0 - round 2
1939
+ aese v3.16b, v19.16b
1940
+ aesmc v3.16b, v3.16b // AES block 3 - round 1
1941
+ aese v1.16b, v21.16b
1942
+ aesmc v1.16b, v1.16b // AES block 1 - round 3
1943
+ pmull v10.1q, v8.1d, v10.1d // GHASH block 0 - mid
1944
+ pmull2 v4.1q, v5.2d, v14.2d // GHASH block 1 - high
1945
+ pmull v8.1q, v5.1d, v14.1d // GHASH block 1 - low
1946
+ aese v3.16b, v20.16b
1947
+ aesmc v3.16b, v3.16b // AES block 3 - round 2
1948
+ eor v9.16b, v9.16b, v4.16b // GHASH block 1 - high
1949
+ mov d4, v5.d[1] // GHASH block 1 - mid
1950
+ aese v0.16b, v21.16b
1951
+ aesmc v0.16b, v0.16b // AES block 0 - round 3
1952
+ eor v11.16b, v11.16b, v8.16b // GHASH block 1 - low
1953
+ aese v3.16b, v21.16b
1954
+ aesmc v3.16b, v3.16b // AES block 3 - round 3
1955
+ eor v4.8b, v4.8b, v5.8b // GHASH block 1 - mid
1956
+ mov d8, v6.d[1] // GHASH block 2 - mid
1957
+ aese v0.16b, v22.16b
1958
+ aesmc v0.16b, v0.16b // AES block 0 - round 4
1959
+ rev64 v7.16b, v7.16b // GHASH block 3
1960
+ aese v3.16b, v22.16b
1961
+ aesmc v3.16b, v3.16b // AES block 3 - round 4
1962
+ pmull v4.1q, v4.1d, v17.1d // GHASH block 1 - mid
1963
+ eor v8.8b, v8.8b, v6.8b // GHASH block 2 - mid
1964
+ pmull v5.1q, v6.1d, v13.1d // GHASH block 2 - low
1965
+ aese v3.16b, v23.16b
1966
+ aesmc v3.16b, v3.16b // AES block 3 - round 5
1967
+ aese v2.16b, v22.16b
1968
+ aesmc v2.16b, v2.16b // AES block 2 - round 4
1969
+ eor v10.16b, v10.16b, v4.16b // GHASH block 1 - mid
1970
+ pmull2 v4.1q, v6.2d, v13.2d // GHASH block 2 - high
1971
+ eor v11.16b, v11.16b, v5.16b // GHASH block 2 - low
1972
+ ins v8.d[1], v8.d[0] // GHASH block 2 - mid
1973
+ aese v2.16b, v23.16b
1974
+ aesmc v2.16b, v2.16b // AES block 2 - round 5
1975
+ eor v9.16b, v9.16b, v4.16b // GHASH block 2 - high
1976
+ mov d4, v7.d[1] // GHASH block 3 - mid
1977
+ aese v1.16b, v22.16b
1978
+ aesmc v1.16b, v1.16b // AES block 1 - round 4
1979
+ pmull2 v8.1q, v8.2d, v16.2d // GHASH block 2 - mid
1980
+ eor v4.8b, v4.8b, v7.8b // GHASH block 3 - mid
1981
+ pmull2 v5.1q, v7.2d, v12.2d // GHASH block 3 - high
1982
+ aese v1.16b, v23.16b
1983
+ aesmc v1.16b, v1.16b // AES block 1 - round 5
1984
+ pmull v4.1q, v4.1d, v16.1d // GHASH block 3 - mid
1985
+ eor v10.16b, v10.16b, v8.16b // GHASH block 2 - mid
1986
+ aese v0.16b, v23.16b
1987
+ aesmc v0.16b, v0.16b // AES block 0 - round 5
1988
+ aese v1.16b, v24.16b
1989
+ aesmc v1.16b, v1.16b // AES block 1 - round 6
1990
+ aese v2.16b, v24.16b
1991
+ aesmc v2.16b, v2.16b // AES block 2 - round 6
1992
+ aese v0.16b, v24.16b
1993
+ aesmc v0.16b, v0.16b // AES block 0 - round 6
1994
+ aese v3.16b, v24.16b
1995
+ aesmc v3.16b, v3.16b // AES block 3 - round 6
1996
+ aese v1.16b, v25.16b
1997
+ aesmc v1.16b, v1.16b // AES block 1 - round 7
1998
+ eor v9.16b, v9.16b, v5.16b // GHASH block 3 - high
1999
+ aese v0.16b, v25.16b
2000
+ aesmc v0.16b, v0.16b // AES block 0 - round 7
2001
+ aese v3.16b, v25.16b
2002
+ aesmc v3.16b, v3.16b // AES block 3 - round 7
2003
+ ldr d8, [sp, #128]
2004
+ aese v1.16b, v26.16b
2005
+ aesmc v1.16b, v1.16b // AES block 1 - round 8
2006
+ eor v10.16b, v10.16b, v4.16b // GHASH block 3 - mid
2007
+ pmull v6.1q, v7.1d, v12.1d // GHASH block 3 - low
2008
+ aese v3.16b, v26.16b
2009
+ aesmc v3.16b, v3.16b // AES block 3 - round 8
2010
+ cmp x17, #12 // setup flags for AES-128/192/256 check
2011
+ aese v0.16b, v26.16b
2012
+ aesmc v0.16b, v0.16b // AES block 0 - round 8
2013
+ eor v11.16b, v11.16b, v6.16b // GHASH block 3 - low
2014
+ aese v2.16b, v25.16b
2015
+ aesmc v2.16b, v2.16b // AES block 2 - round 7
2016
+ eor v10.16b, v10.16b, v9.16b // karatsuba tidy up
2017
+ aese v2.16b, v26.16b
2018
+ aesmc v2.16b, v2.16b // AES block 2 - round 8
2019
+ pmull v4.1q, v9.1d, v8.1d
2020
+ ext v9.16b, v9.16b, v9.16b, #8
2021
+ eor v10.16b, v10.16b, v11.16b
2022
+ b.lt Lenc_finish_prepretail_eor3 // branch if AES-128
2023
+ ldp q27, q28, [x8, #144] // load rk9, rk10
2024
+ aese v0.16b, v27.16b
2025
+ aesmc v0.16b, v0.16b // AES block 0 - round 9
2026
+ aese v1.16b, v27.16b
2027
+ aesmc v1.16b, v1.16b // AES block 1 - round 9
2028
+ aese v2.16b, v27.16b
2029
+ aesmc v2.16b, v2.16b // AES block 2 - round 9
2030
+ aese v3.16b, v27.16b
2031
+ aesmc v3.16b, v3.16b // AES block 3 - round 9
2032
+ aese v0.16b, v28.16b
2033
+ aesmc v0.16b, v0.16b // AES block 0 - round 10
2034
+ aese v1.16b, v28.16b
2035
+ aesmc v1.16b, v1.16b // AES block 1 - round 10
2036
+ aese v2.16b, v28.16b
2037
+ aesmc v2.16b, v2.16b // AES block 2 - round 10
2038
+ aese v3.16b, v28.16b
2039
+ aesmc v3.16b, v3.16b // AES block 3 - round 10
2040
+ b.eq Lenc_finish_prepretail_eor3 // branch if AES-192
2041
+ ldp q27, q28, [x8, #176] // load rk11, rk12
2042
+ aese v0.16b, v27.16b
2043
+ aesmc v0.16b, v0.16b // AES block 0 - round 11
2044
+ aese v1.16b, v27.16b
2045
+ aesmc v1.16b, v1.16b // AES block 1 - round 11
2046
+ aese v2.16b, v27.16b
2047
+ aesmc v2.16b, v2.16b // AES block 2 - round 11
2048
+ aese v3.16b, v27.16b
2049
+ aesmc v3.16b, v3.16b // AES block 3 - round 11
2050
+ aese v0.16b, v28.16b
2051
+ aesmc v0.16b, v0.16b // AES block 0 - round 12
2052
+ aese v1.16b, v28.16b
2053
+ aesmc v1.16b, v1.16b // AES block 1 - round 12
2054
+ aese v2.16b, v28.16b
2055
+ aesmc v2.16b, v2.16b // AES block 2 - round 12
2056
+ aese v3.16b, v28.16b
2057
+ aesmc v3.16b, v3.16b // AES block 3 - round 12
2058
+ Lenc_finish_prepretail_eor3:
2059
+ aese v0.16b, v31.16b // AES block 0 - round N-1
2060
+ aese v1.16b, v31.16b // AES block 1 - round N-1
2061
+ aese v2.16b, v31.16b // AES block 2 - round N-1
2062
+ aese v3.16b, v31.16b // AES block 3 - round N-1
2063
+ eor3 v10.16b, v10.16b, v4.16b, v9.16b
2064
+ pmull v4.1q, v10.1d, v8.1d
2065
+ ext v10.16b, v10.16b, v10.16b, #8
2066
+ eor3 v11.16b, v11.16b, v4.16b, v10.16b
2067
+ Lenc_tail_eor3: // TAIL: Process remaining 0 to 3 blocks
2068
+ ext v8.16b, v11.16b, v11.16b, #8 // Save current GHASH state for partial tag feed-in
2069
+ sub x5, x4, x0 // main_end_input_ptr is number of bytes left to process
2070
+ ldp x6, x7, [x0], #16 // AES block 0 - load plaintext
2071
+ eor x6, x6, x13 // AES block 0 - round N low
2072
+ eor x7, x7, x14 // AES block 0 - round N high
2073
+ cmp x5, #48
2074
+ fmov d4, x6 // AES block 0 - mov low
2075
+ fmov v4.d[1], x7 // AES block 0 - mov high
2076
+ eor v5.16b, v4.16b, v0.16b // AES block 0 - result
2077
+ b.gt Lenc_blocks_more_than_3_eor3
2078
+ cmp x5, #32
2079
+ mov v3.16b, v2.16b
2080
+ movi v11.8b, #0
2081
+ movi v9.8b, #0
2082
+ mov v2.16b, v1.16b
2083
+ movi v10.8b, #0
2084
+ b.gt Lenc_blocks_more_than_2_eor3
2085
+ mov v3.16b, v1.16b
2086
+ cmp x5, #16
2087
+ b.gt Lenc_blocks_more_than_1_eor3
2088
+ b Lenc_blocks_less_than_1_eor3
2089
+ Lenc_blocks_more_than_3_eor3: // blocks left > 3
2090
+ st1 { v5.16b}, [x2], #16 // AES final-2 block - store result
2091
+ ldp x6, x7, [x0], #16 // AES final-2 block - load input low & high
2092
+ rev64 v4.16b, v5.16b // GHASH final-3 block
2093
+ eor x6, x6, x13 // AES final-2 block - round N low
2094
+ eor v4.16b, v4.16b, v8.16b // feed in partial tag
2095
+ eor x7, x7, x14 // AES final-2 block - round N high
2096
+ mov d22, v4.d[1] // GHASH final-3 block - mid
2097
+ fmov d5, x6 // AES final-2 block - mov low
2098
+ fmov v5.d[1], x7 // AES final-2 block - mov high
2099
+ eor v22.8b, v22.8b, v4.8b // GHASH final-3 block - mid
2100
+ movi v8.8b, #0 // suppress further partial tag feed in
2101
+ mov d10, v17.d[1] // GHASH final-3 block - mid
2102
+ pmull v11.1q, v4.1d, v15.1d // GHASH final-3 block - low
2103
+ pmull2 v9.1q, v4.2d, v15.2d // GHASH final-3 block - high
2104
+ pmull v10.1q, v22.1d, v10.1d // GHASH final-3 block - mid
2105
+ eor v5.16b, v5.16b, v1.16b // AES final-2 block - result
2106
+ Lenc_blocks_more_than_2_eor3: // blocks left > 2
2107
+ st1 { v5.16b}, [x2], #16 // AES final-2 block - store result
2108
+ ldp x6, x7, [x0], #16 // AES final-1 block - load input low & high
2109
+ rev64 v4.16b, v5.16b // GHASH final-2 block
2110
+ eor x6, x6, x13 // AES final-1 block - round N low
2111
+ eor v4.16b, v4.16b, v8.16b // feed in partial tag
2112
+ fmov d5, x6 // AES final-1 block - mov low
2113
+ eor x7, x7, x14 // AES final-1 block - round N high
2114
+ fmov v5.d[1], x7 // AES final-1 block - mov high
2115
+ movi v8.8b, #0 // suppress further partial tag feed in
2116
+ pmull2 v20.1q, v4.2d, v14.2d // GHASH final-2 block - high
2117
+ mov d22, v4.d[1] // GHASH final-2 block - mid
2118
+ pmull v21.1q, v4.1d, v14.1d // GHASH final-2 block - low
2119
+ eor v22.8b, v22.8b, v4.8b // GHASH final-2 block - mid
2120
+ eor v5.16b, v5.16b, v2.16b // AES final-1 block - result
2121
+ eor v9.16b, v9.16b, v20.16b // GHASH final-2 block - high
2122
+ pmull v22.1q, v22.1d, v17.1d // GHASH final-2 block - mid
2123
+ eor v11.16b, v11.16b, v21.16b // GHASH final-2 block - low
2124
+ eor v10.16b, v10.16b, v22.16b // GHASH final-2 block - mid
2125
+ Lenc_blocks_more_than_1_eor3: // blocks left > 1
2126
+ st1 { v5.16b}, [x2], #16 // AES final-1 block - store result
2127
+ rev64 v4.16b, v5.16b // GHASH final-1 block: Byte Swap CT
2128
+ ldp x6, x7, [x0], #16 // AES final block - load plaintext
2129
+ eor v4.16b, v4.16b, v8.16b // Feed in partial tag
2130
+ movi v8.8b, #0 // Clear for next block
2131
+ eor x6, x6, x13 // AES final block - round N low
2132
+ mov d22, v4.d[1] // GHASH final-1 block - mid
2133
+ pmull2 v20.1q, v4.2d, v13.2d // GHASH final-1 block - high
2134
+ eor x7, x7, x14 // AES final block - round N high
2135
+ eor v22.8b, v22.8b, v4.8b // GHASH final-1 block - mid
2136
+ eor v9.16b, v9.16b, v20.16b // GHASH final-1 block - high
2137
+ ins v22.d[1], v22.d[0] // GHASH final-1 block - mid
2138
+ fmov d5, x6 // AES final block - mov low
2139
+ fmov v5.d[1], x7 // AES final block - mov high
2140
+ pmull2 v22.1q, v22.2d, v16.2d // GHASH final-1 block - mid
2141
+ pmull v21.1q, v4.1d, v13.1d // GHASH final-1 block - low
2142
+ eor v5.16b, v5.16b, v3.16b // AES final block - result
2143
+ eor v10.16b, v10.16b, v22.16b // GHASH final-1 block - mid
2144
+ eor v11.16b, v11.16b, v21.16b // GHASH final-1 block - low
2145
+ Lenc_blocks_less_than_1_eor3: // Last partial block handling
2146
+ add x10, x10, x1, lsr #7 // Calculate the updated counter based on the number of 16B chunks we processed
2147
+ rev w10, w10
2148
+ str w10, [x16, #12] // store the updated counter
2149
+ and x1, x1, #127 // bit_length %= 128
2150
+ mvn x13, xzr // Mask for low 64 bits
2151
+ sub x1, x1, #128 //
2152
+ neg x1, x1 // Valid bits in the last block (1-128)
2153
+ ldr q18, [x2] // Load destination for merging
2154
+ mvn x14, xzr // Mask for high 64 bits
2155
+ and x1, x1, #127 // bit_length %= 128
2156
+ lsr x14, x14, x1 // rkN_h is mask for top 64b of last block
2157
+ cmp x1, #64
2158
+ csel x6, x13, x14, lt
2159
+ csel x7, x14, xzr, lt
2160
+ fmov d0, x6 // ctr0d is mask for last block
2161
+ fmov v0.d[1], x7
2162
+ and v5.16b, v5.16b, v0.16b // Mask out unused bits of the last CT block
2163
+ rev64 v4.16b, v5.16b // GHASH final block - byte swap
2164
+ eor v4.16b, v4.16b, v8.16b // Feed in partial tag
2165
+ bif v5.16b, v18.16b, v0.16b // Bitwise Insert: merge with existing data at output_ptr
2166
+ pmull2 v20.1q, v4.2d, v12.2d // GHASH final block - high
2167
+ mov d8, v4.d[1] // GHASH final block - mid
2168
+ pmull v21.1q, v4.1d, v12.1d // GHASH final block - low
2169
+ eor v9.16b, v9.16b, v20.16b // GHASH final block - high
2170
+ eor v8.8b, v8.8b, v4.8b // GHASH final block - mid
2171
+ pmull v8.1q, v8.1d, v16.1d // GHASH final block - mid
2172
+ eor v11.16b, v11.16b, v21.16b // GHASH final block - low
2173
+ eor v10.16b, v10.16b, v8.16b // GHASH final block - mid
2174
+ eor v4.16b, v11.16b, v9.16b // MODULO - karatsuba tidy up
2175
+ fmov d8, x21
2176
+ eor v10.16b, v10.16b, v4.16b // MODULO - karatsuba tidy up
2177
+ pmull v7.1q, v9.1d, v8.1d // MODULO - top 64b align with mid
2178
+ ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment
2179
+ eor3 v10.16b, v10.16b, v7.16b, v9.16b // MODULO - fold into mid
2180
+ pmull v9.1q, v10.1d, v8.1d // MODULO - mid 64b align with low
2181
+ ext v10.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment
2182
+ st1 { v5.16b}, [x2] // store all 16B
2183
+ eor3 v11.16b, v11.16b, v9.16b, v10.16b // MODULO - fold into low
2184
+ ext v11.16b, v11.16b, v11.16b, #8 // Byte swap GHASH result
2185
+ rev64 v11.16b, v11.16b // Final Tag
2186
+ mov x0, x15
2187
+ st1 { v11.16b }, [x3] // Store final tag
2188
+ ldp x19, x20, [sp, #16]
2189
+ ldp x21, x22, [sp, #32]
2190
+ ldp d8, d9, [sp, #64]
2191
+ ldp d10, d11, [sp, #80]
2192
+ ldp d12, d13, [sp, #96]
2193
+ ldp d14, d15, [sp, #112]
2194
+ ldp x29, x30, [sp], #224
2195
+ AARCH64_VALIDATE_LINK_REGISTER
2196
+ ret
2197
+
2198
+ .globl aes_gcm_dec_kernel_eor3
2199
+
2200
+ .def aes_gcm_dec_kernel_eor3
2201
+ .type 32
2202
+ .endef
2203
+ .align 4
2204
+ aes_gcm_dec_kernel_eor3:
2205
+ AARCH64_SIGN_LINK_REGISTER
2206
+ stp x29, x30, [sp, #-224]!
2207
+ mov x29, sp
2208
+ stp x19, x20, [sp, #16]
2209
+ ld1 { v0.16b}, [x4]
2210
+ mov v1.16b, v0.16b
2211
+ mov v2.16b, v0.16b
2212
+ mov v3.16b, v0.16b
2213
+ mov x16, x4
2214
+ mov x8, x5
2215
+ stp x21, x22, [sp, #32]
2216
+ stp x23, x24, [sp, #48]
2217
+ stp d8, d9, [sp, #64]
2218
+ stp d10, d11, [sp, #80]
2219
+ stp d12, d13, [sp, #96]
2220
+ stp d14, d15, [sp, #112]
2221
+ ldr w17, [x8, #240] // Load number of AES rounds
2222
+ add x19, x8, x17, lsl #4 // borrow input_l1 for last key
2223
+ ldp x13, x14, [x19] // load round N keys
2224
+ ldr q31, [x19, #-16] // load round N-1 keys
2225
+ add x4, x0, x1, lsr #3 // end_input_ptr
2226
+ lsr x5, x1, #3 // byte_len
2227
+ mov x15, x5
2228
+ ldr w9, [x16, #12] // Load scalar 32-bit counter (CTR)
2229
+ sub x5, x5, #1 // byte_len - 1
2230
+ ldr q18, [x8, #0] // load rk0
2231
+ and x5, x5, #0xffffffffffffffc0 // number of bytes to be processed in main loop (at least 1 byte must be handled by tail)
2232
+ add x5, x5, x0
2233
+ rev w9, w9 // Reverse it once for big-endian incrementing
2234
+ uxtw x10, w9 // Zero extend reversed w9 into x10
2235
+ str q0, [sp, #160]
2236
+ str q0, [sp, #176]
2237
+ str q0, [sp, #192]
2238
+ str q0, [sp, #208]
2239
+ rev w20, w9
2240
+ mov v0.s[3], w20
2241
+ add w20, w9, #1
2242
+ rev w20, w20
2243
+ mov v1.s[3], w20
2244
+ add w20, w9, #2
2245
+ rev w20, w20
2246
+ mov v2.s[3], w20
2247
+ add w20, w9, #3
2248
+ rev w20, w20
2249
+ mov v3.s[3], w20
2250
+ add w20, w9, #4
2251
+ rev w20, w20
2252
+ str w20, [sp, #172]
2253
+ add w20, w9, #5
2254
+ rev w20, w20
2255
+ str w20, [sp, #188]
2256
+ add w20, w9, #6
2257
+ rev w20, w20
2258
+ str w20, [sp, #204]
2259
+ add w20, w9, #7
2260
+ rev w20, w20
2261
+ str w20, [sp, #220]
2262
+ add w9, w9, #8
2263
+ // Pre-compute this value instead of using two instructions for moving and then shifting in the main loop
2264
+ mov x21, #0xc200000000000000
2265
+ str x21, [sp, #128]
2266
+ aese v0.16b, v18.16b
2267
+ aesmc v0.16b, v0.16b // AES block 0 - round 0
2268
+ ldp q19, q20, [x8, #16] // load rk1, rk2
2269
+ aese v1.16b, v18.16b
2270
+ aesmc v1.16b, v1.16b // AES block 1 - round 0
2271
+ ldp q21, q22, [x8, #48] // load rk3, rk4
2272
+ aese v2.16b, v18.16b
2273
+ aesmc v2.16b, v2.16b // AES block 2 - round 0
2274
+ ldp q23, q24, [x8, #80] // load rk5, rk6
2275
+ aese v3.16b, v18.16b
2276
+ aesmc v3.16b, v3.16b // AES block 3 - round 0
2277
+ ldp q13, q14, [x6, #32] // load h2, h3
2278
+ aese v0.16b, v19.16b
2279
+ aesmc v0.16b, v0.16b // AES block 0 - round 1
2280
+ ldp q25, q26, [x8, #112] // load rk7, rk8
2281
+ aese v1.16b, v19.16b
2282
+ aesmc v1.16b, v1.16b // AES block 1 - round 1
2283
+ aese v2.16b, v19.16b
2284
+ aesmc v2.16b, v2.16b // AES block 2 - round 1
2285
+ aese v3.16b, v19.16b
2286
+ aesmc v3.16b, v3.16b // AES block 3 - round 1
2287
+ aese v0.16b, v20.16b
2288
+ aesmc v0.16b, v0.16b // AES block 0 - round 2
2289
+ ext v14.16b, v14.16b, v14.16b, #8
2290
+ aese v1.16b, v20.16b
2291
+ aesmc v1.16b, v1.16b // AES block 1 - round 2
2292
+ ext v13.16b, v13.16b, v13.16b, #8
2293
+ ldr q15, [x6, #80] // load h4
2294
+ aese v2.16b, v20.16b
2295
+ aesmc v2.16b, v2.16b // AES block 2 - round 2
2296
+ aese v3.16b, v20.16b
2297
+ aesmc v3.16b, v3.16b // AES block 3 - round 2
2298
+ ext v15.16b, v15.16b, v15.16b, #8
2299
+ aese v0.16b, v21.16b
2300
+ aesmc v0.16b, v0.16b // AES block 0 - round 3
2301
+ ld1 { v11.16b}, [x3]
2302
+ aese v1.16b, v21.16b
2303
+ aesmc v1.16b, v1.16b // AES block 1 - round 3
2304
+ ext v11.16b, v11.16b, v11.16b, #8
2305
+ aese v2.16b, v21.16b
2306
+ aesmc v2.16b, v2.16b // AES block 2 - round 3
2307
+ rev64 v11.16b, v11.16b
2308
+ aese v3.16b, v21.16b
2309
+ aesmc v3.16b, v3.16b // AES block 3 - round 3
2310
+ trn2 v17.2d, v14.2d, v15.2d // h4l | h3l
2311
+ aese v0.16b, v22.16b
2312
+ aesmc v0.16b, v0.16b // AES block 0 - round 4
2313
+ ldr q12, [x6] // load h1
2314
+ aese v1.16b, v22.16b
2315
+ aesmc v1.16b, v1.16b // AES block 1 - round 4
2316
+ ext v12.16b, v12.16b, v12.16b, #8
2317
+ aese v2.16b, v22.16b
2318
+ aesmc v2.16b, v2.16b // AES block 2 - round 4
2319
+ trn1 v9.2d, v14.2d, v15.2d // h4h | h3h
2320
+ aese v3.16b, v22.16b
2321
+ aesmc v3.16b, v3.16b // AES block 3 - round 4
2322
+ trn2 v16.2d, v12.2d, v13.2d // h2l | h1l
2323
+ aese v0.16b, v23.16b
2324
+ aesmc v0.16b, v0.16b // AES block 0 - round 5
2325
+ aese v1.16b, v23.16b
2326
+ aesmc v1.16b, v1.16b // AES block 1 - round 5
2327
+ aese v3.16b, v23.16b
2328
+ aesmc v3.16b, v3.16b // AES block 3 - round 5
2329
+ aese v2.16b, v23.16b
2330
+ aesmc v2.16b, v2.16b // AES block 2 - round 5
2331
+ aese v0.16b, v24.16b
2332
+ aesmc v0.16b, v0.16b // AES block 0 - round 6
2333
+ aese v1.16b, v24.16b
2334
+ aesmc v1.16b, v1.16b // AES block 1 - round 6
2335
+ aese v2.16b, v24.16b
2336
+ aesmc v2.16b, v2.16b // AES block 2 - round 6
2337
+ aese v3.16b, v24.16b
2338
+ aesmc v3.16b, v3.16b // AES block 3 - round 6
2339
+ aese v0.16b, v25.16b
2340
+ aesmc v0.16b, v0.16b // AES block 0 - round 7
2341
+ aese v1.16b, v25.16b
2342
+ aesmc v1.16b, v1.16b // AES block 1 - round 7
2343
+ aese v2.16b, v25.16b
2344
+ aesmc v2.16b, v2.16b // AES block 2 - round 7
2345
+ aese v3.16b, v25.16b
2346
+ aesmc v3.16b, v3.16b // AES block 3 - round 7
2347
+ aese v0.16b, v26.16b
2348
+ aesmc v0.16b, v0.16b // AES block 0 - round 8
2349
+ aese v1.16b, v26.16b
2350
+ aesmc v1.16b, v1.16b // AES block 1 - round 8
2351
+ aese v2.16b, v26.16b
2352
+ aesmc v2.16b, v2.16b // AES block 2 - round 8
2353
+ aese v3.16b, v26.16b
2354
+ aesmc v3.16b, v3.16b // AES block 3 - round 8
2355
+ cmp x17, #12 // setup flags for AES-128/192/256 check
2356
+ b.lt Ldec_finish_first_blocks_eor3 // branch if AES-128
2357
+ ldp q27, q28, [x8, #144] // load rk9, rk10
2358
+ aese v0.16b, v27.16b
2359
+ aesmc v0.16b, v0.16b // AES block 0 - round 9
2360
+ aese v1.16b, v27.16b
2361
+ aesmc v1.16b, v1.16b // AES block 1 - round 9
2362
+ aese v2.16b, v27.16b
2363
+ aesmc v2.16b, v2.16b // AES block 2 - round 9
2364
+ aese v3.16b, v27.16b
2365
+ aesmc v3.16b, v3.16b // AES block 3 - round 9
2366
+ aese v0.16b, v28.16b
2367
+ aesmc v0.16b, v0.16b // AES block 0 - round 10
2368
+ aese v1.16b, v28.16b
2369
+ aesmc v1.16b, v1.16b // AES block 1 - round 10
2370
+ aese v2.16b, v28.16b
2371
+ aesmc v2.16b, v2.16b // AES block 2 - round 10
2372
+ aese v3.16b, v28.16b
2373
+ aesmc v3.16b, v3.16b // AES block 3 - round 10
2374
+ b.eq Ldec_finish_first_blocks_eor3 // branch if AES-192
2375
+ ldp q27, q28, [x8, #176] // load rk11, rk12
2376
+ aese v0.16b, v27.16b
2377
+ aesmc v0.16b, v0.16b // AES block 0 - round 11
2378
+ aese v1.16b, v27.16b
2379
+ aesmc v1.16b, v1.16b // AES block 1 - round 11
2380
+ aese v2.16b, v27.16b
2381
+ aesmc v2.16b, v2.16b // AES block 2 - round 11
2382
+ aese v3.16b, v27.16b
2383
+ aesmc v3.16b, v3.16b // AES block 3 - round 11
2384
+ aese v0.16b, v28.16b
2385
+ aesmc v0.16b, v0.16b // AES block 0 - round 12
2386
+ aese v1.16b, v28.16b
2387
+ aesmc v1.16b, v1.16b // AES block 1 - round 12
2388
+ aese v2.16b, v28.16b
2389
+ aesmc v2.16b, v2.16b // AES block 2 - round 12
2390
+ aese v3.16b, v28.16b
2391
+ aesmc v3.16b, v3.16b // AES block 3 - round 12
2392
+ Ldec_finish_first_blocks_eor3:
2393
+ ldr q27, [x19] // load rkN
2394
+ cmp x0, x5 // check if we have <= 4 blocks
2395
+ eor v17.16b, v17.16b, v9.16b // h4k | h3k
2396
+ aese v1.16b, v31.16b // AES block 1 - round N-1
2397
+ aese v2.16b, v31.16b // AES block 2 - round N-1
2398
+ aese v3.16b, v31.16b // AES block 3 - round N-1
2399
+ aese v0.16b, v31.16b // AES block 0 - round N-1
2400
+ trn1 v8.2d, v12.2d, v13.2d // h2h | h1h
2401
+ eor v16.16b, v16.16b, v8.16b // h2k | h1k
2402
+ b.ge Ldec_tail_eor3 // handle tail
2403
+ // Setup for AES blocks 0-3 is done purely on NEON side instead of mixing NEON and scalar instructions.
2404
+ // This is because the final result of the AES block needs to be EORd with the final round key
2405
+ // value (v30). This avoids several fmovs.
2406
+ ldp q6, q7, [x0, #32] // AES blocks 2,3 load ciphertext
2407
+ ldp q4, q5, [x0], #64 // AES blocks 0,1 load ciphertext
2408
+ eor3 v0.16b, v4.16b, v0.16b, v27.16b // AES block 0 - result
2409
+ eor3 v1.16b, v5.16b, v1.16b, v27.16b // AES block 1 - result
2410
+ eor3 v2.16b, v6.16b, v2.16b, v27.16b // AES block 2 - result
2411
+ eor3 v3.16b, v7.16b, v3.16b, v27.16b // AES block 3 - result
2412
+ st1 { v0.16b, v1.16b, v2.16b, v3.16b}, [x2], #64 // AES blocks 0-3 - store result
2413
+ ldr q0, [sp, #160]
2414
+ ldr q1, [sp, #176]
2415
+ ldr q2, [sp, #192]
2416
+ ldr q3, [sp, #208]
2417
+ rev w20, w9
2418
+ str w20, [sp, #172]
2419
+ add w20, w9, #1
2420
+ rev w20, w20
2421
+ str w20, [sp, #188]
2422
+ add w20, w9, #2
2423
+ rev w20, w20
2424
+ str w20, [sp, #204]
2425
+ add w20, w9, #3
2426
+ rev w20, w20
2427
+ str w20, [sp, #220]
2428
+ add w9, w9, #4
2429
+ cmp x0, x5 // check if we have <= 4 blocks
2430
+ b.ge Ldec_prepretail_eor3 // do prepretail
2431
+ Ldec_main_loop_eor3: // main loop start
2432
+ aese v0.16b, v18.16b
2433
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 0
2434
+ aese v1.16b, v18.16b
2435
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 0
2436
+ aese v2.16b, v18.16b
2437
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 0
2438
+ aese v3.16b, v18.16b
2439
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 0
2440
+ aese v0.16b, v19.16b
2441
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 1
2442
+ aese v1.16b, v19.16b
2443
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 1
2444
+ aese v2.16b, v19.16b
2445
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 1
2446
+ aese v3.16b, v19.16b
2447
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 1
2448
+ rev64 v4.16b, v4.16b // GHASH block 4k
2449
+ rev64 v5.16b, v5.16b // GHASH block 4k+1
2450
+ rev64 v6.16b, v6.16b // GHASH block 4k+2
2451
+ rev64 v7.16b, v7.16b // GHASH block 4k+3
2452
+ aese v0.16b, v20.16b
2453
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 2
2454
+ ext v11.16b, v11.16b, v11.16b, #8 // PRE 0
2455
+ aese v1.16b, v20.16b
2456
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 2
2457
+ eor v4.16b, v4.16b, v11.16b // PRE 1
2458
+ aese v2.16b, v20.16b
2459
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 2
2460
+ pmull v11.1q, v4.1d, v15.1d // GHASH block 4k - low
2461
+ aese v3.16b, v20.16b
2462
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 2
2463
+ pmull2 v9.1q, v4.2d, v15.2d // GHASH block 4k - high
2464
+ aese v0.16b, v21.16b
2465
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 3
2466
+ mov d10, v17.d[1] // GHASH block 4k - mid
2467
+ aese v1.16b, v21.16b
2468
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 3
2469
+ mov d8, v4.d[1] // GHASH block 4k - mid
2470
+ aese v2.16b, v21.16b
2471
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 3
2472
+ eor v8.8b, v8.8b, v4.8b // GHASH block 4k - mid
2473
+ aese v3.16b, v21.16b
2474
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 3
2475
+ aese v0.16b, v22.16b
2476
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 4
2477
+ pmull2 v4.1q, v5.2d, v14.2d // GHASH block 4k+1 - high
2478
+ aese v1.16b, v22.16b
2479
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 4
2480
+ eor v9.16b, v9.16b, v4.16b // GHASH block 4k+1 - high
2481
+ aese v2.16b, v22.16b
2482
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 4
2483
+ mov d4, v5.d[1] // GHASH block 4k+1 - mid
2484
+ aese v3.16b, v22.16b
2485
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 4
2486
+ pmull v10.1q, v8.1d, v10.1d // GHASH block 4k - mid
2487
+ aese v0.16b, v23.16b
2488
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 5
2489
+ pmull v8.1q, v5.1d, v14.1d // GHASH block 4k+1 - low
2490
+ aese v1.16b, v23.16b
2491
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 5
2492
+ eor v4.8b, v4.8b, v5.8b // GHASH block 4k+1 - mid
2493
+ aese v3.16b, v23.16b
2494
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 5
2495
+ aese v2.16b, v23.16b
2496
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 5
2497
+ pmull v5.1q, v6.1d, v13.1d // GHASH block 4k+2 - low
2498
+ aese v0.16b, v24.16b
2499
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 6
2500
+ eor3 v11.16b, v11.16b, v8.16b, v5.16b // GHASH block 4k+1 - low & GHASH block 4k+2 - low
2501
+ aese v1.16b, v24.16b
2502
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 6
2503
+ mov d8, v6.d[1] // GHASH block 4k+2 - mid
2504
+ aese v2.16b, v24.16b
2505
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 6
2506
+ eor v8.8b, v8.8b, v6.8b // GHASH block 4k+2 - mid
2507
+ pmull v4.1q, v4.1d, v17.1d // GHASH block 4k+1 - mid
2508
+ ins v8.d[1], v8.d[0] // GHASH block 4k+2 - mid
2509
+ aese v3.16b, v24.16b
2510
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 6
2511
+ pmull2 v28.1q, v6.2d, v13.2d // GHASH block 4k+2 - high
2512
+ mov d6, v7.d[1] // GHASH block 4k+3 - mid
2513
+ aese v0.16b, v25.16b
2514
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 7
2515
+ pmull2 v8.1q, v8.2d, v16.2d // GHASH block 4k+2 - mid
2516
+ aese v1.16b, v25.16b
2517
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 7
2518
+ pmull v27.1q, v7.1d, v12.1d // GHASH block 4k+3 - low
2519
+ aese v2.16b, v25.16b
2520
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 7
2521
+ eor3 v10.16b, v10.16b, v4.16b, v8.16b // GHASH block 4k+1 - mid & GHASH block 4k+2 - mid
2522
+ aese v3.16b, v25.16b
2523
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 7
2524
+ pmull2 v5.1q, v7.2d, v12.2d // GHASH block 4k+3 - high
2525
+ eor v6.8b, v6.8b, v7.8b // GHASH block 4k+3 - mid
2526
+ eor3 v9.16b, v9.16b, v28.16b, v5.16b // GHASH block 4k+2 - high & GHASH block 4k+3 - high
2527
+ aese v0.16b, v26.16b
2528
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 8
2529
+ aese v1.16b, v26.16b
2530
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 8
2531
+ aese v2.16b, v26.16b
2532
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 8
2533
+ pmull v6.1q, v6.1d, v16.1d // GHASH block 4k+3 - mid
2534
+ ldr d8, [sp, #128]
2535
+ aese v3.16b, v26.16b
2536
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 8
2537
+ pmull v7.1q, v9.1d, v8.1d // MODULO - top 64b align with mid
2538
+ eor3 v10.16b, v10.16b, v6.16b, v7.16b // GHASH block 4k+3 - mid & MODULO - fold into mid
2539
+ eor v11.16b, v11.16b, v27.16b // GHASH block 4k+3 - low
2540
+ eor v6.16b, v11.16b, v9.16b // MODULO - karatsuba tidy up
2541
+ ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment
2542
+ eor3 v10.16b, v10.16b, v6.16b, v9.16b // MODULO - karatsuba tidy up & MODULO - fold into mid
2543
+ pmull v8.1q, v10.1d, v8.1d // MODULO - mid 64b align with low
2544
+ ext v10.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment
2545
+ eor3 v11.16b, v11.16b, v8.16b, v10.16b // MODULO - fold into low
2546
+ cmp w17, #12 // setup flags for AES-128/192/256 check
2547
+ b.lt Ldec_main_loop_continue_eor3 // branch if AES-128
2548
+ ldp q27, q28, [x8, #144] // load rk9, rk10
2549
+ aese v0.16b, v27.16b
2550
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 9
2551
+ aese v1.16b, v27.16b
2552
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 9
2553
+ aese v2.16b, v27.16b
2554
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 9
2555
+ aese v3.16b, v27.16b
2556
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 9
2557
+ aese v0.16b, v28.16b
2558
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 10
2559
+ aese v1.16b, v28.16b
2560
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 10
2561
+ aese v2.16b, v28.16b
2562
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 10
2563
+ aese v3.16b, v28.16b
2564
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 10
2565
+ b.eq Ldec_main_loop_continue_eor3 // branch if AES-192
2566
+ ldp q27, q28, [x8, #176] // load rk11, rk12
2567
+ aese v0.16b, v27.16b
2568
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 11
2569
+ aese v1.16b, v27.16b
2570
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 11
2571
+ aese v2.16b, v27.16b
2572
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 11
2573
+ aese v3.16b, v27.16b
2574
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 11
2575
+ aese v0.16b, v28.16b
2576
+ aesmc v0.16b, v0.16b // AES block 4k+4 - round 12
2577
+ aese v1.16b, v28.16b
2578
+ aesmc v1.16b, v1.16b // AES block 4k+5 - round 12
2579
+ aese v2.16b, v28.16b
2580
+ aesmc v2.16b, v2.16b // AES block 4k+6 - round 12
2581
+ aese v3.16b, v28.16b
2582
+ aesmc v3.16b, v3.16b // AES block 4k+7 - round 12
2583
+ Ldec_main_loop_continue_eor3:
2584
+ ldr q27, [x19] // load rkN
2585
+ ldp q6, q7, [x0, #32] // AES blocks 2,3 load ciphertext
2586
+ ldp q4, q5, [x0], #64 // AES blocks 0,1 load ciphertext
2587
+ aese v0.16b, v31.16b // AES block 4k+4 - round N-1
2588
+ eor3 v0.16b, v4.16b, v0.16b, v27.16b // AES block 4k+4 - result
2589
+ aese v1.16b, v31.16b // AES block 4k+5 - round N-1
2590
+ eor3 v1.16b, v5.16b, v1.16b, v27.16b // AES block 4k+5 - result
2591
+ aese v2.16b, v31.16b // AES block 4k+6 - round N-1
2592
+ eor3 v2.16b, v6.16b, v2.16b, v27.16b // AES block 4k+6 - result
2593
+ aese v3.16b, v31.16b // AES block 4k+7 - round N-1
2594
+ eor3 v3.16b, v7.16b, v3.16b, v27.16b // AES block 4k+7 - result
2595
+ st1 { v0.16b, v1.16b, v2.16b, v3.16b}, [x2], #64 // AES blocks 4k+4-7 - store result
2596
+ ldr q0, [sp, #160]
2597
+ ldr q1, [sp, #176]
2598
+ ldr q2, [sp, #192]
2599
+ ldr q3, [sp, #208]
2600
+ rev w20, w9
2601
+ str w20, [sp, #172]
2602
+ add w20, w9, #1
2603
+ rev w20, w20
2604
+ str w20, [sp, #188]
2605
+ add w20, w9, #2
2606
+ rev w20, w20
2607
+ str w20, [sp, #204]
2608
+ add w20, w9, #3
2609
+ rev w20, w20
2610
+ str w20, [sp, #220]
2611
+ add w9, w9, #4
2612
+ cmp x0, x5
2613
+ b.lt Ldec_main_loop_eor3
2614
+ Ldec_prepretail_eor3: // PREPRETAIL
2615
+ rev64 v4.16b, v4.16b // GHASH block 0
2616
+ rev64 v5.16b, v5.16b // GHASH block 1
2617
+ ext v11.16b, v11.16b, v11.16b, #8 // PRE 0
2618
+ aese v0.16b, v18.16b
2619
+ aesmc v0.16b, v0.16b // AES block 0 - round 0
2620
+ aese v1.16b, v18.16b
2621
+ aesmc v1.16b, v1.16b // AES block 1 - round 0
2622
+ eor v4.16b, v4.16b, v11.16b // PRE 1
2623
+ rev64 v6.16b, v6.16b // GHASH block 2
2624
+ aese v1.16b, v19.16b
2625
+ aesmc v1.16b, v1.16b // AES block 1 - round 1
2626
+ pmull v11.1q, v4.1d, v15.1d // GHASH block 0 - low
2627
+ mov d8, v4.d[1] // GHASH block 0 - mid
2628
+ pmull2 v9.1q, v4.2d, v15.2d // GHASH block 0 - high
2629
+ aese v2.16b, v18.16b
2630
+ aesmc v2.16b, v2.16b // AES block 2 - round 0
2631
+ mov d10, v17.d[1] // GHASH block 0 - mid
2632
+ aese v0.16b, v19.16b
2633
+ aesmc v0.16b, v0.16b // AES block 0 - round 1
2634
+ eor v8.8b, v8.8b, v4.8b // GHASH block 0 - mid
2635
+ pmull2 v4.1q, v5.2d, v14.2d // GHASH block 1 - high
2636
+ aese v2.16b, v19.16b
2637
+ aesmc v2.16b, v2.16b // AES block 2 - round 1
2638
+ rev64 v7.16b, v7.16b // GHASH block 3
2639
+ aese v3.16b, v18.16b
2640
+ aesmc v3.16b, v3.16b // AES block 3 - round 0
2641
+ pmull v10.1q, v8.1d, v10.1d // GHASH block 0 - mid
2642
+ eor v9.16b, v9.16b, v4.16b // GHASH block 1 - high
2643
+ pmull v8.1q, v5.1d, v14.1d // GHASH block 1 - low
2644
+ aese v3.16b, v19.16b
2645
+ aesmc v3.16b, v3.16b // AES block 3 - round 1
2646
+ mov d4, v5.d[1] // GHASH block 1 - mid
2647
+ aese v0.16b, v20.16b
2648
+ aesmc v0.16b, v0.16b // AES block 0 - round 2
2649
+ aese v1.16b, v20.16b
2650
+ aesmc v1.16b, v1.16b // AES block 1 - round 2
2651
+ eor v11.16b, v11.16b, v8.16b // GHASH block 1 - low
2652
+ aese v2.16b, v20.16b
2653
+ aesmc v2.16b, v2.16b // AES block 2 - round 2
2654
+ aese v0.16b, v21.16b
2655
+ aesmc v0.16b, v0.16b // AES block 0 - round 3
2656
+ mov d8, v6.d[1] // GHASH block 2 - mid
2657
+ aese v3.16b, v20.16b
2658
+ aesmc v3.16b, v3.16b // AES block 3 - round 2
2659
+ eor v4.8b, v4.8b, v5.8b // GHASH block 1 - mid
2660
+ pmull v5.1q, v6.1d, v13.1d // GHASH block 2 - low
2661
+ aese v0.16b, v22.16b
2662
+ aesmc v0.16b, v0.16b // AES block 0 - round 4
2663
+ aese v3.16b, v21.16b
2664
+ aesmc v3.16b, v3.16b // AES block 3 - round 3
2665
+ eor v8.8b, v8.8b, v6.8b // GHASH block 2 - mid
2666
+ pmull v4.1q, v4.1d, v17.1d // GHASH block 1 - mid
2667
+ aese v0.16b, v23.16b
2668
+ aesmc v0.16b, v0.16b // AES block 0 - round 5
2669
+ eor v11.16b, v11.16b, v5.16b // GHASH block 2 - low
2670
+ aese v3.16b, v22.16b
2671
+ aesmc v3.16b, v3.16b // AES block 3 - round 4
2672
+ pmull2 v5.1q, v7.2d, v12.2d // GHASH block 3 - high
2673
+ eor v10.16b, v10.16b, v4.16b // GHASH block 1 - mid
2674
+ pmull2 v4.1q, v6.2d, v13.2d // GHASH block 2 - high
2675
+ aese v3.16b, v23.16b
2676
+ aesmc v3.16b, v3.16b // AES block 3 - round 5
2677
+ ins v8.d[1], v8.d[0] // GHASH block 2 - mid
2678
+ aese v2.16b, v21.16b
2679
+ aesmc v2.16b, v2.16b // AES block 2 - round 3
2680
+ aese v1.16b, v21.16b
2681
+ aesmc v1.16b, v1.16b // AES block 1 - round 3
2682
+ eor3 v9.16b, v9.16b, v4.16b, v5.16b // GHASH block 2 - high & GHASH block 3 - high
2683
+ pmull v4.1q, v7.1d, v12.1d // GHASH block 3 - low
2684
+ aese v2.16b, v22.16b
2685
+ aesmc v2.16b, v2.16b // AES block 2 - round 4
2686
+ mov d6, v7.d[1] // GHASH block 3 - mid
2687
+ aese v1.16b, v22.16b
2688
+ aesmc v1.16b, v1.16b // AES block 1 - round 4
2689
+ pmull2 v8.1q, v8.2d, v16.2d // GHASH block 2 - mid
2690
+ aese v2.16b, v23.16b
2691
+ aesmc v2.16b, v2.16b // AES block 2 - round 5
2692
+ eor v6.8b, v6.8b, v7.8b // GHASH block 3 - mid
2693
+ aese v1.16b, v23.16b
2694
+ aesmc v1.16b, v1.16b // AES block 1 - round 5
2695
+ aese v3.16b, v24.16b
2696
+ aesmc v3.16b, v3.16b // AES block 3 - round 6
2697
+ eor v10.16b, v10.16b, v8.16b // GHASH block 2 - mid
2698
+ aese v2.16b, v24.16b
2699
+ aesmc v2.16b, v2.16b // AES block 2 - round 6
2700
+ aese v0.16b, v24.16b
2701
+ aesmc v0.16b, v0.16b // AES block 0 - round 6
2702
+ movi v8.8b, #0xc2
2703
+ aese v1.16b, v24.16b
2704
+ aesmc v1.16b, v1.16b // AES block 1 - round 6
2705
+ eor v11.16b, v11.16b, v4.16b // GHASH block 3 - low
2706
+ pmull v6.1q, v6.1d, v16.1d // GHASH block 3 - mid
2707
+ aese v3.16b, v25.16b
2708
+ aesmc v3.16b, v3.16b // AES block 3 - round 7
2709
+ aese v1.16b, v25.16b
2710
+ aesmc v1.16b, v1.16b // AES block 1 - round 7
2711
+ aese v0.16b, v25.16b
2712
+ aesmc v0.16b, v0.16b // AES block 0 - round 7
2713
+ eor v10.16b, v10.16b, v6.16b // GHASH block 3 - mid
2714
+ aese v3.16b, v26.16b
2715
+ aesmc v3.16b, v3.16b // AES block 3 - round 8
2716
+ aese v2.16b, v25.16b
2717
+ aesmc v2.16b, v2.16b // AES block 2 - round 7
2718
+ eor v6.16b, v11.16b, v9.16b // MODULO - karatsuba tidy up
2719
+ aese v1.16b, v26.16b
2720
+ aesmc v1.16b, v1.16b // AES block 1 - round 8
2721
+ aese v0.16b, v26.16b
2722
+ aesmc v0.16b, v0.16b // AES block 0 - round 8
2723
+ shl d8, d8, #56 // mod_constant
2724
+ aese v2.16b, v26.16b
2725
+ aesmc v2.16b, v2.16b // AES block 2 - round 8
2726
+ cmp w17, #12 // setup flags for AES-128/192/256 check
2727
+ b.lt Ldec_finish_prepretail_eor3 // branch if AES-128
2728
+ ldp q27, q28, [x8, #144] // load rk9, rk10
2729
+ aese v0.16b, v27.16b
2730
+ aesmc v0.16b, v0.16b // AES block 0 - round 9
2731
+ aese v1.16b, v27.16b
2732
+ aesmc v1.16b, v1.16b // AES block 1 - round 9
2733
+ aese v2.16b, v27.16b
2734
+ aesmc v2.16b, v2.16b // AES block 2 - round 9
2735
+ aese v3.16b, v27.16b
2736
+ aesmc v3.16b, v3.16b // AES block 3 - round 9
2737
+ aese v0.16b, v28.16b
2738
+ aesmc v0.16b, v0.16b // AES block 0 - round 10
2739
+ aese v1.16b, v28.16b
2740
+ aesmc v1.16b, v1.16b // AES block 1 - round 10
2741
+ aese v2.16b, v28.16b
2742
+ aesmc v2.16b, v2.16b // AES block 2 - round 10
2743
+ aese v3.16b, v28.16b
2744
+ aesmc v3.16b, v3.16b // AES block 3 - round 10
2745
+ b.eq Ldec_finish_prepretail_eor3 // branch if AES-192
2746
+ ldp q27, q28, [x8, #176] // load rk11, rk12
2747
+ aese v0.16b, v27.16b
2748
+ aesmc v0.16b, v0.16b // AES block 0 - round 11
2749
+ aese v1.16b, v27.16b
2750
+ aesmc v1.16b, v1.16b // AES block 1 - round 11
2751
+ aese v2.16b, v27.16b
2752
+ aesmc v2.16b, v2.16b // AES block 2 - round 11
2753
+ aese v3.16b, v27.16b
2754
+ aesmc v3.16b, v3.16b // AES block 3 - round 11
2755
+ aese v0.16b, v28.16b
2756
+ aesmc v0.16b, v0.16b // AES block 0 - round 12
2757
+ aese v1.16b, v28.16b
2758
+ aesmc v1.16b, v1.16b // AES block 1 - round 12
2759
+ aese v2.16b, v28.16b
2760
+ aesmc v2.16b, v2.16b // AES block 2 - round 12
2761
+ aese v3.16b, v28.16b
2762
+ aesmc v3.16b, v3.16b // AES block 3 - round 12
2763
+ Ldec_finish_prepretail_eor3:
2764
+ eor v10.16b, v10.16b, v6.16b // MODULO - karatsuba tidy up
2765
+ pmull v7.1q, v9.1d, v8.1d // MODULO - top 64b align with mid
2766
+ ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment
2767
+ eor3 v10.16b, v10.16b, v7.16b, v9.16b // MODULO - fold into mid
2768
+ pmull v8.1q, v10.1d, v8.1d // MODULO - mid 64b align with low
2769
+ ext v10.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment
2770
+ eor3 v11.16b, v11.16b, v8.16b, v10.16b // MODULO - fold into low
2771
+ aese v1.16b, v31.16b // AES block 1 - round N-1
2772
+ aese v0.16b, v31.16b // AES block 0 - round N-1
2773
+ aese v3.16b, v31.16b // AES block 3 - round N-1
2774
+ aese v2.16b, v31.16b // AES block 2 - round N-1
2775
+ Ldec_tail_eor3: // TAIL
2776
+ sub x5, x4, x0 // main_end_input_ptr is number of bytes left to process
2777
+ ld1 { v5.16b}, [x0], #16 // AES block 0 - load ciphertext
2778
+ eor v0.16b, v5.16b, v0.16b // AES block 0 - result
2779
+ mov x6, v0.d[0] // AES block 0 - mov low
2780
+ mov x7, v0.d[1] // AES block 0 - mov high
2781
+ ext v8.16b, v11.16b, v11.16b, #8 // prepare final partial tag
2782
+ eor x6, x6, x13 // AES block 0 - round N low
2783
+ eor x7, x7, x14 // AES block 0 - round N high
2784
+ cmp x5, #48
2785
+ b.gt Ldec_blocks_more_than_3_eor3
2786
+ mov v3.16b, v2.16b
2787
+ movi v10.8b, #0
2788
+ movi v11.8b, #0
2789
+ movi v9.8b, #0
2790
+ mov v2.16b, v1.16b
2791
+ cmp x5, #32
2792
+ b.gt Ldec_blocks_more_than_2_eor3
2793
+ mov v3.16b, v1.16b
2794
+ cmp x5, #16
2795
+ b.gt Ldec_blocks_more_than_1_eor3
2796
+ b Ldec_blocks_less_than_1_eor3
2797
+ Ldec_blocks_more_than_3_eor3: // blocks left > 3
2798
+ rev64 v4.16b, v5.16b // GHASH final-3 block
2799
+ ld1 { v5.16b}, [x0], #16 // AES final-2 block - load ciphertext
2800
+ stp x6, x7, [x2], #16 // AES final-3 block - store result
2801
+ mov d10, v17.d[1] // GHASH final-3 block - mid
2802
+ eor v4.16b, v4.16b, v8.16b // feed in partial tag
2803
+ eor v0.16b, v5.16b, v1.16b // AES final-2 block - result
2804
+ mov d22, v4.d[1] // GHASH final-3 block - mid
2805
+ mov x6, v0.d[0] // AES final-2 block - mov low
2806
+ mov x7, v0.d[1] // AES final-2 block - mov high
2807
+ eor v22.8b, v22.8b, v4.8b // GHASH final-3 block - mid
2808
+ movi v8.8b, #0 // suppress further partial tag feed in
2809
+ pmull2 v9.1q, v4.2d, v15.2d // GHASH final-3 block - high
2810
+ pmull v10.1q, v22.1d, v10.1d // GHASH final-3 block - mid
2811
+ eor x6, x6, x13 // AES final-2 block - round N low
2812
+ pmull v11.1q, v4.1d, v15.1d // GHASH final-3 block - low
2813
+ eor x7, x7, x14 // AES final-2 block - round N high
2814
+ Ldec_blocks_more_than_2_eor3: // blocks left > 2
2815
+ rev64 v4.16b, v5.16b // GHASH final-2 block
2816
+ ld1 { v5.16b}, [x0], #16 // AES final-1 block - load ciphertext
2817
+ eor v4.16b, v4.16b, v8.16b // feed in partial tag
2818
+ stp x6, x7, [x2], #16 // AES final-2 block - store result
2819
+ eor v0.16b, v5.16b, v2.16b // AES final-1 block - result
2820
+ mov d22, v4.d[1] // GHASH final-2 block - mid
2821
+ pmull v21.1q, v4.1d, v14.1d // GHASH final-2 block - low
2822
+ pmull2 v20.1q, v4.2d, v14.2d // GHASH final-2 block - high
2823
+ eor v22.8b, v22.8b, v4.8b // GHASH final-2 block - mid
2824
+ mov x6, v0.d[0] // AES final-1 block - mov low
2825
+ mov x7, v0.d[1] // AES final-1 block - mov high
2826
+ eor v11.16b, v11.16b, v21.16b // GHASH final-2 block - low
2827
+ movi v8.8b, #0 // suppress further partial tag feed in
2828
+ pmull v22.1q, v22.1d, v17.1d // GHASH final-2 block - mid
2829
+ eor v9.16b, v9.16b, v20.16b // GHASH final-2 block - high
2830
+ eor x6, x6, x13 // AES final-1 block - round N low
2831
+ eor v10.16b, v10.16b, v22.16b // GHASH final-2 block - mid
2832
+ eor x7, x7, x14 // AES final-1 block - round N high
2833
+ Ldec_blocks_more_than_1_eor3: // blocks left > 1
2834
+ stp x6, x7, [x2], #16 // AES final-1 block - store result
2835
+ rev64 v4.16b, v5.16b // GHASH final-1 block
2836
+ ld1 { v5.16b}, [x0], #16 // AES final block - load ciphertext
2837
+ eor v4.16b, v4.16b, v8.16b // feed in partial tag
2838
+ movi v8.8b, #0 // suppress further partial tag feed in
2839
+ mov d22, v4.d[1] // GHASH final-1 block - mid
2840
+ eor v0.16b, v5.16b, v3.16b // AES final block - result
2841
+ pmull2 v20.1q, v4.2d, v13.2d // GHASH final-1 block - high
2842
+ eor v22.8b, v22.8b, v4.8b // GHASH final-1 block - mid
2843
+ pmull v21.1q, v4.1d, v13.1d // GHASH final-1 block - low
2844
+ mov x6, v0.d[0] // AES final block - mov low
2845
+ ins v22.d[1], v22.d[0] // GHASH final-1 block - mid
2846
+ mov x7, v0.d[1] // AES final block - mov high
2847
+ pmull2 v22.1q, v22.2d, v16.2d // GHASH final-1 block - mid
2848
+ eor x6, x6, x13 // AES final block - round N low
2849
+ eor v11.16b, v11.16b, v21.16b // GHASH final-1 block - low
2850
+ eor v9.16b, v9.16b, v20.16b // GHASH final-1 block - high
2851
+ eor v10.16b, v10.16b, v22.16b // GHASH final-1 block - mid
2852
+ eor x7, x7, x14 // AES final block - round N high
2853
+ Ldec_blocks_less_than_1_eor3: // blocks left <= 1
2854
+ add x10, x10, x1, lsr #7 // Calculate the updated counter based on the number of 16B chunks we processed
2855
+ rev w10, w10
2856
+ str w10, [x16, #12] // store the updated counter
2857
+ and x1, x1, #127 // bit_length %= 128
2858
+ mvn x14, xzr // rkN_h = 0xffffffffffffffff
2859
+ sub x1, x1, #128 // bit_length -= 128
2860
+ mvn x13, xzr // rkN_l = 0xffffffffffffffff
2861
+ ldp x4, x5, [x2] // load existing bytes we need to not overwrite
2862
+ neg x1, x1 // bit_length = 128 - #bits in input (in range [1,128])
2863
+ and x1, x1, #127 // bit_length %= 128
2864
+ lsr x14, x14, x1 // rkN_h is mask for top 64b of last block
2865
+ cmp x1, #64
2866
+ csel x9, x13, x14, lt
2867
+ csel x10, x14, xzr, lt
2868
+ fmov d0, x9 // ctr0b is mask for last block
2869
+ and x6, x6, x9
2870
+ mov v0.d[1], x10
2871
+ bic x4, x4, x9 // mask out low existing bytes
2872
+ bic x5, x5, x10 // mask out high existing bytes
2873
+ orr x6, x6, x4
2874
+ and x7, x7, x10
2875
+ orr x7, x7, x5
2876
+ and v5.16b, v5.16b, v0.16b // possibly partial last block has zeroes in highest bits
2877
+ rev64 v4.16b, v5.16b // GHASH final block
2878
+ eor v4.16b, v4.16b, v8.16b // feed in partial tag
2879
+ pmull v21.1q, v4.1d, v12.1d // GHASH final block - low
2880
+ mov d8, v4.d[1] // GHASH final block - mid
2881
+ eor v8.8b, v8.8b, v4.8b // GHASH final block - mid
2882
+ pmull2 v20.1q, v4.2d, v12.2d // GHASH final block - high
2883
+ pmull v8.1q, v8.1d, v16.1d // GHASH final block - mid
2884
+ eor v9.16b, v9.16b, v20.16b // GHASH final block - high
2885
+ eor v11.16b, v11.16b, v21.16b // GHASH final block - low
2886
+ eor v10.16b, v10.16b, v8.16b // GHASH final block - mid
2887
+ ldr d8, [sp, #128]
2888
+ eor v6.16b, v11.16b, v9.16b // MODULO - karatsuba tidy up
2889
+ eor v10.16b, v10.16b, v6.16b // MODULO - karatsuba tidy up
2890
+ pmull v7.1q, v9.1d, v8.1d // MODULO - top 64b align with mid
2891
+ ext v9.16b, v9.16b, v9.16b, #8 // MODULO - other top alignment
2892
+ eor v10.16b, v10.16b, v7.16b // MODULO - fold into mid
2893
+ eor v10.16b, v10.16b, v9.16b // MODULO - fold into mid
2894
+ pmull v8.1q, v10.1d, v8.1d // MODULO - mid 64b align with low
2895
+ ext v10.16b, v10.16b, v10.16b, #8 // MODULO - other mid alignment
2896
+ eor v11.16b, v11.16b, v8.16b // MODULO - fold into low
2897
+ stp x6, x7, [x2]
2898
+ eor v11.16b, v11.16b, v10.16b // MODULO - fold into low
2899
+ ext v11.16b, v11.16b, v11.16b, #8
2900
+ rev64 v11.16b, v11.16b // Final Tag
2901
+ mov x0, x15
2902
+ st1 { v11.16b }, [x3] // Store final tag
2903
+ ldp x19, x20, [sp, #16]
2904
+ ldp x21, x22, [sp, #32]
2905
+ ldp x23, x24, [sp, #48]
2906
+ ldp d8, d9, [sp, #64]
2907
+ ldp d10, d11, [sp, #80]
2908
+ ldp d12, d13, [sp, #96]
2909
+ ldp d14, d15, [sp, #112]
2910
+ ldp x29, x30, [sp], #224
2911
+ AARCH64_VALIDATE_LINK_REGISTER
2912
+ ret
2913
+
2914
+ #endif // __ARM_MAX_ARCH__ >= 8
2915
+ #endif // !OPENSSL_NO_ASM && defined(OPENSSL_AARCH64) && defined(_WIN32)