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