]> git.cryptolib.org Git - avr-crypto-lib.git/blob - camellia-asm.S
36701b26a1855ac3c41bce0af20ba618454d9aea
[avr-crypto-lib.git] / camellia-asm.S
1 /* 
2  * File:        camellis-asm.S
3  * Author:      Daniel Otte
4  * Date:        10.11.2006
5  * License: GPL
6  * Description: Implementation of the camellia block cipher algorithm.
7  * 
8  */
9  
10 .macro SWAP_R A, B
11         eor \A, \B
12         eor \B, \A
13         eor \A, \B
14 .endm    
15  
16 .macro precall
17         /* push r18 - r27, r30 - r31*/
18         push r0
19         push r1
20         push r18
21         push r19
22         push r20
23         push r21
24         push r22
25         push r23
26         push r24
27         push r25
28         push r26
29         push r27
30         push r30
31         push r31
32         clr r1
33 .endm
34
35 .macro postcall
36         pop r31
37         pop r30
38         pop r27
39         pop r26
40         pop r25
41         pop r24
42         pop r23
43         pop r22
44         pop r21
45         pop r20
46         pop r19
47         pop r18
48         pop r1
49         pop r0
50 .endm
51
52
53 .macro hexdump length
54         push r27
55         push r26
56         ldi r25, '\r'
57         mov r24, r25
58         call uart_putc
59         ldi r25, '\n'
60         mov r24, r25
61         call uart_putc
62         pop r26
63         pop r27
64         movw r24, r26
65 .if \length > 16
66         ldi r22, lo8(16)
67         ldi r23, hi8(16)
68         push r27
69         push r26
70         call uart_hexdump
71         pop r26
72         pop r27
73         adiw r26, 16
74         hexdump \length-16
75 .else
76         ldi r22, lo8(\length)
77         ldi r23, hi8(\length)
78         call uart_hexdump
79 .endif
80 .endm
81
82 /* X points to Block */
83 .macro dbg_hexdump length
84         precall
85         hexdump \length
86         postcall
87 .endm
88  
89 SPL = 0x3D
90 SPH = 0x3E
91 SREG = 0x3F
92 NULLr = 1
93  
94  
95 camellia_sbox:
96 .byte   112, 130,  44, 236, 179,  39, 192, 229, 228, 133,  87,  53, 234,  12, 174,  65
97 .byte    35, 239, 107, 147,  69,  25, 165,  33, 237,  14,  79,  78,  29, 101, 146, 189
98 .byte   134, 184, 175, 143, 124, 235,  31, 206,  62,  48, 220,  95,  94, 197,  11,  26
99 .byte   166, 225,  57, 202, 213,  71,  93,  61, 217,   1,  90, 214,  81,  86, 108,  77
100 .byte   139,  13, 154, 102, 251, 204, 176,  45, 116,  18,  43,  32, 240, 177, 132, 153
101 .byte   223,  76, 203, 194,  52, 126, 118,   5, 109, 183, 169,  49, 209,  23,   4, 215
102 .byte    20,  88,  58,  97, 222,  27,  17,  28,  50,  15, 156,  22,  83,  24, 242,  34
103 .byte   254,  68, 207, 178, 195, 181, 122, 145,  36,   8, 232, 168,  96, 252, 105,  80
104 .byte   170, 208, 160, 125, 161, 137,  98, 151,  84,  91,  30, 149, 224, 255, 100, 210
105 .byte    16, 196,   0,  72, 163, 247, 117, 219, 138,   3, 230, 218,   9,  63, 221, 148
106 .byte   135,  92, 131,   2, 205,  74, 144,  51, 115, 103, 246, 243, 157, 127, 191, 226
107 .byte    82, 155, 216,  38, 200,  55, 198,  59, 129, 150, 111,  75,  19, 190,  99,  46
108 .byte   233, 121, 167, 140, 159, 110, 188, 142,  41, 245, 249, 182,  47, 253, 180,  89
109 .byte   120, 152,   6, 106, 231,  70, 113, 186, 212,  37, 171,  66, 136, 162, 141, 250
110 .byte   114,   7, 185,  85, 248, 238, 172,  10,  54,  73,  42, 104,  60,  56, 241, 164
111 .byte    64,  40, 211, 123, 187, 201,  67, 193,  21, 227, 173, 244, 119, 199, 128, 158
112
113 //.global camellia_sigma
114 /*
115 camellia_sigma:
116 .quad   0xA09E667F3BCC908B
117 .quad   0xB67AE8584CAA73B2
118 .quad   0xC6EF372FE94F82BE
119 .quad   0x54FF53A5F1D36F1C
120 .quad   0x10E527FADE682D1D
121 .quad   0xB05688C2B3E6C1FD      
122 */
123
124
125
126 /* uint8_t camellia_s1(uint8_t b) */
127 .global camellia_s1
128 camellia_s1:
129         ldi r30, lo8(camellia_sbox)
130         ldi r31, hi8(camellia_sbox)
131         add r30, r24
132         adc r31, NULLr
133         lpm r24, Z
134         clr r25
135         ret
136
137 .global camellia_s2
138 camellia_s2:
139         ldi r30, lo8(camellia_sbox)
140         ldi r31, hi8(camellia_sbox)
141         add r30, r24
142         adc r31, NULLr
143         lpm r24, Z
144         lsl r24
145         adc r24, NULLr
146         clr r25
147         ret
148
149 .global camellia_s3
150 camellia_s3:
151         ldi r30, lo8(camellia_sbox)
152         ldi r31, hi8(camellia_sbox)
153         add r30, r24
154         adc r31, NULLr
155         lpm r24, Z
156         bst r24, 0
157         lsr r24
158         bld r24, 7
159         clr r25
160         ret
161
162 .global camellia_s4
163 camellia_s4:
164         ldi r30, lo8(camellia_sbox)
165         ldi r31, hi8(camellia_sbox)
166         lsl r24
167         adc r24, NULLr
168         add r30, r24
169         adc r31, NULLr
170         lpm r24, Z
171         clr r25
172         ret
173
174 .global camellia_s
175 /* uint64_t camellia_s(uint64_t d){
176         #define D ((uint8_t*)(&d))
177         D[7] = camellia_s1(D[7]); // MSB
178         D[6] = camellia_s2(D[6]);
179         D[5] = camellia_s3(D[5]);
180         D[4] = camellia_s4(D[4]);
181         
182         D[3] = camellia_s2(D[3]);
183         D[2] = camellia_s3(D[2]);
184         D[1] = camellia_s4(D[1]);
185         D[0] = camellia_s1(D[0]); // LSB
186         #undef D
187         return d;
188 }*/
189 ; parameters
190 ; d: r18-r25 (r18 is LSB)
191 camellia_s:
192         movw r26, r24   ; backup r24,r25 -> X
193         clr r25
194         call camellia_s2
195         mov r26, r24
196
197         mov r24, r27
198         call camellia_s1
199         mov r27, r24
200          
201         mov r24, r23
202         call camellia_s3
203         mov r23, r24
204         
205         mov r24, r22
206         call camellia_s4
207         mov r22, r24
208
209         mov r24, r21
210         call camellia_s2
211         mov r21, r24
212         
213         mov r24, r20
214         call camellia_s3
215         mov r20, r24
216         
217         mov r24, r19
218         call camellia_s4
219         mov r19, r24
220
221
222         mov r24, r18
223         call camellia_s1
224         mov r18, r24
225                 
226         movw r24, r26
227         ret
228         
229 ;##############################################################################
230 /* uint64_t camellia_p(uint64_t d) */
231 ; param: r18-r25 (r18 is LSB)
232 z1 = 25
233 z2 = 24
234 z3 = 23
235 z4 = 22
236 z5 = 21
237 z6 = 20
238 z7 = 19
239 z8 = 18
240
241 .global camellia_p
242 camellia_p:
243         eor z1, z6
244         eor z2, z7
245         eor z3, z8
246         eor z4, z5
247         eor z5, z3
248         eor z6, z4
249         eor z7, z1
250         eor z8, z2
251     ;---------
252         eor z1, z8
253         eor z2, z5
254         eor z3, z6
255         eor z4, z7
256         eor z5, z4
257         eor z6, z1
258         eor z7, z2
259         eor z8, z3
260     ;---------
261         movw r26, z8
262         movw r30, z6 ; backup z5 bis z8
263         movw z8, z4
264         movw z6, z2
265         movw z4, r26
266         movw z2, r30
267         ret
268         
269
270 ;##############################################################################
271
272 /* uint64_t camellia_f(uint64_t x, uint64_t k) */       
273 ; param x: r18-r25
274 ; param k: r10-r17
275 .global camellia_f
276 camellia_f:
277         eor r18, r10
278         eor r19, r11
279         eor r20, r12
280         eor r21, r13
281         eor r22, r14
282         eor r23, r15
283         eor r24, r16
284         eor r25, r17
285         call camellia_s
286         call camellia_p
287         ret
288         
289 ;##############################################################################
290
291 /* uint64_t camellia_fl(uint64_t x, uint64_t k) */
292 ; param x: r18-r25              xl: r22-r25, xr: r18-r21
293 ; param k: r10-r17              kl: r14-r17, kr: r10-r13
294 kl1 = 14
295 kl2 = 15
296 kl3 = 16
297 kl4 = 17
298 kr1 = 10
299 kr2 = 11
300 kr3 = 12
301 kr4 = 13
302 xr1 = 18
303 xr2 = 19
304 xr3 = 20
305 xr4 = 21
306 xl1 = 22
307 xl2 = 23
308 xl3 = 24
309 xl4 = 25
310 .global camellia_fl
311 camellia_fl:
312         and kl1, xl1
313         and kl2, xl2
314         and kl3, xl3
315         and kl4, xl4
316         mov r26, kl4
317         rol r26
318         rol kl1
319         rol kl2
320         rol kl3
321         rol kl4
322         eor xr1, kl1
323         eor xr2, kl2
324         eor xr3, kl3
325         eor xr4, kl4
326         // that was part one
327         or kr1, xr1
328         or kr2, xr2
329         or kr3, xr3
330         or kr4, xr4     
331         eor xl1, kr1
332         eor xl2, kr2
333         eor xl3, kr3
334         eor xl4, kr4
335         ret
336         
337 ;##############################################################################
338
339 /* uint64_t camellia_fl_inv(uint64_t y, uint64_t k) */
340 ; param y: r18-r25              yl: r22-r25, yr: r18-r21
341 ; param k: r10-r17              kl: r14-r17, kr: r10-r13
342 kl1 = 14
343 kl2 = 15
344 kl3 = 16
345 kl4 = 17
346 kr1 = 10
347 kr2 = 11
348 kr3 = 12
349 kr4 = 13
350 yr1 = 18
351 yr2 = 19
352 yr3 = 20
353 yr4 = 21
354 yl1 = 22
355 yl2 = 23
356 yl3 = 24
357 yl4 = 25
358 .global camellia_fl_inv
359 camellia_fl_inv:
360         or kr1, yr1
361         or kr2, yr2
362         or kr3, yr3
363         or kr4, yr4
364         eor yl1, kr1
365         eor yl2, kr2
366         eor yl3, kr3
367         eor yl4, kr4
368         // the first one is done
369         and kl1, yl1
370         and kl2, yl2
371         and kl3, yl3
372         and kl4, yl4    
373         mov r26, kl4
374         rol r26
375         rol kl1
376         rol kl2
377         rol kl3
378         rol kl4
379         eor yr1, kl1
380         eor yr2, kl2
381         eor yr3, kl3
382         eor yr4, kl4
383         ret
384
385 ;##############################################################################
386 ; param s: r24-r25
387 ; param q: r22
388 B1 = 18
389 B2 = 19
390 .global camellia128_keyop_rot15
391 camellia128_keyop_rot15:
392         movw r30, r24 ; Z points at LSB of kl                   ;-- 0
393         ldi r22, 2              
394 2:      adiw r30, 15                                                                    ;-- 15
395         ld  r21, Z
396         ld  r20, -Z                                                                             ;-- 14
397         movw B1, r20 ; store Backup of the 2 MSB of kl
398         ror r20
399
400         ldi r21, 14
401 1:      ld r20, -Z                                                                              ;-- 13..0
402         ror r20
403         std Z+2, r20                                                                    ;-- (15..2)
404         dec r21
405         brne 1b
406         
407         ror B2
408         ror B1
409         st Z+, B1                                                                               ;-- 1
410         st Z, B2
411         adiw r30, 15                                                                    ;-- 16
412         
413         dec r22
414         brne 2b
415         ret
416
417 ;##############################################################################
418 ; param s: r24-r25
419 ; param q: r22
420 .global camellia128_keyop_rot17
421 camellia128_keyop_rot17:
422         push r8
423         push r9
424         push r10
425         push r11
426         push r12
427         push r13
428         push r14
429         push r15
430         push r16
431         push r17
432         clt
433         movw r30, r24
434         clr r27
435 2:      ldi r26, 8
436         mov r1, r26
437         lsl r1  ; r1=16
438         ;push r1
439         ; load 128bit value
440         ldd r0, Z+15
441         rol r0
442 1:      ld r0, Z+
443         rol r0
444         st X+, r0
445         dec r1
446         brne 1b
447         
448         st -Z, 21
449         st -Z, 20
450         st -Z, 19
451         st -Z, 18
452         st -Z, 17
453         st -Z, 16
454         st -Z, 15
455         st -Z, 14 ;--
456         st -Z, 13
457         st -Z, 12
458         st -Z, 11
459         st -Z, 10
460         st -Z, 9
461         st -Z, 8
462         st -Z, 23
463         st -Z, 22
464         
465         brts 2f
466         set
467         adiw r30, 16
468         rjmp 2b
469 2:      
470         pop r17
471         pop r16
472         pop r15
473         pop r14
474         pop r13
475         pop r12
476         pop r11
477         pop r10
478         pop r9
479         pop r8 
480         ret
481
482 ;##############################################################################
483 ; param s: r24-r25
484 ; param q: r22
485 .global camellia128_keyop
486 camellia128_keyop:
487         cpi r22, 1
488         breq camellia128_keyop_rot17
489         rjmp camellia128_keyop_rot15
490         
491 ;##############################################################################
492 ; param s: r24-r25
493 ; param q: r22
494 B1 = 18
495 B2 = 19
496 .global camellia128_keyop_inv_rot15
497 camellia128_keyop_inv_rot15:
498         movw r30, r24 ; Z points at LSB of kl                   ;-- 0
499         movw r26, r24 ; X also
500         ldi r22, 2              
501 2:                                                                                                      ;-- 0
502         ld  r20, Z+                                                                             ;-- 0/1
503         ld  r21, Z+                                                                             ;-- 1/2
504         movw B1, r20 ; store Backup of the 2 LSB of kl
505         rol r21
506
507         ldi r20, 14
508 1:      ld r21, Z+                                                                              ;-- 2/14..3/16
509         rol r21
510         st X+, r21                                                                              ;-- (0..13)/(1..14)
511         dec r20
512         brne 1b
513         
514         rol B1
515         rol B2
516         st X+, B1                                                                               ;-- 14/15
517         st X+, B2                                                                               ;-- 15/16
518         
519         dec r22
520         brne 2b
521         ret
522         
523 ;##############################################################################
524 ; param s: r24-r25
525 ; param q: r22
526 .global camellia128_keyop_inv_rot17
527 camellia128_keyop_inv_rot17:
528         push r8
529         push r9
530         push r10
531         push r11
532         push r12
533         push r13
534         push r14
535         push r15
536         push r16
537         push r17
538         clt
539         movw r30, r24
540         clr r27
541 2:      ldi r26, 8
542         mov r1, r26
543         lsl r1  ; r1=16
544         ; load 128bit value
545         
546         ld  r0, Z
547         adiw r30, 16
548         ror r0
549 1:      ld r0, -Z
550         ror r0
551         st X+, r0
552         dec r1
553         brne 1b
554         
555         st Z+, 21
556         st Z+, 20
557         st Z+, 19
558         st Z+, 18
559         st Z+, 17
560         st Z+, 16
561         st Z+, 15
562         st Z+, 14 ;--
563         st Z+, 13
564         st Z+, 12
565         st Z+, 11
566         st Z+, 10
567         st Z+, 9
568         st Z+, 8
569         st Z+, 23
570         st Z+, 22
571         
572         brts 2f
573         set
574 ;       adiw r30, 16
575         rjmp 2b
576 2:      
577         pop r17
578         pop r16
579         pop r15
580         pop r14
581         pop r13
582         pop r12
583         pop r11
584         pop r10
585         pop r9
586         pop r8 
587         ret
588
589 ;##############################################################################
590 ; param s: r24-r25
591 ; param q: r22
592 .global camellia128_keyop_inv
593 camellia128_keyop_inv:
594         cpi r22, 1
595         breq camellia128_keyop_inv_rot17
596         rjmp camellia128_keyop_inv_rot15
597         
598 ;##############################################################################
599 ; param p: r24-r25      pointer to data
600 ; param l: r22          length of word
601 .global change_endian
602 change_endian:
603         movw r26, r24
604         movw r30, r24
605         add r30, r22
606         adc     r31, r1
607         lsr r22
608 1:
609         ld r20,  X
610         ld r21, -Z      
611         st X+, r21
612         st Z,  r20
613         dec r22
614         brne 1b
615         ret
616
617 ;##############################################################################
618         
619 #define SEL_KA 1
620 #define SEL_KL 0
621 #define KEY_POSTC1              0x00
622 #define KEY_POSTC2              0x01
623 #define KEY_INC2                0x02
624 #define KEY_DIR                 0x04
625 #define KEY_DIR_NORM    0x00
626 #define KEY_DIR_INV             0x04
627 #define KEY_AMMOUNT             0x08 
628 #define KEY_ROL17               0x08
629 #define KEY_ROL15               0x00
630 /*
631 void camellia_6rounds(camellia128_ctx_t* s, uint64_t* bl, uint64_t* br, uint8_t roundop, uint8_t keychoice){
632         uint8_t i;
633         uint64_t* k[4];
634         k[0] = &(s->kll);
635         k[1] = &(s->klr);
636         k[2] = &(s->kal);
637         k[3] = &(s->kar);
638         for(i=0; i<3; ++i){ / * each cycle * /
639                 br[0] ^= camellia_f(bl[0],*(k[(keychoice&1)*2+((roundop&KEY_DIR)?1:0)]));
640                 keychoice >>= 1;
641                 
642                 if((i == 1) && (roundop&KEY_INC2)){
643                         ((roundop&KEY_DIR)?camellia128_keyop_inv:camellia128_keyop)(s,(roundop&KEY_AMMOUNT)?1:-1);
644                 }
645                 
646                 bl[0] ^= camellia_f(br[0],*(k[(keychoice&1)*2+((roundop&KEY_DIR)?0:1)]));
647                 keychoice >>= 1;
648                 
649                 / * check if we should do some keyop * /
650                 if((i == (roundop&1)) && (!(roundop&KEY_INC2)) ){
651                         ((roundop&KEY_DIR)?camellia128_keyop_inv:camellia128_keyop)(s,(roundop&KEY_AMMOUNT)?1:-1);
652                         / * isn't it fuckin nice what we can do in C?! * /
653                 }
654         }
655 }
656 */
657 ; param s:  r24-r25
658 ; param bl: r22-r23
659 ; param br: r20-r21
660 ; param roundop: r18
661 ; param keychoice: r16  
662 s1 = 24
663 s2 = 25
664 bl1 = 22
665 bl2 = 23
666 br1 = 20
667 br2 = 22
668 xro = 18
669 kc = 16 
670 xro_sec = 17
671 br1_sec = 10
672 br2_sec = 11
673 bl1_sec = 12
674 bl2_sec = 13
675 s1_sec = 14
676 t = 9
677 loop_cnt = 8
678 keyop_time = 7
679
680 .global camellia_6rounds
681 camellia_6rounds:
682         push r17
683         push r16
684         push r15
685         push r14
686         push r13
687         push r12
688         push r11
689         push r10
690         push r9
691         push r8
692         push r7
693         
694         ldi r17, 6
695         mov loop_cnt, r17
696         mov xro_sec,  xro
697         movw br1_sec, br1
698         movw bl1_sec, bl1
699         movw s1_sec, s1
700         clr keyop_time
701         inc keyop_time
702         sec
703         rol keyop_time // keyop_time == 3
704         SBRC xro, 1 // KEY_INC2
705          rjmp 1f
706         SBRS xro, 0 // KEY_POSTC1
707          inc keyop_time
708         SBRS xro, 0 // KEY_POSTC1
709          inc keyop_time
710         rjmp 2f
711 1:      inc keyop_time
712 2:
713 main_loop:
714         /* now we load the key to r18-r25 */
715         movw r26, s1_sec
716         SBRC kc, 0              /* select between KA and KL */
717          adiw r26, 16
718         SBRC xro_sec, 2 // KEY_DIR
719          rjmp 2f
720         SBRS loop_cnt, 0 /* enc */
721          adiw r26,  8
722         rjmp 3f 
723 2:      SBRC loop_cnt, 0  /* dec */
724          adiw r26,  8
725         rjmp 3f 
726 3:
727         lsr kc
728         ld r18, X+
729         ld r19, X+
730         ld r20, X+
731         ld r21, X+
732         ld r22, X+
733         ld r23, X+
734         ld r24, X+
735         ld r25, X+
736         /* now we xor bl in */
737         movw r26, bl1_sec
738         ld r0, X+
739         eor r18, r0
740         ld r0, X+
741         eor r19, r0
742         ld r0, X+
743         eor r20, r0
744         ld r0, X+
745         eor r21, r0
746         ld r0, X+
747         eor r22, r0
748         ld r0, X+
749         eor r23, r0
750         ld r0, X+
751         eor r24, r0
752         ld r0, X+
753         eor r25, r0
754         /* f(x,k) = p(s(x xor k)) ; xor is done */
755         call camellia_s;
756         call camellia_p;
757         
758 //      in r26, SPL
759 //      in r27, SPH
760 //      sbiw r26, 9
761 //      dbg_hexdump 10 
762         /* now we have to xor the result into br */
763         clr r31
764         ldi r30, 18
765         movw r26, br1_sec
766 ;       ldi r1, 8 ;-- this won't work
767         clr r1
768         sec
769         ror r1
770         swap r1
771 1:       ld r0, X
772          ld t, Z+
773          eor r0, t
774          st X+, r0
775         dec r1
776         brne 1b
777         
778         /* check for keyop */
779         cp loop_cnt, keyop_time
780         brne 3f
781         movw s1, s1_sec
782         ldi r22, 1
783         SBRS xro_sec, 3 // KEY_ROL17
784          neg r22
785         SBRS xro_sec, 2 // KEY_DIR
786          rjmp 2f
787         call camellia128_keyop_inv
788         rjmp 3f 
789 2:      call camellia128_keyop
790 3:      /* loop back */
791         SWAP_R br1_sec, bl1_sec
792         SWAP_R br2_sec, bl2_sec
793         dec loop_cnt
794         breq 2f
795         jmp main_loop
796 2:
797         pop r7
798         pop r8
799         pop r9
800         pop r10
801         pop r11
802         pop r12
803         pop r13
804         pop r14
805         pop r15
806         pop r16
807         pop r17
808         ret
809         
810 ;##############################################################################
811 /*      
812 void camellia128_init(camellia128_ctx_t* s, uint8_t* key){
813         uint8_t i;
814         s->kll = 0; //((uint64_t*)key)[0];
815         
816         / * load the key, endian-adjusted, to kll,klr * /
817         for(i=0; i<8; ++i){
818                 s->kll <<= 8;
819                 s->kll |= *key++;
820         }
821         for(i=0; i<8; ++i){
822                 s->klr <<= 8;
823                 s->klr |= *key++;
824         }
825         
826         s->kal = s->kll;
827         s->kar = s->klr;
828         
829         s->kar ^= camellia_f(s->kal, camellia_sigma[0]);
830         s->kal ^= camellia_f(s->kar, camellia_sigma[1]);
831         
832         s->kal ^= s->kll;
833         s->kar ^= s->klr;
834         
835         s->kar ^= camellia_f(s->kal, camellia_sigma[2]);
836         s->kal ^= camellia_f(s->kar, camellia_sigma[3]);
837         / * * /
838 //      uart_putstr("\n\r----------------init finished--------------------");
839 }       
840 */      
841 /*
842 X64_xor_in:
843         ld r0, X+ 
844         eor r18, r0
845         ld r0, X+ 
846         eor r19, r0
847         ld r0, X+ 
848         eor r20, r0
849         ld r0, X+ 
850         eor r21, r0
851         ld r0, X+ 
852         eor r22, r0
853         ld r0, X+ 
854         eor r23, r0
855         ld r0, X+ 
856         eor r24, r0
857         ld r0, X+ 
858         eor r25, r0
859         ret
860
861 X64_load:
862         ld r18, X+
863         ld r19, X+
864         ld r20, X+
865         ld r21, X+
866         ld r22, X+
867         ld r23, X+
868         ld r24, X+
869         ld r25, X+
870         ret
871
872 Y64_load_xor_store:
873         ld r0, Y
874         eor r18, r0
875         st Y+, r18
876         ld r0, Y
877         eor r19, r0
878         st Y+, r19
879         ld r0, Y
880         eor r20, r0
881         st Y+, r20
882         ld r0, Y
883         eor r21, r0
884         st Y+, r21
885         ld r0, Y
886         eor r22, r0
887         st Y+, r22
888         ld r0, Y
889         eor r23, r0
890         st Y+, r23
891         ld r0, Y
892         eor r24, r0
893         st Y+, r24
894         ld r0, Y
895         eor r25, r0
896         st Y+, r25
897         ret     
898         
899 ; param s:  r24-r25
900 ; param *k: r22-r23
901 //.global camellia128_init
902 camellia128_init:       
903         push r29
904         push r28
905         movw r30, r24 ; Z is statepointer
906         movw r26, r22 ; X is keypointer
907         clr r29
908         ldi r28, 18
909 //      / * load key into kl, ka and kal to r18:r25 * /
910         adiw r26, 128/8 ;-- 16
911         ldi r16, (128/8)-1
912 1:      ld r17, -X
913         std Z+(128/8), r17
914         st Z+, r17
915         sbrs r16, 3
916         st Y+, r17              ; this should only be done the last 8 rounds 0<=r16<=7
917         dec r16
918         brpl 1b
919 //      / * step 1 * /
920         ldi r26, lo8(camellia_sigma)
921         ldi r27, hi8(camellia_sigma)
922         call X64_xor_in
923         call camellia_s
924         call camellia_p // / * f(x,k) is done * /
925         sbiw r30, 128/8
926         movw r28, r30 ; Z&Y point on kar now
927         call Y64_load_xor_store
928
929 //      / * step 2 now * /
930         call X64_xor_in
931         call camellia_s
932         call camellia_p // / * f(x,k) is done * /
933         call Y64_load_xor_store
934         
935 //      / * now the xor part (kl and kr) * /
936         sbiw r30, 128/8         ; Z points to klr
937         ldi r16, 128/8
938 1:      ld  r0, Z+
939         ldd r1, Z+(128/8)-1
940         eor r0, r1
941         std Z+(128/8)-1, r0 
942         dec r16
943         brne 1b
944         
945 //      / * now s->kar ^= camellia_f(s->kal, camellia_sigma[2]); * /    
946         call X64_load           ; load sigma[2]
947         movw r26, r28           ; X&Y point at kal
948         call X64_xor_in
949         call camellia_s
950         call camellia_p
951         sbiw r28, 128/8/2       ; Y points at kar
952         call Y64_load_xor_store
953         
954 //      / * now s->kal ^= camellia_f(s->kar, camellia_sigma[3]); * /
955         sbiw r26, 128/8         ;
956         call X64_load           ; load kar
957         ldi r26, lo8(camellia_sigma+3*8)
958         ldi r27, hi8(camellia_sigma+3*8)
959         call X64_xor_in         ; xor sigma[3] in
960         call camellia_s
961         call camellia_p
962         call Y64_load_xor_store
963         
964         pop r28
965         pop r29
966         ret
967         
968 //*/    
969         
970         
971         
972
973
974
975
976
977