blob: 844045f6e0bf57dbe07ee3b72d0cd14821b8b618 [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
12 /*
13 * X.680-0207, Table 9.
14 */
15
16 switch(constr_type) {
17 case ACT_INVALID:
18 return 0;
Lev Walkin7ec9b4c2005-03-20 12:57:21 +000019 case ACT_EL_TYPE:
20 return 1;
Lev Walkinb45e0672004-08-18 05:42:05 +000021 case ACT_EL_VALUE:
22 return 1;
23 case ACT_EL_RANGE:
24 case ACT_EL_LLRANGE:
25 case ACT_EL_RLRANGE:
26 case ACT_EL_ULRANGE:
27 switch(expr_type) {
28 case ASN_BASIC_ENUMERATED:
29 case ASN_BASIC_BOOLEAN:
30 /*
31 * The ValueRange constraint is not formally
32 * applicable to the above types. However, we
33 * support it just fine.
34 */
35 /* Fall through */
36 case ASN_BASIC_INTEGER:
37 case ASN_BASIC_REAL:
38 return 1;
39 default:
40 if(expr_type & ASN_STRING_MASK)
41 return 1;
42 }
43 return 0;
44 case ACT_EL_EXT:
45 return -1;
46 case ACT_CT_FROM:
47 if(expr_type & ASN_STRING_MASK)
48 return 1;
49 return 0;
50 case ACT_CT_SIZE:
51 switch(expr_type) {
Lev Walkin4b553412005-08-14 14:45:44 +000052 case ASN_BASIC_INTEGER:
53 case ASN_BASIC_ENUMERATED:
54 if(fbless_SIZE)
55 return 1;
56 break;
Lev Walkinb45e0672004-08-18 05:42:05 +000057 case ASN_BASIC_BIT_STRING:
58 case ASN_BASIC_OCTET_STRING:
59 case ASN_BASIC_CHARACTER_STRING:
60 case ASN_CONSTR_SEQUENCE_OF:
61 case ASN_CONSTR_SET_OF:
62 return 1;
63 default:
64 if(expr_type & ASN_STRING_MASK)
65 return 1;
66 }
67 return 0;
68 case ACT_CT_WCOMP:
69 case ACT_CT_WCOMPS:
70 switch(expr_type) {
71 case A1TC_INSTANCE:
72 case ASN_BASIC_EXTERNAL:
73 case ASN_BASIC_EMBEDDED_PDV:
74 case ASN_BASIC_REAL:
75 case ASN_BASIC_CHARACTER_STRING:
76 case ASN_CONSTR_CHOICE:
77 case ASN_CONSTR_SEQUENCE:
78 case ASN_CONSTR_SEQUENCE_OF:
79 case ASN_CONSTR_SET:
80 case ASN_CONSTR_SET_OF:
81 return 1;
82 default: break;
83 }
84 return 0;
Lev Walkin1893ddf2005-03-20 14:28:32 +000085 case ACT_CT_CTDBY:
86 return 1;
Lev Walkinb45e0672004-08-18 05:42:05 +000087 case ACT_CA_SET:
88 case ACT_CA_CRC:
89 case ACT_CA_CSV:
90 case ACT_CA_UNI:
91 case ACT_CA_INT:
92 case ACT_CA_EXC:
Lev Walkind1b4ac32005-03-24 14:40:05 +000093 case ACT_CA_AEX:
Lev Walkinb45e0672004-08-18 05:42:05 +000094 return 1;
95 }
96
97 return -1;
98}
99
100
Lev Walkinb74ac572004-08-25 02:05:28 +0000101#define DECL_RANGE(foo, val1, val2, pv) \
Lev Walkinb45e0672004-08-18 05:42:05 +0000102 static asn1cnst_range_t range_ ## foo = { \
103 { ARE_VALUE, 0, val1 }, \
104 { ARE_VALUE, 0, val2 }, \
Lev Walkinb74ac572004-08-25 02:05:28 +0000105 0, 0, 0, 0, 0, 0, pv }
106
107#define DECL(foo, val1, val2) DECL_RANGE(foo, val1, val2, 0)
108#define DECL_notPV(foo, val1, val2) DECL_RANGE(foo, val1, val2, 1)
Lev Walkinb45e0672004-08-18 05:42:05 +0000109
110asn1cnst_range_t *
111asn1constraint_default_alphabet(asn1p_expr_type_e expr_type) {
Lev Walkinb74ac572004-08-25 02:05:28 +0000112 DECL_notPV(octstr, 0x00, 0xff); /* Not PER-visible */
113 DECL_notPV(utf8, 0x00, 0x7fffffff); /* Not PER-visible */
114 DECL(bmp, 0x00, 65533); /* 64K-2 cells */
Lev Walkinb45e0672004-08-18 05:42:05 +0000115 DECL(uint7, 0x00, 0x7f);
Lev Walkincb636962004-08-19 13:28:31 +0000116 DECL(uint31, 0x00, 0x7fffffff);
Lev Walkinb45e0672004-08-18 05:42:05 +0000117 DECL(Space, 0x20, 0x20);
118 DECL(ApostropheAndParens, 0x27, 0x29);
119 DECL(PlusTillColon, 0x2b, 0x3a);
120 DECL(Equal, 0x3d, 0x3d);
121 DECL(QuestionMark, 0x3f, 0x3f);
122 DECL(Digits, 0x30, 0x39);
123 DECL(AlphaCap, 0x41, 0x5a);
124 DECL(AlphaLow, 0x61, 0x7a);
125 DECL(PlusCommaMinusDot, 0x2b, 0x2e);
126 DECL(Plus, 0x2b, 0x2b);
127 DECL(MinusDot, 0x2d, 0x2e);
128 DECL(Z, 0x5a, 0x5a);
129 static asn1cnst_range_t *range_NumericString_array[] = {
130 &range_Space, &range_Digits };
131 static asn1cnst_range_t *range_PrintableString_array[] = {
132 &range_Space,
133 &range_ApostropheAndParens,
134 &range_PlusTillColon,
135 &range_Equal,
136 &range_QuestionMark,
137 &range_AlphaCap,
138 &range_AlphaLow
139 };
140 static asn1cnst_range_t *range_UTCTime_array[] = {
141 &range_Plus, &range_MinusDot, &range_Digits, &range_Z };
142 static asn1cnst_range_t *range_GeneralizedTime_array[] = {
143 &range_PlusCommaMinusDot, &range_Digits, &range_Z };
Lev Walkinb74ac572004-08-25 02:05:28 +0000144
145 static asn1cnst_range_t range_notPERVisible = {
146 { ARE_MIN, 0, 0 },
147 { ARE_MAX, 0, 0 },
148 0, 0, 0, 0, 0, 0, 1 };
Lev Walkinb45e0672004-08-18 05:42:05 +0000149 static asn1cnst_range_t range_NumericString = {
150 { ARE_VALUE, 0, 0x20 },
151 { ARE_VALUE, 0, 0x39 },
152 range_NumericString_array,
153 sizeof(range_NumericString_array)
154 /sizeof(range_NumericString_array[0]),
Lev Walkinb74ac572004-08-25 02:05:28 +0000155 0, 0, 0, 0, 0 };
Lev Walkinb45e0672004-08-18 05:42:05 +0000156 static asn1cnst_range_t range_PrintableString = {
157 { ARE_VALUE, 0, 0x20 },
158 { ARE_VALUE, 0, 0x7a },
159 range_PrintableString_array,
160 sizeof(range_PrintableString_array)
161 /sizeof(range_PrintableString_array[0]),
Lev Walkinb74ac572004-08-25 02:05:28 +0000162 0, 0, 0, 0, 0 };
Lev Walkinb45e0672004-08-18 05:42:05 +0000163 static asn1cnst_range_t range_VisibleString = {
164 { ARE_VALUE, 0, 0x20 },
165 { ARE_VALUE, 0, 0x7e },
Lev Walkinb74ac572004-08-25 02:05:28 +0000166 0, 0, 0, 0, 0, 0, 0 };
Lev Walkinb45e0672004-08-18 05:42:05 +0000167 static asn1cnst_range_t range_UTCTime = {
168 { ARE_VALUE, 0, 0x2b },
169 { ARE_VALUE, 0, 0x5a },
170 range_UTCTime_array,
171 sizeof(range_UTCTime_array)
172 /sizeof(range_UTCTime_array[0]),
Lev Walkinb74ac572004-08-25 02:05:28 +0000173 0, 0, 0, 0, 1 };
Lev Walkinb45e0672004-08-18 05:42:05 +0000174 static asn1cnst_range_t range_GeneralizedTime = {
175 { ARE_VALUE, 0, 0x2b },
176 { ARE_VALUE, 0, 0x5a },
177 range_GeneralizedTime_array,
178 sizeof(range_GeneralizedTime_array)
179 /sizeof(range_GeneralizedTime_array[0]),
Lev Walkinb74ac572004-08-25 02:05:28 +0000180 0, 0, 0, 0, 1 };
Lev Walkinb45e0672004-08-18 05:42:05 +0000181
182 switch(expr_type) {
183 case ASN_STRING_NumericString:
184 return &range_NumericString;
185 case ASN_STRING_PrintableString:
186 return &range_PrintableString;
187 case ASN_STRING_VisibleString:
188 return &range_VisibleString;
189 case ASN_STRING_IA5String:
190 return &range_uint7;
Lev Walkincb636962004-08-19 13:28:31 +0000191 case ASN_STRING_BMPString:
Lev Walkinb74ac572004-08-25 02:05:28 +0000192 return &range_bmp;
Lev Walkincb636962004-08-19 13:28:31 +0000193 case ASN_STRING_UTF8String:
Lev Walkinb74ac572004-08-25 02:05:28 +0000194 /*
195 * X.691, #9.3.6
196 * Not a known-multipler character string type.
197 */
198 assert(range_utf8.not_PER_visible);
199 return &range_utf8;
200 case ASN_STRING_UniversalString:
Lev Walkincb636962004-08-19 13:28:31 +0000201 return &range_uint31;
Lev Walkinb45e0672004-08-18 05:42:05 +0000202 case ASN_BASIC_UTCTime:
Lev Walkinb74ac572004-08-25 02:05:28 +0000203 /* Permitted alphabet constraint is not applicable */
204 assert(range_UTCTime.not_PER_visible);
Lev Walkinb45e0672004-08-18 05:42:05 +0000205 return &range_UTCTime;
206 case ASN_BASIC_GeneralizedTime:
Lev Walkinb74ac572004-08-25 02:05:28 +0000207 /* Permitted alphabet constraint is not applicable */
208 assert(range_GeneralizedTime.not_PER_visible);
Lev Walkinb45e0672004-08-18 05:42:05 +0000209 return &range_GeneralizedTime;
Lev Walkinb74ac572004-08-25 02:05:28 +0000210 case ASN_BASIC_OCTET_STRING:
211 /*
212 * Permitted alphabet constraint is not applicable
213 * to this type. However, we support it, albeit not
214 * in a strict PER mode.
215 */
216 assert(range_octstr.not_PER_visible);
217 return &range_octstr;
Lev Walkinb45e0672004-08-18 05:42:05 +0000218 default:
Lev Walkinb74ac572004-08-25 02:05:28 +0000219 if(!(expr_type & ASN_STRING_MASK))
220 break;
221 assert(expr_type & ASN_STRING_NKM_MASK);
222 /*
223 * X.691, 9.3.6
224 * Not a known-multiplier character string.
225 */
226 return &range_notPERVisible;
Lev Walkinb45e0672004-08-18 05:42:05 +0000227 }
228
229 return NULL;
230}