]> git.ipfire.org Git - thirdparty/openssl.git/blob - crypto/ctype.c
Public API functions OPENSSL_str[n]casecmp
[thirdparty/openssl.git] / crypto / ctype.c
1 /*
2 * Copyright 2017-2021 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 #include <string.h>
11 #include <stdio.h>
12 #include "crypto/ctype.h"
13 #include <openssl/ebcdic.h>
14
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
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 */
33 static 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
239 int ossl_toascii(int c)
240 {
241 if (c < -128 || c > 256 || c == EOF)
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
254 int ossl_fromascii(int c)
255 {
256 if (c < -128 || c > 256 || c == EOF)
257 return c;
258 if (c < 0)
259 c += 256;
260 return os_toebcdic[c];
261 }
262 #endif
263
264 int ossl_ctype_check(int c, unsigned int mask)
265 {
266 const int max = sizeof(ctype_char_map) / sizeof(*ctype_char_map);
267 const int a = ossl_toascii(c);
268
269 return a >= 0 && a < max && (ctype_char_map[a] & mask) != 0;
270 }
271
272 #if defined(CHARSET_EBCDIC) && !defined(CHARSET_EBCDIC_TEST)
273 static const int case_change = 0x40;
274 #else
275 static const int case_change = 0x20;
276 #endif
277
278 int ossl_tolower(int c)
279 {
280 return ossl_isupper(c) ? c ^ case_change : c;
281 }
282
283 int ossl_toupper(int c)
284 {
285 return ossl_islower(c) ? c ^ case_change : c;
286 }
287
288 int ossl_ascii_isdigit(const char inchar) {
289 if (inchar > 0x2F && inchar < 0x3A)
290 return 1;
291 return 0;
292 }
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
305 static locale_t loc;
306
307 # ifndef FIPS_MODULE
308 void *ossl_c_locale() {
309 return (void *)loc;
310 }
311 # endif
312
313 int 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
322 void ossl_deinit_casecmp() {
323 freelocale(loc);
324 }
325
326 int OPENSSL_strcasecmp(const char *s1, const char *s2)
327 {
328 return strcasecmp_l(s1, s2, (locale_t)ossl_c_locale());
329 }
330
331 int 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
337 void *ossl_c_locale() {
338 return NULL;
339 }
340 # endif
341
342 int ossl_init_casecmp_int() {
343 return 1;
344 }
345
346 void ossl_deinit_casecmp() {
347 }
348
349 int OPENSSL_strcasecmp(const char *s1, const char *s2)
350 {
351 return strcasecmp(s1, s2);
352 }
353
354 int OPENSSL_strncasecmp(const char *s1, const char *s2, size_t n)
355 {
356 return strncasecmp(s1, s2, n);
357 }
358 #endif