]>
Commit | Line | Data |
---|---|---|
e039ca38 RL |
1 | /* |
2 | * Copyright 2019 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 | ||
d6e9ddac | 10 | #include <openssl/opensslconf.h> |
a6a4d0ac | 11 | #include <openssl/opensslv.h> |
d6e9ddac | 12 | |
e039ca38 RL |
13 | #ifndef OPENSSL_MACROS_H |
14 | # define OPENSSL_MACROS_H | |
15 | ||
932748fe DDO |
16 | /* Helper macros for CPP string composition */ |
17 | # define OPENSSL_MSTR_HELPER(x) #x | |
18 | # define OPENSSL_MSTR(x) OPENSSL_MSTR_HELPER(x) | |
19 | ||
e039ca38 RL |
20 | /* |
21 | * Sometimes OPENSSSL_NO_xxx ends up with an empty file and some compilers | |
22 | * don't like that. This will hopefully silence them. | |
23 | */ | |
24 | # define NON_EMPTY_TRANSLATION_UNIT static void *dummy = &dummy; | |
25 | ||
26 | /* | |
a6a4d0ac | 27 | * Generic deprecation macro |
c72fa255 MC |
28 | * |
29 | * If OPENSSL_SUPPRESS_DEPRECATED is defined, then DECLARE_DEPRECATED | |
30 | * becomes a no-op | |
e039ca38 RL |
31 | */ |
32 | # ifndef DECLARE_DEPRECATED | |
33 | # define DECLARE_DEPRECATED(f) f; | |
67b8f5bd MC |
34 | # ifndef OPENSSL_SUPPRESS_DEPRECATED |
35 | # ifdef __GNUC__ | |
36 | # if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 0) | |
37 | # undef DECLARE_DEPRECATED | |
38 | # define DECLARE_DEPRECATED(f) f __attribute__ ((deprecated)); | |
39 | # endif | |
40 | # elif defined(__SUNPRO_C) | |
41 | # if (__SUNPRO_C >= 0x5130) | |
42 | # undef DECLARE_DEPRECATED | |
43 | # define DECLARE_DEPRECATED(f) f __attribute__ ((deprecated)); | |
44 | # endif | |
e039ca38 RL |
45 | # endif |
46 | # endif | |
47 | # endif | |
48 | ||
49 | /* | |
a6a4d0ac RL |
50 | * Applications should use -DOPENSSL_API_COMPAT=<version> to suppress the |
51 | * declarations of functions deprecated in or before <version>. If this is | |
52 | * undefined, the value of the macro OPENSSL_CONFIGURED_API (defined in | |
53 | * <openssl/opensslconf.h>) is the default. | |
54 | * | |
55 | * For any version number up until version 1.1.x, <version> is expected to be | |
56 | * the calculated version number 0xMNNFFPPSL. | |
57 | * For version numbers 3.0 and on, <version> is expected to be a computation | |
58 | * of the major and minor numbers in decimal using this formula: | |
59 | * | |
60 | * MAJOR * 10000 + MINOR * 100 | |
e039ca38 | 61 | * |
a6a4d0ac | 62 | * So version 3.0 becomes 30000, version 3.2 becomes 30200, etc. |
e039ca38 RL |
63 | */ |
64 | ||
a6a4d0ac RL |
65 | /* |
66 | * We use the OPENSSL_API_COMPAT value to define API level macros. These | |
67 | * macros are used to enable or disable features at that API version boundary. | |
68 | */ | |
69 | ||
70 | # ifdef OPENSSL_API_LEVEL | |
71 | # error "OPENSSL_API_LEVEL must not be defined by application" | |
e039ca38 RL |
72 | # endif |
73 | ||
a6a4d0ac RL |
74 | /* |
75 | * We figure out what API level was intended by simple numeric comparison. | |
76 | * The lowest old style number we recognise is 0x00908000L, so we take some | |
77 | * safety margin and assume that anything below 0x00900000L is a new style | |
78 | * number. This allows new versions up to and including v943.71.83. | |
79 | */ | |
80 | # ifdef OPENSSL_API_COMPAT | |
81 | # if OPENSSL_API_COMPAT < 0x900000L | |
82 | # define OPENSSL_API_LEVEL (OPENSSL_API_COMPAT) | |
e039ca38 | 83 | # else |
a6a4d0ac RL |
84 | # define OPENSSL_API_LEVEL \ |
85 | (((OPENSSL_API_COMPAT >> 28) & 0xF) * 10000 \ | |
86 | + ((OPENSSL_API_COMPAT >> 20) & 0xFF) * 100 \ | |
87 | + ((OPENSSL_API_COMPAT >> 12) & 0xFF)) | |
e039ca38 RL |
88 | # endif |
89 | # endif | |
90 | ||
91 | /* | |
a6a4d0ac RL |
92 | * If OPENSSL_API_COMPAT wasn't given, we use default numbers to set |
93 | * the API compatibility level. | |
e039ca38 | 94 | */ |
a6a4d0ac RL |
95 | # ifndef OPENSSL_API_LEVEL |
96 | # if OPENSSL_CONFIGURED_API > 0 | |
97 | # define OPENSSL_API_LEVEL (OPENSSL_CONFIGURED_API) | |
98 | # else | |
99 | # define OPENSSL_API_LEVEL \ | |
100 | (OPENSSL_VERSION_MAJOR * 10000 + OPENSSL_VERSION_MINOR * 100) | |
101 | # endif | |
102 | # endif | |
d6e9ddac | 103 | |
a6a4d0ac RL |
104 | # if OPENSSL_API_LEVEL > OPENSSL_CONFIGURED_API |
105 | # error "The requested API level higher than the configured API compatibility level" | |
e039ca38 RL |
106 | # endif |
107 | ||
a6a4d0ac RL |
108 | /* |
109 | * Check of sane values. | |
110 | */ | |
111 | /* Can't go higher than the current version. */ | |
112 | # if OPENSSL_API_LEVEL > (OPENSSL_VERSION_MAJOR * 10000 + OPENSSL_VERSION_MINOR * 100) | |
113 | # error "OPENSSL_API_COMPAT expresses an impossible API compatibility level" | |
114 | # endif | |
115 | /* OpenSSL will have no version 2.y.z */ | |
116 | # if OPENSSL_API_LEVEL < 30000 && OPENSSL_API_LEVEL >= 20000 | |
117 | # error "OPENSSL_API_COMPAT expresses an impossible API compatibility level" | |
e039ca38 | 118 | # endif |
a6a4d0ac RL |
119 | /* Below 0.9.8 is unacceptably low */ |
120 | # if OPENSSL_API_LEVEL < 908 | |
121 | # error "OPENSSL_API_COMPAT expresses an impossible API compatibility level" | |
122 | # endif | |
123 | ||
124 | /* | |
125 | * Define macros for deprecation purposes. We always define the macros | |
126 | * DEPERECATEDIN_{major}_{minor}() for all OpenSSL versions we care for, | |
127 | * and OPENSSL_NO_DEPRECATED_{major}_{minor} to be used to check if | |
128 | * removal of deprecated functions applies on that particular version. | |
129 | */ | |
130 | ||
131 | # undef OPENSSL_NO_DEPRECATED_3_0 | |
132 | # undef OPENSSL_NO_DEPRECATED_1_1_1 | |
133 | # undef OPENSSL_NO_DEPRECATED_1_1_0 | |
134 | # undef OPENSSL_NO_DEPRECATED_1_0_2 | |
135 | # undef OPENSSL_NO_DEPRECATED_1_0_1 | |
136 | # undef OPENSSL_NO_DEPRECATED_1_0_0 | |
137 | # undef OPENSSL_NO_DEPRECATED_0_9_8 | |
e039ca38 | 138 | |
a6a4d0ac RL |
139 | # if OPENSSL_API_LEVEL >= 30000 |
140 | # ifndef OPENSSL_NO_DEPRECATED | |
141 | # define DEPRECATEDIN_3_0(f) DECLARE_DEPRECATED(f) | |
142 | # else | |
143 | # define DEPRECATEDIN_3_0(f) | |
144 | # define OPENSSL_NO_DEPRECATED_3_0 | |
145 | # endif | |
e039ca38 | 146 | # else |
a6a4d0ac | 147 | # define DEPRECATEDIN_3_0(f) f; |
e039ca38 | 148 | # endif |
a6a4d0ac RL |
149 | # if OPENSSL_API_LEVEL >= 10101 |
150 | # ifndef OPENSSL_NO_DEPRECATED | |
151 | # define DEPRECATEDIN_1_1_1(f) DECLARE_DEPRECATED(f) | |
152 | # else | |
153 | # define DEPRECATEDIN_1_1_1(f) | |
154 | # define OPENSSL_NO_DEPRECATED_1_1_1 | |
155 | # endif | |
e039ca38 | 156 | # else |
a6a4d0ac | 157 | # define DEPRECATEDIN_1_1_1(f) f; |
e039ca38 | 158 | # endif |
a6a4d0ac RL |
159 | # if OPENSSL_API_LEVEL >= 10100 |
160 | # ifndef OPENSSL_NO_DEPRECATED | |
161 | # define DEPRECATEDIN_1_1_0(f) DECLARE_DEPRECATED(f) | |
162 | # else | |
163 | # define DEPRECATEDIN_1_1_0(f) | |
164 | # define OPENSSL_NO_DEPRECATED_1_1_0 | |
165 | # endif | |
e039ca38 | 166 | # else |
a6a4d0ac | 167 | # define DEPRECATEDIN_1_1_0(f) f; |
e039ca38 | 168 | # endif |
a6a4d0ac RL |
169 | # if OPENSSL_API_LEVEL >= 10002 |
170 | # ifndef OPENSSL_NO_DEPRECATED | |
171 | # define DEPRECATEDIN_1_0_2(f) DECLARE_DEPRECATED(f) | |
172 | # else | |
173 | # define DEPRECATEDIN_1_0_2(f) | |
174 | # define OPENSSL_NO_DEPRECATED_1_0_2 | |
175 | # endif | |
176 | # else | |
177 | # define DEPRECATEDIN_1_0_2(f) f; | |
178 | # endif | |
179 | # if OPENSSL_API_LEVEL >= 10001 | |
180 | # ifndef OPENSSL_NO_DEPRECATED | |
181 | # define DEPRECATEDIN_1_0_1(f) DECLARE_DEPRECATED(f) | |
182 | # else | |
183 | # define DEPRECATEDIN_1_0_1(f) | |
184 | # define OPENSSL_NO_DEPRECATED_1_0_1 | |
185 | # endif | |
186 | # else | |
187 | # define DEPRECATEDIN_1_0_1(f) f; | |
188 | # endif | |
189 | # if OPENSSL_API_LEVEL >= 10000 | |
190 | # ifndef OPENSSL_NO_DEPRECATED | |
191 | # define DEPRECATEDIN_1_0_0(f) DECLARE_DEPRECATED(f) | |
192 | # else | |
193 | # define DEPRECATEDIN_1_0_0(f) | |
194 | # define OPENSSL_NO_DEPRECATED_1_0_0 | |
195 | # endif | |
196 | # else | |
197 | # define DEPRECATEDIN_1_0_0(f) f; | |
198 | # endif | |
199 | # if OPENSSL_API_LEVEL >= 908 | |
200 | # ifndef OPENSSL_NO_DEPRECATED | |
201 | # define DEPRECATEDIN_0_9_8(f) DECLARE_DEPRECATED(f) | |
202 | # else | |
203 | # define DEPRECATEDIN_0_9_8(f) | |
204 | # define OPENSSL_NO_DEPRECATED_0_9_8 | |
205 | # endif | |
206 | # else | |
207 | # define DEPRECATEDIN_0_9_8(f) f; | |
208 | # endif | |
209 | ||
210 | /* | |
211 | * Make our own variants of __FILE__ and __LINE__, depending on configuration | |
212 | */ | |
e039ca38 RL |
213 | |
214 | # ifndef OPENSSL_FILE | |
215 | # ifdef OPENSSL_NO_FILENAMES | |
216 | # define OPENSSL_FILE "" | |
217 | # define OPENSSL_LINE 0 | |
218 | # else | |
219 | # define OPENSSL_FILE __FILE__ | |
220 | # define OPENSSL_LINE __LINE__ | |
221 | # endif | |
222 | # endif | |
223 | ||
ec87a649 RL |
224 | /* |
225 | * __func__ was standardized in C99, so for any compiler that claims | |
226 | * to implement that language level or newer, we assume we can safely | |
227 | * use that symbol. | |
228 | * | |
229 | * GNU C also provides __FUNCTION__ since version 2, which predates | |
230 | * C99. We can, however, only use this if __STDC_VERSION__ exists, | |
231 | * as it's otherwise not allowed according to ISO C standards (C90). | |
232 | * (compiling with GNU C's -pedantic tells us so) | |
233 | * | |
234 | * If none of the above applies, we check if the compiler is MSVC, | |
235 | * and use __FUNCTION__ if that's the case. | |
ec87a649 | 236 | */ |
e039ca38 | 237 | # ifndef OPENSSL_FUNC |
ec87a649 RL |
238 | # if defined(__STDC_VERSION__) |
239 | # if __STDC_VERSION__ >= 199901L | |
240 | # define OPENSSL_FUNC __func__ | |
241 | # elif defined(__GNUC__) && __GNUC__ >= 2 | |
242 | # define OPENSSL_FUNC __FUNCTION__ | |
243 | # endif | |
244 | # elif defined(_MSC_VER) | |
245 | # define OPENSSL_FUNC __FUNCTION__ | |
15dbf3a5 RL |
246 | # endif |
247 | /* | |
248 | * If all these possibilities are exhausted, we give up and use a | |
249 | * static string. | |
250 | */ | |
251 | # ifndef OPENSSL_FUNC | |
e039ca38 RL |
252 | # define OPENSSL_FUNC "(unknown function)" |
253 | # endif | |
254 | # endif | |
255 | ||
256 | #endif /* OPENSSL_MACROS_H */ |