x25519-x86_64.masm 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074
  1. OPTION DOTNAME
  2. .text$ SEGMENT ALIGN(256) 'CODE'
  3. PUBLIC x25519_fe51_mul
  4. ALIGN 32
  5. x25519_fe51_mul PROC PUBLIC
  6. mov QWORD PTR[8+rsp],rdi ;WIN64 prologue
  7. mov QWORD PTR[16+rsp],rsi
  8. mov rax,rsp
  9. $L$SEH_begin_x25519_fe51_mul::
  10. mov rdi,rcx
  11. mov rsi,rdx
  12. mov rdx,r8
  13. push rbp
  14. push rbx
  15. push r12
  16. push r13
  17. push r14
  18. push r15
  19. lea rsp,QWORD PTR[((-40))+rsp]
  20. $L$fe51_mul_body::
  21. mov rax,QWORD PTR[rsi]
  22. mov r11,QWORD PTR[rdx]
  23. mov r12,QWORD PTR[8+rdx]
  24. mov r13,QWORD PTR[16+rdx]
  25. mov rbp,QWORD PTR[24+rdx]
  26. mov r14,QWORD PTR[32+rdx]
  27. mov QWORD PTR[32+rsp],rdi
  28. mov rdi,rax
  29. mul r11
  30. mov QWORD PTR[rsp],r11
  31. mov rbx,rax
  32. mov rax,rdi
  33. mov rcx,rdx
  34. mul r12
  35. mov QWORD PTR[8+rsp],r12
  36. mov r8,rax
  37. mov rax,rdi
  38. lea r15,QWORD PTR[r14*8+r14]
  39. mov r9,rdx
  40. mul r13
  41. mov QWORD PTR[16+rsp],r13
  42. mov r10,rax
  43. mov rax,rdi
  44. lea rdi,QWORD PTR[r15*2+r14]
  45. mov r11,rdx
  46. mul rbp
  47. mov r12,rax
  48. mov rax,QWORD PTR[rsi]
  49. mov r13,rdx
  50. mul r14
  51. mov r14,rax
  52. mov rax,QWORD PTR[8+rsi]
  53. mov r15,rdx
  54. mul rdi
  55. add rbx,rax
  56. mov rax,QWORD PTR[16+rsi]
  57. adc rcx,rdx
  58. mul rdi
  59. add r8,rax
  60. mov rax,QWORD PTR[24+rsi]
  61. adc r9,rdx
  62. mul rdi
  63. add r10,rax
  64. mov rax,QWORD PTR[32+rsi]
  65. adc r11,rdx
  66. mul rdi
  67. imul rdi,rbp,19
  68. add r12,rax
  69. mov rax,QWORD PTR[8+rsi]
  70. adc r13,rdx
  71. mul rbp
  72. mov rbp,QWORD PTR[16+rsp]
  73. add r14,rax
  74. mov rax,QWORD PTR[16+rsi]
  75. adc r15,rdx
  76. mul rdi
  77. add rbx,rax
  78. mov rax,QWORD PTR[24+rsi]
  79. adc rcx,rdx
  80. mul rdi
  81. add r8,rax
  82. mov rax,QWORD PTR[32+rsi]
  83. adc r9,rdx
  84. mul rdi
  85. imul rdi,rbp,19
  86. add r10,rax
  87. mov rax,QWORD PTR[8+rsi]
  88. adc r11,rdx
  89. mul rbp
  90. add r12,rax
  91. mov rax,QWORD PTR[16+rsi]
  92. adc r13,rdx
  93. mul rbp
  94. mov rbp,QWORD PTR[8+rsp]
  95. add r14,rax
  96. mov rax,QWORD PTR[24+rsi]
  97. adc r15,rdx
  98. mul rdi
  99. add rbx,rax
  100. mov rax,QWORD PTR[32+rsi]
  101. adc rcx,rdx
  102. mul rdi
  103. add r8,rax
  104. mov rax,QWORD PTR[8+rsi]
  105. adc r9,rdx
  106. mul rbp
  107. imul rdi,rbp,19
  108. add r10,rax
  109. mov rax,QWORD PTR[16+rsi]
  110. adc r11,rdx
  111. mul rbp
  112. add r12,rax
  113. mov rax,QWORD PTR[24+rsi]
  114. adc r13,rdx
  115. mul rbp
  116. mov rbp,QWORD PTR[rsp]
  117. add r14,rax
  118. mov rax,QWORD PTR[32+rsi]
  119. adc r15,rdx
  120. mul rdi
  121. add rbx,rax
  122. mov rax,QWORD PTR[8+rsi]
  123. adc rcx,rdx
  124. mul rbp
  125. add r8,rax
  126. mov rax,QWORD PTR[16+rsi]
  127. adc r9,rdx
  128. mul rbp
  129. add r10,rax
  130. mov rax,QWORD PTR[24+rsi]
  131. adc r11,rdx
  132. mul rbp
  133. add r12,rax
  134. mov rax,QWORD PTR[32+rsi]
  135. adc r13,rdx
  136. mul rbp
  137. add r14,rax
  138. adc r15,rdx
  139. mov rdi,QWORD PTR[32+rsp]
  140. jmp $L$reduce51
  141. $L$fe51_mul_epilogue::
  142. $L$SEH_end_x25519_fe51_mul::
  143. x25519_fe51_mul ENDP
  144. PUBLIC x25519_fe51_sqr
  145. ALIGN 32
  146. x25519_fe51_sqr PROC PUBLIC
  147. mov QWORD PTR[8+rsp],rdi ;WIN64 prologue
  148. mov QWORD PTR[16+rsp],rsi
  149. mov rax,rsp
  150. $L$SEH_begin_x25519_fe51_sqr::
  151. mov rdi,rcx
  152. mov rsi,rdx
  153. push rbp
  154. push rbx
  155. push r12
  156. push r13
  157. push r14
  158. push r15
  159. lea rsp,QWORD PTR[((-40))+rsp]
  160. $L$fe51_sqr_body::
  161. mov rax,QWORD PTR[rsi]
  162. mov r15,QWORD PTR[16+rsi]
  163. mov rbp,QWORD PTR[32+rsi]
  164. mov QWORD PTR[32+rsp],rdi
  165. lea r14,QWORD PTR[rax*1+rax]
  166. mul rax
  167. mov rbx,rax
  168. mov rax,QWORD PTR[8+rsi]
  169. mov rcx,rdx
  170. mul r14
  171. mov r8,rax
  172. mov rax,r15
  173. mov QWORD PTR[rsp],r15
  174. mov r9,rdx
  175. mul r14
  176. mov r10,rax
  177. mov rax,QWORD PTR[24+rsi]
  178. mov r11,rdx
  179. imul rdi,rbp,19
  180. mul r14
  181. mov r12,rax
  182. mov rax,rbp
  183. mov r13,rdx
  184. mul r14
  185. mov r14,rax
  186. mov rax,rbp
  187. mov r15,rdx
  188. mul rdi
  189. add r12,rax
  190. mov rax,QWORD PTR[8+rsi]
  191. adc r13,rdx
  192. mov rsi,QWORD PTR[24+rsi]
  193. lea rbp,QWORD PTR[rax*1+rax]
  194. mul rax
  195. add r10,rax
  196. mov rax,QWORD PTR[rsp]
  197. adc r11,rdx
  198. mul rbp
  199. add r12,rax
  200. mov rax,rbp
  201. adc r13,rdx
  202. mul rsi
  203. add r14,rax
  204. mov rax,rbp
  205. adc r15,rdx
  206. imul rbp,rsi,19
  207. mul rdi
  208. add rbx,rax
  209. lea rax,QWORD PTR[rsi*1+rsi]
  210. adc rcx,rdx
  211. mul rdi
  212. add r10,rax
  213. mov rax,rsi
  214. adc r11,rdx
  215. mul rbp
  216. add r8,rax
  217. mov rax,QWORD PTR[rsp]
  218. adc r9,rdx
  219. lea rsi,QWORD PTR[rax*1+rax]
  220. mul rax
  221. add r14,rax
  222. mov rax,rbp
  223. adc r15,rdx
  224. mul rsi
  225. add rbx,rax
  226. mov rax,rsi
  227. adc rcx,rdx
  228. mul rdi
  229. add r8,rax
  230. adc r9,rdx
  231. mov rdi,QWORD PTR[32+rsp]
  232. jmp $L$reduce51
  233. ALIGN 32
  234. $L$reduce51::
  235. mov rbp,07ffffffffffffh
  236. mov rdx,r10
  237. shr r10,51
  238. shl r11,13
  239. and rdx,rbp
  240. or r11,r10
  241. add r12,r11
  242. adc r13,0
  243. mov rax,rbx
  244. shr rbx,51
  245. shl rcx,13
  246. and rax,rbp
  247. or rcx,rbx
  248. add r8,rcx
  249. adc r9,0
  250. mov rbx,r12
  251. shr r12,51
  252. shl r13,13
  253. and rbx,rbp
  254. or r13,r12
  255. add r14,r13
  256. adc r15,0
  257. mov rcx,r8
  258. shr r8,51
  259. shl r9,13
  260. and rcx,rbp
  261. or r9,r8
  262. add rdx,r9
  263. mov r10,r14
  264. shr r14,51
  265. shl r15,13
  266. and r10,rbp
  267. or r15,r14
  268. lea r14,QWORD PTR[r15*8+r15]
  269. lea r15,QWORD PTR[r14*2+r15]
  270. add rax,r15
  271. mov r8,rdx
  272. and rdx,rbp
  273. shr r8,51
  274. add rbx,r8
  275. mov r9,rax
  276. and rax,rbp
  277. shr r9,51
  278. add rcx,r9
  279. mov QWORD PTR[rdi],rax
  280. mov QWORD PTR[8+rdi],rcx
  281. mov QWORD PTR[16+rdi],rdx
  282. mov QWORD PTR[24+rdi],rbx
  283. mov QWORD PTR[32+rdi],r10
  284. mov r15,QWORD PTR[40+rsp]
  285. mov r14,QWORD PTR[48+rsp]
  286. mov r13,QWORD PTR[56+rsp]
  287. mov r12,QWORD PTR[64+rsp]
  288. mov rbx,QWORD PTR[72+rsp]
  289. mov rbp,QWORD PTR[80+rsp]
  290. lea rsp,QWORD PTR[88+rsp]
  291. $L$fe51_sqr_epilogue::
  292. mov rdi,QWORD PTR[8+rsp] ;WIN64 epilogue
  293. mov rsi,QWORD PTR[16+rsp]
  294. DB 0F3h,0C3h ;repret
  295. $L$SEH_end_x25519_fe51_sqr::
  296. x25519_fe51_sqr ENDP
  297. PUBLIC x25519_fe51_mul121666
  298. ALIGN 32
  299. x25519_fe51_mul121666 PROC PUBLIC
  300. mov QWORD PTR[8+rsp],rdi ;WIN64 prologue
  301. mov QWORD PTR[16+rsp],rsi
  302. mov rax,rsp
  303. $L$SEH_begin_x25519_fe51_mul121666::
  304. mov rdi,rcx
  305. mov rsi,rdx
  306. push rbp
  307. push rbx
  308. push r12
  309. push r13
  310. push r14
  311. push r15
  312. lea rsp,QWORD PTR[((-40))+rsp]
  313. $L$fe51_mul121666_body::
  314. mov eax,121666
  315. mul QWORD PTR[rsi]
  316. mov rbx,rax
  317. mov eax,121666
  318. mov rcx,rdx
  319. mul QWORD PTR[8+rsi]
  320. mov r8,rax
  321. mov eax,121666
  322. mov r9,rdx
  323. mul QWORD PTR[16+rsi]
  324. mov r10,rax
  325. mov eax,121666
  326. mov r11,rdx
  327. mul QWORD PTR[24+rsi]
  328. mov r12,rax
  329. mov eax,121666
  330. mov r13,rdx
  331. mul QWORD PTR[32+rsi]
  332. mov r14,rax
  333. mov r15,rdx
  334. jmp $L$reduce51
  335. $L$fe51_mul121666_epilogue::
  336. $L$SEH_end_x25519_fe51_mul121666::
  337. x25519_fe51_mul121666 ENDP
  338. EXTERN OPENSSL_ia32cap_P:NEAR
  339. PUBLIC x25519_fe64_eligible
  340. ALIGN 32
  341. x25519_fe64_eligible PROC PUBLIC
  342. mov ecx,DWORD PTR[((OPENSSL_ia32cap_P+8))]
  343. xor eax,eax
  344. and ecx,080100h
  345. cmp ecx,080100h
  346. cmove eax,ecx
  347. DB 0F3h,0C3h ;repret
  348. x25519_fe64_eligible ENDP
  349. PUBLIC x25519_fe64_mul
  350. ALIGN 32
  351. x25519_fe64_mul PROC PUBLIC
  352. mov QWORD PTR[8+rsp],rdi ;WIN64 prologue
  353. mov QWORD PTR[16+rsp],rsi
  354. mov rax,rsp
  355. $L$SEH_begin_x25519_fe64_mul::
  356. mov rdi,rcx
  357. mov rsi,rdx
  358. mov rdx,r8
  359. push rbp
  360. push rbx
  361. push r12
  362. push r13
  363. push r14
  364. push r15
  365. push rdi
  366. lea rsp,QWORD PTR[((-16))+rsp]
  367. $L$fe64_mul_body::
  368. mov rax,rdx
  369. mov rbp,QWORD PTR[rdx]
  370. mov rdx,QWORD PTR[rsi]
  371. mov rcx,QWORD PTR[8+rax]
  372. mov r14,QWORD PTR[16+rax]
  373. mov r15,QWORD PTR[24+rax]
  374. mulx rax,r8,rbp
  375. xor edi,edi
  376. mulx rbx,r9,rcx
  377. adcx r9,rax
  378. mulx rax,r10,r14
  379. adcx r10,rbx
  380. mulx r12,r11,r15
  381. mov rdx,QWORD PTR[8+rsi]
  382. adcx r11,rax
  383. mov QWORD PTR[rsp],r14
  384. adcx r12,rdi
  385. mulx rbx,rax,rbp
  386. adox r9,rax
  387. adcx r10,rbx
  388. mulx rbx,rax,rcx
  389. adox r10,rax
  390. adcx r11,rbx
  391. mulx rbx,rax,r14
  392. adox r11,rax
  393. adcx r12,rbx
  394. mulx r13,rax,r15
  395. mov rdx,QWORD PTR[16+rsi]
  396. adox r12,rax
  397. adcx r13,rdi
  398. adox r13,rdi
  399. mulx rbx,rax,rbp
  400. adcx r10,rax
  401. adox r11,rbx
  402. mulx rbx,rax,rcx
  403. adcx r11,rax
  404. adox r12,rbx
  405. mulx rbx,rax,r14
  406. adcx r12,rax
  407. adox r13,rbx
  408. mulx r14,rax,r15
  409. mov rdx,QWORD PTR[24+rsi]
  410. adcx r13,rax
  411. adox r14,rdi
  412. adcx r14,rdi
  413. mulx rbx,rax,rbp
  414. adox r11,rax
  415. adcx r12,rbx
  416. mulx rbx,rax,rcx
  417. adox r12,rax
  418. adcx r13,rbx
  419. mulx rbx,rax,QWORD PTR[rsp]
  420. adox r13,rax
  421. adcx r14,rbx
  422. mulx r15,rax,r15
  423. mov edx,38
  424. adox r14,rax
  425. adcx r15,rdi
  426. adox r15,rdi
  427. jmp $L$reduce64
  428. $L$fe64_mul_epilogue::
  429. $L$SEH_end_x25519_fe64_mul::
  430. x25519_fe64_mul ENDP
  431. PUBLIC x25519_fe64_sqr
  432. ALIGN 32
  433. x25519_fe64_sqr PROC PUBLIC
  434. mov QWORD PTR[8+rsp],rdi ;WIN64 prologue
  435. mov QWORD PTR[16+rsp],rsi
  436. mov rax,rsp
  437. $L$SEH_begin_x25519_fe64_sqr::
  438. mov rdi,rcx
  439. mov rsi,rdx
  440. push rbp
  441. push rbx
  442. push r12
  443. push r13
  444. push r14
  445. push r15
  446. push rdi
  447. lea rsp,QWORD PTR[((-16))+rsp]
  448. $L$fe64_sqr_body::
  449. mov rdx,QWORD PTR[rsi]
  450. mov rcx,QWORD PTR[8+rsi]
  451. mov rbp,QWORD PTR[16+rsi]
  452. mov rsi,QWORD PTR[24+rsi]
  453. mulx r15,r8,rdx
  454. mulx rax,r9,rcx
  455. xor edi,edi
  456. mulx rbx,r10,rbp
  457. adcx r10,rax
  458. mulx r12,r11,rsi
  459. mov rdx,rcx
  460. adcx r11,rbx
  461. adcx r12,rdi
  462. mulx rbx,rax,rbp
  463. adox r11,rax
  464. adcx r12,rbx
  465. mulx r13,rax,rsi
  466. mov rdx,rbp
  467. adox r12,rax
  468. adcx r13,rdi
  469. mulx r14,rax,rsi
  470. mov rdx,rcx
  471. adox r13,rax
  472. adcx r14,rdi
  473. adox r14,rdi
  474. adcx r9,r9
  475. adox r9,r15
  476. adcx r10,r10
  477. mulx rbx,rax,rdx
  478. mov rdx,rbp
  479. adcx r11,r11
  480. adox r10,rax
  481. adcx r12,r12
  482. adox r11,rbx
  483. mulx rbx,rax,rdx
  484. mov rdx,rsi
  485. adcx r13,r13
  486. adox r12,rax
  487. adcx r14,r14
  488. adox r13,rbx
  489. mulx r15,rax,rdx
  490. mov edx,38
  491. adox r14,rax
  492. adcx r15,rdi
  493. adox r15,rdi
  494. jmp $L$reduce64
  495. ALIGN 32
  496. $L$reduce64::
  497. mulx rbx,rax,r12
  498. adcx r8,rax
  499. adox r9,rbx
  500. mulx rbx,rax,r13
  501. adcx r9,rax
  502. adox r10,rbx
  503. mulx rbx,rax,r14
  504. adcx r10,rax
  505. adox r11,rbx
  506. mulx r12,rax,r15
  507. adcx r11,rax
  508. adox r12,rdi
  509. adcx r12,rdi
  510. mov rdi,QWORD PTR[16+rsp]
  511. imul r12,rdx
  512. add r8,r12
  513. adc r9,0
  514. adc r10,0
  515. adc r11,0
  516. sbb rax,rax
  517. and rax,38
  518. add r8,rax
  519. mov QWORD PTR[8+rdi],r9
  520. mov QWORD PTR[16+rdi],r10
  521. mov QWORD PTR[24+rdi],r11
  522. mov QWORD PTR[rdi],r8
  523. mov r15,QWORD PTR[24+rsp]
  524. mov r14,QWORD PTR[32+rsp]
  525. mov r13,QWORD PTR[40+rsp]
  526. mov r12,QWORD PTR[48+rsp]
  527. mov rbx,QWORD PTR[56+rsp]
  528. mov rbp,QWORD PTR[64+rsp]
  529. lea rsp,QWORD PTR[72+rsp]
  530. $L$fe64_sqr_epilogue::
  531. mov rdi,QWORD PTR[8+rsp] ;WIN64 epilogue
  532. mov rsi,QWORD PTR[16+rsp]
  533. DB 0F3h,0C3h ;repret
  534. $L$SEH_end_x25519_fe64_sqr::
  535. x25519_fe64_sqr ENDP
  536. PUBLIC x25519_fe64_mul121666
  537. ALIGN 32
  538. x25519_fe64_mul121666 PROC PUBLIC
  539. mov QWORD PTR[8+rsp],rdi ;WIN64 prologue
  540. mov QWORD PTR[16+rsp],rsi
  541. mov rax,rsp
  542. $L$SEH_begin_x25519_fe64_mul121666::
  543. mov rdi,rcx
  544. mov rsi,rdx
  545. $L$fe64_mul121666_body::
  546. mov edx,121666
  547. mulx rcx,r8,QWORD PTR[rsi]
  548. mulx rax,r9,QWORD PTR[8+rsi]
  549. add r9,rcx
  550. mulx rcx,r10,QWORD PTR[16+rsi]
  551. adc r10,rax
  552. mulx rax,r11,QWORD PTR[24+rsi]
  553. adc r11,rcx
  554. adc rax,0
  555. imul rax,rax,38
  556. add r8,rax
  557. adc r9,0
  558. adc r10,0
  559. adc r11,0
  560. sbb rax,rax
  561. and rax,38
  562. add r8,rax
  563. mov QWORD PTR[8+rdi],r9
  564. mov QWORD PTR[16+rdi],r10
  565. mov QWORD PTR[24+rdi],r11
  566. mov QWORD PTR[rdi],r8
  567. $L$fe64_mul121666_epilogue::
  568. mov rdi,QWORD PTR[8+rsp] ;WIN64 epilogue
  569. mov rsi,QWORD PTR[16+rsp]
  570. DB 0F3h,0C3h ;repret
  571. $L$SEH_end_x25519_fe64_mul121666::
  572. x25519_fe64_mul121666 ENDP
  573. PUBLIC x25519_fe64_add
  574. ALIGN 32
  575. x25519_fe64_add PROC PUBLIC
  576. mov QWORD PTR[8+rsp],rdi ;WIN64 prologue
  577. mov QWORD PTR[16+rsp],rsi
  578. mov rax,rsp
  579. $L$SEH_begin_x25519_fe64_add::
  580. mov rdi,rcx
  581. mov rsi,rdx
  582. mov rdx,r8
  583. $L$fe64_add_body::
  584. mov r8,QWORD PTR[rsi]
  585. mov r9,QWORD PTR[8+rsi]
  586. mov r10,QWORD PTR[16+rsi]
  587. mov r11,QWORD PTR[24+rsi]
  588. add r8,QWORD PTR[rdx]
  589. adc r9,QWORD PTR[8+rdx]
  590. adc r10,QWORD PTR[16+rdx]
  591. adc r11,QWORD PTR[24+rdx]
  592. sbb rax,rax
  593. and rax,38
  594. add r8,rax
  595. adc r9,0
  596. adc r10,0
  597. mov QWORD PTR[8+rdi],r9
  598. adc r11,0
  599. mov QWORD PTR[16+rdi],r10
  600. sbb rax,rax
  601. mov QWORD PTR[24+rdi],r11
  602. and rax,38
  603. add r8,rax
  604. mov QWORD PTR[rdi],r8
  605. $L$fe64_add_epilogue::
  606. mov rdi,QWORD PTR[8+rsp] ;WIN64 epilogue
  607. mov rsi,QWORD PTR[16+rsp]
  608. DB 0F3h,0C3h ;repret
  609. $L$SEH_end_x25519_fe64_add::
  610. x25519_fe64_add ENDP
  611. PUBLIC x25519_fe64_sub
  612. ALIGN 32
  613. x25519_fe64_sub PROC PUBLIC
  614. mov QWORD PTR[8+rsp],rdi ;WIN64 prologue
  615. mov QWORD PTR[16+rsp],rsi
  616. mov rax,rsp
  617. $L$SEH_begin_x25519_fe64_sub::
  618. mov rdi,rcx
  619. mov rsi,rdx
  620. mov rdx,r8
  621. $L$fe64_sub_body::
  622. mov r8,QWORD PTR[rsi]
  623. mov r9,QWORD PTR[8+rsi]
  624. mov r10,QWORD PTR[16+rsi]
  625. mov r11,QWORD PTR[24+rsi]
  626. sub r8,QWORD PTR[rdx]
  627. sbb r9,QWORD PTR[8+rdx]
  628. sbb r10,QWORD PTR[16+rdx]
  629. sbb r11,QWORD PTR[24+rdx]
  630. sbb rax,rax
  631. and rax,38
  632. sub r8,rax
  633. sbb r9,0
  634. sbb r10,0
  635. mov QWORD PTR[8+rdi],r9
  636. sbb r11,0
  637. mov QWORD PTR[16+rdi],r10
  638. sbb rax,rax
  639. mov QWORD PTR[24+rdi],r11
  640. and rax,38
  641. sub r8,rax
  642. mov QWORD PTR[rdi],r8
  643. $L$fe64_sub_epilogue::
  644. mov rdi,QWORD PTR[8+rsp] ;WIN64 epilogue
  645. mov rsi,QWORD PTR[16+rsp]
  646. DB 0F3h,0C3h ;repret
  647. $L$SEH_end_x25519_fe64_sub::
  648. x25519_fe64_sub ENDP
  649. PUBLIC x25519_fe64_tobytes
  650. ALIGN 32
  651. x25519_fe64_tobytes PROC PUBLIC
  652. mov QWORD PTR[8+rsp],rdi ;WIN64 prologue
  653. mov QWORD PTR[16+rsp],rsi
  654. mov rax,rsp
  655. $L$SEH_begin_x25519_fe64_tobytes::
  656. mov rdi,rcx
  657. mov rsi,rdx
  658. $L$fe64_to_body::
  659. mov r8,QWORD PTR[rsi]
  660. mov r9,QWORD PTR[8+rsi]
  661. mov r10,QWORD PTR[16+rsi]
  662. mov r11,QWORD PTR[24+rsi]
  663. lea rax,QWORD PTR[r11*1+r11]
  664. sar r11,63
  665. shr rax,1
  666. and r11,19
  667. add r11,19
  668. add r8,r11
  669. adc r9,0
  670. adc r10,0
  671. adc rax,0
  672. lea r11,QWORD PTR[rax*1+rax]
  673. sar rax,63
  674. shr r11,1
  675. not rax
  676. and rax,19
  677. sub r8,rax
  678. sbb r9,0
  679. sbb r10,0
  680. sbb r11,0
  681. mov QWORD PTR[rdi],r8
  682. mov QWORD PTR[8+rdi],r9
  683. mov QWORD PTR[16+rdi],r10
  684. mov QWORD PTR[24+rdi],r11
  685. $L$fe64_to_epilogue::
  686. mov rdi,QWORD PTR[8+rsp] ;WIN64 epilogue
  687. mov rsi,QWORD PTR[16+rsp]
  688. DB 0F3h,0C3h ;repret
  689. $L$SEH_end_x25519_fe64_tobytes::
  690. x25519_fe64_tobytes ENDP
  691. DB 88,50,53,53,49,57,32,112,114,105,109,105,116,105,118,101
  692. DB 115,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82
  693. DB 89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112
  694. DB 114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
  695. EXTERN __imp_RtlVirtualUnwind:NEAR
  696. ALIGN 16
  697. short_handler PROC PRIVATE
  698. push rsi
  699. push rdi
  700. push rbx
  701. push rbp
  702. push r12
  703. push r13
  704. push r14
  705. push r15
  706. pushfq
  707. sub rsp,64
  708. mov rax,QWORD PTR[120+r8]
  709. mov rbx,QWORD PTR[248+r8]
  710. mov rsi,QWORD PTR[8+r9]
  711. mov r11,QWORD PTR[56+r9]
  712. mov r10d,DWORD PTR[r11]
  713. lea r10,QWORD PTR[r10*1+rsi]
  714. cmp rbx,r10
  715. jb $L$common_seh_tail
  716. mov rax,QWORD PTR[152+r8]
  717. jmp $L$common_seh_tail
  718. short_handler ENDP
  719. ALIGN 16
  720. full_handler PROC PRIVATE
  721. push rsi
  722. push rdi
  723. push rbx
  724. push rbp
  725. push r12
  726. push r13
  727. push r14
  728. push r15
  729. pushfq
  730. sub rsp,64
  731. mov rax,QWORD PTR[120+r8]
  732. mov rbx,QWORD PTR[248+r8]
  733. mov rsi,QWORD PTR[8+r9]
  734. mov r11,QWORD PTR[56+r9]
  735. mov r10d,DWORD PTR[r11]
  736. lea r10,QWORD PTR[r10*1+rsi]
  737. cmp rbx,r10
  738. jb $L$common_seh_tail
  739. mov rax,QWORD PTR[152+r8]
  740. mov r10d,DWORD PTR[4+r11]
  741. lea r10,QWORD PTR[r10*1+rsi]
  742. cmp rbx,r10
  743. jae $L$common_seh_tail
  744. mov r10d,DWORD PTR[8+r11]
  745. lea rax,QWORD PTR[r10*1+rax]
  746. mov rbp,QWORD PTR[((-8))+rax]
  747. mov rbx,QWORD PTR[((-16))+rax]
  748. mov r12,QWORD PTR[((-24))+rax]
  749. mov r13,QWORD PTR[((-32))+rax]
  750. mov r14,QWORD PTR[((-40))+rax]
  751. mov r15,QWORD PTR[((-48))+rax]
  752. mov QWORD PTR[144+r8],rbx
  753. mov QWORD PTR[160+r8],rbp
  754. mov QWORD PTR[216+r8],r12
  755. mov QWORD PTR[224+r8],r13
  756. mov QWORD PTR[232+r8],r14
  757. mov QWORD PTR[240+r8],r15
  758. $L$common_seh_tail::
  759. mov rdi,QWORD PTR[8+rax]
  760. mov rsi,QWORD PTR[16+rax]
  761. mov QWORD PTR[152+r8],rax
  762. mov QWORD PTR[168+r8],rsi
  763. mov QWORD PTR[176+r8],rdi
  764. mov rdi,QWORD PTR[40+r9]
  765. mov rsi,r8
  766. mov ecx,154
  767. DD 0a548f3fch
  768. mov rsi,r9
  769. xor rcx,rcx
  770. mov rdx,QWORD PTR[8+rsi]
  771. mov r8,QWORD PTR[rsi]
  772. mov r9,QWORD PTR[16+rsi]
  773. mov r10,QWORD PTR[40+rsi]
  774. lea r11,QWORD PTR[56+rsi]
  775. lea r12,QWORD PTR[24+rsi]
  776. mov QWORD PTR[32+rsp],r10
  777. mov QWORD PTR[40+rsp],r11
  778. mov QWORD PTR[48+rsp],r12
  779. mov QWORD PTR[56+rsp],rcx
  780. call QWORD PTR[__imp_RtlVirtualUnwind]
  781. mov eax,1
  782. add rsp,64
  783. popfq
  784. pop r15
  785. pop r14
  786. pop r13
  787. pop r12
  788. pop rbp
  789. pop rbx
  790. pop rdi
  791. pop rsi
  792. DB 0F3h,0C3h ;repret
  793. full_handler ENDP
  794. .text$ ENDS
  795. .pdata SEGMENT READONLY ALIGN(4)
  796. ALIGN 4
  797. DD imagerel $L$SEH_begin_x25519_fe51_mul
  798. DD imagerel $L$SEH_end_x25519_fe51_mul
  799. DD imagerel $L$SEH_info_x25519_fe51_mul
  800. DD imagerel $L$SEH_begin_x25519_fe51_sqr
  801. DD imagerel $L$SEH_end_x25519_fe51_sqr
  802. DD imagerel $L$SEH_info_x25519_fe51_sqr
  803. DD imagerel $L$SEH_begin_x25519_fe51_mul121666
  804. DD imagerel $L$SEH_end_x25519_fe51_mul121666
  805. DD imagerel $L$SEH_info_x25519_fe51_mul121666
  806. DD imagerel $L$SEH_begin_x25519_fe64_mul
  807. DD imagerel $L$SEH_end_x25519_fe64_mul
  808. DD imagerel $L$SEH_info_x25519_fe64_mul
  809. DD imagerel $L$SEH_begin_x25519_fe64_sqr
  810. DD imagerel $L$SEH_end_x25519_fe64_sqr
  811. DD imagerel $L$SEH_info_x25519_fe64_sqr
  812. DD imagerel $L$SEH_begin_x25519_fe64_mul121666
  813. DD imagerel $L$SEH_end_x25519_fe64_mul121666
  814. DD imagerel $L$SEH_info_x25519_fe64_mul121666
  815. DD imagerel $L$SEH_begin_x25519_fe64_add
  816. DD imagerel $L$SEH_end_x25519_fe64_add
  817. DD imagerel $L$SEH_info_x25519_fe64_add
  818. DD imagerel $L$SEH_begin_x25519_fe64_sub
  819. DD imagerel $L$SEH_end_x25519_fe64_sub
  820. DD imagerel $L$SEH_info_x25519_fe64_sub
  821. DD imagerel $L$SEH_begin_x25519_fe64_tobytes
  822. DD imagerel $L$SEH_end_x25519_fe64_tobytes
  823. DD imagerel $L$SEH_info_x25519_fe64_tobytes
  824. .pdata ENDS
  825. .xdata SEGMENT READONLY ALIGN(8)
  826. ALIGN 8
  827. $L$SEH_info_x25519_fe51_mul::
  828. DB 9,0,0,0
  829. DD imagerel full_handler
  830. DD imagerel $L$fe51_mul_body,imagerel $L$fe51_mul_epilogue
  831. DD 88,0
  832. $L$SEH_info_x25519_fe51_sqr::
  833. DB 9,0,0,0
  834. DD imagerel full_handler
  835. DD imagerel $L$fe51_sqr_body,imagerel $L$fe51_sqr_epilogue
  836. DD 88,0
  837. $L$SEH_info_x25519_fe51_mul121666::
  838. DB 9,0,0,0
  839. DD imagerel full_handler
  840. DD imagerel $L$fe51_mul121666_body,imagerel $L$fe51_mul121666_epilogue
  841. DD 88,0
  842. $L$SEH_info_x25519_fe64_mul::
  843. DB 9,0,0,0
  844. DD imagerel full_handler
  845. DD imagerel $L$fe64_mul_body,imagerel $L$fe64_mul_epilogue
  846. DD 72,0
  847. $L$SEH_info_x25519_fe64_sqr::
  848. DB 9,0,0,0
  849. DD imagerel full_handler
  850. DD imagerel $L$fe64_sqr_body,imagerel $L$fe64_sqr_epilogue
  851. DD 72,0
  852. $L$SEH_info_x25519_fe64_mul121666::
  853. DB 9,0,0,0
  854. DD imagerel short_handler
  855. DD imagerel $L$fe64_mul121666_body,imagerel $L$fe64_mul121666_epilogue
  856. $L$SEH_info_x25519_fe64_add::
  857. DB 9,0,0,0
  858. DD imagerel short_handler
  859. DD imagerel $L$fe64_add_body,imagerel $L$fe64_add_epilogue
  860. $L$SEH_info_x25519_fe64_sub::
  861. DB 9,0,0,0
  862. DD imagerel short_handler
  863. DD imagerel $L$fe64_sub_body,imagerel $L$fe64_sub_epilogue
  864. $L$SEH_info_x25519_fe64_tobytes::
  865. DB 9,0,0,0
  866. DD imagerel short_handler
  867. DD imagerel $L$fe64_to_body,imagerel $L$fe64_to_epilogue
  868. .xdata ENDS
  869. END