]> git.cryptolib.org Git - avr-crypto-lib.git/blob - twister/twister-asm.S_shiftmul
3857e19d1b9df120cb67e0a1c79eea3acc1f5079
[avr-crypto-lib.git] / twister / twister-asm.S_shiftmul
1 /* twister-asm.S */
2 /*
3     This file is part of the AVR-Crypto-Lib.
4     Copyright (C) 2008  Daniel Otte (daniel.otte@rub.de)
5
6     This program is free software: you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation, either version 3 of the License, or
9     (at your option) any later version.
10
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 */
19 /**
20  * \file     twister-asm.S
21  * \email    daniel.otte@rub.de
22  * \author   Daniel Otte 
23  * \date     2008-12-22
24  * \license  GPLv3 or later
25  * 
26  */
27
28 #include "avr-asm-macros.S"
29
30 twister_sbox: 
31 .byte    0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5
32 .byte    0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76
33 .byte    0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0
34 .byte    0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0
35 .byte    0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc
36 .byte    0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15
37 .byte    0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a
38 .byte    0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75
39 .byte    0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0
40 .byte    0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84
41 .byte    0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b
42 .byte    0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf
43 .byte    0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85
44 .byte    0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8
45 .byte    0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5
46 .byte    0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2
47 .byte    0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17
48 .byte    0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73
49 .byte    0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88
50 .byte    0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb
51 .byte    0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c
52 .byte    0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79
53 .byte    0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9
54 .byte    0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08
55 .byte    0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6
56 .byte    0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a
57 .byte    0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e
58 .byte    0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e
59 .byte    0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94
60 .byte    0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf
61 .byte    0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68
62 .byte    0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
63  
64  
65 /*
66  * param ctx: r24:r25
67  *
68  */
69 X_SAVE0 = 4
70 X_SAVE1 = 5 
71 Y_SAVE0 = 6
72 Y_SAVE1 = 7
73 MDS0 =  8
74 MDS1 =  9
75 MDS2 = 10
76 MDS3 = 11
77 MDS4 = 12
78 MDS5 = 13
79 MDS6 = 14
80 MDS7 = 15
81 IDX1 = 18
82 IDX2 = 19
83 TMP  = 21
84 .global twister_blank_round
85 twister_blank_round:
86         push_range 4, 17
87         push r28
88         push r29
89         stack_alloc_large 64, r28, r29
90         
91         movw r30, r24
92         adiw r30, 63
93         adiw r30, 1+8 /* Z points behind counter */
94         movw r26, r24
95         adiw r26, 1
96         ldi r22, 8
97 1: /* "add" counter */
98         ld r16, -Z
99         ld r21, X
100         eor r21, r16
101         st X, r21
102         adiw r26, 8
103         dec r22
104         brne 1b
105
106         /* decrement counter */
107         subi r16, 1
108         st Z+, r16
109         ldi r17, 7
110 1:      
111         ld r16, Z
112         sbci r16, 0
113         st Z+, r16
114         dec r17
115         brne 1b
116
117         movw r26, r24
118         adiw r28, 1 /* Y points to stack memory */
119         movw Y_SAVE0, r28       
120         ldi r20, lo8(twister_sbox)
121         ldi r21, hi8(twister_sbox)
122         ldi r19, 64
123         
124 1:      /* sbox substitution */
125         ld r0, X+
126         movw r30, r20
127         add r30, r0
128         adc r31, r1     
129         lpm r0, Z
130         st Y+, r0
131         dec r19
132         brne 1b
133                 
134         /* load MDS-Table to MDS0:MDS7 */
135 /*
136         ldi r18, 1
137         mov MDS1, r18
138         mov MDS6, r18
139         mov MDS7, r18
140         ldi r18, 2
141         mov MDS0, r18
142         ldi r18, 5
143         mov MDS5, r18
144         ldi r18, 6
145         mov MDS2, r18
146         ldi r18, 7
147         mov MDS4, r18
148         ldi r18, 8
149         mov MDS3, r18
150 */
151         ldi r18, 1
152         mov MDS1, r18
153         mov MDS2, r18
154         mov MDS7, r18
155         ldi r18, 2
156         mov MDS0, r18
157         ldi r18, 5
158         mov MDS3, r18
159         ldi r18, 6
160         mov MDS6, r18
161         ldi r18, 7
162         mov MDS4, r18
163         ldi r18, 8
164         mov MDS5, r18
165 ;       sbiw r28, 63
166 ;       sbiw r28,  1 /* Y points again at tmp buffer */
167 ;       movw Y_SAVE0, r28
168 ;       sbiw r26, 63
169 ;       sbiw r26,  1 /* X points again at state buffer */
170         movw X_SAVE0, r24
171         
172         ldi r20, 0x4D /* reducer for gf256mul*/
173         ldi r16, 0
174
175 ;       rjmp 9f
176 1:
177         mov IDX1, r16
178         movw r26, X_SAVE0
179         add r26, r16
180         adc r27, r1
181         ldi r17, 0
182 2:      
183         mov IDX2, r17
184         
185         mov r24, MDS0
186         movw r28, Y_SAVE0
187         add r28, IDX1
188         adc r29, r1
189         ld  r22, Y
190         rcall gf256mul
191         mov r0, r24
192         
193         mov r24, MDS1
194         movw r28, Y_SAVE0
195         adiw r28, 8
196         inc IDX1
197         andi IDX1, 0x07
198         add r28, IDX1
199         adc r29, r1
200         ld  r22, Y
201         rcall gf256mul
202         eor r0, r24
203
204         mov r24, MDS2
205         movw r28, Y_SAVE0
206         adiw r28, 8*2
207         inc IDX1
208         andi IDX1, 0x07
209         add r28, IDX1
210         adc r29, r1
211         ld  r22, Y
212         rcall gf256mul
213         eor r0, r24
214
215         mov r24, MDS3
216         movw r28, Y_SAVE0
217         adiw r28, 8*3
218         inc IDX1
219         andi IDX1, 0x07
220         add r28, IDX1
221         adc r29, r1
222         ld  r22, Y
223         rcall gf256mul
224         eor r0, r24
225
226         mov r24, MDS4
227         movw r28, Y_SAVE0
228         adiw r28, 8*4
229         inc IDX1
230         andi IDX1, 0x07
231         add r28, IDX1
232         adc r29, r1
233         ld  r22, Y
234         rcall gf256mul
235         eor r0, r24
236
237         mov r24, MDS5
238         movw r28, Y_SAVE0
239         adiw r28, 8*5
240         inc IDX1
241         andi IDX1, 0x07
242         add r28, IDX1
243         adc r29, r1
244         ld  r22, Y
245         rcall gf256mul
246         eor r0, r24
247
248         mov r24, MDS6
249         movw r28, Y_SAVE0
250         adiw r28, 8*6
251         inc IDX1
252         andi IDX1, 0x07
253         add r28, IDX1
254         adc r29, r1
255         ld  r22, Y
256         rcall gf256mul
257         eor r0, r24
258
259         mov r24, MDS7
260         movw r28, Y_SAVE0
261         adiw r28, 8*7
262         inc IDX1
263         andi IDX1, 0x07
264         add r28, IDX1
265         adc r29, r1
266         ld  r22, Y
267         rcall gf256mul
268         eor r0, r24
269
270         st X, r0
271         adiw r26, 8
272 /*
273         mov r0, MDS0
274         mov MDS0, MDS1
275         mov MDS1, MDS2
276         mov MDS2, MDS3
277         mov MDS3, MDS4
278         mov MDS4, MDS5
279         mov MDS5, MDS6
280         mov MDS6, MDS7
281         mov MDS7, r0    
282 */      
283         mov r0, MDS7
284         mov MDS7, MDS6
285         mov MDS6, MDS5
286         mov MDS5, MDS4
287         mov MDS4, MDS3
288         mov MDS3, MDS2
289         mov MDS2, MDS1
290         mov MDS1, MDS0
291         mov MDS0, r0    
292         
293         cpi r17, 7
294         breq 8f
295         inc r17 
296         rjmp 2b
297 8:      
298
299         mov r0, MDS7
300         mov MDS7, MDS6
301         mov MDS6, MDS5
302         mov MDS5, MDS4
303         mov MDS4, MDS3
304         mov MDS3, MDS2
305         mov MDS2, MDS1
306         mov MDS1, MDS0
307         mov MDS0, r0    
308
309         cpi r16, 7
310         breq 9f
311         inc r16
312         rjmp 1b
313 9:
314         stack_free_large 64
315         pop r29
316         pop r28
317         pop_range 4, 17
318         ret
319
320
321 A = 23
322 B = 22
323 P = 24
324
325 gf256mul:
326         mov A, r24
327         clr P
328 1:      
329         lsr A
330         breq 4f
331         brcc 2f
332         eor P, B
333 2:
334         lsl B
335         brcc 3f
336         eor B, r20      
337 3:
338         rjmp 1b
339 4:
340         brcc 2f
341         eor P, B
342 2:
343         ret
344
345
346
347
348
349
350
351