summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/crypto_internal.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lib/libcrypto/crypto_internal.h305
1 files changed, 0 insertions, 305 deletions
diff --git a/src/lib/libcrypto/crypto_internal.h b/src/lib/libcrypto/crypto_internal.h
deleted file mode 100644
index 09ae7fa466..0000000000
--- a/src/lib/libcrypto/crypto_internal.h
+++ /dev/null
@@ -1,305 +0,0 @@
1/* $OpenBSD: crypto_internal.h,v 1.15 2025/01/19 07:51:41 jsing Exp $ */
2/*
3 * Copyright (c) 2023 Joel Sing <jsing@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#include <endian.h>
19#include <stddef.h>
20#include <stdint.h>
21#include <string.h>
22
23#include "crypto_arch.h"
24
25#ifndef HEADER_CRYPTO_INTERNAL_H
26#define HEADER_CRYPTO_INTERNAL_H
27
28#define CTASSERT(x) \
29 extern char _ctassert[(x) ? 1 : -1] __attribute__((__unused__))
30
31/*
32 * Constant time functions for size_t.
33 */
34#ifndef HAVE_CRYPTO_CT_NE_ZERO
35static inline int
36crypto_ct_ne_zero(size_t v)
37{
38 return (v | ~(v - 1)) >> ((sizeof(v) * 8) - 1);
39}
40#endif
41
42#ifndef HAVE_CRYPTO_CT_NE_ZERO_MASK
43static inline size_t
44crypto_ct_ne_zero_mask(size_t v)
45{
46 return 0 - crypto_ct_ne_zero(v);
47}
48#endif
49
50#ifndef HAVE_CRYPTO_CT_EQ_ZERO
51static inline int
52crypto_ct_eq_zero(size_t v)
53{
54 return 1 - crypto_ct_ne_zero(v);
55}
56#endif
57
58#ifndef HAVE_CRYPTO_CT_EQ_ZERO_MASK_U8
59static inline size_t
60crypto_ct_eq_zero_mask(size_t v)
61{
62 return 0 - crypto_ct_eq_zero(v);
63}
64#endif
65
66#ifndef HAVE_CRYPTO_CT_LT
67static inline int
68crypto_ct_lt(size_t a, size_t b)
69{
70 return (((a - b) | (b & ~a)) & (b | ~a)) >>
71 (sizeof(size_t) * 8 - 1);
72}
73#endif
74
75#ifndef HAVE_CRYPTO_CT_LT_MASK
76static inline size_t
77crypto_ct_lt_mask(size_t a, size_t b)
78{
79 return 0 - crypto_ct_lt(a, b);
80}
81#endif
82
83#ifndef HAVE_CRYPTO_CT_GT
84static inline int
85crypto_ct_gt(size_t a, size_t b)
86{
87 return crypto_ct_lt(b, a);
88}
89#endif
90
91#ifndef HAVE_CRYPTO_CT_GT_MASK
92static inline size_t
93crypto_ct_gt_mask(size_t a, size_t b)
94{
95 return 0 - crypto_ct_gt(a, b);
96}
97#endif
98
99/*
100 * Constant time operations for uint8_t.
101 */
102#ifndef HAVE_CRYPTO_CT_NE_ZERO_U8
103static inline int
104crypto_ct_ne_zero_u8(uint8_t v)
105{
106 return (uint8_t)(v | ~(v - 1)) >> ((sizeof(v) * 8) - 1);
107}
108#endif
109
110#ifndef HAVE_CRYPTO_CT_NE_ZERO_MASK_U8
111static inline uint8_t
112crypto_ct_ne_zero_mask_u8(uint8_t v)
113{
114 return 0 - crypto_ct_ne_zero_u8(v);
115}
116#endif
117
118#ifndef HAVE_CRYPTO_CT_EQ_ZERO_U8
119static inline int
120crypto_ct_eq_zero_u8(uint8_t v)
121{
122 return 1 - crypto_ct_ne_zero_u8(v);
123}
124#endif
125
126#ifndef HAVE_CRYPTO_CT_EQ_ZERO_MASK_U8
127static inline uint8_t
128crypto_ct_eq_zero_mask_u8(uint8_t v)
129{
130 return 0 - crypto_ct_eq_zero_u8(v);
131}
132#endif
133
134#ifndef HAVE_CRYPTO_CT_NE_U8
135static inline int
136crypto_ct_ne_u8(uint8_t a, uint8_t b)
137{
138 return crypto_ct_ne_zero_u8(a - b);
139}
140#endif
141
142#ifndef HAVE_CRYPTO_CT_NE_MASK_U8
143static inline uint8_t
144crypto_ct_ne_mask_u8(uint8_t a, uint8_t b)
145{
146 return 0 - crypto_ct_ne_u8(a, b);
147}
148#endif
149
150#ifndef HAVE_CRYPTO_CT_EQ_U8
151static inline int
152crypto_ct_eq_u8(uint8_t a, uint8_t b)
153{
154 return crypto_ct_eq_zero_u8(a - b);
155}
156#endif
157
158#ifndef HAVE_CRYPTO_CT_EQ_MASK_U8
159static inline uint8_t
160crypto_ct_eq_mask_u8(uint8_t a, uint8_t b)
161{
162 return 0 - crypto_ct_eq_u8(a, b);
163}
164#endif
165
166/*
167 * crypto_load_be32toh() loads a 32 bit unsigned big endian value as a 32 bit
168 * unsigned host endian value, from the specified address in memory. The memory
169 * address may have any alignment.
170 */
171#ifndef HAVE_CRYPTO_LOAD_BE32TOH
172static inline uint32_t
173crypto_load_be32toh(const uint8_t *src)
174{
175 uint32_t v;
176
177 memcpy(&v, src, sizeof(v));
178
179 return be32toh(v);
180}
181#endif
182
183/*
184 * crypto_store_htobe32() stores a 32 bit unsigned host endian value as a 32 bit
185 * unsigned big endian value, at the specified address in memory. The memory
186 * address may have any alignment.
187 */
188#ifndef HAVE_CRYPTO_STORE_HTOBE32
189static inline void
190crypto_store_htobe32(uint8_t *dst, uint32_t v)
191{
192 v = htobe32(v);
193 memcpy(dst, &v, sizeof(v));
194}
195#endif
196
197/*
198 * crypto_load_be64toh() loads a 64 bit unsigned big endian value as a 64 bit
199 * unsigned host endian value, from the specified address in memory. The memory
200 * address may have any alignment.
201 */
202#ifndef HAVE_CRYPTO_LOAD_BE64TOH
203static inline uint64_t
204crypto_load_be64toh(const uint8_t *src)
205{
206 uint64_t v;
207
208 memcpy(&v, src, sizeof(v));
209
210 return be64toh(v);
211}
212#endif
213
214/*
215 * crypto_store_htobe64() stores a 64 bit unsigned host endian value as a 64 bit
216 * unsigned big endian value, at the specified address in memory. The memory
217 * address may have any alignment.
218 */
219#ifndef HAVE_CRYPTO_STORE_HTOBE64
220static inline void
221crypto_store_htobe64(uint8_t *dst, uint64_t v)
222{
223 v = htobe64(v);
224 memcpy(dst, &v, sizeof(v));
225}
226#endif
227
228/*
229 * crypto_load_le32toh() loads a 32 bit unsigned little endian value as a 32 bit
230 * unsigned host endian value, from the specified address in memory. The memory
231 * address may have any alignment.
232 */
233#ifndef HAVE_CRYPTO_LOAD_LE32TOH
234static inline uint32_t
235crypto_load_le32toh(const uint8_t *src)
236{
237 uint32_t v;
238
239 memcpy(&v, src, sizeof(v));
240
241 return le32toh(v);
242}
243#endif
244
245/*
246 * crypto_store_htole32() stores a 32 bit unsigned host endian value as a 32 bit
247 * unsigned little endian value, at the specified address in memory. The memory
248 * address may have any alignment.
249 */
250#ifndef HAVE_CRYPTO_STORE_HTOLE32
251static inline void
252crypto_store_htole32(uint8_t *dst, uint32_t v)
253{
254 v = htole32(v);
255 memcpy(dst, &v, sizeof(v));
256}
257#endif
258
259#ifndef HAVE_CRYPTO_ADD_U32DW_U64
260static inline void
261crypto_add_u32dw_u64(uint32_t *h, uint32_t *l, uint64_t v)
262{
263 v += ((uint64_t)*h << 32) | *l;
264 *h = v >> 32;
265 *l = v;
266}
267#endif
268
269#ifndef HAVE_CRYPTO_ROL_U32
270static inline uint32_t
271crypto_rol_u32(uint32_t v, size_t shift)
272{
273 return (v << shift) | (v >> (32 - shift));
274}
275#endif
276
277#ifndef HAVE_CRYPTO_ROR_U32
278static inline uint32_t
279crypto_ror_u32(uint32_t v, size_t shift)
280{
281 return (v << (32 - shift)) | (v >> shift);
282}
283#endif
284
285#ifndef HAVE_CRYPTO_ROL_U64
286static inline uint64_t
287crypto_rol_u64(uint64_t v, size_t shift)
288{
289 return (v << shift) | (v >> (64 - shift));
290}
291#endif
292
293#ifndef HAVE_CRYPTO_ROR_U64
294static inline uint64_t
295crypto_ror_u64(uint64_t v, size_t shift)
296{
297 return (v << (64 - shift)) | (v >> shift);
298}
299#endif
300
301void crypto_cpu_caps_init(void);
302
303uint64_t crypto_cpu_caps_ia32(void);
304
305#endif