Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/x86/crypto/aes-x86_64-asm_64.S
10817 views
1
/* AES (Rijndael) implementation (FIPS PUB 197) for x86_64
2
*
3
* Copyright (C) 2005 Andreas Steinmetz, <[email protected]>
4
*
5
* License:
6
* This code can be distributed under the terms of the GNU General Public
7
* License (GPL) Version 2 provided that the above header down to and
8
* including this sentence is retained in full.
9
*/
10
11
.extern crypto_ft_tab
12
.extern crypto_it_tab
13
.extern crypto_fl_tab
14
.extern crypto_il_tab
15
16
.text
17
18
#include <asm/asm-offsets.h>
19
20
#define R1 %rax
21
#define R1E %eax
22
#define R1X %ax
23
#define R1H %ah
24
#define R1L %al
25
#define R2 %rbx
26
#define R2E %ebx
27
#define R2X %bx
28
#define R2H %bh
29
#define R2L %bl
30
#define R3 %rcx
31
#define R3E %ecx
32
#define R3X %cx
33
#define R3H %ch
34
#define R3L %cl
35
#define R4 %rdx
36
#define R4E %edx
37
#define R4X %dx
38
#define R4H %dh
39
#define R4L %dl
40
#define R5 %rsi
41
#define R5E %esi
42
#define R6 %rdi
43
#define R6E %edi
44
#define R7 %rbp
45
#define R7E %ebp
46
#define R8 %r8
47
#define R9 %r9
48
#define R10 %r10
49
#define R11 %r11
50
51
#define prologue(FUNC,KEY,B128,B192,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11) \
52
.global FUNC; \
53
.type FUNC,@function; \
54
.align 8; \
55
FUNC: movq r1,r2; \
56
movq r3,r4; \
57
leaq KEY+48(r8),r9; \
58
movq r10,r11; \
59
movl (r7),r5 ## E; \
60
movl 4(r7),r1 ## E; \
61
movl 8(r7),r6 ## E; \
62
movl 12(r7),r7 ## E; \
63
movl 480(r8),r10 ## E; \
64
xorl -48(r9),r5 ## E; \
65
xorl -44(r9),r1 ## E; \
66
xorl -40(r9),r6 ## E; \
67
xorl -36(r9),r7 ## E; \
68
cmpl $24,r10 ## E; \
69
jb B128; \
70
leaq 32(r9),r9; \
71
je B192; \
72
leaq 32(r9),r9;
73
74
#define epilogue(r1,r2,r3,r4,r5,r6,r7,r8,r9) \
75
movq r1,r2; \
76
movq r3,r4; \
77
movl r5 ## E,(r9); \
78
movl r6 ## E,4(r9); \
79
movl r7 ## E,8(r9); \
80
movl r8 ## E,12(r9); \
81
ret;
82
83
#define round(TAB,OFFSET,r1,r2,r3,r4,r5,r6,r7,r8,ra,rb,rc,rd) \
84
movzbl r2 ## H,r5 ## E; \
85
movzbl r2 ## L,r6 ## E; \
86
movl TAB+1024(,r5,4),r5 ## E;\
87
movw r4 ## X,r2 ## X; \
88
movl TAB(,r6,4),r6 ## E; \
89
roll $16,r2 ## E; \
90
shrl $16,r4 ## E; \
91
movzbl r4 ## H,r7 ## E; \
92
movzbl r4 ## L,r4 ## E; \
93
xorl OFFSET(r8),ra ## E; \
94
xorl OFFSET+4(r8),rb ## E; \
95
xorl TAB+3072(,r7,4),r5 ## E;\
96
xorl TAB+2048(,r4,4),r6 ## E;\
97
movzbl r1 ## L,r7 ## E; \
98
movzbl r1 ## H,r4 ## E; \
99
movl TAB+1024(,r4,4),r4 ## E;\
100
movw r3 ## X,r1 ## X; \
101
roll $16,r1 ## E; \
102
shrl $16,r3 ## E; \
103
xorl TAB(,r7,4),r5 ## E; \
104
movzbl r3 ## H,r7 ## E; \
105
movzbl r3 ## L,r3 ## E; \
106
xorl TAB+3072(,r7,4),r4 ## E;\
107
xorl TAB+2048(,r3,4),r5 ## E;\
108
movzbl r1 ## H,r7 ## E; \
109
movzbl r1 ## L,r3 ## E; \
110
shrl $16,r1 ## E; \
111
xorl TAB+3072(,r7,4),r6 ## E;\
112
movl TAB+2048(,r3,4),r3 ## E;\
113
movzbl r1 ## H,r7 ## E; \
114
movzbl r1 ## L,r1 ## E; \
115
xorl TAB+1024(,r7,4),r6 ## E;\
116
xorl TAB(,r1,4),r3 ## E; \
117
movzbl r2 ## H,r1 ## E; \
118
movzbl r2 ## L,r7 ## E; \
119
shrl $16,r2 ## E; \
120
xorl TAB+3072(,r1,4),r3 ## E;\
121
xorl TAB+2048(,r7,4),r4 ## E;\
122
movzbl r2 ## H,r1 ## E; \
123
movzbl r2 ## L,r2 ## E; \
124
xorl OFFSET+8(r8),rc ## E; \
125
xorl OFFSET+12(r8),rd ## E; \
126
xorl TAB+1024(,r1,4),r3 ## E;\
127
xorl TAB(,r2,4),r4 ## E;
128
129
#define move_regs(r1,r2,r3,r4) \
130
movl r3 ## E,r1 ## E; \
131
movl r4 ## E,r2 ## E;
132
133
#define entry(FUNC,KEY,B128,B192) \
134
prologue(FUNC,KEY,B128,B192,R2,R8,R7,R9,R1,R3,R4,R6,R10,R5,R11)
135
136
#define return epilogue(R8,R2,R9,R7,R5,R6,R3,R4,R11)
137
138
#define encrypt_round(TAB,OFFSET) \
139
round(TAB,OFFSET,R1,R2,R3,R4,R5,R6,R7,R10,R5,R6,R3,R4) \
140
move_regs(R1,R2,R5,R6)
141
142
#define encrypt_final(TAB,OFFSET) \
143
round(TAB,OFFSET,R1,R2,R3,R4,R5,R6,R7,R10,R5,R6,R3,R4)
144
145
#define decrypt_round(TAB,OFFSET) \
146
round(TAB,OFFSET,R2,R1,R4,R3,R6,R5,R7,R10,R5,R6,R3,R4) \
147
move_regs(R1,R2,R5,R6)
148
149
#define decrypt_final(TAB,OFFSET) \
150
round(TAB,OFFSET,R2,R1,R4,R3,R6,R5,R7,R10,R5,R6,R3,R4)
151
152
/* void aes_enc_blk(stuct crypto_tfm *tfm, u8 *out, const u8 *in) */
153
154
entry(aes_enc_blk,0,enc128,enc192)
155
encrypt_round(crypto_ft_tab,-96)
156
encrypt_round(crypto_ft_tab,-80)
157
enc192: encrypt_round(crypto_ft_tab,-64)
158
encrypt_round(crypto_ft_tab,-48)
159
enc128: encrypt_round(crypto_ft_tab,-32)
160
encrypt_round(crypto_ft_tab,-16)
161
encrypt_round(crypto_ft_tab, 0)
162
encrypt_round(crypto_ft_tab, 16)
163
encrypt_round(crypto_ft_tab, 32)
164
encrypt_round(crypto_ft_tab, 48)
165
encrypt_round(crypto_ft_tab, 64)
166
encrypt_round(crypto_ft_tab, 80)
167
encrypt_round(crypto_ft_tab, 96)
168
encrypt_final(crypto_fl_tab,112)
169
return
170
171
/* void aes_dec_blk(struct crypto_tfm *tfm, u8 *out, const u8 *in) */
172
173
entry(aes_dec_blk,240,dec128,dec192)
174
decrypt_round(crypto_it_tab,-96)
175
decrypt_round(crypto_it_tab,-80)
176
dec192: decrypt_round(crypto_it_tab,-64)
177
decrypt_round(crypto_it_tab,-48)
178
dec128: decrypt_round(crypto_it_tab,-32)
179
decrypt_round(crypto_it_tab,-16)
180
decrypt_round(crypto_it_tab, 0)
181
decrypt_round(crypto_it_tab, 16)
182
decrypt_round(crypto_it_tab, 32)
183
decrypt_round(crypto_it_tab, 48)
184
decrypt_round(crypto_it_tab, 64)
185
decrypt_round(crypto_it_tab, 80)
186
decrypt_round(crypto_it_tab, 96)
187
decrypt_final(crypto_il_tab,112)
188
return
189
190