]> git.ipfire.org Git - thirdparty/openssl.git/blame - crypto/ctype.c
Update copyright year
[thirdparty/openssl.git] / crypto / ctype.c
CommitLineData
a1df06b3 1/*
fecb3aae 2 * Copyright 2017-2022 The OpenSSL Project Authors. All Rights Reserved.
a1df06b3 3 *
0e9725bc 4 * Licensed under the Apache License 2.0 (the "License"). You may not use
a1df06b3
P
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#include <string.h>
678c462e 11#include <stdio.h>
25f2138b 12#include "crypto/ctype.h"
6229815a 13#include <openssl/ebcdic.h>
a1df06b3 14
4b2bd272
DB
15#include "internal/e_os.h"
16#include "internal/core.h"
17
18#ifndef OPENSSL_SYS_WINDOWS
19#include <strings.h>
20#endif
21#include <locale.h>
22
23#ifdef OPENSSL_SYS_MACOSX
24#include <xlocale.h>
25#endif
26
a1df06b3
P
27/*
28 * Define the character classes for each character in the seven bit ASCII
29 * character set. This is independent of the host's character set, characters
30 * are converted to ASCII before being used as an index in to this table.
31 * Characters outside of the seven bit ASCII range are detected before indexing.
32 */
33static const unsigned short ctype_char_map[128] = {
34 /* 00 nul */ CTYPE_MASK_cntrl,
35 /* 01 soh */ CTYPE_MASK_cntrl,
36 /* 02 stx */ CTYPE_MASK_cntrl,
37 /* 03 etx */ CTYPE_MASK_cntrl,
38 /* 04 eot */ CTYPE_MASK_cntrl,
39 /* 05 enq */ CTYPE_MASK_cntrl,
40 /* 06 ack */ CTYPE_MASK_cntrl,
41 /* 07 \a */ CTYPE_MASK_cntrl,
42 /* 08 \b */ CTYPE_MASK_cntrl,
43 /* 09 \t */ CTYPE_MASK_blank | CTYPE_MASK_cntrl | CTYPE_MASK_space,
44 /* 0A \n */ CTYPE_MASK_cntrl | CTYPE_MASK_space,
45 /* 0B \v */ CTYPE_MASK_cntrl | CTYPE_MASK_space,
46 /* 0C \f */ CTYPE_MASK_cntrl | CTYPE_MASK_space,
47 /* 0D \r */ CTYPE_MASK_cntrl | CTYPE_MASK_space,
48 /* 0E so */ CTYPE_MASK_cntrl,
49 /* 0F si */ CTYPE_MASK_cntrl,
50 /* 10 dle */ CTYPE_MASK_cntrl,
51 /* 11 dc1 */ CTYPE_MASK_cntrl,
52 /* 12 dc2 */ CTYPE_MASK_cntrl,
53 /* 13 dc3 */ CTYPE_MASK_cntrl,
54 /* 14 dc4 */ CTYPE_MASK_cntrl,
55 /* 15 nak */ CTYPE_MASK_cntrl,
56 /* 16 syn */ CTYPE_MASK_cntrl,
57 /* 17 etb */ CTYPE_MASK_cntrl,
58 /* 18 can */ CTYPE_MASK_cntrl,
59 /* 19 em */ CTYPE_MASK_cntrl,
60 /* 1A sub */ CTYPE_MASK_cntrl,
61 /* 1B esc */ CTYPE_MASK_cntrl,
62 /* 1C fs */ CTYPE_MASK_cntrl,
63 /* 1D gs */ CTYPE_MASK_cntrl,
64 /* 1E rs */ CTYPE_MASK_cntrl,
65 /* 1F us */ CTYPE_MASK_cntrl,
66 /* 20 */ CTYPE_MASK_blank | CTYPE_MASK_print | CTYPE_MASK_space
67 | CTYPE_MASK_asn1print,
68 /* 21 ! */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct,
69 /* 22 " */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct,
70 /* 23 # */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct,
71 /* 24 $ */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct,
72 /* 25 % */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct,
73 /* 26 & */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct,
74 /* 27 ' */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct
75 | CTYPE_MASK_asn1print,
76 /* 28 ( */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct
77 | CTYPE_MASK_asn1print,
78 /* 29 ) */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct
79 | CTYPE_MASK_asn1print,
80 /* 2A * */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct,
81 /* 2B + */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct
82 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
83 /* 2C , */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct
84 | CTYPE_MASK_asn1print,
85 /* 2D - */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct
86 | CTYPE_MASK_asn1print,
87 /* 2E . */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct
88 | CTYPE_MASK_asn1print,
89 /* 2F / */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct
90 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
91 /* 30 0 */ CTYPE_MASK_digit | CTYPE_MASK_graph | CTYPE_MASK_print
92 | CTYPE_MASK_xdigit | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
93 /* 31 1 */ CTYPE_MASK_digit | CTYPE_MASK_graph | CTYPE_MASK_print
94 | CTYPE_MASK_xdigit | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
95 /* 32 2 */ CTYPE_MASK_digit | CTYPE_MASK_graph | CTYPE_MASK_print
96 | CTYPE_MASK_xdigit | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
97 /* 33 3 */ CTYPE_MASK_digit | CTYPE_MASK_graph | CTYPE_MASK_print
98 | CTYPE_MASK_xdigit | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
99 /* 34 4 */ CTYPE_MASK_digit | CTYPE_MASK_graph | CTYPE_MASK_print
100 | CTYPE_MASK_xdigit | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
101 /* 35 5 */ CTYPE_MASK_digit | CTYPE_MASK_graph | CTYPE_MASK_print
102 | CTYPE_MASK_xdigit | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
103 /* 36 6 */ CTYPE_MASK_digit | CTYPE_MASK_graph | CTYPE_MASK_print
104 | CTYPE_MASK_xdigit | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
105 /* 37 7 */ CTYPE_MASK_digit | CTYPE_MASK_graph | CTYPE_MASK_print
106 | CTYPE_MASK_xdigit | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
107 /* 38 8 */ CTYPE_MASK_digit | CTYPE_MASK_graph | CTYPE_MASK_print
108 | CTYPE_MASK_xdigit | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
109 /* 39 9 */ CTYPE_MASK_digit | CTYPE_MASK_graph | CTYPE_MASK_print
110 | CTYPE_MASK_xdigit | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
111 /* 3A : */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct
112 | CTYPE_MASK_asn1print,
113 /* 3B ; */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct,
114 /* 3C < */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct,
115 /* 3D = */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct
116 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
117 /* 3E > */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct,
118 /* 3F ? */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct
119 | CTYPE_MASK_asn1print,
120 /* 40 @ */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct,
121 /* 41 A */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_upper
122 | CTYPE_MASK_xdigit | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
123 /* 42 B */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_upper
124 | CTYPE_MASK_xdigit | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
125 /* 43 C */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_upper
126 | CTYPE_MASK_xdigit | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
127 /* 44 D */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_upper
128 | CTYPE_MASK_xdigit | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
129 /* 45 E */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_upper
130 | CTYPE_MASK_xdigit | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
131 /* 46 F */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_upper
132 | CTYPE_MASK_xdigit | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
133 /* 47 G */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_upper
134 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
135 /* 48 H */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_upper
136 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
137 /* 49 I */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_upper
138 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
139 /* 4A J */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_upper
140 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
141 /* 4B K */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_upper
142 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
143 /* 4C L */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_upper
144 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
145 /* 4D M */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_upper
146 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
147 /* 4E N */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_upper
148 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
149 /* 4F O */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_upper
150 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
151 /* 50 P */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_upper
152 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
153 /* 51 Q */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_upper
154 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
155 /* 52 R */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_upper
156 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
157 /* 53 S */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_upper
158 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
159 /* 54 T */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_upper
160 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
161 /* 55 U */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_upper
162 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
163 /* 56 V */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_upper
164 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
165 /* 57 W */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_upper
166 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
167 /* 58 X */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_upper
168 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
169 /* 59 Y */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_upper
170 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
171 /* 5A Z */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_upper
172 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
173 /* 5B [ */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct,
174 /* 5C \ */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct,
175 /* 5D ] */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct,
176 /* 5E ^ */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct,
177 /* 5F _ */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct,
178 /* 60 ` */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct,
179 /* 61 a */ CTYPE_MASK_graph | CTYPE_MASK_lower | CTYPE_MASK_print
180 | CTYPE_MASK_xdigit | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
181 /* 62 b */ CTYPE_MASK_graph | CTYPE_MASK_lower | CTYPE_MASK_print
182 | CTYPE_MASK_xdigit | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
183 /* 63 c */ CTYPE_MASK_graph | CTYPE_MASK_lower | CTYPE_MASK_print
184 | CTYPE_MASK_xdigit | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
185 /* 64 d */ CTYPE_MASK_graph | CTYPE_MASK_lower | CTYPE_MASK_print
186 | CTYPE_MASK_xdigit | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
187 /* 65 e */ CTYPE_MASK_graph | CTYPE_MASK_lower | CTYPE_MASK_print
188 | CTYPE_MASK_xdigit | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
189 /* 66 f */ CTYPE_MASK_graph | CTYPE_MASK_lower | CTYPE_MASK_print
190 | CTYPE_MASK_xdigit | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
191 /* 67 g */ CTYPE_MASK_graph | CTYPE_MASK_lower | CTYPE_MASK_print
192 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
193 /* 68 h */ CTYPE_MASK_graph | CTYPE_MASK_lower | CTYPE_MASK_print
194 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
195 /* 69 i */ CTYPE_MASK_graph | CTYPE_MASK_lower | CTYPE_MASK_print
196 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
197 /* 6A j */ CTYPE_MASK_graph | CTYPE_MASK_lower | CTYPE_MASK_print
198 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
199 /* 6B k */ CTYPE_MASK_graph | CTYPE_MASK_lower | CTYPE_MASK_print
200 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
201 /* 6C l */ CTYPE_MASK_graph | CTYPE_MASK_lower | CTYPE_MASK_print
202 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
203 /* 6D m */ CTYPE_MASK_graph | CTYPE_MASK_lower | CTYPE_MASK_print
204 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
205 /* 6E n */ CTYPE_MASK_graph | CTYPE_MASK_lower | CTYPE_MASK_print
206 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
207 /* 6F o */ CTYPE_MASK_graph | CTYPE_MASK_lower | CTYPE_MASK_print
208 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
209 /* 70 p */ CTYPE_MASK_graph | CTYPE_MASK_lower | CTYPE_MASK_print
210 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
211 /* 71 q */ CTYPE_MASK_graph | CTYPE_MASK_lower | CTYPE_MASK_print
212 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
213 /* 72 r */ CTYPE_MASK_graph | CTYPE_MASK_lower | CTYPE_MASK_print
214 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
215 /* 73 s */ CTYPE_MASK_graph | CTYPE_MASK_lower | CTYPE_MASK_print
216 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
217 /* 74 t */ CTYPE_MASK_graph | CTYPE_MASK_lower | CTYPE_MASK_print
218 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
219 /* 75 u */ CTYPE_MASK_graph | CTYPE_MASK_lower | CTYPE_MASK_print
220 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
221 /* 76 v */ CTYPE_MASK_graph | CTYPE_MASK_lower | CTYPE_MASK_print
222 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
223 /* 77 w */ CTYPE_MASK_graph | CTYPE_MASK_lower | CTYPE_MASK_print
224 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
225 /* 78 x */ CTYPE_MASK_graph | CTYPE_MASK_lower | CTYPE_MASK_print
226 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
227 /* 79 y */ CTYPE_MASK_graph | CTYPE_MASK_lower | CTYPE_MASK_print
228 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
229 /* 7A z */ CTYPE_MASK_graph | CTYPE_MASK_lower | CTYPE_MASK_print
230 | CTYPE_MASK_base64 | CTYPE_MASK_asn1print,
231 /* 7B { */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct,
232 /* 7C | */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct,
233 /* 7D } */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct,
234 /* 7E ~ */ CTYPE_MASK_graph | CTYPE_MASK_print | CTYPE_MASK_punct,
235 /* 7F del */ CTYPE_MASK_cntrl
236};
237
238#ifdef CHARSET_EBCDIC
239int ossl_toascii(int c)
240{
678c462e 241 if (c < -128 || c > 256 || c == EOF)
a1df06b3
P
242 return c;
243 /*
244 * Adjust negatively signed characters.
245 * This is not required for ASCII because any character that sign extends
246 * is not seven bit and all of the checks are on the seven bit characters.
247 * I.e. any check must fail on sign extension.
248 */
249 if (c < 0)
250 c += 256;
251 return os_toascii[c];
252}
253
254int ossl_fromascii(int c)
255{
678c462e 256 if (c < -128 || c > 256 || c == EOF)
a1df06b3
P
257 return c;
258 if (c < 0)
259 c += 256;
260 return os_toebcdic[c];
261}
262#endif
263
264int ossl_ctype_check(int c, unsigned int mask)
265{
266 const int max = sizeof(ctype_char_map) / sizeof(*ctype_char_map);
932c0df2 267 const int a = ossl_toascii(c);
a1df06b3 268
932c0df2 269 return a >= 0 && a < max && (ctype_char_map[a] & mask) != 0;
a1df06b3
P
270}
271
272#if defined(CHARSET_EBCDIC) && !defined(CHARSET_EBCDIC_TEST)
273static const int case_change = 0x40;
274#else
275static const int case_change = 0x20;
276#endif
277
278int ossl_tolower(int c)
279{
280 return ossl_isupper(c) ? c ^ case_change : c;
281}
282
283int ossl_toupper(int c)
284{
285 return ossl_islower(c) ? c ^ case_change : c;
286}
48102247 287
adf7e6d1 288int ossl_ascii_isdigit(const char inchar) {
48102247 289 if (inchar > 0x2F && inchar < 0x3A)
290 return 1;
291 return 0;
292}
4b2bd272
DB
293
294/* str[n]casecmp_l is defined in POSIX 2008-01. Value is taken accordingly
295 * https://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html */
296
297#if (defined OPENSSL_SYS_WINDOWS) || (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200809L)
298
299# if defined OPENSSL_SYS_WINDOWS
300# define locale_t _locale_t
301# define freelocale _free_locale
302# define strcasecmp_l _stricmp_l
303# define strncasecmp_l _strnicmp_l
304# endif
305static locale_t loc;
306
307# ifndef FIPS_MODULE
308void *ossl_c_locale() {
309 return (void *)loc;
310}
311# endif
312
313int ossl_init_casecmp_int() {
314# ifdef OPENSSL_SYS_WINDOWS
315 loc = _create_locale(LC_COLLATE, "C");
316# else
317 loc = newlocale(LC_COLLATE_MASK, "C", (locale_t) 0);
318# endif
319 return (loc == (locale_t) 0) ? 0 : 1;
320}
321
322void ossl_deinit_casecmp() {
323 freelocale(loc);
324}
325
326int OPENSSL_strcasecmp(const char *s1, const char *s2)
327{
328 return strcasecmp_l(s1, s2, (locale_t)ossl_c_locale());
329}
330
331int OPENSSL_strncasecmp(const char *s1, const char *s2, size_t n)
332{
333 return strncasecmp_l(s1, s2, n, (locale_t)ossl_c_locale());
334}
335#else
336# ifndef FIPS_MODULE
337void *ossl_c_locale() {
338 return NULL;
339}
340# endif
341
342int ossl_init_casecmp_int() {
343 return 1;
344}
345
346void ossl_deinit_casecmp() {
347}
348
349int OPENSSL_strcasecmp(const char *s1, const char *s2)
350{
351 return strcasecmp(s1, s2);
352}
353
354int OPENSSL_strncasecmp(const char *s1, const char *s2, size_t n)
355{
356 return strncasecmp(s1, s2, n);
357}
358#endif