aes_asm.S 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338
  1. /* aes_asm.S
  2. *
  3. * Copyright (C) 2006-2022 wolfSSL Inc.
  4. *
  5. * This file is part of wolfSSL.
  6. *
  7. * wolfSSL 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. * wolfSSL 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-1335, USA
  20. */
  21. /* This file is in at&t asm syntax, see .asm for intel syntax */
  22. /* See Intel Advanced Encryption Standard (AES) Instructions Set White Paper
  23. * by Intel Mobility Group, Israel Development Center, Israel Shay Gueron
  24. */
  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. #ifndef __APPLE__
  34. .globl AES_CBC_encrypt
  35. AES_CBC_encrypt:
  36. #else
  37. .globl _AES_CBC_encrypt
  38. _AES_CBC_encrypt:
  39. #endif
  40. # parameter 1: %rdi
  41. # parameter 2: %rsi
  42. # parameter 3: %rdx
  43. # parameter 4: %rcx
  44. # parameter 5: %r8
  45. # parameter 6: %r9d
  46. movq %rcx, %r10
  47. shrq $4, %rcx
  48. shlq $60, %r10
  49. je NO_PARTS
  50. addq $1, %rcx
  51. NO_PARTS:
  52. subq $16, %rsi
  53. movdqa (%rdx), %xmm1
  54. LOOP:
  55. pxor (%rdi), %xmm1
  56. pxor (%r8), %xmm1
  57. addq $16,%rsi
  58. addq $16,%rdi
  59. cmpl $12, %r9d
  60. aesenc 16(%r8),%xmm1
  61. aesenc 32(%r8),%xmm1
  62. aesenc 48(%r8),%xmm1
  63. aesenc 64(%r8),%xmm1
  64. aesenc 80(%r8),%xmm1
  65. aesenc 96(%r8),%xmm1
  66. aesenc 112(%r8),%xmm1
  67. aesenc 128(%r8),%xmm1
  68. aesenc 144(%r8),%xmm1
  69. movdqa 160(%r8),%xmm2
  70. jb LAST
  71. cmpl $14, %r9d
  72. aesenc 160(%r8),%xmm1
  73. aesenc 176(%r8),%xmm1
  74. movdqa 192(%r8),%xmm2
  75. jb LAST
  76. aesenc 192(%r8),%xmm1
  77. aesenc 208(%r8),%xmm1
  78. movdqa 224(%r8),%xmm2
  79. LAST:
  80. decq %rcx
  81. aesenclast %xmm2,%xmm1
  82. movdqu %xmm1,(%rsi)
  83. jne LOOP
  84. ret
  85. #if defined(WOLFSSL_AESNI_BY4)
  86. /*
  87. AES_CBC_decrypt_by4 (const unsigned char *in,
  88. unsigned char *out,
  89. unsigned char ivec[16],
  90. unsigned long length,
  91. const unsigned char *KS,
  92. int nr)
  93. */
  94. #ifndef __APPLE__
  95. .globl AES_CBC_decrypt_by4
  96. AES_CBC_decrypt_by4:
  97. #else
  98. .globl _AES_CBC_decrypt_by4
  99. _AES_CBC_decrypt_by4:
  100. #endif
  101. # parameter 1: %rdi
  102. # parameter 2: %rsi
  103. # parameter 3: %rdx
  104. # parameter 4: %rcx
  105. # parameter 5: %r8
  106. # parameter 6: %r9d
  107. movq %rcx, %r10
  108. shrq $4, %rcx
  109. shlq $60, %r10
  110. je DNO_PARTS_4
  111. addq $1, %rcx
  112. DNO_PARTS_4:
  113. movq %rcx, %r10
  114. shlq $62, %r10
  115. shrq $62, %r10
  116. shrq $2, %rcx
  117. movdqu (%rdx),%xmm5
  118. je DREMAINDER_4
  119. subq $64, %rsi
  120. DLOOP_4:
  121. movdqu (%rdi), %xmm1
  122. movdqu 16(%rdi), %xmm2
  123. movdqu 32(%rdi), %xmm3
  124. movdqu 48(%rdi), %xmm4
  125. movdqa %xmm1, %xmm6
  126. movdqa %xmm2, %xmm7
  127. movdqa %xmm3, %xmm8
  128. movdqa %xmm4, %xmm15
  129. movdqa (%r8), %xmm9
  130. movdqa 16(%r8), %xmm10
  131. movdqa 32(%r8), %xmm11
  132. movdqa 48(%r8), %xmm12
  133. pxor %xmm9, %xmm1
  134. pxor %xmm9, %xmm2
  135. pxor %xmm9, %xmm3
  136. pxor %xmm9, %xmm4
  137. aesdec %xmm10, %xmm1
  138. aesdec %xmm10, %xmm2
  139. aesdec %xmm10, %xmm3
  140. aesdec %xmm10, %xmm4
  141. aesdec %xmm11, %xmm1
  142. aesdec %xmm11, %xmm2
  143. aesdec %xmm11, %xmm3
  144. aesdec %xmm11, %xmm4
  145. aesdec %xmm12, %xmm1
  146. aesdec %xmm12, %xmm2
  147. aesdec %xmm12, %xmm3
  148. aesdec %xmm12, %xmm4
  149. movdqa 64(%r8), %xmm9
  150. movdqa 80(%r8), %xmm10
  151. movdqa 96(%r8), %xmm11
  152. movdqa 112(%r8), %xmm12
  153. aesdec %xmm9, %xmm1
  154. aesdec %xmm9, %xmm2
  155. aesdec %xmm9, %xmm3
  156. aesdec %xmm9, %xmm4
  157. aesdec %xmm10, %xmm1
  158. aesdec %xmm10, %xmm2
  159. aesdec %xmm10, %xmm3
  160. aesdec %xmm10, %xmm4
  161. aesdec %xmm11, %xmm1
  162. aesdec %xmm11, %xmm2
  163. aesdec %xmm11, %xmm3
  164. aesdec %xmm11, %xmm4
  165. aesdec %xmm12, %xmm1
  166. aesdec %xmm12, %xmm2
  167. aesdec %xmm12, %xmm3
  168. aesdec %xmm12, %xmm4
  169. movdqa 128(%r8), %xmm9
  170. movdqa 144(%r8), %xmm10
  171. movdqa 160(%r8), %xmm11
  172. cmpl $12, %r9d
  173. aesdec %xmm9, %xmm1
  174. aesdec %xmm9, %xmm2
  175. aesdec %xmm9, %xmm3
  176. aesdec %xmm9, %xmm4
  177. aesdec %xmm10, %xmm1
  178. aesdec %xmm10, %xmm2
  179. aesdec %xmm10, %xmm3
  180. aesdec %xmm10, %xmm4
  181. jb DLAST_4
  182. movdqa 160(%r8), %xmm9
  183. movdqa 176(%r8), %xmm10
  184. movdqa 192(%r8), %xmm11
  185. cmpl $14, %r9d
  186. aesdec %xmm9, %xmm1
  187. aesdec %xmm9, %xmm2
  188. aesdec %xmm9, %xmm3
  189. aesdec %xmm9, %xmm4
  190. aesdec %xmm10, %xmm1
  191. aesdec %xmm10, %xmm2
  192. aesdec %xmm10, %xmm3
  193. aesdec %xmm10, %xmm4
  194. jb DLAST_4
  195. movdqa 192(%r8), %xmm9
  196. movdqa 208(%r8), %xmm10
  197. movdqa 224(%r8), %xmm11
  198. aesdec %xmm9, %xmm1
  199. aesdec %xmm9, %xmm2
  200. aesdec %xmm9, %xmm3
  201. aesdec %xmm9, %xmm4
  202. aesdec %xmm10, %xmm1
  203. aesdec %xmm10, %xmm2
  204. aesdec %xmm10, %xmm3
  205. aesdec %xmm10, %xmm4
  206. DLAST_4:
  207. addq $64, %rdi
  208. addq $64, %rsi
  209. decq %rcx
  210. aesdeclast %xmm11, %xmm1
  211. aesdeclast %xmm11, %xmm2
  212. aesdeclast %xmm11, %xmm3
  213. aesdeclast %xmm11, %xmm4
  214. pxor %xmm5, %xmm1
  215. pxor %xmm6, %xmm2
  216. pxor %xmm7, %xmm3
  217. pxor %xmm8, %xmm4
  218. movdqu %xmm1, (%rsi)
  219. movdqu %xmm2, 16(%rsi)
  220. movdqu %xmm3, 32(%rsi)
  221. movdqu %xmm4, 48(%rsi)
  222. movdqa %xmm15,%xmm5
  223. jne DLOOP_4
  224. addq $64, %rsi
  225. DREMAINDER_4:
  226. cmpq $0, %r10
  227. je DEND_4
  228. DLOOP_4_2:
  229. movdqu (%rdi), %xmm1
  230. movdqa %xmm1, %xmm15
  231. addq $16, %rdi
  232. pxor (%r8), %xmm1
  233. movdqu 160(%r8), %xmm2
  234. cmpl $12, %r9d
  235. aesdec 16(%r8), %xmm1
  236. aesdec 32(%r8), %xmm1
  237. aesdec 48(%r8), %xmm1
  238. aesdec 64(%r8), %xmm1
  239. aesdec 80(%r8), %xmm1
  240. aesdec 96(%r8), %xmm1
  241. aesdec 112(%r8), %xmm1
  242. aesdec 128(%r8), %xmm1
  243. aesdec 144(%r8), %xmm1
  244. jb DLAST_4_2
  245. movdqu 192(%r8), %xmm2
  246. cmpl $14, %r9d
  247. aesdec 160(%r8), %xmm1
  248. aesdec 176(%r8), %xmm1
  249. jb DLAST_4_2
  250. movdqu 224(%r8), %xmm2
  251. aesdec 192(%r8), %xmm1
  252. aesdec 208(%r8), %xmm1
  253. DLAST_4_2:
  254. aesdeclast %xmm2, %xmm1
  255. pxor %xmm5, %xmm1
  256. movdqa %xmm15, %xmm5
  257. movdqu %xmm1, (%rsi)
  258. addq $16, %rsi
  259. decq %r10
  260. jne DLOOP_4_2
  261. DEND_4:
  262. ret
  263. #elif defined(WOLFSSL_AESNI_BY6)
  264. /*
  265. AES_CBC_decrypt_by6 (const unsigned char *in,
  266. unsigned char *out,
  267. unsigned char ivec[16],
  268. unsigned long length,
  269. const unsigned char *KS,
  270. int nr)
  271. */
  272. #ifndef __APPLE__
  273. .globl AES_CBC_decrypt_by6
  274. AES_CBC_decrypt_by6:
  275. #else
  276. .globl _AES_CBC_decrypt_by6
  277. _AES_CBC_decrypt_by6:
  278. #endif
  279. # parameter 1: %rdi - in
  280. # parameter 2: %rsi - out
  281. # parameter 3: %rdx - ivec
  282. # parameter 4: %rcx - length
  283. # parameter 5: %r8 - KS
  284. # parameter 6: %r9d - nr
  285. movq %rcx, %r10
  286. shrq $4, %rcx
  287. shlq $60, %r10
  288. je DNO_PARTS_6
  289. addq $1, %rcx
  290. DNO_PARTS_6:
  291. movq %rax, %r12
  292. movq %rdx, %r13
  293. movq %rbx, %r14
  294. movq $0, %rdx
  295. movq %rcx, %rax
  296. movq $6, %rbx
  297. div %rbx
  298. movq %rax, %rcx
  299. movq %rdx, %r10
  300. movq %r12, %rax
  301. movq %r13, %rdx
  302. movq %r14, %rbx
  303. cmpq $0, %rcx
  304. movdqu (%rdx), %xmm7
  305. je DREMAINDER_6
  306. subq $96, %rsi
  307. DLOOP_6:
  308. movdqu (%rdi), %xmm1
  309. movdqu 16(%rdi), %xmm2
  310. movdqu 32(%rdi), %xmm3
  311. movdqu 48(%rdi), %xmm4
  312. movdqu 64(%rdi), %xmm5
  313. movdqu 80(%rdi), %xmm6
  314. movdqa (%r8), %xmm8
  315. movdqa 16(%r8), %xmm9
  316. movdqa 32(%r8), %xmm10
  317. movdqa 48(%r8), %xmm11
  318. pxor %xmm8, %xmm1
  319. pxor %xmm8, %xmm2
  320. pxor %xmm8, %xmm3
  321. pxor %xmm8, %xmm4
  322. pxor %xmm8, %xmm5
  323. pxor %xmm8, %xmm6
  324. aesdec %xmm9, %xmm1
  325. aesdec %xmm9, %xmm2
  326. aesdec %xmm9, %xmm3
  327. aesdec %xmm9, %xmm4
  328. aesdec %xmm9, %xmm5
  329. aesdec %xmm9, %xmm6
  330. aesdec %xmm10, %xmm1
  331. aesdec %xmm10, %xmm2
  332. aesdec %xmm10, %xmm3
  333. aesdec %xmm10, %xmm4
  334. aesdec %xmm10, %xmm5
  335. aesdec %xmm10, %xmm6
  336. aesdec %xmm11, %xmm1
  337. aesdec %xmm11, %xmm2
  338. aesdec %xmm11, %xmm3
  339. aesdec %xmm11, %xmm4
  340. aesdec %xmm11, %xmm5
  341. aesdec %xmm11, %xmm6
  342. movdqa 64(%r8), %xmm8
  343. movdqa 80(%r8), %xmm9
  344. movdqa 96(%r8), %xmm10
  345. movdqa 112(%r8), %xmm11
  346. aesdec %xmm8, %xmm1
  347. aesdec %xmm8, %xmm2
  348. aesdec %xmm8, %xmm3
  349. aesdec %xmm8, %xmm4
  350. aesdec %xmm8, %xmm5
  351. aesdec %xmm8, %xmm6
  352. aesdec %xmm9, %xmm1
  353. aesdec %xmm9, %xmm2
  354. aesdec %xmm9, %xmm3
  355. aesdec %xmm9, %xmm4
  356. aesdec %xmm9, %xmm5
  357. aesdec %xmm9, %xmm6
  358. aesdec %xmm10, %xmm1
  359. aesdec %xmm10, %xmm2
  360. aesdec %xmm10, %xmm3
  361. aesdec %xmm10, %xmm4
  362. aesdec %xmm10, %xmm5
  363. aesdec %xmm10, %xmm6
  364. aesdec %xmm11, %xmm1
  365. aesdec %xmm11, %xmm2
  366. aesdec %xmm11, %xmm3
  367. aesdec %xmm11, %xmm4
  368. aesdec %xmm11, %xmm5
  369. aesdec %xmm11, %xmm6
  370. movdqa 128(%r8), %xmm8
  371. movdqa 144(%r8), %xmm9
  372. movdqa 160(%r8), %xmm10
  373. cmpl $12, %r9d
  374. aesdec %xmm8, %xmm1
  375. aesdec %xmm8, %xmm2
  376. aesdec %xmm8, %xmm3
  377. aesdec %xmm8, %xmm4
  378. aesdec %xmm8, %xmm5
  379. aesdec %xmm8, %xmm6
  380. aesdec %xmm9, %xmm1
  381. aesdec %xmm9, %xmm2
  382. aesdec %xmm9, %xmm3
  383. aesdec %xmm9, %xmm4
  384. aesdec %xmm9, %xmm5
  385. aesdec %xmm9, %xmm6
  386. jb DLAST_6
  387. movdqa 160(%r8), %xmm8
  388. movdqa 176(%r8), %xmm9
  389. movdqa 192(%r8), %xmm10
  390. cmpl $14, %r9d
  391. aesdec %xmm8, %xmm1
  392. aesdec %xmm8, %xmm2
  393. aesdec %xmm8, %xmm3
  394. aesdec %xmm8, %xmm4
  395. aesdec %xmm8, %xmm5
  396. aesdec %xmm8, %xmm6
  397. aesdec %xmm9, %xmm1
  398. aesdec %xmm9, %xmm2
  399. aesdec %xmm9, %xmm3
  400. aesdec %xmm9, %xmm4
  401. aesdec %xmm9, %xmm5
  402. aesdec %xmm9, %xmm6
  403. jb DLAST_6
  404. movdqa 192(%r8), %xmm8
  405. movdqa 208(%r8), %xmm9
  406. movdqa 224(%r8), %xmm10
  407. aesdec %xmm8, %xmm1
  408. aesdec %xmm8, %xmm2
  409. aesdec %xmm8, %xmm3
  410. aesdec %xmm8, %xmm4
  411. aesdec %xmm8, %xmm5
  412. aesdec %xmm8, %xmm6
  413. aesdec %xmm9, %xmm1
  414. aesdec %xmm9, %xmm2
  415. aesdec %xmm9, %xmm3
  416. aesdec %xmm9, %xmm4
  417. aesdec %xmm9, %xmm5
  418. aesdec %xmm9, %xmm6
  419. DLAST_6:
  420. addq $96, %rsi
  421. aesdeclast %xmm10, %xmm1
  422. aesdeclast %xmm10, %xmm2
  423. aesdeclast %xmm10, %xmm3
  424. aesdeclast %xmm10, %xmm4
  425. aesdeclast %xmm10, %xmm5
  426. aesdeclast %xmm10, %xmm6
  427. movdqu (%rdi), %xmm8
  428. movdqu 16(%rdi), %xmm9
  429. movdqu 32(%rdi), %xmm10
  430. movdqu 48(%rdi), %xmm11
  431. movdqu 64(%rdi), %xmm12
  432. movdqu 80(%rdi), %xmm13
  433. pxor %xmm7, %xmm1
  434. pxor %xmm8, %xmm2
  435. pxor %xmm9, %xmm3
  436. pxor %xmm10, %xmm4
  437. pxor %xmm11, %xmm5
  438. pxor %xmm12, %xmm6
  439. movdqu %xmm13, %xmm7
  440. movdqu %xmm1, (%rsi)
  441. movdqu %xmm2, 16(%rsi)
  442. movdqu %xmm3, 32(%rsi)
  443. movdqu %xmm4, 48(%rsi)
  444. movdqu %xmm5, 64(%rsi)
  445. movdqu %xmm6, 80(%rsi)
  446. addq $96, %rdi
  447. decq %rcx
  448. jne DLOOP_6
  449. addq $96, %rsi
  450. DREMAINDER_6:
  451. cmpq $0, %r10
  452. je DEND_6
  453. DLOOP_6_2:
  454. movdqu (%rdi), %xmm1
  455. movdqa %xmm1, %xmm10
  456. addq $16, %rdi
  457. pxor (%r8), %xmm1
  458. movdqu 160(%r8), %xmm2
  459. cmpl $12, %r9d
  460. aesdec 16(%r8), %xmm1
  461. aesdec 32(%r8), %xmm1
  462. aesdec 48(%r8), %xmm1
  463. aesdec 64(%r8), %xmm1
  464. aesdec 80(%r8), %xmm1
  465. aesdec 96(%r8), %xmm1
  466. aesdec 112(%r8), %xmm1
  467. aesdec 128(%r8), %xmm1
  468. aesdec 144(%r8), %xmm1
  469. jb DLAST_6_2
  470. movdqu 192(%r8), %xmm2
  471. cmpl $14, %r9d
  472. aesdec 160(%r8), %xmm1
  473. aesdec 176(%r8), %xmm1
  474. jb DLAST_6_2
  475. movdqu 224(%r8), %xmm2
  476. aesdec 192(%r8), %xmm1
  477. aesdec 208(%r8), %xmm1
  478. DLAST_6_2:
  479. aesdeclast %xmm2, %xmm1
  480. pxor %xmm7, %xmm1
  481. movdqa %xmm10, %xmm7
  482. movdqu %xmm1, (%rsi)
  483. addq $16, %rsi
  484. decq %r10
  485. jne DLOOP_6_2
  486. DEND_6:
  487. ret
  488. #else /* WOLFSSL_AESNI_BYx */
  489. /*
  490. AES_CBC_decrypt_by8 (const unsigned char *in,
  491. unsigned char *out,
  492. unsigned char ivec[16],
  493. unsigned long length,
  494. const unsigned char *KS,
  495. int nr)
  496. */
  497. #ifndef __APPLE__
  498. .globl AES_CBC_decrypt_by8
  499. AES_CBC_decrypt_by8:
  500. #else
  501. .globl _AES_CBC_decrypt_by8
  502. _AES_CBC_decrypt_by8:
  503. #endif
  504. # parameter 1: %rdi - in
  505. # parameter 2: %rsi - out
  506. # parameter 3: %rdx - ivec
  507. # parameter 4: %rcx - length
  508. # parameter 5: %r8 - KS
  509. # parameter 6: %r9d - nr
  510. movq %rcx, %r10
  511. shrq $4, %rcx
  512. shlq $60, %r10
  513. je DNO_PARTS_8
  514. addq $1, %rcx
  515. DNO_PARTS_8:
  516. movq %rcx, %r10
  517. shlq $61, %r10
  518. shrq $61, %r10
  519. shrq $3, %rcx
  520. movdqu (%rdx), %xmm9
  521. je DREMAINDER_8
  522. subq $128, %rsi
  523. DLOOP_8:
  524. movdqu (%rdi), %xmm1
  525. movdqu 16(%rdi), %xmm2
  526. movdqu 32(%rdi), %xmm3
  527. movdqu 48(%rdi), %xmm4
  528. movdqu 64(%rdi), %xmm5
  529. movdqu 80(%rdi), %xmm6
  530. movdqu 96(%rdi), %xmm7
  531. movdqu 112(%rdi), %xmm8
  532. movdqa (%r8), %xmm10
  533. movdqa 16(%r8), %xmm11
  534. movdqa 32(%r8), %xmm12
  535. movdqa 48(%r8), %xmm13
  536. pxor %xmm10, %xmm1
  537. pxor %xmm10, %xmm2
  538. pxor %xmm10, %xmm3
  539. pxor %xmm10, %xmm4
  540. pxor %xmm10, %xmm5
  541. pxor %xmm10, %xmm6
  542. pxor %xmm10, %xmm7
  543. pxor %xmm10, %xmm8
  544. aesdec %xmm11, %xmm1
  545. aesdec %xmm11, %xmm2
  546. aesdec %xmm11, %xmm3
  547. aesdec %xmm11, %xmm4
  548. aesdec %xmm11, %xmm5
  549. aesdec %xmm11, %xmm6
  550. aesdec %xmm11, %xmm7
  551. aesdec %xmm11, %xmm8
  552. aesdec %xmm12, %xmm1
  553. aesdec %xmm12, %xmm2
  554. aesdec %xmm12, %xmm3
  555. aesdec %xmm12, %xmm4
  556. aesdec %xmm12, %xmm5
  557. aesdec %xmm12, %xmm6
  558. aesdec %xmm12, %xmm7
  559. aesdec %xmm12, %xmm8
  560. aesdec %xmm13, %xmm1
  561. aesdec %xmm13, %xmm2
  562. aesdec %xmm13, %xmm3
  563. aesdec %xmm13, %xmm4
  564. aesdec %xmm13, %xmm5
  565. aesdec %xmm13, %xmm6
  566. aesdec %xmm13, %xmm7
  567. aesdec %xmm13, %xmm8
  568. movdqa 64(%r8), %xmm10
  569. movdqa 80(%r8), %xmm11
  570. movdqa 96(%r8), %xmm12
  571. movdqa 112(%r8), %xmm13
  572. aesdec %xmm10, %xmm1
  573. aesdec %xmm10, %xmm2
  574. aesdec %xmm10, %xmm3
  575. aesdec %xmm10, %xmm4
  576. aesdec %xmm10, %xmm5
  577. aesdec %xmm10, %xmm6
  578. aesdec %xmm10, %xmm7
  579. aesdec %xmm10, %xmm8
  580. aesdec %xmm11, %xmm1
  581. aesdec %xmm11, %xmm2
  582. aesdec %xmm11, %xmm3
  583. aesdec %xmm11, %xmm4
  584. aesdec %xmm11, %xmm5
  585. aesdec %xmm11, %xmm6
  586. aesdec %xmm11, %xmm7
  587. aesdec %xmm11, %xmm8
  588. aesdec %xmm12, %xmm1
  589. aesdec %xmm12, %xmm2
  590. aesdec %xmm12, %xmm3
  591. aesdec %xmm12, %xmm4
  592. aesdec %xmm12, %xmm5
  593. aesdec %xmm12, %xmm6
  594. aesdec %xmm12, %xmm7
  595. aesdec %xmm12, %xmm8
  596. aesdec %xmm13, %xmm1
  597. aesdec %xmm13, %xmm2
  598. aesdec %xmm13, %xmm3
  599. aesdec %xmm13, %xmm4
  600. aesdec %xmm13, %xmm5
  601. aesdec %xmm13, %xmm6
  602. aesdec %xmm13, %xmm7
  603. aesdec %xmm13, %xmm8
  604. movdqa 128(%r8), %xmm10
  605. movdqa 144(%r8), %xmm11
  606. movdqa 160(%r8), %xmm12
  607. cmpl $12, %r9d
  608. aesdec %xmm10, %xmm1
  609. aesdec %xmm10, %xmm2
  610. aesdec %xmm10, %xmm3
  611. aesdec %xmm10, %xmm4
  612. aesdec %xmm10, %xmm5
  613. aesdec %xmm10, %xmm6
  614. aesdec %xmm10, %xmm7
  615. aesdec %xmm10, %xmm8
  616. aesdec %xmm11, %xmm1
  617. aesdec %xmm11, %xmm2
  618. aesdec %xmm11, %xmm3
  619. aesdec %xmm11, %xmm4
  620. aesdec %xmm11, %xmm5
  621. aesdec %xmm11, %xmm6
  622. aesdec %xmm11, %xmm7
  623. aesdec %xmm11, %xmm8
  624. jb DLAST_8
  625. movdqa 160(%r8), %xmm10
  626. movdqa 176(%r8), %xmm11
  627. movdqa 192(%r8), %xmm12
  628. cmpl $14, %r9d
  629. aesdec %xmm10, %xmm1
  630. aesdec %xmm10, %xmm2
  631. aesdec %xmm10, %xmm3
  632. aesdec %xmm10, %xmm4
  633. aesdec %xmm10, %xmm5
  634. aesdec %xmm10, %xmm6
  635. aesdec %xmm10, %xmm7
  636. aesdec %xmm10, %xmm8
  637. aesdec %xmm11, %xmm1
  638. aesdec %xmm11, %xmm2
  639. aesdec %xmm11, %xmm3
  640. aesdec %xmm11, %xmm4
  641. aesdec %xmm11, %xmm5
  642. aesdec %xmm11, %xmm6
  643. aesdec %xmm11, %xmm7
  644. aesdec %xmm11, %xmm8
  645. jb DLAST_8
  646. movdqa 192(%r8), %xmm10
  647. movdqa 208(%r8), %xmm11
  648. movdqa 224(%r8), %xmm12
  649. aesdec %xmm10, %xmm1
  650. aesdec %xmm10, %xmm2
  651. aesdec %xmm10, %xmm3
  652. aesdec %xmm10, %xmm4
  653. aesdec %xmm10, %xmm5
  654. aesdec %xmm10, %xmm6
  655. aesdec %xmm10, %xmm7
  656. aesdec %xmm10, %xmm8
  657. aesdec %xmm11, %xmm1
  658. aesdec %xmm11, %xmm2
  659. aesdec %xmm11, %xmm3
  660. aesdec %xmm11, %xmm4
  661. aesdec %xmm11, %xmm5
  662. aesdec %xmm11, %xmm6
  663. aesdec %xmm11, %xmm7
  664. aesdec %xmm11, %xmm8
  665. DLAST_8:
  666. addq $128, %rsi
  667. aesdeclast %xmm12, %xmm1
  668. aesdeclast %xmm12, %xmm2
  669. aesdeclast %xmm12, %xmm3
  670. aesdeclast %xmm12, %xmm4
  671. aesdeclast %xmm12, %xmm5
  672. aesdeclast %xmm12, %xmm6
  673. aesdeclast %xmm12, %xmm7
  674. aesdeclast %xmm12, %xmm8
  675. movdqu (%rdi), %xmm10
  676. movdqu 16(%rdi), %xmm11
  677. movdqu 32(%rdi), %xmm12
  678. movdqu 48(%rdi), %xmm13
  679. pxor %xmm9, %xmm1
  680. pxor %xmm10, %xmm2
  681. pxor %xmm11, %xmm3
  682. pxor %xmm12, %xmm4
  683. pxor %xmm13, %xmm5
  684. movdqu 64(%rdi), %xmm10
  685. movdqu 80(%rdi), %xmm11
  686. movdqu 96(%rdi), %xmm12
  687. movdqu 112(%rdi), %xmm9
  688. pxor %xmm10, %xmm6
  689. pxor %xmm11, %xmm7
  690. pxor %xmm12, %xmm8
  691. movdqu %xmm1, (%rsi)
  692. movdqu %xmm2, 16(%rsi)
  693. movdqu %xmm3, 32(%rsi)
  694. movdqu %xmm4, 48(%rsi)
  695. movdqu %xmm5, 64(%rsi)
  696. movdqu %xmm6, 80(%rsi)
  697. movdqu %xmm7, 96(%rsi)
  698. movdqu %xmm8, 112(%rsi)
  699. addq $128, %rdi
  700. decq %rcx
  701. jne DLOOP_8
  702. addq $128, %rsi
  703. DREMAINDER_8:
  704. cmpq $0, %r10
  705. je DEND_8
  706. DLOOP_8_2:
  707. movdqu (%rdi), %xmm1
  708. movdqa %xmm1, %xmm10
  709. addq $16, %rdi
  710. pxor (%r8), %xmm1
  711. movdqu 160(%r8), %xmm2
  712. cmpl $12, %r9d
  713. aesdec 16(%r8), %xmm1
  714. aesdec 32(%r8), %xmm1
  715. aesdec 48(%r8), %xmm1
  716. aesdec 64(%r8), %xmm1
  717. aesdec 80(%r8), %xmm1
  718. aesdec 96(%r8), %xmm1
  719. aesdec 112(%r8), %xmm1
  720. aesdec 128(%r8), %xmm1
  721. aesdec 144(%r8), %xmm1
  722. jb DLAST_8_2
  723. movdqu 192(%r8), %xmm2
  724. cmpl $14, %r9d
  725. aesdec 160(%r8), %xmm1
  726. aesdec 176(%r8), %xmm1
  727. jb DLAST_8_2
  728. movdqu 224(%r8), %xmm2
  729. aesdec 192(%r8), %xmm1
  730. aesdec 208(%r8), %xmm1
  731. DLAST_8_2:
  732. aesdeclast %xmm2, %xmm1
  733. pxor %xmm9, %xmm1
  734. movdqa %xmm10, %xmm9
  735. movdqu %xmm1, (%rsi)
  736. addq $16, %rsi
  737. decq %r10
  738. jne DLOOP_8_2
  739. DEND_8:
  740. ret
  741. #endif /* WOLFSSL_AESNI_BYx */
  742. /*
  743. AES_ECB_encrypt (const unsigned char *in,
  744. unsigned char *out,
  745. unsigned long length,
  746. const unsigned char *KS,
  747. int nr)
  748. */
  749. #ifndef __APPLE__
  750. .globl AES_ECB_encrypt
  751. AES_ECB_encrypt:
  752. #else
  753. .globl _AES_ECB_encrypt
  754. _AES_ECB_encrypt:
  755. #endif
  756. # parameter 1: %rdi
  757. # parameter 2: %rsi
  758. # parameter 3: %rdx
  759. # parameter 4: %rcx
  760. # parameter 5: %r8d
  761. movq %rdx, %r10
  762. shrq $4, %rdx
  763. shlq $60, %r10
  764. je EECB_NO_PARTS_4
  765. addq $1, %rdx
  766. EECB_NO_PARTS_4:
  767. movq %rdx, %r10
  768. shlq $62, %r10
  769. shrq $62, %r10
  770. shrq $2, %rdx
  771. je EECB_REMAINDER_4
  772. subq $64, %rsi
  773. EECB_LOOP_4:
  774. movdqu (%rdi), %xmm1
  775. movdqu 16(%rdi), %xmm2
  776. movdqu 32(%rdi), %xmm3
  777. movdqu 48(%rdi), %xmm4
  778. movdqa (%rcx), %xmm9
  779. movdqa 16(%rcx), %xmm10
  780. movdqa 32(%rcx), %xmm11
  781. movdqa 48(%rcx), %xmm12
  782. pxor %xmm9, %xmm1
  783. pxor %xmm9, %xmm2
  784. pxor %xmm9, %xmm3
  785. pxor %xmm9, %xmm4
  786. aesenc %xmm10, %xmm1
  787. aesenc %xmm10, %xmm2
  788. aesenc %xmm10, %xmm3
  789. aesenc %xmm10, %xmm4
  790. aesenc %xmm11, %xmm1
  791. aesenc %xmm11, %xmm2
  792. aesenc %xmm11, %xmm3
  793. aesenc %xmm11, %xmm4
  794. aesenc %xmm12, %xmm1
  795. aesenc %xmm12, %xmm2
  796. aesenc %xmm12, %xmm3
  797. aesenc %xmm12, %xmm4
  798. movdqa 64(%rcx), %xmm9
  799. movdqa 80(%rcx), %xmm10
  800. movdqa 96(%rcx), %xmm11
  801. movdqa 112(%rcx), %xmm12
  802. aesenc %xmm9, %xmm1
  803. aesenc %xmm9, %xmm2
  804. aesenc %xmm9, %xmm3
  805. aesenc %xmm9, %xmm4
  806. aesenc %xmm10, %xmm1
  807. aesenc %xmm10, %xmm2
  808. aesenc %xmm10, %xmm3
  809. aesenc %xmm10, %xmm4
  810. aesenc %xmm11, %xmm1
  811. aesenc %xmm11, %xmm2
  812. aesenc %xmm11, %xmm3
  813. aesenc %xmm11, %xmm4
  814. aesenc %xmm12, %xmm1
  815. aesenc %xmm12, %xmm2
  816. aesenc %xmm12, %xmm3
  817. aesenc %xmm12, %xmm4
  818. movdqa 128(%rcx), %xmm9
  819. movdqa 144(%rcx), %xmm10
  820. movdqa 160(%rcx), %xmm11
  821. cmpl $12, %r8d
  822. aesenc %xmm9, %xmm1
  823. aesenc %xmm9, %xmm2
  824. aesenc %xmm9, %xmm3
  825. aesenc %xmm9, %xmm4
  826. aesenc %xmm10, %xmm1
  827. aesenc %xmm10, %xmm2
  828. aesenc %xmm10, %xmm3
  829. aesenc %xmm10, %xmm4
  830. jb EECB_LAST_4
  831. movdqa 160(%rcx), %xmm9
  832. movdqa 176(%rcx), %xmm10
  833. movdqa 192(%rcx), %xmm11
  834. cmpl $14, %r8d
  835. aesenc %xmm9, %xmm1
  836. aesenc %xmm9, %xmm2
  837. aesenc %xmm9, %xmm3
  838. aesenc %xmm9, %xmm4
  839. aesenc %xmm10, %xmm1
  840. aesenc %xmm10, %xmm2
  841. aesenc %xmm10, %xmm3
  842. aesenc %xmm10, %xmm4
  843. jb EECB_LAST_4
  844. movdqa 192(%rcx), %xmm9
  845. movdqa 208(%rcx), %xmm10
  846. movdqa 224(%rcx), %xmm11
  847. aesenc %xmm9, %xmm1
  848. aesenc %xmm9, %xmm2
  849. aesenc %xmm9, %xmm3
  850. aesenc %xmm9, %xmm4
  851. aesenc %xmm10, %xmm1
  852. aesenc %xmm10, %xmm2
  853. aesenc %xmm10, %xmm3
  854. aesenc %xmm10, %xmm4
  855. EECB_LAST_4:
  856. addq $64, %rdi
  857. addq $64, %rsi
  858. decq %rdx
  859. aesenclast %xmm11, %xmm1
  860. aesenclast %xmm11, %xmm2
  861. aesenclast %xmm11, %xmm3
  862. aesenclast %xmm11, %xmm4
  863. movdqu %xmm1, (%rsi)
  864. movdqu %xmm2, 16(%rsi)
  865. movdqu %xmm3, 32(%rsi)
  866. movdqu %xmm4, 48(%rsi)
  867. jne EECB_LOOP_4
  868. addq $64, %rsi
  869. EECB_REMAINDER_4:
  870. cmpq $0, %r10
  871. je EECB_END_4
  872. EECB_LOOP_4_2:
  873. movdqu (%rdi), %xmm1
  874. addq $16, %rdi
  875. pxor (%rcx), %xmm1
  876. movdqu 160(%rcx), %xmm2
  877. aesenc 16(%rcx), %xmm1
  878. aesenc 32(%rcx), %xmm1
  879. aesenc 48(%rcx), %xmm1
  880. aesenc 64(%rcx), %xmm1
  881. aesenc 80(%rcx), %xmm1
  882. aesenc 96(%rcx), %xmm1
  883. aesenc 112(%rcx), %xmm1
  884. aesenc 128(%rcx), %xmm1
  885. aesenc 144(%rcx), %xmm1
  886. cmpl $12, %r8d
  887. jb EECB_LAST_4_2
  888. movdqu 192(%rcx), %xmm2
  889. aesenc 160(%rcx), %xmm1
  890. aesenc 176(%rcx), %xmm1
  891. cmpl $14, %r8d
  892. jb EECB_LAST_4_2
  893. movdqu 224(%rcx), %xmm2
  894. aesenc 192(%rcx), %xmm1
  895. aesenc 208(%rcx), %xmm1
  896. EECB_LAST_4_2:
  897. aesenclast %xmm2, %xmm1
  898. movdqu %xmm1, (%rsi)
  899. addq $16, %rsi
  900. decq %r10
  901. jne EECB_LOOP_4_2
  902. EECB_END_4:
  903. ret
  904. /*
  905. AES_ECB_decrypt (const unsigned char *in,
  906. unsigned char *out,
  907. unsigned long length,
  908. const unsigned char *KS,
  909. int nr)
  910. */
  911. #ifndef __APPLE__
  912. .globl AES_ECB_decrypt
  913. AES_ECB_decrypt:
  914. #else
  915. .globl _AES_ECB_decrypt
  916. _AES_ECB_decrypt:
  917. #endif
  918. # parameter 1: %rdi
  919. # parameter 2: %rsi
  920. # parameter 3: %rdx
  921. # parameter 4: %rcx
  922. # parameter 5: %r8d
  923. movq %rdx, %r10
  924. shrq $4, %rdx
  925. shlq $60, %r10
  926. je DECB_NO_PARTS_4
  927. addq $1, %rdx
  928. DECB_NO_PARTS_4:
  929. movq %rdx, %r10
  930. shlq $62, %r10
  931. shrq $62, %r10
  932. shrq $2, %rdx
  933. je DECB_REMAINDER_4
  934. subq $64, %rsi
  935. DECB_LOOP_4:
  936. movdqu (%rdi), %xmm1
  937. movdqu 16(%rdi), %xmm2
  938. movdqu 32(%rdi), %xmm3
  939. movdqu 48(%rdi), %xmm4
  940. movdqa (%rcx), %xmm9
  941. movdqa 16(%rcx), %xmm10
  942. movdqa 32(%rcx), %xmm11
  943. movdqa 48(%rcx), %xmm12
  944. pxor %xmm9, %xmm1
  945. pxor %xmm9, %xmm2
  946. pxor %xmm9, %xmm3
  947. pxor %xmm9, %xmm4
  948. aesdec %xmm10, %xmm1
  949. aesdec %xmm10, %xmm2
  950. aesdec %xmm10, %xmm3
  951. aesdec %xmm10, %xmm4
  952. aesdec %xmm11, %xmm1
  953. aesdec %xmm11, %xmm2
  954. aesdec %xmm11, %xmm3
  955. aesdec %xmm11, %xmm4
  956. aesdec %xmm12, %xmm1
  957. aesdec %xmm12, %xmm2
  958. aesdec %xmm12, %xmm3
  959. aesdec %xmm12, %xmm4
  960. movdqa 64(%rcx), %xmm9
  961. movdqa 80(%rcx), %xmm10
  962. movdqa 96(%rcx), %xmm11
  963. movdqa 112(%rcx), %xmm12
  964. aesdec %xmm9, %xmm1
  965. aesdec %xmm9, %xmm2
  966. aesdec %xmm9, %xmm3
  967. aesdec %xmm9, %xmm4
  968. aesdec %xmm10, %xmm1
  969. aesdec %xmm10, %xmm2
  970. aesdec %xmm10, %xmm3
  971. aesdec %xmm10, %xmm4
  972. aesdec %xmm11, %xmm1
  973. aesdec %xmm11, %xmm2
  974. aesdec %xmm11, %xmm3
  975. aesdec %xmm11, %xmm4
  976. aesdec %xmm12, %xmm1
  977. aesdec %xmm12, %xmm2
  978. aesdec %xmm12, %xmm3
  979. aesdec %xmm12, %xmm4
  980. movdqa 128(%rcx), %xmm9
  981. movdqa 144(%rcx), %xmm10
  982. movdqa 160(%rcx), %xmm11
  983. cmpl $12, %r8d
  984. aesdec %xmm9, %xmm1
  985. aesdec %xmm9, %xmm2
  986. aesdec %xmm9, %xmm3
  987. aesdec %xmm9, %xmm4
  988. aesdec %xmm10, %xmm1
  989. aesdec %xmm10, %xmm2
  990. aesdec %xmm10, %xmm3
  991. aesdec %xmm10, %xmm4
  992. jb DECB_LAST_4
  993. movdqa 160(%rcx), %xmm9
  994. movdqa 176(%rcx), %xmm10
  995. movdqa 192(%rcx), %xmm11
  996. cmpl $14, %r8d
  997. aesdec %xmm9, %xmm1
  998. aesdec %xmm9, %xmm2
  999. aesdec %xmm9, %xmm3
  1000. aesdec %xmm9, %xmm4
  1001. aesdec %xmm10, %xmm1
  1002. aesdec %xmm10, %xmm2
  1003. aesdec %xmm10, %xmm3
  1004. aesdec %xmm10, %xmm4
  1005. jb DECB_LAST_4
  1006. movdqa 192(%rcx), %xmm9
  1007. movdqa 208(%rcx), %xmm10
  1008. movdqa 224(%rcx), %xmm11
  1009. aesdec %xmm9, %xmm1
  1010. aesdec %xmm9, %xmm2
  1011. aesdec %xmm9, %xmm3
  1012. aesdec %xmm9, %xmm4
  1013. aesdec %xmm10, %xmm1
  1014. aesdec %xmm10, %xmm2
  1015. aesdec %xmm10, %xmm3
  1016. aesdec %xmm10, %xmm4
  1017. DECB_LAST_4:
  1018. addq $64, %rdi
  1019. addq $64, %rsi
  1020. decq %rdx
  1021. aesdeclast %xmm11, %xmm1
  1022. aesdeclast %xmm11, %xmm2
  1023. aesdeclast %xmm11, %xmm3
  1024. aesdeclast %xmm11, %xmm4
  1025. movdqu %xmm1, (%rsi)
  1026. movdqu %xmm2, 16(%rsi)
  1027. movdqu %xmm3, 32(%rsi)
  1028. movdqu %xmm4, 48(%rsi)
  1029. jne DECB_LOOP_4
  1030. addq $64, %rsi
  1031. DECB_REMAINDER_4:
  1032. cmpq $0, %r10
  1033. je DECB_END_4
  1034. DECB_LOOP_4_2:
  1035. movdqu (%rdi), %xmm1
  1036. addq $16, %rdi
  1037. pxor (%rcx), %xmm1
  1038. movdqu 160(%rcx), %xmm2
  1039. cmpl $12, %r8d
  1040. aesdec 16(%rcx), %xmm1
  1041. aesdec 32(%rcx), %xmm1
  1042. aesdec 48(%rcx), %xmm1
  1043. aesdec 64(%rcx), %xmm1
  1044. aesdec 80(%rcx), %xmm1
  1045. aesdec 96(%rcx), %xmm1
  1046. aesdec 112(%rcx), %xmm1
  1047. aesdec 128(%rcx), %xmm1
  1048. aesdec 144(%rcx), %xmm1
  1049. jb DECB_LAST_4_2
  1050. cmpl $14, %r8d
  1051. movdqu 192(%rcx), %xmm2
  1052. aesdec 160(%rcx), %xmm1
  1053. aesdec 176(%rcx), %xmm1
  1054. jb DECB_LAST_4_2
  1055. movdqu 224(%rcx), %xmm2
  1056. aesdec 192(%rcx), %xmm1
  1057. aesdec 208(%rcx), %xmm1
  1058. DECB_LAST_4_2:
  1059. aesdeclast %xmm2, %xmm1
  1060. movdqu %xmm1, (%rsi)
  1061. addq $16, %rsi
  1062. decq %r10
  1063. jne DECB_LOOP_4_2
  1064. DECB_END_4:
  1065. ret
  1066. /*
  1067. void AES_128_Key_Expansion(const unsigned char* userkey,
  1068. unsigned char* key_schedule);
  1069. */
  1070. .align 16,0x90
  1071. #ifndef __APPLE__
  1072. .globl AES_128_Key_Expansion
  1073. AES_128_Key_Expansion:
  1074. #else
  1075. .globl _AES_128_Key_Expansion
  1076. _AES_128_Key_Expansion:
  1077. #endif
  1078. # parameter 1: %rdi
  1079. # parameter 2: %rsi
  1080. movl $10, 240(%rsi)
  1081. movdqu (%rdi), %xmm1
  1082. movdqa %xmm1, (%rsi)
  1083. ASSISTS:
  1084. aeskeygenassist $1, %xmm1, %xmm2
  1085. call PREPARE_ROUNDKEY_128
  1086. movdqa %xmm1, 16(%rsi)
  1087. aeskeygenassist $2, %xmm1, %xmm2
  1088. call PREPARE_ROUNDKEY_128
  1089. movdqa %xmm1, 32(%rsi)
  1090. aeskeygenassist $4, %xmm1, %xmm2
  1091. call PREPARE_ROUNDKEY_128
  1092. movdqa %xmm1, 48(%rsi)
  1093. aeskeygenassist $8, %xmm1, %xmm2
  1094. call PREPARE_ROUNDKEY_128
  1095. movdqa %xmm1, 64(%rsi)
  1096. aeskeygenassist $16, %xmm1, %xmm2
  1097. call PREPARE_ROUNDKEY_128
  1098. movdqa %xmm1, 80(%rsi)
  1099. aeskeygenassist $32, %xmm1, %xmm2
  1100. call PREPARE_ROUNDKEY_128
  1101. movdqa %xmm1, 96(%rsi)
  1102. aeskeygenassist $64, %xmm1, %xmm2
  1103. call PREPARE_ROUNDKEY_128
  1104. movdqa %xmm1, 112(%rsi)
  1105. aeskeygenassist $0x80, %xmm1, %xmm2
  1106. call PREPARE_ROUNDKEY_128
  1107. movdqa %xmm1, 128(%rsi)
  1108. aeskeygenassist $0x1b, %xmm1, %xmm2
  1109. call PREPARE_ROUNDKEY_128
  1110. movdqa %xmm1, 144(%rsi)
  1111. aeskeygenassist $0x36, %xmm1, %xmm2
  1112. call PREPARE_ROUNDKEY_128
  1113. movdqa %xmm1, 160(%rsi)
  1114. ret
  1115. PREPARE_ROUNDKEY_128:
  1116. pshufd $255, %xmm2, %xmm2
  1117. movdqa %xmm1, %xmm3
  1118. pslldq $4, %xmm3
  1119. pxor %xmm3, %xmm1
  1120. pslldq $4, %xmm3
  1121. pxor %xmm3, %xmm1
  1122. pslldq $4, %xmm3
  1123. pxor %xmm3, %xmm1
  1124. pxor %xmm2, %xmm1
  1125. ret
  1126. /*
  1127. void AES_192_Key_Expansion (const unsigned char *userkey,
  1128. unsigned char *key)
  1129. */
  1130. #ifndef __APPLE__
  1131. .globl AES_192_Key_Expansion
  1132. AES_192_Key_Expansion:
  1133. #else
  1134. .globl _AES_192_Key_Expansion
  1135. _AES_192_Key_Expansion:
  1136. #endif
  1137. # parameter 1: %rdi
  1138. # parameter 2: %rsi
  1139. movdqu (%rdi), %xmm1
  1140. movq 16(%rdi), %xmm3
  1141. movdqa %xmm1, (%rsi)
  1142. movdqa %xmm3, %xmm5
  1143. aeskeygenassist $0x1, %xmm3, %xmm2
  1144. call PREPARE_ROUNDKEY_192
  1145. shufpd $0, %xmm1, %xmm5
  1146. movdqa %xmm5, 16(%rsi)
  1147. movdqa %xmm1, %xmm6
  1148. shufpd $1, %xmm3, %xmm6
  1149. movdqa %xmm6, 32(%rsi)
  1150. aeskeygenassist $0x2, %xmm3, %xmm2
  1151. call PREPARE_ROUNDKEY_192
  1152. movdqa %xmm1, 48(%rsi)
  1153. movdqa %xmm3, %xmm5
  1154. aeskeygenassist $0x4, %xmm3, %xmm2
  1155. call PREPARE_ROUNDKEY_192
  1156. shufpd $0, %xmm1, %xmm5
  1157. movdqa %xmm5, 64(%rsi)
  1158. movdqa %xmm1, %xmm6
  1159. shufpd $1, %xmm3, %xmm6
  1160. movdqa %xmm6, 80(%rsi)
  1161. aeskeygenassist $0x8, %xmm3, %xmm2
  1162. call PREPARE_ROUNDKEY_192
  1163. movdqa %xmm1, 96(%rsi)
  1164. movdqa %xmm3, %xmm5
  1165. aeskeygenassist $0x10, %xmm3, %xmm2
  1166. call PREPARE_ROUNDKEY_192
  1167. shufpd $0, %xmm1, %xmm5
  1168. movdqa %xmm5, 112(%rsi)
  1169. movdqa %xmm1, %xmm6
  1170. shufpd $1, %xmm3, %xmm6
  1171. movdqa %xmm6, 128(%rsi)
  1172. aeskeygenassist $0x20, %xmm3, %xmm2
  1173. call PREPARE_ROUNDKEY_192
  1174. movdqa %xmm1, 144(%rsi)
  1175. movdqa %xmm3, %xmm5
  1176. aeskeygenassist $0x40, %xmm3, %xmm2
  1177. call PREPARE_ROUNDKEY_192
  1178. shufpd $0, %xmm1, %xmm5
  1179. movdqa %xmm5, 160(%rsi)
  1180. movdqa %xmm1, %xmm6
  1181. shufpd $1, %xmm3, %xmm6
  1182. movdqa %xmm6, 176(%rsi)
  1183. aeskeygenassist $0x80, %xmm3, %xmm2
  1184. call PREPARE_ROUNDKEY_192
  1185. movdqa %xmm1, 192(%rsi)
  1186. movdqa %xmm3, 208(%rsi)
  1187. ret
  1188. PREPARE_ROUNDKEY_192:
  1189. pshufd $0x55, %xmm2, %xmm2
  1190. movdqu %xmm1, %xmm4
  1191. pslldq $4, %xmm4
  1192. pxor %xmm4, %xmm1
  1193. pslldq $4, %xmm4
  1194. pxor %xmm4, %xmm1
  1195. pslldq $4, %xmm4
  1196. pxor %xmm4, %xmm1
  1197. pxor %xmm2, %xmm1
  1198. pshufd $0xff, %xmm1, %xmm2
  1199. movdqu %xmm3, %xmm4
  1200. pslldq $4, %xmm4
  1201. pxor %xmm4, %xmm3
  1202. pxor %xmm2, %xmm3
  1203. ret
  1204. /*
  1205. void AES_256_Key_Expansion (const unsigned char *userkey,
  1206. unsigned char *key)
  1207. */
  1208. #ifndef __APPLE__
  1209. .globl AES_256_Key_Expansion
  1210. AES_256_Key_Expansion:
  1211. #else
  1212. .globl _AES_256_Key_Expansion
  1213. _AES_256_Key_Expansion:
  1214. #endif
  1215. # parameter 1: %rdi
  1216. # parameter 2: %rsi
  1217. movdqu (%rdi), %xmm1
  1218. movdqu 16(%rdi), %xmm3
  1219. movdqa %xmm1, (%rsi)
  1220. movdqa %xmm3, 16(%rsi)
  1221. aeskeygenassist $0x1, %xmm3, %xmm2
  1222. call MAKE_RK256_a
  1223. movdqa %xmm1, 32(%rsi)
  1224. aeskeygenassist $0x0, %xmm1, %xmm2
  1225. call MAKE_RK256_b
  1226. movdqa %xmm3, 48(%rsi)
  1227. aeskeygenassist $0x2, %xmm3, %xmm2
  1228. call MAKE_RK256_a
  1229. movdqa %xmm1, 64(%rsi)
  1230. aeskeygenassist $0x0, %xmm1, %xmm2
  1231. call MAKE_RK256_b
  1232. movdqa %xmm3, 80(%rsi)
  1233. aeskeygenassist $0x4, %xmm3, %xmm2
  1234. call MAKE_RK256_a
  1235. movdqa %xmm1, 96(%rsi)
  1236. aeskeygenassist $0x0, %xmm1, %xmm2
  1237. call MAKE_RK256_b
  1238. movdqa %xmm3, 112(%rsi)
  1239. aeskeygenassist $0x8, %xmm3, %xmm2
  1240. call MAKE_RK256_a
  1241. movdqa %xmm1, 128(%rsi)
  1242. aeskeygenassist $0x0, %xmm1, %xmm2
  1243. call MAKE_RK256_b
  1244. movdqa %xmm3, 144(%rsi)
  1245. aeskeygenassist $0x10, %xmm3, %xmm2
  1246. call MAKE_RK256_a
  1247. movdqa %xmm1, 160(%rsi)
  1248. aeskeygenassist $0x0, %xmm1, %xmm2
  1249. call MAKE_RK256_b
  1250. movdqa %xmm3, 176(%rsi)
  1251. aeskeygenassist $0x20, %xmm3, %xmm2
  1252. call MAKE_RK256_a
  1253. movdqa %xmm1, 192(%rsi)
  1254. aeskeygenassist $0x0, %xmm1, %xmm2
  1255. call MAKE_RK256_b
  1256. movdqa %xmm3, 208(%rsi)
  1257. aeskeygenassist $0x40, %xmm3, %xmm2
  1258. call MAKE_RK256_a
  1259. movdqa %xmm1, 224(%rsi)
  1260. ret
  1261. MAKE_RK256_a:
  1262. pshufd $0xff, %xmm2, %xmm2
  1263. movdqa %xmm1, %xmm4
  1264. pslldq $4, %xmm4
  1265. pxor %xmm4, %xmm1
  1266. pslldq $4, %xmm4
  1267. pxor %xmm4, %xmm1
  1268. pslldq $4, %xmm4
  1269. pxor %xmm4, %xmm1
  1270. pxor %xmm2, %xmm1
  1271. ret
  1272. MAKE_RK256_b:
  1273. pshufd $0xaa, %xmm2, %xmm2
  1274. movdqa %xmm3, %xmm4
  1275. pslldq $4, %xmm4
  1276. pxor %xmm4, %xmm3
  1277. pslldq $4, %xmm4
  1278. pxor %xmm4, %xmm3
  1279. pslldq $4, %xmm4
  1280. pxor %xmm4, %xmm3
  1281. pxor %xmm2, %xmm3
  1282. ret
  1283. #if defined(__linux__) && defined(__ELF__)
  1284. .section .note.GNU-stack,"",%progbits
  1285. #endif