blob: 96bd0425629b5bc257fe8555e60ff2c367c10421 [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 Walkinb45e0672004-08-18 05:42:05 +000090 case ACT_CA_SET:
91 case ACT_CA_CRC:
92 case ACT_CA_CSV:
93 case ACT_CA_UNI:
94 case ACT_CA_INT:
95 case ACT_CA_EXC:
Lev Walkind1b4ac32005-03-24 14:40:05 +000096 case ACT_CA_AEX:
Lev Walkinb45e0672004-08-18 05:42:05 +000097 return 1;
98 }
99
100 return -1;
101}
102
103
Lev Walkinb74ac572004-08-25 02:05:28 +0000104#define DECL_RANGE(foo, val1, val2, pv) \
Lev Walkinb45e0672004-08-18 05:42:05 +0000105 static asn1cnst_range_t range_ ## foo = { \
106 { ARE_VALUE, 0, val1 }, \
107 { ARE_VALUE, 0, val2 }, \
Lev Walkinb74ac572004-08-25 02:05:28 +0000108 0, 0, 0, 0, 0, 0, pv }
109
110#define DECL(foo, val1, val2) DECL_RANGE(foo, val1, val2, 0)
111#define DECL_notPV(foo, val1, val2) DECL_RANGE(foo, val1, val2, 1)
Lev Walkinb45e0672004-08-18 05:42:05 +0000112
113asn1cnst_range_t *
114asn1constraint_default_alphabet(asn1p_expr_type_e expr_type) {
Lev Walkinb74ac572004-08-25 02:05:28 +0000115 DECL_notPV(octstr, 0x00, 0xff); /* Not PER-visible */
116 DECL_notPV(utf8, 0x00, 0x7fffffff); /* Not PER-visible */
117 DECL(bmp, 0x00, 65533); /* 64K-2 cells */
Lev Walkinb45e0672004-08-18 05:42:05 +0000118 DECL(uint7, 0x00, 0x7f);
Lev Walkincb636962004-08-19 13:28:31 +0000119 DECL(uint31, 0x00, 0x7fffffff);
Lev Walkinb45e0672004-08-18 05:42:05 +0000120 DECL(Space, 0x20, 0x20);
121 DECL(ApostropheAndParens, 0x27, 0x29);
122 DECL(PlusTillColon, 0x2b, 0x3a);
123 DECL(Equal, 0x3d, 0x3d);
124 DECL(QuestionMark, 0x3f, 0x3f);
125 DECL(Digits, 0x30, 0x39);
126 DECL(AlphaCap, 0x41, 0x5a);
127 DECL(AlphaLow, 0x61, 0x7a);
128 DECL(PlusCommaMinusDot, 0x2b, 0x2e);
129 DECL(Plus, 0x2b, 0x2b);
130 DECL(MinusDot, 0x2d, 0x2e);
131 DECL(Z, 0x5a, 0x5a);
132 static asn1cnst_range_t *range_NumericString_array[] = {
133 &range_Space, &range_Digits };
134 static asn1cnst_range_t *range_PrintableString_array[] = {
135 &range_Space,
136 &range_ApostropheAndParens,
137 &range_PlusTillColon,
138 &range_Equal,
139 &range_QuestionMark,
140 &range_AlphaCap,
141 &range_AlphaLow
142 };
143 static asn1cnst_range_t *range_UTCTime_array[] = {
144 &range_Plus, &range_MinusDot, &range_Digits, &range_Z };
145 static asn1cnst_range_t *range_GeneralizedTime_array[] = {
146 &range_PlusCommaMinusDot, &range_Digits, &range_Z };
Lev Walkinb74ac572004-08-25 02:05:28 +0000147
148 static asn1cnst_range_t range_notPERVisible = {
149 { ARE_MIN, 0, 0 },
150 { ARE_MAX, 0, 0 },
151 0, 0, 0, 0, 0, 0, 1 };
Lev Walkinb45e0672004-08-18 05:42:05 +0000152 static asn1cnst_range_t range_NumericString = {
153 { ARE_VALUE, 0, 0x20 },
154 { ARE_VALUE, 0, 0x39 },
155 range_NumericString_array,
156 sizeof(range_NumericString_array)
157 /sizeof(range_NumericString_array[0]),
Lev Walkinb74ac572004-08-25 02:05:28 +0000158 0, 0, 0, 0, 0 };
Lev Walkinb45e0672004-08-18 05:42:05 +0000159 static asn1cnst_range_t range_PrintableString = {
160 { ARE_VALUE, 0, 0x20 },
161 { ARE_VALUE, 0, 0x7a },
162 range_PrintableString_array,
163 sizeof(range_PrintableString_array)
164 /sizeof(range_PrintableString_array[0]),
Lev Walkinb74ac572004-08-25 02:05:28 +0000165 0, 0, 0, 0, 0 };
Lev Walkinb45e0672004-08-18 05:42:05 +0000166 static asn1cnst_range_t range_VisibleString = {
167 { ARE_VALUE, 0, 0x20 },
168 { ARE_VALUE, 0, 0x7e },
Lev Walkinb74ac572004-08-25 02:05:28 +0000169 0, 0, 0, 0, 0, 0, 0 };
Lev Walkinb45e0672004-08-18 05:42:05 +0000170 static asn1cnst_range_t range_UTCTime = {
171 { ARE_VALUE, 0, 0x2b },
172 { ARE_VALUE, 0, 0x5a },
173 range_UTCTime_array,
174 sizeof(range_UTCTime_array)
175 /sizeof(range_UTCTime_array[0]),
Lev Walkinb74ac572004-08-25 02:05:28 +0000176 0, 0, 0, 0, 1 };
Lev Walkinb45e0672004-08-18 05:42:05 +0000177 static asn1cnst_range_t range_GeneralizedTime = {
178 { ARE_VALUE, 0, 0x2b },
179 { ARE_VALUE, 0, 0x5a },
180 range_GeneralizedTime_array,
181 sizeof(range_GeneralizedTime_array)
182 /sizeof(range_GeneralizedTime_array[0]),
Lev Walkinb74ac572004-08-25 02:05:28 +0000183 0, 0, 0, 0, 1 };
Lev Walkinb45e0672004-08-18 05:42:05 +0000184
185 switch(expr_type) {
186 case ASN_STRING_NumericString:
187 return &range_NumericString;
188 case ASN_STRING_PrintableString:
189 return &range_PrintableString;
190 case ASN_STRING_VisibleString:
191 return &range_VisibleString;
192 case ASN_STRING_IA5String:
193 return &range_uint7;
Lev Walkincb636962004-08-19 13:28:31 +0000194 case ASN_STRING_BMPString:
Lev Walkinb74ac572004-08-25 02:05:28 +0000195 return &range_bmp;
Lev Walkincb636962004-08-19 13:28:31 +0000196 case ASN_STRING_UTF8String:
Lev Walkinb74ac572004-08-25 02:05:28 +0000197 /*
198 * X.691, #9.3.6
199 * Not a known-multipler character string type.
200 */
201 assert(range_utf8.not_PER_visible);
202 return &range_utf8;
203 case ASN_STRING_UniversalString:
Lev Walkincb636962004-08-19 13:28:31 +0000204 return &range_uint31;
Lev Walkinb45e0672004-08-18 05:42:05 +0000205 case ASN_BASIC_UTCTime:
Lev Walkinb74ac572004-08-25 02:05:28 +0000206 /* Permitted alphabet constraint is not applicable */
207 assert(range_UTCTime.not_PER_visible);
Lev Walkinb45e0672004-08-18 05:42:05 +0000208 return &range_UTCTime;
209 case ASN_BASIC_GeneralizedTime:
Lev Walkinb74ac572004-08-25 02:05:28 +0000210 /* Permitted alphabet constraint is not applicable */
211 assert(range_GeneralizedTime.not_PER_visible);
Lev Walkinb45e0672004-08-18 05:42:05 +0000212 return &range_GeneralizedTime;
Lev Walkinb74ac572004-08-25 02:05:28 +0000213 case ASN_BASIC_OCTET_STRING:
214 /*
215 * Permitted alphabet constraint is not applicable
216 * to this type. However, we support it, albeit not
217 * in a strict PER mode.
218 */
219 assert(range_octstr.not_PER_visible);
220 return &range_octstr;
Lev Walkinb45e0672004-08-18 05:42:05 +0000221 default:
Lev Walkinb74ac572004-08-25 02:05:28 +0000222 if(!(expr_type & ASN_STRING_MASK))
223 break;
224 assert(expr_type & ASN_STRING_NKM_MASK);
225 /*
226 * X.691, 9.3.6
227 * Not a known-multiplier character string.
228 */
229 return &range_notPERVisible;
Lev Walkinb45e0672004-08-18 05:42:05 +0000230 }
231
232 return NULL;
233}