aes_ni.S 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816
  1. /* aes_asm.s
  2. *
  3. * Copyright (C) 2006-2014 wolfSSL Inc.
  4. *
  5. * This file is part of CyaSSL.
  6. *
  7. * CyaSSL is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * CyaSSL is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
  20. */
  21. /* See Intel® Advanced Encryption Standard (AES) Instructions Set White Paper
  22. * by Intel Mobility Group, Israel Development Center, Israel Shay Gueron
  23. */
  24. /* This file is in at&t asm syntax, see .asm for intel syntax */
  25. /*
  26. AES_CBC_encrypt (const unsigned char *in,
  27. unsigned char *out,
  28. unsigned char ivec[16],
  29. unsigned long length,
  30. const unsigned char *KS,
  31. int nr)
  32. */
  33. .globl AES_CBC_encrypt
  34. AES_CBC_encrypt:
  35. # parameter 1: %rdi
  36. # parameter 2: %rsi
  37. # parameter 3: %rdx
  38. # parameter 4: %rcx
  39. # parameter 5: %r8
  40. # parameter 6: %r9d
  41. movq %rcx, %r10
  42. shrq $4, %rcx
  43. shlq $60, %r10
  44. je NO_PARTS
  45. addq $1, %rcx
  46. NO_PARTS:
  47. subq $16, %rsi
  48. movdqa (%rdx), %xmm1
  49. LOOP:
  50. pxor (%rdi), %xmm1
  51. pxor (%r8), %xmm1
  52. addq $16,%rsi
  53. addq $16,%rdi
  54. cmpl $12, %r9d
  55. aesenc 16(%r8),%xmm1
  56. aesenc 32(%r8),%xmm1
  57. aesenc 48(%r8),%xmm1
  58. aesenc 64(%r8),%xmm1
  59. aesenc 80(%r8),%xmm1
  60. aesenc 96(%r8),%xmm1
  61. aesenc 112(%r8),%xmm1
  62. aesenc 128(%r8),%xmm1
  63. aesenc 144(%r8),%xmm1
  64. movdqa 160(%r8),%xmm2
  65. jb LAST
  66. cmpl $14, %r9d
  67. aesenc 160(%r8),%xmm1
  68. aesenc 176(%r8),%xmm1
  69. movdqa 192(%r8),%xmm2
  70. jb LAST
  71. aesenc 192(%r8),%xmm1
  72. aesenc 208(%r8),%xmm1
  73. movdqa 224(%r8),%xmm2
  74. LAST:
  75. decq %rcx
  76. aesenclast %xmm2,%xmm1
  77. movdqu %xmm1,(%rsi)
  78. jne LOOP
  79. ret
  80. /*
  81. AES_CBC_decrypt (const unsigned char *in,
  82. unsigned char *out,
  83. unsigned char ivec[16],
  84. unsigned long length,
  85. const unsigned char *KS,
  86. int nr)
  87. */
  88. .globl AES_CBC_decrypt
  89. AES_CBC_decrypt:
  90. # parameter 1: %rdi
  91. # parameter 2: %rsi
  92. # parameter 3: %rdx
  93. # parameter 4: %rcx
  94. # parameter 5: %r8
  95. # parameter 6: %r9d
  96. movq %rcx, %r10
  97. shrq $4, %rcx
  98. shlq $60, %r10
  99. je DNO_PARTS_4
  100. addq $1, %rcx
  101. DNO_PARTS_4:
  102. movq %rcx, %r10
  103. shlq $62, %r10
  104. shrq $62, %r10
  105. shrq $2, %rcx
  106. movdqu (%rdx),%xmm5
  107. je DREMAINDER_4
  108. subq $64, %rsi
  109. DLOOP_4:
  110. movdqu (%rdi), %xmm1
  111. movdqu 16(%rdi), %xmm2
  112. movdqu 32(%rdi), %xmm3
  113. movdqu 48(%rdi), %xmm4
  114. movdqa %xmm1, %xmm6
  115. movdqa %xmm2, %xmm7
  116. movdqa %xmm3, %xmm8
  117. movdqa %xmm4, %xmm15
  118. movdqa (%r8), %xmm9
  119. movdqa 16(%r8), %xmm10
  120. movdqa 32(%r8), %xmm11
  121. movdqa 48(%r8), %xmm12
  122. pxor %xmm9, %xmm1
  123. pxor %xmm9, %xmm2
  124. pxor %xmm9, %xmm3
  125. pxor %xmm9, %xmm4
  126. aesdec %xmm10, %xmm1
  127. aesdec %xmm10, %xmm2
  128. aesdec %xmm10, %xmm3
  129. aesdec %xmm10, %xmm4
  130. aesdec %xmm11, %xmm1
  131. aesdec %xmm11, %xmm2
  132. aesdec %xmm11, %xmm3
  133. aesdec %xmm11, %xmm4
  134. aesdec %xmm12, %xmm1
  135. aesdec %xmm12, %xmm2
  136. aesdec %xmm12, %xmm3
  137. aesdec %xmm12, %xmm4
  138. movdqa 64(%r8), %xmm9
  139. movdqa 80(%r8), %xmm10
  140. movdqa 96(%r8), %xmm11
  141. movdqa 112(%r8), %xmm12
  142. aesdec %xmm9, %xmm1
  143. aesdec %xmm9, %xmm2
  144. aesdec %xmm9, %xmm3
  145. aesdec %xmm9, %xmm4
  146. aesdec %xmm10, %xmm1
  147. aesdec %xmm10, %xmm2
  148. aesdec %xmm10, %xmm3
  149. aesdec %xmm10, %xmm4
  150. aesdec %xmm11, %xmm1
  151. aesdec %xmm11, %xmm2
  152. aesdec %xmm11, %xmm3
  153. aesdec %xmm11, %xmm4
  154. aesdec %xmm12, %xmm1
  155. aesdec %xmm12, %xmm2
  156. aesdec %xmm12, %xmm3
  157. aesdec %xmm12, %xmm4
  158. movdqa 128(%r8), %xmm9
  159. movdqa 144(%r8), %xmm10
  160. movdqa 160(%r8), %xmm11
  161. cmpl $12, %r9d
  162. aesdec %xmm9, %xmm1
  163. aesdec %xmm9, %xmm2
  164. aesdec %xmm9, %xmm3
  165. aesdec %xmm9, %xmm4
  166. aesdec %xmm10, %xmm1
  167. aesdec %xmm10, %xmm2
  168. aesdec %xmm10, %xmm3
  169. aesdec %xmm10, %xmm4
  170. jb DLAST_4
  171. movdqa 160(%r8), %xmm9
  172. movdqa 176(%r8), %xmm10
  173. movdqa 192(%r8), %xmm11
  174. cmpl $14, %r9d
  175. aesdec %xmm9, %xmm1
  176. aesdec %xmm9, %xmm2
  177. aesdec %xmm9, %xmm3
  178. aesdec %xmm9, %xmm4
  179. aesdec %xmm10, %xmm1
  180. aesdec %xmm10, %xmm2
  181. aesdec %xmm10, %xmm3
  182. aesdec %xmm10, %xmm4
  183. jb DLAST_4
  184. movdqa 192(%r8), %xmm9
  185. movdqa 208(%r8), %xmm10
  186. movdqa 224(%r8), %xmm11
  187. aesdec %xmm9, %xmm1
  188. aesdec %xmm9, %xmm2
  189. aesdec %xmm9, %xmm3
  190. aesdec %xmm9, %xmm4
  191. aesdec %xmm10, %xmm1
  192. aesdec %xmm10, %xmm2
  193. aesdec %xmm10, %xmm3
  194. aesdec %xmm10, %xmm4
  195. DLAST_4:
  196. addq $64, %rdi
  197. addq $64, %rsi
  198. decq %rcx
  199. aesdeclast %xmm11, %xmm1
  200. aesdeclast %xmm11, %xmm2
  201. aesdeclast %xmm11, %xmm3
  202. aesdeclast %xmm11, %xmm4
  203. pxor %xmm5 ,%xmm1
  204. pxor %xmm6 ,%xmm2
  205. pxor %xmm7 ,%xmm3
  206. pxor %xmm8 ,%xmm4
  207. movdqu %xmm1, (%rsi)
  208. movdqu %xmm2, 16(%rsi)
  209. movdqu %xmm3, 32(%rsi)
  210. movdqu %xmm4, 48(%rsi)
  211. movdqa %xmm15,%xmm5
  212. jne DLOOP_4
  213. addq $64, %rsi
  214. DREMAINDER_4:
  215. cmpq $0, %r10
  216. je DEND_4
  217. DLOOP_4_2:
  218. movdqu (%rdi), %xmm1
  219. movdqa %xmm1 ,%xmm15
  220. addq $16, %rdi
  221. pxor (%r8), %xmm1
  222. movdqu 160(%r8), %xmm2
  223. cmpl $12, %r9d
  224. aesdec 16(%r8), %xmm1
  225. aesdec 32(%r8), %xmm1
  226. aesdec 48(%r8), %xmm1
  227. aesdec 64(%r8), %xmm1
  228. aesdec 80(%r8), %xmm1
  229. aesdec 96(%r8), %xmm1
  230. aesdec 112(%r8), %xmm1
  231. aesdec 128(%r8), %xmm1
  232. aesdec 144(%r8), %xmm1
  233. jb DLAST_4_2
  234. movdqu 192(%r8), %xmm2
  235. cmpl $14, %r9d
  236. aesdec 160(%r8), %xmm1
  237. aesdec 176(%r8), %xmm1
  238. jb DLAST_4_2
  239. movdqu 224(%r8), %xmm2
  240. aesdec 192(%r8), %xmm1
  241. aesdec 208(%r8), %xmm1
  242. DLAST_4_2:
  243. aesdeclast %xmm2, %xmm1
  244. pxor %xmm5, %xmm1
  245. movdqa %xmm15, %xmm5
  246. movdqu %xmm1, (%rsi)
  247. addq $16, %rsi
  248. decq %r10
  249. jne DLOOP_4_2
  250. DEND_4:
  251. ret
  252. /*
  253. AES_ECB_encrypt (const unsigned char *in,
  254. unsigned char *out,
  255. unsigned long length,
  256. const unsigned char *KS,
  257. int nr)
  258. */
  259. .globl AES_ECB_encrypt
  260. AES_ECB_encrypt:
  261. # parameter 1: %rdi
  262. # parameter 2: %rsi
  263. # parameter 3: %rdx
  264. # parameter 4: %rcx
  265. # parameter 5: %r8d
  266. movq %rdx, %r10
  267. shrq $4, %rdx
  268. shlq $60, %r10
  269. je EECB_NO_PARTS_4
  270. addq $1, %rdx
  271. EECB_NO_PARTS_4:
  272. movq %rdx, %r10
  273. shlq $62, %r10
  274. shrq $62, %r10
  275. shrq $2, %rdx
  276. je EECB_REMAINDER_4
  277. subq $64, %rsi
  278. EECB_LOOP_4:
  279. movdqu (%rdi), %xmm1
  280. movdqu 16(%rdi), %xmm2
  281. movdqu 32(%rdi), %xmm3
  282. movdqu 48(%rdi), %xmm4
  283. movdqa (%rcx), %xmm9
  284. movdqa 16(%rcx), %xmm10
  285. movdqa 32(%rcx), %xmm11
  286. movdqa 48(%rcx), %xmm12
  287. pxor %xmm9, %xmm1
  288. pxor %xmm9, %xmm2
  289. pxor %xmm9, %xmm3
  290. pxor %xmm9, %xmm4
  291. aesenc %xmm10, %xmm1
  292. aesenc %xmm10, %xmm2
  293. aesenc %xmm10, %xmm3
  294. aesenc %xmm10, %xmm4
  295. aesenc %xmm11, %xmm1
  296. aesenc %xmm11, %xmm2
  297. aesenc %xmm11, %xmm3
  298. aesenc %xmm11, %xmm4
  299. aesenc %xmm12, %xmm1
  300. aesenc %xmm12, %xmm2
  301. aesenc %xmm12, %xmm3
  302. aesenc %xmm12, %xmm4
  303. movdqa 64(%rcx), %xmm9
  304. movdqa 80(%rcx), %xmm10
  305. movdqa 96(%rcx), %xmm11
  306. movdqa 112(%rcx), %xmm12
  307. aesenc %xmm9, %xmm1
  308. aesenc %xmm9, %xmm2
  309. aesenc %xmm9, %xmm3
  310. aesenc %xmm9, %xmm4
  311. aesenc %xmm10, %xmm1
  312. aesenc %xmm10, %xmm2
  313. aesenc %xmm10, %xmm3
  314. aesenc %xmm10, %xmm4
  315. aesenc %xmm11, %xmm1
  316. aesenc %xmm11, %xmm2
  317. aesenc %xmm11, %xmm3
  318. aesenc %xmm11, %xmm4
  319. aesenc %xmm12, %xmm1
  320. aesenc %xmm12, %xmm2
  321. aesenc %xmm12, %xmm3
  322. aesenc %xmm12, %xmm4
  323. movdqa 128(%rcx), %xmm9
  324. movdqa 144(%rcx), %xmm10
  325. movdqa 160(%rcx), %xmm11
  326. cmpl $12, %r8d
  327. aesenc %xmm9, %xmm1
  328. aesenc %xmm9, %xmm2
  329. aesenc %xmm9, %xmm3
  330. aesenc %xmm9, %xmm4
  331. aesenc %xmm10, %xmm1
  332. aesenc %xmm10, %xmm2
  333. aesenc %xmm10, %xmm3
  334. aesenc %xmm10, %xmm4
  335. jb EECB_LAST_4
  336. movdqa 160(%rcx), %xmm9
  337. movdqa 176(%rcx), %xmm10
  338. movdqa 192(%rcx), %xmm11
  339. cmpl $14, %r8d
  340. aesenc %xmm9, %xmm1
  341. aesenc %xmm9, %xmm2
  342. aesenc %xmm9, %xmm3
  343. aesenc %xmm9, %xmm4
  344. aesenc %xmm10, %xmm1
  345. aesenc %xmm10, %xmm2
  346. aesenc %xmm10, %xmm3
  347. aesenc %xmm10, %xmm4
  348. jb EECB_LAST_4
  349. movdqa 192(%rcx), %xmm9
  350. movdqa 208(%rcx), %xmm10
  351. movdqa 224(%rcx), %xmm11
  352. aesenc %xmm9, %xmm1
  353. aesenc %xmm9, %xmm2
  354. aesenc %xmm9, %xmm3
  355. aesenc %xmm9, %xmm4
  356. aesenc %xmm10, %xmm1
  357. aesenc %xmm10, %xmm2
  358. aesenc %xmm10, %xmm3
  359. aesenc %xmm10, %xmm4
  360. EECB_LAST_4:
  361. addq $64, %rdi
  362. addq $64, %rsi
  363. decq %rdx
  364. aesenclast %xmm11, %xmm1
  365. aesenclast %xmm11, %xmm2
  366. aesenclast %xmm11, %xmm3
  367. aesenclast %xmm11, %xmm4
  368. movdqu %xmm1, (%rsi)
  369. movdqu %xmm2, 16(%rsi)
  370. movdqu %xmm3, 32(%rsi)
  371. movdqu %xmm4, 48(%rsi)
  372. jne EECB_LOOP_4
  373. addq $64, %rsi
  374. EECB_REMAINDER_4:
  375. cmpq $0, %r10
  376. je EECB_END_4
  377. EECB_LOOP_4_2:
  378. movdqu (%rdi), %xmm1
  379. addq $16, %rdi
  380. pxor (%rcx), %xmm1
  381. movdqu 160(%rcx), %xmm2
  382. aesenc 16(%rcx), %xmm1
  383. aesenc 32(%rcx), %xmm1
  384. aesenc 48(%rcx), %xmm1
  385. aesenc 64(%rcx), %xmm1
  386. aesenc 80(%rcx), %xmm1
  387. aesenc 96(%rcx), %xmm1
  388. aesenc 112(%rcx), %xmm1
  389. aesenc 128(%rcx), %xmm1
  390. aesenc 144(%rcx), %xmm1
  391. cmpl $12, %r8d
  392. jb EECB_LAST_4_2
  393. movdqu 192(%rcx), %xmm2
  394. aesenc 160(%rcx), %xmm1
  395. aesenc 176(%rcx), %xmm1
  396. cmpl $14, %r8d
  397. jb EECB_LAST_4_2
  398. movdqu 224(%rcx), %xmm2
  399. aesenc 192(%rcx), %xmm1
  400. aesenc 208(%rcx), %xmm1
  401. EECB_LAST_4_2:
  402. aesenclast %xmm2, %xmm1
  403. movdqu %xmm1, (%rsi)
  404. addq $16, %rsi
  405. decq %r10
  406. jne EECB_LOOP_4_2
  407. EECB_END_4:
  408. ret
  409. /*
  410. AES_ECB_decrypt (const unsigned char *in,
  411. unsigned char *out,
  412. unsigned long length,
  413. const unsigned char *KS,
  414. int nr)
  415. */
  416. .globl AES_ECB_decrypt
  417. AES_ECB_decrypt:
  418. # parameter 1: %rdi
  419. # parameter 2: %rsi
  420. # parameter 3: %rdx
  421. # parameter 4: %rcx
  422. # parameter 5: %r8d
  423. movq %rdx, %r10
  424. shrq $4, %rdx
  425. shlq $60, %r10
  426. je DECB_NO_PARTS_4
  427. addq $1, %rdx
  428. DECB_NO_PARTS_4:
  429. movq %rdx, %r10
  430. shlq $62, %r10
  431. shrq $62, %r10
  432. shrq $2, %rdx
  433. je DECB_REMAINDER_4
  434. subq $64, %rsi
  435. DECB_LOOP_4:
  436. movdqu (%rdi), %xmm1
  437. movdqu 16(%rdi), %xmm2
  438. movdqu 32(%rdi), %xmm3
  439. movdqu 48(%rdi), %xmm4
  440. movdqa (%rcx), %xmm9
  441. movdqa 16(%rcx), %xmm10
  442. movdqa 32(%rcx), %xmm11
  443. movdqa 48(%rcx), %xmm12
  444. pxor %xmm9, %xmm1
  445. pxor %xmm9, %xmm2
  446. pxor %xmm9, %xmm3
  447. pxor %xmm9, %xmm4
  448. aesdec %xmm10, %xmm1
  449. aesdec %xmm10, %xmm2
  450. aesdec %xmm10, %xmm3
  451. aesdec %xmm10, %xmm4
  452. aesdec %xmm11, %xmm1
  453. aesdec %xmm11, %xmm2
  454. aesdec %xmm11, %xmm3
  455. aesdec %xmm11, %xmm4
  456. aesdec %xmm12, %xmm1
  457. aesdec %xmm12, %xmm2
  458. aesdec %xmm12, %xmm3
  459. aesdec %xmm12, %xmm4
  460. movdqa 64(%rcx), %xmm9
  461. movdqa 80(%rcx), %xmm10
  462. movdqa 96(%rcx), %xmm11
  463. movdqa 112(%rcx), %xmm12
  464. aesdec %xmm9, %xmm1
  465. aesdec %xmm9, %xmm2
  466. aesdec %xmm9, %xmm3
  467. aesdec %xmm9, %xmm4
  468. aesdec %xmm10, %xmm1
  469. aesdec %xmm10, %xmm2
  470. aesdec %xmm10, %xmm3
  471. aesdec %xmm10, %xmm4
  472. aesdec %xmm11, %xmm1
  473. aesdec %xmm11, %xmm2
  474. aesdec %xmm11, %xmm3
  475. aesdec %xmm11, %xmm4
  476. aesdec %xmm12, %xmm1
  477. aesdec %xmm12, %xmm2
  478. aesdec %xmm12, %xmm3
  479. aesdec %xmm12, %xmm4
  480. movdqa 128(%rcx), %xmm9
  481. movdqa 144(%rcx), %xmm10
  482. movdqa 160(%rcx), %xmm11
  483. cmpl $12, %r8d
  484. aesdec %xmm9, %xmm1
  485. aesdec %xmm9, %xmm2
  486. aesdec %xmm9, %xmm3
  487. aesdec %xmm9, %xmm4
  488. aesdec %xmm10, %xmm1
  489. aesdec %xmm10, %xmm2
  490. aesdec %xmm10, %xmm3
  491. aesdec %xmm10, %xmm4
  492. jb DECB_LAST_4
  493. movdqa 160(%rcx), %xmm9
  494. movdqa 176(%rcx), %xmm10
  495. movdqa 192(%rcx), %xmm11
  496. cmpl $14, %r8d
  497. aesdec %xmm9, %xmm1
  498. aesdec %xmm9, %xmm2
  499. aesdec %xmm9, %xmm3
  500. aesdec %xmm9, %xmm4
  501. aesdec %xmm10, %xmm1
  502. aesdec %xmm10, %xmm2
  503. aesdec %xmm10, %xmm3
  504. aesdec %xmm10, %xmm4
  505. jb DECB_LAST_4
  506. movdqa 192(%rcx), %xmm9
  507. movdqa 208(%rcx), %xmm10
  508. movdqa 224(%rcx), %xmm11
  509. aesdec %xmm9, %xmm1
  510. aesdec %xmm9, %xmm2
  511. aesdec %xmm9, %xmm3
  512. aesdec %xmm9, %xmm4
  513. aesdec %xmm10, %xmm1
  514. aesdec %xmm10, %xmm2
  515. aesdec %xmm10, %xmm3
  516. aesdec %xmm10, %xmm4
  517. DECB_LAST_4:
  518. addq $64, %rdi
  519. addq $64, %rsi
  520. decq %rdx
  521. aesdeclast %xmm11, %xmm1
  522. aesdeclast %xmm11, %xmm2
  523. aesdeclast %xmm11, %xmm3
  524. aesdeclast %xmm11, %xmm4
  525. movdqu %xmm1, (%rsi)
  526. movdqu %xmm2, 16(%rsi)
  527. movdqu %xmm3, 32(%rsi)
  528. movdqu %xmm4, 48(%rsi)
  529. jne DECB_LOOP_4
  530. addq $64, %rsi
  531. DECB_REMAINDER_4:
  532. cmpq $0, %r10
  533. je DECB_END_4
  534. DECB_LOOP_4_2:
  535. movdqu (%rdi), %xmm1
  536. addq $16, %rdi
  537. pxor (%rcx), %xmm1
  538. movdqu 160(%rcx), %xmm2
  539. cmpl $12, %r8d
  540. aesdec 16(%rcx), %xmm1
  541. aesdec 32(%rcx), %xmm1
  542. aesdec 48(%rcx), %xmm1
  543. aesdec 64(%rcx), %xmm1
  544. aesdec 80(%rcx), %xmm1
  545. aesdec 96(%rcx), %xmm1
  546. aesdec 112(%rcx), %xmm1
  547. aesdec 128(%rcx), %xmm1
  548. aesdec 144(%rcx), %xmm1
  549. jb DECB_LAST_4_2
  550. cmpl $14, %r8d
  551. movdqu 192(%rcx), %xmm2
  552. aesdec 160(%rcx), %xmm1
  553. aesdec 176(%rcx), %xmm1
  554. jb DECB_LAST_4_2
  555. movdqu 224(%rcx), %xmm2
  556. aesdec 192(%rcx), %xmm1
  557. aesdec 208(%rcx), %xmm1
  558. DECB_LAST_4_2:
  559. aesdeclast %xmm2, %xmm1
  560. movdqu %xmm1, (%rsi)
  561. addq $16, %rsi
  562. decq %r10
  563. jne DECB_LOOP_4_2
  564. DECB_END_4:
  565. ret
  566. /*
  567. void AES_128_Key_Expansion(const unsigned char* userkey,
  568. unsigned char* key_schedule);
  569. */
  570. .align 16,0x90
  571. .globl AES_128_Key_Expansion
  572. AES_128_Key_Expansion:
  573. # parameter 1: %rdi
  574. # parameter 2: %rsi
  575. movl $10, 240(%rsi)
  576. movdqu (%rdi), %xmm1
  577. movdqa %xmm1, (%rsi)
  578. ASSISTS:
  579. aeskeygenassist $1, %xmm1, %xmm2
  580. call PREPARE_ROUNDKEY_128
  581. movdqa %xmm1, 16(%rsi)
  582. aeskeygenassist $2, %xmm1, %xmm2
  583. call PREPARE_ROUNDKEY_128
  584. movdqa %xmm1, 32(%rsi)
  585. aeskeygenassist $4, %xmm1, %xmm2
  586. call PREPARE_ROUNDKEY_128
  587. movdqa %xmm1, 48(%rsi)
  588. aeskeygenassist $8, %xmm1, %xmm2
  589. call PREPARE_ROUNDKEY_128
  590. movdqa %xmm1, 64(%rsi)
  591. aeskeygenassist $16, %xmm1, %xmm2
  592. call PREPARE_ROUNDKEY_128
  593. movdqa %xmm1, 80(%rsi)
  594. aeskeygenassist $32, %xmm1, %xmm2
  595. call PREPARE_ROUNDKEY_128
  596. movdqa %xmm1, 96(%rsi)
  597. aeskeygenassist $64, %xmm1, %xmm2
  598. call PREPARE_ROUNDKEY_128
  599. movdqa %xmm1, 112(%rsi)
  600. aeskeygenassist $0x80, %xmm1, %xmm2
  601. call PREPARE_ROUNDKEY_128
  602. movdqa %xmm1, 128(%rsi)
  603. aeskeygenassist $0x1b, %xmm1, %xmm2
  604. call PREPARE_ROUNDKEY_128
  605. movdqa %xmm1, 144(%rsi)
  606. aeskeygenassist $0x36, %xmm1, %xmm2
  607. call PREPARE_ROUNDKEY_128
  608. movdqa %xmm1, 160(%rsi)
  609. ret
  610. PREPARE_ROUNDKEY_128:
  611. pshufd $255, %xmm2, %xmm2
  612. movdqa %xmm1, %xmm3
  613. pslldq $4, %xmm3
  614. pxor %xmm3, %xmm1
  615. pslldq $4, %xmm3
  616. pxor %xmm3, %xmm1
  617. pslldq $4, %xmm3
  618. pxor %xmm3, %xmm1
  619. pxor %xmm2, %xmm1
  620. ret
  621. /*
  622. void AES_192_Key_Expansion (const unsigned char *userkey,
  623. unsigned char *key)
  624. */
  625. .globl AES_192_Key_Expansion
  626. AES_192_Key_Expansion:
  627. # parameter 1: %rdi
  628. # parameter 2: %rsi
  629. movdqu (%rdi), %xmm1
  630. movdqu 16(%rdi), %xmm3
  631. movdqa %xmm1, (%rsi)
  632. movdqa %xmm3, %xmm5
  633. aeskeygenassist $0x1, %xmm3, %xmm2
  634. call PREPARE_ROUNDKEY_192
  635. shufpd $0, %xmm1, %xmm5
  636. movdqa %xmm5, 16(%rsi)
  637. movdqa %xmm1, %xmm6
  638. shufpd $1, %xmm3, %xmm6
  639. movdqa %xmm6, 32(%rsi)
  640. aeskeygenassist $0x2, %xmm3, %xmm2
  641. call PREPARE_ROUNDKEY_192
  642. movdqa %xmm1, 48(%rsi)
  643. movdqa %xmm3, %xmm5
  644. aeskeygenassist $0x4, %xmm3, %xmm2
  645. call PREPARE_ROUNDKEY_192
  646. shufpd $0, %xmm1, %xmm5
  647. movdqa %xmm5, 64(%rsi)
  648. movdqa %xmm1, %xmm6
  649. shufpd $1, %xmm3, %xmm6
  650. movdqa %xmm6, 80(%rsi)
  651. aeskeygenassist $0x8, %xmm3, %xmm2
  652. call PREPARE_ROUNDKEY_192
  653. movdqa %xmm1, 96(%rsi)
  654. movdqa %xmm3, %xmm5
  655. aeskeygenassist $0x10, %xmm3, %xmm2
  656. call PREPARE_ROUNDKEY_192
  657. shufpd $0, %xmm1, %xmm5
  658. movdqa %xmm5, 112(%rsi)
  659. movdqa %xmm1, %xmm6
  660. shufpd $1, %xmm3, %xmm6
  661. movdqa %xmm6, 128(%rsi)
  662. aeskeygenassist $0x20, %xmm3, %xmm2
  663. call PREPARE_ROUNDKEY_192
  664. movdqa %xmm1, 144(%rsi)
  665. movdqa %xmm3, %xmm5
  666. aeskeygenassist $0x40, %xmm3, %xmm2
  667. call PREPARE_ROUNDKEY_192
  668. shufpd $0, %xmm1, %xmm5
  669. movdqa %xmm5, 160(%rsi)
  670. movdqa %xmm1, %xmm6
  671. shufpd $1, %xmm3, %xmm6
  672. movdqa %xmm6, 176(%rsi)
  673. aeskeygenassist $0x80, %xmm3, %xmm2
  674. call PREPARE_ROUNDKEY_192
  675. movdqa %xmm1, 192(%rsi)
  676. movdqa %xmm3, 208(%rsi)
  677. ret
  678. PREPARE_ROUNDKEY_192:
  679. pshufd $0x55, %xmm2, %xmm2
  680. movdqu %xmm1, %xmm4
  681. pslldq $4, %xmm4
  682. pxor %xmm4, %xmm1
  683. pslldq $4, %xmm4
  684. pxor %xmm4, %xmm1
  685. pslldq $4, %xmm4
  686. pxor %xmm4, %xmm1
  687. pxor %xmm2, %xmm1
  688. pshufd $0xff, %xmm1, %xmm2
  689. movdqu %xmm3, %xmm4
  690. pslldq $4, %xmm4
  691. pxor %xmm4, %xmm3
  692. pxor %xmm2, %xmm3
  693. ret
  694. /*
  695. void AES_256_Key_Expansion (const unsigned char *userkey,
  696. unsigned char *key)
  697. */
  698. .globl AES_256_Key_Expansion
  699. AES_256_Key_Expansion:
  700. # parameter 1: %rdi
  701. # parameter 2: %rsi
  702. movdqu (%rdi), %xmm1
  703. movdqu 16(%rdi), %xmm3
  704. movdqa %xmm1, (%rsi)
  705. movdqa %xmm3, 16(%rsi)
  706. aeskeygenassist $0x1, %xmm3, %xmm2
  707. call MAKE_RK256_a
  708. movdqa %xmm1, 32(%rsi)
  709. aeskeygenassist $0x0, %xmm1, %xmm2
  710. call MAKE_RK256_b
  711. movdqa %xmm3, 48(%rsi)
  712. aeskeygenassist $0x2, %xmm3, %xmm2
  713. call MAKE_RK256_a
  714. movdqa %xmm1, 64(%rsi)
  715. aeskeygenassist $0x0, %xmm1, %xmm2
  716. call MAKE_RK256_b
  717. movdqa %xmm3, 80(%rsi)
  718. aeskeygenassist $0x4, %xmm3, %xmm2
  719. call MAKE_RK256_a
  720. movdqa %xmm1, 96(%rsi)
  721. aeskeygenassist $0x0, %xmm1, %xmm2
  722. call MAKE_RK256_b
  723. movdqa %xmm3, 112(%rsi)
  724. aeskeygenassist $0x8, %xmm3, %xmm2
  725. call MAKE_RK256_a
  726. movdqa %xmm1, 128(%rsi)
  727. aeskeygenassist $0x0, %xmm1, %xmm2
  728. call MAKE_RK256_b
  729. movdqa %xmm3, 144(%rsi)
  730. aeskeygenassist $0x10, %xmm3, %xmm2
  731. call MAKE_RK256_a
  732. movdqa %xmm1, 160(%rsi)
  733. aeskeygenassist $0x0, %xmm1, %xmm2
  734. call MAKE_RK256_b
  735. movdqa %xmm3, 176(%rsi)
  736. aeskeygenassist $0x20, %xmm3, %xmm2
  737. call MAKE_RK256_a
  738. movdqa %xmm1, 192(%rsi)
  739. aeskeygenassist $0x0, %xmm1, %xmm2
  740. call MAKE_RK256_b
  741. movdqa %xmm3, 208(%rsi)
  742. aeskeygenassist $0x40, %xmm3, %xmm2
  743. call MAKE_RK256_a
  744. movdqa %xmm1, 224(%rsi)
  745. ret
  746. MAKE_RK256_a:
  747. pshufd $0xff, %xmm2, %xmm2
  748. movdqa %xmm1, %xmm4
  749. pslldq $4, %xmm4
  750. pxor %xmm4, %xmm1
  751. pslldq $4, %xmm4
  752. pxor %xmm4, %xmm1
  753. pslldq $4, %xmm4
  754. pxor %xmm4, %xmm1
  755. pxor %xmm2, %xmm1
  756. ret
  757. MAKE_RK256_b:
  758. pshufd $0xaa, %xmm2, %xmm2
  759. movdqa %xmm3, %xmm4
  760. pslldq $4, %xmm4
  761. pxor %xmm4, %xmm3
  762. pslldq $4, %xmm4
  763. pxor %xmm4, %xmm3
  764. pslldq $4, %xmm4
  765. pxor %xmm4, %xmm3
  766. pxor %xmm2, %xmm3
  767. ret