Prevent over long nonces in ChaCha20-Poly1305
[openssl.git] / crypto / armv4cpuid.pl
1 #! /usr/bin/env perl
2 # Copyright 2015-2018 The OpenSSL Project Authors. All Rights Reserved.
3 #
4 # Licensed under the OpenSSL license (the "License").  You may not use
5 # this file except in compliance with the License.  You can obtain a copy
6 # in the file LICENSE in the source distribution or at
7 # https://www.openssl.org/source/license.html
8
9
10 $flavour = shift;
11 $output  = shift;
12
13 $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
14 ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or
15 ( $xlate="${dir}perlasm/arm-xlate.pl" and -f $xlate) or
16 die "can't locate arm-xlate.pl";
17
18 open OUT,"| \"$^X\" $xlate $flavour $output";
19 *STDOUT=*OUT;
20
21 $code.=<<___;
22 #include "arm_arch.h"
23
24 .text
25 #if defined(__thumb2__) && !defined(__APPLE__)
26 .syntax unified
27 .thumb
28 #else
29 .code   32
30 #undef  __thumb2__
31 #endif
32
33 .align  5
34 .global OPENSSL_atomic_add
35 .type   OPENSSL_atomic_add,%function
36 OPENSSL_atomic_add:
37 #if __ARM_ARCH__>=6
38 .Ladd:  ldrex   r2,[r0]
39         add     r3,r2,r1
40         strex   r2,r3,[r0]
41         cmp     r2,#0
42         bne     .Ladd
43         mov     r0,r3
44         bx      lr
45 #else
46         stmdb   sp!,{r4-r6,lr}
47         ldr     r2,.Lspinlock
48         adr     r3,.Lspinlock
49         mov     r4,r0
50         mov     r5,r1
51         add     r6,r3,r2        @ &spinlock
52         b       .+8
53 .Lspin: bl      sched_yield
54         mov     r0,#-1
55         swp     r0,r0,[r6]
56         cmp     r0,#0
57         bne     .Lspin
58
59         ldr     r2,[r4]
60         add     r2,r2,r5
61         str     r2,[r4]
62         str     r0,[r6]         @ release spinlock
63         ldmia   sp!,{r4-r6,lr}
64         tst     lr,#1
65         moveq   pc,lr
66         .word   0xe12fff1e      @ bx    lr
67 #endif
68 .size   OPENSSL_atomic_add,.-OPENSSL_atomic_add
69
70 .global OPENSSL_cleanse
71 .type   OPENSSL_cleanse,%function
72 OPENSSL_cleanse:
73         eor     ip,ip,ip
74         cmp     r1,#7
75 #ifdef  __thumb2__
76         itt     hs
77 #endif
78         subhs   r1,r1,#4
79         bhs     .Lot
80         cmp     r1,#0
81         beq     .Lcleanse_done
82 .Little:
83         strb    ip,[r0],#1
84         subs    r1,r1,#1
85         bhi     .Little
86         b       .Lcleanse_done
87
88 .Lot:   tst     r0,#3
89         beq     .Laligned
90         strb    ip,[r0],#1
91         sub     r1,r1,#1
92         b       .Lot
93 .Laligned:
94         str     ip,[r0],#4
95         subs    r1,r1,#4
96         bhs     .Laligned
97         adds    r1,r1,#4
98         bne     .Little
99 .Lcleanse_done:
100 #if __ARM_ARCH__>=5
101         bx      lr
102 #else
103         tst     lr,#1
104         moveq   pc,lr
105         .word   0xe12fff1e      @ bx    lr
106 #endif
107 .size   OPENSSL_cleanse,.-OPENSSL_cleanse
108
109 .global CRYPTO_memcmp
110 .type   CRYPTO_memcmp,%function
111 .align  4
112 CRYPTO_memcmp:
113         eor     ip,ip,ip
114         cmp     r2,#0
115         beq     .Lno_data
116         stmdb   sp!,{r4,r5}
117
118 .Loop_cmp:
119         ldrb    r4,[r0],#1
120         ldrb    r5,[r1],#1
121         eor     r4,r4,r5
122         orr     ip,ip,r4
123         subs    r2,r2,#1
124         bne     .Loop_cmp
125
126         ldmia   sp!,{r4,r5}
127 .Lno_data:
128         rsb     r0,ip,#0
129         mov     r0,r0,lsr#31
130 #if __ARM_ARCH__>=5
131         bx      lr
132 #else
133         tst     lr,#1
134         moveq   pc,lr
135         .word   0xe12fff1e      @ bx    lr
136 #endif
137 .size   CRYPTO_memcmp,.-CRYPTO_memcmp
138
139 #if __ARM_MAX_ARCH__>=7
140 .arch   armv7-a
141 .fpu    neon
142
143 .align  5
144 .global _armv7_neon_probe
145 .type   _armv7_neon_probe,%function
146 _armv7_neon_probe:
147         vorr    q0,q0,q0
148         bx      lr
149 .size   _armv7_neon_probe,.-_armv7_neon_probe
150
151 .global _armv7_tick
152 .type   _armv7_tick,%function
153 _armv7_tick:
154 #ifdef  __APPLE__
155         mrrc    p15,0,r0,r1,c14         @ CNTPCT
156 #else
157         mrrc    p15,1,r0,r1,c14         @ CNTVCT
158 #endif
159         bx      lr
160 .size   _armv7_tick,.-_armv7_tick
161
162 .global _armv8_aes_probe
163 .type   _armv8_aes_probe,%function
164 _armv8_aes_probe:
165 #if defined(__thumb2__) && !defined(__APPLE__)
166         .byte   0xb0,0xff,0x00,0x03     @ aese.8        q0,q0
167 #else
168         .byte   0x00,0x03,0xb0,0xf3     @ aese.8        q0,q0
169 #endif
170         bx      lr
171 .size   _armv8_aes_probe,.-_armv8_aes_probe
172
173 .global _armv8_sha1_probe
174 .type   _armv8_sha1_probe,%function
175 _armv8_sha1_probe:
176 #if defined(__thumb2__) && !defined(__APPLE__)
177         .byte   0x00,0xef,0x40,0x0c     @ sha1c.32      q0,q0,q0
178 #else
179         .byte   0x40,0x0c,0x00,0xf2     @ sha1c.32      q0,q0,q0
180 #endif
181         bx      lr
182 .size   _armv8_sha1_probe,.-_armv8_sha1_probe
183
184 .global _armv8_sha256_probe
185 .type   _armv8_sha256_probe,%function
186 _armv8_sha256_probe:
187 #if defined(__thumb2__) && !defined(__APPLE__)
188         .byte   0x00,0xff,0x40,0x0c     @ sha256h.32    q0,q0,q0
189 #else
190         .byte   0x40,0x0c,0x00,0xf3     @ sha256h.32    q0,q0,q0
191 #endif
192         bx      lr
193 .size   _armv8_sha256_probe,.-_armv8_sha256_probe
194 .global _armv8_pmull_probe
195 .type   _armv8_pmull_probe,%function
196 _armv8_pmull_probe:
197 #if defined(__thumb2__) && !defined(__APPLE__)
198         .byte   0xa0,0xef,0x00,0x0e     @ vmull.p64     q0,d0,d0
199 #else
200         .byte   0x00,0x0e,0xa0,0xf2     @ vmull.p64     q0,d0,d0
201 #endif
202         bx      lr
203 .size   _armv8_pmull_probe,.-_armv8_pmull_probe
204 #endif
205
206 .global OPENSSL_wipe_cpu
207 .type   OPENSSL_wipe_cpu,%function
208 OPENSSL_wipe_cpu:
209 #if __ARM_MAX_ARCH__>=7
210         ldr     r0,.LOPENSSL_armcap
211         adr     r1,.LOPENSSL_armcap
212         ldr     r0,[r1,r0]
213 #ifdef  __APPLE__
214         ldr     r0,[r0]
215 #endif
216 #endif
217         eor     r2,r2,r2
218         eor     r3,r3,r3
219         eor     ip,ip,ip
220 #if __ARM_MAX_ARCH__>=7
221         tst     r0,#1
222         beq     .Lwipe_done
223         veor    q0, q0, q0
224         veor    q1, q1, q1
225         veor    q2, q2, q2
226         veor    q3, q3, q3
227         veor    q8, q8, q8
228         veor    q9, q9, q9
229         veor    q10, q10, q10
230         veor    q11, q11, q11
231         veor    q12, q12, q12
232         veor    q13, q13, q13
233         veor    q14, q14, q14
234         veor    q15, q15, q15
235 .Lwipe_done:
236 #endif
237         mov     r0,sp
238 #if __ARM_ARCH__>=5
239         bx      lr
240 #else
241         tst     lr,#1
242         moveq   pc,lr
243         .word   0xe12fff1e      @ bx    lr
244 #endif
245 .size   OPENSSL_wipe_cpu,.-OPENSSL_wipe_cpu
246
247 .global OPENSSL_instrument_bus
248 .type   OPENSSL_instrument_bus,%function
249 OPENSSL_instrument_bus:
250         eor     r0,r0,r0
251 #if __ARM_ARCH__>=5
252         bx      lr
253 #else
254         tst     lr,#1
255         moveq   pc,lr
256         .word   0xe12fff1e      @ bx    lr
257 #endif
258 .size   OPENSSL_instrument_bus,.-OPENSSL_instrument_bus
259
260 .global OPENSSL_instrument_bus2
261 .type   OPENSSL_instrument_bus2,%function
262 OPENSSL_instrument_bus2:
263         eor     r0,r0,r0
264 #if __ARM_ARCH__>=5
265         bx      lr
266 #else
267         tst     lr,#1
268         moveq   pc,lr
269         .word   0xe12fff1e      @ bx    lr
270 #endif
271 .size   OPENSSL_instrument_bus2,.-OPENSSL_instrument_bus2
272
273 .align  5
274 #if __ARM_MAX_ARCH__>=7
275 .LOPENSSL_armcap:
276 .word   OPENSSL_armcap_P-.
277 #endif
278 #if __ARM_ARCH__>=6
279 .align  5
280 #else
281 .Lspinlock:
282 .word   atomic_add_spinlock-.Lspinlock
283 .align  5
284
285 .data
286 .align  2
287 atomic_add_spinlock:
288 .word   0
289 #endif
290
291 .comm   OPENSSL_armcap_P,4,4
292 .hidden OPENSSL_armcap_P
293 ___
294
295 print $code;
296 close STDOUT;