Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/crypto/openssl/include/internal/common.h
34879 views
1
/*
2
* Copyright 1995-2025 The OpenSSL Project Authors. All Rights Reserved.
3
*
4
* Licensed under the Apache License 2.0 (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
#ifndef OSSL_INTERNAL_COMMON_H
11
# define OSSL_INTERNAL_COMMON_H
12
# pragma once
13
14
# include <stdlib.h>
15
# include <string.h>
16
# include "openssl/configuration.h"
17
18
# include "internal/e_os.h" /* ossl_inline in many files */
19
# include "internal/nelem.h"
20
21
# if defined(__GNUC__) || defined(__clang__)
22
# define ossl_likely(x) __builtin_expect(!!(x), 1)
23
# define ossl_unlikely(x) __builtin_expect(!!(x), 0)
24
# else
25
# define ossl_likely(x) (x)
26
# define ossl_unlikely(x) (x)
27
# endif
28
29
# if defined(__GNUC__) || defined(__clang__)
30
# define ALIGN32 __attribute((aligned(32)))
31
# define ALIGN64 __attribute((aligned(64)))
32
# elif defined(_MSC_VER)
33
# define ALIGN32 __declspec(align(32))
34
# define ALIGN64 __declspec(align(64))
35
# else
36
# define ALIGN32
37
# define ALIGN64
38
# endif
39
40
# ifdef NDEBUG
41
# define ossl_assert(x) ossl_likely((x) != 0)
42
# else
43
__owur static ossl_inline int ossl_assert_int(int expr, const char *exprstr,
44
const char *file, int line)
45
{
46
if (!expr)
47
OPENSSL_die(exprstr, file, line);
48
49
return expr;
50
}
51
52
# define ossl_assert(x) ossl_assert_int((x) != 0, "Assertion failed: "#x, \
53
__FILE__, __LINE__)
54
55
# endif
56
57
/* Check if |pre|, which must be a string literal, is a prefix of |str| */
58
#define HAS_PREFIX(str, pre) (strncmp(str, pre "", sizeof(pre) - 1) == 0)
59
/* As before, and if check succeeds, advance |str| past the prefix |pre| */
60
#define CHECK_AND_SKIP_PREFIX(str, pre) \
61
(HAS_PREFIX(str, pre) ? ((str) += sizeof(pre) - 1, 1) : 0)
62
/* Check if the string literal |p| is a case-insensitive prefix of |s| */
63
#define HAS_CASE_PREFIX(s, p) (OPENSSL_strncasecmp(s, p "", sizeof(p) - 1) == 0)
64
/* As before, and if check succeeds, advance |str| past the prefix |pre| */
65
#define CHECK_AND_SKIP_CASE_PREFIX(str, pre) \
66
(HAS_CASE_PREFIX(str, pre) ? ((str) += sizeof(pre) - 1, 1) : 0)
67
/* Check if the string literal |suffix| is a case-insensitive suffix of |str| */
68
#define HAS_CASE_SUFFIX(str, suffix) (strlen(str) < sizeof(suffix) - 1 ? 0 : \
69
OPENSSL_strcasecmp(str + strlen(str) - sizeof(suffix) + 1, suffix "") == 0)
70
71
/*
72
* Use this inside a union with the field that needs to be aligned to a
73
* reasonable boundary for the platform. The most pessimistic alignment
74
* of the listed types will be used by the compiler.
75
*/
76
# define OSSL_UNION_ALIGN \
77
double align; \
78
ossl_uintmax_t align_int; \
79
void *align_ptr
80
81
# define OPENSSL_CONF "openssl.cnf"
82
83
# ifndef OPENSSL_SYS_VMS
84
# define X509_CERT_AREA OPENSSLDIR
85
# define X509_CERT_DIR OPENSSLDIR "/certs"
86
# define X509_CERT_FILE OPENSSLDIR "/cert.pem"
87
# define X509_PRIVATE_DIR OPENSSLDIR "/private"
88
# define CTLOG_FILE OPENSSLDIR "/ct_log_list.cnf"
89
# else
90
# define X509_CERT_AREA "OSSL$DATAROOT:[000000]"
91
# define X509_CERT_DIR "OSSL$DATAROOT:[CERTS]"
92
# define X509_CERT_FILE "OSSL$DATAROOT:[000000]cert.pem"
93
# define X509_PRIVATE_DIR "OSSL$DATAROOT:[PRIVATE]"
94
# define CTLOG_FILE "OSSL$DATAROOT:[000000]ct_log_list.cnf"
95
# endif
96
97
# define X509_CERT_DIR_EVP "SSL_CERT_DIR"
98
# define X509_CERT_FILE_EVP "SSL_CERT_FILE"
99
# define CTLOG_FILE_EVP "CTLOG_FILE"
100
101
/* size of string representations */
102
# define DECIMAL_SIZE(type) ((sizeof(type)*8+2)/3+1)
103
# define HEX_SIZE(type) (sizeof(type)*2)
104
105
# define c2l(c,l) (l = ((unsigned long)(*((c)++))) , \
106
l|=(((unsigned long)(*((c)++)))<< 8), \
107
l|=(((unsigned long)(*((c)++)))<<16), \
108
l|=(((unsigned long)(*((c)++)))<<24))
109
110
/* NOTE - c is not incremented as per c2l */
111
# define c2ln(c,l1,l2,n) { \
112
c+=n; \
113
l1=l2=0; \
114
switch (n) { \
115
case 8: l2 =((unsigned long)(*(--(c))))<<24; \
116
case 7: l2|=((unsigned long)(*(--(c))))<<16; \
117
case 6: l2|=((unsigned long)(*(--(c))))<< 8; \
118
case 5: l2|=((unsigned long)(*(--(c)))); \
119
case 4: l1 =((unsigned long)(*(--(c))))<<24; \
120
case 3: l1|=((unsigned long)(*(--(c))))<<16; \
121
case 2: l1|=((unsigned long)(*(--(c))))<< 8; \
122
case 1: l1|=((unsigned long)(*(--(c)))); \
123
} \
124
}
125
126
# define l2c(l,c) (*((c)++)=(unsigned char)(((l) )&0xff), \
127
*((c)++)=(unsigned char)(((l)>> 8)&0xff), \
128
*((c)++)=(unsigned char)(((l)>>16)&0xff), \
129
*((c)++)=(unsigned char)(((l)>>24)&0xff))
130
131
# define n2l(c,l) (l =((unsigned long)(*((c)++)))<<24, \
132
l|=((unsigned long)(*((c)++)))<<16, \
133
l|=((unsigned long)(*((c)++)))<< 8, \
134
l|=((unsigned long)(*((c)++))))
135
136
# define n2l8(c,l) (l =((uint64_t)(*((c)++)))<<56, \
137
l|=((uint64_t)(*((c)++)))<<48, \
138
l|=((uint64_t)(*((c)++)))<<40, \
139
l|=((uint64_t)(*((c)++)))<<32, \
140
l|=((uint64_t)(*((c)++)))<<24, \
141
l|=((uint64_t)(*((c)++)))<<16, \
142
l|=((uint64_t)(*((c)++)))<< 8, \
143
l|=((uint64_t)(*((c)++))))
144
145
# define l2n(l,c) (*((c)++)=(unsigned char)(((l)>>24)&0xff), \
146
*((c)++)=(unsigned char)(((l)>>16)&0xff), \
147
*((c)++)=(unsigned char)(((l)>> 8)&0xff), \
148
*((c)++)=(unsigned char)(((l) )&0xff))
149
150
# define l2n8(l,c) (*((c)++)=(unsigned char)(((l)>>56)&0xff), \
151
*((c)++)=(unsigned char)(((l)>>48)&0xff), \
152
*((c)++)=(unsigned char)(((l)>>40)&0xff), \
153
*((c)++)=(unsigned char)(((l)>>32)&0xff), \
154
*((c)++)=(unsigned char)(((l)>>24)&0xff), \
155
*((c)++)=(unsigned char)(((l)>>16)&0xff), \
156
*((c)++)=(unsigned char)(((l)>> 8)&0xff), \
157
*((c)++)=(unsigned char)(((l) )&0xff))
158
159
/* NOTE - c is not incremented as per l2c */
160
# define l2cn(l1,l2,c,n) { \
161
c+=n; \
162
switch (n) { \
163
case 8: *(--(c))=(unsigned char)(((l2)>>24)&0xff); \
164
case 7: *(--(c))=(unsigned char)(((l2)>>16)&0xff); \
165
case 6: *(--(c))=(unsigned char)(((l2)>> 8)&0xff); \
166
case 5: *(--(c))=(unsigned char)(((l2) )&0xff); \
167
case 4: *(--(c))=(unsigned char)(((l1)>>24)&0xff); \
168
case 3: *(--(c))=(unsigned char)(((l1)>>16)&0xff); \
169
case 2: *(--(c))=(unsigned char)(((l1)>> 8)&0xff); \
170
case 1: *(--(c))=(unsigned char)(((l1) )&0xff); \
171
} \
172
}
173
174
# define n2s(c,s) ((s=(((unsigned int)((c)[0]))<< 8)| \
175
(((unsigned int)((c)[1])) )),(c)+=2)
176
# define s2n(s,c) (((c)[0]=(unsigned char)(((s)>> 8)&0xff), \
177
(c)[1]=(unsigned char)(((s) )&0xff)),(c)+=2)
178
179
# define n2l3(c,l) ((l =(((unsigned long)((c)[0]))<<16)| \
180
(((unsigned long)((c)[1]))<< 8)| \
181
(((unsigned long)((c)[2])) )),(c)+=3)
182
183
# define l2n3(l,c) (((c)[0]=(unsigned char)(((l)>>16)&0xff), \
184
(c)[1]=(unsigned char)(((l)>> 8)&0xff), \
185
(c)[2]=(unsigned char)(((l) )&0xff)),(c)+=3)
186
187
static ossl_inline int ossl_ends_with_dirsep(const char *path)
188
{
189
if (*path != '\0')
190
path += strlen(path) - 1;
191
# if defined __VMS
192
if (*path == ']' || *path == '>' || *path == ':')
193
return 1;
194
# elif defined _WIN32
195
if (*path == '\\')
196
return 1;
197
# endif
198
return *path == '/';
199
}
200
201
static ossl_inline char ossl_determine_dirsep(const char *path)
202
{
203
if (ossl_ends_with_dirsep(path))
204
return '\0';
205
206
# if defined(_WIN32)
207
return '\\';
208
# elif defined(__VMS)
209
return ':';
210
# else
211
return '/';
212
# endif
213
}
214
215
static ossl_inline int ossl_is_absolute_path(const char *path)
216
{
217
# if defined __VMS
218
if (strchr(path, ':') != NULL
219
|| ((path[0] == '[' || path[0] == '<')
220
&& path[1] != '.' && path[1] != '-'
221
&& path[1] != ']' && path[1] != '>'))
222
return 1;
223
# elif defined _WIN32
224
if (path[0] == '\\'
225
|| (path[0] != '\0' && path[1] == ':'))
226
return 1;
227
# endif
228
return path[0] == '/';
229
}
230
231
const char *ossl_get_openssldir(void);
232
const char *ossl_get_enginesdir(void);
233
const char *ossl_get_modulesdir(void);
234
const char *ossl_get_wininstallcontext(void);
235
236
#endif
237
238