1OPTION	DOTNAME
2.text$	SEGMENT ALIGN(256) 'CODE'
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20ALIGN	16
21_vpaes_encrypt_core	PROC PRIVATE
22	mov	r9,rdx
23	mov	r11,16
24	mov	eax,DWORD PTR[240+rdx]
25	movdqa	xmm1,xmm9
26	movdqa	xmm2,XMMWORD PTR[$L$k_ipt]
27	pandn	xmm1,xmm0
28	movdqu	xmm5,XMMWORD PTR[r9]
29	psrld	xmm1,4
30	pand	xmm0,xmm9
31DB	102,15,56,0,208
32	movdqa	xmm0,XMMWORD PTR[(($L$k_ipt+16))]
33DB	102,15,56,0,193
34	pxor	xmm2,xmm5
35	add	r9,16
36	pxor	xmm0,xmm2
37	lea	r10,QWORD PTR[$L$k_mc_backward]
38	jmp	$L$enc_entry
39
40ALIGN	16
41$L$enc_loop::
42
43	movdqa	xmm4,xmm13
44	movdqa	xmm0,xmm12
45DB	102,15,56,0,226
46DB	102,15,56,0,195
47	pxor	xmm4,xmm5
48	movdqa	xmm5,xmm15
49	pxor	xmm0,xmm4
50	movdqa	xmm1,XMMWORD PTR[((-64))+r10*1+r11]
51DB	102,15,56,0,234
52	movdqa	xmm4,XMMWORD PTR[r10*1+r11]
53	movdqa	xmm2,xmm14
54DB	102,15,56,0,211
55	movdqa	xmm3,xmm0
56	pxor	xmm2,xmm5
57DB	102,15,56,0,193
58	add	r9,16
59	pxor	xmm0,xmm2
60DB	102,15,56,0,220
61	add	r11,16
62	pxor	xmm3,xmm0
63DB	102,15,56,0,193
64	and	r11,030h
65	sub	rax,1
66	pxor	xmm0,xmm3
67
68$L$enc_entry::
69
70	movdqa	xmm1,xmm9
71	movdqa	xmm5,xmm11
72	pandn	xmm1,xmm0
73	psrld	xmm1,4
74	pand	xmm0,xmm9
75DB	102,15,56,0,232
76	movdqa	xmm3,xmm10
77	pxor	xmm0,xmm1
78DB	102,15,56,0,217
79	movdqa	xmm4,xmm10
80	pxor	xmm3,xmm5
81DB	102,15,56,0,224
82	movdqa	xmm2,xmm10
83	pxor	xmm4,xmm5
84DB	102,15,56,0,211
85	movdqa	xmm3,xmm10
86	pxor	xmm2,xmm0
87DB	102,15,56,0,220
88	movdqu	xmm5,XMMWORD PTR[r9]
89	pxor	xmm3,xmm1
90	jnz	$L$enc_loop
91
92
93	movdqa	xmm4,XMMWORD PTR[((-96))+r10]
94	movdqa	xmm0,XMMWORD PTR[((-80))+r10]
95DB	102,15,56,0,226
96	pxor	xmm4,xmm5
97DB	102,15,56,0,195
98	movdqa	xmm1,XMMWORD PTR[64+r10*1+r11]
99	pxor	xmm0,xmm4
100DB	102,15,56,0,193
101	DB	0F3h,0C3h		;repret
102_vpaes_encrypt_core	ENDP
103
104
105
106
107
108
109
110ALIGN	16
111_vpaes_decrypt_core	PROC PRIVATE
112	mov	r9,rdx
113	mov	eax,DWORD PTR[240+rdx]
114	movdqa	xmm1,xmm9
115	movdqa	xmm2,XMMWORD PTR[$L$k_dipt]
116	pandn	xmm1,xmm0
117	mov	r11,rax
118	psrld	xmm1,4
119	movdqu	xmm5,XMMWORD PTR[r9]
120	shl	r11,4
121	pand	xmm0,xmm9
122DB	102,15,56,0,208
123	movdqa	xmm0,XMMWORD PTR[(($L$k_dipt+16))]
124	xor	r11,030h
125	lea	r10,QWORD PTR[$L$k_dsbd]
126DB	102,15,56,0,193
127	and	r11,030h
128	pxor	xmm2,xmm5
129	movdqa	xmm5,XMMWORD PTR[(($L$k_mc_forward+48))]
130	pxor	xmm0,xmm2
131	add	r9,16
132	add	r11,r10
133	jmp	$L$dec_entry
134
135ALIGN	16
136$L$dec_loop::
137
138
139
140	movdqa	xmm4,XMMWORD PTR[((-32))+r10]
141	movdqa	xmm1,XMMWORD PTR[((-16))+r10]
142DB	102,15,56,0,226
143DB	102,15,56,0,203
144	pxor	xmm0,xmm4
145	movdqa	xmm4,XMMWORD PTR[r10]
146	pxor	xmm0,xmm1
147	movdqa	xmm1,XMMWORD PTR[16+r10]
148
149DB	102,15,56,0,226
150DB	102,15,56,0,197
151DB	102,15,56,0,203
152	pxor	xmm0,xmm4
153	movdqa	xmm4,XMMWORD PTR[32+r10]
154	pxor	xmm0,xmm1
155	movdqa	xmm1,XMMWORD PTR[48+r10]
156
157DB	102,15,56,0,226
158DB	102,15,56,0,197
159DB	102,15,56,0,203
160	pxor	xmm0,xmm4
161	movdqa	xmm4,XMMWORD PTR[64+r10]
162	pxor	xmm0,xmm1
163	movdqa	xmm1,XMMWORD PTR[80+r10]
164
165DB	102,15,56,0,226
166DB	102,15,56,0,197
167DB	102,15,56,0,203
168	pxor	xmm0,xmm4
169	add	r9,16
170DB	102,15,58,15,237,12
171	pxor	xmm0,xmm1
172	sub	rax,1
173
174$L$dec_entry::
175
176	movdqa	xmm1,xmm9
177	pandn	xmm1,xmm0
178	movdqa	xmm2,xmm11
179	psrld	xmm1,4
180	pand	xmm0,xmm9
181DB	102,15,56,0,208
182	movdqa	xmm3,xmm10
183	pxor	xmm0,xmm1
184DB	102,15,56,0,217
185	movdqa	xmm4,xmm10
186	pxor	xmm3,xmm2
187DB	102,15,56,0,224
188	pxor	xmm4,xmm2
189	movdqa	xmm2,xmm10
190DB	102,15,56,0,211
191	movdqa	xmm3,xmm10
192	pxor	xmm2,xmm0
193DB	102,15,56,0,220
194	movdqu	xmm0,XMMWORD PTR[r9]
195	pxor	xmm3,xmm1
196	jnz	$L$dec_loop
197
198
199	movdqa	xmm4,XMMWORD PTR[96+r10]
200DB	102,15,56,0,226
201	pxor	xmm4,xmm0
202	movdqa	xmm0,XMMWORD PTR[112+r10]
203	movdqa	xmm2,XMMWORD PTR[((-352))+r11]
204DB	102,15,56,0,195
205	pxor	xmm0,xmm4
206DB	102,15,56,0,194
207	DB	0F3h,0C3h		;repret
208_vpaes_decrypt_core	ENDP
209
210
211
212
213
214
215
216ALIGN	16
217_vpaes_schedule_core	PROC PRIVATE
218
219
220
221
222
223	call	_vpaes_preheat
224	movdqa	xmm8,XMMWORD PTR[$L$k_rcon]
225	movdqu	xmm0,XMMWORD PTR[rdi]
226
227
228	movdqa	xmm3,xmm0
229	lea	r11,QWORD PTR[$L$k_ipt]
230	call	_vpaes_schedule_transform
231	movdqa	xmm7,xmm0
232
233	lea	r10,QWORD PTR[$L$k_sr]
234	test	rcx,rcx
235	jnz	$L$schedule_am_decrypting
236
237
238	movdqu	XMMWORD PTR[rdx],xmm0
239	jmp	$L$schedule_go
240
241$L$schedule_am_decrypting::
242
243	movdqa	xmm1,XMMWORD PTR[r10*1+r8]
244DB	102,15,56,0,217
245	movdqu	XMMWORD PTR[rdx],xmm3
246	xor	r8,030h
247
248$L$schedule_go::
249	cmp	esi,192
250	ja	$L$schedule_256
251	je	$L$schedule_192
252
253
254
255
256
257
258
259
260
261
262$L$schedule_128::
263	mov	esi,10
264
265$L$oop_schedule_128::
266	call	_vpaes_schedule_round
267	dec	rsi
268	jz	$L$schedule_mangle_last
269	call	_vpaes_schedule_mangle
270	jmp	$L$oop_schedule_128
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287ALIGN	16
288$L$schedule_192::
289	movdqu	xmm0,XMMWORD PTR[8+rdi]
290	call	_vpaes_schedule_transform
291	movdqa	xmm6,xmm0
292	pxor	xmm4,xmm4
293	movhlps	xmm6,xmm4
294	mov	esi,4
295
296$L$oop_schedule_192::
297	call	_vpaes_schedule_round
298DB	102,15,58,15,198,8
299	call	_vpaes_schedule_mangle
300	call	_vpaes_schedule_192_smear
301	call	_vpaes_schedule_mangle
302	call	_vpaes_schedule_round
303	dec	rsi
304	jz	$L$schedule_mangle_last
305	call	_vpaes_schedule_mangle
306	call	_vpaes_schedule_192_smear
307	jmp	$L$oop_schedule_192
308
309
310
311
312
313
314
315
316
317
318
319ALIGN	16
320$L$schedule_256::
321	movdqu	xmm0,XMMWORD PTR[16+rdi]
322	call	_vpaes_schedule_transform
323	mov	esi,7
324
325$L$oop_schedule_256::
326	call	_vpaes_schedule_mangle
327	movdqa	xmm6,xmm0
328
329
330	call	_vpaes_schedule_round
331	dec	rsi
332	jz	$L$schedule_mangle_last
333	call	_vpaes_schedule_mangle
334
335
336	pshufd	xmm0,xmm0,0FFh
337	movdqa	xmm5,xmm7
338	movdqa	xmm7,xmm6
339	call	_vpaes_schedule_low_round
340	movdqa	xmm7,xmm5
341
342	jmp	$L$oop_schedule_256
343
344
345
346
347
348
349
350
351
352
353
354
355ALIGN	16
356$L$schedule_mangle_last::
357
358	lea	r11,QWORD PTR[$L$k_deskew]
359	test	rcx,rcx
360	jnz	$L$schedule_mangle_last_dec
361
362
363	movdqa	xmm1,XMMWORD PTR[r10*1+r8]
364DB	102,15,56,0,193
365	lea	r11,QWORD PTR[$L$k_opt]
366	add	rdx,32
367
368$L$schedule_mangle_last_dec::
369	add	rdx,-16
370	pxor	xmm0,XMMWORD PTR[$L$k_s63]
371	call	_vpaes_schedule_transform
372	movdqu	XMMWORD PTR[rdx],xmm0
373
374
375	pxor	xmm0,xmm0
376	pxor	xmm1,xmm1
377	pxor	xmm2,xmm2
378	pxor	xmm3,xmm3
379	pxor	xmm4,xmm4
380	pxor	xmm5,xmm5
381	pxor	xmm6,xmm6
382	pxor	xmm7,xmm7
383	DB	0F3h,0C3h		;repret
384_vpaes_schedule_core	ENDP
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401ALIGN	16
402_vpaes_schedule_192_smear	PROC PRIVATE
403	pshufd	xmm1,xmm6,080h
404	pshufd	xmm0,xmm7,0FEh
405	pxor	xmm6,xmm1
406	pxor	xmm1,xmm1
407	pxor	xmm6,xmm0
408	movdqa	xmm0,xmm6
409	movhlps	xmm6,xmm1
410	DB	0F3h,0C3h		;repret
411_vpaes_schedule_192_smear	ENDP
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432ALIGN	16
433_vpaes_schedule_round	PROC PRIVATE
434
435	pxor	xmm1,xmm1
436DB	102,65,15,58,15,200,15
437DB	102,69,15,58,15,192,15
438	pxor	xmm7,xmm1
439
440
441	pshufd	xmm0,xmm0,0FFh
442DB	102,15,58,15,192,1
443
444
445
446
447_vpaes_schedule_low_round::
448
449	movdqa	xmm1,xmm7
450	pslldq	xmm7,4
451	pxor	xmm7,xmm1
452	movdqa	xmm1,xmm7
453	pslldq	xmm7,8
454	pxor	xmm7,xmm1
455	pxor	xmm7,XMMWORD PTR[$L$k_s63]
456
457
458	movdqa	xmm1,xmm9
459	pandn	xmm1,xmm0
460	psrld	xmm1,4
461	pand	xmm0,xmm9
462	movdqa	xmm2,xmm11
463DB	102,15,56,0,208
464	pxor	xmm0,xmm1
465	movdqa	xmm3,xmm10
466DB	102,15,56,0,217
467	pxor	xmm3,xmm2
468	movdqa	xmm4,xmm10
469DB	102,15,56,0,224
470	pxor	xmm4,xmm2
471	movdqa	xmm2,xmm10
472DB	102,15,56,0,211
473	pxor	xmm2,xmm0
474	movdqa	xmm3,xmm10
475DB	102,15,56,0,220
476	pxor	xmm3,xmm1
477	movdqa	xmm4,xmm13
478DB	102,15,56,0,226
479	movdqa	xmm0,xmm12
480DB	102,15,56,0,195
481	pxor	xmm0,xmm4
482
483
484	pxor	xmm0,xmm7
485	movdqa	xmm7,xmm0
486	DB	0F3h,0C3h		;repret
487_vpaes_schedule_round	ENDP
488
489
490
491
492
493
494
495
496
497
498
499ALIGN	16
500_vpaes_schedule_transform	PROC PRIVATE
501	movdqa	xmm1,xmm9
502	pandn	xmm1,xmm0
503	psrld	xmm1,4
504	pand	xmm0,xmm9
505	movdqa	xmm2,XMMWORD PTR[r11]
506DB	102,15,56,0,208
507	movdqa	xmm0,XMMWORD PTR[16+r11]
508DB	102,15,56,0,193
509	pxor	xmm0,xmm2
510	DB	0F3h,0C3h		;repret
511_vpaes_schedule_transform	ENDP
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537ALIGN	16
538_vpaes_schedule_mangle	PROC PRIVATE
539	movdqa	xmm4,xmm0
540	movdqa	xmm5,XMMWORD PTR[$L$k_mc_forward]
541	test	rcx,rcx
542	jnz	$L$schedule_mangle_dec
543
544
545	add	rdx,16
546	pxor	xmm4,XMMWORD PTR[$L$k_s63]
547DB	102,15,56,0,229
548	movdqa	xmm3,xmm4
549DB	102,15,56,0,229
550	pxor	xmm3,xmm4
551DB	102,15,56,0,229
552	pxor	xmm3,xmm4
553
554	jmp	$L$schedule_mangle_both
555ALIGN	16
556$L$schedule_mangle_dec::
557
558	lea	r11,QWORD PTR[$L$k_dksd]
559	movdqa	xmm1,xmm9
560	pandn	xmm1,xmm4
561	psrld	xmm1,4
562	pand	xmm4,xmm9
563
564	movdqa	xmm2,XMMWORD PTR[r11]
565DB	102,15,56,0,212
566	movdqa	xmm3,XMMWORD PTR[16+r11]
567DB	102,15,56,0,217
568	pxor	xmm3,xmm2
569DB	102,15,56,0,221
570
571	movdqa	xmm2,XMMWORD PTR[32+r11]
572DB	102,15,56,0,212
573	pxor	xmm2,xmm3
574	movdqa	xmm3,XMMWORD PTR[48+r11]
575DB	102,15,56,0,217
576	pxor	xmm3,xmm2
577DB	102,15,56,0,221
578
579	movdqa	xmm2,XMMWORD PTR[64+r11]
580DB	102,15,56,0,212
581	pxor	xmm2,xmm3
582	movdqa	xmm3,XMMWORD PTR[80+r11]
583DB	102,15,56,0,217
584	pxor	xmm3,xmm2
585DB	102,15,56,0,221
586
587	movdqa	xmm2,XMMWORD PTR[96+r11]
588DB	102,15,56,0,212
589	pxor	xmm2,xmm3
590	movdqa	xmm3,XMMWORD PTR[112+r11]
591DB	102,15,56,0,217
592	pxor	xmm3,xmm2
593
594	add	rdx,-16
595
596$L$schedule_mangle_both::
597	movdqa	xmm1,XMMWORD PTR[r10*1+r8]
598DB	102,15,56,0,217
599	add	r8,-16
600	and	r8,030h
601	movdqu	XMMWORD PTR[rdx],xmm3
602	DB	0F3h,0C3h		;repret
603_vpaes_schedule_mangle	ENDP
604
605
606
607
608PUBLIC	vpaes_set_encrypt_key
609
610ALIGN	16
611vpaes_set_encrypt_key	PROC PUBLIC
612	mov	QWORD PTR[8+rsp],rdi	;WIN64 prologue
613	mov	QWORD PTR[16+rsp],rsi
614	mov	rax,rsp
615$L$SEH_begin_vpaes_set_encrypt_key::
616	mov	rdi,rcx
617	mov	rsi,rdx
618	mov	rdx,r8
619
620
621	lea	rsp,QWORD PTR[((-184))+rsp]
622	movaps	XMMWORD PTR[16+rsp],xmm6
623	movaps	XMMWORD PTR[32+rsp],xmm7
624	movaps	XMMWORD PTR[48+rsp],xmm8
625	movaps	XMMWORD PTR[64+rsp],xmm9
626	movaps	XMMWORD PTR[80+rsp],xmm10
627	movaps	XMMWORD PTR[96+rsp],xmm11
628	movaps	XMMWORD PTR[112+rsp],xmm12
629	movaps	XMMWORD PTR[128+rsp],xmm13
630	movaps	XMMWORD PTR[144+rsp],xmm14
631	movaps	XMMWORD PTR[160+rsp],xmm15
632$L$enc_key_body::
633	mov	eax,esi
634	shr	eax,5
635	add	eax,5
636	mov	DWORD PTR[240+rdx],eax
637
638	mov	ecx,0
639	mov	r8d,030h
640	call	_vpaes_schedule_core
641	movaps	xmm6,XMMWORD PTR[16+rsp]
642	movaps	xmm7,XMMWORD PTR[32+rsp]
643	movaps	xmm8,XMMWORD PTR[48+rsp]
644	movaps	xmm9,XMMWORD PTR[64+rsp]
645	movaps	xmm10,XMMWORD PTR[80+rsp]
646	movaps	xmm11,XMMWORD PTR[96+rsp]
647	movaps	xmm12,XMMWORD PTR[112+rsp]
648	movaps	xmm13,XMMWORD PTR[128+rsp]
649	movaps	xmm14,XMMWORD PTR[144+rsp]
650	movaps	xmm15,XMMWORD PTR[160+rsp]
651	lea	rsp,QWORD PTR[184+rsp]
652$L$enc_key_epilogue::
653	xor	eax,eax
654	mov	rdi,QWORD PTR[8+rsp]	;WIN64 epilogue
655	mov	rsi,QWORD PTR[16+rsp]
656	DB	0F3h,0C3h		;repret
657$L$SEH_end_vpaes_set_encrypt_key::
658vpaes_set_encrypt_key	ENDP
659
660PUBLIC	vpaes_set_decrypt_key
661
662ALIGN	16
663vpaes_set_decrypt_key	PROC PUBLIC
664	mov	QWORD PTR[8+rsp],rdi	;WIN64 prologue
665	mov	QWORD PTR[16+rsp],rsi
666	mov	rax,rsp
667$L$SEH_begin_vpaes_set_decrypt_key::
668	mov	rdi,rcx
669	mov	rsi,rdx
670	mov	rdx,r8
671
672
673	lea	rsp,QWORD PTR[((-184))+rsp]
674	movaps	XMMWORD PTR[16+rsp],xmm6
675	movaps	XMMWORD PTR[32+rsp],xmm7
676	movaps	XMMWORD PTR[48+rsp],xmm8
677	movaps	XMMWORD PTR[64+rsp],xmm9
678	movaps	XMMWORD PTR[80+rsp],xmm10
679	movaps	XMMWORD PTR[96+rsp],xmm11
680	movaps	XMMWORD PTR[112+rsp],xmm12
681	movaps	XMMWORD PTR[128+rsp],xmm13
682	movaps	XMMWORD PTR[144+rsp],xmm14
683	movaps	XMMWORD PTR[160+rsp],xmm15
684$L$dec_key_body::
685	mov	eax,esi
686	shr	eax,5
687	add	eax,5
688	mov	DWORD PTR[240+rdx],eax
689	shl	eax,4
690	lea	rdx,QWORD PTR[16+rax*1+rdx]
691
692	mov	ecx,1
693	mov	r8d,esi
694	shr	r8d,1
695	and	r8d,32
696	xor	r8d,32
697	call	_vpaes_schedule_core
698	movaps	xmm6,XMMWORD PTR[16+rsp]
699	movaps	xmm7,XMMWORD PTR[32+rsp]
700	movaps	xmm8,XMMWORD PTR[48+rsp]
701	movaps	xmm9,XMMWORD PTR[64+rsp]
702	movaps	xmm10,XMMWORD PTR[80+rsp]
703	movaps	xmm11,XMMWORD PTR[96+rsp]
704	movaps	xmm12,XMMWORD PTR[112+rsp]
705	movaps	xmm13,XMMWORD PTR[128+rsp]
706	movaps	xmm14,XMMWORD PTR[144+rsp]
707	movaps	xmm15,XMMWORD PTR[160+rsp]
708	lea	rsp,QWORD PTR[184+rsp]
709$L$dec_key_epilogue::
710	xor	eax,eax
711	mov	rdi,QWORD PTR[8+rsp]	;WIN64 epilogue
712	mov	rsi,QWORD PTR[16+rsp]
713	DB	0F3h,0C3h		;repret
714$L$SEH_end_vpaes_set_decrypt_key::
715vpaes_set_decrypt_key	ENDP
716
717PUBLIC	vpaes_encrypt
718
719ALIGN	16
720vpaes_encrypt	PROC PUBLIC
721	mov	QWORD PTR[8+rsp],rdi	;WIN64 prologue
722	mov	QWORD PTR[16+rsp],rsi
723	mov	rax,rsp
724$L$SEH_begin_vpaes_encrypt::
725	mov	rdi,rcx
726	mov	rsi,rdx
727	mov	rdx,r8
728
729
730	lea	rsp,QWORD PTR[((-184))+rsp]
731	movaps	XMMWORD PTR[16+rsp],xmm6
732	movaps	XMMWORD PTR[32+rsp],xmm7
733	movaps	XMMWORD PTR[48+rsp],xmm8
734	movaps	XMMWORD PTR[64+rsp],xmm9
735	movaps	XMMWORD PTR[80+rsp],xmm10
736	movaps	XMMWORD PTR[96+rsp],xmm11
737	movaps	XMMWORD PTR[112+rsp],xmm12
738	movaps	XMMWORD PTR[128+rsp],xmm13
739	movaps	XMMWORD PTR[144+rsp],xmm14
740	movaps	XMMWORD PTR[160+rsp],xmm15
741$L$enc_body::
742	movdqu	xmm0,XMMWORD PTR[rdi]
743	call	_vpaes_preheat
744	call	_vpaes_encrypt_core
745	movdqu	XMMWORD PTR[rsi],xmm0
746	movaps	xmm6,XMMWORD PTR[16+rsp]
747	movaps	xmm7,XMMWORD PTR[32+rsp]
748	movaps	xmm8,XMMWORD PTR[48+rsp]
749	movaps	xmm9,XMMWORD PTR[64+rsp]
750	movaps	xmm10,XMMWORD PTR[80+rsp]
751	movaps	xmm11,XMMWORD PTR[96+rsp]
752	movaps	xmm12,XMMWORD PTR[112+rsp]
753	movaps	xmm13,XMMWORD PTR[128+rsp]
754	movaps	xmm14,XMMWORD PTR[144+rsp]
755	movaps	xmm15,XMMWORD PTR[160+rsp]
756	lea	rsp,QWORD PTR[184+rsp]
757$L$enc_epilogue::
758	mov	rdi,QWORD PTR[8+rsp]	;WIN64 epilogue
759	mov	rsi,QWORD PTR[16+rsp]
760	DB	0F3h,0C3h		;repret
761$L$SEH_end_vpaes_encrypt::
762vpaes_encrypt	ENDP
763
764PUBLIC	vpaes_decrypt
765
766ALIGN	16
767vpaes_decrypt	PROC PUBLIC
768	mov	QWORD PTR[8+rsp],rdi	;WIN64 prologue
769	mov	QWORD PTR[16+rsp],rsi
770	mov	rax,rsp
771$L$SEH_begin_vpaes_decrypt::
772	mov	rdi,rcx
773	mov	rsi,rdx
774	mov	rdx,r8
775
776
777	lea	rsp,QWORD PTR[((-184))+rsp]
778	movaps	XMMWORD PTR[16+rsp],xmm6
779	movaps	XMMWORD PTR[32+rsp],xmm7
780	movaps	XMMWORD PTR[48+rsp],xmm8
781	movaps	XMMWORD PTR[64+rsp],xmm9
782	movaps	XMMWORD PTR[80+rsp],xmm10
783	movaps	XMMWORD PTR[96+rsp],xmm11
784	movaps	XMMWORD PTR[112+rsp],xmm12
785	movaps	XMMWORD PTR[128+rsp],xmm13
786	movaps	XMMWORD PTR[144+rsp],xmm14
787	movaps	XMMWORD PTR[160+rsp],xmm15
788$L$dec_body::
789	movdqu	xmm0,XMMWORD PTR[rdi]
790	call	_vpaes_preheat
791	call	_vpaes_decrypt_core
792	movdqu	XMMWORD PTR[rsi],xmm0
793	movaps	xmm6,XMMWORD PTR[16+rsp]
794	movaps	xmm7,XMMWORD PTR[32+rsp]
795	movaps	xmm8,XMMWORD PTR[48+rsp]
796	movaps	xmm9,XMMWORD PTR[64+rsp]
797	movaps	xmm10,XMMWORD PTR[80+rsp]
798	movaps	xmm11,XMMWORD PTR[96+rsp]
799	movaps	xmm12,XMMWORD PTR[112+rsp]
800	movaps	xmm13,XMMWORD PTR[128+rsp]
801	movaps	xmm14,XMMWORD PTR[144+rsp]
802	movaps	xmm15,XMMWORD PTR[160+rsp]
803	lea	rsp,QWORD PTR[184+rsp]
804$L$dec_epilogue::
805	mov	rdi,QWORD PTR[8+rsp]	;WIN64 epilogue
806	mov	rsi,QWORD PTR[16+rsp]
807	DB	0F3h,0C3h		;repret
808$L$SEH_end_vpaes_decrypt::
809vpaes_decrypt	ENDP
810PUBLIC	vpaes_cbc_encrypt
811
812ALIGN	16
813vpaes_cbc_encrypt	PROC PUBLIC
814	mov	QWORD PTR[8+rsp],rdi	;WIN64 prologue
815	mov	QWORD PTR[16+rsp],rsi
816	mov	rax,rsp
817$L$SEH_begin_vpaes_cbc_encrypt::
818	mov	rdi,rcx
819	mov	rsi,rdx
820	mov	rdx,r8
821	mov	rcx,r9
822	mov	r8,QWORD PTR[40+rsp]
823	mov	r9,QWORD PTR[48+rsp]
824
825
826	xchg	rdx,rcx
827	sub	rcx,16
828	jc	$L$cbc_abort
829	lea	rsp,QWORD PTR[((-184))+rsp]
830	movaps	XMMWORD PTR[16+rsp],xmm6
831	movaps	XMMWORD PTR[32+rsp],xmm7
832	movaps	XMMWORD PTR[48+rsp],xmm8
833	movaps	XMMWORD PTR[64+rsp],xmm9
834	movaps	XMMWORD PTR[80+rsp],xmm10
835	movaps	XMMWORD PTR[96+rsp],xmm11
836	movaps	XMMWORD PTR[112+rsp],xmm12
837	movaps	XMMWORD PTR[128+rsp],xmm13
838	movaps	XMMWORD PTR[144+rsp],xmm14
839	movaps	XMMWORD PTR[160+rsp],xmm15
840$L$cbc_body::
841	movdqu	xmm6,XMMWORD PTR[r8]
842	sub	rsi,rdi
843	call	_vpaes_preheat
844	cmp	r9d,0
845	je	$L$cbc_dec_loop
846	jmp	$L$cbc_enc_loop
847ALIGN	16
848$L$cbc_enc_loop::
849	movdqu	xmm0,XMMWORD PTR[rdi]
850	pxor	xmm0,xmm6
851	call	_vpaes_encrypt_core
852	movdqa	xmm6,xmm0
853	movdqu	XMMWORD PTR[rdi*1+rsi],xmm0
854	lea	rdi,QWORD PTR[16+rdi]
855	sub	rcx,16
856	jnc	$L$cbc_enc_loop
857	jmp	$L$cbc_done
858ALIGN	16
859$L$cbc_dec_loop::
860	movdqu	xmm0,XMMWORD PTR[rdi]
861	movdqa	xmm7,xmm0
862	call	_vpaes_decrypt_core
863	pxor	xmm0,xmm6
864	movdqa	xmm6,xmm7
865	movdqu	XMMWORD PTR[rdi*1+rsi],xmm0
866	lea	rdi,QWORD PTR[16+rdi]
867	sub	rcx,16
868	jnc	$L$cbc_dec_loop
869$L$cbc_done::
870	movdqu	XMMWORD PTR[r8],xmm6
871	movaps	xmm6,XMMWORD PTR[16+rsp]
872	movaps	xmm7,XMMWORD PTR[32+rsp]
873	movaps	xmm8,XMMWORD PTR[48+rsp]
874	movaps	xmm9,XMMWORD PTR[64+rsp]
875	movaps	xmm10,XMMWORD PTR[80+rsp]
876	movaps	xmm11,XMMWORD PTR[96+rsp]
877	movaps	xmm12,XMMWORD PTR[112+rsp]
878	movaps	xmm13,XMMWORD PTR[128+rsp]
879	movaps	xmm14,XMMWORD PTR[144+rsp]
880	movaps	xmm15,XMMWORD PTR[160+rsp]
881	lea	rsp,QWORD PTR[184+rsp]
882$L$cbc_epilogue::
883$L$cbc_abort::
884	mov	rdi,QWORD PTR[8+rsp]	;WIN64 epilogue
885	mov	rsi,QWORD PTR[16+rsp]
886	DB	0F3h,0C3h		;repret
887$L$SEH_end_vpaes_cbc_encrypt::
888vpaes_cbc_encrypt	ENDP
889
890
891
892
893
894
895
896ALIGN	16
897_vpaes_preheat	PROC PRIVATE
898	lea	r10,QWORD PTR[$L$k_s0F]
899	movdqa	xmm10,XMMWORD PTR[((-32))+r10]
900	movdqa	xmm11,XMMWORD PTR[((-16))+r10]
901	movdqa	xmm9,XMMWORD PTR[r10]
902	movdqa	xmm13,XMMWORD PTR[48+r10]
903	movdqa	xmm12,XMMWORD PTR[64+r10]
904	movdqa	xmm15,XMMWORD PTR[80+r10]
905	movdqa	xmm14,XMMWORD PTR[96+r10]
906	DB	0F3h,0C3h		;repret
907_vpaes_preheat	ENDP
908
909
910
911
912
913
914ALIGN	64
915_vpaes_consts::
916$L$k_inv::
917	DQ	00E05060F0D080180h,0040703090A0B0C02h
918	DQ	001040A060F0B0780h,0030D0E0C02050809h
919
920$L$k_s0F::
921	DQ	00F0F0F0F0F0F0F0Fh,00F0F0F0F0F0F0F0Fh
922
923$L$k_ipt::
924	DQ	0C2B2E8985A2A7000h,0CABAE09052227808h
925	DQ	04C01307D317C4D00h,0CD80B1FCB0FDCC81h
926
927$L$k_sb1::
928	DQ	0B19BE18FCB503E00h,0A5DF7A6E142AF544h
929	DQ	03618D415FAE22300h,03BF7CCC10D2ED9EFh
930$L$k_sb2::
931	DQ	0E27A93C60B712400h,05EB7E955BC982FCDh
932	DQ	069EB88400AE12900h,0C2A163C8AB82234Ah
933$L$k_sbo::
934	DQ	0D0D26D176FBDC700h,015AABF7AC502A878h
935	DQ	0CFE474A55FBB6A00h,08E1E90D1412B35FAh
936
937$L$k_mc_forward::
938	DQ	00407060500030201h,00C0F0E0D080B0A09h
939	DQ	0080B0A0904070605h,0000302010C0F0E0Dh
940	DQ	00C0F0E0D080B0A09h,00407060500030201h
941	DQ	0000302010C0F0E0Dh,0080B0A0904070605h
942
943$L$k_mc_backward::
944	DQ	00605040702010003h,00E0D0C0F0A09080Bh
945	DQ	0020100030E0D0C0Fh,00A09080B06050407h
946	DQ	00E0D0C0F0A09080Bh,00605040702010003h
947	DQ	00A09080B06050407h,0020100030E0D0C0Fh
948
949$L$k_sr::
950	DQ	00706050403020100h,00F0E0D0C0B0A0908h
951	DQ	0030E09040F0A0500h,00B06010C07020D08h
952	DQ	00F060D040B020900h,0070E050C030A0108h
953	DQ	00B0E0104070A0D00h,00306090C0F020508h
954
955$L$k_rcon::
956	DQ	01F8391B9AF9DEEB6h,0702A98084D7C7D81h
957
958$L$k_s63::
959	DQ	05B5B5B5B5B5B5B5Bh,05B5B5B5B5B5B5B5Bh
960
961$L$k_opt::
962	DQ	0FF9F4929D6B66000h,0F7974121DEBE6808h
963	DQ	001EDBD5150BCEC00h,0E10D5DB1B05C0CE0h
964
965$L$k_deskew::
966	DQ	007E4A34047A4E300h,01DFEB95A5DBEF91Ah
967	DQ	05F36B5DC83EA6900h,02841C2ABF49D1E77h
968
969
970
971
972
973$L$k_dksd::
974	DQ	0FEB91A5DA3E44700h,00740E3A45A1DBEF9h
975	DQ	041C277F4B5368300h,05FDC69EAAB289D1Eh
976$L$k_dksb::
977	DQ	09A4FCA1F8550D500h,003D653861CC94C99h
978	DQ	0115BEDA7B6FC4A00h,0D993256F7E3482C8h
979$L$k_dkse::
980	DQ	0D5031CCA1FC9D600h,053859A4C994F5086h
981	DQ	0A23196054FDC7BE8h,0CD5EF96A20B31487h
982$L$k_dks9::
983	DQ	0B6116FC87ED9A700h,04AED933482255BFCh
984	DQ	04576516227143300h,08BB89FACE9DAFDCEh
985
986
987
988
989
990$L$k_dipt::
991	DQ	00F505B040B545F00h,0154A411E114E451Ah
992	DQ	086E383E660056500h,012771772F491F194h
993
994$L$k_dsb9::
995	DQ	0851C03539A86D600h,0CAD51F504F994CC9h
996	DQ	0C03B1789ECD74900h,0725E2C9EB2FBA565h
997$L$k_dsbd::
998	DQ	07D57CCDFE6B1A200h,0F56E9B13882A4439h
999	DQ	03CE2FAF724C6CB00h,02931180D15DEEFD3h
1000$L$k_dsbb::
1001	DQ	0D022649296B44200h,0602646F6B0F2D404h
1002	DQ	0C19498A6CD596700h,0F3FF0C3E3255AA6Bh
1003$L$k_dsbe::
1004	DQ	046F2929626D4D000h,02242600464B4F6B0h
1005	DQ	00C55A6CDFFAAC100h,09467F36B98593E32h
1006$L$k_dsbo::
1007	DQ	01387EA537EF94000h,0C7AA6DB9D4943E2Dh
1008	DQ	012D7560F93441D00h,0CA4B8159D8C58E9Ch
1009DB	86,101,99,116,111,114,32,80,101,114,109,117,116,97,116,105
1010DB	111,110,32,65,69,83,32,102,111,114,32,120,56,54,95,54
1011DB	52,47,83,83,83,69,51,44,32,77,105,107,101,32,72,97
1012DB	109,98,117,114,103,32,40,83,116,97,110,102,111,114,100,32
1013DB	85,110,105,118,101,114,115,105,116,121,41,0
1014ALIGN	64
1015
1016EXTERN	__imp_RtlVirtualUnwind:NEAR
1017
1018ALIGN	16
1019se_handler	PROC PRIVATE
1020	push	rsi
1021	push	rdi
1022	push	rbx
1023	push	rbp
1024	push	r12
1025	push	r13
1026	push	r14
1027	push	r15
1028	pushfq
1029	sub	rsp,64
1030
1031	mov	rax,QWORD PTR[120+r8]
1032	mov	rbx,QWORD PTR[248+r8]
1033
1034	mov	rsi,QWORD PTR[8+r9]
1035	mov	r11,QWORD PTR[56+r9]
1036
1037	mov	r10d,DWORD PTR[r11]
1038	lea	r10,QWORD PTR[r10*1+rsi]
1039	cmp	rbx,r10
1040	jb	$L$in_prologue
1041
1042	mov	rax,QWORD PTR[152+r8]
1043
1044	mov	r10d,DWORD PTR[4+r11]
1045	lea	r10,QWORD PTR[r10*1+rsi]
1046	cmp	rbx,r10
1047	jae	$L$in_prologue
1048
1049	lea	rsi,QWORD PTR[16+rax]
1050	lea	rdi,QWORD PTR[512+r8]
1051	mov	ecx,20
1052	DD	0a548f3fch
1053	lea	rax,QWORD PTR[184+rax]
1054
1055$L$in_prologue::
1056	mov	rdi,QWORD PTR[8+rax]
1057	mov	rsi,QWORD PTR[16+rax]
1058	mov	QWORD PTR[152+r8],rax
1059	mov	QWORD PTR[168+r8],rsi
1060	mov	QWORD PTR[176+r8],rdi
1061
1062	mov	rdi,QWORD PTR[40+r9]
1063	mov	rsi,r8
1064	mov	ecx,154
1065	DD	0a548f3fch
1066
1067	mov	rsi,r9
1068	xor	rcx,rcx
1069	mov	rdx,QWORD PTR[8+rsi]
1070	mov	r8,QWORD PTR[rsi]
1071	mov	r9,QWORD PTR[16+rsi]
1072	mov	r10,QWORD PTR[40+rsi]
1073	lea	r11,QWORD PTR[56+rsi]
1074	lea	r12,QWORD PTR[24+rsi]
1075	mov	QWORD PTR[32+rsp],r10
1076	mov	QWORD PTR[40+rsp],r11
1077	mov	QWORD PTR[48+rsp],r12
1078	mov	QWORD PTR[56+rsp],rcx
1079	call	QWORD PTR[__imp_RtlVirtualUnwind]
1080
1081	mov	eax,1
1082	add	rsp,64
1083	popfq
1084	pop	r15
1085	pop	r14
1086	pop	r13
1087	pop	r12
1088	pop	rbp
1089	pop	rbx
1090	pop	rdi
1091	pop	rsi
1092	DB	0F3h,0C3h		;repret
1093se_handler	ENDP
1094
1095.text$	ENDS
1096.pdata	SEGMENT READONLY ALIGN(4)
1097ALIGN	4
1098	DD	imagerel $L$SEH_begin_vpaes_set_encrypt_key
1099	DD	imagerel $L$SEH_end_vpaes_set_encrypt_key
1100	DD	imagerel $L$SEH_info_vpaes_set_encrypt_key
1101
1102	DD	imagerel $L$SEH_begin_vpaes_set_decrypt_key
1103	DD	imagerel $L$SEH_end_vpaes_set_decrypt_key
1104	DD	imagerel $L$SEH_info_vpaes_set_decrypt_key
1105
1106	DD	imagerel $L$SEH_begin_vpaes_encrypt
1107	DD	imagerel $L$SEH_end_vpaes_encrypt
1108	DD	imagerel $L$SEH_info_vpaes_encrypt
1109
1110	DD	imagerel $L$SEH_begin_vpaes_decrypt
1111	DD	imagerel $L$SEH_end_vpaes_decrypt
1112	DD	imagerel $L$SEH_info_vpaes_decrypt
1113
1114	DD	imagerel $L$SEH_begin_vpaes_cbc_encrypt
1115	DD	imagerel $L$SEH_end_vpaes_cbc_encrypt
1116	DD	imagerel $L$SEH_info_vpaes_cbc_encrypt
1117
1118.pdata	ENDS
1119.xdata	SEGMENT READONLY ALIGN(8)
1120ALIGN	8
1121$L$SEH_info_vpaes_set_encrypt_key::
1122DB	9,0,0,0
1123	DD	imagerel se_handler
1124	DD	imagerel $L$enc_key_body,imagerel $L$enc_key_epilogue
1125$L$SEH_info_vpaes_set_decrypt_key::
1126DB	9,0,0,0
1127	DD	imagerel se_handler
1128	DD	imagerel $L$dec_key_body,imagerel $L$dec_key_epilogue
1129$L$SEH_info_vpaes_encrypt::
1130DB	9,0,0,0
1131	DD	imagerel se_handler
1132	DD	imagerel $L$enc_body,imagerel $L$enc_epilogue
1133$L$SEH_info_vpaes_decrypt::
1134DB	9,0,0,0
1135	DD	imagerel se_handler
1136	DD	imagerel $L$dec_body,imagerel $L$dec_epilogue
1137$L$SEH_info_vpaes_cbc_encrypt::
1138DB	9,0,0,0
1139	DD	imagerel se_handler
1140	DD	imagerel $L$cbc_body,imagerel $L$cbc_epilogue
1141
1142.xdata	ENDS
1143END
1144