]>
Commit | Line | Data |
---|---|---|
6aa36e8e | 1 | #! /usr/bin/env perl |
b0edda11 | 2 | # Copyright 2014-2018 The OpenSSL Project Authors. All Rights Reserved. |
6aa36e8e RS |
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 | ||
496f2b14 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 | # RC4 for C64x+. | |
18 | # | |
19 | # April 2014 | |
20 | # | |
21 | # RC4 subroutine processes one byte in 7.0 cycles, which is 3x faster | |
22 | # than TI CGT-generated code. Loop is scheduled in such way that | |
23 | # there is only one reference to memory in each cycle. This is done | |
24 | # to avoid L1D memory banking conflicts, see SPRU871 TI publication | |
25 | # for further details. Otherwise it should be possible to schedule | |
26 | # the loop for iteration interval of 6... | |
27 | ||
28 | ($KEY,$LEN,$INP,$OUT)=("A4","B4","A6","B6"); | |
29 | ||
30 | ($KEYA,$XX,$TY,$xx,$ONE,$ret)=map("A$_",(5,7,8,9,1,2)); | |
31 | ($KEYB,$YY,$TX,$tx,$SUM,$dat)=map("B$_",(5,7,8,9,1,2)); | |
32 | ||
33 | $code.=<<___; | |
34 | .text | |
35 | ||
36 | .if .ASSEMBLER_VERSION<7000000 | |
37 | .asg 0,__TI_EABI__ | |
38 | .endif | |
39 | .if __TI_EABI__ | |
40 | .nocmp | |
41 | .asg RC4,_RC4 | |
42 | .asg RC4_set_key,_RC4_set_key | |
43 | .asg RC4_options,_RC4_options | |
44 | .endif | |
45 | ||
46 | .global _RC4 | |
47 | .align 16 | |
48 | _RC4: | |
49 | .asmfunc | |
50 | MV $LEN,B0 | |
51 | [!B0] BNOP B3 ; if (len==0) return; | |
52 | ||[B0] ADD $KEY,2,$KEYA | |
53 | ||[B0] ADD $KEY,2,$KEYB | |
54 | [B0] MVK 1,$ONE | |
55 | ||[B0] LDBU *${KEYA}[-2],$XX ; key->x | |
56 | [B0] LDBU *${KEYB}[-1],$YY ; key->y | |
57 | || NOP 4 | |
58 | ||
59 | ADD4 $ONE,$XX,$XX | |
60 | LDBU *${KEYA}[$XX],$TX | |
61 | || MVC $LEN,ILC | |
62 | NOP 4 | |
63 | ;;================================================== | |
64 | SPLOOP 7 | |
65 | || ADD4 $TX,$YY,$YY | |
66 | ||
67 | LDBU *${KEYB}[$YY],$TY | |
68 | || MVD $XX,$xx | |
69 | || ADD4 $ONE,$XX,$XX | |
70 | LDBU *${KEYA}[$XX],$tx | |
71 | CMPEQ $YY,$XX,B0 | |
72 | || NOP 3 | |
73 | STB $TX,*${KEYB}[$YY] | |
74 | ||[B0] ADD4 $TX,$YY,$YY | |
75 | STB $TY,*${KEYA}[$xx] | |
76 | ||[!B0] ADD4 $tx,$YY,$YY | |
77 | ||[!B0] MVD $tx,$TX | |
78 | ADD4 $TY,$TX,$SUM ; [0,0] $TX is not replaced by $tx yet! | |
79 | || NOP 2 | |
80 | LDBU *$INP++,$dat | |
81 | || NOP 2 | |
82 | LDBU *${KEYB}[$SUM],$ret | |
83 | || NOP 5 | |
84 | XOR.L $dat,$ret,$ret | |
85 | SPKERNEL | |
86 | || STB $ret,*$OUT++ | |
87 | ;;================================================== | |
88 | SUB4 $XX,$ONE,$XX | |
89 | || NOP 5 | |
90 | STB $XX,*${KEYA}[-2] ; key->x | |
91 | || SUB4 $YY,$TX,$YY | |
609b0852 | 92 | || BNOP B3 |
496f2b14 AP |
93 | STB $YY,*${KEYB}[-1] ; key->y |
94 | || NOP 5 | |
95 | .endasmfunc | |
96 | ||
97 | .global _RC4_set_key | |
98 | .align 16 | |
99 | _RC4_set_key: | |
100 | .asmfunc | |
101 | .if .BIG_ENDIAN | |
102 | MVK 0x00000404,$ONE | |
103 | || MVK 0x00000203,B0 | |
104 | MVKH 0x04040000,$ONE | |
105 | || MVKH 0x00010000,B0 | |
106 | .else | |
107 | MVK 0x00000404,$ONE | |
108 | || MVK 0x00000100,B0 | |
109 | MVKH 0x04040000,$ONE | |
110 | || MVKH 0x03020000,B0 | |
111 | .endif | |
112 | ADD $KEY,2,$KEYA | |
113 | || ADD $KEY,2,$KEYB | |
114 | || ADD $INP,$LEN,$ret ; end of input | |
115 | LDBU *${INP}++,$dat | |
116 | || MVK 0,$TX | |
117 | STH $TX,*${KEY}++ ; key->x=key->y=0 | |
118 | || MV B0,A0 | |
119 | || MVK 64-4,B0 | |
120 | ||
121 | ;;================================================== | |
122 | SPLOOPD 1 | |
123 | || MVC B0,ILC | |
124 | ||
125 | STNW A0,*${KEY}++ | |
126 | || ADD4 $ONE,A0,A0 | |
127 | SPKERNEL | |
128 | ;;================================================== | |
129 | ||
130 | MVK 0,$YY | |
131 | || MVK 0,$XX | |
132 | MVK 1,$ONE | |
133 | || MVK 256-1,B0 | |
134 | ||
135 | ;;================================================== | |
136 | SPLOOPD 8 | |
137 | || MVC B0,ILC | |
138 | ||
139 | ADD4 $dat,$YY,$YY | |
140 | || CMPEQ $INP,$ret,A0 ; end of input? | |
141 | LDBU *${KEYB}[$YY],$TY | |
142 | || MVD $XX,$xx | |
143 | || ADD4 $ONE,$XX,$XX | |
144 | LDBU *${KEYA}[$XX],$tx | |
145 | ||[A0] SUB $INP,$LEN,$INP ; rewind | |
146 | LDBU *${INP}++,$dat | |
147 | || CMPEQ $YY,$XX,B0 | |
148 | || NOP 3 | |
149 | STB $TX,*${KEYB}[$YY] | |
150 | ||[B0] ADD4 $TX,$YY,$YY | |
151 | STB $TY,*${KEYA}[$xx] | |
152 | ||[!B0] ADD4 $tx,$YY,$YY | |
153 | ||[!B0] MV $tx,$TX | |
154 | SPKERNEL | |
155 | ;;================================================== | |
156 | ||
157 | BNOP B3,5 | |
158 | .endasmfunc | |
159 | ||
160 | .global _RC4_options | |
161 | .align 16 | |
162 | _RC4_options: | |
163 | _rc4_options: | |
164 | .asmfunc | |
165 | BNOP B3,1 | |
166 | ADDKPC _rc4_options,B4 | |
167 | .if __TI_EABI__ | |
168 | MVKL \$PCR_OFFSET(rc4_options,_rc4_options),A4 | |
169 | MVKH \$PCR_OFFSET(rc4_options,_rc4_options),A4 | |
170 | .else | |
171 | MVKL (rc4_options-_rc4_options),A4 | |
172 | MVKH (rc4_options-_rc4_options),A4 | |
173 | .endif | |
174 | ADD B4,A4,A4 | |
175 | .endasmfunc | |
176 | ||
177 | .if __TI_EABI__ | |
178 | .sect ".text:rc4_options.const" | |
179 | .else | |
180 | .sect ".const:rc4_options" | |
181 | .endif | |
182 | .align 4 | |
183 | rc4_options: | |
184 | .cstring "rc4(sploop,char)" | |
185 | .cstring "RC4 for C64+, CRYPTOGAMS by <appro\@openssl.org>" | |
186 | .align 4 | |
187 | ___ | |
188 | ||
2bd3b626 RL |
189 | $output=pop; |
190 | open STDOUT,">$output"; | |
496f2b14 AP |
191 | print $code; |
192 | close STDOUT; |