rc4-x86_64.masm 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785
  1. OPTION DOTNAME
  2. .text$ SEGMENT ALIGN(256) 'CODE'
  3. EXTERN OPENSSL_ia32cap_P:NEAR
  4. PUBLIC RC4
  5. ALIGN 16
  6. RC4 PROC PUBLIC
  7. mov QWORD PTR[8+rsp],rdi ;WIN64 prologue
  8. mov QWORD PTR[16+rsp],rsi
  9. mov rax,rsp
  10. $L$SEH_begin_RC4::
  11. mov rdi,rcx
  12. mov rsi,rdx
  13. mov rdx,r8
  14. mov rcx,r9
  15. or rsi,rsi
  16. jne $L$entry
  17. mov rdi,QWORD PTR[8+rsp] ;WIN64 epilogue
  18. mov rsi,QWORD PTR[16+rsp]
  19. DB 0F3h,0C3h ;repret
  20. $L$entry::
  21. push rbx
  22. push r12
  23. push r13
  24. $L$prologue::
  25. mov r11,rsi
  26. mov r12,rdx
  27. mov r13,rcx
  28. xor r10,r10
  29. xor rcx,rcx
  30. lea rdi,QWORD PTR[8+rdi]
  31. mov r10b,BYTE PTR[((-8))+rdi]
  32. mov cl,BYTE PTR[((-4))+rdi]
  33. cmp DWORD PTR[256+rdi],-1
  34. je $L$RC4_CHAR
  35. mov r8d,DWORD PTR[OPENSSL_ia32cap_P]
  36. xor rbx,rbx
  37. inc r10b
  38. sub rbx,r10
  39. sub r13,r12
  40. mov eax,DWORD PTR[r10*4+rdi]
  41. test r11,-16
  42. jz $L$loop1
  43. bt r8d,30
  44. jc $L$intel
  45. and rbx,7
  46. lea rsi,QWORD PTR[1+r10]
  47. jz $L$oop8
  48. sub r11,rbx
  49. $L$oop8_warmup::
  50. add cl,al
  51. mov edx,DWORD PTR[rcx*4+rdi]
  52. mov DWORD PTR[rcx*4+rdi],eax
  53. mov DWORD PTR[r10*4+rdi],edx
  54. add al,dl
  55. inc r10b
  56. mov edx,DWORD PTR[rax*4+rdi]
  57. mov eax,DWORD PTR[r10*4+rdi]
  58. xor dl,BYTE PTR[r12]
  59. mov BYTE PTR[r13*1+r12],dl
  60. lea r12,QWORD PTR[1+r12]
  61. dec rbx
  62. jnz $L$oop8_warmup
  63. lea rsi,QWORD PTR[1+r10]
  64. jmp $L$oop8
  65. ALIGN 16
  66. $L$oop8::
  67. add cl,al
  68. mov edx,DWORD PTR[rcx*4+rdi]
  69. mov DWORD PTR[rcx*4+rdi],eax
  70. mov ebx,DWORD PTR[rsi*4+rdi]
  71. ror r8,8
  72. mov DWORD PTR[r10*4+rdi],edx
  73. add dl,al
  74. mov r8b,BYTE PTR[rdx*4+rdi]
  75. add cl,bl
  76. mov edx,DWORD PTR[rcx*4+rdi]
  77. mov DWORD PTR[rcx*4+rdi],ebx
  78. mov eax,DWORD PTR[4+rsi*4+rdi]
  79. ror r8,8
  80. mov DWORD PTR[4+r10*4+rdi],edx
  81. add dl,bl
  82. mov r8b,BYTE PTR[rdx*4+rdi]
  83. add cl,al
  84. mov edx,DWORD PTR[rcx*4+rdi]
  85. mov DWORD PTR[rcx*4+rdi],eax
  86. mov ebx,DWORD PTR[8+rsi*4+rdi]
  87. ror r8,8
  88. mov DWORD PTR[8+r10*4+rdi],edx
  89. add dl,al
  90. mov r8b,BYTE PTR[rdx*4+rdi]
  91. add cl,bl
  92. mov edx,DWORD PTR[rcx*4+rdi]
  93. mov DWORD PTR[rcx*4+rdi],ebx
  94. mov eax,DWORD PTR[12+rsi*4+rdi]
  95. ror r8,8
  96. mov DWORD PTR[12+r10*4+rdi],edx
  97. add dl,bl
  98. mov r8b,BYTE PTR[rdx*4+rdi]
  99. add cl,al
  100. mov edx,DWORD PTR[rcx*4+rdi]
  101. mov DWORD PTR[rcx*4+rdi],eax
  102. mov ebx,DWORD PTR[16+rsi*4+rdi]
  103. ror r8,8
  104. mov DWORD PTR[16+r10*4+rdi],edx
  105. add dl,al
  106. mov r8b,BYTE PTR[rdx*4+rdi]
  107. add cl,bl
  108. mov edx,DWORD PTR[rcx*4+rdi]
  109. mov DWORD PTR[rcx*4+rdi],ebx
  110. mov eax,DWORD PTR[20+rsi*4+rdi]
  111. ror r8,8
  112. mov DWORD PTR[20+r10*4+rdi],edx
  113. add dl,bl
  114. mov r8b,BYTE PTR[rdx*4+rdi]
  115. add cl,al
  116. mov edx,DWORD PTR[rcx*4+rdi]
  117. mov DWORD PTR[rcx*4+rdi],eax
  118. mov ebx,DWORD PTR[24+rsi*4+rdi]
  119. ror r8,8
  120. mov DWORD PTR[24+r10*4+rdi],edx
  121. add dl,al
  122. mov r8b,BYTE PTR[rdx*4+rdi]
  123. add sil,8
  124. add cl,bl
  125. mov edx,DWORD PTR[rcx*4+rdi]
  126. mov DWORD PTR[rcx*4+rdi],ebx
  127. mov eax,DWORD PTR[((-4))+rsi*4+rdi]
  128. ror r8,8
  129. mov DWORD PTR[28+r10*4+rdi],edx
  130. add dl,bl
  131. mov r8b,BYTE PTR[rdx*4+rdi]
  132. add r10b,8
  133. ror r8,8
  134. sub r11,8
  135. xor r8,QWORD PTR[r12]
  136. mov QWORD PTR[r13*1+r12],r8
  137. lea r12,QWORD PTR[8+r12]
  138. test r11,-8
  139. jnz $L$oop8
  140. cmp r11,0
  141. jne $L$loop1
  142. jmp $L$exit
  143. ALIGN 16
  144. $L$intel::
  145. test r11,-32
  146. jz $L$loop1
  147. and rbx,15
  148. jz $L$oop16_is_hot
  149. sub r11,rbx
  150. $L$oop16_warmup::
  151. add cl,al
  152. mov edx,DWORD PTR[rcx*4+rdi]
  153. mov DWORD PTR[rcx*4+rdi],eax
  154. mov DWORD PTR[r10*4+rdi],edx
  155. add al,dl
  156. inc r10b
  157. mov edx,DWORD PTR[rax*4+rdi]
  158. mov eax,DWORD PTR[r10*4+rdi]
  159. xor dl,BYTE PTR[r12]
  160. mov BYTE PTR[r13*1+r12],dl
  161. lea r12,QWORD PTR[1+r12]
  162. dec rbx
  163. jnz $L$oop16_warmup
  164. mov rbx,rcx
  165. xor rcx,rcx
  166. mov cl,bl
  167. $L$oop16_is_hot::
  168. lea rsi,QWORD PTR[r10*4+rdi]
  169. add cl,al
  170. mov edx,DWORD PTR[rcx*4+rdi]
  171. pxor xmm0,xmm0
  172. mov DWORD PTR[rcx*4+rdi],eax
  173. add al,dl
  174. mov ebx,DWORD PTR[4+rsi]
  175. movzx eax,al
  176. mov DWORD PTR[rsi],edx
  177. add cl,bl
  178. pinsrw xmm0,WORD PTR[rax*4+rdi],0
  179. jmp $L$oop16_enter
  180. ALIGN 16
  181. $L$oop16::
  182. add cl,al
  183. mov edx,DWORD PTR[rcx*4+rdi]
  184. pxor xmm2,xmm0
  185. psllq xmm1,8
  186. pxor xmm0,xmm0
  187. mov DWORD PTR[rcx*4+rdi],eax
  188. add al,dl
  189. mov ebx,DWORD PTR[4+rsi]
  190. movzx eax,al
  191. mov DWORD PTR[rsi],edx
  192. pxor xmm2,xmm1
  193. add cl,bl
  194. pinsrw xmm0,WORD PTR[rax*4+rdi],0
  195. movdqu XMMWORD PTR[r13*1+r12],xmm2
  196. lea r12,QWORD PTR[16+r12]
  197. $L$oop16_enter::
  198. mov edx,DWORD PTR[rcx*4+rdi]
  199. pxor xmm1,xmm1
  200. mov DWORD PTR[rcx*4+rdi],ebx
  201. add bl,dl
  202. mov eax,DWORD PTR[8+rsi]
  203. movzx ebx,bl
  204. mov DWORD PTR[4+rsi],edx
  205. add cl,al
  206. pinsrw xmm1,WORD PTR[rbx*4+rdi],0
  207. mov edx,DWORD PTR[rcx*4+rdi]
  208. mov DWORD PTR[rcx*4+rdi],eax
  209. add al,dl
  210. mov ebx,DWORD PTR[12+rsi]
  211. movzx eax,al
  212. mov DWORD PTR[8+rsi],edx
  213. add cl,bl
  214. pinsrw xmm0,WORD PTR[rax*4+rdi],1
  215. mov edx,DWORD PTR[rcx*4+rdi]
  216. mov DWORD PTR[rcx*4+rdi],ebx
  217. add bl,dl
  218. mov eax,DWORD PTR[16+rsi]
  219. movzx ebx,bl
  220. mov DWORD PTR[12+rsi],edx
  221. add cl,al
  222. pinsrw xmm1,WORD PTR[rbx*4+rdi],1
  223. mov edx,DWORD PTR[rcx*4+rdi]
  224. mov DWORD PTR[rcx*4+rdi],eax
  225. add al,dl
  226. mov ebx,DWORD PTR[20+rsi]
  227. movzx eax,al
  228. mov DWORD PTR[16+rsi],edx
  229. add cl,bl
  230. pinsrw xmm0,WORD PTR[rax*4+rdi],2
  231. mov edx,DWORD PTR[rcx*4+rdi]
  232. mov DWORD PTR[rcx*4+rdi],ebx
  233. add bl,dl
  234. mov eax,DWORD PTR[24+rsi]
  235. movzx ebx,bl
  236. mov DWORD PTR[20+rsi],edx
  237. add cl,al
  238. pinsrw xmm1,WORD PTR[rbx*4+rdi],2
  239. mov edx,DWORD PTR[rcx*4+rdi]
  240. mov DWORD PTR[rcx*4+rdi],eax
  241. add al,dl
  242. mov ebx,DWORD PTR[28+rsi]
  243. movzx eax,al
  244. mov DWORD PTR[24+rsi],edx
  245. add cl,bl
  246. pinsrw xmm0,WORD PTR[rax*4+rdi],3
  247. mov edx,DWORD PTR[rcx*4+rdi]
  248. mov DWORD PTR[rcx*4+rdi],ebx
  249. add bl,dl
  250. mov eax,DWORD PTR[32+rsi]
  251. movzx ebx,bl
  252. mov DWORD PTR[28+rsi],edx
  253. add cl,al
  254. pinsrw xmm1,WORD PTR[rbx*4+rdi],3
  255. mov edx,DWORD PTR[rcx*4+rdi]
  256. mov DWORD PTR[rcx*4+rdi],eax
  257. add al,dl
  258. mov ebx,DWORD PTR[36+rsi]
  259. movzx eax,al
  260. mov DWORD PTR[32+rsi],edx
  261. add cl,bl
  262. pinsrw xmm0,WORD PTR[rax*4+rdi],4
  263. mov edx,DWORD PTR[rcx*4+rdi]
  264. mov DWORD PTR[rcx*4+rdi],ebx
  265. add bl,dl
  266. mov eax,DWORD PTR[40+rsi]
  267. movzx ebx,bl
  268. mov DWORD PTR[36+rsi],edx
  269. add cl,al
  270. pinsrw xmm1,WORD PTR[rbx*4+rdi],4
  271. mov edx,DWORD PTR[rcx*4+rdi]
  272. mov DWORD PTR[rcx*4+rdi],eax
  273. add al,dl
  274. mov ebx,DWORD PTR[44+rsi]
  275. movzx eax,al
  276. mov DWORD PTR[40+rsi],edx
  277. add cl,bl
  278. pinsrw xmm0,WORD PTR[rax*4+rdi],5
  279. mov edx,DWORD PTR[rcx*4+rdi]
  280. mov DWORD PTR[rcx*4+rdi],ebx
  281. add bl,dl
  282. mov eax,DWORD PTR[48+rsi]
  283. movzx ebx,bl
  284. mov DWORD PTR[44+rsi],edx
  285. add cl,al
  286. pinsrw xmm1,WORD PTR[rbx*4+rdi],5
  287. mov edx,DWORD PTR[rcx*4+rdi]
  288. mov DWORD PTR[rcx*4+rdi],eax
  289. add al,dl
  290. mov ebx,DWORD PTR[52+rsi]
  291. movzx eax,al
  292. mov DWORD PTR[48+rsi],edx
  293. add cl,bl
  294. pinsrw xmm0,WORD PTR[rax*4+rdi],6
  295. mov edx,DWORD PTR[rcx*4+rdi]
  296. mov DWORD PTR[rcx*4+rdi],ebx
  297. add bl,dl
  298. mov eax,DWORD PTR[56+rsi]
  299. movzx ebx,bl
  300. mov DWORD PTR[52+rsi],edx
  301. add cl,al
  302. pinsrw xmm1,WORD PTR[rbx*4+rdi],6
  303. mov edx,DWORD PTR[rcx*4+rdi]
  304. mov DWORD PTR[rcx*4+rdi],eax
  305. add al,dl
  306. mov ebx,DWORD PTR[60+rsi]
  307. movzx eax,al
  308. mov DWORD PTR[56+rsi],edx
  309. add cl,bl
  310. pinsrw xmm0,WORD PTR[rax*4+rdi],7
  311. add r10b,16
  312. movdqu xmm2,XMMWORD PTR[r12]
  313. mov edx,DWORD PTR[rcx*4+rdi]
  314. mov DWORD PTR[rcx*4+rdi],ebx
  315. add bl,dl
  316. movzx ebx,bl
  317. mov DWORD PTR[60+rsi],edx
  318. lea rsi,QWORD PTR[r10*4+rdi]
  319. pinsrw xmm1,WORD PTR[rbx*4+rdi],7
  320. mov eax,DWORD PTR[rsi]
  321. mov rbx,rcx
  322. xor rcx,rcx
  323. sub r11,16
  324. mov cl,bl
  325. test r11,-16
  326. jnz $L$oop16
  327. psllq xmm1,8
  328. pxor xmm2,xmm0
  329. pxor xmm2,xmm1
  330. movdqu XMMWORD PTR[r13*1+r12],xmm2
  331. lea r12,QWORD PTR[16+r12]
  332. cmp r11,0
  333. jne $L$loop1
  334. jmp $L$exit
  335. ALIGN 16
  336. $L$loop1::
  337. add cl,al
  338. mov edx,DWORD PTR[rcx*4+rdi]
  339. mov DWORD PTR[rcx*4+rdi],eax
  340. mov DWORD PTR[r10*4+rdi],edx
  341. add al,dl
  342. inc r10b
  343. mov edx,DWORD PTR[rax*4+rdi]
  344. mov eax,DWORD PTR[r10*4+rdi]
  345. xor dl,BYTE PTR[r12]
  346. mov BYTE PTR[r13*1+r12],dl
  347. lea r12,QWORD PTR[1+r12]
  348. dec r11
  349. jnz $L$loop1
  350. jmp $L$exit
  351. ALIGN 16
  352. $L$RC4_CHAR::
  353. add r10b,1
  354. movzx eax,BYTE PTR[r10*1+rdi]
  355. test r11,-8
  356. jz $L$cloop1
  357. jmp $L$cloop8
  358. ALIGN 16
  359. $L$cloop8::
  360. mov r8d,DWORD PTR[r12]
  361. mov r9d,DWORD PTR[4+r12]
  362. add cl,al
  363. lea rsi,QWORD PTR[1+r10]
  364. movzx edx,BYTE PTR[rcx*1+rdi]
  365. movzx esi,sil
  366. movzx ebx,BYTE PTR[rsi*1+rdi]
  367. mov BYTE PTR[rcx*1+rdi],al
  368. cmp rcx,rsi
  369. mov BYTE PTR[r10*1+rdi],dl
  370. jne $L$cmov0
  371. mov rbx,rax
  372. $L$cmov0::
  373. add dl,al
  374. xor r8b,BYTE PTR[rdx*1+rdi]
  375. ror r8d,8
  376. add cl,bl
  377. lea r10,QWORD PTR[1+rsi]
  378. movzx edx,BYTE PTR[rcx*1+rdi]
  379. movzx r10d,r10b
  380. movzx eax,BYTE PTR[r10*1+rdi]
  381. mov BYTE PTR[rcx*1+rdi],bl
  382. cmp rcx,r10
  383. mov BYTE PTR[rsi*1+rdi],dl
  384. jne $L$cmov1
  385. mov rax,rbx
  386. $L$cmov1::
  387. add dl,bl
  388. xor r8b,BYTE PTR[rdx*1+rdi]
  389. ror r8d,8
  390. add cl,al
  391. lea rsi,QWORD PTR[1+r10]
  392. movzx edx,BYTE PTR[rcx*1+rdi]
  393. movzx esi,sil
  394. movzx ebx,BYTE PTR[rsi*1+rdi]
  395. mov BYTE PTR[rcx*1+rdi],al
  396. cmp rcx,rsi
  397. mov BYTE PTR[r10*1+rdi],dl
  398. jne $L$cmov2
  399. mov rbx,rax
  400. $L$cmov2::
  401. add dl,al
  402. xor r8b,BYTE PTR[rdx*1+rdi]
  403. ror r8d,8
  404. add cl,bl
  405. lea r10,QWORD PTR[1+rsi]
  406. movzx edx,BYTE PTR[rcx*1+rdi]
  407. movzx r10d,r10b
  408. movzx eax,BYTE PTR[r10*1+rdi]
  409. mov BYTE PTR[rcx*1+rdi],bl
  410. cmp rcx,r10
  411. mov BYTE PTR[rsi*1+rdi],dl
  412. jne $L$cmov3
  413. mov rax,rbx
  414. $L$cmov3::
  415. add dl,bl
  416. xor r8b,BYTE PTR[rdx*1+rdi]
  417. ror r8d,8
  418. add cl,al
  419. lea rsi,QWORD PTR[1+r10]
  420. movzx edx,BYTE PTR[rcx*1+rdi]
  421. movzx esi,sil
  422. movzx ebx,BYTE PTR[rsi*1+rdi]
  423. mov BYTE PTR[rcx*1+rdi],al
  424. cmp rcx,rsi
  425. mov BYTE PTR[r10*1+rdi],dl
  426. jne $L$cmov4
  427. mov rbx,rax
  428. $L$cmov4::
  429. add dl,al
  430. xor r9b,BYTE PTR[rdx*1+rdi]
  431. ror r9d,8
  432. add cl,bl
  433. lea r10,QWORD PTR[1+rsi]
  434. movzx edx,BYTE PTR[rcx*1+rdi]
  435. movzx r10d,r10b
  436. movzx eax,BYTE PTR[r10*1+rdi]
  437. mov BYTE PTR[rcx*1+rdi],bl
  438. cmp rcx,r10
  439. mov BYTE PTR[rsi*1+rdi],dl
  440. jne $L$cmov5
  441. mov rax,rbx
  442. $L$cmov5::
  443. add dl,bl
  444. xor r9b,BYTE PTR[rdx*1+rdi]
  445. ror r9d,8
  446. add cl,al
  447. lea rsi,QWORD PTR[1+r10]
  448. movzx edx,BYTE PTR[rcx*1+rdi]
  449. movzx esi,sil
  450. movzx ebx,BYTE PTR[rsi*1+rdi]
  451. mov BYTE PTR[rcx*1+rdi],al
  452. cmp rcx,rsi
  453. mov BYTE PTR[r10*1+rdi],dl
  454. jne $L$cmov6
  455. mov rbx,rax
  456. $L$cmov6::
  457. add dl,al
  458. xor r9b,BYTE PTR[rdx*1+rdi]
  459. ror r9d,8
  460. add cl,bl
  461. lea r10,QWORD PTR[1+rsi]
  462. movzx edx,BYTE PTR[rcx*1+rdi]
  463. movzx r10d,r10b
  464. movzx eax,BYTE PTR[r10*1+rdi]
  465. mov BYTE PTR[rcx*1+rdi],bl
  466. cmp rcx,r10
  467. mov BYTE PTR[rsi*1+rdi],dl
  468. jne $L$cmov7
  469. mov rax,rbx
  470. $L$cmov7::
  471. add dl,bl
  472. xor r9b,BYTE PTR[rdx*1+rdi]
  473. ror r9d,8
  474. lea r11,QWORD PTR[((-8))+r11]
  475. mov DWORD PTR[r13],r8d
  476. lea r12,QWORD PTR[8+r12]
  477. mov DWORD PTR[4+r13],r9d
  478. lea r13,QWORD PTR[8+r13]
  479. test r11,-8
  480. jnz $L$cloop8
  481. cmp r11,0
  482. jne $L$cloop1
  483. jmp $L$exit
  484. ALIGN 16
  485. $L$cloop1::
  486. add cl,al
  487. movzx ecx,cl
  488. movzx edx,BYTE PTR[rcx*1+rdi]
  489. mov BYTE PTR[rcx*1+rdi],al
  490. mov BYTE PTR[r10*1+rdi],dl
  491. add dl,al
  492. add r10b,1
  493. movzx edx,dl
  494. movzx r10d,r10b
  495. movzx edx,BYTE PTR[rdx*1+rdi]
  496. movzx eax,BYTE PTR[r10*1+rdi]
  497. xor dl,BYTE PTR[r12]
  498. lea r12,QWORD PTR[1+r12]
  499. mov BYTE PTR[r13],dl
  500. lea r13,QWORD PTR[1+r13]
  501. sub r11,1
  502. jnz $L$cloop1
  503. jmp $L$exit
  504. ALIGN 16
  505. $L$exit::
  506. sub r10b,1
  507. mov DWORD PTR[((-8))+rdi],r10d
  508. mov DWORD PTR[((-4))+rdi],ecx
  509. mov r13,QWORD PTR[rsp]
  510. mov r12,QWORD PTR[8+rsp]
  511. mov rbx,QWORD PTR[16+rsp]
  512. add rsp,24
  513. $L$epilogue::
  514. mov rdi,QWORD PTR[8+rsp] ;WIN64 epilogue
  515. mov rsi,QWORD PTR[16+rsp]
  516. DB 0F3h,0C3h ;repret
  517. $L$SEH_end_RC4::
  518. RC4 ENDP
  519. PUBLIC RC4_set_key
  520. ALIGN 16
  521. RC4_set_key PROC PUBLIC
  522. mov QWORD PTR[8+rsp],rdi ;WIN64 prologue
  523. mov QWORD PTR[16+rsp],rsi
  524. mov rax,rsp
  525. $L$SEH_begin_RC4_set_key::
  526. mov rdi,rcx
  527. mov rsi,rdx
  528. mov rdx,r8
  529. lea rdi,QWORD PTR[8+rdi]
  530. lea rdx,QWORD PTR[rsi*1+rdx]
  531. neg rsi
  532. mov rcx,rsi
  533. xor eax,eax
  534. xor r9,r9
  535. xor r10,r10
  536. xor r11,r11
  537. mov r8d,DWORD PTR[OPENSSL_ia32cap_P]
  538. bt r8d,20
  539. jc $L$c1stloop
  540. jmp $L$w1stloop
  541. ALIGN 16
  542. $L$w1stloop::
  543. mov DWORD PTR[rax*4+rdi],eax
  544. add al,1
  545. jnc $L$w1stloop
  546. xor r9,r9
  547. xor r8,r8
  548. ALIGN 16
  549. $L$w2ndloop::
  550. mov r10d,DWORD PTR[r9*4+rdi]
  551. add r8b,BYTE PTR[rsi*1+rdx]
  552. add r8b,r10b
  553. add rsi,1
  554. mov r11d,DWORD PTR[r8*4+rdi]
  555. cmovz rsi,rcx
  556. mov DWORD PTR[r8*4+rdi],r10d
  557. mov DWORD PTR[r9*4+rdi],r11d
  558. add r9b,1
  559. jnc $L$w2ndloop
  560. jmp $L$exit_key
  561. ALIGN 16
  562. $L$c1stloop::
  563. mov BYTE PTR[rax*1+rdi],al
  564. add al,1
  565. jnc $L$c1stloop
  566. xor r9,r9
  567. xor r8,r8
  568. ALIGN 16
  569. $L$c2ndloop::
  570. mov r10b,BYTE PTR[r9*1+rdi]
  571. add r8b,BYTE PTR[rsi*1+rdx]
  572. add r8b,r10b
  573. add rsi,1
  574. mov r11b,BYTE PTR[r8*1+rdi]
  575. jnz $L$cnowrap
  576. mov rsi,rcx
  577. $L$cnowrap::
  578. mov BYTE PTR[r8*1+rdi],r10b
  579. mov BYTE PTR[r9*1+rdi],r11b
  580. add r9b,1
  581. jnc $L$c2ndloop
  582. mov DWORD PTR[256+rdi],-1
  583. ALIGN 16
  584. $L$exit_key::
  585. xor eax,eax
  586. mov DWORD PTR[((-8))+rdi],eax
  587. mov DWORD PTR[((-4))+rdi],eax
  588. mov rdi,QWORD PTR[8+rsp] ;WIN64 epilogue
  589. mov rsi,QWORD PTR[16+rsp]
  590. DB 0F3h,0C3h ;repret
  591. $L$SEH_end_RC4_set_key::
  592. RC4_set_key ENDP
  593. PUBLIC RC4_options
  594. ALIGN 16
  595. RC4_options PROC PUBLIC
  596. lea rax,QWORD PTR[$L$opts]
  597. mov edx,DWORD PTR[OPENSSL_ia32cap_P]
  598. bt edx,20
  599. jc $L$8xchar
  600. bt edx,30
  601. jnc $L$done
  602. add rax,25
  603. DB 0F3h,0C3h ;repret
  604. $L$8xchar::
  605. add rax,12
  606. $L$done::
  607. DB 0F3h,0C3h ;repret
  608. ALIGN 64
  609. $L$opts::
  610. DB 114,99,52,40,56,120,44,105,110,116,41,0
  611. DB 114,99,52,40,56,120,44,99,104,97,114,41,0
  612. DB 114,99,52,40,49,54,120,44,105,110,116,41,0
  613. DB 82,67,52,32,102,111,114,32,120,56,54,95,54,52,44,32
  614. DB 67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97
  615. DB 112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103
  616. DB 62,0
  617. ALIGN 64
  618. RC4_options ENDP
  619. EXTERN __imp_RtlVirtualUnwind:NEAR
  620. ALIGN 16
  621. stream_se_handler PROC PRIVATE
  622. push rsi
  623. push rdi
  624. push rbx
  625. push rbp
  626. push r12
  627. push r13
  628. push r14
  629. push r15
  630. pushfq
  631. sub rsp,64
  632. mov rax,QWORD PTR[120+r8]
  633. mov rbx,QWORD PTR[248+r8]
  634. lea r10,QWORD PTR[$L$prologue]
  635. cmp rbx,r10
  636. jb $L$in_prologue
  637. mov rax,QWORD PTR[152+r8]
  638. lea r10,QWORD PTR[$L$epilogue]
  639. cmp rbx,r10
  640. jae $L$in_prologue
  641. lea rax,QWORD PTR[24+rax]
  642. mov rbx,QWORD PTR[((-8))+rax]
  643. mov r12,QWORD PTR[((-16))+rax]
  644. mov r13,QWORD PTR[((-24))+rax]
  645. mov QWORD PTR[144+r8],rbx
  646. mov QWORD PTR[216+r8],r12
  647. mov QWORD PTR[224+r8],r13
  648. $L$in_prologue::
  649. mov rdi,QWORD PTR[8+rax]
  650. mov rsi,QWORD PTR[16+rax]
  651. mov QWORD PTR[152+r8],rax
  652. mov QWORD PTR[168+r8],rsi
  653. mov QWORD PTR[176+r8],rdi
  654. jmp $L$common_seh_exit
  655. stream_se_handler ENDP
  656. ALIGN 16
  657. key_se_handler PROC PRIVATE
  658. push rsi
  659. push rdi
  660. push rbx
  661. push rbp
  662. push r12
  663. push r13
  664. push r14
  665. push r15
  666. pushfq
  667. sub rsp,64
  668. mov rax,QWORD PTR[152+r8]
  669. mov rdi,QWORD PTR[8+rax]
  670. mov rsi,QWORD PTR[16+rax]
  671. mov QWORD PTR[168+r8],rsi
  672. mov QWORD PTR[176+r8],rdi
  673. $L$common_seh_exit::
  674. mov rdi,QWORD PTR[40+r9]
  675. mov rsi,r8
  676. mov ecx,154
  677. DD 0a548f3fch
  678. mov rsi,r9
  679. xor rcx,rcx
  680. mov rdx,QWORD PTR[8+rsi]
  681. mov r8,QWORD PTR[rsi]
  682. mov r9,QWORD PTR[16+rsi]
  683. mov r10,QWORD PTR[40+rsi]
  684. lea r11,QWORD PTR[56+rsi]
  685. lea r12,QWORD PTR[24+rsi]
  686. mov QWORD PTR[32+rsp],r10
  687. mov QWORD PTR[40+rsp],r11
  688. mov QWORD PTR[48+rsp],r12
  689. mov QWORD PTR[56+rsp],rcx
  690. call QWORD PTR[__imp_RtlVirtualUnwind]
  691. mov eax,1
  692. add rsp,64
  693. popfq
  694. pop r15
  695. pop r14
  696. pop r13
  697. pop r12
  698. pop rbp
  699. pop rbx
  700. pop rdi
  701. pop rsi
  702. DB 0F3h,0C3h ;repret
  703. key_se_handler ENDP
  704. .text$ ENDS
  705. .pdata SEGMENT READONLY ALIGN(4)
  706. ALIGN 4
  707. DD imagerel $L$SEH_begin_RC4
  708. DD imagerel $L$SEH_end_RC4
  709. DD imagerel $L$SEH_info_RC4
  710. DD imagerel $L$SEH_begin_RC4_set_key
  711. DD imagerel $L$SEH_end_RC4_set_key
  712. DD imagerel $L$SEH_info_RC4_set_key
  713. .pdata ENDS
  714. .xdata SEGMENT READONLY ALIGN(8)
  715. ALIGN 8
  716. $L$SEH_info_RC4::
  717. DB 9,0,0,0
  718. DD imagerel stream_se_handler
  719. $L$SEH_info_RC4_set_key::
  720. DB 9,0,0,0
  721. DD imagerel key_se_handler
  722. .xdata ENDS
  723. END