aesni-gcm-x86_64.s 17 KB

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