vpaes-x86.asm 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674
  1. ; This file is generated from a similarly-named Perl script in the BoringSSL
  2. ; source tree. Do not edit by hand.
  3. %ifdef BORINGSSL_PREFIX
  4. %include "boringssl_prefix_symbols_nasm.inc"
  5. %endif
  6. %ifidn __OUTPUT_FORMAT__,obj
  7. section code use32 class=code align=64
  8. %elifidn __OUTPUT_FORMAT__,win32
  9. $@feat.00 equ 1
  10. section .text code align=64
  11. %else
  12. section .text code
  13. %endif
  14. %ifdef BORINGSSL_DISPATCH_TEST
  15. extern _BORINGSSL_function_hit
  16. %endif
  17. align 64
  18. L$_vpaes_consts:
  19. dd 218628480,235210255,168496130,67568393
  20. dd 252381056,17041926,33884169,51187212
  21. dd 252645135,252645135,252645135,252645135
  22. dd 1512730624,3266504856,1377990664,3401244816
  23. dd 830229760,1275146365,2969422977,3447763452
  24. dd 3411033600,2979783055,338359620,2782886510
  25. dd 4209124096,907596821,221174255,1006095553
  26. dd 191964160,3799684038,3164090317,1589111125
  27. dd 182528256,1777043520,2877432650,3265356744
  28. dd 1874708224,3503451415,3305285752,363511674
  29. dd 1606117888,3487855781,1093350906,2384367825
  30. dd 197121,67569157,134941193,202313229
  31. dd 67569157,134941193,202313229,197121
  32. dd 134941193,202313229,197121,67569157
  33. dd 202313229,197121,67569157,134941193
  34. dd 33619971,100992007,168364043,235736079
  35. dd 235736079,33619971,100992007,168364043
  36. dd 168364043,235736079,33619971,100992007
  37. dd 100992007,168364043,235736079,33619971
  38. dd 50462976,117835012,185207048,252579084
  39. dd 252314880,51251460,117574920,184942860
  40. dd 184682752,252054788,50987272,118359308
  41. dd 118099200,185467140,251790600,50727180
  42. dd 2946363062,528716217,1300004225,1881839624
  43. dd 1532713819,1532713819,1532713819,1532713819
  44. dd 3602276352,4288629033,3737020424,4153884961
  45. dd 1354558464,32357713,2958822624,3775749553
  46. dd 1201988352,132424512,1572796698,503232858
  47. dd 2213177600,1597421020,4103937655,675398315
  48. dd 2749646592,4273543773,1511898873,121693092
  49. dd 3040248576,1103263732,2871565598,1608280554
  50. dd 2236667136,2588920351,482954393,64377734
  51. dd 3069987328,291237287,2117370568,3650299247
  52. dd 533321216,3573750986,2572112006,1401264716
  53. dd 1339849704,2721158661,548607111,3445553514
  54. dd 2128193280,3054596040,2183486460,1257083700
  55. dd 655635200,1165381986,3923443150,2344132524
  56. dd 190078720,256924420,290342170,357187870
  57. dd 1610966272,2263057382,4103205268,309794674
  58. dd 2592527872,2233205587,1335446729,3402964816
  59. dd 3973531904,3225098121,3002836325,1918774430
  60. dd 3870401024,2102906079,2284471353,4117666579
  61. dd 617007872,1021508343,366931923,691083277
  62. dd 2528395776,3491914898,2968704004,1613121270
  63. dd 3445188352,3247741094,844474987,4093578302
  64. dd 651481088,1190302358,1689581232,574775300
  65. dd 4289380608,206939853,2555985458,2489840491
  66. dd 2130264064,327674451,3566485037,3349835193
  67. dd 2470714624,316102159,3636825756,3393945945
  68. db 86,101,99,116,111,114,32,80,101,114,109,117,116,97,116,105
  69. db 111,110,32,65,69,83,32,102,111,114,32,120,56,54,47,83
  70. db 83,83,69,51,44,32,77,105,107,101,32,72,97,109,98,117
  71. db 114,103,32,40,83,116,97,110,102,111,114,100,32,85,110,105
  72. db 118,101,114,115,105,116,121,41,0
  73. align 64
  74. align 16
  75. __vpaes_preheat:
  76. add ebp,DWORD [esp]
  77. movdqa xmm7,[ebp-48]
  78. movdqa xmm6,[ebp-16]
  79. ret
  80. align 16
  81. __vpaes_encrypt_core:
  82. mov ecx,16
  83. mov eax,DWORD [240+edx]
  84. movdqa xmm1,xmm6
  85. movdqa xmm2,[ebp]
  86. pandn xmm1,xmm0
  87. pand xmm0,xmm6
  88. movdqu xmm5,[edx]
  89. db 102,15,56,0,208
  90. movdqa xmm0,[16+ebp]
  91. pxor xmm2,xmm5
  92. psrld xmm1,4
  93. add edx,16
  94. db 102,15,56,0,193
  95. lea ebx,[192+ebp]
  96. pxor xmm0,xmm2
  97. jmp NEAR L$000enc_entry
  98. align 16
  99. L$001enc_loop:
  100. movdqa xmm4,[32+ebp]
  101. movdqa xmm0,[48+ebp]
  102. db 102,15,56,0,226
  103. db 102,15,56,0,195
  104. pxor xmm4,xmm5
  105. movdqa xmm5,[64+ebp]
  106. pxor xmm0,xmm4
  107. movdqa xmm1,[ecx*1+ebx-64]
  108. db 102,15,56,0,234
  109. movdqa xmm2,[80+ebp]
  110. movdqa xmm4,[ecx*1+ebx]
  111. db 102,15,56,0,211
  112. movdqa xmm3,xmm0
  113. pxor xmm2,xmm5
  114. db 102,15,56,0,193
  115. add edx,16
  116. pxor xmm0,xmm2
  117. db 102,15,56,0,220
  118. add ecx,16
  119. pxor xmm3,xmm0
  120. db 102,15,56,0,193
  121. and ecx,48
  122. sub eax,1
  123. pxor xmm0,xmm3
  124. L$000enc_entry:
  125. movdqa xmm1,xmm6
  126. movdqa xmm5,[ebp-32]
  127. pandn xmm1,xmm0
  128. psrld xmm1,4
  129. pand xmm0,xmm6
  130. db 102,15,56,0,232
  131. movdqa xmm3,xmm7
  132. pxor xmm0,xmm1
  133. db 102,15,56,0,217
  134. movdqa xmm4,xmm7
  135. pxor xmm3,xmm5
  136. db 102,15,56,0,224
  137. movdqa xmm2,xmm7
  138. pxor xmm4,xmm5
  139. db 102,15,56,0,211
  140. movdqa xmm3,xmm7
  141. pxor xmm2,xmm0
  142. db 102,15,56,0,220
  143. movdqu xmm5,[edx]
  144. pxor xmm3,xmm1
  145. jnz NEAR L$001enc_loop
  146. movdqa xmm4,[96+ebp]
  147. movdqa xmm0,[112+ebp]
  148. db 102,15,56,0,226
  149. pxor xmm4,xmm5
  150. db 102,15,56,0,195
  151. movdqa xmm1,[64+ecx*1+ebx]
  152. pxor xmm0,xmm4
  153. db 102,15,56,0,193
  154. ret
  155. align 16
  156. __vpaes_decrypt_core:
  157. lea ebx,[608+ebp]
  158. mov eax,DWORD [240+edx]
  159. movdqa xmm1,xmm6
  160. movdqa xmm2,[ebx-64]
  161. pandn xmm1,xmm0
  162. mov ecx,eax
  163. psrld xmm1,4
  164. movdqu xmm5,[edx]
  165. shl ecx,4
  166. pand xmm0,xmm6
  167. db 102,15,56,0,208
  168. movdqa xmm0,[ebx-48]
  169. xor ecx,48
  170. db 102,15,56,0,193
  171. and ecx,48
  172. pxor xmm2,xmm5
  173. movdqa xmm5,[176+ebp]
  174. pxor xmm0,xmm2
  175. add edx,16
  176. lea ecx,[ecx*1+ebx-352]
  177. jmp NEAR L$002dec_entry
  178. align 16
  179. L$003dec_loop:
  180. movdqa xmm4,[ebx-32]
  181. movdqa xmm1,[ebx-16]
  182. db 102,15,56,0,226
  183. db 102,15,56,0,203
  184. pxor xmm0,xmm4
  185. movdqa xmm4,[ebx]
  186. pxor xmm0,xmm1
  187. movdqa xmm1,[16+ebx]
  188. db 102,15,56,0,226
  189. db 102,15,56,0,197
  190. db 102,15,56,0,203
  191. pxor xmm0,xmm4
  192. movdqa xmm4,[32+ebx]
  193. pxor xmm0,xmm1
  194. movdqa xmm1,[48+ebx]
  195. db 102,15,56,0,226
  196. db 102,15,56,0,197
  197. db 102,15,56,0,203
  198. pxor xmm0,xmm4
  199. movdqa xmm4,[64+ebx]
  200. pxor xmm0,xmm1
  201. movdqa xmm1,[80+ebx]
  202. db 102,15,56,0,226
  203. db 102,15,56,0,197
  204. db 102,15,56,0,203
  205. pxor xmm0,xmm4
  206. add edx,16
  207. db 102,15,58,15,237,12
  208. pxor xmm0,xmm1
  209. sub eax,1
  210. L$002dec_entry:
  211. movdqa xmm1,xmm6
  212. movdqa xmm2,[ebp-32]
  213. pandn xmm1,xmm0
  214. pand xmm0,xmm6
  215. psrld xmm1,4
  216. db 102,15,56,0,208
  217. movdqa xmm3,xmm7
  218. pxor xmm0,xmm1
  219. db 102,15,56,0,217
  220. movdqa xmm4,xmm7
  221. pxor xmm3,xmm2
  222. db 102,15,56,0,224
  223. pxor xmm4,xmm2
  224. movdqa xmm2,xmm7
  225. db 102,15,56,0,211
  226. movdqa xmm3,xmm7
  227. pxor xmm2,xmm0
  228. db 102,15,56,0,220
  229. movdqu xmm0,[edx]
  230. pxor xmm3,xmm1
  231. jnz NEAR L$003dec_loop
  232. movdqa xmm4,[96+ebx]
  233. db 102,15,56,0,226
  234. pxor xmm4,xmm0
  235. movdqa xmm0,[112+ebx]
  236. movdqa xmm2,[ecx]
  237. db 102,15,56,0,195
  238. pxor xmm0,xmm4
  239. db 102,15,56,0,194
  240. ret
  241. align 16
  242. __vpaes_schedule_core:
  243. add ebp,DWORD [esp]
  244. movdqu xmm0,[esi]
  245. movdqa xmm2,[320+ebp]
  246. movdqa xmm3,xmm0
  247. lea ebx,[ebp]
  248. movdqa [4+esp],xmm2
  249. call __vpaes_schedule_transform
  250. movdqa xmm7,xmm0
  251. test edi,edi
  252. jnz NEAR L$004schedule_am_decrypting
  253. movdqu [edx],xmm0
  254. jmp NEAR L$005schedule_go
  255. L$004schedule_am_decrypting:
  256. movdqa xmm1,[256+ecx*1+ebp]
  257. db 102,15,56,0,217
  258. movdqu [edx],xmm3
  259. xor ecx,48
  260. L$005schedule_go:
  261. cmp eax,192
  262. ja NEAR L$006schedule_256
  263. je NEAR L$007schedule_192
  264. L$008schedule_128:
  265. mov eax,10
  266. L$009loop_schedule_128:
  267. call __vpaes_schedule_round
  268. dec eax
  269. jz NEAR L$010schedule_mangle_last
  270. call __vpaes_schedule_mangle
  271. jmp NEAR L$009loop_schedule_128
  272. align 16
  273. L$007schedule_192:
  274. movdqu xmm0,[8+esi]
  275. call __vpaes_schedule_transform
  276. movdqa xmm6,xmm0
  277. pxor xmm4,xmm4
  278. movhlps xmm6,xmm4
  279. mov eax,4
  280. L$011loop_schedule_192:
  281. call __vpaes_schedule_round
  282. db 102,15,58,15,198,8
  283. call __vpaes_schedule_mangle
  284. call __vpaes_schedule_192_smear
  285. call __vpaes_schedule_mangle
  286. call __vpaes_schedule_round
  287. dec eax
  288. jz NEAR L$010schedule_mangle_last
  289. call __vpaes_schedule_mangle
  290. call __vpaes_schedule_192_smear
  291. jmp NEAR L$011loop_schedule_192
  292. align 16
  293. L$006schedule_256:
  294. movdqu xmm0,[16+esi]
  295. call __vpaes_schedule_transform
  296. mov eax,7
  297. L$012loop_schedule_256:
  298. call __vpaes_schedule_mangle
  299. movdqa xmm6,xmm0
  300. call __vpaes_schedule_round
  301. dec eax
  302. jz NEAR L$010schedule_mangle_last
  303. call __vpaes_schedule_mangle
  304. pshufd xmm0,xmm0,255
  305. movdqa [20+esp],xmm7
  306. movdqa xmm7,xmm6
  307. call L$_vpaes_schedule_low_round
  308. movdqa xmm7,[20+esp]
  309. jmp NEAR L$012loop_schedule_256
  310. align 16
  311. L$010schedule_mangle_last:
  312. lea ebx,[384+ebp]
  313. test edi,edi
  314. jnz NEAR L$013schedule_mangle_last_dec
  315. movdqa xmm1,[256+ecx*1+ebp]
  316. db 102,15,56,0,193
  317. lea ebx,[352+ebp]
  318. add edx,32
  319. L$013schedule_mangle_last_dec:
  320. add edx,-16
  321. pxor xmm0,[336+ebp]
  322. call __vpaes_schedule_transform
  323. movdqu [edx],xmm0
  324. pxor xmm0,xmm0
  325. pxor xmm1,xmm1
  326. pxor xmm2,xmm2
  327. pxor xmm3,xmm3
  328. pxor xmm4,xmm4
  329. pxor xmm5,xmm5
  330. pxor xmm6,xmm6
  331. pxor xmm7,xmm7
  332. ret
  333. align 16
  334. __vpaes_schedule_192_smear:
  335. pshufd xmm1,xmm6,128
  336. pshufd xmm0,xmm7,254
  337. pxor xmm6,xmm1
  338. pxor xmm1,xmm1
  339. pxor xmm6,xmm0
  340. movdqa xmm0,xmm6
  341. movhlps xmm6,xmm1
  342. ret
  343. align 16
  344. __vpaes_schedule_round:
  345. movdqa xmm2,[8+esp]
  346. pxor xmm1,xmm1
  347. db 102,15,58,15,202,15
  348. db 102,15,58,15,210,15
  349. pxor xmm7,xmm1
  350. pshufd xmm0,xmm0,255
  351. db 102,15,58,15,192,1
  352. movdqa [8+esp],xmm2
  353. L$_vpaes_schedule_low_round:
  354. movdqa xmm1,xmm7
  355. pslldq xmm7,4
  356. pxor xmm7,xmm1
  357. movdqa xmm1,xmm7
  358. pslldq xmm7,8
  359. pxor xmm7,xmm1
  360. pxor xmm7,[336+ebp]
  361. movdqa xmm4,[ebp-16]
  362. movdqa xmm5,[ebp-48]
  363. movdqa xmm1,xmm4
  364. pandn xmm1,xmm0
  365. psrld xmm1,4
  366. pand xmm0,xmm4
  367. movdqa xmm2,[ebp-32]
  368. db 102,15,56,0,208
  369. pxor xmm0,xmm1
  370. movdqa xmm3,xmm5
  371. db 102,15,56,0,217
  372. pxor xmm3,xmm2
  373. movdqa xmm4,xmm5
  374. db 102,15,56,0,224
  375. pxor xmm4,xmm2
  376. movdqa xmm2,xmm5
  377. db 102,15,56,0,211
  378. pxor xmm2,xmm0
  379. movdqa xmm3,xmm5
  380. db 102,15,56,0,220
  381. pxor xmm3,xmm1
  382. movdqa xmm4,[32+ebp]
  383. db 102,15,56,0,226
  384. movdqa xmm0,[48+ebp]
  385. db 102,15,56,0,195
  386. pxor xmm0,xmm4
  387. pxor xmm0,xmm7
  388. movdqa xmm7,xmm0
  389. ret
  390. align 16
  391. __vpaes_schedule_transform:
  392. movdqa xmm2,[ebp-16]
  393. movdqa xmm1,xmm2
  394. pandn xmm1,xmm0
  395. psrld xmm1,4
  396. pand xmm0,xmm2
  397. movdqa xmm2,[ebx]
  398. db 102,15,56,0,208
  399. movdqa xmm0,[16+ebx]
  400. db 102,15,56,0,193
  401. pxor xmm0,xmm2
  402. ret
  403. align 16
  404. __vpaes_schedule_mangle:
  405. movdqa xmm4,xmm0
  406. movdqa xmm5,[128+ebp]
  407. test edi,edi
  408. jnz NEAR L$014schedule_mangle_dec
  409. add edx,16
  410. pxor xmm4,[336+ebp]
  411. db 102,15,56,0,229
  412. movdqa xmm3,xmm4
  413. db 102,15,56,0,229
  414. pxor xmm3,xmm4
  415. db 102,15,56,0,229
  416. pxor xmm3,xmm4
  417. jmp NEAR L$015schedule_mangle_both
  418. align 16
  419. L$014schedule_mangle_dec:
  420. movdqa xmm2,[ebp-16]
  421. lea esi,[416+ebp]
  422. movdqa xmm1,xmm2
  423. pandn xmm1,xmm4
  424. psrld xmm1,4
  425. pand xmm4,xmm2
  426. movdqa xmm2,[esi]
  427. db 102,15,56,0,212
  428. movdqa xmm3,[16+esi]
  429. db 102,15,56,0,217
  430. pxor xmm3,xmm2
  431. db 102,15,56,0,221
  432. movdqa xmm2,[32+esi]
  433. db 102,15,56,0,212
  434. pxor xmm2,xmm3
  435. movdqa xmm3,[48+esi]
  436. db 102,15,56,0,217
  437. pxor xmm3,xmm2
  438. db 102,15,56,0,221
  439. movdqa xmm2,[64+esi]
  440. db 102,15,56,0,212
  441. pxor xmm2,xmm3
  442. movdqa xmm3,[80+esi]
  443. db 102,15,56,0,217
  444. pxor xmm3,xmm2
  445. db 102,15,56,0,221
  446. movdqa xmm2,[96+esi]
  447. db 102,15,56,0,212
  448. pxor xmm2,xmm3
  449. movdqa xmm3,[112+esi]
  450. db 102,15,56,0,217
  451. pxor xmm3,xmm2
  452. add edx,-16
  453. L$015schedule_mangle_both:
  454. movdqa xmm1,[256+ecx*1+ebp]
  455. db 102,15,56,0,217
  456. add ecx,-16
  457. and ecx,48
  458. movdqu [edx],xmm3
  459. ret
  460. global _vpaes_set_encrypt_key
  461. align 16
  462. _vpaes_set_encrypt_key:
  463. L$_vpaes_set_encrypt_key_begin:
  464. push ebp
  465. push ebx
  466. push esi
  467. push edi
  468. %ifdef BORINGSSL_DISPATCH_TEST
  469. push ebx
  470. push edx
  471. call L$016pic
  472. L$016pic:
  473. pop ebx
  474. lea ebx,[(_BORINGSSL_function_hit+5-L$016pic)+ebx]
  475. mov edx,1
  476. mov BYTE [ebx],dl
  477. pop edx
  478. pop ebx
  479. %endif
  480. mov esi,DWORD [20+esp]
  481. lea ebx,[esp-56]
  482. mov eax,DWORD [24+esp]
  483. and ebx,-16
  484. mov edx,DWORD [28+esp]
  485. xchg ebx,esp
  486. mov DWORD [48+esp],ebx
  487. mov ebx,eax
  488. shr ebx,5
  489. add ebx,5
  490. mov DWORD [240+edx],ebx
  491. mov ecx,48
  492. mov edi,0
  493. lea ebp,[(L$_vpaes_consts+0x30-L$017pic_point)]
  494. call __vpaes_schedule_core
  495. L$017pic_point:
  496. mov esp,DWORD [48+esp]
  497. xor eax,eax
  498. pop edi
  499. pop esi
  500. pop ebx
  501. pop ebp
  502. ret
  503. global _vpaes_set_decrypt_key
  504. align 16
  505. _vpaes_set_decrypt_key:
  506. L$_vpaes_set_decrypt_key_begin:
  507. push ebp
  508. push ebx
  509. push esi
  510. push edi
  511. mov esi,DWORD [20+esp]
  512. lea ebx,[esp-56]
  513. mov eax,DWORD [24+esp]
  514. and ebx,-16
  515. mov edx,DWORD [28+esp]
  516. xchg ebx,esp
  517. mov DWORD [48+esp],ebx
  518. mov ebx,eax
  519. shr ebx,5
  520. add ebx,5
  521. mov DWORD [240+edx],ebx
  522. shl ebx,4
  523. lea edx,[16+ebx*1+edx]
  524. mov edi,1
  525. mov ecx,eax
  526. shr ecx,1
  527. and ecx,32
  528. xor ecx,32
  529. lea ebp,[(L$_vpaes_consts+0x30-L$018pic_point)]
  530. call __vpaes_schedule_core
  531. L$018pic_point:
  532. mov esp,DWORD [48+esp]
  533. xor eax,eax
  534. pop edi
  535. pop esi
  536. pop ebx
  537. pop ebp
  538. ret
  539. global _vpaes_encrypt
  540. align 16
  541. _vpaes_encrypt:
  542. L$_vpaes_encrypt_begin:
  543. push ebp
  544. push ebx
  545. push esi
  546. push edi
  547. %ifdef BORINGSSL_DISPATCH_TEST
  548. push ebx
  549. push edx
  550. call L$019pic
  551. L$019pic:
  552. pop ebx
  553. lea ebx,[(_BORINGSSL_function_hit+4-L$019pic)+ebx]
  554. mov edx,1
  555. mov BYTE [ebx],dl
  556. pop edx
  557. pop ebx
  558. %endif
  559. lea ebp,[(L$_vpaes_consts+0x30-L$020pic_point)]
  560. call __vpaes_preheat
  561. L$020pic_point:
  562. mov esi,DWORD [20+esp]
  563. lea ebx,[esp-56]
  564. mov edi,DWORD [24+esp]
  565. and ebx,-16
  566. mov edx,DWORD [28+esp]
  567. xchg ebx,esp
  568. mov DWORD [48+esp],ebx
  569. movdqu xmm0,[esi]
  570. call __vpaes_encrypt_core
  571. movdqu [edi],xmm0
  572. mov esp,DWORD [48+esp]
  573. pop edi
  574. pop esi
  575. pop ebx
  576. pop ebp
  577. ret
  578. global _vpaes_decrypt
  579. align 16
  580. _vpaes_decrypt:
  581. L$_vpaes_decrypt_begin:
  582. push ebp
  583. push ebx
  584. push esi
  585. push edi
  586. lea ebp,[(L$_vpaes_consts+0x30-L$021pic_point)]
  587. call __vpaes_preheat
  588. L$021pic_point:
  589. mov esi,DWORD [20+esp]
  590. lea ebx,[esp-56]
  591. mov edi,DWORD [24+esp]
  592. and ebx,-16
  593. mov edx,DWORD [28+esp]
  594. xchg ebx,esp
  595. mov DWORD [48+esp],ebx
  596. movdqu xmm0,[esi]
  597. call __vpaes_decrypt_core
  598. movdqu [edi],xmm0
  599. mov esp,DWORD [48+esp]
  600. pop edi
  601. pop esi
  602. pop ebx
  603. pop ebp
  604. ret
  605. global _vpaes_cbc_encrypt
  606. align 16
  607. _vpaes_cbc_encrypt:
  608. L$_vpaes_cbc_encrypt_begin:
  609. push ebp
  610. push ebx
  611. push esi
  612. push edi
  613. mov esi,DWORD [20+esp]
  614. mov edi,DWORD [24+esp]
  615. mov eax,DWORD [28+esp]
  616. mov edx,DWORD [32+esp]
  617. sub eax,16
  618. jc NEAR L$022cbc_abort
  619. lea ebx,[esp-56]
  620. mov ebp,DWORD [36+esp]
  621. and ebx,-16
  622. mov ecx,DWORD [40+esp]
  623. xchg ebx,esp
  624. movdqu xmm1,[ebp]
  625. sub edi,esi
  626. mov DWORD [48+esp],ebx
  627. mov DWORD [esp],edi
  628. mov DWORD [4+esp],edx
  629. mov DWORD [8+esp],ebp
  630. mov edi,eax
  631. lea ebp,[(L$_vpaes_consts+0x30-L$023pic_point)]
  632. call __vpaes_preheat
  633. L$023pic_point:
  634. cmp ecx,0
  635. je NEAR L$024cbc_dec_loop
  636. jmp NEAR L$025cbc_enc_loop
  637. align 16
  638. L$025cbc_enc_loop:
  639. movdqu xmm0,[esi]
  640. pxor xmm0,xmm1
  641. call __vpaes_encrypt_core
  642. mov ebx,DWORD [esp]
  643. mov edx,DWORD [4+esp]
  644. movdqa xmm1,xmm0
  645. movdqu [esi*1+ebx],xmm0
  646. lea esi,[16+esi]
  647. sub edi,16
  648. jnc NEAR L$025cbc_enc_loop
  649. jmp NEAR L$026cbc_done
  650. align 16
  651. L$024cbc_dec_loop:
  652. movdqu xmm0,[esi]
  653. movdqa [16+esp],xmm1
  654. movdqa [32+esp],xmm0
  655. call __vpaes_decrypt_core
  656. mov ebx,DWORD [esp]
  657. mov edx,DWORD [4+esp]
  658. pxor xmm0,[16+esp]
  659. movdqa xmm1,[32+esp]
  660. movdqu [esi*1+ebx],xmm0
  661. lea esi,[16+esi]
  662. sub edi,16
  663. jnc NEAR L$024cbc_dec_loop
  664. L$026cbc_done:
  665. mov ebx,DWORD [8+esp]
  666. mov esp,DWORD [48+esp]
  667. movdqu [ebx],xmm1
  668. L$022cbc_abort:
  669. pop edi
  670. pop esi
  671. pop ebx
  672. pop ebp
  673. ret