]> git.ipfire.org Git - thirdparty/openssl.git/blame - crypto/aes/asm/aes-c64xplus.pl
Add OpenSSL copyright to .pl files
[thirdparty/openssl.git] / crypto / aes / asm / aes-c64xplus.pl
CommitLineData
6aa36e8e
RS
1#! /usr/bin/env perl
2# Copyright 2012-2016 The OpenSSL Project Authors. All Rights Reserved.
3#
4# Licensed under the OpenSSL license (the "License"). You may not use
5# this file except in compliance with the License. You can obtain a copy
6# in the file LICENSE in the source distribution or at
7# https://www.openssl.org/source/license.html
8
3e181369
AP
9#
10# ====================================================================
11# Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
12# project. The module is, however, dual licensed under OpenSSL and
13# CRYPTOGAMS licenses depending on where you obtain it. For further
14# details see http://www.openssl.org/~appro/cryptogams/.
15# ====================================================================
16#
17# [Endian-neutral] AES for C64x+.
18#
19# Even though SPLOOPs are scheduled for 13 cycles, and thus expected
20# performance is ~8.5 cycles per byte processed with 128-bit key,
21# measured performance turned to be ~10 cycles per byte. Discrepancy
22# must be caused by limitations of L1D memory banking(*), see SPRU871
23# TI publication for further details. If any consolation it's still
24# ~20% faster than TI's linear assembly module anyway... Compared to
25# aes_core.c compiled with cl6x 6.0 with -mv6400+ -o2 options this
26# code is 3.75x faster and almost 3x smaller (tables included).
27#
28# (*) This means that there might be subtle correlation between data
29# and timing and one can wonder if it can be ... attacked:-(
30# On the other hand this also means that *if* one chooses to
31# implement *4* T-tables variant [instead of 1 T-table as in
32# this implementation, or in addition to], then one ought to
33# *interleave* them. Even though it complicates addressing,
34# references to interleaved tables would be guaranteed not to
35# clash. I reckon that it should be possible to break 8 cycles
36# per byte "barrier," i.e. improve by ~20%, naturally at the
37# cost of 8x increased pressure on L1D. 8x because you'd have
38# to interleave both Te and Td tables...
39
40while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {}
41open STDOUT,">$output";
42
43($TEA,$TEB)=("A5","B5");
44($KPA,$KPB)=("A3","B1");
45@K=("A6","B6","A7","B7");
46@s=("A8","B8","A9","B9");
47@Te0=@Td0=("A16","B16","A17","B17");
48@Te1=@Td1=("A18","B18","A19","B19");
49@Te2=@Td2=("A20","B20","A21","B21");
50@Te3=@Td3=("A22","B22","A23","B23");
51
52$code=<<___;
53 .text
bd227733
AP
54
55 .if .ASSEMBLER_VERSION<7000000
56 .asg 0,__TI_EABI__
57 .endif
3e181369
AP
58 .if __TI_EABI__
59 .nocmp
904732f6
AP
60 .asg AES_encrypt,_AES_encrypt
61 .asg AES_decrypt,_AES_decrypt
62 .asg AES_set_encrypt_key,_AES_set_encrypt_key
63 .asg AES_set_decrypt_key,_AES_set_decrypt_key
64 .asg AES_ctr32_encrypt,_AES_ctr32_encrypt
3e181369
AP
65 .endif
66
67 .asg B3,RA
68 .asg A4,INP
69 .asg B4,OUT
70 .asg A6,KEY
71 .asg A4,RET
72 .asg B15,SP
73
74 .eval 24,EXT0
75 .eval 16,EXT1
76 .eval 8,EXT2
77 .eval 0,EXT3
78 .eval 8,TBL1
79 .eval 16,TBL2
80 .eval 24,TBL3
81
82 .if .BIG_ENDIAN
83 .eval 24-EXT0,EXT0
84 .eval 24-EXT1,EXT1
85 .eval 24-EXT2,EXT2
86 .eval 24-EXT3,EXT3
87 .eval 32-TBL1,TBL1
88 .eval 32-TBL2,TBL2
89 .eval 32-TBL3,TBL3
90 .endif
91
92 .global _AES_encrypt
93_AES_encrypt:
94 .asmfunc
95 MVK 1,B2
96__encrypt:
97 .if __TI_EABI__
98 [B2] LDNDW *INP++,A9:A8 ; load input
bd227733
AP
99|| MVKL \$PCR_OFFSET(AES_Te,__encrypt),$TEA
100|| ADDKPC __encrypt,B0
3e181369 101 [B2] LDNDW *INP++,B9:B8
bd227733 102|| MVKH \$PCR_OFFSET(AES_Te,__encrypt),$TEA
3e181369
AP
103|| ADD 0,KEY,$KPA
104|| ADD 4,KEY,$KPB
105 .else
106 [B2] LDNDW *INP++,A9:A8 ; load input
bd227733
AP
107|| MVKL (AES_Te-__encrypt),$TEA
108|| ADDKPC __encrypt,B0
3e181369 109 [B2] LDNDW *INP++,B9:B8
bd227733 110|| MVKH (AES_Te-__encrypt),$TEA
3e181369
AP
111|| ADD 0,KEY,$KPA
112|| ADD 4,KEY,$KPB
113 .endif
114 LDW *$KPA++[2],$Te0[0] ; zero round key
115|| LDW *$KPB++[2],$Te0[1]
116|| MVK 60,A0
117|| ADD B0,$TEA,$TEA ; AES_Te
118 LDW *KEY[A0],B0 ; rounds
119|| MVK 1024,A0 ; sizeof(AES_Te)
120 LDW *$KPA++[2],$Te0[2]
121|| LDW *$KPB++[2],$Te0[3]
122|| MV $TEA,$TEB
123 NOP
124 .if .BIG_ENDIAN
125 MV A9,$s[0]
126|| MV A8,$s[1]
127|| MV B9,$s[2]
128|| MV B8,$s[3]
129 .else
130 MV A8,$s[0]
131|| MV A9,$s[1]
132|| MV B8,$s[2]
133|| MV B9,$s[3]
134 .endif
135 XOR $Te0[0],$s[0],$s[0]
136|| XOR $Te0[1],$s[1],$s[1]
137|| LDW *$KPA++[2],$K[0] ; 1st round key
138|| LDW *$KPB++[2],$K[1]
139 SUB B0,2,B0
140
141 SPLOOPD 13
142|| MVC B0,ILC
143|| LDW *$KPA++[2],$K[2]
144|| LDW *$KPB++[2],$K[3]
145;;====================================================================
146 EXTU $s[1],EXT1,24,$Te1[1]
147|| EXTU $s[0],EXT3,24,$Te3[0]
148 LDW *${TEB}[$Te1[1]],$Te1[1] ; Te1[s1>>8], t0
149|| LDW *${TEA}[$Te3[0]],$Te3[0] ; Te3[s0>>24], t1
150|| XOR $s[2],$Te0[2],$s[2] ; modulo-scheduled
151|| XOR $s[3],$Te0[3],$s[3] ; modulo-scheduled
152|| EXTU $s[1],EXT3,24,$Te3[1]
153|| EXTU $s[0],EXT1,24,$Te1[0]
154 LDW *${TEB}[$Te3[1]],$Te3[1] ; Te3[s1>>24], t2
155|| LDW *${TEA}[$Te1[0]],$Te1[0] ; Te1[s0>>8], t3
156|| EXTU $s[2],EXT2,24,$Te2[2]
157|| EXTU $s[3],EXT2,24,$Te2[3]
158 LDW *${TEA}[$Te2[2]],$Te2[2] ; Te2[s2>>16], t0
159|| LDW *${TEB}[$Te2[3]],$Te2[3] ; Te2[s3>>16], t1
160|| EXTU $s[3],EXT3,24,$Te3[3]
161|| EXTU $s[2],EXT1,24,$Te1[2]
162 LDW *${TEB}[$Te3[3]],$Te3[3] ; Te3[s3>>24], t0
163|| LDW *${TEA}[$Te1[2]],$Te1[2] ; Te1[s2>>8], t1
164|| EXTU $s[0],EXT2,24,$Te2[0]
165|| EXTU $s[1],EXT2,24,$Te2[1]
166 LDW *${TEA}[$Te2[0]],$Te2[0] ; Te2[s0>>16], t2
167|| LDW *${TEB}[$Te2[1]],$Te2[1] ; Te2[s1>>16], t3
168|| EXTU $s[3],EXT1,24,$Te1[3]
169|| EXTU $s[2],EXT3,24,$Te3[2]
170 LDW *${TEB}[$Te1[3]],$Te1[3] ; Te1[s3>>8], t2
171|| LDW *${TEA}[$Te3[2]],$Te3[2] ; Te3[s2>>24], t3
172|| ROTL $Te1[1],TBL1,$Te3[0] ; t0
173|| ROTL $Te3[0],TBL3,$Te1[1] ; t1
174|| EXTU $s[0],EXT0,24,$Te0[0]
175|| EXTU $s[1],EXT0,24,$Te0[1]
176 LDW *${TEA}[$Te0[0]],$Te0[0] ; Te0[s0], t0
177|| LDW *${TEB}[$Te0[1]],$Te0[1] ; Te0[s1], t1
178|| ROTL $Te3[1],TBL3,$Te1[0] ; t2
179|| ROTL $Te1[0],TBL1,$Te3[1] ; t3
180|| EXTU $s[2],EXT0,24,$Te0[2]
181|| EXTU $s[3],EXT0,24,$Te0[3]
182 LDW *${TEA}[$Te0[2]],$Te0[2] ; Te0[s2], t2
183|| LDW *${TEB}[$Te0[3]],$Te0[3] ; Te0[s3], t3
184|| ROTL $Te2[2],TBL2,$Te2[2] ; t0
185|| ROTL $Te2[3],TBL2,$Te2[3] ; t1
186|| XOR $K[0],$Te3[0],$s[0]
187|| XOR $K[1],$Te1[1],$s[1]
188 ROTL $Te3[3],TBL3,$Te1[2] ; t0
189|| ROTL $Te1[2],TBL1,$Te3[3] ; t1
190|| XOR $K[2],$Te1[0],$s[2]
191|| XOR $K[3],$Te3[1],$s[3]
192|| LDW *$KPA++[2],$K[0] ; next round key
193|| LDW *$KPB++[2],$K[1]
194 ROTL $Te2[0],TBL2,$Te2[0] ; t2
195|| ROTL $Te2[1],TBL2,$Te2[1] ; t3
196|| XOR $s[0],$Te2[2],$s[0]
197|| XOR $s[1],$Te2[3],$s[1]
198|| LDW *$KPA++[2],$K[2]
199|| LDW *$KPB++[2],$K[3]
200 ROTL $Te1[3],TBL1,$Te3[2] ; t2
201|| ROTL $Te3[2],TBL3,$Te1[3] ; t3
202|| XOR $s[0],$Te1[2],$s[0]
203|| XOR $s[1],$Te3[3],$s[1]
204 XOR $s[2],$Te2[0],$s[2]
205|| XOR $s[3],$Te2[1],$s[3]
206|| XOR $s[0],$Te0[0],$s[0]
207|| XOR $s[1],$Te0[1],$s[1]
208 SPKERNEL
209|| XOR.L $s[2],$Te3[2],$s[2]
210|| XOR.L $s[3],$Te1[3],$s[3]
211;;====================================================================
212 ADD.D ${TEA},A0,${TEA} ; point to Te4
213|| ADD.D ${TEB},A0,${TEB}
214|| EXTU $s[1],EXT1,24,$Te1[1]
215|| EXTU $s[0],EXT3,24,$Te3[0]
216 LDBU *${TEB}[$Te1[1]],$Te1[1] ; Te1[s1>>8], t0
217|| LDBU *${TEA}[$Te3[0]],$Te3[0] ; Te3[s0>>24], t1
218|| XOR $s[2],$Te0[2],$s[2] ; modulo-scheduled
219|| XOR $s[3],$Te0[3],$s[3] ; modulo-scheduled
220|| EXTU $s[0],EXT0,24,$Te0[0]
221|| EXTU $s[1],EXT0,24,$Te0[1]
222 LDBU *${TEA}[$Te0[0]],$Te0[0] ; Te0[s0], t0
223|| LDBU *${TEB}[$Te0[1]],$Te0[1] ; Te0[s1], t1
224|| EXTU $s[3],EXT3,24,$Te3[3]
225|| EXTU $s[2],EXT1,24,$Te1[2]
226 LDBU *${TEB}[$Te3[3]],$Te3[3] ; Te3[s3>>24], t0
227|| LDBU *${TEA}[$Te1[2]],$Te1[2] ; Te1[s2>>8], t1
228|| EXTU $s[2],EXT2,24,$Te2[2]
229|| EXTU $s[3],EXT2,24,$Te2[3]
230 LDBU *${TEA}[$Te2[2]],$Te2[2] ; Te2[s2>>16], t0
231|| LDBU *${TEB}[$Te2[3]],$Te2[3] ; Te2[s3>>16], t1
232|| EXTU $s[1],EXT3,24,$Te3[1]
233|| EXTU $s[0],EXT1,24,$Te1[0]
234 LDBU *${TEB}[$Te3[1]],$Te3[1] ; Te3[s1>>24], t2
235|| LDBU *${TEA}[$Te1[0]],$Te1[0] ; Te1[s0>>8], t3
236|| EXTU $s[3],EXT1,24,$Te1[3]
237|| EXTU $s[2],EXT3,24,$Te3[2]
238 LDBU *${TEB}[$Te1[3]],$Te1[3] ; Te1[s3>>8], t2
239|| LDBU *${TEA}[$Te3[2]],$Te3[2] ; Te3[s2>>24], t3
240|| EXTU $s[2],EXT0,24,$Te0[2]
241|| EXTU $s[3],EXT0,24,$Te0[3]
242 LDBU *${TEA}[$Te0[2]],$Te0[2] ; Te0[s2], t2
243|| LDBU *${TEB}[$Te0[3]],$Te0[3] ; Te0[s3], t3
244|| EXTU $s[0],EXT2,24,$Te2[0]
245|| EXTU $s[1],EXT2,24,$Te2[1]
246 LDBU *${TEA}[$Te2[0]],$Te2[0] ; Te2[s0>>16], t2
247|| LDBU *${TEB}[$Te2[1]],$Te2[1] ; Te2[s1>>16], t3
248
249 .if .BIG_ENDIAN
250 PACK2 $Te0[0],$Te1[1],$Te0[0]
251|| PACK2 $Te0[1],$Te1[2],$Te0[1]
252 PACK2 $Te2[2],$Te3[3],$Te2[2]
253|| PACK2 $Te2[3],$Te3[0],$Te2[3]
254 PACKL4 $Te0[0],$Te2[2],$Te0[0]
255|| PACKL4 $Te0[1],$Te2[3],$Te0[1]
256 XOR $K[0],$Te0[0],$Te0[0] ; s[0]
257|| XOR $K[1],$Te0[1],$Te0[1] ; s[1]
258
259 PACK2 $Te0[2],$Te1[3],$Te0[2]
260|| PACK2 $Te0[3],$Te1[0],$Te0[3]
261 PACK2 $Te2[0],$Te3[1],$Te2[0]
262|| PACK2 $Te2[1],$Te3[2],$Te2[1]
263|| BNOP RA
264 PACKL4 $Te0[2],$Te2[0],$Te0[2]
265|| PACKL4 $Te0[3],$Te2[1],$Te0[3]
266 XOR $K[2],$Te0[2],$Te0[2] ; s[2]
267|| XOR $K[3],$Te0[3],$Te0[3] ; s[3]
268
269 MV $Te0[0],A9
270|| MV $Te0[1],A8
271 MV $Te0[2],B9
272|| MV $Te0[3],B8
273|| [B2] STNDW A9:A8,*OUT++
274 [B2] STNDW B9:B8,*OUT++
275 .else
276 PACK2 $Te1[1],$Te0[0],$Te1[1]
277|| PACK2 $Te1[2],$Te0[1],$Te1[2]
278 PACK2 $Te3[3],$Te2[2],$Te3[3]
279|| PACK2 $Te3[0],$Te2[3],$Te3[0]
280 PACKL4 $Te3[3],$Te1[1],$Te1[1]
281|| PACKL4 $Te3[0],$Te1[2],$Te1[2]
282 XOR $K[0],$Te1[1],$Te1[1] ; s[0]
283|| XOR $K[1],$Te1[2],$Te1[2] ; s[1]
284
285 PACK2 $Te1[3],$Te0[2],$Te1[3]
286|| PACK2 $Te1[0],$Te0[3],$Te1[0]
287 PACK2 $Te3[1],$Te2[0],$Te3[1]
288|| PACK2 $Te3[2],$Te2[1],$Te3[2]
289|| BNOP RA
290 PACKL4 $Te3[1],$Te1[3],$Te1[3]
291|| PACKL4 $Te3[2],$Te1[0],$Te1[0]
292 XOR $K[2],$Te1[3],$Te1[3] ; s[2]
293|| XOR $K[3],$Te1[0],$Te1[0] ; s[3]
294
295 MV $Te1[1],A8
296|| MV $Te1[2],A9
297 MV $Te1[3],B8
298|| MV $Te1[0],B9
299|| [B2] STNDW A9:A8,*OUT++
300 [B2] STNDW B9:B8,*OUT++
301 .endif
302 .endasmfunc
303
304 .global _AES_decrypt
305_AES_decrypt:
306 .asmfunc
307 MVK 1,B2
308__decrypt:
309 .if __TI_EABI__
310 [B2] LDNDW *INP++,A9:A8 ; load input
bd227733
AP
311|| MVKL \$PCR_OFFSET(AES_Td,__decrypt),$TEA
312|| ADDKPC __decrypt,B0
3e181369 313 [B2] LDNDW *INP++,B9:B8
bd227733 314|| MVKH \$PCR_OFFSET(AES_Td,__decrypt),$TEA
3e181369
AP
315|| ADD 0,KEY,$KPA
316|| ADD 4,KEY,$KPB
317 .else
318 [B2] LDNDW *INP++,A9:A8 ; load input
bd227733
AP
319|| MVKL (AES_Td-__decrypt),$TEA
320|| ADDKPC __decrypt,B0
3e181369 321 [B2] LDNDW *INP++,B9:B8
bd227733 322|| MVKH (AES_Td-__decrypt),$TEA
3e181369
AP
323|| ADD 0,KEY,$KPA
324|| ADD 4,KEY,$KPB
325 .endif
326 LDW *$KPA++[2],$Td0[0] ; zero round key
327|| LDW *$KPB++[2],$Td0[1]
328|| MVK 60,A0
329|| ADD B0,$TEA,$TEA ; AES_Td
330 LDW *KEY[A0],B0 ; rounds
331|| MVK 1024,A0 ; sizeof(AES_Td)
332 LDW *$KPA++[2],$Td0[2]
333|| LDW *$KPB++[2],$Td0[3]
334|| MV $TEA,$TEB
335 NOP
336 .if .BIG_ENDIAN
337 MV A9,$s[0]
338|| MV A8,$s[1]
339|| MV B9,$s[2]
340|| MV B8,$s[3]
341 .else
342 MV A8,$s[0]
343|| MV A9,$s[1]
344|| MV B8,$s[2]
345|| MV B9,$s[3]
346 .endif
347 XOR $Td0[0],$s[0],$s[0]
348|| XOR $Td0[1],$s[1],$s[1]
349|| LDW *$KPA++[2],$K[0] ; 1st round key
350|| LDW *$KPB++[2],$K[1]
351 SUB B0,2,B0
352
353 SPLOOPD 13
354|| MVC B0,ILC
355|| LDW *$KPA++[2],$K[2]
356|| LDW *$KPB++[2],$K[3]
357;;====================================================================
358 EXTU $s[1],EXT3,24,$Td3[1]
359|| EXTU $s[0],EXT1,24,$Td1[0]
360 LDW *${TEB}[$Td3[1]],$Td3[1] ; Td3[s1>>24], t0
361|| LDW *${TEA}[$Td1[0]],$Td1[0] ; Td1[s0>>8], t1
362|| XOR $s[2],$Td0[2],$s[2] ; modulo-scheduled
363|| XOR $s[3],$Td0[3],$s[3] ; modulo-scheduled
364|| EXTU $s[1],EXT1,24,$Td1[1]
365|| EXTU $s[0],EXT3,24,$Td3[0]
366 LDW *${TEB}[$Td1[1]],$Td1[1] ; Td1[s1>>8], t2
367|| LDW *${TEA}[$Td3[0]],$Td3[0] ; Td3[s0>>24], t3
368|| EXTU $s[2],EXT2,24,$Td2[2]
369|| EXTU $s[3],EXT2,24,$Td2[3]
370 LDW *${TEA}[$Td2[2]],$Td2[2] ; Td2[s2>>16], t0
371|| LDW *${TEB}[$Td2[3]],$Td2[3] ; Td2[s3>>16], t1
372|| EXTU $s[3],EXT1,24,$Td1[3]
373|| EXTU $s[2],EXT3,24,$Td3[2]
374 LDW *${TEB}[$Td1[3]],$Td1[3] ; Td1[s3>>8], t0
375|| LDW *${TEA}[$Td3[2]],$Td3[2] ; Td3[s2>>24], t1
376|| EXTU $s[0],EXT2,24,$Td2[0]
377|| EXTU $s[1],EXT2,24,$Td2[1]
378 LDW *${TEA}[$Td2[0]],$Td2[0] ; Td2[s0>>16], t2
379|| LDW *${TEB}[$Td2[1]],$Td2[1] ; Td2[s1>>16], t3
380|| EXTU $s[3],EXT3,24,$Td3[3]
381|| EXTU $s[2],EXT1,24,$Td1[2]
382 LDW *${TEB}[$Td3[3]],$Td3[3] ; Td3[s3>>24], t2
383|| LDW *${TEA}[$Td1[2]],$Td1[2] ; Td1[s2>>8], t3
384|| ROTL $Td3[1],TBL3,$Td1[0] ; t0
385|| ROTL $Td1[0],TBL1,$Td3[1] ; t1
386|| EXTU $s[0],EXT0,24,$Td0[0]
387|| EXTU $s[1],EXT0,24,$Td0[1]
388 LDW *${TEA}[$Td0[0]],$Td0[0] ; Td0[s0], t0
389|| LDW *${TEB}[$Td0[1]],$Td0[1] ; Td0[s1], t1
390|| ROTL $Td1[1],TBL1,$Td3[0] ; t2
391|| ROTL $Td3[0],TBL3,$Td1[1] ; t3
392|| EXTU $s[2],EXT0,24,$Td0[2]
393|| EXTU $s[3],EXT0,24,$Td0[3]
394 LDW *${TEA}[$Td0[2]],$Td0[2] ; Td0[s2], t2
395|| LDW *${TEB}[$Td0[3]],$Td0[3] ; Td0[s3], t3
396|| ROTL $Td2[2],TBL2,$Td2[2] ; t0
397|| ROTL $Td2[3],TBL2,$Td2[3] ; t1
398|| XOR $K[0],$Td1[0],$s[0]
399|| XOR $K[1],$Td3[1],$s[1]
400 ROTL $Td1[3],TBL1,$Td3[2] ; t0
401|| ROTL $Td3[2],TBL3,$Td1[3] ; t1
402|| XOR $K[2],$Td3[0],$s[2]
403|| XOR $K[3],$Td1[1],$s[3]
404|| LDW *$KPA++[2],$K[0] ; next round key
405|| LDW *$KPB++[2],$K[1]
406 ROTL $Td2[0],TBL2,$Td2[0] ; t2
407|| ROTL $Td2[1],TBL2,$Td2[1] ; t3
408|| XOR $s[0],$Td2[2],$s[0]
409|| XOR $s[1],$Td2[3],$s[1]
410|| LDW *$KPA++[2],$K[2]
411|| LDW *$KPB++[2],$K[3]
412 ROTL $Td3[3],TBL3,$Td1[2] ; t2
413|| ROTL $Td1[2],TBL1,$Td3[3] ; t3
414|| XOR $s[0],$Td3[2],$s[0]
415|| XOR $s[1],$Td1[3],$s[1]
416 XOR $s[2],$Td2[0],$s[2]
417|| XOR $s[3],$Td2[1],$s[3]
418|| XOR $s[0],$Td0[0],$s[0]
419|| XOR $s[1],$Td0[1],$s[1]
420 SPKERNEL
421|| XOR.L $s[2],$Td1[2],$s[2]
422|| XOR.L $s[3],$Td3[3],$s[3]
423;;====================================================================
424 ADD.D ${TEA},A0,${TEA} ; point to Td4
425|| ADD.D ${TEB},A0,${TEB}
426|| EXTU $s[1],EXT3,24,$Td3[1]
427|| EXTU $s[0],EXT1,24,$Td1[0]
428 LDBU *${TEB}[$Td3[1]],$Td3[1] ; Td3[s1>>24], t0
429|| LDBU *${TEA}[$Td1[0]],$Td1[0] ; Td1[s0>>8], t1
430|| XOR $s[2],$Td0[2],$s[2] ; modulo-scheduled
431|| XOR $s[3],$Td0[3],$s[3] ; modulo-scheduled
432|| EXTU $s[0],EXT0,24,$Td0[0]
433|| EXTU $s[1],EXT0,24,$Td0[1]
434 LDBU *${TEA}[$Td0[0]],$Td0[0] ; Td0[s0], t0
435|| LDBU *${TEB}[$Td0[1]],$Td0[1] ; Td0[s1], t1
436|| EXTU $s[2],EXT2,24,$Td2[2]
437|| EXTU $s[3],EXT2,24,$Td2[3]
438 LDBU *${TEA}[$Td2[2]],$Td2[2] ; Td2[s2>>16], t0
439|| LDBU *${TEB}[$Td2[3]],$Td2[3] ; Td2[s3>>16], t1
440|| EXTU $s[3],EXT1,24,$Td1[3]
441|| EXTU $s[2],EXT3,24,$Td3[2]
442 LDBU *${TEB}[$Td1[3]],$Td1[3] ; Td1[s3>>8], t0
443|| LDBU *${TEA}[$Td3[2]],$Td3[2] ; Td3[s2>>24], t1
444|| EXTU $s[1],EXT1,24,$Td1[1]
445|| EXTU $s[0],EXT3,24,$Td3[0]
446 LDBU *${TEB}[$Td1[1]],$Td1[1] ; Td1[s1>>8], t2
447|| LDBU *${TEA}[$Td3[0]],$Td3[0] ; Td3[s0>>24], t3
448|| EXTU $s[0],EXT2,24,$Td2[0]
449|| EXTU $s[1],EXT2,24,$Td2[1]
450 LDBU *${TEA}[$Td2[0]],$Td2[0] ; Td2[s0>>16], t2
451|| LDBU *${TEB}[$Td2[1]],$Td2[1] ; Td2[s1>>16], t3
452|| EXTU $s[3],EXT3,24,$Td3[3]
453|| EXTU $s[2],EXT1,24,$Td1[2]
454 LDBU *${TEB}[$Td3[3]],$Td3[3] ; Td3[s3>>24], t2
455|| LDBU *${TEA}[$Td1[2]],$Td1[2] ; Td1[s2>>8], t3
456|| EXTU $s[2],EXT0,24,$Td0[2]
457|| EXTU $s[3],EXT0,24,$Td0[3]
458 LDBU *${TEA}[$Td0[2]],$Td0[2] ; Td0[s2], t2
459|| LDBU *${TEB}[$Td0[3]],$Td0[3] ; Td0[s3], t3
460
461 .if .BIG_ENDIAN
462 PACK2 $Td0[0],$Td1[3],$Td0[0]
463|| PACK2 $Td0[1],$Td1[0],$Td0[1]
464 PACK2 $Td2[2],$Td3[1],$Td2[2]
465|| PACK2 $Td2[3],$Td3[2],$Td2[3]
466 PACKL4 $Td0[0],$Td2[2],$Td0[0]
467|| PACKL4 $Td0[1],$Td2[3],$Td0[1]
468 XOR $K[0],$Td0[0],$Td0[0] ; s[0]
469|| XOR $K[1],$Td0[1],$Td0[1] ; s[1]
470
471 PACK2 $Td0[2],$Td1[1],$Td0[2]
472|| PACK2 $Td0[3],$Td1[2],$Td0[3]
473 PACK2 $Td2[0],$Td3[3],$Td2[0]
474|| PACK2 $Td2[1],$Td3[0],$Td2[1]
475|| BNOP RA
476 PACKL4 $Td0[2],$Td2[0],$Td0[2]
477|| PACKL4 $Td0[3],$Td2[1],$Td0[3]
478 XOR $K[2],$Td0[2],$Td0[2] ; s[2]
479|| XOR $K[3],$Td0[3],$Td0[3] ; s[3]
480
481 MV $Td0[0],A9
482|| MV $Td0[1],A8
483 MV $Td0[2],B9
484|| MV $Td0[3],B8
485|| [B2] STNDW A9:A8,*OUT++
486 [B2] STNDW B9:B8,*OUT++
487 .else
488 PACK2 $Td1[3],$Td0[0],$Td1[3]
489|| PACK2 $Td1[0],$Td0[1],$Td1[0]
490 PACK2 $Td3[1],$Td2[2],$Td3[1]
491|| PACK2 $Td3[2],$Td2[3],$Td3[2]
492 PACKL4 $Td3[1],$Td1[3],$Td1[3]
493|| PACKL4 $Td3[2],$Td1[0],$Td1[0]
494 XOR $K[0],$Td1[3],$Td1[3] ; s[0]
495|| XOR $K[1],$Td1[0],$Td1[0] ; s[1]
496
497 PACK2 $Td1[1],$Td0[2],$Td1[1]
498|| PACK2 $Td1[2],$Td0[3],$Td1[2]
499 PACK2 $Td3[3],$Td2[0],$Td3[3]
500|| PACK2 $Td3[0],$Td2[1],$Td3[0]
501|| BNOP RA
502 PACKL4 $Td3[3],$Td1[1],$Td1[1]
503|| PACKL4 $Td3[0],$Td1[2],$Td1[2]
504 XOR $K[2],$Td1[1],$Td1[1] ; s[2]
505|| XOR $K[3],$Td1[2],$Td1[2] ; s[3]
506
507 MV $Td1[3],A8
508|| MV $Td1[0],A9
509 MV $Td1[1],B8
510|| MV $Td1[2],B9
511|| [B2] STNDW A9:A8,*OUT++
512 [B2] STNDW B9:B8,*OUT++
513 .endif
514 .endasmfunc
515___
516{
517my @K=(@K,@s); # extended key
518my @Te4=map("B$_",(16..19));
519
520my @Kx9=@Te0; # used in AES_set_decrypt_key
521my @KxB=@Te1;
522my @KxD=@Te2;
523my @KxE=@Te3;
524
525$code.=<<___;
526 .asg OUT,BITS
527
528 .global _AES_set_encrypt_key
529_AES_set_encrypt_key:
530__set_encrypt_key:
531 .asmfunc
532 MV INP,A0
533|| SHRU BITS,5,BITS ; 128-192-256 -> 4-6-8
534|| MV KEY,A1
535 [!A0] B RA
536||[!A0] MVK -1,RET
537||[!A0] MVK 1,A1 ; only one B RA
538 [!A1] B RA
539||[!A1] MVK -1,RET
540||[!A1] MVK 0,A0
541|| MVK 0,B0
542|| MVK 0,A1
543 [A0] LDNDW *INP++,A9:A8
544|| [A0] CMPEQ 4,BITS,B0
545|| [A0] CMPLT 3,BITS,A1
546 [B0] B key128?
547|| [A1] LDNDW *INP++,B9:B8
548|| [A0] CMPEQ 6,BITS,B0
549|| [A0] CMPLT 5,BITS,A1
550 [B0] B key192?
551|| [A1] LDNDW *INP++,B17:B16
552|| [A0] CMPEQ 8,BITS,B0
553|| [A0] CMPLT 7,BITS,A1
554 [B0] B key256?
555|| [A1] LDNDW *INP++,B19:B18
556
557 .if __TI_EABI__
558 [A0] ADD 0,KEY,$KPA
559|| [A0] ADD 4,KEY,$KPB
bd227733
AP
560|| [A0] MVKL \$PCR_OFFSET(AES_Te4,__set_encrypt_key),$TEA
561|| [A0] ADDKPC __set_encrypt_key,B6
562 [A0] MVKH \$PCR_OFFSET(AES_Te4,__set_encrypt_key),$TEA
3e181369
AP
563 [A0] ADD B6,$TEA,$TEA ; AES_Te4
564 .else
565 [A0] ADD 0,KEY,$KPA
566|| [A0] ADD 4,KEY,$KPB
bd227733
AP
567|| [A0] MVKL (AES_Te4-__set_encrypt_key),$TEA
568|| [A0] ADDKPC __set_encrypt_key,B6
569 [A0] MVKH (AES_Te4-__set_encrypt_key),$TEA
3e181369
AP
570 [A0] ADD B6,$TEA,$TEA ; AES_Te4
571 .endif
572 NOP
573 NOP
574
575 BNOP RA,5
0d4fb843 576|| MVK -2,RET ; unknown bit length
3e181369
AP
577|| MVK 0,B0 ; redundant
578;;====================================================================
579;;====================================================================
580key128?:
581 .if .BIG_ENDIAN
582 MV A9,$K[0]
583|| MV A8,$K[1]
584|| MV B9,$Te4[2]
585|| MV B8,$K[3]
586 .else
587 MV A8,$K[0]
588|| MV A9,$K[1]
589|| MV B8,$Te4[2]
590|| MV B9,$K[3]
591 .endif
592
593 MVK 256,A0
594|| MVK 9,B0
595
596 SPLOOPD 14
597|| MVC B0,ILC
598|| MV $TEA,$TEB
599|| ADD $TEA,A0,A30 ; rcon
600;;====================================================================
601 LDW *A30++[1],A31 ; rcon[i]
602|| MV $Te4[2],$K[2]
603|| EXTU $K[3],EXT1,24,$Te4[0]
604 LDBU *${TEB}[$Te4[0]],$Te4[0]
605|| MV $K[3],A0
606|| EXTU $K[3],EXT2,24,$Te4[1]
607 LDBU *${TEB}[$Te4[1]],$Te4[1]
608|| EXTU A0,EXT3,24,A0
609|| EXTU $K[3],EXT0,24,$Te4[3]
610 .if .BIG_ENDIAN
611 LDBU *${TEA}[A0],$Te4[3]
612|| LDBU *${TEB}[$Te4[3]],A0
613 .else
614 LDBU *${TEA}[A0],A0
615|| LDBU *${TEB}[$Te4[3]],$Te4[3]
616 .endif
617
618 STW $K[0],*$KPA++[2]
619|| STW $K[1],*$KPB++[2]
620 STW $K[2],*$KPA++[2]
621|| STW $K[3],*$KPB++[2]
622
623 XOR A31,$K[0],$K[0] ; ^=rcon[i]
624 .if .BIG_ENDIAN
625 PACK2 $Te4[0],$Te4[1],$Te4[1]
626 PACK2 $Te4[3],A0,$Te4[3]
627 PACKL4 $Te4[1],$Te4[3],$Te4[3]
628 .else
629 PACK2 $Te4[1],$Te4[0],$Te4[1]
630 PACK2 $Te4[3],A0,$Te4[3]
631 PACKL4 $Te4[3],$Te4[1],$Te4[3]
632 .endif
633 XOR $Te4[3],$K[0],$Te4[0] ; K[0]
634 XOR $Te4[0],$K[1],$K[1] ; K[1]
635 MV $Te4[0],$K[0]
636|| XOR $K[1],$K[2],$Te4[2] ; K[2]
637 XOR $Te4[2],$K[3],$K[3] ; K[3]
638 SPKERNEL
639;;====================================================================
640 BNOP RA
641 MV $Te4[2],$K[2]
642|| STW $K[0],*$KPA++[2]
643|| STW $K[1],*$KPB++[2]
644 STW $K[2],*$KPA++[2]
645|| STW $K[3],*$KPB++[2]
646 MVK 10,B0 ; rounds
647 STW B0,*++${KPB}[15]
648 MVK 0,RET
649;;====================================================================
650;;====================================================================
651key192?:
652 .if .BIG_ENDIAN
653 MV A9,$K[0]
654|| MV A8,$K[1]
655|| MV B9,$K[2]
656|| MV B8,$K[3]
657 MV B17,$Te4[2]
658|| MV B16,$K[5]
659 .else
660 MV A8,$K[0]
661|| MV A9,$K[1]
662|| MV B8,$K[2]
663|| MV B9,$K[3]
664 MV B16,$Te4[2]
665|| MV B17,$K[5]
666 .endif
667
668 MVK 256,A0
669|| MVK 6,B0
670 MV $TEA,$TEB
671|| ADD $TEA,A0,A30 ; rcon
672;;====================================================================
673loop192?:
674 LDW *A30++[1],A31 ; rcon[i]
675|| MV $Te4[2],$K[4]
676|| EXTU $K[5],EXT1,24,$Te4[0]
677 LDBU *${TEB}[$Te4[0]],$Te4[0]
678|| MV $K[5],A0
679|| EXTU $K[5],EXT2,24,$Te4[1]
680 LDBU *${TEB}[$Te4[1]],$Te4[1]
681|| EXTU A0,EXT3,24,A0
682|| EXTU $K[5],EXT0,24,$Te4[3]
683 .if .BIG_ENDIAN
684 LDBU *${TEA}[A0],$Te4[3]
685|| LDBU *${TEB}[$Te4[3]],A0
686 .else
687 LDBU *${TEA}[A0],A0
688|| LDBU *${TEB}[$Te4[3]],$Te4[3]
689 .endif
690
691 STW $K[0],*$KPA++[2]
692|| STW $K[1],*$KPB++[2]
693 STW $K[2],*$KPA++[2]
694|| STW $K[3],*$KPB++[2]
695 STW $K[4],*$KPA++[2]
696|| STW $K[5],*$KPB++[2]
697
698 XOR A31,$K[0],$K[0] ; ^=rcon[i]
699 .if .BIG_ENDIAN
700 PACK2 $Te4[0],$Te4[1],$Te4[1]
701|| PACK2 $Te4[3],A0,$Te4[3]
702 PACKL4 $Te4[1],$Te4[3],$Te4[3]
703 .else
704 PACK2 $Te4[1],$Te4[0],$Te4[1]
705|| PACK2 $Te4[3],A0,$Te4[3]
706 PACKL4 $Te4[3],$Te4[1],$Te4[3]
707 .endif
708 BDEC loop192?,B0
709|| XOR $Te4[3],$K[0],$Te4[0] ; K[0]
710 XOR $Te4[0],$K[1],$K[1] ; K[1]
711 MV $Te4[0],$K[0]
712|| XOR $K[1],$K[2],$Te4[2] ; K[2]
713 XOR $Te4[2],$K[3],$K[3] ; K[3]
714 MV $Te4[2],$K[2]
715|| XOR $K[3],$K[4],$Te4[2] ; K[4]
716 XOR $Te4[2],$K[5],$K[5] ; K[5]
717;;====================================================================
718 BNOP RA
719 STW $K[0],*$KPA++[2]
720|| STW $K[1],*$KPB++[2]
721 STW $K[2],*$KPA++[2]
722|| STW $K[3],*$KPB++[2]
723 MVK 12,B0 ; rounds
724 STW B0,*++${KPB}[7]
725 MVK 0,RET
726;;====================================================================
727;;====================================================================
728key256?:
729 .if .BIG_ENDIAN
730 MV A9,$K[0]
731|| MV A8,$K[1]
732|| MV B9,$K[2]
733|| MV B8,$K[3]
734 MV B17,$K[4]
735|| MV B16,$K[5]
736|| MV B19,$Te4[2]
737|| MV B18,$K[7]
738 .else
739 MV A8,$K[0]
740|| MV A9,$K[1]
741|| MV B8,$K[2]
742|| MV B9,$K[3]
743 MV B16,$K[4]
744|| MV B17,$K[5]
745|| MV B18,$Te4[2]
746|| MV B19,$K[7]
747 .endif
748
749 MVK 256,A0
750|| MVK 6,B0
751 MV $TEA,$TEB
752|| ADD $TEA,A0,A30 ; rcon
753;;====================================================================
754loop256?:
755 LDW *A30++[1],A31 ; rcon[i]
756|| MV $Te4[2],$K[6]
757|| EXTU $K[7],EXT1,24,$Te4[0]
758 LDBU *${TEB}[$Te4[0]],$Te4[0]
759|| MV $K[7],A0
760|| EXTU $K[7],EXT2,24,$Te4[1]
761 LDBU *${TEB}[$Te4[1]],$Te4[1]
762|| EXTU A0,EXT3,24,A0
763|| EXTU $K[7],EXT0,24,$Te4[3]
764 .if .BIG_ENDIAN
765 LDBU *${TEA}[A0],$Te4[3]
766|| LDBU *${TEB}[$Te4[3]],A0
767 .else
768 LDBU *${TEA}[A0],A0
769|| LDBU *${TEB}[$Te4[3]],$Te4[3]
770 .endif
771
772 STW $K[0],*$KPA++[2]
773|| STW $K[1],*$KPB++[2]
774 STW $K[2],*$KPA++[2]
775|| STW $K[3],*$KPB++[2]
776 STW $K[4],*$KPA++[2]
777|| STW $K[5],*$KPB++[2]
778 STW $K[6],*$KPA++[2]
779|| STW $K[7],*$KPB++[2]
780|| XOR A31,$K[0],$K[0] ; ^=rcon[i]
781 .if .BIG_ENDIAN
782 PACK2 $Te4[0],$Te4[1],$Te4[1]
783|| PACK2 $Te4[3],A0,$Te4[3]
784 PACKL4 $Te4[1],$Te4[3],$Te4[3]
785||[!B0] B done256?
786 .else
787 PACK2 $Te4[1],$Te4[0],$Te4[1]
788|| PACK2 $Te4[3],A0,$Te4[3]
789 PACKL4 $Te4[3],$Te4[1],$Te4[3]
790||[!B0] B done256?
791 .endif
792 XOR $Te4[3],$K[0],$Te4[0] ; K[0]
793 XOR $Te4[0],$K[1],$K[1] ; K[1]
794 MV $Te4[0],$K[0]
795|| XOR $K[1],$K[2],$Te4[2] ; K[2]
796 XOR $Te4[2],$K[3],$K[3] ; K[3]
797
798 MV $Te4[2],$K[2]
799|| [B0] EXTU $K[3],EXT0,24,$Te4[0]
800|| [B0] SUB B0,1,B0
801 LDBU *${TEB}[$Te4[0]],$Te4[0]
802|| MV $K[3],A0
803|| EXTU $K[3],EXT1,24,$Te4[1]
804 LDBU *${TEB}[$Te4[1]],$Te4[1]
805|| EXTU A0,EXT2,24,A0
806|| EXTU $K[3],EXT3,24,$Te4[3]
807
808 .if .BIG_ENDIAN
809 LDBU *${TEA}[A0],$Te4[3]
810|| LDBU *${TEB}[$Te4[3]],A0
811 NOP 3
812 PACK2 $Te4[0],$Te4[1],$Te4[1]
813 PACK2 $Te4[3],A0,$Te4[3]
814|| B loop256?
815 PACKL4 $Te4[1],$Te4[3],$Te4[3]
816 .else
817 LDBU *${TEA}[A0],A0
818|| LDBU *${TEB}[$Te4[3]],$Te4[3]
819 NOP 3
820 PACK2 $Te4[1],$Te4[0],$Te4[1]
821 PACK2 $Te4[3],A0,$Te4[3]
822|| B loop256?
823 PACKL4 $Te4[3],$Te4[1],$Te4[3]
824 .endif
825
826 XOR $Te4[3],$K[4],$Te4[0] ; K[4]
827 XOR $Te4[0],$K[5],$K[5] ; K[5]
828 MV $Te4[0],$K[4]
829|| XOR $K[5],$K[6],$Te4[2] ; K[6]
830 XOR $Te4[2],$K[7],$K[7] ; K[7]
831;;====================================================================
832done256?:
833 BNOP RA
834 STW $K[0],*$KPA++[2]
835|| STW $K[1],*$KPB++[2]
836 STW $K[2],*$KPA++[2]
837|| STW $K[3],*$KPB++[2]
838 MVK 14,B0 ; rounds
839 STW B0,*--${KPB}[1]
840 MVK 0,RET
841 .endasmfunc
842
843 .global _AES_set_decrypt_key
844_AES_set_decrypt_key:
845 .asmfunc
846 B __set_encrypt_key ; guarantee local call
847 MV KEY,B30 ; B30 is not modified
848 MV RA, B31 ; B31 is not modified
849 ADDKPC ret?,RA,2
850ret?: ; B0 holds rounds or zero
851 [!B0] BNOP B31 ; return if zero
852 [B0] SHL B0,4,A0 ; offset to last round key
853 [B0] SHRU B0,1,B1
854 [B0] SUB B1,1,B1
855 [B0] MVK 0x0000001B,B3 ; AES polynomial
856 [B0] MVKH 0x07000000,B3
857
858 SPLOOPD 9 ; flip round keys
859|| MVC B1,ILC
860|| MV B30,$KPA
861|| ADD B30,A0,$KPB
862|| MVK 16,A0 ; sizeof(round key)
863;;====================================================================
864 LDW *${KPA}[0],A16
865|| LDW *${KPB}[0],B16
866 LDW *${KPA}[1],A17
867|| LDW *${KPB}[1],B17
868 LDW *${KPA}[2],A18
869|| LDW *${KPB}[2],B18
870 LDW *${KPA}[3],A19
871|| ADD $KPA,A0,$KPA
872|| LDW *${KPB}[3],B19
873|| SUB $KPB,A0,$KPB
874 NOP
875 STW B16,*${KPA}[-4]
876|| STW A16,*${KPB}[4]
877 STW B17,*${KPA}[-3]
878|| STW A17,*${KPB}[5]
879 STW B18,*${KPA}[-2]
880|| STW A18,*${KPB}[6]
881 STW B19,*${KPA}[-1]
882|| STW A19,*${KPB}[7]
883 SPKERNEL
884;;====================================================================
885 SUB B0,1,B0 ; skip last round
886|| ADD B30,A0,$KPA ; skip first round
887|| ADD B30,A0,$KPB
888|| MVC GFPGFR,B30 ; save GFPGFR
889 LDW *${KPA}[0],$K[0]
890|| LDW *${KPB}[1],$K[1]
891|| MVC B3,GFPGFR
892 LDW *${KPA}[2],$K[2]
893|| LDW *${KPB}[3],$K[3]
894 MVK 0x00000909,A24
895|| MVK 0x00000B0B,B24
896 MVKH 0x09090000,A24
897|| MVKH 0x0B0B0000,B24
898 MVC B0,ILC
899|| SUB B0,1,B0
900
053fa39a 901 GMPY4 $K[0],A24,$Kx9[0] ; ·0x09
3e181369
AP
902|| GMPY4 $K[1],A24,$Kx9[1]
903|| MVK 0x00000D0D,A25
904|| MVK 0x00000E0E,B25
905 GMPY4 $K[2],A24,$Kx9[2]
906|| GMPY4 $K[3],A24,$Kx9[3]
907|| MVKH 0x0D0D0000,A25
908|| MVKH 0x0E0E0000,B25
909
053fa39a 910 GMPY4 $K[0],B24,$KxB[0] ; ·0x0B
3e181369
AP
911|| GMPY4 $K[1],B24,$KxB[1]
912 GMPY4 $K[2],B24,$KxB[2]
913|| GMPY4 $K[3],B24,$KxB[3]
914
915 SPLOOP 11 ; InvMixColumns
916;;====================================================================
053fa39a 917 GMPY4 $K[0],A25,$KxD[0] ; ·0x0D
3e181369
AP
918|| GMPY4 $K[1],A25,$KxD[1]
919|| SWAP2 $Kx9[0],$Kx9[0] ; rotate by 16
920|| SWAP2 $Kx9[1],$Kx9[1]
921|| MV $K[0],$s[0] ; this or DINT
922|| MV $K[1],$s[1]
923|| [B0] LDW *${KPA}[4],$K[0]
924|| [B0] LDW *${KPB}[5],$K[1]
925 GMPY4 $K[2],A25,$KxD[2]
926|| GMPY4 $K[3],A25,$KxD[3]
927|| SWAP2 $Kx9[2],$Kx9[2]
928|| SWAP2 $Kx9[3],$Kx9[3]
929|| MV $K[2],$s[2]
930|| MV $K[3],$s[3]
931|| [B0] LDW *${KPA}[6],$K[2]
932|| [B0] LDW *${KPB}[7],$K[3]
933
053fa39a 934 GMPY4 $s[0],B25,$KxE[0] ; ·0x0E
3e181369
AP
935|| GMPY4 $s[1],B25,$KxE[1]
936|| XOR $Kx9[0],$KxB[0],$KxB[0]
937|| XOR $Kx9[1],$KxB[1],$KxB[1]
938 GMPY4 $s[2],B25,$KxE[2]
939|| GMPY4 $s[3],B25,$KxE[3]
940|| XOR $Kx9[2],$KxB[2],$KxB[2]
941|| XOR $Kx9[3],$KxB[3],$KxB[3]
942
943 ROTL $KxB[0],TBL3,$KxB[0]
944|| ROTL $KxB[1],TBL3,$KxB[1]
945|| SWAP2 $KxD[0],$KxD[0] ; rotate by 16
946|| SWAP2 $KxD[1],$KxD[1]
947 ROTL $KxB[2],TBL3,$KxB[2]
948|| ROTL $KxB[3],TBL3,$KxB[3]
949|| SWAP2 $KxD[2],$KxD[2]
950|| SWAP2 $KxD[3],$KxD[3]
951
952 XOR $KxE[0],$KxD[0],$KxE[0]
953|| XOR $KxE[1],$KxD[1],$KxE[1]
053fa39a 954|| [B0] GMPY4 $K[0],A24,$Kx9[0] ; ·0x09
3e181369
AP
955|| [B0] GMPY4 $K[1],A24,$Kx9[1]
956|| ADDAW $KPA,4,$KPA
957 XOR $KxE[2],$KxD[2],$KxE[2]
958|| XOR $KxE[3],$KxD[3],$KxE[3]
959|| [B0] GMPY4 $K[2],A24,$Kx9[2]
960|| [B0] GMPY4 $K[3],A24,$Kx9[3]
961|| ADDAW $KPB,4,$KPB
962
963 XOR $KxB[0],$KxE[0],$KxE[0]
964|| XOR $KxB[1],$KxE[1],$KxE[1]
053fa39a 965|| [B0] GMPY4 $K[0],B24,$KxB[0] ; ·0x0B
3e181369
AP
966|| [B0] GMPY4 $K[1],B24,$KxB[1]
967 XOR $KxB[2],$KxE[2],$KxE[2]
968|| XOR $KxB[3],$KxE[3],$KxE[3]
969|| [B0] GMPY4 $K[2],B24,$KxB[2]
970|| [B0] GMPY4 $K[3],B24,$KxB[3]
971|| STW $KxE[0],*${KPA}[-4]
972|| STW $KxE[1],*${KPB}[-3]
973 STW $KxE[2],*${KPA}[-2]
974|| STW $KxE[3],*${KPB}[-1]
975|| [B0] SUB B0,1,B0
976 SPKERNEL
977;;====================================================================
978 BNOP B31,3
979 MVC B30,GFPGFR ; restore GFPGFR(*)
980 MVK 0,RET
981 .endasmfunc
982___
983# (*) Even though ABI doesn't specify GFPGFR as non-volatile, there
984# are code samples out there that *assume* its default value.
985}
986{
987my ($inp,$out,$blocks,$key,$ivp)=("A4","B4","A6","B6","A8");
988$code.=<<___;
989 .global _AES_ctr32_encrypt
990_AES_ctr32_encrypt:
991 .asmfunc
992 LDNDW *${ivp}[0],A31:A30 ; load counter value
993|| MV $blocks,A2 ; reassign $blocks
994|| DMV RA,$key,B27:B26 ; reassign RA and $key
995 LDNDW *${ivp}[1],B31:B30
996|| MVK 0,B2 ; don't let __encrypt load input
997|| MVK 0,A1 ; and postpone writing output
998 .if .BIG_ENDIAN
999 NOP
1000 .else
1001 NOP 4
1002 SWAP2 B31,B31 ; keep least significant 32 bits
1003 SWAP4 B31,B31 ; in host byte order
1004 .endif
1005ctr32_loop?:
1006 [A2] BNOP __encrypt
1007|| [A1] XOR A29,A9,A9 ; input^Ek(counter)
1008|| [A1] XOR A28,A8,A8
1009|| [A2] LDNDW *INP++,A29:A28 ; load input
1010 [!A2] BNOP B27 ; return
1011|| [A1] XOR B29,B9,B9
1012|| [A1] XOR B28,B8,B8
1013|| [A2] LDNDW *INP++,B29:B28
1014 .if .BIG_ENDIAN
1015 [A1] STNDW A9:A8,*OUT++ ; save output
1016|| [A2] DMV A31,A30,A9:A8 ; pass counter value to __encrypt
1017 [A1] STNDW B9:B8,*OUT++
1018|| [A2] DMV B31,B30,B9:B8
1019|| [A2] ADD B30,1,B30 ; counter++
1020 .else
1021 [A1] STNDW A9:A8,*OUT++ ; save output
1022|| [A2] DMV A31,A30,A9:A8
1023|| [A2] SWAP2 B31,B0
1024|| [A2] ADD B31,1,B31 ; counter++
1025 [A1] STNDW B9:B8,*OUT++
1026|| [A2] MV B30,B8
1027|| [A2] SWAP4 B0,B9
1028 .endif
1029 [A2] ADDKPC ctr32_loop?,RA ; return to ctr32_loop?
1030|| [A2] MV B26,KEY ; pass $key
1031|| [A2] SUB A2,1,A2 ; $blocks--
1032||[!A1] MVK 1,A1
1033 NOP
1034 NOP
1035 .endasmfunc
1036___
1037}
1038# Tables are kept in endian-neutral manner
1039$code.=<<___;
904732f6
AP
1040 .if __TI_EABI__
1041 .sect ".text:aes_asm.const"
1042 .else
3e181369 1043 .sect ".const:aes_asm"
904732f6 1044 .endif
3e181369
AP
1045 .align 128
1046AES_Te:
1047 .byte 0xc6,0x63,0x63,0xa5, 0xf8,0x7c,0x7c,0x84
1048 .byte 0xee,0x77,0x77,0x99, 0xf6,0x7b,0x7b,0x8d
1049 .byte 0xff,0xf2,0xf2,0x0d, 0xd6,0x6b,0x6b,0xbd
1050 .byte 0xde,0x6f,0x6f,0xb1, 0x91,0xc5,0xc5,0x54
1051 .byte 0x60,0x30,0x30,0x50, 0x02,0x01,0x01,0x03
1052 .byte 0xce,0x67,0x67,0xa9, 0x56,0x2b,0x2b,0x7d
1053 .byte 0xe7,0xfe,0xfe,0x19, 0xb5,0xd7,0xd7,0x62
1054 .byte 0x4d,0xab,0xab,0xe6, 0xec,0x76,0x76,0x9a
1055 .byte 0x8f,0xca,0xca,0x45, 0x1f,0x82,0x82,0x9d
1056 .byte 0x89,0xc9,0xc9,0x40, 0xfa,0x7d,0x7d,0x87
1057 .byte 0xef,0xfa,0xfa,0x15, 0xb2,0x59,0x59,0xeb
1058 .byte 0x8e,0x47,0x47,0xc9, 0xfb,0xf0,0xf0,0x0b
1059 .byte 0x41,0xad,0xad,0xec, 0xb3,0xd4,0xd4,0x67
1060 .byte 0x5f,0xa2,0xa2,0xfd, 0x45,0xaf,0xaf,0xea
1061 .byte 0x23,0x9c,0x9c,0xbf, 0x53,0xa4,0xa4,0xf7
1062 .byte 0xe4,0x72,0x72,0x96, 0x9b,0xc0,0xc0,0x5b
1063 .byte 0x75,0xb7,0xb7,0xc2, 0xe1,0xfd,0xfd,0x1c
1064 .byte 0x3d,0x93,0x93,0xae, 0x4c,0x26,0x26,0x6a
1065 .byte 0x6c,0x36,0x36,0x5a, 0x7e,0x3f,0x3f,0x41
1066 .byte 0xf5,0xf7,0xf7,0x02, 0x83,0xcc,0xcc,0x4f
1067 .byte 0x68,0x34,0x34,0x5c, 0x51,0xa5,0xa5,0xf4
1068 .byte 0xd1,0xe5,0xe5,0x34, 0xf9,0xf1,0xf1,0x08
1069 .byte 0xe2,0x71,0x71,0x93, 0xab,0xd8,0xd8,0x73
1070 .byte 0x62,0x31,0x31,0x53, 0x2a,0x15,0x15,0x3f
1071 .byte 0x08,0x04,0x04,0x0c, 0x95,0xc7,0xc7,0x52
1072 .byte 0x46,0x23,0x23,0x65, 0x9d,0xc3,0xc3,0x5e
1073 .byte 0x30,0x18,0x18,0x28, 0x37,0x96,0x96,0xa1
1074 .byte 0x0a,0x05,0x05,0x0f, 0x2f,0x9a,0x9a,0xb5
1075 .byte 0x0e,0x07,0x07,0x09, 0x24,0x12,0x12,0x36
1076 .byte 0x1b,0x80,0x80,0x9b, 0xdf,0xe2,0xe2,0x3d
1077 .byte 0xcd,0xeb,0xeb,0x26, 0x4e,0x27,0x27,0x69
1078 .byte 0x7f,0xb2,0xb2,0xcd, 0xea,0x75,0x75,0x9f
1079 .byte 0x12,0x09,0x09,0x1b, 0x1d,0x83,0x83,0x9e
1080 .byte 0x58,0x2c,0x2c,0x74, 0x34,0x1a,0x1a,0x2e
1081 .byte 0x36,0x1b,0x1b,0x2d, 0xdc,0x6e,0x6e,0xb2
1082 .byte 0xb4,0x5a,0x5a,0xee, 0x5b,0xa0,0xa0,0xfb
1083 .byte 0xa4,0x52,0x52,0xf6, 0x76,0x3b,0x3b,0x4d
1084 .byte 0xb7,0xd6,0xd6,0x61, 0x7d,0xb3,0xb3,0xce
1085 .byte 0x52,0x29,0x29,0x7b, 0xdd,0xe3,0xe3,0x3e
1086 .byte 0x5e,0x2f,0x2f,0x71, 0x13,0x84,0x84,0x97
1087 .byte 0xa6,0x53,0x53,0xf5, 0xb9,0xd1,0xd1,0x68
1088 .byte 0x00,0x00,0x00,0x00, 0xc1,0xed,0xed,0x2c
1089 .byte 0x40,0x20,0x20,0x60, 0xe3,0xfc,0xfc,0x1f
1090 .byte 0x79,0xb1,0xb1,0xc8, 0xb6,0x5b,0x5b,0xed
1091 .byte 0xd4,0x6a,0x6a,0xbe, 0x8d,0xcb,0xcb,0x46
1092 .byte 0x67,0xbe,0xbe,0xd9, 0x72,0x39,0x39,0x4b
1093 .byte 0x94,0x4a,0x4a,0xde, 0x98,0x4c,0x4c,0xd4
1094 .byte 0xb0,0x58,0x58,0xe8, 0x85,0xcf,0xcf,0x4a
1095 .byte 0xbb,0xd0,0xd0,0x6b, 0xc5,0xef,0xef,0x2a
1096 .byte 0x4f,0xaa,0xaa,0xe5, 0xed,0xfb,0xfb,0x16
1097 .byte 0x86,0x43,0x43,0xc5, 0x9a,0x4d,0x4d,0xd7
1098 .byte 0x66,0x33,0x33,0x55, 0x11,0x85,0x85,0x94
1099 .byte 0x8a,0x45,0x45,0xcf, 0xe9,0xf9,0xf9,0x10
1100 .byte 0x04,0x02,0x02,0x06, 0xfe,0x7f,0x7f,0x81
1101 .byte 0xa0,0x50,0x50,0xf0, 0x78,0x3c,0x3c,0x44
1102 .byte 0x25,0x9f,0x9f,0xba, 0x4b,0xa8,0xa8,0xe3
1103 .byte 0xa2,0x51,0x51,0xf3, 0x5d,0xa3,0xa3,0xfe
1104 .byte 0x80,0x40,0x40,0xc0, 0x05,0x8f,0x8f,0x8a
1105 .byte 0x3f,0x92,0x92,0xad, 0x21,0x9d,0x9d,0xbc
1106 .byte 0x70,0x38,0x38,0x48, 0xf1,0xf5,0xf5,0x04
1107 .byte 0x63,0xbc,0xbc,0xdf, 0x77,0xb6,0xb6,0xc1
1108 .byte 0xaf,0xda,0xda,0x75, 0x42,0x21,0x21,0x63
1109 .byte 0x20,0x10,0x10,0x30, 0xe5,0xff,0xff,0x1a
1110 .byte 0xfd,0xf3,0xf3,0x0e, 0xbf,0xd2,0xd2,0x6d
1111 .byte 0x81,0xcd,0xcd,0x4c, 0x18,0x0c,0x0c,0x14
1112 .byte 0x26,0x13,0x13,0x35, 0xc3,0xec,0xec,0x2f
1113 .byte 0xbe,0x5f,0x5f,0xe1, 0x35,0x97,0x97,0xa2
1114 .byte 0x88,0x44,0x44,0xcc, 0x2e,0x17,0x17,0x39
1115 .byte 0x93,0xc4,0xc4,0x57, 0x55,0xa7,0xa7,0xf2
1116 .byte 0xfc,0x7e,0x7e,0x82, 0x7a,0x3d,0x3d,0x47
1117 .byte 0xc8,0x64,0x64,0xac, 0xba,0x5d,0x5d,0xe7
1118 .byte 0x32,0x19,0x19,0x2b, 0xe6,0x73,0x73,0x95
1119 .byte 0xc0,0x60,0x60,0xa0, 0x19,0x81,0x81,0x98
1120 .byte 0x9e,0x4f,0x4f,0xd1, 0xa3,0xdc,0xdc,0x7f
1121 .byte 0x44,0x22,0x22,0x66, 0x54,0x2a,0x2a,0x7e
1122 .byte 0x3b,0x90,0x90,0xab, 0x0b,0x88,0x88,0x83
1123 .byte 0x8c,0x46,0x46,0xca, 0xc7,0xee,0xee,0x29
1124 .byte 0x6b,0xb8,0xb8,0xd3, 0x28,0x14,0x14,0x3c
1125 .byte 0xa7,0xde,0xde,0x79, 0xbc,0x5e,0x5e,0xe2
1126 .byte 0x16,0x0b,0x0b,0x1d, 0xad,0xdb,0xdb,0x76
1127 .byte 0xdb,0xe0,0xe0,0x3b, 0x64,0x32,0x32,0x56
1128 .byte 0x74,0x3a,0x3a,0x4e, 0x14,0x0a,0x0a,0x1e
1129 .byte 0x92,0x49,0x49,0xdb, 0x0c,0x06,0x06,0x0a
1130 .byte 0x48,0x24,0x24,0x6c, 0xb8,0x5c,0x5c,0xe4
1131 .byte 0x9f,0xc2,0xc2,0x5d, 0xbd,0xd3,0xd3,0x6e
1132 .byte 0x43,0xac,0xac,0xef, 0xc4,0x62,0x62,0xa6
1133 .byte 0x39,0x91,0x91,0xa8, 0x31,0x95,0x95,0xa4
1134 .byte 0xd3,0xe4,0xe4,0x37, 0xf2,0x79,0x79,0x8b
1135 .byte 0xd5,0xe7,0xe7,0x32, 0x8b,0xc8,0xc8,0x43
1136 .byte 0x6e,0x37,0x37,0x59, 0xda,0x6d,0x6d,0xb7
1137 .byte 0x01,0x8d,0x8d,0x8c, 0xb1,0xd5,0xd5,0x64
1138 .byte 0x9c,0x4e,0x4e,0xd2, 0x49,0xa9,0xa9,0xe0
1139 .byte 0xd8,0x6c,0x6c,0xb4, 0xac,0x56,0x56,0xfa
1140 .byte 0xf3,0xf4,0xf4,0x07, 0xcf,0xea,0xea,0x25
1141 .byte 0xca,0x65,0x65,0xaf, 0xf4,0x7a,0x7a,0x8e
1142 .byte 0x47,0xae,0xae,0xe9, 0x10,0x08,0x08,0x18
1143 .byte 0x6f,0xba,0xba,0xd5, 0xf0,0x78,0x78,0x88
1144 .byte 0x4a,0x25,0x25,0x6f, 0x5c,0x2e,0x2e,0x72
1145 .byte 0x38,0x1c,0x1c,0x24, 0x57,0xa6,0xa6,0xf1
1146 .byte 0x73,0xb4,0xb4,0xc7, 0x97,0xc6,0xc6,0x51
1147 .byte 0xcb,0xe8,0xe8,0x23, 0xa1,0xdd,0xdd,0x7c
1148 .byte 0xe8,0x74,0x74,0x9c, 0x3e,0x1f,0x1f,0x21
1149 .byte 0x96,0x4b,0x4b,0xdd, 0x61,0xbd,0xbd,0xdc
1150 .byte 0x0d,0x8b,0x8b,0x86, 0x0f,0x8a,0x8a,0x85
1151 .byte 0xe0,0x70,0x70,0x90, 0x7c,0x3e,0x3e,0x42
1152 .byte 0x71,0xb5,0xb5,0xc4, 0xcc,0x66,0x66,0xaa
1153 .byte 0x90,0x48,0x48,0xd8, 0x06,0x03,0x03,0x05
1154 .byte 0xf7,0xf6,0xf6,0x01, 0x1c,0x0e,0x0e,0x12
1155 .byte 0xc2,0x61,0x61,0xa3, 0x6a,0x35,0x35,0x5f
1156 .byte 0xae,0x57,0x57,0xf9, 0x69,0xb9,0xb9,0xd0
1157 .byte 0x17,0x86,0x86,0x91, 0x99,0xc1,0xc1,0x58
1158 .byte 0x3a,0x1d,0x1d,0x27, 0x27,0x9e,0x9e,0xb9
1159 .byte 0xd9,0xe1,0xe1,0x38, 0xeb,0xf8,0xf8,0x13
1160 .byte 0x2b,0x98,0x98,0xb3, 0x22,0x11,0x11,0x33
1161 .byte 0xd2,0x69,0x69,0xbb, 0xa9,0xd9,0xd9,0x70
1162 .byte 0x07,0x8e,0x8e,0x89, 0x33,0x94,0x94,0xa7
1163 .byte 0x2d,0x9b,0x9b,0xb6, 0x3c,0x1e,0x1e,0x22
1164 .byte 0x15,0x87,0x87,0x92, 0xc9,0xe9,0xe9,0x20
1165 .byte 0x87,0xce,0xce,0x49, 0xaa,0x55,0x55,0xff
1166 .byte 0x50,0x28,0x28,0x78, 0xa5,0xdf,0xdf,0x7a
1167 .byte 0x03,0x8c,0x8c,0x8f, 0x59,0xa1,0xa1,0xf8
1168 .byte 0x09,0x89,0x89,0x80, 0x1a,0x0d,0x0d,0x17
1169 .byte 0x65,0xbf,0xbf,0xda, 0xd7,0xe6,0xe6,0x31
1170 .byte 0x84,0x42,0x42,0xc6, 0xd0,0x68,0x68,0xb8
1171 .byte 0x82,0x41,0x41,0xc3, 0x29,0x99,0x99,0xb0
1172 .byte 0x5a,0x2d,0x2d,0x77, 0x1e,0x0f,0x0f,0x11
1173 .byte 0x7b,0xb0,0xb0,0xcb, 0xa8,0x54,0x54,0xfc
1174 .byte 0x6d,0xbb,0xbb,0xd6, 0x2c,0x16,0x16,0x3a
1175AES_Te4:
1176 .byte 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5
1177 .byte 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76
1178 .byte 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0
1179 .byte 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0
1180 .byte 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc
1181 .byte 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15
1182 .byte 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a
1183 .byte 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75
1184 .byte 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0
1185 .byte 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84
1186 .byte 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b
1187 .byte 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf
1188 .byte 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85
1189 .byte 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8
1190 .byte 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5
1191 .byte 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2
1192 .byte 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17
1193 .byte 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73
1194 .byte 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88
1195 .byte 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb
1196 .byte 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c
1197 .byte 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79
1198 .byte 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9
1199 .byte 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08
1200 .byte 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6
1201 .byte 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a
1202 .byte 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e
1203 .byte 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e
1204 .byte 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94
1205 .byte 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf
1206 .byte 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68
1207 .byte 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
1208rcon:
1209 .byte 0x01,0x00,0x00,0x00, 0x02,0x00,0x00,0x00
1210 .byte 0x04,0x00,0x00,0x00, 0x08,0x00,0x00,0x00
1211 .byte 0x10,0x00,0x00,0x00, 0x20,0x00,0x00,0x00
1212 .byte 0x40,0x00,0x00,0x00, 0x80,0x00,0x00,0x00
1213 .byte 0x1B,0x00,0x00,0x00, 0x36,0x00,0x00,0x00
1214 .align 128
1215AES_Td:
1216 .byte 0x51,0xf4,0xa7,0x50, 0x7e,0x41,0x65,0x53
1217 .byte 0x1a,0x17,0xa4,0xc3, 0x3a,0x27,0x5e,0x96
1218 .byte 0x3b,0xab,0x6b,0xcb, 0x1f,0x9d,0x45,0xf1
1219 .byte 0xac,0xfa,0x58,0xab, 0x4b,0xe3,0x03,0x93
1220 .byte 0x20,0x30,0xfa,0x55, 0xad,0x76,0x6d,0xf6
1221 .byte 0x88,0xcc,0x76,0x91, 0xf5,0x02,0x4c,0x25
1222 .byte 0x4f,0xe5,0xd7,0xfc, 0xc5,0x2a,0xcb,0xd7
1223 .byte 0x26,0x35,0x44,0x80, 0xb5,0x62,0xa3,0x8f
1224 .byte 0xde,0xb1,0x5a,0x49, 0x25,0xba,0x1b,0x67
1225 .byte 0x45,0xea,0x0e,0x98, 0x5d,0xfe,0xc0,0xe1
1226 .byte 0xc3,0x2f,0x75,0x02, 0x81,0x4c,0xf0,0x12
1227 .byte 0x8d,0x46,0x97,0xa3, 0x6b,0xd3,0xf9,0xc6
1228 .byte 0x03,0x8f,0x5f,0xe7, 0x15,0x92,0x9c,0x95
1229 .byte 0xbf,0x6d,0x7a,0xeb, 0x95,0x52,0x59,0xda
1230 .byte 0xd4,0xbe,0x83,0x2d, 0x58,0x74,0x21,0xd3
1231 .byte 0x49,0xe0,0x69,0x29, 0x8e,0xc9,0xc8,0x44
1232 .byte 0x75,0xc2,0x89,0x6a, 0xf4,0x8e,0x79,0x78
1233 .byte 0x99,0x58,0x3e,0x6b, 0x27,0xb9,0x71,0xdd
1234 .byte 0xbe,0xe1,0x4f,0xb6, 0xf0,0x88,0xad,0x17
1235 .byte 0xc9,0x20,0xac,0x66, 0x7d,0xce,0x3a,0xb4
1236 .byte 0x63,0xdf,0x4a,0x18, 0xe5,0x1a,0x31,0x82
1237 .byte 0x97,0x51,0x33,0x60, 0x62,0x53,0x7f,0x45
1238 .byte 0xb1,0x64,0x77,0xe0, 0xbb,0x6b,0xae,0x84
1239 .byte 0xfe,0x81,0xa0,0x1c, 0xf9,0x08,0x2b,0x94
1240 .byte 0x70,0x48,0x68,0x58, 0x8f,0x45,0xfd,0x19
1241 .byte 0x94,0xde,0x6c,0x87, 0x52,0x7b,0xf8,0xb7
1242 .byte 0xab,0x73,0xd3,0x23, 0x72,0x4b,0x02,0xe2
1243 .byte 0xe3,0x1f,0x8f,0x57, 0x66,0x55,0xab,0x2a
1244 .byte 0xb2,0xeb,0x28,0x07, 0x2f,0xb5,0xc2,0x03
1245 .byte 0x86,0xc5,0x7b,0x9a, 0xd3,0x37,0x08,0xa5
1246 .byte 0x30,0x28,0x87,0xf2, 0x23,0xbf,0xa5,0xb2
1247 .byte 0x02,0x03,0x6a,0xba, 0xed,0x16,0x82,0x5c
1248 .byte 0x8a,0xcf,0x1c,0x2b, 0xa7,0x79,0xb4,0x92
1249 .byte 0xf3,0x07,0xf2,0xf0, 0x4e,0x69,0xe2,0xa1
1250 .byte 0x65,0xda,0xf4,0xcd, 0x06,0x05,0xbe,0xd5
1251 .byte 0xd1,0x34,0x62,0x1f, 0xc4,0xa6,0xfe,0x8a
1252 .byte 0x34,0x2e,0x53,0x9d, 0xa2,0xf3,0x55,0xa0
1253 .byte 0x05,0x8a,0xe1,0x32, 0xa4,0xf6,0xeb,0x75
1254 .byte 0x0b,0x83,0xec,0x39, 0x40,0x60,0xef,0xaa
1255 .byte 0x5e,0x71,0x9f,0x06, 0xbd,0x6e,0x10,0x51
1256 .byte 0x3e,0x21,0x8a,0xf9, 0x96,0xdd,0x06,0x3d
1257 .byte 0xdd,0x3e,0x05,0xae, 0x4d,0xe6,0xbd,0x46
1258 .byte 0x91,0x54,0x8d,0xb5, 0x71,0xc4,0x5d,0x05
1259 .byte 0x04,0x06,0xd4,0x6f, 0x60,0x50,0x15,0xff
1260 .byte 0x19,0x98,0xfb,0x24, 0xd6,0xbd,0xe9,0x97
1261 .byte 0x89,0x40,0x43,0xcc, 0x67,0xd9,0x9e,0x77
1262 .byte 0xb0,0xe8,0x42,0xbd, 0x07,0x89,0x8b,0x88
1263 .byte 0xe7,0x19,0x5b,0x38, 0x79,0xc8,0xee,0xdb
1264 .byte 0xa1,0x7c,0x0a,0x47, 0x7c,0x42,0x0f,0xe9
1265 .byte 0xf8,0x84,0x1e,0xc9, 0x00,0x00,0x00,0x00
1266 .byte 0x09,0x80,0x86,0x83, 0x32,0x2b,0xed,0x48
1267 .byte 0x1e,0x11,0x70,0xac, 0x6c,0x5a,0x72,0x4e
1268 .byte 0xfd,0x0e,0xff,0xfb, 0x0f,0x85,0x38,0x56
1269 .byte 0x3d,0xae,0xd5,0x1e, 0x36,0x2d,0x39,0x27
1270 .byte 0x0a,0x0f,0xd9,0x64, 0x68,0x5c,0xa6,0x21
1271 .byte 0x9b,0x5b,0x54,0xd1, 0x24,0x36,0x2e,0x3a
1272 .byte 0x0c,0x0a,0x67,0xb1, 0x93,0x57,0xe7,0x0f
1273 .byte 0xb4,0xee,0x96,0xd2, 0x1b,0x9b,0x91,0x9e
1274 .byte 0x80,0xc0,0xc5,0x4f, 0x61,0xdc,0x20,0xa2
1275 .byte 0x5a,0x77,0x4b,0x69, 0x1c,0x12,0x1a,0x16
1276 .byte 0xe2,0x93,0xba,0x0a, 0xc0,0xa0,0x2a,0xe5
1277 .byte 0x3c,0x22,0xe0,0x43, 0x12,0x1b,0x17,0x1d
1278 .byte 0x0e,0x09,0x0d,0x0b, 0xf2,0x8b,0xc7,0xad
1279 .byte 0x2d,0xb6,0xa8,0xb9, 0x14,0x1e,0xa9,0xc8
1280 .byte 0x57,0xf1,0x19,0x85, 0xaf,0x75,0x07,0x4c
1281 .byte 0xee,0x99,0xdd,0xbb, 0xa3,0x7f,0x60,0xfd
1282 .byte 0xf7,0x01,0x26,0x9f, 0x5c,0x72,0xf5,0xbc
1283 .byte 0x44,0x66,0x3b,0xc5, 0x5b,0xfb,0x7e,0x34
1284 .byte 0x8b,0x43,0x29,0x76, 0xcb,0x23,0xc6,0xdc
1285 .byte 0xb6,0xed,0xfc,0x68, 0xb8,0xe4,0xf1,0x63
1286 .byte 0xd7,0x31,0xdc,0xca, 0x42,0x63,0x85,0x10
1287 .byte 0x13,0x97,0x22,0x40, 0x84,0xc6,0x11,0x20
1288 .byte 0x85,0x4a,0x24,0x7d, 0xd2,0xbb,0x3d,0xf8
1289 .byte 0xae,0xf9,0x32,0x11, 0xc7,0x29,0xa1,0x6d
1290 .byte 0x1d,0x9e,0x2f,0x4b, 0xdc,0xb2,0x30,0xf3
1291 .byte 0x0d,0x86,0x52,0xec, 0x77,0xc1,0xe3,0xd0
1292 .byte 0x2b,0xb3,0x16,0x6c, 0xa9,0x70,0xb9,0x99
1293 .byte 0x11,0x94,0x48,0xfa, 0x47,0xe9,0x64,0x22
1294 .byte 0xa8,0xfc,0x8c,0xc4, 0xa0,0xf0,0x3f,0x1a
1295 .byte 0x56,0x7d,0x2c,0xd8, 0x22,0x33,0x90,0xef
1296 .byte 0x87,0x49,0x4e,0xc7, 0xd9,0x38,0xd1,0xc1
1297 .byte 0x8c,0xca,0xa2,0xfe, 0x98,0xd4,0x0b,0x36
1298 .byte 0xa6,0xf5,0x81,0xcf, 0xa5,0x7a,0xde,0x28
1299 .byte 0xda,0xb7,0x8e,0x26, 0x3f,0xad,0xbf,0xa4
1300 .byte 0x2c,0x3a,0x9d,0xe4, 0x50,0x78,0x92,0x0d
1301 .byte 0x6a,0x5f,0xcc,0x9b, 0x54,0x7e,0x46,0x62
1302 .byte 0xf6,0x8d,0x13,0xc2, 0x90,0xd8,0xb8,0xe8
1303 .byte 0x2e,0x39,0xf7,0x5e, 0x82,0xc3,0xaf,0xf5
1304 .byte 0x9f,0x5d,0x80,0xbe, 0x69,0xd0,0x93,0x7c
1305 .byte 0x6f,0xd5,0x2d,0xa9, 0xcf,0x25,0x12,0xb3
1306 .byte 0xc8,0xac,0x99,0x3b, 0x10,0x18,0x7d,0xa7
1307 .byte 0xe8,0x9c,0x63,0x6e, 0xdb,0x3b,0xbb,0x7b
1308 .byte 0xcd,0x26,0x78,0x09, 0x6e,0x59,0x18,0xf4
1309 .byte 0xec,0x9a,0xb7,0x01, 0x83,0x4f,0x9a,0xa8
1310 .byte 0xe6,0x95,0x6e,0x65, 0xaa,0xff,0xe6,0x7e
1311 .byte 0x21,0xbc,0xcf,0x08, 0xef,0x15,0xe8,0xe6
1312 .byte 0xba,0xe7,0x9b,0xd9, 0x4a,0x6f,0x36,0xce
1313 .byte 0xea,0x9f,0x09,0xd4, 0x29,0xb0,0x7c,0xd6
1314 .byte 0x31,0xa4,0xb2,0xaf, 0x2a,0x3f,0x23,0x31
1315 .byte 0xc6,0xa5,0x94,0x30, 0x35,0xa2,0x66,0xc0
1316 .byte 0x74,0x4e,0xbc,0x37, 0xfc,0x82,0xca,0xa6
1317 .byte 0xe0,0x90,0xd0,0xb0, 0x33,0xa7,0xd8,0x15
1318 .byte 0xf1,0x04,0x98,0x4a, 0x41,0xec,0xda,0xf7
1319 .byte 0x7f,0xcd,0x50,0x0e, 0x17,0x91,0xf6,0x2f
1320 .byte 0x76,0x4d,0xd6,0x8d, 0x43,0xef,0xb0,0x4d
1321 .byte 0xcc,0xaa,0x4d,0x54, 0xe4,0x96,0x04,0xdf
1322 .byte 0x9e,0xd1,0xb5,0xe3, 0x4c,0x6a,0x88,0x1b
1323 .byte 0xc1,0x2c,0x1f,0xb8, 0x46,0x65,0x51,0x7f
1324 .byte 0x9d,0x5e,0xea,0x04, 0x01,0x8c,0x35,0x5d
1325 .byte 0xfa,0x87,0x74,0x73, 0xfb,0x0b,0x41,0x2e
1326 .byte 0xb3,0x67,0x1d,0x5a, 0x92,0xdb,0xd2,0x52
1327 .byte 0xe9,0x10,0x56,0x33, 0x6d,0xd6,0x47,0x13
1328 .byte 0x9a,0xd7,0x61,0x8c, 0x37,0xa1,0x0c,0x7a
1329 .byte 0x59,0xf8,0x14,0x8e, 0xeb,0x13,0x3c,0x89
1330 .byte 0xce,0xa9,0x27,0xee, 0xb7,0x61,0xc9,0x35
1331 .byte 0xe1,0x1c,0xe5,0xed, 0x7a,0x47,0xb1,0x3c
1332 .byte 0x9c,0xd2,0xdf,0x59, 0x55,0xf2,0x73,0x3f
1333 .byte 0x18,0x14,0xce,0x79, 0x73,0xc7,0x37,0xbf
1334 .byte 0x53,0xf7,0xcd,0xea, 0x5f,0xfd,0xaa,0x5b
1335 .byte 0xdf,0x3d,0x6f,0x14, 0x78,0x44,0xdb,0x86
1336 .byte 0xca,0xaf,0xf3,0x81, 0xb9,0x68,0xc4,0x3e
1337 .byte 0x38,0x24,0x34,0x2c, 0xc2,0xa3,0x40,0x5f
1338 .byte 0x16,0x1d,0xc3,0x72, 0xbc,0xe2,0x25,0x0c
1339 .byte 0x28,0x3c,0x49,0x8b, 0xff,0x0d,0x95,0x41
1340 .byte 0x39,0xa8,0x01,0x71, 0x08,0x0c,0xb3,0xde
1341 .byte 0xd8,0xb4,0xe4,0x9c, 0x64,0x56,0xc1,0x90
1342 .byte 0x7b,0xcb,0x84,0x61, 0xd5,0x32,0xb6,0x70
1343 .byte 0x48,0x6c,0x5c,0x74, 0xd0,0xb8,0x57,0x42
1344AES_Td4:
1345 .byte 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38
1346 .byte 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb
1347 .byte 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87
1348 .byte 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb
1349 .byte 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d
1350 .byte 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e
1351 .byte 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2
1352 .byte 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25
1353 .byte 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16
1354 .byte 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92
1355 .byte 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda
1356 .byte 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84
1357 .byte 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a
1358 .byte 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06
1359 .byte 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02
1360 .byte 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b
1361 .byte 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea
1362 .byte 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73
1363 .byte 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85
1364 .byte 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e
1365 .byte 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89
1366 .byte 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b
1367 .byte 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20
1368 .byte 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4
1369 .byte 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31
1370 .byte 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f
1371 .byte 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d
1372 .byte 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef
1373 .byte 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0
1374 .byte 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61
1375 .byte 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26
1376 .byte 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
1377 .cstring "AES for C64x+, CRYPTOGAMS by <appro\@openssl.org>"
1378 .align 4
1379___
1380
1381print $code;
904732f6 1382close STDOUT;