aesni-gcm-x86_64.s 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789
  1. .text
  2. .type _aesni_ctr32_ghash_6x,@function
  3. .align 32
  4. _aesni_ctr32_ghash_6x:
  5. .cfi_startproc
  6. vmovdqu 32(%r11),%xmm2
  7. subq $6,%rdx
  8. vpxor %xmm4,%xmm4,%xmm4
  9. vmovdqu 0-128(%rcx),%xmm15
  10. vpaddb %xmm2,%xmm1,%xmm10
  11. vpaddb %xmm2,%xmm10,%xmm11
  12. vpaddb %xmm2,%xmm11,%xmm12
  13. vpaddb %xmm2,%xmm12,%xmm13
  14. vpaddb %xmm2,%xmm13,%xmm14
  15. vpxor %xmm15,%xmm1,%xmm9
  16. vmovdqu %xmm4,16+8(%rsp)
  17. jmp .Loop6x
  18. .align 32
  19. .Loop6x:
  20. addl $100663296,%ebx
  21. jc .Lhandle_ctr32
  22. vmovdqu 0-32(%r9),%xmm3
  23. vpaddb %xmm2,%xmm14,%xmm1
  24. vpxor %xmm15,%xmm10,%xmm10
  25. vpxor %xmm15,%xmm11,%xmm11
  26. .Lresume_ctr32:
  27. vmovdqu %xmm1,(%r8)
  28. vpclmulqdq $0x10,%xmm3,%xmm7,%xmm5
  29. vpxor %xmm15,%xmm12,%xmm12
  30. vmovups 16-128(%rcx),%xmm2
  31. vpclmulqdq $0x01,%xmm3,%xmm7,%xmm6
  32. xorq %r12,%r12
  33. cmpq %r14,%r15
  34. vaesenc %xmm2,%xmm9,%xmm9
  35. vmovdqu 48+8(%rsp),%xmm0
  36. vpxor %xmm15,%xmm13,%xmm13
  37. vpclmulqdq $0x00,%xmm3,%xmm7,%xmm1
  38. vaesenc %xmm2,%xmm10,%xmm10
  39. vpxor %xmm15,%xmm14,%xmm14
  40. setnc %r12b
  41. vpclmulqdq $0x11,%xmm3,%xmm7,%xmm7
  42. vaesenc %xmm2,%xmm11,%xmm11
  43. vmovdqu 16-32(%r9),%xmm3
  44. negq %r12
  45. vaesenc %xmm2,%xmm12,%xmm12
  46. vpxor %xmm5,%xmm6,%xmm6
  47. vpclmulqdq $0x00,%xmm3,%xmm0,%xmm5
  48. vpxor %xmm4,%xmm8,%xmm8
  49. vaesenc %xmm2,%xmm13,%xmm13
  50. vpxor %xmm5,%xmm1,%xmm4
  51. andq $0x60,%r12
  52. vmovups 32-128(%rcx),%xmm15
  53. vpclmulqdq $0x10,%xmm3,%xmm0,%xmm1
  54. vaesenc %xmm2,%xmm14,%xmm14
  55. vpclmulqdq $0x01,%xmm3,%xmm0,%xmm2
  56. leaq (%r14,%r12,1),%r14
  57. vaesenc %xmm15,%xmm9,%xmm9
  58. vpxor 16+8(%rsp),%xmm8,%xmm8
  59. vpclmulqdq $0x11,%xmm3,%xmm0,%xmm3
  60. vmovdqu 64+8(%rsp),%xmm0
  61. vaesenc %xmm15,%xmm10,%xmm10
  62. movbeq 88(%r14),%r13
  63. vaesenc %xmm15,%xmm11,%xmm11
  64. movbeq 80(%r14),%r12
  65. vaesenc %xmm15,%xmm12,%xmm12
  66. movq %r13,32+8(%rsp)
  67. vaesenc %xmm15,%xmm13,%xmm13
  68. movq %r12,40+8(%rsp)
  69. vmovdqu 48-32(%r9),%xmm5
  70. vaesenc %xmm15,%xmm14,%xmm14
  71. vmovups 48-128(%rcx),%xmm15
  72. vpxor %xmm1,%xmm6,%xmm6
  73. vpclmulqdq $0x00,%xmm5,%xmm0,%xmm1
  74. vaesenc %xmm15,%xmm9,%xmm9
  75. vpxor %xmm2,%xmm6,%xmm6
  76. vpclmulqdq $0x10,%xmm5,%xmm0,%xmm2
  77. vaesenc %xmm15,%xmm10,%xmm10
  78. vpxor %xmm3,%xmm7,%xmm7
  79. vpclmulqdq $0x01,%xmm5,%xmm0,%xmm3
  80. vaesenc %xmm15,%xmm11,%xmm11
  81. vpclmulqdq $0x11,%xmm5,%xmm0,%xmm5
  82. vmovdqu 80+8(%rsp),%xmm0
  83. vaesenc %xmm15,%xmm12,%xmm12
  84. vaesenc %xmm15,%xmm13,%xmm13
  85. vpxor %xmm1,%xmm4,%xmm4
  86. vmovdqu 64-32(%r9),%xmm1
  87. vaesenc %xmm15,%xmm14,%xmm14
  88. vmovups 64-128(%rcx),%xmm15
  89. vpxor %xmm2,%xmm6,%xmm6
  90. vpclmulqdq $0x00,%xmm1,%xmm0,%xmm2
  91. vaesenc %xmm15,%xmm9,%xmm9
  92. vpxor %xmm3,%xmm6,%xmm6
  93. vpclmulqdq $0x10,%xmm1,%xmm0,%xmm3
  94. vaesenc %xmm15,%xmm10,%xmm10
  95. movbeq 72(%r14),%r13
  96. vpxor %xmm5,%xmm7,%xmm7
  97. vpclmulqdq $0x01,%xmm1,%xmm0,%xmm5
  98. vaesenc %xmm15,%xmm11,%xmm11
  99. movbeq 64(%r14),%r12
  100. vpclmulqdq $0x11,%xmm1,%xmm0,%xmm1
  101. vmovdqu 96+8(%rsp),%xmm0
  102. vaesenc %xmm15,%xmm12,%xmm12
  103. movq %r13,48+8(%rsp)
  104. vaesenc %xmm15,%xmm13,%xmm13
  105. movq %r12,56+8(%rsp)
  106. vpxor %xmm2,%xmm4,%xmm4
  107. vmovdqu 96-32(%r9),%xmm2
  108. vaesenc %xmm15,%xmm14,%xmm14
  109. vmovups 80-128(%rcx),%xmm15
  110. vpxor %xmm3,%xmm6,%xmm6
  111. vpclmulqdq $0x00,%xmm2,%xmm0,%xmm3
  112. vaesenc %xmm15,%xmm9,%xmm9
  113. vpxor %xmm5,%xmm6,%xmm6
  114. vpclmulqdq $0x10,%xmm2,%xmm0,%xmm5
  115. vaesenc %xmm15,%xmm10,%xmm10
  116. movbeq 56(%r14),%r13
  117. vpxor %xmm1,%xmm7,%xmm7
  118. vpclmulqdq $0x01,%xmm2,%xmm0,%xmm1
  119. vpxor 112+8(%rsp),%xmm8,%xmm8
  120. vaesenc %xmm15,%xmm11,%xmm11
  121. movbeq 48(%r14),%r12
  122. vpclmulqdq $0x11,%xmm2,%xmm0,%xmm2
  123. vaesenc %xmm15,%xmm12,%xmm12
  124. movq %r13,64+8(%rsp)
  125. vaesenc %xmm15,%xmm13,%xmm13
  126. movq %r12,72+8(%rsp)
  127. vpxor %xmm3,%xmm4,%xmm4
  128. vmovdqu 112-32(%r9),%xmm3
  129. vaesenc %xmm15,%xmm14,%xmm14
  130. vmovups 96-128(%rcx),%xmm15
  131. vpxor %xmm5,%xmm6,%xmm6
  132. vpclmulqdq $0x10,%xmm3,%xmm8,%xmm5
  133. vaesenc %xmm15,%xmm9,%xmm9
  134. vpxor %xmm1,%xmm6,%xmm6
  135. vpclmulqdq $0x01,%xmm3,%xmm8,%xmm1
  136. vaesenc %xmm15,%xmm10,%xmm10
  137. movbeq 40(%r14),%r13
  138. vpxor %xmm2,%xmm7,%xmm7
  139. vpclmulqdq $0x00,%xmm3,%xmm8,%xmm2
  140. vaesenc %xmm15,%xmm11,%xmm11
  141. movbeq 32(%r14),%r12
  142. vpclmulqdq $0x11,%xmm3,%xmm8,%xmm8
  143. vaesenc %xmm15,%xmm12,%xmm12
  144. movq %r13,80+8(%rsp)
  145. vaesenc %xmm15,%xmm13,%xmm13
  146. movq %r12,88+8(%rsp)
  147. vpxor %xmm5,%xmm6,%xmm6
  148. vaesenc %xmm15,%xmm14,%xmm14
  149. vpxor %xmm1,%xmm6,%xmm6
  150. vmovups 112-128(%rcx),%xmm15
  151. vpslldq $8,%xmm6,%xmm5
  152. vpxor %xmm2,%xmm4,%xmm4
  153. vmovdqu 16(%r11),%xmm3
  154. vaesenc %xmm15,%xmm9,%xmm9
  155. vpxor %xmm8,%xmm7,%xmm7
  156. vaesenc %xmm15,%xmm10,%xmm10
  157. vpxor %xmm5,%xmm4,%xmm4
  158. movbeq 24(%r14),%r13
  159. vaesenc %xmm15,%xmm11,%xmm11
  160. movbeq 16(%r14),%r12
  161. vpalignr $8,%xmm4,%xmm4,%xmm0
  162. vpclmulqdq $0x10,%xmm3,%xmm4,%xmm4
  163. movq %r13,96+8(%rsp)
  164. vaesenc %xmm15,%xmm12,%xmm12
  165. movq %r12,104+8(%rsp)
  166. vaesenc %xmm15,%xmm13,%xmm13
  167. vmovups 128-128(%rcx),%xmm1
  168. vaesenc %xmm15,%xmm14,%xmm14
  169. vaesenc %xmm1,%xmm9,%xmm9
  170. vmovups 144-128(%rcx),%xmm15
  171. vaesenc %xmm1,%xmm10,%xmm10
  172. vpsrldq $8,%xmm6,%xmm6
  173. vaesenc %xmm1,%xmm11,%xmm11
  174. vpxor %xmm6,%xmm7,%xmm7
  175. vaesenc %xmm1,%xmm12,%xmm12
  176. vpxor %xmm0,%xmm4,%xmm4
  177. movbeq 8(%r14),%r13
  178. vaesenc %xmm1,%xmm13,%xmm13
  179. movbeq 0(%r14),%r12
  180. vaesenc %xmm1,%xmm14,%xmm14
  181. vmovups 160-128(%rcx),%xmm1
  182. cmpl $11,%ebp
  183. jb .Lenc_tail
  184. vaesenc %xmm15,%xmm9,%xmm9
  185. vaesenc %xmm15,%xmm10,%xmm10
  186. vaesenc %xmm15,%xmm11,%xmm11
  187. vaesenc %xmm15,%xmm12,%xmm12
  188. vaesenc %xmm15,%xmm13,%xmm13
  189. vaesenc %xmm15,%xmm14,%xmm14
  190. vaesenc %xmm1,%xmm9,%xmm9
  191. vaesenc %xmm1,%xmm10,%xmm10
  192. vaesenc %xmm1,%xmm11,%xmm11
  193. vaesenc %xmm1,%xmm12,%xmm12
  194. vaesenc %xmm1,%xmm13,%xmm13
  195. vmovups 176-128(%rcx),%xmm15
  196. vaesenc %xmm1,%xmm14,%xmm14
  197. vmovups 192-128(%rcx),%xmm1
  198. je .Lenc_tail
  199. vaesenc %xmm15,%xmm9,%xmm9
  200. vaesenc %xmm15,%xmm10,%xmm10
  201. vaesenc %xmm15,%xmm11,%xmm11
  202. vaesenc %xmm15,%xmm12,%xmm12
  203. vaesenc %xmm15,%xmm13,%xmm13
  204. vaesenc %xmm15,%xmm14,%xmm14
  205. vaesenc %xmm1,%xmm9,%xmm9
  206. vaesenc %xmm1,%xmm10,%xmm10
  207. vaesenc %xmm1,%xmm11,%xmm11
  208. vaesenc %xmm1,%xmm12,%xmm12
  209. vaesenc %xmm1,%xmm13,%xmm13
  210. vmovups 208-128(%rcx),%xmm15
  211. vaesenc %xmm1,%xmm14,%xmm14
  212. vmovups 224-128(%rcx),%xmm1
  213. jmp .Lenc_tail
  214. .align 32
  215. .Lhandle_ctr32:
  216. vmovdqu (%r11),%xmm0
  217. vpshufb %xmm0,%xmm1,%xmm6
  218. vmovdqu 48(%r11),%xmm5
  219. vpaddd 64(%r11),%xmm6,%xmm10
  220. vpaddd %xmm5,%xmm6,%xmm11
  221. vmovdqu 0-32(%r9),%xmm3
  222. vpaddd %xmm5,%xmm10,%xmm12
  223. vpshufb %xmm0,%xmm10,%xmm10
  224. vpaddd %xmm5,%xmm11,%xmm13
  225. vpshufb %xmm0,%xmm11,%xmm11
  226. vpxor %xmm15,%xmm10,%xmm10
  227. vpaddd %xmm5,%xmm12,%xmm14
  228. vpshufb %xmm0,%xmm12,%xmm12
  229. vpxor %xmm15,%xmm11,%xmm11
  230. vpaddd %xmm5,%xmm13,%xmm1
  231. vpshufb %xmm0,%xmm13,%xmm13
  232. vpshufb %xmm0,%xmm14,%xmm14
  233. vpshufb %xmm0,%xmm1,%xmm1
  234. jmp .Lresume_ctr32
  235. .align 32
  236. .Lenc_tail:
  237. vaesenc %xmm15,%xmm9,%xmm9
  238. vmovdqu %xmm7,16+8(%rsp)
  239. vpalignr $8,%xmm4,%xmm4,%xmm8
  240. vaesenc %xmm15,%xmm10,%xmm10
  241. vpclmulqdq $0x10,%xmm3,%xmm4,%xmm4
  242. vpxor 0(%rdi),%xmm1,%xmm2
  243. vaesenc %xmm15,%xmm11,%xmm11
  244. vpxor 16(%rdi),%xmm1,%xmm0
  245. vaesenc %xmm15,%xmm12,%xmm12
  246. vpxor 32(%rdi),%xmm1,%xmm5
  247. vaesenc %xmm15,%xmm13,%xmm13
  248. vpxor 48(%rdi),%xmm1,%xmm6
  249. vaesenc %xmm15,%xmm14,%xmm14
  250. vpxor 64(%rdi),%xmm1,%xmm7
  251. vpxor 80(%rdi),%xmm1,%xmm3
  252. vmovdqu (%r8),%xmm1
  253. vaesenclast %xmm2,%xmm9,%xmm9
  254. vmovdqu 32(%r11),%xmm2
  255. vaesenclast %xmm0,%xmm10,%xmm10
  256. vpaddb %xmm2,%xmm1,%xmm0
  257. movq %r13,112+8(%rsp)
  258. leaq 96(%rdi),%rdi
  259. vaesenclast %xmm5,%xmm11,%xmm11
  260. vpaddb %xmm2,%xmm0,%xmm5
  261. movq %r12,120+8(%rsp)
  262. leaq 96(%rsi),%rsi
  263. vmovdqu 0-128(%rcx),%xmm15
  264. vaesenclast %xmm6,%xmm12,%xmm12
  265. vpaddb %xmm2,%xmm5,%xmm6
  266. vaesenclast %xmm7,%xmm13,%xmm13
  267. vpaddb %xmm2,%xmm6,%xmm7
  268. vaesenclast %xmm3,%xmm14,%xmm14
  269. vpaddb %xmm2,%xmm7,%xmm3
  270. addq $0x60,%r10
  271. subq $0x6,%rdx
  272. jc .L6x_done
  273. vmovups %xmm9,-96(%rsi)
  274. vpxor %xmm15,%xmm1,%xmm9
  275. vmovups %xmm10,-80(%rsi)
  276. vmovdqa %xmm0,%xmm10
  277. vmovups %xmm11,-64(%rsi)
  278. vmovdqa %xmm5,%xmm11
  279. vmovups %xmm12,-48(%rsi)
  280. vmovdqa %xmm6,%xmm12
  281. vmovups %xmm13,-32(%rsi)
  282. vmovdqa %xmm7,%xmm13
  283. vmovups %xmm14,-16(%rsi)
  284. vmovdqa %xmm3,%xmm14
  285. vmovdqu 32+8(%rsp),%xmm7
  286. jmp .Loop6x
  287. .L6x_done:
  288. vpxor 16+8(%rsp),%xmm8,%xmm8
  289. vpxor %xmm4,%xmm8,%xmm8
  290. .byte 0xf3,0xc3
  291. .cfi_endproc
  292. .size _aesni_ctr32_ghash_6x,.-_aesni_ctr32_ghash_6x
  293. .globl aesni_gcm_decrypt
  294. .type aesni_gcm_decrypt,@function
  295. .align 32
  296. aesni_gcm_decrypt:
  297. .cfi_startproc
  298. xorq %r10,%r10
  299. cmpq $0x60,%rdx
  300. jb .Lgcm_dec_abort
  301. leaq (%rsp),%rax
  302. .cfi_def_cfa_register %rax
  303. pushq %rbx
  304. .cfi_offset %rbx,-16
  305. pushq %rbp
  306. .cfi_offset %rbp,-24
  307. pushq %r12
  308. .cfi_offset %r12,-32
  309. pushq %r13
  310. .cfi_offset %r13,-40
  311. pushq %r14
  312. .cfi_offset %r14,-48
  313. pushq %r15
  314. .cfi_offset %r15,-56
  315. vzeroupper
  316. vmovdqu (%r8),%xmm1
  317. addq $-128,%rsp
  318. movl 12(%r8),%ebx
  319. leaq .Lbswap_mask(%rip),%r11
  320. leaq -128(%rcx),%r14
  321. movq $0xf80,%r15
  322. vmovdqu (%r9),%xmm8
  323. andq $-128,%rsp
  324. vmovdqu (%r11),%xmm0
  325. leaq 128(%rcx),%rcx
  326. leaq 32+32(%r9),%r9
  327. movl 240-128(%rcx),%ebp
  328. vpshufb %xmm0,%xmm8,%xmm8
  329. andq %r15,%r14
  330. andq %rsp,%r15
  331. subq %r14,%r15
  332. jc .Ldec_no_key_aliasing
  333. cmpq $768,%r15
  334. jnc .Ldec_no_key_aliasing
  335. subq %r15,%rsp
  336. .Ldec_no_key_aliasing:
  337. vmovdqu 80(%rdi),%xmm7
  338. leaq (%rdi),%r14
  339. vmovdqu 64(%rdi),%xmm4
  340. leaq -192(%rdi,%rdx,1),%r15
  341. vmovdqu 48(%rdi),%xmm5
  342. shrq $4,%rdx
  343. xorq %r10,%r10
  344. vmovdqu 32(%rdi),%xmm6
  345. vpshufb %xmm0,%xmm7,%xmm7
  346. vmovdqu 16(%rdi),%xmm2
  347. vpshufb %xmm0,%xmm4,%xmm4
  348. vmovdqu (%rdi),%xmm3
  349. vpshufb %xmm0,%xmm5,%xmm5
  350. vmovdqu %xmm4,48(%rsp)
  351. vpshufb %xmm0,%xmm6,%xmm6
  352. vmovdqu %xmm5,64(%rsp)
  353. vpshufb %xmm0,%xmm2,%xmm2
  354. vmovdqu %xmm6,80(%rsp)
  355. vpshufb %xmm0,%xmm3,%xmm3
  356. vmovdqu %xmm2,96(%rsp)
  357. vmovdqu %xmm3,112(%rsp)
  358. call _aesni_ctr32_ghash_6x
  359. vmovups %xmm9,-96(%rsi)
  360. vmovups %xmm10,-80(%rsi)
  361. vmovups %xmm11,-64(%rsi)
  362. vmovups %xmm12,-48(%rsi)
  363. vmovups %xmm13,-32(%rsi)
  364. vmovups %xmm14,-16(%rsi)
  365. vpshufb (%r11),%xmm8,%xmm8
  366. vmovdqu %xmm8,-64(%r9)
  367. vzeroupper
  368. movq -48(%rax),%r15
  369. .cfi_restore %r15
  370. movq -40(%rax),%r14
  371. .cfi_restore %r14
  372. movq -32(%rax),%r13
  373. .cfi_restore %r13
  374. movq -24(%rax),%r12
  375. .cfi_restore %r12
  376. movq -16(%rax),%rbp
  377. .cfi_restore %rbp
  378. movq -8(%rax),%rbx
  379. .cfi_restore %rbx
  380. leaq (%rax),%rsp
  381. .cfi_def_cfa_register %rsp
  382. .Lgcm_dec_abort:
  383. movq %r10,%rax
  384. .byte 0xf3,0xc3
  385. .cfi_endproc
  386. .size aesni_gcm_decrypt,.-aesni_gcm_decrypt
  387. .type _aesni_ctr32_6x,@function
  388. .align 32
  389. _aesni_ctr32_6x:
  390. .cfi_startproc
  391. vmovdqu 0-128(%rcx),%xmm4
  392. vmovdqu 32(%r11),%xmm2
  393. leaq -1(%rbp),%r13
  394. vmovups 16-128(%rcx),%xmm15
  395. leaq 32-128(%rcx),%r12
  396. vpxor %xmm4,%xmm1,%xmm9
  397. addl $100663296,%ebx
  398. jc .Lhandle_ctr32_2
  399. vpaddb %xmm2,%xmm1,%xmm10
  400. vpaddb %xmm2,%xmm10,%xmm11
  401. vpxor %xmm4,%xmm10,%xmm10
  402. vpaddb %xmm2,%xmm11,%xmm12
  403. vpxor %xmm4,%xmm11,%xmm11
  404. vpaddb %xmm2,%xmm12,%xmm13
  405. vpxor %xmm4,%xmm12,%xmm12
  406. vpaddb %xmm2,%xmm13,%xmm14
  407. vpxor %xmm4,%xmm13,%xmm13
  408. vpaddb %xmm2,%xmm14,%xmm1
  409. vpxor %xmm4,%xmm14,%xmm14
  410. jmp .Loop_ctr32
  411. .align 16
  412. .Loop_ctr32:
  413. vaesenc %xmm15,%xmm9,%xmm9
  414. vaesenc %xmm15,%xmm10,%xmm10
  415. vaesenc %xmm15,%xmm11,%xmm11
  416. vaesenc %xmm15,%xmm12,%xmm12
  417. vaesenc %xmm15,%xmm13,%xmm13
  418. vaesenc %xmm15,%xmm14,%xmm14
  419. vmovups (%r12),%xmm15
  420. leaq 16(%r12),%r12
  421. decl %r13d
  422. jnz .Loop_ctr32
  423. vmovdqu (%r12),%xmm3
  424. vaesenc %xmm15,%xmm9,%xmm9
  425. vpxor 0(%rdi),%xmm3,%xmm4
  426. vaesenc %xmm15,%xmm10,%xmm10
  427. vpxor 16(%rdi),%xmm3,%xmm5
  428. vaesenc %xmm15,%xmm11,%xmm11
  429. vpxor 32(%rdi),%xmm3,%xmm6
  430. vaesenc %xmm15,%xmm12,%xmm12
  431. vpxor 48(%rdi),%xmm3,%xmm8
  432. vaesenc %xmm15,%xmm13,%xmm13
  433. vpxor 64(%rdi),%xmm3,%xmm2
  434. vaesenc %xmm15,%xmm14,%xmm14
  435. vpxor 80(%rdi),%xmm3,%xmm3
  436. leaq 96(%rdi),%rdi
  437. vaesenclast %xmm4,%xmm9,%xmm9
  438. vaesenclast %xmm5,%xmm10,%xmm10
  439. vaesenclast %xmm6,%xmm11,%xmm11
  440. vaesenclast %xmm8,%xmm12,%xmm12
  441. vaesenclast %xmm2,%xmm13,%xmm13
  442. vaesenclast %xmm3,%xmm14,%xmm14
  443. vmovups %xmm9,0(%rsi)
  444. vmovups %xmm10,16(%rsi)
  445. vmovups %xmm11,32(%rsi)
  446. vmovups %xmm12,48(%rsi)
  447. vmovups %xmm13,64(%rsi)
  448. vmovups %xmm14,80(%rsi)
  449. leaq 96(%rsi),%rsi
  450. .byte 0xf3,0xc3
  451. .align 32
  452. .Lhandle_ctr32_2:
  453. vpshufb %xmm0,%xmm1,%xmm6
  454. vmovdqu 48(%r11),%xmm5
  455. vpaddd 64(%r11),%xmm6,%xmm10
  456. vpaddd %xmm5,%xmm6,%xmm11
  457. vpaddd %xmm5,%xmm10,%xmm12
  458. vpshufb %xmm0,%xmm10,%xmm10
  459. vpaddd %xmm5,%xmm11,%xmm13
  460. vpshufb %xmm0,%xmm11,%xmm11
  461. vpxor %xmm4,%xmm10,%xmm10
  462. vpaddd %xmm5,%xmm12,%xmm14
  463. vpshufb %xmm0,%xmm12,%xmm12
  464. vpxor %xmm4,%xmm11,%xmm11
  465. vpaddd %xmm5,%xmm13,%xmm1
  466. vpshufb %xmm0,%xmm13,%xmm13
  467. vpxor %xmm4,%xmm12,%xmm12
  468. vpshufb %xmm0,%xmm14,%xmm14
  469. vpxor %xmm4,%xmm13,%xmm13
  470. vpshufb %xmm0,%xmm1,%xmm1
  471. vpxor %xmm4,%xmm14,%xmm14
  472. jmp .Loop_ctr32
  473. .cfi_endproc
  474. .size _aesni_ctr32_6x,.-_aesni_ctr32_6x
  475. .globl aesni_gcm_encrypt
  476. .type aesni_gcm_encrypt,@function
  477. .align 32
  478. aesni_gcm_encrypt:
  479. .cfi_startproc
  480. xorq %r10,%r10
  481. cmpq $288,%rdx
  482. jb .Lgcm_enc_abort
  483. leaq (%rsp),%rax
  484. .cfi_def_cfa_register %rax
  485. pushq %rbx
  486. .cfi_offset %rbx,-16
  487. pushq %rbp
  488. .cfi_offset %rbp,-24
  489. pushq %r12
  490. .cfi_offset %r12,-32
  491. pushq %r13
  492. .cfi_offset %r13,-40
  493. pushq %r14
  494. .cfi_offset %r14,-48
  495. pushq %r15
  496. .cfi_offset %r15,-56
  497. vzeroupper
  498. vmovdqu (%r8),%xmm1
  499. addq $-128,%rsp
  500. movl 12(%r8),%ebx
  501. leaq .Lbswap_mask(%rip),%r11
  502. leaq -128(%rcx),%r14
  503. movq $0xf80,%r15
  504. leaq 128(%rcx),%rcx
  505. vmovdqu (%r11),%xmm0
  506. andq $-128,%rsp
  507. movl 240-128(%rcx),%ebp
  508. andq %r15,%r14
  509. andq %rsp,%r15
  510. subq %r14,%r15
  511. jc .Lenc_no_key_aliasing
  512. cmpq $768,%r15
  513. jnc .Lenc_no_key_aliasing
  514. subq %r15,%rsp
  515. .Lenc_no_key_aliasing:
  516. leaq (%rsi),%r14
  517. leaq -192(%rsi,%rdx,1),%r15
  518. shrq $4,%rdx
  519. call _aesni_ctr32_6x
  520. vpshufb %xmm0,%xmm9,%xmm8
  521. vpshufb %xmm0,%xmm10,%xmm2
  522. vmovdqu %xmm8,112(%rsp)
  523. vpshufb %xmm0,%xmm11,%xmm4
  524. vmovdqu %xmm2,96(%rsp)
  525. vpshufb %xmm0,%xmm12,%xmm5
  526. vmovdqu %xmm4,80(%rsp)
  527. vpshufb %xmm0,%xmm13,%xmm6
  528. vmovdqu %xmm5,64(%rsp)
  529. vpshufb %xmm0,%xmm14,%xmm7
  530. vmovdqu %xmm6,48(%rsp)
  531. call _aesni_ctr32_6x
  532. vmovdqu (%r9),%xmm8
  533. leaq 32+32(%r9),%r9
  534. subq $12,%rdx
  535. movq $192,%r10
  536. vpshufb %xmm0,%xmm8,%xmm8
  537. call _aesni_ctr32_ghash_6x
  538. vmovdqu 32(%rsp),%xmm7
  539. vmovdqu (%r11),%xmm0
  540. vmovdqu 0-32(%r9),%xmm3
  541. vpunpckhqdq %xmm7,%xmm7,%xmm1
  542. vmovdqu 32-32(%r9),%xmm15
  543. vmovups %xmm9,-96(%rsi)
  544. vpshufb %xmm0,%xmm9,%xmm9
  545. vpxor %xmm7,%xmm1,%xmm1
  546. vmovups %xmm10,-80(%rsi)
  547. vpshufb %xmm0,%xmm10,%xmm10
  548. vmovups %xmm11,-64(%rsi)
  549. vpshufb %xmm0,%xmm11,%xmm11
  550. vmovups %xmm12,-48(%rsi)
  551. vpshufb %xmm0,%xmm12,%xmm12
  552. vmovups %xmm13,-32(%rsi)
  553. vpshufb %xmm0,%xmm13,%xmm13
  554. vmovups %xmm14,-16(%rsi)
  555. vpshufb %xmm0,%xmm14,%xmm14
  556. vmovdqu %xmm9,16(%rsp)
  557. vmovdqu 48(%rsp),%xmm6
  558. vmovdqu 16-32(%r9),%xmm0
  559. vpunpckhqdq %xmm6,%xmm6,%xmm2
  560. vpclmulqdq $0x00,%xmm3,%xmm7,%xmm5
  561. vpxor %xmm6,%xmm2,%xmm2
  562. vpclmulqdq $0x11,%xmm3,%xmm7,%xmm7
  563. vpclmulqdq $0x00,%xmm15,%xmm1,%xmm1
  564. vmovdqu 64(%rsp),%xmm9
  565. vpclmulqdq $0x00,%xmm0,%xmm6,%xmm4
  566. vmovdqu 48-32(%r9),%xmm3
  567. vpxor %xmm5,%xmm4,%xmm4
  568. vpunpckhqdq %xmm9,%xmm9,%xmm5
  569. vpclmulqdq $0x11,%xmm0,%xmm6,%xmm6
  570. vpxor %xmm9,%xmm5,%xmm5
  571. vpxor %xmm7,%xmm6,%xmm6
  572. vpclmulqdq $0x10,%xmm15,%xmm2,%xmm2
  573. vmovdqu 80-32(%r9),%xmm15
  574. vpxor %xmm1,%xmm2,%xmm2
  575. vmovdqu 80(%rsp),%xmm1
  576. vpclmulqdq $0x00,%xmm3,%xmm9,%xmm7
  577. vmovdqu 64-32(%r9),%xmm0
  578. vpxor %xmm4,%xmm7,%xmm7
  579. vpunpckhqdq %xmm1,%xmm1,%xmm4
  580. vpclmulqdq $0x11,%xmm3,%xmm9,%xmm9
  581. vpxor %xmm1,%xmm4,%xmm4
  582. vpxor %xmm6,%xmm9,%xmm9
  583. vpclmulqdq $0x00,%xmm15,%xmm5,%xmm5
  584. vpxor %xmm2,%xmm5,%xmm5
  585. vmovdqu 96(%rsp),%xmm2
  586. vpclmulqdq $0x00,%xmm0,%xmm1,%xmm6
  587. vmovdqu 96-32(%r9),%xmm3
  588. vpxor %xmm7,%xmm6,%xmm6
  589. vpunpckhqdq %xmm2,%xmm2,%xmm7
  590. vpclmulqdq $0x11,%xmm0,%xmm1,%xmm1
  591. vpxor %xmm2,%xmm7,%xmm7
  592. vpxor %xmm9,%xmm1,%xmm1
  593. vpclmulqdq $0x10,%xmm15,%xmm4,%xmm4
  594. vmovdqu 128-32(%r9),%xmm15
  595. vpxor %xmm5,%xmm4,%xmm4
  596. vpxor 112(%rsp),%xmm8,%xmm8
  597. vpclmulqdq $0x00,%xmm3,%xmm2,%xmm5
  598. vmovdqu 112-32(%r9),%xmm0
  599. vpunpckhqdq %xmm8,%xmm8,%xmm9
  600. vpxor %xmm6,%xmm5,%xmm5
  601. vpclmulqdq $0x11,%xmm3,%xmm2,%xmm2
  602. vpxor %xmm8,%xmm9,%xmm9
  603. vpxor %xmm1,%xmm2,%xmm2
  604. vpclmulqdq $0x00,%xmm15,%xmm7,%xmm7
  605. vpxor %xmm4,%xmm7,%xmm4
  606. vpclmulqdq $0x00,%xmm0,%xmm8,%xmm6
  607. vmovdqu 0-32(%r9),%xmm3
  608. vpunpckhqdq %xmm14,%xmm14,%xmm1
  609. vpclmulqdq $0x11,%xmm0,%xmm8,%xmm8
  610. vpxor %xmm14,%xmm1,%xmm1
  611. vpxor %xmm5,%xmm6,%xmm5
  612. vpclmulqdq $0x10,%xmm15,%xmm9,%xmm9
  613. vmovdqu 32-32(%r9),%xmm15
  614. vpxor %xmm2,%xmm8,%xmm7
  615. vpxor %xmm4,%xmm9,%xmm6
  616. vmovdqu 16-32(%r9),%xmm0
  617. vpxor %xmm5,%xmm7,%xmm9
  618. vpclmulqdq $0x00,%xmm3,%xmm14,%xmm4
  619. vpxor %xmm9,%xmm6,%xmm6
  620. vpunpckhqdq %xmm13,%xmm13,%xmm2
  621. vpclmulqdq $0x11,%xmm3,%xmm14,%xmm14
  622. vpxor %xmm13,%xmm2,%xmm2
  623. vpslldq $8,%xmm6,%xmm9
  624. vpclmulqdq $0x00,%xmm15,%xmm1,%xmm1
  625. vpxor %xmm9,%xmm5,%xmm8
  626. vpsrldq $8,%xmm6,%xmm6
  627. vpxor %xmm6,%xmm7,%xmm7
  628. vpclmulqdq $0x00,%xmm0,%xmm13,%xmm5
  629. vmovdqu 48-32(%r9),%xmm3
  630. vpxor %xmm4,%xmm5,%xmm5
  631. vpunpckhqdq %xmm12,%xmm12,%xmm9
  632. vpclmulqdq $0x11,%xmm0,%xmm13,%xmm13
  633. vpxor %xmm12,%xmm9,%xmm9
  634. vpxor %xmm14,%xmm13,%xmm13
  635. vpalignr $8,%xmm8,%xmm8,%xmm14
  636. vpclmulqdq $0x10,%xmm15,%xmm2,%xmm2
  637. vmovdqu 80-32(%r9),%xmm15
  638. vpxor %xmm1,%xmm2,%xmm2
  639. vpclmulqdq $0x00,%xmm3,%xmm12,%xmm4
  640. vmovdqu 64-32(%r9),%xmm0
  641. vpxor %xmm5,%xmm4,%xmm4
  642. vpunpckhqdq %xmm11,%xmm11,%xmm1
  643. vpclmulqdq $0x11,%xmm3,%xmm12,%xmm12
  644. vpxor %xmm11,%xmm1,%xmm1
  645. vpxor %xmm13,%xmm12,%xmm12
  646. vxorps 16(%rsp),%xmm7,%xmm7
  647. vpclmulqdq $0x00,%xmm15,%xmm9,%xmm9
  648. vpxor %xmm2,%xmm9,%xmm9
  649. vpclmulqdq $0x10,16(%r11),%xmm8,%xmm8
  650. vxorps %xmm14,%xmm8,%xmm8
  651. vpclmulqdq $0x00,%xmm0,%xmm11,%xmm5
  652. vmovdqu 96-32(%r9),%xmm3
  653. vpxor %xmm4,%xmm5,%xmm5
  654. vpunpckhqdq %xmm10,%xmm10,%xmm2
  655. vpclmulqdq $0x11,%xmm0,%xmm11,%xmm11
  656. vpxor %xmm10,%xmm2,%xmm2
  657. vpalignr $8,%xmm8,%xmm8,%xmm14
  658. vpxor %xmm12,%xmm11,%xmm11
  659. vpclmulqdq $0x10,%xmm15,%xmm1,%xmm1
  660. vmovdqu 128-32(%r9),%xmm15
  661. vpxor %xmm9,%xmm1,%xmm1
  662. vxorps %xmm7,%xmm14,%xmm14
  663. vpclmulqdq $0x10,16(%r11),%xmm8,%xmm8
  664. vxorps %xmm14,%xmm8,%xmm8
  665. vpclmulqdq $0x00,%xmm3,%xmm10,%xmm4
  666. vmovdqu 112-32(%r9),%xmm0
  667. vpxor %xmm5,%xmm4,%xmm4
  668. vpunpckhqdq %xmm8,%xmm8,%xmm9
  669. vpclmulqdq $0x11,%xmm3,%xmm10,%xmm10
  670. vpxor %xmm8,%xmm9,%xmm9
  671. vpxor %xmm11,%xmm10,%xmm10
  672. vpclmulqdq $0x00,%xmm15,%xmm2,%xmm2
  673. vpxor %xmm1,%xmm2,%xmm2
  674. vpclmulqdq $0x00,%xmm0,%xmm8,%xmm5
  675. vpclmulqdq $0x11,%xmm0,%xmm8,%xmm7
  676. vpxor %xmm4,%xmm5,%xmm5
  677. vpclmulqdq $0x10,%xmm15,%xmm9,%xmm6
  678. vpxor %xmm10,%xmm7,%xmm7
  679. vpxor %xmm2,%xmm6,%xmm6
  680. vpxor %xmm5,%xmm7,%xmm4
  681. vpxor %xmm4,%xmm6,%xmm6
  682. vpslldq $8,%xmm6,%xmm1
  683. vmovdqu 16(%r11),%xmm3
  684. vpsrldq $8,%xmm6,%xmm6
  685. vpxor %xmm1,%xmm5,%xmm8
  686. vpxor %xmm6,%xmm7,%xmm7
  687. vpalignr $8,%xmm8,%xmm8,%xmm2
  688. vpclmulqdq $0x10,%xmm3,%xmm8,%xmm8
  689. vpxor %xmm2,%xmm8,%xmm8
  690. vpalignr $8,%xmm8,%xmm8,%xmm2
  691. vpclmulqdq $0x10,%xmm3,%xmm8,%xmm8
  692. vpxor %xmm7,%xmm2,%xmm2
  693. vpxor %xmm2,%xmm8,%xmm8
  694. vpshufb (%r11),%xmm8,%xmm8
  695. vmovdqu %xmm8,-64(%r9)
  696. vzeroupper
  697. movq -48(%rax),%r15
  698. .cfi_restore %r15
  699. movq -40(%rax),%r14
  700. .cfi_restore %r14
  701. movq -32(%rax),%r13
  702. .cfi_restore %r13
  703. movq -24(%rax),%r12
  704. .cfi_restore %r12
  705. movq -16(%rax),%rbp
  706. .cfi_restore %rbp
  707. movq -8(%rax),%rbx
  708. .cfi_restore %rbx
  709. leaq (%rax),%rsp
  710. .cfi_def_cfa_register %rsp
  711. .Lgcm_enc_abort:
  712. movq %r10,%rax
  713. .byte 0xf3,0xc3
  714. .cfi_endproc
  715. .size aesni_gcm_encrypt,.-aesni_gcm_encrypt
  716. .align 64
  717. .Lbswap_mask:
  718. .byte 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
  719. .Lpoly:
  720. .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2
  721. .Lone_msb:
  722. .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
  723. .Ltwo_lsb:
  724. .byte 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  725. .Lone_lsb:
  726. .byte 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  727. .byte 65,69,83,45,78,73,32,71,67,77,32,109,111,100,117,108,101,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
  728. .align 64