]>
git.ipfire.org Git - thirdparty/openssl.git/blob - crypto/ctype.c
2 * Copyright 2017 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the OpenSSL license (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
11 #include "internal/ctype.h"
12 #include "openssl/ebcdic.h"
15 * Define the character classes for each character in the seven bit ASCII
16 * character set. This is independent of the host's character set, characters
17 * are converted to ASCII before being used as an index in to this table.
18 * Characters outside of the seven bit ASCII range are detected before indexing.
20 static const unsigned short ctype_char_map
[128] = {
21 /* 00 nul */ CTYPE_MASK_cntrl
,
22 /* 01 soh */ CTYPE_MASK_cntrl
,
23 /* 02 stx */ CTYPE_MASK_cntrl
,
24 /* 03 etx */ CTYPE_MASK_cntrl
,
25 /* 04 eot */ CTYPE_MASK_cntrl
,
26 /* 05 enq */ CTYPE_MASK_cntrl
,
27 /* 06 ack */ CTYPE_MASK_cntrl
,
28 /* 07 \a */ CTYPE_MASK_cntrl
,
29 /* 08 \b */ CTYPE_MASK_cntrl
,
30 /* 09 \t */ CTYPE_MASK_blank
| CTYPE_MASK_cntrl
| CTYPE_MASK_space
,
31 /* 0A \n */ CTYPE_MASK_cntrl
| CTYPE_MASK_space
,
32 /* 0B \v */ CTYPE_MASK_cntrl
| CTYPE_MASK_space
,
33 /* 0C \f */ CTYPE_MASK_cntrl
| CTYPE_MASK_space
,
34 /* 0D \r */ CTYPE_MASK_cntrl
| CTYPE_MASK_space
,
35 /* 0E so */ CTYPE_MASK_cntrl
,
36 /* 0F si */ CTYPE_MASK_cntrl
,
37 /* 10 dle */ CTYPE_MASK_cntrl
,
38 /* 11 dc1 */ CTYPE_MASK_cntrl
,
39 /* 12 dc2 */ CTYPE_MASK_cntrl
,
40 /* 13 dc3 */ CTYPE_MASK_cntrl
,
41 /* 14 dc4 */ CTYPE_MASK_cntrl
,
42 /* 15 nak */ CTYPE_MASK_cntrl
,
43 /* 16 syn */ CTYPE_MASK_cntrl
,
44 /* 17 etb */ CTYPE_MASK_cntrl
,
45 /* 18 can */ CTYPE_MASK_cntrl
,
46 /* 19 em */ CTYPE_MASK_cntrl
,
47 /* 1A sub */ CTYPE_MASK_cntrl
,
48 /* 1B esc */ CTYPE_MASK_cntrl
,
49 /* 1C fs */ CTYPE_MASK_cntrl
,
50 /* 1D gs */ CTYPE_MASK_cntrl
,
51 /* 1E rs */ CTYPE_MASK_cntrl
,
52 /* 1F us */ CTYPE_MASK_cntrl
,
53 /* 20 */ CTYPE_MASK_blank
| CTYPE_MASK_print
| CTYPE_MASK_space
54 | CTYPE_MASK_asn1print
,
55 /* 21 ! */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
,
56 /* 22 " */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
,
57 /* 23 # */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
,
58 /* 24 $ */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
,
59 /* 25 % */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
,
60 /* 26 & */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
,
61 /* 27 ' */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
62 | CTYPE_MASK_asn1print
,
63 /* 28 ( */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
64 | CTYPE_MASK_asn1print
,
65 /* 29 ) */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
66 | CTYPE_MASK_asn1print
,
67 /* 2A * */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
,
68 /* 2B + */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
69 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
70 /* 2C , */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
71 | CTYPE_MASK_asn1print
,
72 /* 2D - */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
73 | CTYPE_MASK_asn1print
,
74 /* 2E . */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
75 | CTYPE_MASK_asn1print
,
76 /* 2F / */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
77 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
78 /* 30 0 */ CTYPE_MASK_digit
| CTYPE_MASK_graph
| CTYPE_MASK_print
79 | CTYPE_MASK_xdigit
| CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
80 /* 31 1 */ CTYPE_MASK_digit
| CTYPE_MASK_graph
| CTYPE_MASK_print
81 | CTYPE_MASK_xdigit
| CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
82 /* 32 2 */ CTYPE_MASK_digit
| CTYPE_MASK_graph
| CTYPE_MASK_print
83 | CTYPE_MASK_xdigit
| CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
84 /* 33 3 */ CTYPE_MASK_digit
| CTYPE_MASK_graph
| CTYPE_MASK_print
85 | CTYPE_MASK_xdigit
| CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
86 /* 34 4 */ CTYPE_MASK_digit
| CTYPE_MASK_graph
| CTYPE_MASK_print
87 | CTYPE_MASK_xdigit
| CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
88 /* 35 5 */ CTYPE_MASK_digit
| CTYPE_MASK_graph
| CTYPE_MASK_print
89 | CTYPE_MASK_xdigit
| CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
90 /* 36 6 */ CTYPE_MASK_digit
| CTYPE_MASK_graph
| CTYPE_MASK_print
91 | CTYPE_MASK_xdigit
| CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
92 /* 37 7 */ CTYPE_MASK_digit
| CTYPE_MASK_graph
| CTYPE_MASK_print
93 | CTYPE_MASK_xdigit
| CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
94 /* 38 8 */ CTYPE_MASK_digit
| CTYPE_MASK_graph
| CTYPE_MASK_print
95 | CTYPE_MASK_xdigit
| CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
96 /* 39 9 */ CTYPE_MASK_digit
| CTYPE_MASK_graph
| CTYPE_MASK_print
97 | CTYPE_MASK_xdigit
| CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
98 /* 3A : */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
99 | CTYPE_MASK_asn1print
,
100 /* 3B ; */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
,
101 /* 3C < */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
,
102 /* 3D = */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
103 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
104 /* 3E > */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
,
105 /* 3F ? */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
106 | CTYPE_MASK_asn1print
,
107 /* 40 @ */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
,
108 /* 41 A */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_upper
109 | CTYPE_MASK_xdigit
| CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
110 /* 42 B */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_upper
111 | CTYPE_MASK_xdigit
| CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
112 /* 43 C */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_upper
113 | CTYPE_MASK_xdigit
| CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
114 /* 44 D */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_upper
115 | CTYPE_MASK_xdigit
| CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
116 /* 45 E */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_upper
117 | CTYPE_MASK_xdigit
| CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
118 /* 46 F */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_upper
119 | CTYPE_MASK_xdigit
| CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
120 /* 47 G */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_upper
121 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
122 /* 48 H */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_upper
123 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
124 /* 49 I */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_upper
125 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
126 /* 4A J */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_upper
127 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
128 /* 4B K */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_upper
129 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
130 /* 4C L */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_upper
131 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
132 /* 4D M */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_upper
133 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
134 /* 4E N */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_upper
135 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
136 /* 4F O */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_upper
137 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
138 /* 50 P */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_upper
139 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
140 /* 51 Q */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_upper
141 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
142 /* 52 R */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_upper
143 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
144 /* 53 S */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_upper
145 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
146 /* 54 T */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_upper
147 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
148 /* 55 U */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_upper
149 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
150 /* 56 V */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_upper
151 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
152 /* 57 W */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_upper
153 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
154 /* 58 X */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_upper
155 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
156 /* 59 Y */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_upper
157 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
158 /* 5A Z */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_upper
159 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
160 /* 5B [ */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
,
161 /* 5C \ */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
,
162 /* 5D ] */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
,
163 /* 5E ^ */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
,
164 /* 5F _ */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
,
165 /* 60 ` */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
,
166 /* 61 a */ CTYPE_MASK_graph
| CTYPE_MASK_lower
| CTYPE_MASK_print
167 | CTYPE_MASK_xdigit
| CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
168 /* 62 b */ CTYPE_MASK_graph
| CTYPE_MASK_lower
| CTYPE_MASK_print
169 | CTYPE_MASK_xdigit
| CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
170 /* 63 c */ CTYPE_MASK_graph
| CTYPE_MASK_lower
| CTYPE_MASK_print
171 | CTYPE_MASK_xdigit
| CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
172 /* 64 d */ CTYPE_MASK_graph
| CTYPE_MASK_lower
| CTYPE_MASK_print
173 | CTYPE_MASK_xdigit
| CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
174 /* 65 e */ CTYPE_MASK_graph
| CTYPE_MASK_lower
| CTYPE_MASK_print
175 | CTYPE_MASK_xdigit
| CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
176 /* 66 f */ CTYPE_MASK_graph
| CTYPE_MASK_lower
| CTYPE_MASK_print
177 | CTYPE_MASK_xdigit
| CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
178 /* 67 g */ CTYPE_MASK_graph
| CTYPE_MASK_lower
| CTYPE_MASK_print
179 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
180 /* 68 h */ CTYPE_MASK_graph
| CTYPE_MASK_lower
| CTYPE_MASK_print
181 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
182 /* 69 i */ CTYPE_MASK_graph
| CTYPE_MASK_lower
| CTYPE_MASK_print
183 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
184 /* 6A j */ CTYPE_MASK_graph
| CTYPE_MASK_lower
| CTYPE_MASK_print
185 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
186 /* 6B k */ CTYPE_MASK_graph
| CTYPE_MASK_lower
| CTYPE_MASK_print
187 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
188 /* 6C l */ CTYPE_MASK_graph
| CTYPE_MASK_lower
| CTYPE_MASK_print
189 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
190 /* 6D m */ CTYPE_MASK_graph
| CTYPE_MASK_lower
| CTYPE_MASK_print
191 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
192 /* 6E n */ CTYPE_MASK_graph
| CTYPE_MASK_lower
| CTYPE_MASK_print
193 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
194 /* 6F o */ CTYPE_MASK_graph
| CTYPE_MASK_lower
| CTYPE_MASK_print
195 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
196 /* 70 p */ CTYPE_MASK_graph
| CTYPE_MASK_lower
| CTYPE_MASK_print
197 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
198 /* 71 q */ CTYPE_MASK_graph
| CTYPE_MASK_lower
| CTYPE_MASK_print
199 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
200 /* 72 r */ CTYPE_MASK_graph
| CTYPE_MASK_lower
| CTYPE_MASK_print
201 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
202 /* 73 s */ CTYPE_MASK_graph
| CTYPE_MASK_lower
| CTYPE_MASK_print
203 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
204 /* 74 t */ CTYPE_MASK_graph
| CTYPE_MASK_lower
| CTYPE_MASK_print
205 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
206 /* 75 u */ CTYPE_MASK_graph
| CTYPE_MASK_lower
| CTYPE_MASK_print
207 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
208 /* 76 v */ CTYPE_MASK_graph
| CTYPE_MASK_lower
| CTYPE_MASK_print
209 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
210 /* 77 w */ CTYPE_MASK_graph
| CTYPE_MASK_lower
| CTYPE_MASK_print
211 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
212 /* 78 x */ CTYPE_MASK_graph
| CTYPE_MASK_lower
| CTYPE_MASK_print
213 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
214 /* 79 y */ CTYPE_MASK_graph
| CTYPE_MASK_lower
| CTYPE_MASK_print
215 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
216 /* 7A z */ CTYPE_MASK_graph
| CTYPE_MASK_lower
| CTYPE_MASK_print
217 | CTYPE_MASK_base64
| CTYPE_MASK_asn1print
,
218 /* 7B { */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
,
219 /* 7C | */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
,
220 /* 7D } */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
,
221 /* 7E ~ */ CTYPE_MASK_graph
| CTYPE_MASK_print
| CTYPE_MASK_punct
,
222 /* 7F del */ CTYPE_MASK_cntrl
225 #ifdef CHARSET_EBCDIC
226 int ossl_toascii(int c
)
228 if (c
< -128 || c
> 256)
231 * Adjust negatively signed characters.
232 * This is not required for ASCII because any character that sign extends
233 * is not seven bit and all of the checks are on the seven bit characters.
234 * I.e. any check must fail on sign extension.
238 return os_toascii
[c
];
241 int ossl_fromascii(int c
)
243 if (c
< -128 || c
> 256)
247 return os_toebcdic
[c
];
251 int ossl_ctype_check(int c
, unsigned int mask
)
253 const int max
= sizeof(ctype_char_map
) / sizeof(*ctype_char_map
);
254 const int a
= ossl_toascii(c
);
256 return a
>= 0 && a
< max
&& (ctype_char_map
[a
] & mask
) != 0;
259 #if defined(CHARSET_EBCDIC) && !defined(CHARSET_EBCDIC_TEST)
260 static const int case_change
= 0x40;
262 static const int case_change
= 0x20;
265 int ossl_tolower(int c
)
267 return ossl_isupper(c
) ? c
^ case_change
: c
;
270 int ossl_toupper(int c
)
272 return ossl_islower(c
) ? c
^ case_change
: c
;