blob: c2c95956d21bb5cf7c2b13c6b8fef8ffbcf1d3a9 [file] [log] [blame]
Lev Walkin4efbfb72005-02-25 14:20:30 +00001#include "asn1fix_internal.h"
2#include "asn1fix_crange.h"
Lev Walkinb45e0672004-08-18 05:42:05 +00003
4/*
5 * Check that a specific constraint is compatible
6 * with the given expression type.
7 */
8int
9asn1constraint_compatible(asn1p_expr_type_e expr_type,
Lev Walkin4b553412005-08-14 14:45:44 +000010 enum asn1p_constraint_type_e constr_type, int fbless_SIZE) {
Lev Walkinb45e0672004-08-18 05:42:05 +000011
Lev Walkinadf863f2006-09-05 16:18:34 +000012 if(expr_type == ASN_BASIC_REAL)
13 return -1; /* Not yet supported */
14
Lev Walkinb45e0672004-08-18 05:42:05 +000015 /*
16 * X.680-0207, Table 9.
17 */
18
19 switch(constr_type) {
20 case ACT_INVALID:
21 return 0;
Lev Walkin7ec9b4c2005-03-20 12:57:21 +000022 case ACT_EL_TYPE:
23 return 1;
Lev Walkinb45e0672004-08-18 05:42:05 +000024 case ACT_EL_VALUE:
25 return 1;
26 case ACT_EL_RANGE:
27 case ACT_EL_LLRANGE:
28 case ACT_EL_RLRANGE:
29 case ACT_EL_ULRANGE:
30 switch(expr_type) {
31 case ASN_BASIC_ENUMERATED:
32 case ASN_BASIC_BOOLEAN:
33 /*
34 * The ValueRange constraint is not formally
35 * applicable to the above types. However, we
36 * support it just fine.
37 */
38 /* Fall through */
39 case ASN_BASIC_INTEGER:
40 case ASN_BASIC_REAL:
41 return 1;
42 default:
43 if(expr_type & ASN_STRING_MASK)
44 return 1;
45 }
46 return 0;
47 case ACT_EL_EXT:
48 return -1;
49 case ACT_CT_FROM:
50 if(expr_type & ASN_STRING_MASK)
51 return 1;
52 return 0;
53 case ACT_CT_SIZE:
54 switch(expr_type) {
Lev Walkin4b553412005-08-14 14:45:44 +000055 case ASN_BASIC_INTEGER:
56 case ASN_BASIC_ENUMERATED:
57 if(fbless_SIZE)
58 return 1;
59 break;
Lev Walkinb45e0672004-08-18 05:42:05 +000060 case ASN_BASIC_BIT_STRING:
61 case ASN_BASIC_OCTET_STRING:
62 case ASN_BASIC_CHARACTER_STRING:
63 case ASN_CONSTR_SEQUENCE_OF:
64 case ASN_CONSTR_SET_OF:
65 return 1;
66 default:
67 if(expr_type & ASN_STRING_MASK)
68 return 1;
69 }
70 return 0;
71 case ACT_CT_WCOMP:
72 case ACT_CT_WCOMPS:
73 switch(expr_type) {
74 case A1TC_INSTANCE:
75 case ASN_BASIC_EXTERNAL:
76 case ASN_BASIC_EMBEDDED_PDV:
77 case ASN_BASIC_REAL:
78 case ASN_BASIC_CHARACTER_STRING:
79 case ASN_CONSTR_CHOICE:
80 case ASN_CONSTR_SEQUENCE:
81 case ASN_CONSTR_SEQUENCE_OF:
82 case ASN_CONSTR_SET:
83 case ASN_CONSTR_SET_OF:
84 return 1;
85 default: break;
86 }
87 return 0;
Lev Walkin1893ddf2005-03-20 14:28:32 +000088 case ACT_CT_CTDBY:
89 return 1;
Lev Walkina9532f42006-09-17 04:52:50 +000090 case ACT_CT_CTNG: /* X.682, #11 */
91 switch(expr_type) {
92 case ASN_BASIC_OCTET_STRING:
93 case ASN_BASIC_BIT_STRING:
94 return 1;
95 default:
96 return 0;
97 }
Lev Walkin5c541f12006-10-18 18:40:14 +000098 case ACT_CT_PATTERN:
99 if(expr_type & ASN_STRING_MASK)
100 return 1;
101 return 0;
Lev Walkinb45e0672004-08-18 05:42:05 +0000102 case ACT_CA_SET:
103 case ACT_CA_CRC:
104 case ACT_CA_CSV:
105 case ACT_CA_UNI:
106 case ACT_CA_INT:
107 case ACT_CA_EXC:
Lev Walkind1b4ac32005-03-24 14:40:05 +0000108 case ACT_CA_AEX:
Lev Walkinb45e0672004-08-18 05:42:05 +0000109 return 1;
110 }
111
112 return -1;
113}
114
115
Lev Walkin8b6a8002017-07-25 06:18:33 -0700116#define DECL_RANGE(foo, lb, ub, ov, pv) \
117 static asn1cnst_range_t range_##foo = { \
118 {ARE_VALUE, 0, lb}, {ARE_VALUE, 0, ub}, 0, 0, 0, 0, 0, 0, ov, pv}
Lev Walkinb74ac572004-08-25 02:05:28 +0000119
Lev Walkin8b6a8002017-07-25 06:18:33 -0700120#define DECL(name, lb, ub) DECL_RANGE(name, lb, ub, 0, 0)
121#define DECL_notOPV(name, lb, ub) DECL_RANGE(name, lb, ub, 1, 1)
Lev Walkinb45e0672004-08-18 05:42:05 +0000122
123asn1cnst_range_t *
124asn1constraint_default_alphabet(asn1p_expr_type_e expr_type) {
Lev Walkin8b6a8002017-07-25 06:18:33 -0700125 DECL_notOPV(octstr, 0x00, 0xff); /* Not OER- and PER-visible */
126 DECL_notOPV(utf8, 0x00, 0x7fffffff); /* Not OER- and PER-visible */
Lev Walkinb74ac572004-08-25 02:05:28 +0000127 DECL(bmp, 0x00, 65533); /* 64K-2 cells */
Lev Walkinb45e0672004-08-18 05:42:05 +0000128 DECL(uint7, 0x00, 0x7f);
Lev Walkin3a4689a2006-11-24 11:20:27 +0000129 DECL(uint32, 0x00, 0xffffffff);
Lev Walkinb45e0672004-08-18 05:42:05 +0000130 DECL(Space, 0x20, 0x20);
131 DECL(ApostropheAndParens, 0x27, 0x29);
132 DECL(PlusTillColon, 0x2b, 0x3a);
133 DECL(Equal, 0x3d, 0x3d);
134 DECL(QuestionMark, 0x3f, 0x3f);
135 DECL(Digits, 0x30, 0x39);
136 DECL(AlphaCap, 0x41, 0x5a);
137 DECL(AlphaLow, 0x61, 0x7a);
138 DECL(PlusCommaMinusDot, 0x2b, 0x2e);
139 DECL(Plus, 0x2b, 0x2b);
140 DECL(MinusDot, 0x2d, 0x2e);
141 DECL(Z, 0x5a, 0x5a);
142 static asn1cnst_range_t *range_NumericString_array[] = {
143 &range_Space, &range_Digits };
144 static asn1cnst_range_t *range_PrintableString_array[] = {
145 &range_Space,
146 &range_ApostropheAndParens,
147 &range_PlusTillColon,
148 &range_Equal,
149 &range_QuestionMark,
150 &range_AlphaCap,
151 &range_AlphaLow
152 };
153 static asn1cnst_range_t *range_UTCTime_array[] = {
154 &range_Plus, &range_MinusDot, &range_Digits, &range_Z };
155 static asn1cnst_range_t *range_GeneralizedTime_array[] = {
156 &range_PlusCommaMinusDot, &range_Digits, &range_Z };
Lev Walkinb74ac572004-08-25 02:05:28 +0000157
158 static asn1cnst_range_t range_notPERVisible = {
159 { ARE_MIN, 0, 0 },
160 { ARE_MAX, 0, 0 },
Lev Walkin8b6a8002017-07-25 06:18:33 -0700161 0, 0, 0, 0, 0, 0, 0, 1 };
Lev Walkinb45e0672004-08-18 05:42:05 +0000162 static asn1cnst_range_t range_NumericString = {
163 { ARE_VALUE, 0, 0x20 },
164 { ARE_VALUE, 0, 0x39 },
165 range_NumericString_array,
166 sizeof(range_NumericString_array)
167 /sizeof(range_NumericString_array[0]),
Lev Walkin8b6a8002017-07-25 06:18:33 -0700168 0, 0, 0, 0, 0, 0 };
Lev Walkinb45e0672004-08-18 05:42:05 +0000169 static asn1cnst_range_t range_PrintableString = {
170 { ARE_VALUE, 0, 0x20 },
171 { ARE_VALUE, 0, 0x7a },
172 range_PrintableString_array,
173 sizeof(range_PrintableString_array)
174 /sizeof(range_PrintableString_array[0]),
Lev Walkin8b6a8002017-07-25 06:18:33 -0700175 0, 0, 0, 0, 0, 0 };
Lev Walkinb45e0672004-08-18 05:42:05 +0000176 static asn1cnst_range_t range_VisibleString = {
177 { ARE_VALUE, 0, 0x20 },
178 { ARE_VALUE, 0, 0x7e },
Lev Walkin8b6a8002017-07-25 06:18:33 -0700179 0, 0, 0, 0, 0, 0, 0, 0 };
Lev Walkinb45e0672004-08-18 05:42:05 +0000180 static asn1cnst_range_t range_UTCTime = {
181 { ARE_VALUE, 0, 0x2b },
182 { ARE_VALUE, 0, 0x5a },
183 range_UTCTime_array,
184 sizeof(range_UTCTime_array)
185 /sizeof(range_UTCTime_array[0]),
Lev Walkin8b6a8002017-07-25 06:18:33 -0700186 0, 0, 0, 0, 0, 1 };
Lev Walkinb45e0672004-08-18 05:42:05 +0000187 static asn1cnst_range_t range_GeneralizedTime = {
188 { ARE_VALUE, 0, 0x2b },
189 { ARE_VALUE, 0, 0x5a },
190 range_GeneralizedTime_array,
191 sizeof(range_GeneralizedTime_array)
192 /sizeof(range_GeneralizedTime_array[0]),
Lev Walkin8b6a8002017-07-25 06:18:33 -0700193 0, 0, 0, 0, 0, 1 };
Lev Walkinb45e0672004-08-18 05:42:05 +0000194
195 switch(expr_type) {
196 case ASN_STRING_NumericString:
197 return &range_NumericString;
198 case ASN_STRING_PrintableString:
199 return &range_PrintableString;
200 case ASN_STRING_VisibleString:
201 return &range_VisibleString;
202 case ASN_STRING_IA5String:
203 return &range_uint7;
Lev Walkincb636962004-08-19 13:28:31 +0000204 case ASN_STRING_BMPString:
Lev Walkinb74ac572004-08-25 02:05:28 +0000205 return &range_bmp;
Lev Walkincb636962004-08-19 13:28:31 +0000206 case ASN_STRING_UTF8String:
Lev Walkinb74ac572004-08-25 02:05:28 +0000207 /*
208 * X.691, #9.3.6
209 * Not a known-multipler character string type.
210 */
Lev Walkin8b6a8002017-07-25 06:18:33 -0700211 assert(range_utf8.not_OER_visible);
Lev Walkinb74ac572004-08-25 02:05:28 +0000212 assert(range_utf8.not_PER_visible);
213 return &range_utf8;
214 case ASN_STRING_UniversalString:
Lev Walkin3a4689a2006-11-24 11:20:27 +0000215 return &range_uint32;
Lev Walkinb45e0672004-08-18 05:42:05 +0000216 case ASN_BASIC_UTCTime:
Lev Walkinb74ac572004-08-25 02:05:28 +0000217 /* Permitted alphabet constraint is not applicable */
218 assert(range_UTCTime.not_PER_visible);
Lev Walkinb45e0672004-08-18 05:42:05 +0000219 return &range_UTCTime;
220 case ASN_BASIC_GeneralizedTime:
Lev Walkinb74ac572004-08-25 02:05:28 +0000221 /* Permitted alphabet constraint is not applicable */
222 assert(range_GeneralizedTime.not_PER_visible);
Lev Walkinb45e0672004-08-18 05:42:05 +0000223 return &range_GeneralizedTime;
Lev Walkinb74ac572004-08-25 02:05:28 +0000224 case ASN_BASIC_OCTET_STRING:
225 /*
226 * Permitted alphabet constraint is not applicable
227 * to this type. However, we support it, albeit not
228 * in a strict PER mode.
229 */
230 assert(range_octstr.not_PER_visible);
231 return &range_octstr;
Lev Walkinb45e0672004-08-18 05:42:05 +0000232 default:
Lev Walkinb74ac572004-08-25 02:05:28 +0000233 if(!(expr_type & ASN_STRING_MASK))
234 break;
235 assert(expr_type & ASN_STRING_NKM_MASK);
236 /*
237 * X.691, 9.3.6
238 * Not a known-multiplier character string.
239 */
240 return &range_notPERVisible;
Lev Walkinb45e0672004-08-18 05:42:05 +0000241 }
242
243 return NULL;
244}