1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ; Copyright(c) 2011-2016 Intel Corporation All rights reserved.
4 ; Redistribution and use in source and binary forms, with or without
5 ; modification, are permitted provided that the following conditions
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
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.
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 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
31 ; Routine to do AES key expansion
33 %include "reg_sizes.asm"
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
41 shufps xmm3, xmm1, 10001100b
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
52 shufps xmm3, xmm4, 10001100b
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
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
79 %ifidn __OUTPUT_FORMAT__, elf64
81 %define EXP_ENC_KEYS rsi
82 %define EXP_DEC_KEYS rdx
85 %define EXP_ENC_KEYS rdx
86 %define EXP_DEC_KEYS r8
89 ; void aes_keyexp_256(UINT8 *key,
90 ; UINT8 *enc_exp_keys,
91 ; UINT8 *dec_exp_keys);
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
97 global aes_keyexp_256_sse:function
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
103 movdqu xmm4, [KEY+16] ; loading the AES key
104 movdqu [EXP_ENC_KEYS + 16*1], xmm4
106 movdqu [EXP_DEC_KEYS + 16*13], xmm0 ; Storing key in memory
108 pxor xmm3, xmm3 ; Required for the key_expansion.
110 aeskeygenassist xmm2, xmm4, 0x1 ; Generating round key 2
111 key_expansion_256_sse
112 movdqu [EXP_ENC_KEYS + 16*2], xmm1
114 movdqu [EXP_DEC_KEYS + 16*12], xmm5
116 aeskeygenassist xmm2, xmm1, 0x1 ; Generating round key 3
117 key_expansion_256_sse_2
118 movdqu [EXP_ENC_KEYS + 16*3], xmm4
120 movdqu [EXP_DEC_KEYS + 16*11], xmm0
122 aeskeygenassist xmm2, xmm4, 0x2 ; Generating round key 4
123 key_expansion_256_sse
124 movdqu [EXP_ENC_KEYS + 16*4], xmm1
126 movdqu [EXP_DEC_KEYS + 16*10], xmm5
128 aeskeygenassist xmm2, xmm1, 0x2 ; Generating round key 5
129 key_expansion_256_sse_2
130 movdqu [EXP_ENC_KEYS + 16*5], xmm4
132 movdqu [EXP_DEC_KEYS + 16*9], xmm0
134 aeskeygenassist xmm2, xmm4, 0x4 ; Generating round key 6
135 key_expansion_256_sse
136 movdqu [EXP_ENC_KEYS + 16*6], xmm1
138 movdqu [EXP_DEC_KEYS + 16*8], xmm5
140 aeskeygenassist xmm2, xmm1, 0x4 ; Generating round key 7
141 key_expansion_256_sse_2
142 movdqu [EXP_ENC_KEYS + 16*7], xmm4
144 movdqu [EXP_DEC_KEYS + 16*7], xmm0
146 aeskeygenassist xmm2, xmm4, 0x8 ; Generating round key 8
147 key_expansion_256_sse
148 movdqu [EXP_ENC_KEYS + 16*8], xmm1
150 movdqu [EXP_DEC_KEYS + 16*6], xmm5
152 aeskeygenassist xmm2, xmm1, 0x8 ; Generating round key 9
153 key_expansion_256_sse_2
154 movdqu [EXP_ENC_KEYS + 16*9], xmm4
156 movdqu [EXP_DEC_KEYS + 16*5], xmm0
158 aeskeygenassist xmm2, xmm4, 0x10 ; Generating round key 10
159 key_expansion_256_sse
160 movdqu [EXP_ENC_KEYS + 16*10], xmm1
162 movdqu [EXP_DEC_KEYS + 16*4], xmm5
164 aeskeygenassist xmm2, xmm1, 0x10 ; Generating round key 11
165 key_expansion_256_sse_2
166 movdqu [EXP_ENC_KEYS + 16*11], xmm4
168 movdqu [EXP_DEC_KEYS + 16*3], xmm0
170 aeskeygenassist xmm2, xmm4, 0x20 ; Generating round key 12
171 key_expansion_256_sse
172 movdqu [EXP_ENC_KEYS + 16*12], xmm1
174 movdqu [EXP_DEC_KEYS + 16*2], xmm5
176 aeskeygenassist xmm2, xmm1, 0x20 ; Generating round key 13
177 key_expansion_256_sse_2
178 movdqu [EXP_ENC_KEYS + 16*13], xmm4
180 movdqu [EXP_DEC_KEYS + 16*1], xmm0
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
190 global aes_keyexp_256_avx:function
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
196 vmovdqu xmm4, [KEY+16] ; loading the AES key
197 vmovdqu [EXP_ENC_KEYS + 16*1], xmm4
199 vmovdqu [EXP_DEC_KEYS + 16*13], xmm0 ; Storing key in memory
201 vpxor xmm3, xmm3, xmm3 ; Required for the key_expansion.
203 vaeskeygenassist xmm2, xmm4, 0x1 ; Generating round key 2
204 key_expansion_256_avx
205 vmovdqu [EXP_ENC_KEYS + 16*2], xmm1
207 vmovdqu [EXP_DEC_KEYS + 16*12], xmm5
209 vaeskeygenassist xmm2, xmm1, 0x1 ; Generating round key 3
210 key_expansion_256_avx_2
211 vmovdqu [EXP_ENC_KEYS + 16*3], xmm4
213 vmovdqu [EXP_DEC_KEYS + 16*11], xmm0
215 vaeskeygenassist xmm2, xmm4, 0x2 ; Generating round key 4
216 key_expansion_256_avx
217 vmovdqu [EXP_ENC_KEYS + 16*4], xmm1
219 vmovdqu [EXP_DEC_KEYS + 16*10], xmm5
221 vaeskeygenassist xmm2, xmm1, 0x2 ; Generating round key 5
222 key_expansion_256_avx_2
223 vmovdqu [EXP_ENC_KEYS + 16*5], xmm4
225 vmovdqu [EXP_DEC_KEYS + 16*9], xmm0
227 vaeskeygenassist xmm2, xmm4, 0x4 ; Generating round key 6
228 key_expansion_256_avx
229 vmovdqu [EXP_ENC_KEYS + 16*6], xmm1
231 vmovdqu [EXP_DEC_KEYS + 16*8], xmm5
233 vaeskeygenassist xmm2, xmm1, 0x4 ; Generating round key 7
234 key_expansion_256_avx_2
235 vmovdqu [EXP_ENC_KEYS + 16*7], xmm4
237 vmovdqu [EXP_DEC_KEYS + 16*7], xmm0
239 vaeskeygenassist xmm2, xmm4, 0x8 ; Generating round key 8
240 key_expansion_256_avx
241 vmovdqu [EXP_ENC_KEYS + 16*8], xmm1
243 vmovdqu [EXP_DEC_KEYS + 16*6], xmm5
245 vaeskeygenassist xmm2, xmm1, 0x8 ; Generating round key 9
246 key_expansion_256_avx_2
247 vmovdqu [EXP_ENC_KEYS + 16*9], xmm4
249 vmovdqu [EXP_DEC_KEYS + 16*5], xmm0
251 vaeskeygenassist xmm2, xmm4, 0x10 ; Generating round key 10
252 key_expansion_256_avx
253 vmovdqu [EXP_ENC_KEYS + 16*10], xmm1
255 vmovdqu [EXP_DEC_KEYS + 16*4], xmm5
257 vaeskeygenassist xmm2, xmm1, 0x10 ; Generating round key 11
258 key_expansion_256_avx_2
259 vmovdqu [EXP_ENC_KEYS + 16*11], xmm4
261 vmovdqu [EXP_DEC_KEYS + 16*3], xmm0
263 vaeskeygenassist xmm2, xmm4, 0x20 ; Generating round key 12
264 key_expansion_256_avx
265 vmovdqu [EXP_ENC_KEYS + 16*12], xmm1
267 vmovdqu [EXP_DEC_KEYS + 16*2], xmm5
269 vaeskeygenassist xmm2, xmm1, 0x20 ; Generating round key 13
270 key_expansion_256_avx_2
271 vmovdqu [EXP_ENC_KEYS + 16*13], xmm4
273 vmovdqu [EXP_DEC_KEYS + 16*1], xmm0
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