]> git.proxmox.com Git - ceph.git/blob - ceph/src/crypto/isa-l/isa-l_crypto/aes/keyexp_256.asm
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / crypto / isa-l / isa-l_crypto / aes / keyexp_256.asm
1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ; Copyright(c) 2011-2016 Intel Corporation All rights reserved.
3 ;
4 ; Redistribution and use in source and binary forms, with or without
5 ; modification, are permitted provided that the following conditions
6 ; are met:
7 ; * Redistributions of source code must retain the above copyright
8 ; notice, this list of conditions and the following disclaimer.
9 ; * Redistributions in binary form must reproduce the above copyright
10 ; notice, this list of conditions and the following disclaimer in
11 ; the documentation and/or other materials provided with the
12 ; distribution.
13 ; * Neither the name of Intel Corporation nor the names of its
14 ; contributors may be used to endorse or promote products derived
15 ; from this software without specific prior written permission.
16 ;
17 ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 ; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 ; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 ; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21 ; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 ; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 ; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 ; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 ; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 ; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 ; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
29
30
31 ; Routine to do AES key expansion
32
33 %include "reg_sizes.asm"
34
35 ; Uses the f() function of the aeskeygenassist result
36 %macro key_expansion_256_sse 0
37 ;; Assumes the xmm3 includes all zeros at this point.
38 pshufd xmm2, xmm2, 11111111b
39 shufps xmm3, xmm1, 00010000b
40 pxor xmm1, xmm3
41 shufps xmm3, xmm1, 10001100b
42 pxor xmm1, xmm3
43 pxor xmm1, xmm2
44 %endmacro
45
46 ; Uses the SubWord function of the aeskeygenassist result
47 %macro key_expansion_256_sse_2 0
48 ;; Assumes the xmm3 includes all zeros at this point.
49 pshufd xmm2, xmm2, 10101010b
50 shufps xmm3, xmm4, 00010000b
51 pxor xmm4, xmm3
52 shufps xmm3, xmm4, 10001100b
53 pxor xmm4, xmm3
54 pxor xmm4, xmm2
55 %endmacro
56
57 ; Uses the f() function of the aeskeygenassist result
58 %macro key_expansion_256_avx 0
59 ;; Assumes the xmm3 includes all zeros at this point.
60 vpshufd xmm2, xmm2, 11111111b
61 vshufps xmm3, xmm3, xmm1, 00010000b
62 vpxor xmm1, xmm1, xmm3
63 vshufps xmm3, xmm3, xmm1, 10001100b
64 vpxor xmm1, xmm1, xmm3
65 vpxor xmm1, xmm1, xmm2
66 %endmacro
67
68 ; Uses the SubWord function of the aeskeygenassist result
69 %macro key_expansion_256_avx_2 0
70 ;; Assumes the xmm3 includes all zeros at this point.
71 vpshufd xmm2, xmm2, 10101010b
72 vshufps xmm3, xmm3, xmm4, 00010000b
73 vpxor xmm4, xmm4, xmm3
74 vshufps xmm3, xmm3, xmm4, 10001100b
75 vpxor xmm4, xmm4, xmm3
76 vpxor xmm4, xmm4, xmm2
77 %endmacro
78
79 %ifidn __OUTPUT_FORMAT__, elf64
80 %define KEY rdi
81 %define EXP_ENC_KEYS rsi
82 %define EXP_DEC_KEYS rdx
83 %else
84 %define KEY rcx
85 %define EXP_ENC_KEYS rdx
86 %define EXP_DEC_KEYS r8
87 %endif
88
89 ; void aes_keyexp_256(UINT8 *key,
90 ; UINT8 *enc_exp_keys,
91 ; UINT8 *dec_exp_keys);
92 ;
93 ; arg 1: rcx: pointer to key
94 ; arg 2: rdx: pointer to expanded key array for encrypt
95 ; arg 3: r8: pointer to expanded key array for decrypt
96 ;
97 global aes_keyexp_256_sse:function
98 aes_keyexp_256_sse:
99 movdqu xmm1, [KEY] ; loading the AES key
100 movdqu [EXP_ENC_KEYS + 16*0], xmm1
101 movdqu [EXP_DEC_KEYS + 16*14], xmm1 ; Storing key in memory
102
103 movdqu xmm4, [KEY+16] ; loading the AES key
104 movdqu [EXP_ENC_KEYS + 16*1], xmm4
105 aesimc xmm0, xmm4
106 movdqu [EXP_DEC_KEYS + 16*13], xmm0 ; Storing key in memory
107
108 pxor xmm3, xmm3 ; Required for the key_expansion.
109
110 aeskeygenassist xmm2, xmm4, 0x1 ; Generating round key 2
111 key_expansion_256_sse
112 movdqu [EXP_ENC_KEYS + 16*2], xmm1
113 aesimc xmm5, xmm1
114 movdqu [EXP_DEC_KEYS + 16*12], xmm5
115
116 aeskeygenassist xmm2, xmm1, 0x1 ; Generating round key 3
117 key_expansion_256_sse_2
118 movdqu [EXP_ENC_KEYS + 16*3], xmm4
119 aesimc xmm0, xmm4
120 movdqu [EXP_DEC_KEYS + 16*11], xmm0
121
122 aeskeygenassist xmm2, xmm4, 0x2 ; Generating round key 4
123 key_expansion_256_sse
124 movdqu [EXP_ENC_KEYS + 16*4], xmm1
125 aesimc xmm5, xmm1
126 movdqu [EXP_DEC_KEYS + 16*10], xmm5
127
128 aeskeygenassist xmm2, xmm1, 0x2 ; Generating round key 5
129 key_expansion_256_sse_2
130 movdqu [EXP_ENC_KEYS + 16*5], xmm4
131 aesimc xmm0, xmm4
132 movdqu [EXP_DEC_KEYS + 16*9], xmm0
133
134 aeskeygenassist xmm2, xmm4, 0x4 ; Generating round key 6
135 key_expansion_256_sse
136 movdqu [EXP_ENC_KEYS + 16*6], xmm1
137 aesimc xmm5, xmm1
138 movdqu [EXP_DEC_KEYS + 16*8], xmm5
139
140 aeskeygenassist xmm2, xmm1, 0x4 ; Generating round key 7
141 key_expansion_256_sse_2
142 movdqu [EXP_ENC_KEYS + 16*7], xmm4
143 aesimc xmm0, xmm4
144 movdqu [EXP_DEC_KEYS + 16*7], xmm0
145
146 aeskeygenassist xmm2, xmm4, 0x8 ; Generating round key 8
147 key_expansion_256_sse
148 movdqu [EXP_ENC_KEYS + 16*8], xmm1
149 aesimc xmm5, xmm1
150 movdqu [EXP_DEC_KEYS + 16*6], xmm5
151
152 aeskeygenassist xmm2, xmm1, 0x8 ; Generating round key 9
153 key_expansion_256_sse_2
154 movdqu [EXP_ENC_KEYS + 16*9], xmm4
155 aesimc xmm0, xmm4
156 movdqu [EXP_DEC_KEYS + 16*5], xmm0
157
158 aeskeygenassist xmm2, xmm4, 0x10 ; Generating round key 10
159 key_expansion_256_sse
160 movdqu [EXP_ENC_KEYS + 16*10], xmm1
161 aesimc xmm5, xmm1
162 movdqu [EXP_DEC_KEYS + 16*4], xmm5
163
164 aeskeygenassist xmm2, xmm1, 0x10 ; Generating round key 11
165 key_expansion_256_sse_2
166 movdqu [EXP_ENC_KEYS + 16*11], xmm4
167 aesimc xmm0, xmm4
168 movdqu [EXP_DEC_KEYS + 16*3], xmm0
169
170 aeskeygenassist xmm2, xmm4, 0x20 ; Generating round key 12
171 key_expansion_256_sse
172 movdqu [EXP_ENC_KEYS + 16*12], xmm1
173 aesimc xmm5, xmm1
174 movdqu [EXP_DEC_KEYS + 16*2], xmm5
175
176 aeskeygenassist xmm2, xmm1, 0x20 ; Generating round key 13
177 key_expansion_256_sse_2
178 movdqu [EXP_ENC_KEYS + 16*13], xmm4
179 aesimc xmm0, xmm4
180 movdqu [EXP_DEC_KEYS + 16*1], xmm0
181
182 aeskeygenassist xmm2, xmm4, 0x40 ; Generating round key 14
183 key_expansion_256_sse
184 movdqu [EXP_ENC_KEYS + 16*14], xmm1
185 movdqu [EXP_DEC_KEYS + 16*0], xmm1
186
187 ret
188
189
190 global aes_keyexp_256_avx:function
191 aes_keyexp_256_avx:
192 vmovdqu xmm1, [KEY] ; loading the AES key
193 vmovdqu [EXP_ENC_KEYS + 16*0], xmm1
194 vmovdqu [EXP_DEC_KEYS + 16*14], xmm1 ; Storing key in memory
195
196 vmovdqu xmm4, [KEY+16] ; loading the AES key
197 vmovdqu [EXP_ENC_KEYS + 16*1], xmm4
198 vaesimc xmm0, xmm4
199 vmovdqu [EXP_DEC_KEYS + 16*13], xmm0 ; Storing key in memory
200
201 vpxor xmm3, xmm3, xmm3 ; Required for the key_expansion.
202
203 vaeskeygenassist xmm2, xmm4, 0x1 ; Generating round key 2
204 key_expansion_256_avx
205 vmovdqu [EXP_ENC_KEYS + 16*2], xmm1
206 vaesimc xmm5, xmm1
207 vmovdqu [EXP_DEC_KEYS + 16*12], xmm5
208
209 vaeskeygenassist xmm2, xmm1, 0x1 ; Generating round key 3
210 key_expansion_256_avx_2
211 vmovdqu [EXP_ENC_KEYS + 16*3], xmm4
212 vaesimc xmm0, xmm4
213 vmovdqu [EXP_DEC_KEYS + 16*11], xmm0
214
215 vaeskeygenassist xmm2, xmm4, 0x2 ; Generating round key 4
216 key_expansion_256_avx
217 vmovdqu [EXP_ENC_KEYS + 16*4], xmm1
218 vaesimc xmm5, xmm1
219 vmovdqu [EXP_DEC_KEYS + 16*10], xmm5
220
221 vaeskeygenassist xmm2, xmm1, 0x2 ; Generating round key 5
222 key_expansion_256_avx_2
223 vmovdqu [EXP_ENC_KEYS + 16*5], xmm4
224 vaesimc xmm0, xmm4
225 vmovdqu [EXP_DEC_KEYS + 16*9], xmm0
226
227 vaeskeygenassist xmm2, xmm4, 0x4 ; Generating round key 6
228 key_expansion_256_avx
229 vmovdqu [EXP_ENC_KEYS + 16*6], xmm1
230 vaesimc xmm5, xmm1
231 vmovdqu [EXP_DEC_KEYS + 16*8], xmm5
232
233 vaeskeygenassist xmm2, xmm1, 0x4 ; Generating round key 7
234 key_expansion_256_avx_2
235 vmovdqu [EXP_ENC_KEYS + 16*7], xmm4
236 vaesimc xmm0, xmm4
237 vmovdqu [EXP_DEC_KEYS + 16*7], xmm0
238
239 vaeskeygenassist xmm2, xmm4, 0x8 ; Generating round key 8
240 key_expansion_256_avx
241 vmovdqu [EXP_ENC_KEYS + 16*8], xmm1
242 vaesimc xmm5, xmm1
243 vmovdqu [EXP_DEC_KEYS + 16*6], xmm5
244
245 vaeskeygenassist xmm2, xmm1, 0x8 ; Generating round key 9
246 key_expansion_256_avx_2
247 vmovdqu [EXP_ENC_KEYS + 16*9], xmm4
248 vaesimc xmm0, xmm4
249 vmovdqu [EXP_DEC_KEYS + 16*5], xmm0
250
251 vaeskeygenassist xmm2, xmm4, 0x10 ; Generating round key 10
252 key_expansion_256_avx
253 vmovdqu [EXP_ENC_KEYS + 16*10], xmm1
254 vaesimc xmm5, xmm1
255 vmovdqu [EXP_DEC_KEYS + 16*4], xmm5
256
257 vaeskeygenassist xmm2, xmm1, 0x10 ; Generating round key 11
258 key_expansion_256_avx_2
259 vmovdqu [EXP_ENC_KEYS + 16*11], xmm4
260 vaesimc xmm0, xmm4
261 vmovdqu [EXP_DEC_KEYS + 16*3], xmm0
262
263 vaeskeygenassist xmm2, xmm4, 0x20 ; Generating round key 12
264 key_expansion_256_avx
265 vmovdqu [EXP_ENC_KEYS + 16*12], xmm1
266 vaesimc xmm5, xmm1
267 vmovdqu [EXP_DEC_KEYS + 16*2], xmm5
268
269 vaeskeygenassist xmm2, xmm1, 0x20 ; Generating round key 13
270 key_expansion_256_avx_2
271 vmovdqu [EXP_ENC_KEYS + 16*13], xmm4
272 vaesimc xmm0, xmm4
273 vmovdqu [EXP_DEC_KEYS + 16*1], xmm0
274
275 vaeskeygenassist xmm2, xmm4, 0x40 ; Generating round key 14
276 key_expansion_256_avx
277 vmovdqu [EXP_ENC_KEYS + 16*14], xmm1
278 vmovdqu [EXP_DEC_KEYS + 16*0], xmm1
279
280 ret