59d6297eb78f173af6e4702509d747085722e649
[platform/upstream/nettle.git] / arm / v6 / sha1-compress.asm
1 C arm/v6/sha1-compress.asm
2
3 ifelse(<
4    Copyright (C) 2013 Niels Möller
5
6    This file is part of GNU Nettle.
7
8    GNU Nettle is free software: you can redistribute it and/or
9    modify it under the terms of either:
10
11      * the GNU Lesser General Public License as published by the Free
12        Software Foundation; either version 3 of the License, or (at your
13        option) any later version.
14
15    or
16
17      * the GNU General Public License as published by the Free
18        Software Foundation; either version 2 of the License, or (at your
19        option) any later version.
20
21    or both in parallel, as here.
22
23    GNU Nettle is distributed in the hope that it will be useful,
24    but WITHOUT ANY WARRANTY; without even the implied warranty of
25    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
26    General Public License for more details.
27
28    You should have received copies of the GNU General Public License and
29    the GNU Lesser General Public License along with this program.  If
30    not, see http://www.gnu.org/licenses/.
31 >) 
32
33         .file "sha1-compress.asm"
34         .arch armv6
35
36 define(<STATE>, <r0>)
37 define(<INPUT>, <r1>)
38 define(<SA>, <r2>)
39 define(<SB>, <r3>)
40 define(<SC>, <r4>)
41 define(<SD>, <r5>)
42 define(<SE>, <r6>)
43 define(<T0>, <r7>)
44 define(<SHIFT>, <r8>)
45 define(<WPREV>, <r10>)
46 define(<W>, <r12>)
47 define(<K>, <lr>)
48
49 C FIXME: Could avoid a mov with even and odd variants.
50 define(<LOAD>, <
51         ldr     T0, [INPUT], #+4
52         sel     W, WPREV, T0
53         ror     W, W, SHIFT
54         mov     WPREV, T0
55         rev     W, W
56         str     W, [SP,#eval(4*$1)]
57 >)
58 define(<EXPN>, <
59         ldr     W, [sp, #+eval(4*$1)]
60         ldr     T0, [sp, #+eval(4*(($1 + 2) % 16))]
61         eor     W, W, T0
62         ldr     T0, [sp, #+eval(4*(($1 + 8) % 16))]
63         eor     W, W, T0
64         ldr     T0, [sp, #+eval(4*(($1 + 13) % 16))]
65         eor     W, W, T0
66         ror     W, W, #31
67         str     W, [sp, #+eval(4*$1)]
68 >)
69
70 C F1(B,C,D) = D^(B&(C^D))
71 C ROUND1(A,B,C,D,E)
72 define(<ROUND1>, <
73         eor     T0, $3, $4
74         add     $5, $5, K
75         and     T0, T0, $2
76         add     $5, $5, $1, ror #27
77         eor     T0, T0, $4
78         add     $5, $5, W
79         ror     $2, $2, #2
80         add     $5, $5, T0
81 >)
82 C F2(B,C,D) = B^C^D
83 define(<ROUND2>, <
84         eor     T0, $2, $4
85         add     $5, $5, K
86         eor     T0, T0, $3
87         add     $5, $5, $1, ror #27
88         add     $5, $5, W
89         ror     $2, $2, #2
90         add     $5, $5, T0
91 >)
92 C F3(B,C,D) = (B&C) | (D & (B|C)) = (B & (C ^ D)) + (C & D)
93 define(<ROUND3>, <
94         eor     T0, $3, $4
95         add     $5, $5, K
96         and     T0, T0, $2
97         add     $5, $5, $1, ror #27
98         add     $5, $5, T0
99         add     $5, $5, W
100         and     T0, $3, $4
101         ror     $2, $2, #2
102         add     $5, $5, T0
103 >)
104         C void _nettle_sha1_compress(uint32_t *state, const uint8_t *input)
105         
106         .text
107         .align 2
108 .LK1:
109         .int    0x5A827999
110 .LK2:
111         .int    0x6ED9EBA1
112 .LK3:
113         .int    0x8F1BBCDC
114
115 PROLOGUE(_nettle_sha1_compress)
116         push    {r4,r5,r6,r7,r8,r10,lr}
117         sub     sp, sp, #64
118
119         C Sets SHIFT to 8*low bits of input pointer. Sets up GE flags
120         C as follows, corresponding to bytes to be used from WPREV      
121         C   SHIFT       0       8       16      24
122         C CPSR.GE       0000    1110    1100    1000
123         ands    SHIFT, INPUT, #3
124         and     INPUT, INPUT, $-4
125         ldr     WPREV, [INPUT]
126         addne   INPUT, INPUT, #4        C Unaligned input
127         lsl     SHIFT, SHIFT, #3
128         mov     T0, #0
129         movne   T0, #-1
130         lsl     W, T0, SHIFT
131         uadd8   T0, T0, W               C Sets APSR.GE bits
132         
133         ldr     K, .LK1
134         ldm     STATE, {SA,SB,SC,SD,SE}
135         
136         LOAD( 0) ROUND1(SA, SB, SC, SD, SE)
137         LOAD( 1) ROUND1(SE, SA, SB, SC, SD)
138         LOAD( 2) ROUND1(SD, SE, SA, SB, SC)
139         LOAD( 3) ROUND1(SC, SD, SE, SA, SB)
140         LOAD( 4) ROUND1(SB, SC, SD, SE, SA)
141
142         LOAD( 5) ROUND1(SA, SB, SC, SD, SE)
143         LOAD( 6) ROUND1(SE, SA, SB, SC, SD)
144         LOAD( 7) ROUND1(SD, SE, SA, SB, SC)
145         LOAD( 8) ROUND1(SC, SD, SE, SA, SB)
146         LOAD( 9) ROUND1(SB, SC, SD, SE, SA)
147
148         LOAD(10) ROUND1(SA, SB, SC, SD, SE)
149         LOAD(11) ROUND1(SE, SA, SB, SC, SD)
150         LOAD(12) ROUND1(SD, SE, SA, SB, SC)
151         LOAD(13) ROUND1(SC, SD, SE, SA, SB)
152         LOAD(14) ROUND1(SB, SC, SD, SE, SA)
153
154         LOAD(15) ROUND1(SA, SB, SC, SD, SE)
155         EXPN( 0) ROUND1(SE, SA, SB, SC, SD)
156         EXPN( 1) ROUND1(SD, SE, SA, SB, SC)
157         EXPN( 2) ROUND1(SC, SD, SE, SA, SB)
158         EXPN( 3) ROUND1(SB, SC, SD, SE, SA)
159
160         ldr     K, .LK2
161         EXPN( 4) ROUND2(SA, SB, SC, SD, SE)
162         EXPN( 5) ROUND2(SE, SA, SB, SC, SD)
163         EXPN( 6) ROUND2(SD, SE, SA, SB, SC)
164         EXPN( 7) ROUND2(SC, SD, SE, SA, SB)
165         EXPN( 8) ROUND2(SB, SC, SD, SE, SA)
166
167         EXPN( 9) ROUND2(SA, SB, SC, SD, SE)
168         EXPN(10) ROUND2(SE, SA, SB, SC, SD)
169         EXPN(11) ROUND2(SD, SE, SA, SB, SC)
170         EXPN(12) ROUND2(SC, SD, SE, SA, SB)
171         EXPN(13) ROUND2(SB, SC, SD, SE, SA)
172
173         EXPN(14) ROUND2(SA, SB, SC, SD, SE)
174         EXPN(15) ROUND2(SE, SA, SB, SC, SD)
175         EXPN( 0) ROUND2(SD, SE, SA, SB, SC)
176         EXPN( 1) ROUND2(SC, SD, SE, SA, SB)
177         EXPN( 2) ROUND2(SB, SC, SD, SE, SA)
178
179         EXPN( 3) ROUND2(SA, SB, SC, SD, SE)
180         EXPN( 4) ROUND2(SE, SA, SB, SC, SD)
181         EXPN( 5) ROUND2(SD, SE, SA, SB, SC)
182         EXPN( 6) ROUND2(SC, SD, SE, SA, SB)
183         EXPN( 7) ROUND2(SB, SC, SD, SE, SA)
184
185         ldr     K, .LK3
186         EXPN( 8) ROUND3(SA, SB, SC, SD, SE)
187         EXPN( 9) ROUND3(SE, SA, SB, SC, SD)
188         EXPN(10) ROUND3(SD, SE, SA, SB, SC)
189         EXPN(11) ROUND3(SC, SD, SE, SA, SB)
190         EXPN(12) ROUND3(SB, SC, SD, SE, SA)
191
192         EXPN(13) ROUND3(SA, SB, SC, SD, SE)
193         EXPN(14) ROUND3(SE, SA, SB, SC, SD)
194         EXPN(15) ROUND3(SD, SE, SA, SB, SC)
195         EXPN( 0) ROUND3(SC, SD, SE, SA, SB)
196         EXPN( 1) ROUND3(SB, SC, SD, SE, SA)
197
198         EXPN( 2) ROUND3(SA, SB, SC, SD, SE)
199         EXPN( 3) ROUND3(SE, SA, SB, SC, SD)
200         EXPN( 4) ROUND3(SD, SE, SA, SB, SC)
201         EXPN( 5) ROUND3(SC, SD, SE, SA, SB)
202         EXPN( 6) ROUND3(SB, SC, SD, SE, SA)
203
204         EXPN( 7) ROUND3(SA, SB, SC, SD, SE)
205         EXPN( 8) ROUND3(SE, SA, SB, SC, SD)
206         EXPN( 9) ROUND3(SD, SE, SA, SB, SC)
207         EXPN(10) ROUND3(SC, SD, SE, SA, SB)
208         EXPN(11) ROUND3(SB, SC, SD, SE, SA)
209
210         ldr     K, .LK4
211         EXPN(12) ROUND2(SA, SB, SC, SD, SE)
212         EXPN(13) ROUND2(SE, SA, SB, SC, SD)
213         EXPN(14) ROUND2(SD, SE, SA, SB, SC)
214         EXPN(15) ROUND2(SC, SD, SE, SA, SB)
215         EXPN( 0) ROUND2(SB, SC, SD, SE, SA)
216
217         EXPN( 1) ROUND2(SA, SB, SC, SD, SE)
218         EXPN( 2) ROUND2(SE, SA, SB, SC, SD)
219         EXPN( 3) ROUND2(SD, SE, SA, SB, SC)
220         EXPN( 4) ROUND2(SC, SD, SE, SA, SB)
221         EXPN( 5) ROUND2(SB, SC, SD, SE, SA)
222
223         EXPN( 6) ROUND2(SA, SB, SC, SD, SE)
224         EXPN( 7) ROUND2(SE, SA, SB, SC, SD)
225         EXPN( 8) ROUND2(SD, SE, SA, SB, SC)
226         EXPN( 9) ROUND2(SC, SD, SE, SA, SB)
227         EXPN(10) ROUND2(SB, SC, SD, SE, SA)
228
229         EXPN(11) ROUND2(SA, SB, SC, SD, SE)
230         EXPN(12) ROUND2(SE, SA, SB, SC, SD)
231         EXPN(13) ROUND2(SD, SE, SA, SB, SC)
232         EXPN(14) ROUND2(SC, SD, SE, SA, SB)
233         EXPN(15) ROUND2(SB, SC, SD, SE, SA)
234
235         C Use registers we no longer need. 
236         ldm     STATE, {INPUT,T0,SHIFT,W,K}
237         add     SA, SA, INPUT
238         add     SB, SB, T0
239         add     SC, SC, SHIFT
240         add     SD, SD, W
241         add     SE, SE, K
242         add     sp, sp, #64
243         stm     STATE, {SA,SB,SC,SD,SE}
244         pop     {r4,r5,r6,r7,r8,r10,pc} 
245 EPILOGUE(_nettle_sha1_compress)
246
247 .LK4:
248         .int    0xCA62C1D6