c_win32.asm 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941
  1. %ifidn __OUTPUT_FORMAT__,obj
  2. section code use32 class=code align=256
  3. %elifidn __OUTPUT_FORMAT__,win32
  4. [email protected] equ 1
  5. section .text code align=256
  6. %else
  7. section .text code
  8. %endif
  9. extern _CAST_S_table0
  10. extern _CAST_S_table1
  11. extern _CAST_S_table2
  12. extern _CAST_S_table3
  13. global _CAST_encrypt
  14. align 16
  15. _CAST_encrypt:
  16. L$_CAST_encrypt_begin:
  17. ;
  18. push ebp
  19. push ebx
  20. mov ebx,DWORD [12+esp]
  21. mov ebp,DWORD [16+esp]
  22. push esi
  23. push edi
  24. ; Load the 2 words
  25. mov edi,DWORD [ebx]
  26. mov esi,DWORD [4+ebx]
  27. ; Get short key flag
  28. mov eax,DWORD [128+ebp]
  29. push eax
  30. xor eax,eax
  31. ; round 0
  32. mov edx,DWORD [ebp]
  33. mov ecx,DWORD [4+ebp]
  34. add edx,esi
  35. rol edx,cl
  36. mov ebx,edx
  37. xor ecx,ecx
  38. mov cl,dh
  39. and ebx,255
  40. shr edx,16
  41. xor eax,eax
  42. mov al,dh
  43. and edx,255
  44. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  45. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  46. xor ecx,ebx
  47. mov ebx,DWORD [_CAST_S_table2+eax*4]
  48. sub ecx,ebx
  49. mov ebx,DWORD [_CAST_S_table3+edx*4]
  50. add ecx,ebx
  51. xor edi,ecx
  52. ; round 1
  53. mov edx,DWORD [8+ebp]
  54. mov ecx,DWORD [12+ebp]
  55. xor edx,edi
  56. rol edx,cl
  57. mov ebx,edx
  58. xor ecx,ecx
  59. mov cl,dh
  60. and ebx,255
  61. shr edx,16
  62. xor eax,eax
  63. mov al,dh
  64. and edx,255
  65. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  66. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  67. sub ecx,ebx
  68. mov ebx,DWORD [_CAST_S_table2+eax*4]
  69. add ecx,ebx
  70. mov ebx,DWORD [_CAST_S_table3+edx*4]
  71. xor ecx,ebx
  72. xor esi,ecx
  73. ; round 2
  74. mov edx,DWORD [16+ebp]
  75. mov ecx,DWORD [20+ebp]
  76. sub edx,esi
  77. rol edx,cl
  78. mov ebx,edx
  79. xor ecx,ecx
  80. mov cl,dh
  81. and ebx,255
  82. shr edx,16
  83. xor eax,eax
  84. mov al,dh
  85. and edx,255
  86. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  87. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  88. add ecx,ebx
  89. mov ebx,DWORD [_CAST_S_table2+eax*4]
  90. xor ecx,ebx
  91. mov ebx,DWORD [_CAST_S_table3+edx*4]
  92. sub ecx,ebx
  93. xor edi,ecx
  94. ; round 3
  95. mov edx,DWORD [24+ebp]
  96. mov ecx,DWORD [28+ebp]
  97. add edx,edi
  98. rol edx,cl
  99. mov ebx,edx
  100. xor ecx,ecx
  101. mov cl,dh
  102. and ebx,255
  103. shr edx,16
  104. xor eax,eax
  105. mov al,dh
  106. and edx,255
  107. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  108. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  109. xor ecx,ebx
  110. mov ebx,DWORD [_CAST_S_table2+eax*4]
  111. sub ecx,ebx
  112. mov ebx,DWORD [_CAST_S_table3+edx*4]
  113. add ecx,ebx
  114. xor esi,ecx
  115. ; round 4
  116. mov edx,DWORD [32+ebp]
  117. mov ecx,DWORD [36+ebp]
  118. xor edx,esi
  119. rol edx,cl
  120. mov ebx,edx
  121. xor ecx,ecx
  122. mov cl,dh
  123. and ebx,255
  124. shr edx,16
  125. xor eax,eax
  126. mov al,dh
  127. and edx,255
  128. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  129. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  130. sub ecx,ebx
  131. mov ebx,DWORD [_CAST_S_table2+eax*4]
  132. add ecx,ebx
  133. mov ebx,DWORD [_CAST_S_table3+edx*4]
  134. xor ecx,ebx
  135. xor edi,ecx
  136. ; round 5
  137. mov edx,DWORD [40+ebp]
  138. mov ecx,DWORD [44+ebp]
  139. sub edx,edi
  140. rol edx,cl
  141. mov ebx,edx
  142. xor ecx,ecx
  143. mov cl,dh
  144. and ebx,255
  145. shr edx,16
  146. xor eax,eax
  147. mov al,dh
  148. and edx,255
  149. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  150. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  151. add ecx,ebx
  152. mov ebx,DWORD [_CAST_S_table2+eax*4]
  153. xor ecx,ebx
  154. mov ebx,DWORD [_CAST_S_table3+edx*4]
  155. sub ecx,ebx
  156. xor esi,ecx
  157. ; round 6
  158. mov edx,DWORD [48+ebp]
  159. mov ecx,DWORD [52+ebp]
  160. add edx,esi
  161. rol edx,cl
  162. mov ebx,edx
  163. xor ecx,ecx
  164. mov cl,dh
  165. and ebx,255
  166. shr edx,16
  167. xor eax,eax
  168. mov al,dh
  169. and edx,255
  170. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  171. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  172. xor ecx,ebx
  173. mov ebx,DWORD [_CAST_S_table2+eax*4]
  174. sub ecx,ebx
  175. mov ebx,DWORD [_CAST_S_table3+edx*4]
  176. add ecx,ebx
  177. xor edi,ecx
  178. ; round 7
  179. mov edx,DWORD [56+ebp]
  180. mov ecx,DWORD [60+ebp]
  181. xor edx,edi
  182. rol edx,cl
  183. mov ebx,edx
  184. xor ecx,ecx
  185. mov cl,dh
  186. and ebx,255
  187. shr edx,16
  188. xor eax,eax
  189. mov al,dh
  190. and edx,255
  191. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  192. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  193. sub ecx,ebx
  194. mov ebx,DWORD [_CAST_S_table2+eax*4]
  195. add ecx,ebx
  196. mov ebx,DWORD [_CAST_S_table3+edx*4]
  197. xor ecx,ebx
  198. xor esi,ecx
  199. ; round 8
  200. mov edx,DWORD [64+ebp]
  201. mov ecx,DWORD [68+ebp]
  202. sub edx,esi
  203. rol edx,cl
  204. mov ebx,edx
  205. xor ecx,ecx
  206. mov cl,dh
  207. and ebx,255
  208. shr edx,16
  209. xor eax,eax
  210. mov al,dh
  211. and edx,255
  212. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  213. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  214. add ecx,ebx
  215. mov ebx,DWORD [_CAST_S_table2+eax*4]
  216. xor ecx,ebx
  217. mov ebx,DWORD [_CAST_S_table3+edx*4]
  218. sub ecx,ebx
  219. xor edi,ecx
  220. ; round 9
  221. mov edx,DWORD [72+ebp]
  222. mov ecx,DWORD [76+ebp]
  223. add edx,edi
  224. rol edx,cl
  225. mov ebx,edx
  226. xor ecx,ecx
  227. mov cl,dh
  228. and ebx,255
  229. shr edx,16
  230. xor eax,eax
  231. mov al,dh
  232. and edx,255
  233. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  234. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  235. xor ecx,ebx
  236. mov ebx,DWORD [_CAST_S_table2+eax*4]
  237. sub ecx,ebx
  238. mov ebx,DWORD [_CAST_S_table3+edx*4]
  239. add ecx,ebx
  240. xor esi,ecx
  241. ; round 10
  242. mov edx,DWORD [80+ebp]
  243. mov ecx,DWORD [84+ebp]
  244. xor edx,esi
  245. rol edx,cl
  246. mov ebx,edx
  247. xor ecx,ecx
  248. mov cl,dh
  249. and ebx,255
  250. shr edx,16
  251. xor eax,eax
  252. mov al,dh
  253. and edx,255
  254. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  255. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  256. sub ecx,ebx
  257. mov ebx,DWORD [_CAST_S_table2+eax*4]
  258. add ecx,ebx
  259. mov ebx,DWORD [_CAST_S_table3+edx*4]
  260. xor ecx,ebx
  261. xor edi,ecx
  262. ; round 11
  263. mov edx,DWORD [88+ebp]
  264. mov ecx,DWORD [92+ebp]
  265. sub edx,edi
  266. rol edx,cl
  267. mov ebx,edx
  268. xor ecx,ecx
  269. mov cl,dh
  270. and ebx,255
  271. shr edx,16
  272. xor eax,eax
  273. mov al,dh
  274. and edx,255
  275. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  276. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  277. add ecx,ebx
  278. mov ebx,DWORD [_CAST_S_table2+eax*4]
  279. xor ecx,ebx
  280. mov ebx,DWORD [_CAST_S_table3+edx*4]
  281. sub ecx,ebx
  282. xor esi,ecx
  283. ; test short key flag
  284. pop edx
  285. or edx,edx
  286. jnz NEAR L$000cast_enc_done
  287. ; round 12
  288. mov edx,DWORD [96+ebp]
  289. mov ecx,DWORD [100+ebp]
  290. add edx,esi
  291. rol edx,cl
  292. mov ebx,edx
  293. xor ecx,ecx
  294. mov cl,dh
  295. and ebx,255
  296. shr edx,16
  297. xor eax,eax
  298. mov al,dh
  299. and edx,255
  300. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  301. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  302. xor ecx,ebx
  303. mov ebx,DWORD [_CAST_S_table2+eax*4]
  304. sub ecx,ebx
  305. mov ebx,DWORD [_CAST_S_table3+edx*4]
  306. add ecx,ebx
  307. xor edi,ecx
  308. ; round 13
  309. mov edx,DWORD [104+ebp]
  310. mov ecx,DWORD [108+ebp]
  311. xor edx,edi
  312. rol edx,cl
  313. mov ebx,edx
  314. xor ecx,ecx
  315. mov cl,dh
  316. and ebx,255
  317. shr edx,16
  318. xor eax,eax
  319. mov al,dh
  320. and edx,255
  321. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  322. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  323. sub ecx,ebx
  324. mov ebx,DWORD [_CAST_S_table2+eax*4]
  325. add ecx,ebx
  326. mov ebx,DWORD [_CAST_S_table3+edx*4]
  327. xor ecx,ebx
  328. xor esi,ecx
  329. ; round 14
  330. mov edx,DWORD [112+ebp]
  331. mov ecx,DWORD [116+ebp]
  332. sub edx,esi
  333. rol edx,cl
  334. mov ebx,edx
  335. xor ecx,ecx
  336. mov cl,dh
  337. and ebx,255
  338. shr edx,16
  339. xor eax,eax
  340. mov al,dh
  341. and edx,255
  342. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  343. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  344. add ecx,ebx
  345. mov ebx,DWORD [_CAST_S_table2+eax*4]
  346. xor ecx,ebx
  347. mov ebx,DWORD [_CAST_S_table3+edx*4]
  348. sub ecx,ebx
  349. xor edi,ecx
  350. ; round 15
  351. mov edx,DWORD [120+ebp]
  352. mov ecx,DWORD [124+ebp]
  353. add edx,edi
  354. rol edx,cl
  355. mov ebx,edx
  356. xor ecx,ecx
  357. mov cl,dh
  358. and ebx,255
  359. shr edx,16
  360. xor eax,eax
  361. mov al,dh
  362. and edx,255
  363. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  364. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  365. xor ecx,ebx
  366. mov ebx,DWORD [_CAST_S_table2+eax*4]
  367. sub ecx,ebx
  368. mov ebx,DWORD [_CAST_S_table3+edx*4]
  369. add ecx,ebx
  370. xor esi,ecx
  371. L$000cast_enc_done:
  372. nop
  373. mov eax,DWORD [20+esp]
  374. mov DWORD [4+eax],edi
  375. mov DWORD [eax],esi
  376. pop edi
  377. pop esi
  378. pop ebx
  379. pop ebp
  380. ret
  381. extern _CAST_S_table0
  382. extern _CAST_S_table1
  383. extern _CAST_S_table2
  384. extern _CAST_S_table3
  385. global _CAST_decrypt
  386. align 16
  387. _CAST_decrypt:
  388. L$_CAST_decrypt_begin:
  389. ;
  390. push ebp
  391. push ebx
  392. mov ebx,DWORD [12+esp]
  393. mov ebp,DWORD [16+esp]
  394. push esi
  395. push edi
  396. ; Load the 2 words
  397. mov edi,DWORD [ebx]
  398. mov esi,DWORD [4+ebx]
  399. ; Get short key flag
  400. mov eax,DWORD [128+ebp]
  401. or eax,eax
  402. jnz NEAR L$001cast_dec_skip
  403. xor eax,eax
  404. ; round 15
  405. mov edx,DWORD [120+ebp]
  406. mov ecx,DWORD [124+ebp]
  407. add edx,esi
  408. rol edx,cl
  409. mov ebx,edx
  410. xor ecx,ecx
  411. mov cl,dh
  412. and ebx,255
  413. shr edx,16
  414. xor eax,eax
  415. mov al,dh
  416. and edx,255
  417. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  418. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  419. xor ecx,ebx
  420. mov ebx,DWORD [_CAST_S_table2+eax*4]
  421. sub ecx,ebx
  422. mov ebx,DWORD [_CAST_S_table3+edx*4]
  423. add ecx,ebx
  424. xor edi,ecx
  425. ; round 14
  426. mov edx,DWORD [112+ebp]
  427. mov ecx,DWORD [116+ebp]
  428. sub edx,edi
  429. rol edx,cl
  430. mov ebx,edx
  431. xor ecx,ecx
  432. mov cl,dh
  433. and ebx,255
  434. shr edx,16
  435. xor eax,eax
  436. mov al,dh
  437. and edx,255
  438. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  439. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  440. add ecx,ebx
  441. mov ebx,DWORD [_CAST_S_table2+eax*4]
  442. xor ecx,ebx
  443. mov ebx,DWORD [_CAST_S_table3+edx*4]
  444. sub ecx,ebx
  445. xor esi,ecx
  446. ; round 13
  447. mov edx,DWORD [104+ebp]
  448. mov ecx,DWORD [108+ebp]
  449. xor edx,esi
  450. rol edx,cl
  451. mov ebx,edx
  452. xor ecx,ecx
  453. mov cl,dh
  454. and ebx,255
  455. shr edx,16
  456. xor eax,eax
  457. mov al,dh
  458. and edx,255
  459. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  460. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  461. sub ecx,ebx
  462. mov ebx,DWORD [_CAST_S_table2+eax*4]
  463. add ecx,ebx
  464. mov ebx,DWORD [_CAST_S_table3+edx*4]
  465. xor ecx,ebx
  466. xor edi,ecx
  467. ; round 12
  468. mov edx,DWORD [96+ebp]
  469. mov ecx,DWORD [100+ebp]
  470. add edx,edi
  471. rol edx,cl
  472. mov ebx,edx
  473. xor ecx,ecx
  474. mov cl,dh
  475. and ebx,255
  476. shr edx,16
  477. xor eax,eax
  478. mov al,dh
  479. and edx,255
  480. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  481. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  482. xor ecx,ebx
  483. mov ebx,DWORD [_CAST_S_table2+eax*4]
  484. sub ecx,ebx
  485. mov ebx,DWORD [_CAST_S_table3+edx*4]
  486. add ecx,ebx
  487. xor esi,ecx
  488. L$001cast_dec_skip:
  489. ; round 11
  490. mov edx,DWORD [88+ebp]
  491. mov ecx,DWORD [92+ebp]
  492. sub edx,esi
  493. rol edx,cl
  494. mov ebx,edx
  495. xor ecx,ecx
  496. mov cl,dh
  497. and ebx,255
  498. shr edx,16
  499. xor eax,eax
  500. mov al,dh
  501. and edx,255
  502. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  503. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  504. add ecx,ebx
  505. mov ebx,DWORD [_CAST_S_table2+eax*4]
  506. xor ecx,ebx
  507. mov ebx,DWORD [_CAST_S_table3+edx*4]
  508. sub ecx,ebx
  509. xor edi,ecx
  510. ; round 10
  511. mov edx,DWORD [80+ebp]
  512. mov ecx,DWORD [84+ebp]
  513. xor edx,edi
  514. rol edx,cl
  515. mov ebx,edx
  516. xor ecx,ecx
  517. mov cl,dh
  518. and ebx,255
  519. shr edx,16
  520. xor eax,eax
  521. mov al,dh
  522. and edx,255
  523. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  524. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  525. sub ecx,ebx
  526. mov ebx,DWORD [_CAST_S_table2+eax*4]
  527. add ecx,ebx
  528. mov ebx,DWORD [_CAST_S_table3+edx*4]
  529. xor ecx,ebx
  530. xor esi,ecx
  531. ; round 9
  532. mov edx,DWORD [72+ebp]
  533. mov ecx,DWORD [76+ebp]
  534. add edx,esi
  535. rol edx,cl
  536. mov ebx,edx
  537. xor ecx,ecx
  538. mov cl,dh
  539. and ebx,255
  540. shr edx,16
  541. xor eax,eax
  542. mov al,dh
  543. and edx,255
  544. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  545. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  546. xor ecx,ebx
  547. mov ebx,DWORD [_CAST_S_table2+eax*4]
  548. sub ecx,ebx
  549. mov ebx,DWORD [_CAST_S_table3+edx*4]
  550. add ecx,ebx
  551. xor edi,ecx
  552. ; round 8
  553. mov edx,DWORD [64+ebp]
  554. mov ecx,DWORD [68+ebp]
  555. sub edx,edi
  556. rol edx,cl
  557. mov ebx,edx
  558. xor ecx,ecx
  559. mov cl,dh
  560. and ebx,255
  561. shr edx,16
  562. xor eax,eax
  563. mov al,dh
  564. and edx,255
  565. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  566. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  567. add ecx,ebx
  568. mov ebx,DWORD [_CAST_S_table2+eax*4]
  569. xor ecx,ebx
  570. mov ebx,DWORD [_CAST_S_table3+edx*4]
  571. sub ecx,ebx
  572. xor esi,ecx
  573. ; round 7
  574. mov edx,DWORD [56+ebp]
  575. mov ecx,DWORD [60+ebp]
  576. xor edx,esi
  577. rol edx,cl
  578. mov ebx,edx
  579. xor ecx,ecx
  580. mov cl,dh
  581. and ebx,255
  582. shr edx,16
  583. xor eax,eax
  584. mov al,dh
  585. and edx,255
  586. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  587. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  588. sub ecx,ebx
  589. mov ebx,DWORD [_CAST_S_table2+eax*4]
  590. add ecx,ebx
  591. mov ebx,DWORD [_CAST_S_table3+edx*4]
  592. xor ecx,ebx
  593. xor edi,ecx
  594. ; round 6
  595. mov edx,DWORD [48+ebp]
  596. mov ecx,DWORD [52+ebp]
  597. add edx,edi
  598. rol edx,cl
  599. mov ebx,edx
  600. xor ecx,ecx
  601. mov cl,dh
  602. and ebx,255
  603. shr edx,16
  604. xor eax,eax
  605. mov al,dh
  606. and edx,255
  607. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  608. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  609. xor ecx,ebx
  610. mov ebx,DWORD [_CAST_S_table2+eax*4]
  611. sub ecx,ebx
  612. mov ebx,DWORD [_CAST_S_table3+edx*4]
  613. add ecx,ebx
  614. xor esi,ecx
  615. ; round 5
  616. mov edx,DWORD [40+ebp]
  617. mov ecx,DWORD [44+ebp]
  618. sub edx,esi
  619. rol edx,cl
  620. mov ebx,edx
  621. xor ecx,ecx
  622. mov cl,dh
  623. and ebx,255
  624. shr edx,16
  625. xor eax,eax
  626. mov al,dh
  627. and edx,255
  628. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  629. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  630. add ecx,ebx
  631. mov ebx,DWORD [_CAST_S_table2+eax*4]
  632. xor ecx,ebx
  633. mov ebx,DWORD [_CAST_S_table3+edx*4]
  634. sub ecx,ebx
  635. xor edi,ecx
  636. ; round 4
  637. mov edx,DWORD [32+ebp]
  638. mov ecx,DWORD [36+ebp]
  639. xor edx,edi
  640. rol edx,cl
  641. mov ebx,edx
  642. xor ecx,ecx
  643. mov cl,dh
  644. and ebx,255
  645. shr edx,16
  646. xor eax,eax
  647. mov al,dh
  648. and edx,255
  649. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  650. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  651. sub ecx,ebx
  652. mov ebx,DWORD [_CAST_S_table2+eax*4]
  653. add ecx,ebx
  654. mov ebx,DWORD [_CAST_S_table3+edx*4]
  655. xor ecx,ebx
  656. xor esi,ecx
  657. ; round 3
  658. mov edx,DWORD [24+ebp]
  659. mov ecx,DWORD [28+ebp]
  660. add edx,esi
  661. rol edx,cl
  662. mov ebx,edx
  663. xor ecx,ecx
  664. mov cl,dh
  665. and ebx,255
  666. shr edx,16
  667. xor eax,eax
  668. mov al,dh
  669. and edx,255
  670. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  671. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  672. xor ecx,ebx
  673. mov ebx,DWORD [_CAST_S_table2+eax*4]
  674. sub ecx,ebx
  675. mov ebx,DWORD [_CAST_S_table3+edx*4]
  676. add ecx,ebx
  677. xor edi,ecx
  678. ; round 2
  679. mov edx,DWORD [16+ebp]
  680. mov ecx,DWORD [20+ebp]
  681. sub edx,edi
  682. rol edx,cl
  683. mov ebx,edx
  684. xor ecx,ecx
  685. mov cl,dh
  686. and ebx,255
  687. shr edx,16
  688. xor eax,eax
  689. mov al,dh
  690. and edx,255
  691. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  692. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  693. add ecx,ebx
  694. mov ebx,DWORD [_CAST_S_table2+eax*4]
  695. xor ecx,ebx
  696. mov ebx,DWORD [_CAST_S_table3+edx*4]
  697. sub ecx,ebx
  698. xor esi,ecx
  699. ; round 1
  700. mov edx,DWORD [8+ebp]
  701. mov ecx,DWORD [12+ebp]
  702. xor edx,esi
  703. rol edx,cl
  704. mov ebx,edx
  705. xor ecx,ecx
  706. mov cl,dh
  707. and ebx,255
  708. shr edx,16
  709. xor eax,eax
  710. mov al,dh
  711. and edx,255
  712. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  713. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  714. sub ecx,ebx
  715. mov ebx,DWORD [_CAST_S_table2+eax*4]
  716. add ecx,ebx
  717. mov ebx,DWORD [_CAST_S_table3+edx*4]
  718. xor ecx,ebx
  719. xor edi,ecx
  720. ; round 0
  721. mov edx,DWORD [ebp]
  722. mov ecx,DWORD [4+ebp]
  723. add edx,edi
  724. rol edx,cl
  725. mov ebx,edx
  726. xor ecx,ecx
  727. mov cl,dh
  728. and ebx,255
  729. shr edx,16
  730. xor eax,eax
  731. mov al,dh
  732. and edx,255
  733. mov ecx,DWORD [_CAST_S_table0+ecx*4]
  734. mov ebx,DWORD [_CAST_S_table1+ebx*4]
  735. xor ecx,ebx
  736. mov ebx,DWORD [_CAST_S_table2+eax*4]
  737. sub ecx,ebx
  738. mov ebx,DWORD [_CAST_S_table3+edx*4]
  739. add ecx,ebx
  740. xor esi,ecx
  741. nop
  742. mov eax,DWORD [20+esp]
  743. mov DWORD [4+eax],edi
  744. mov DWORD [eax],esi
  745. pop edi
  746. pop esi
  747. pop ebx
  748. pop ebp
  749. ret
  750. global _CAST_cbc_encrypt
  751. align 16
  752. _CAST_cbc_encrypt:
  753. L$_CAST_cbc_encrypt_begin:
  754. ;
  755. push ebp
  756. push ebx
  757. push esi
  758. push edi
  759. mov ebp,DWORD [28+esp]
  760. ; getting iv ptr from parameter 4
  761. mov ebx,DWORD [36+esp]
  762. mov esi,DWORD [ebx]
  763. mov edi,DWORD [4+ebx]
  764. push edi
  765. push esi
  766. push edi
  767. push esi
  768. mov ebx,esp
  769. mov esi,DWORD [36+esp]
  770. mov edi,DWORD [40+esp]
  771. ; getting encrypt flag from parameter 5
  772. mov ecx,DWORD [56+esp]
  773. ; get and push parameter 3
  774. mov eax,DWORD [48+esp]
  775. push eax
  776. push ebx
  777. cmp ecx,0
  778. jz NEAR L$002decrypt
  779. and ebp,4294967288
  780. mov eax,DWORD [8+esp]
  781. mov ebx,DWORD [12+esp]
  782. jz NEAR L$003encrypt_finish
  783. L$004encrypt_loop:
  784. mov ecx,DWORD [esi]
  785. mov edx,DWORD [4+esi]
  786. xor eax,ecx
  787. xor ebx,edx
  788. bswap eax
  789. bswap ebx
  790. mov DWORD [8+esp],eax
  791. mov DWORD [12+esp],ebx
  792. call L$_CAST_encrypt_begin
  793. mov eax,DWORD [8+esp]
  794. mov ebx,DWORD [12+esp]
  795. bswap eax
  796. bswap ebx
  797. mov DWORD [edi],eax
  798. mov DWORD [4+edi],ebx
  799. add esi,8
  800. add edi,8
  801. sub ebp,8
  802. jnz NEAR L$004encrypt_loop
  803. L$003encrypt_finish:
  804. mov ebp,DWORD [52+esp]
  805. and ebp,7
  806. jz NEAR L$005finish
  807. call L$006PIC_point
  808. L$006PIC_point:
  809. pop edx
  810. lea ecx,[(L$007cbc_enc_jmp_table-L$006PIC_point)+edx]
  811. mov ebp,DWORD [ebp*4+ecx]
  812. add ebp,edx
  813. xor ecx,ecx
  814. xor edx,edx
  815. jmp ebp
  816. L$008ej7:
  817. mov dh,BYTE [6+esi]
  818. shl edx,8
  819. L$009ej6:
  820. mov dh,BYTE [5+esi]
  821. L$010ej5:
  822. mov dl,BYTE [4+esi]
  823. L$011ej4:
  824. mov ecx,DWORD [esi]
  825. jmp NEAR L$012ejend
  826. L$013ej3:
  827. mov ch,BYTE [2+esi]
  828. shl ecx,8
  829. L$014ej2:
  830. mov ch,BYTE [1+esi]
  831. L$015ej1:
  832. mov cl,BYTE [esi]
  833. L$012ejend:
  834. xor eax,ecx
  835. xor ebx,edx
  836. bswap eax
  837. bswap ebx
  838. mov DWORD [8+esp],eax
  839. mov DWORD [12+esp],ebx
  840. call L$_CAST_encrypt_begin
  841. mov eax,DWORD [8+esp]
  842. mov ebx,DWORD [12+esp]
  843. bswap eax
  844. bswap ebx
  845. mov DWORD [edi],eax
  846. mov DWORD [4+edi],ebx
  847. jmp NEAR L$005finish
  848. L$002decrypt:
  849. and ebp,4294967288
  850. mov eax,DWORD [16+esp]
  851. mov ebx,DWORD [20+esp]
  852. jz NEAR L$016decrypt_finish
  853. L$017decrypt_loop:
  854. mov eax,DWORD [esi]
  855. mov ebx,DWORD [4+esi]
  856. bswap eax
  857. bswap ebx
  858. mov DWORD [8+esp],eax
  859. mov DWORD [12+esp],ebx
  860. call L$_CAST_decrypt_begin
  861. mov eax,DWORD [8+esp]
  862. mov ebx,DWORD [12+esp]
  863. bswap eax
  864. bswap ebx
  865. mov ecx,DWORD [16+esp]
  866. mov edx,DWORD [20+esp]
  867. xor ecx,eax
  868. xor edx,ebx
  869. mov eax,DWORD [esi]
  870. mov ebx,DWORD [4+esi]
  871. mov DWORD [edi],ecx
  872. mov DWORD [4+edi],edx
  873. mov DWORD [16+esp],eax
  874. mov DWORD [20+esp],ebx
  875. add esi,8
  876. add edi,8
  877. sub ebp,8
  878. jnz NEAR L$017decrypt_loop
  879. L$016decrypt_finish:
  880. mov ebp,DWORD [52+esp]
  881. and ebp,7
  882. jz NEAR L$005finish
  883. mov eax,DWORD [esi]
  884. mov ebx,DWORD [4+esi]
  885. bswap eax
  886. bswap ebx
  887. mov DWORD [8+esp],eax
  888. mov DWORD [12+esp],ebx
  889. call L$_CAST_decrypt_begin
  890. mov eax,DWORD [8+esp]
  891. mov ebx,DWORD [12+esp]
  892. bswap eax
  893. bswap ebx
  894. mov ecx,DWORD [16+esp]
  895. mov edx,DWORD [20+esp]
  896. xor ecx,eax
  897. xor edx,ebx
  898. mov eax,DWORD [esi]
  899. mov ebx,DWORD [4+esi]
  900. L$018dj7:
  901. ror edx,16
  902. mov BYTE [6+edi],dl
  903. shr edx,16
  904. L$019dj6:
  905. mov BYTE [5+edi],dh
  906. L$020dj5:
  907. mov BYTE [4+edi],dl
  908. L$021dj4:
  909. mov DWORD [edi],ecx
  910. jmp NEAR L$022djend
  911. L$023dj3:
  912. ror ecx,16
  913. mov BYTE [2+edi],cl
  914. shl ecx,16
  915. L$024dj2:
  916. mov BYTE [1+esi],ch
  917. L$025dj1:
  918. mov BYTE [esi],cl
  919. L$022djend:
  920. jmp NEAR L$005finish
  921. L$005finish:
  922. mov ecx,DWORD [60+esp]
  923. add esp,24
  924. mov DWORD [ecx],eax
  925. mov DWORD [4+ecx],ebx
  926. pop edi
  927. pop esi
  928. pop ebx
  929. pop ebp
  930. ret
  931. align 64
  932. L$007cbc_enc_jmp_table:
  933. dd 0
  934. dd L$015ej1-L$006PIC_point
  935. dd L$014ej2-L$006PIC_point
  936. dd L$013ej3-L$006PIC_point
  937. dd L$011ej4-L$006PIC_point
  938. dd L$010ej5-L$006PIC_point
  939. dd L$009ej6-L$006PIC_point
  940. dd L$008ej7-L$006PIC_point
  941. align 64