]> git.cryptolib.org Git - avr-crypto-lib.git/blob - keccak/keccak-asm.S
progress in asm version of keccak
[avr-crypto-lib.git] / keccak / keccak-asm.S
1 /* keccac-asm.S */
2 /*
3     This file is part of the AVR-Crypto-Lib.
4     Copyright (C) 2012  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     keccak-asm.S
21  * \email    daniel.otte@rub.de
22  * \author   Daniel Otte
23  * \date     2012-12-16
24  * \license  GPLv3 or later
25  *
26  */
27
28 .nolist
29 #include "avr-asm-macros.S"
30 .list
31 /*
32         void keccak_theta (uint64_t *a, uint64_t *b){
33         // uint64_t b[5][5];
34                 for(i = 0; i < 5; ++i){
35                         b[i][0] = a[0][i] ^ a[1][i] ^ a[2][i] ^ a[3][i] ^ a[4][i];
36                 }
37         }
38 */
39
40 theta_2a:
41 /*
42         input:
43                 r24:r25 = a ; uint64_t a[5][5]
44                 X = b       ; uint64_t *b
45         output:
46                 a[0..4][0] ^= b
47                 r20 = 0
48                 r21 = XX
49                 r22 = XX
50                 r24:r25 += 8
51                 X += 8
52                 Z = r24:r25 + 7 + 4 * 40
53 */
54         ldi r20, 8
55 10:
56         movw ZL, r24
57         ld  r21, X+
58         .irp r, 0, 1, 2, 3, 4
59                 ld  r22, Z
60                 eor r22, r21
61                 st  Z, r22
62         .if \r != 4
63                 adiw ZL, 40
64         .endif
65         .endr
66         adiw r24, 1
67         dec r20
68         brne 10b
69         ret
70
71 .global keccak_theta
72 keccak_theta:
73         movw r30, r24 ; Z = a
74         movw r26, r22 ; X = b
75         ldi r19, 5
76 10:
77         ldi r20, 8
78 20:
79         ld  r22, Z
80         adiw ZL, 40
81         ld  r21, Z
82         eor r22, r21
83         adiw ZL, 40
84         ld  r21, Z
85         eor r22, r21
86         adiw ZL, 40
87         ld  r21, Z
88         eor r22, r21
89         adiw ZL, 40
90         ld  r21, Z
91         eor r22, r21
92         adiw r24, 1
93         movw r30, r24
94         st X+, r22
95         dec r20
96         brne 20b
97
98         adiw XL, 8 * 4
99         dec r19
100         brne 10b
101 /*
102         for(i = 0; i < 5; ++i){
103                 for(j = 0; j < 5; ++j){
104                         a[j][i] ^= b[(4 + i) % 5][0];
105                 }
106         }
107         for(i = 0; i < 5; ++i){
108         for(j = 0; j < 5; ++j){
109             a[j][i] ^= rotate64_1bit_left(b[(i + 1) % 5][0]);
110         }
111     }
112
113 */
114         sbiw XL, 5 * 8
115
116         sbiw r24, 40
117 /* a[0..4][0]{0..7} ^= b[4][0]{0..7} */
118         rcall theta_2a
119 /* a[0..4][1]{0..7} ^= b[0][0]{0..7} */
120         subi XL, lo8(4 * 5 * 8 + 8)
121         sbci XH, hi8(4 * 5 * 8 + 8)
122         rcall theta_2a
123 /* a[0..4][2]{0..7} ^= b[1][0]{0..7} */
124         adiw XL, 4 * 8
125         rcall theta_2a
126 /* a[0..4][3]{0..7} ^= b[2][0]{0..7} */
127         adiw XL, 4 * 8
128         rcall theta_2a
129 /* a[0..4][4]{0..7} ^= b[3][0]{0..7} */
130         adiw XL, 4 * 8
131         rcall theta_2a
132
133         ret
134
135         ldi r20, 8
136
137 10:
138         movw ZL, r24
139         ld  r21, X+
140         .irp r, 0, 1, 2, 3, 4
141                 ld  r22, Z
142                 eor r22, r21
143                 st  Z, r22
144         .if \r != 4
145                 adiw ZL, 40
146         .endif
147         .endr
148         adiw r24, 1
149         dec r20
150         brne 10b
151
152
153         ret