1; This file is generated from a similarly-named Perl script in the BoringSSL
2; source tree. Do not edit by hand.
3
4%ifidn __OUTPUT_FORMAT__, win64
5default	rel
6%define XMMWORD
7%define YMMWORD
8%define ZMMWORD
9%define _CET_ENDBR
10
11%include "ring_core_generated/prefix_symbols_nasm.inc"
12section	.text code align=64
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31ALIGN	16
32_vpaes_encrypt_core:
33
34	mov	r9,rdx
35	mov	r11,16
36	mov	eax,DWORD[240+rdx]
37	movdqa	xmm1,xmm9
38	movdqa	xmm2,XMMWORD[$L$k_ipt]
39	pandn	xmm1,xmm0
40	movdqu	xmm5,XMMWORD[r9]
41	psrld	xmm1,4
42	pand	xmm0,xmm9
43DB	102,15,56,0,208
44	movdqa	xmm0,XMMWORD[(($L$k_ipt+16))]
45DB	102,15,56,0,193
46	pxor	xmm2,xmm5
47	add	r9,16
48	pxor	xmm0,xmm2
49	lea	r10,[$L$k_mc_backward]
50	jmp	NEAR $L$enc_entry
51
52ALIGN	16
53$L$enc_loop:
54
55	movdqa	xmm4,xmm13
56	movdqa	xmm0,xmm12
57DB	102,15,56,0,226
58DB	102,15,56,0,195
59	pxor	xmm4,xmm5
60	movdqa	xmm5,xmm15
61	pxor	xmm0,xmm4
62	movdqa	xmm1,XMMWORD[((-64))+r10*1+r11]
63DB	102,15,56,0,234
64	movdqa	xmm4,XMMWORD[r10*1+r11]
65	movdqa	xmm2,xmm14
66DB	102,15,56,0,211
67	movdqa	xmm3,xmm0
68	pxor	xmm2,xmm5
69DB	102,15,56,0,193
70	add	r9,16
71	pxor	xmm0,xmm2
72DB	102,15,56,0,220
73	add	r11,16
74	pxor	xmm3,xmm0
75DB	102,15,56,0,193
76	and	r11,0x30
77	sub	rax,1
78	pxor	xmm0,xmm3
79
80$L$enc_entry:
81
82	movdqa	xmm1,xmm9
83	movdqa	xmm5,xmm11
84	pandn	xmm1,xmm0
85	psrld	xmm1,4
86	pand	xmm0,xmm9
87DB	102,15,56,0,232
88	movdqa	xmm3,xmm10
89	pxor	xmm0,xmm1
90DB	102,15,56,0,217
91	movdqa	xmm4,xmm10
92	pxor	xmm3,xmm5
93DB	102,15,56,0,224
94	movdqa	xmm2,xmm10
95	pxor	xmm4,xmm5
96DB	102,15,56,0,211
97	movdqa	xmm3,xmm10
98	pxor	xmm2,xmm0
99DB	102,15,56,0,220
100	movdqu	xmm5,XMMWORD[r9]
101	pxor	xmm3,xmm1
102	jnz	NEAR $L$enc_loop
103
104
105	movdqa	xmm4,XMMWORD[((-96))+r10]
106	movdqa	xmm0,XMMWORD[((-80))+r10]
107DB	102,15,56,0,226
108	pxor	xmm4,xmm5
109DB	102,15,56,0,195
110	movdqa	xmm1,XMMWORD[64+r10*1+r11]
111	pxor	xmm0,xmm4
112DB	102,15,56,0,193
113	ret
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147ALIGN	16
148_vpaes_encrypt_core_2x:
149
150	mov	r9,rdx
151	mov	r11,16
152	mov	eax,DWORD[240+rdx]
153	movdqa	xmm1,xmm9
154	movdqa	xmm7,xmm9
155	movdqa	xmm2,XMMWORD[$L$k_ipt]
156	movdqa	xmm8,xmm2
157	pandn	xmm1,xmm0
158	pandn	xmm7,xmm6
159	movdqu	xmm5,XMMWORD[r9]
160
161	psrld	xmm1,4
162	psrld	xmm7,4
163	pand	xmm0,xmm9
164	pand	xmm6,xmm9
165DB	102,15,56,0,208
166DB	102,68,15,56,0,198
167	movdqa	xmm0,XMMWORD[(($L$k_ipt+16))]
168	movdqa	xmm6,xmm0
169DB	102,15,56,0,193
170DB	102,15,56,0,247
171	pxor	xmm2,xmm5
172	pxor	xmm8,xmm5
173	add	r9,16
174	pxor	xmm0,xmm2
175	pxor	xmm6,xmm8
176	lea	r10,[$L$k_mc_backward]
177	jmp	NEAR $L$enc2x_entry
178
179ALIGN	16
180$L$enc2x_loop:
181
182	movdqa	xmm4,XMMWORD[$L$k_sb1]
183	movdqa	xmm0,XMMWORD[(($L$k_sb1+16))]
184	movdqa	xmm12,xmm4
185	movdqa	xmm6,xmm0
186DB	102,15,56,0,226
187DB	102,69,15,56,0,224
188DB	102,15,56,0,195
189DB	102,65,15,56,0,243
190	pxor	xmm4,xmm5
191	pxor	xmm12,xmm5
192	movdqa	xmm5,XMMWORD[$L$k_sb2]
193	movdqa	xmm13,xmm5
194	pxor	xmm0,xmm4
195	pxor	xmm6,xmm12
196	movdqa	xmm1,XMMWORD[((-64))+r10*1+r11]
197
198DB	102,15,56,0,234
199DB	102,69,15,56,0,232
200	movdqa	xmm4,XMMWORD[r10*1+r11]
201
202	movdqa	xmm2,XMMWORD[(($L$k_sb2+16))]
203	movdqa	xmm8,xmm2
204DB	102,15,56,0,211
205DB	102,69,15,56,0,195
206	movdqa	xmm3,xmm0
207	movdqa	xmm11,xmm6
208	pxor	xmm2,xmm5
209	pxor	xmm8,xmm13
210DB	102,15,56,0,193
211DB	102,15,56,0,241
212	add	r9,16
213	pxor	xmm0,xmm2
214	pxor	xmm6,xmm8
215DB	102,15,56,0,220
216DB	102,68,15,56,0,220
217	add	r11,16
218	pxor	xmm3,xmm0
219	pxor	xmm11,xmm6
220DB	102,15,56,0,193
221DB	102,15,56,0,241
222	and	r11,0x30
223	sub	rax,1
224	pxor	xmm0,xmm3
225	pxor	xmm6,xmm11
226
227$L$enc2x_entry:
228
229	movdqa	xmm1,xmm9
230	movdqa	xmm7,xmm9
231	movdqa	xmm5,XMMWORD[(($L$k_inv+16))]
232	movdqa	xmm13,xmm5
233	pandn	xmm1,xmm0
234	pandn	xmm7,xmm6
235	psrld	xmm1,4
236	psrld	xmm7,4
237	pand	xmm0,xmm9
238	pand	xmm6,xmm9
239DB	102,15,56,0,232
240DB	102,68,15,56,0,238
241	movdqa	xmm3,xmm10
242	movdqa	xmm11,xmm10
243	pxor	xmm0,xmm1
244	pxor	xmm6,xmm7
245DB	102,15,56,0,217
246DB	102,68,15,56,0,223
247	movdqa	xmm4,xmm10
248	movdqa	xmm12,xmm10
249	pxor	xmm3,xmm5
250	pxor	xmm11,xmm13
251DB	102,15,56,0,224
252DB	102,68,15,56,0,230
253	movdqa	xmm2,xmm10
254	movdqa	xmm8,xmm10
255	pxor	xmm4,xmm5
256	pxor	xmm12,xmm13
257DB	102,15,56,0,211
258DB	102,69,15,56,0,195
259	movdqa	xmm3,xmm10
260	movdqa	xmm11,xmm10
261	pxor	xmm2,xmm0
262	pxor	xmm8,xmm6
263DB	102,15,56,0,220
264DB	102,69,15,56,0,220
265	movdqu	xmm5,XMMWORD[r9]
266
267	pxor	xmm3,xmm1
268	pxor	xmm11,xmm7
269	jnz	NEAR $L$enc2x_loop
270
271
272	movdqa	xmm4,XMMWORD[((-96))+r10]
273	movdqa	xmm0,XMMWORD[((-80))+r10]
274	movdqa	xmm12,xmm4
275	movdqa	xmm6,xmm0
276DB	102,15,56,0,226
277DB	102,69,15,56,0,224
278	pxor	xmm4,xmm5
279	pxor	xmm12,xmm5
280DB	102,15,56,0,195
281DB	102,65,15,56,0,243
282	movdqa	xmm1,XMMWORD[64+r10*1+r11]
283
284	pxor	xmm0,xmm4
285	pxor	xmm6,xmm12
286DB	102,15,56,0,193
287DB	102,15,56,0,241
288	ret
289
290
291
292
293
294
295
296
297
298ALIGN	16
299_vpaes_schedule_core:
300
301
302
303
304
305
306	call	_vpaes_preheat
307	movdqa	xmm8,XMMWORD[$L$k_rcon]
308	movdqu	xmm0,XMMWORD[rdi]
309
310
311	movdqa	xmm3,xmm0
312	lea	r11,[$L$k_ipt]
313	call	_vpaes_schedule_transform
314	movdqa	xmm7,xmm0
315
316	lea	r10,[$L$k_sr]
317
318
319	movdqu	XMMWORD[rdx],xmm0
320
321$L$schedule_go:
322	cmp	esi,192
323	ja	NEAR $L$schedule_256
324
325
326
327
328
329
330
331
332
333
334
335$L$schedule_128:
336	mov	esi,10
337
338$L$oop_schedule_128:
339	call	_vpaes_schedule_round
340	dec	rsi
341	jz	NEAR $L$schedule_mangle_last
342	call	_vpaes_schedule_mangle
343	jmp	NEAR $L$oop_schedule_128
344
345
346
347
348
349
350
351
352
353
354
355ALIGN	16
356$L$schedule_256:
357	movdqu	xmm0,XMMWORD[16+rdi]
358	call	_vpaes_schedule_transform
359	mov	esi,7
360
361$L$oop_schedule_256:
362	call	_vpaes_schedule_mangle
363	movdqa	xmm6,xmm0
364
365
366	call	_vpaes_schedule_round
367	dec	rsi
368	jz	NEAR $L$schedule_mangle_last
369	call	_vpaes_schedule_mangle
370
371
372	pshufd	xmm0,xmm0,0xFF
373	movdqa	xmm5,xmm7
374	movdqa	xmm7,xmm6
375	call	_vpaes_schedule_low_round
376	movdqa	xmm7,xmm5
377
378	jmp	NEAR $L$oop_schedule_256
379
380
381
382
383
384
385
386
387
388
389
390
391ALIGN	16
392$L$schedule_mangle_last:
393
394	lea	r11,[$L$k_deskew]
395
396
397	movdqa	xmm1,XMMWORD[r10*1+r8]
398DB	102,15,56,0,193
399	lea	r11,[$L$k_opt]
400	add	rdx,32
401
402$L$schedule_mangle_last_dec:
403	add	rdx,-16
404	pxor	xmm0,XMMWORD[$L$k_s63]
405	call	_vpaes_schedule_transform
406	movdqu	XMMWORD[rdx],xmm0
407
408
409	pxor	xmm0,xmm0
410	pxor	xmm1,xmm1
411	pxor	xmm2,xmm2
412	pxor	xmm3,xmm3
413	pxor	xmm4,xmm4
414	pxor	xmm5,xmm5
415	pxor	xmm6,xmm6
416	pxor	xmm7,xmm7
417	ret
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440ALIGN	16
441_vpaes_schedule_round:
442
443
444	pxor	xmm1,xmm1
445DB	102,65,15,58,15,200,15
446DB	102,69,15,58,15,192,15
447	pxor	xmm7,xmm1
448
449
450	pshufd	xmm0,xmm0,0xFF
451DB	102,15,58,15,192,1
452
453
454
455
456_vpaes_schedule_low_round:
457
458	movdqa	xmm1,xmm7
459	pslldq	xmm7,4
460	pxor	xmm7,xmm1
461	movdqa	xmm1,xmm7
462	pslldq	xmm7,8
463	pxor	xmm7,xmm1
464	pxor	xmm7,XMMWORD[$L$k_s63]
465
466
467	movdqa	xmm1,xmm9
468	pandn	xmm1,xmm0
469	psrld	xmm1,4
470	pand	xmm0,xmm9
471	movdqa	xmm2,xmm11
472DB	102,15,56,0,208
473	pxor	xmm0,xmm1
474	movdqa	xmm3,xmm10
475DB	102,15,56,0,217
476	pxor	xmm3,xmm2
477	movdqa	xmm4,xmm10
478DB	102,15,56,0,224
479	pxor	xmm4,xmm2
480	movdqa	xmm2,xmm10
481DB	102,15,56,0,211
482	pxor	xmm2,xmm0
483	movdqa	xmm3,xmm10
484DB	102,15,56,0,220
485	pxor	xmm3,xmm1
486	movdqa	xmm4,xmm13
487DB	102,15,56,0,226
488	movdqa	xmm0,xmm12
489DB	102,15,56,0,195
490	pxor	xmm0,xmm4
491
492
493	pxor	xmm0,xmm7
494	movdqa	xmm7,xmm0
495	ret
496
497
498
499
500
501
502
503
504
505
506
507
508
509ALIGN	16
510_vpaes_schedule_transform:
511
512	movdqa	xmm1,xmm9
513	pandn	xmm1,xmm0
514	psrld	xmm1,4
515	pand	xmm0,xmm9
516	movdqa	xmm2,XMMWORD[r11]
517DB	102,15,56,0,208
518	movdqa	xmm0,XMMWORD[16+r11]
519DB	102,15,56,0,193
520	pxor	xmm0,xmm2
521	ret
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549ALIGN	16
550_vpaes_schedule_mangle:
551
552	movdqa	xmm4,xmm0
553	movdqa	xmm5,XMMWORD[$L$k_mc_forward]
554
555
556	add	rdx,16
557	pxor	xmm4,XMMWORD[$L$k_s63]
558DB	102,15,56,0,229
559	movdqa	xmm3,xmm4
560DB	102,15,56,0,229
561	pxor	xmm3,xmm4
562DB	102,15,56,0,229
563	pxor	xmm3,xmm4
564
565$L$schedule_mangle_both:
566	movdqa	xmm1,XMMWORD[r10*1+r8]
567DB	102,15,56,0,217
568	add	r8,-16
569	and	r8,0x30
570	movdqu	XMMWORD[rdx],xmm3
571	ret
572
573
574
575
576
577
578global	vpaes_set_encrypt_key
579
580ALIGN	16
581vpaes_set_encrypt_key:
582	mov	QWORD[8+rsp],rdi	;WIN64 prologue
583	mov	QWORD[16+rsp],rsi
584	mov	rax,rsp
585$L$SEH_begin_vpaes_set_encrypt_key:
586	mov	rdi,rcx
587	mov	rsi,rdx
588	mov	rdx,r8
589
590
591
592_CET_ENDBR
593%ifdef BORINGSSL_DISPATCH_TEST
594EXTERN	BORINGSSL_function_hit
595	mov	BYTE[((BORINGSSL_function_hit+5))],1
596%endif
597
598	lea	rsp,[((-184))+rsp]
599	movaps	XMMWORD[16+rsp],xmm6
600	movaps	XMMWORD[32+rsp],xmm7
601	movaps	XMMWORD[48+rsp],xmm8
602	movaps	XMMWORD[64+rsp],xmm9
603	movaps	XMMWORD[80+rsp],xmm10
604	movaps	XMMWORD[96+rsp],xmm11
605	movaps	XMMWORD[112+rsp],xmm12
606	movaps	XMMWORD[128+rsp],xmm13
607	movaps	XMMWORD[144+rsp],xmm14
608	movaps	XMMWORD[160+rsp],xmm15
609$L$enc_key_body:
610	mov	eax,esi
611	shr	eax,5
612	add	eax,5
613	mov	DWORD[240+rdx],eax
614
615	mov	ecx,0
616	mov	r8d,0x30
617	call	_vpaes_schedule_core
618	movaps	xmm6,XMMWORD[16+rsp]
619	movaps	xmm7,XMMWORD[32+rsp]
620	movaps	xmm8,XMMWORD[48+rsp]
621	movaps	xmm9,XMMWORD[64+rsp]
622	movaps	xmm10,XMMWORD[80+rsp]
623	movaps	xmm11,XMMWORD[96+rsp]
624	movaps	xmm12,XMMWORD[112+rsp]
625	movaps	xmm13,XMMWORD[128+rsp]
626	movaps	xmm14,XMMWORD[144+rsp]
627	movaps	xmm15,XMMWORD[160+rsp]
628	lea	rsp,[184+rsp]
629$L$enc_key_epilogue:
630	xor	eax,eax
631	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
632	mov	rsi,QWORD[16+rsp]
633	ret
634
635$L$SEH_end_vpaes_set_encrypt_key:
636
637global	vpaes_encrypt
638
639ALIGN	16
640vpaes_encrypt:
641	mov	QWORD[8+rsp],rdi	;WIN64 prologue
642	mov	QWORD[16+rsp],rsi
643	mov	rax,rsp
644$L$SEH_begin_vpaes_encrypt:
645	mov	rdi,rcx
646	mov	rsi,rdx
647	mov	rdx,r8
648
649
650
651_CET_ENDBR
652%ifdef BORINGSSL_DISPATCH_TEST
653EXTERN	BORINGSSL_function_hit
654	mov	BYTE[((BORINGSSL_function_hit+4))],1
655%endif
656	lea	rsp,[((-184))+rsp]
657	movaps	XMMWORD[16+rsp],xmm6
658	movaps	XMMWORD[32+rsp],xmm7
659	movaps	XMMWORD[48+rsp],xmm8
660	movaps	XMMWORD[64+rsp],xmm9
661	movaps	XMMWORD[80+rsp],xmm10
662	movaps	XMMWORD[96+rsp],xmm11
663	movaps	XMMWORD[112+rsp],xmm12
664	movaps	XMMWORD[128+rsp],xmm13
665	movaps	XMMWORD[144+rsp],xmm14
666	movaps	XMMWORD[160+rsp],xmm15
667$L$enc_body:
668	movdqu	xmm0,XMMWORD[rdi]
669	call	_vpaes_preheat
670	call	_vpaes_encrypt_core
671	movdqu	XMMWORD[rsi],xmm0
672	movaps	xmm6,XMMWORD[16+rsp]
673	movaps	xmm7,XMMWORD[32+rsp]
674	movaps	xmm8,XMMWORD[48+rsp]
675	movaps	xmm9,XMMWORD[64+rsp]
676	movaps	xmm10,XMMWORD[80+rsp]
677	movaps	xmm11,XMMWORD[96+rsp]
678	movaps	xmm12,XMMWORD[112+rsp]
679	movaps	xmm13,XMMWORD[128+rsp]
680	movaps	xmm14,XMMWORD[144+rsp]
681	movaps	xmm15,XMMWORD[160+rsp]
682	lea	rsp,[184+rsp]
683$L$enc_epilogue:
684	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
685	mov	rsi,QWORD[16+rsp]
686	ret
687
688$L$SEH_end_vpaes_encrypt:
689global	vpaes_ctr32_encrypt_blocks
690
691ALIGN	16
692vpaes_ctr32_encrypt_blocks:
693	mov	QWORD[8+rsp],rdi	;WIN64 prologue
694	mov	QWORD[16+rsp],rsi
695	mov	rax,rsp
696$L$SEH_begin_vpaes_ctr32_encrypt_blocks:
697	mov	rdi,rcx
698	mov	rsi,rdx
699	mov	rdx,r8
700	mov	rcx,r9
701	mov	r8,QWORD[40+rsp]
702
703
704
705_CET_ENDBR
706
707	xchg	rdx,rcx
708	test	rcx,rcx
709	jz	NEAR $L$ctr32_abort
710	lea	rsp,[((-184))+rsp]
711	movaps	XMMWORD[16+rsp],xmm6
712	movaps	XMMWORD[32+rsp],xmm7
713	movaps	XMMWORD[48+rsp],xmm8
714	movaps	XMMWORD[64+rsp],xmm9
715	movaps	XMMWORD[80+rsp],xmm10
716	movaps	XMMWORD[96+rsp],xmm11
717	movaps	XMMWORD[112+rsp],xmm12
718	movaps	XMMWORD[128+rsp],xmm13
719	movaps	XMMWORD[144+rsp],xmm14
720	movaps	XMMWORD[160+rsp],xmm15
721$L$ctr32_body:
722	movdqu	xmm0,XMMWORD[r8]
723	movdqa	xmm8,XMMWORD[$L$ctr_add_one]
724	sub	rsi,rdi
725	call	_vpaes_preheat
726	movdqa	xmm6,xmm0
727	pshufb	xmm6,XMMWORD[$L$rev_ctr]
728
729	test	rcx,1
730	jz	NEAR $L$ctr32_prep_loop
731
732
733
734	movdqu	xmm7,XMMWORD[rdi]
735	call	_vpaes_encrypt_core
736	pxor	xmm0,xmm7
737	paddd	xmm6,xmm8
738	movdqu	XMMWORD[rdi*1+rsi],xmm0
739	sub	rcx,1
740	lea	rdi,[16+rdi]
741	jz	NEAR $L$ctr32_done
742
743$L$ctr32_prep_loop:
744
745
746	movdqa	xmm14,xmm6
747	movdqa	xmm15,xmm6
748	paddd	xmm15,xmm8
749
750$L$ctr32_loop:
751	movdqa	xmm1,XMMWORD[$L$rev_ctr]
752	movdqa	xmm0,xmm14
753	movdqa	xmm6,xmm15
754DB	102,15,56,0,193
755DB	102,15,56,0,241
756	call	_vpaes_encrypt_core_2x
757	movdqu	xmm1,XMMWORD[rdi]
758	movdqu	xmm2,XMMWORD[16+rdi]
759	movdqa	xmm3,XMMWORD[$L$ctr_add_two]
760	pxor	xmm0,xmm1
761	pxor	xmm6,xmm2
762	paddd	xmm14,xmm3
763	paddd	xmm15,xmm3
764	movdqu	XMMWORD[rdi*1+rsi],xmm0
765	movdqu	XMMWORD[16+rdi*1+rsi],xmm6
766	sub	rcx,2
767	lea	rdi,[32+rdi]
768	jnz	NEAR $L$ctr32_loop
769
770$L$ctr32_done:
771	movaps	xmm6,XMMWORD[16+rsp]
772	movaps	xmm7,XMMWORD[32+rsp]
773	movaps	xmm8,XMMWORD[48+rsp]
774	movaps	xmm9,XMMWORD[64+rsp]
775	movaps	xmm10,XMMWORD[80+rsp]
776	movaps	xmm11,XMMWORD[96+rsp]
777	movaps	xmm12,XMMWORD[112+rsp]
778	movaps	xmm13,XMMWORD[128+rsp]
779	movaps	xmm14,XMMWORD[144+rsp]
780	movaps	xmm15,XMMWORD[160+rsp]
781	lea	rsp,[184+rsp]
782$L$ctr32_epilogue:
783$L$ctr32_abort:
784	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
785	mov	rsi,QWORD[16+rsp]
786	ret
787
788$L$SEH_end_vpaes_ctr32_encrypt_blocks:
789
790
791
792
793
794
795
796ALIGN	16
797_vpaes_preheat:
798
799	lea	r10,[$L$k_s0F]
800	movdqa	xmm10,XMMWORD[((-32))+r10]
801	movdqa	xmm11,XMMWORD[((-16))+r10]
802	movdqa	xmm9,XMMWORD[r10]
803	movdqa	xmm13,XMMWORD[48+r10]
804	movdqa	xmm12,XMMWORD[64+r10]
805	movdqa	xmm15,XMMWORD[80+r10]
806	movdqa	xmm14,XMMWORD[96+r10]
807	ret
808
809
810
811
812
813
814
815
816section	.rdata rdata align=8
817ALIGN	64
818_vpaes_consts:
819$L$k_inv:
820	DQ	0x0E05060F0D080180,0x040703090A0B0C02
821	DQ	0x01040A060F0B0780,0x030D0E0C02050809
822
823$L$k_s0F:
824	DQ	0x0F0F0F0F0F0F0F0F,0x0F0F0F0F0F0F0F0F
825
826$L$k_ipt:
827	DQ	0xC2B2E8985A2A7000,0xCABAE09052227808
828	DQ	0x4C01307D317C4D00,0xCD80B1FCB0FDCC81
829
830$L$k_sb1:
831	DQ	0xB19BE18FCB503E00,0xA5DF7A6E142AF544
832	DQ	0x3618D415FAE22300,0x3BF7CCC10D2ED9EF
833$L$k_sb2:
834	DQ	0xE27A93C60B712400,0x5EB7E955BC982FCD
835	DQ	0x69EB88400AE12900,0xC2A163C8AB82234A
836$L$k_sbo:
837	DQ	0xD0D26D176FBDC700,0x15AABF7AC502A878
838	DQ	0xCFE474A55FBB6A00,0x8E1E90D1412B35FA
839
840$L$k_mc_forward:
841	DQ	0x0407060500030201,0x0C0F0E0D080B0A09
842	DQ	0x080B0A0904070605,0x000302010C0F0E0D
843	DQ	0x0C0F0E0D080B0A09,0x0407060500030201
844	DQ	0x000302010C0F0E0D,0x080B0A0904070605
845
846$L$k_mc_backward:
847	DQ	0x0605040702010003,0x0E0D0C0F0A09080B
848	DQ	0x020100030E0D0C0F,0x0A09080B06050407
849	DQ	0x0E0D0C0F0A09080B,0x0605040702010003
850	DQ	0x0A09080B06050407,0x020100030E0D0C0F
851
852$L$k_sr:
853	DQ	0x0706050403020100,0x0F0E0D0C0B0A0908
854	DQ	0x030E09040F0A0500,0x0B06010C07020D08
855	DQ	0x0F060D040B020900,0x070E050C030A0108
856	DQ	0x0B0E0104070A0D00,0x0306090C0F020508
857
858$L$k_rcon:
859	DQ	0x1F8391B9AF9DEEB6,0x702A98084D7C7D81
860
861$L$k_s63:
862	DQ	0x5B5B5B5B5B5B5B5B,0x5B5B5B5B5B5B5B5B
863
864$L$k_opt:
865	DQ	0xFF9F4929D6B66000,0xF7974121DEBE6808
866	DQ	0x01EDBD5150BCEC00,0xE10D5DB1B05C0CE0
867
868$L$k_deskew:
869	DQ	0x07E4A34047A4E300,0x1DFEB95A5DBEF91A
870	DQ	0x5F36B5DC83EA6900,0x2841C2ABF49D1E77
871
872
873$L$rev_ctr:
874	DQ	0x0706050403020100,0x0c0d0e0f0b0a0908
875
876
877$L$ctr_add_one:
878	DQ	0x0000000000000000,0x0000000100000000
879$L$ctr_add_two:
880	DQ	0x0000000000000000,0x0000000200000000
881
882	DB	86,101,99,116,111,114,32,80,101,114,109,117,116,97,116,105
883	DB	111,110,32,65,69,83,32,102,111,114,32,120,56,54,95,54
884	DB	52,47,83,83,83,69,51,44,32,77,105,107,101,32,72,97
885	DB	109,98,117,114,103,32,40,83,116,97,110,102,111,114,100,32
886	DB	85,110,105,118,101,114,115,105,116,121,41,0
887ALIGN	64
888
889section	.text
890
891EXTERN	__imp_RtlVirtualUnwind
892
893ALIGN	16
894se_handler:
895	push	rsi
896	push	rdi
897	push	rbx
898	push	rbp
899	push	r12
900	push	r13
901	push	r14
902	push	r15
903	pushfq
904	sub	rsp,64
905
906	mov	rax,QWORD[120+r8]
907	mov	rbx,QWORD[248+r8]
908
909	mov	rsi,QWORD[8+r9]
910	mov	r11,QWORD[56+r9]
911
912	mov	r10d,DWORD[r11]
913	lea	r10,[r10*1+rsi]
914	cmp	rbx,r10
915	jb	NEAR $L$in_prologue
916
917	mov	rax,QWORD[152+r8]
918
919	mov	r10d,DWORD[4+r11]
920	lea	r10,[r10*1+rsi]
921	cmp	rbx,r10
922	jae	NEAR $L$in_prologue
923
924	lea	rsi,[16+rax]
925	lea	rdi,[512+r8]
926	mov	ecx,20
927	DD	0xa548f3fc
928	lea	rax,[184+rax]
929
930$L$in_prologue:
931	mov	rdi,QWORD[8+rax]
932	mov	rsi,QWORD[16+rax]
933	mov	QWORD[152+r8],rax
934	mov	QWORD[168+r8],rsi
935	mov	QWORD[176+r8],rdi
936
937	mov	rdi,QWORD[40+r9]
938	mov	rsi,r8
939	mov	ecx,154
940	DD	0xa548f3fc
941
942	mov	rsi,r9
943	xor	rcx,rcx
944	mov	rdx,QWORD[8+rsi]
945	mov	r8,QWORD[rsi]
946	mov	r9,QWORD[16+rsi]
947	mov	r10,QWORD[40+rsi]
948	lea	r11,[56+rsi]
949	lea	r12,[24+rsi]
950	mov	QWORD[32+rsp],r10
951	mov	QWORD[40+rsp],r11
952	mov	QWORD[48+rsp],r12
953	mov	QWORD[56+rsp],rcx
954	call	QWORD[__imp_RtlVirtualUnwind]
955
956	mov	eax,1
957	add	rsp,64
958	popfq
959	pop	r15
960	pop	r14
961	pop	r13
962	pop	r12
963	pop	rbp
964	pop	rbx
965	pop	rdi
966	pop	rsi
967	ret
968
969
970section	.pdata rdata align=4
971ALIGN	4
972	DD	$L$SEH_begin_vpaes_set_encrypt_key wrt ..imagebase
973	DD	$L$SEH_end_vpaes_set_encrypt_key wrt ..imagebase
974	DD	$L$SEH_info_vpaes_set_encrypt_key wrt ..imagebase
975
976	DD	$L$SEH_begin_vpaes_encrypt wrt ..imagebase
977	DD	$L$SEH_end_vpaes_encrypt wrt ..imagebase
978	DD	$L$SEH_info_vpaes_encrypt wrt ..imagebase
979	DD	$L$SEH_begin_vpaes_ctr32_encrypt_blocks wrt ..imagebase
980	DD	$L$SEH_end_vpaes_ctr32_encrypt_blocks wrt ..imagebase
981	DD	$L$SEH_info_vpaes_ctr32_encrypt_blocks wrt ..imagebase
982
983section	.xdata rdata align=8
984ALIGN	8
985$L$SEH_info_vpaes_set_encrypt_key:
986	DB	9,0,0,0
987	DD	se_handler wrt ..imagebase
988	DD	$L$enc_key_body wrt ..imagebase,$L$enc_key_epilogue wrt ..imagebase
989$L$SEH_info_vpaes_encrypt:
990	DB	9,0,0,0
991	DD	se_handler wrt ..imagebase
992	DD	$L$enc_body wrt ..imagebase,$L$enc_epilogue wrt ..imagebase
993$L$SEH_info_vpaes_ctr32_encrypt_blocks:
994	DB	9,0,0,0
995	DD	se_handler wrt ..imagebase
996	DD	$L$ctr32_body wrt ..imagebase,$L$ctr32_epilogue wrt ..imagebase
997%else
998; Work around https://bugzilla.nasm.us/show_bug.cgi?id=3392738
999ret
1000%endif
1001