]> git.cryptolib.org Git - avr-crypto-lib.git/blob - twister/twister-asm.S
fixing E-Mail-Address & Copyright
[avr-crypto-lib.git] / twister / twister-asm.S
1 /* twister-asm.S */
2 /*
3     This file is part of the AVR-Crypto-Lib.
4     Copyright (C) 2006-2015 Daniel Otte (bg@nerilex.org)
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    bg@nerilex.org
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  * param ctx: r24:r25
66  * param msg: r22:r23
67  */ 
68 .global twister_mini_round
69 twister_mini_round:
70         movw r26, r24
71         movw r30, r22
72         adiw r26, 8*7
73         adiw r30, 8
74         ldi r21, 8
75 1:      
76         ld r22, X
77         ld r23, -Z
78         eor r22, r23
79         st X+, r22
80         dec r21
81         brne 1b
82  
83 /*
84  * param ctx: r24:r25
85  *
86  */
87 X_SAVE0 = 4
88 X_SAVE1 = 5 
89 Y_SAVE0 = 6
90 Y_SAVE1 = 7
91 MDS0 =  8
92 MDS1 =  9
93 MDS2 = 10
94 MDS3 = 11
95 MDS4 = 12
96 MDS5 = 13
97 MDS6 = 14
98 MDS7 = 15
99
100
101 .global twister_blank_round
102 twister_blank_round:
103         push_range 4, 17
104         push r28
105         push r29
106         stack_alloc_large 64, r28, r29
107         
108         movw X_SAVE0, r24
109         movw r30, r24
110         adiw r30, 63
111         adiw r30, 1+8 /* Z points behind counter */
112         movw r26, r24
113         adiw r26, 1
114         ldi r22, 8
115 1: /* "add" counter */
116         ld r16, -Z
117         ld r21, X
118         eor r21, r16
119         st X, r21
120         adiw r26, 8
121         dec r22
122         brne 1b
123
124         /* decrement counter */
125         subi r16, 1
126         st Z+, r16
127         ldi r17, 7
128 1:      
129         ld r16, Z
130         sbci r16, 0
131         st Z+, r16
132         dec r17
133         brne 1b
134
135         movw r26, r24
136         adiw r28, 1 /* Y points to stack memory */
137         movw Y_SAVE0, r28       
138         movw r24, r28
139         ldi r20, lo8(twister_sbox)
140         ldi r21, hi8(twister_sbox)
141         ldi r18, 8
142 1:
143         ldi r19, 0
144         
145 2:      /* sbox substitution */
146         ld r0, X+
147         movw r30, r20
148         add r30, r0
149         adc r31, r1     
150         lpm r0, Z
151         movw r28, r24
152         mov r16, r18
153         add r16, r19
154         andi r16, 0x07
155         add r28, r16
156         adc r29, r1
157         st Y, r0
158         inc r19
159         cpi r19, 8
160         brne 2b
161         adiw r24, 8
162         dec r18
163         brne 1b
164                 
165         /* load MDS-Table to MDS0:MDS7 */
166         ldi r18, 1
167         mov MDS1, r18
168         mov MDS2, r18
169         mov MDS7, r18
170         ldi r18, 2
171         mov MDS0, r18
172         ldi r18, 5
173         mov MDS3, r18
174         ldi r18, 6
175         mov MDS6, r18
176         ldi r18, 7
177         mov MDS4, r18
178         ldi r18, 8
179         mov MDS5, r18
180         
181         ldi r20, 0x4D /* reducer for gf256mul*/
182         ldi r16, 0
183
184 1:
185         movw r26, X_SAVE0
186         add r26, r16
187         adc r27, r1
188         ldi r17, 8
189 2:              
190         mov r24, MDS0
191         movw r28, Y_SAVE0
192         add r28, r16
193         adc r29, r1
194         ld  r22, Y
195         rcall gf256mul
196         mov r0, r24
197         
198         mov r24, MDS1
199         ldd r22, Y+8
200         rcall gf256mul
201         eor r0, r24
202
203         mov r24, MDS2
204         ldd r22, Y+8*2
205         rcall gf256mul
206         eor r0, r24
207
208         mov r24, MDS3
209         ldd r22, Y+8*3
210         rcall gf256mul
211         eor r0, r24
212
213         mov r24, MDS4
214         ldd r22, Y+8*4
215         rcall gf256mul
216         eor r0, r24
217
218         mov r24, MDS5
219         ldd r22, Y+8*5
220         rcall gf256mul
221         eor r0, r24
222
223         mov r24, MDS6
224         ldd r22, Y+8*6
225         rcall gf256mul
226         eor r0, r24
227
228         mov r24, MDS7
229         ldd r22, Y+8*7
230         rcall gf256mul
231         eor r0, r24
232
233         st X, r0
234         adiw r26, 8
235
236         mov r0, MDS7
237         mov MDS7, MDS6
238         mov MDS6, MDS5
239         mov MDS5, MDS4
240         mov MDS4, MDS3
241         mov MDS3, MDS2
242         mov MDS2, MDS1
243         mov MDS1, MDS0
244         mov MDS0, r0    
245         
246         dec r17
247         brne 2b
248 8:      
249         inc r16
250         cpi r16, 8
251         brne 1b
252         
253 9:
254         stack_free_large 64
255         pop r29
256         pop r28
257         pop_range 4, 17
258         ret
259
260 /*********************************************************************/
261 A = 23
262 B = 22
263 P = 24
264
265 gf256mul:
266         mov A, r24
267         clr P
268 1:      
269         lsr A
270         breq 4f
271         brcc 2f
272         eor P, B
273 2:
274         lsl B
275         brcc 3f
276         eor B, r20      
277 3:
278         rjmp 1b
279 4:
280         brcc 2f
281         eor P, B
282 2:
283         ret
284
285 /*********************************************************************/
286 /* twister_ctx2hash */
287 /*
288  * param dest:       r24:r25
289  * param ctx:        r22:r23
290  * param hashsize_b: r20:r21
291  */
292 DEST_SAVE0 = 10
293 DEST_SAVE1 = 11
294 CTX_SAVE0  = 12
295 CTX_SAVE1  = 13
296 LEN_SAVE  = 14
297 LEN32_SAVE  = 15
298 TMP_SAVE0  = 16
299 TMP_SAVE1  = 17
300
301
302 .global twister_ctx2hash
303 .global twister_small_ctx2hash
304 .global twister_large_ctx2hash
305 .global twister224_ctx2hash
306 .global twister256_ctx2hash
307 .global twister384_ctx2hash
308 .global twister512_ctx2hash
309
310 twister224_ctx2hash:
311         ldi r20, lo8(224)
312         ldi r21, hi8(224)
313         rjmp twister_ctx2hash
314
315 twister256_ctx2hash:
316         ldi r20, lo8(256)
317         ldi r21, hi8(256)
318         rjmp twister_ctx2hash
319
320 twister384_ctx2hash:
321         ldi r20, lo8(384)
322         ldi r21, hi8(384)
323         rjmp twister_ctx2hash
324
325 twister512_ctx2hash:
326         ldi r20, lo8(512)
327         ldi r21, hi8(512)
328 ;       rjmp twister_ctx2hash
329
330 twister_large_ctx2hash:
331 twister_small_ctx2hash:
332 twister_ctx2hash:
333         push_range 10, 17
334         push r28
335         push r29
336         stack_alloc_large 64
337         movw DEST_SAVE0, r24
338         movw CTX_SAVE0, r22
339         clr LEN32_SAVE
340         sbrc r20, 5
341         inc LEN32_SAVE
342         lsr r21
343         ror r20
344         lsr r21
345         ror r20 /* length is max 512 so we now only have to shift r20 */
346         swap r20 /* this is faster than 4 shifts */
347         andi r20, 0x0f
348         add r20, LEN32_SAVE
349         mov LEN_SAVE, r20
350         
351         adiw r30, 1
352         movw TMP_SAVE0, r30
353 1:      
354         dec LEN_SAVE
355         brmi 9f
356         /* tmp <- ctx-s */
357         movw r30, TMP_SAVE0
358         movw r26, CTX_SAVE0
359         ldi r20, 64/4
360 3:      
361         ld r0, X+
362         st Z+, r0
363         ld r0, X+
364         st Z+, r0
365         ld r0, X+
366         st Z+, r0
367         ld r0, X+
368         st Z+, r0
369         dec r20
370         brne 3b
371         
372         movw r24, CTX_SAVE0
373         rcall twister_blank_round
374         /* ctx-s ^= tmp */
375         movw r30, TMP_SAVE0
376         movw r26, CTX_SAVE0
377         ldi r20, 64
378 3:
379         ld r0, X
380         ld r21, Z+
381         eor r0, r21
382         st X+, r0
383         dec r20
384         brne 3b
385
386         movw r24, CTX_SAVE0
387         rcall twister_blank_round
388
389
390         movw r26, CTX_SAVE0
391         
392         tst LEN_SAVE
393         brne 2f
394         tst LEN32_SAVE
395         brne 5f
396 2:      
397         adiw r26, 8*7
398         movw r30, TMP_SAVE0
399         adiw r30, 8*7
400         movw r28, DEST_SAVE0
401         ldi r20, 8
402 3:
403         ld r0, Z
404         ld r21, X
405         eor r0, r21
406         st Y+, r0
407         sbiw r26, 8
408         sbiw r30, 8
409         dec r20
410         brne 3b 
411         movw DEST_SAVE0, r28
412 7:
413         rjmp 1b
414
415 5:
416         adiw r26, 8*3
417         movw r30, TMP_SAVE0
418         adiw r30, 8*3
419         movw r28, DEST_SAVE0
420         ldi r20, 4
421 3:
422         ld r0, Z
423         ld r21, X
424         eor r0, r21
425         st Y+, r0
426         sbiw r26, 8
427         sbiw r30, 8
428         dec r20
429         brne 3b 
430         
431 9:      
432         stack_free_large 64
433         pop r29
434         pop r28
435         pop_range 10, 17
436         ret
437
438
439
440 /*********************************************************************/
441 /* void twister_small_nextBlock(twister_state_t *ctx, void *msg) */   
442 /*
443  * param ctx: r24:r25
444  * param msg: r22:r23
445  */
446 CTX_SAVE0 = 14
447 CTX_SAVE1 = 15
448 TMP_SAVE0 = 12
449 TMP_SAVE1 = 13
450 MSG_SAVE0 = 28
451 MSG_SAVE1 = 29
452 .global twister_small_nextBlock
453 .global twister224_nextBlock
454 .global twister256_nextBlock
455
456 twister224_nextBlock:
457 twister256_nextBlock:
458 twister_small_nextBlock:
459         push_range 12, 15
460         push r28
461         push r29
462         stack_alloc_large 64
463         adiw r30, 1
464         movw TMP_SAVE0, r30
465         movw CTX_SAVE0, r24
466         movw MSG_SAVE0, r22
467         movw r26, CTX_SAVE0
468         ldi r18, 64/8
469 1:
470         ld r0, X+
471         st Z+, r0
472         ld r0, X+
473         st Z+, r0
474         ld r0, X+
475         st Z+, r0
476         ld r0, X+
477         st Z+, r0
478         ld r0, X+
479         st Z+, r0
480         ld r0, X+
481         st Z+, r0
482         ld r0, X+
483         st Z+, r0
484         ld r0, X+
485         st Z+, r0
486         dec r18
487         brne 1b
488
489         rcall twister_mini_round
490         
491         adiw MSG_SAVE0, 8
492         movw r22, MSG_SAVE0
493         movw r24, CTX_SAVE0 
494         rcall twister_mini_round
495         
496         adiw MSG_SAVE0, 8
497         movw r22, MSG_SAVE0
498         movw r24, CTX_SAVE0 
499         rcall twister_mini_round
500         
501         movw r30, TMP_SAVE0
502         movw r26, CTX_SAVE0
503         ldi r18, 64
504 1:
505         ld r0, X
506         ld r23, Z
507         eor r0, r23
508         st X+, r0
509         st Z+, r0
510         dec r18
511         brne 1b
512
513         adiw MSG_SAVE0, 8
514         movw r22, MSG_SAVE0
515         movw r24, CTX_SAVE0 
516         rcall twister_mini_round
517         
518         adiw MSG_SAVE0, 8
519         movw r22, MSG_SAVE0
520         movw r24, CTX_SAVE0 
521         rcall twister_mini_round
522         
523         adiw MSG_SAVE0, 8
524         movw r22, MSG_SAVE0
525         movw r24, CTX_SAVE0 
526         rcall twister_mini_round
527
528         movw r30, TMP_SAVE0
529         movw r26, CTX_SAVE0
530         ldi r18, 64
531 1:
532         ld r0, X
533         ld r23, Z
534         eor r0, r23
535         st X+, r0
536         st Z+, r0
537         dec r18
538         brne 1b
539
540         adiw MSG_SAVE0, 8
541         movw r22, MSG_SAVE0
542         movw r24, CTX_SAVE0 
543         rcall twister_mini_round
544         
545         adiw MSG_SAVE0, 8
546         movw r22, MSG_SAVE0
547         movw r24, CTX_SAVE0 
548         rcall twister_mini_round
549         
550         movw r24, CTX_SAVE0 
551         rcall twister_blank_round
552
553         movw r30, TMP_SAVE0
554         movw r26, CTX_SAVE0
555         ldi r18, 64
556 1:
557         ld r0, X
558         ld r23, Z+
559         eor r0, r23
560         st X+, r0
561         dec r18
562         brne 1b
563         
564         adiw r26, 9
565         ldi r19, 2
566         ld r0, X
567         add r0, r19
568         st X+, r0
569                 
570         ld r0, X
571         adc r0, r1
572         st X+, r0
573         ld r0, X
574         adc r0, r1
575         st X+, r0
576         ld r0, X
577         adc r0, r1
578         st X+, r0
579         ld r0, X
580         adc r0, r1
581         st X+, r0
582         ld r0, X
583         adc r0, r1
584         st X+, r0
585         ld r0, X
586         adc r0, r1
587         st X+, r0
588         ld r0, X
589         adc r0, r1
590         st X+, r0
591         
592         stack_free_large 64
593         pop r29
594         pop r28
595         pop_range 12, 15
596         ret
597
598
599
600
601
602
603
604