blob: 676717e1bbcf332081fba1b4878ce2a777aef2e6 [file] [log] [blame]
vlm8a09e0f2005-02-25 14:20:30 +00001#include "asn1fix_internal.h"
2#include "asn1fix_crange.h"
vlmb5be8c32004-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,
10 enum asn1p_constraint_type_e constr_type) {
11
12 /*
13 * X.680-0207, Table 9.
14 */
15
16 switch(constr_type) {
17 case ACT_INVALID:
18 return 0;
vlm53832f12005-03-20 12:57:21 +000019 case ACT_EL_TYPE:
20 return 1;
vlmb5be8c32004-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) {
52 case ASN_BASIC_BIT_STRING:
53 case ASN_BASIC_OCTET_STRING:
54 case ASN_BASIC_CHARACTER_STRING:
55 case ASN_CONSTR_SEQUENCE_OF:
56 case ASN_CONSTR_SET_OF:
57 return 1;
58 default:
59 if(expr_type & ASN_STRING_MASK)
60 return 1;
61 }
62 return 0;
63 case ACT_CT_WCOMP:
64 case ACT_CT_WCOMPS:
65 switch(expr_type) {
66 case A1TC_INSTANCE:
67 case ASN_BASIC_EXTERNAL:
68 case ASN_BASIC_EMBEDDED_PDV:
69 case ASN_BASIC_REAL:
70 case ASN_BASIC_CHARACTER_STRING:
71 case ASN_CONSTR_CHOICE:
72 case ASN_CONSTR_SEQUENCE:
73 case ASN_CONSTR_SEQUENCE_OF:
74 case ASN_CONSTR_SET:
75 case ASN_CONSTR_SET_OF:
76 return 1;
77 default: break;
78 }
79 return 0;
vlm6611add2005-03-20 14:28:32 +000080 case ACT_CT_CTDBY:
81 return 1;
vlmb5be8c32004-08-18 05:42:05 +000082 case ACT_CA_SET:
83 case ACT_CA_CRC:
84 case ACT_CA_CSV:
85 case ACT_CA_UNI:
86 case ACT_CA_INT:
87 case ACT_CA_EXC:
vlm5e79ae62005-03-24 14:40:05 +000088 case ACT_CA_AEX:
vlmb5be8c32004-08-18 05:42:05 +000089 return 1;
90 }
91
92 return -1;
93}
94
95
vlmee8b06f2004-08-25 02:05:28 +000096#define DECL_RANGE(foo, val1, val2, pv) \
vlmb5be8c32004-08-18 05:42:05 +000097 static asn1cnst_range_t range_ ## foo = { \
98 { ARE_VALUE, 0, val1 }, \
99 { ARE_VALUE, 0, val2 }, \
vlmee8b06f2004-08-25 02:05:28 +0000100 0, 0, 0, 0, 0, 0, pv }
101
102#define DECL(foo, val1, val2) DECL_RANGE(foo, val1, val2, 0)
103#define DECL_notPV(foo, val1, val2) DECL_RANGE(foo, val1, val2, 1)
vlmb5be8c32004-08-18 05:42:05 +0000104
105asn1cnst_range_t *
106asn1constraint_default_alphabet(asn1p_expr_type_e expr_type) {
vlmee8b06f2004-08-25 02:05:28 +0000107 DECL_notPV(octstr, 0x00, 0xff); /* Not PER-visible */
108 DECL_notPV(utf8, 0x00, 0x7fffffff); /* Not PER-visible */
109 DECL(bmp, 0x00, 65533); /* 64K-2 cells */
vlmb5be8c32004-08-18 05:42:05 +0000110 DECL(uint7, 0x00, 0x7f);
vlmfef925d2004-08-19 13:28:31 +0000111 DECL(uint31, 0x00, 0x7fffffff);
vlmb5be8c32004-08-18 05:42:05 +0000112 DECL(Space, 0x20, 0x20);
113 DECL(ApostropheAndParens, 0x27, 0x29);
114 DECL(PlusTillColon, 0x2b, 0x3a);
115 DECL(Equal, 0x3d, 0x3d);
116 DECL(QuestionMark, 0x3f, 0x3f);
117 DECL(Digits, 0x30, 0x39);
118 DECL(AlphaCap, 0x41, 0x5a);
119 DECL(AlphaLow, 0x61, 0x7a);
120 DECL(PlusCommaMinusDot, 0x2b, 0x2e);
121 DECL(Plus, 0x2b, 0x2b);
122 DECL(MinusDot, 0x2d, 0x2e);
123 DECL(Z, 0x5a, 0x5a);
124 static asn1cnst_range_t *range_NumericString_array[] = {
125 &range_Space, &range_Digits };
126 static asn1cnst_range_t *range_PrintableString_array[] = {
127 &range_Space,
128 &range_ApostropheAndParens,
129 &range_PlusTillColon,
130 &range_Equal,
131 &range_QuestionMark,
132 &range_AlphaCap,
133 &range_AlphaLow
134 };
135 static asn1cnst_range_t *range_UTCTime_array[] = {
136 &range_Plus, &range_MinusDot, &range_Digits, &range_Z };
137 static asn1cnst_range_t *range_GeneralizedTime_array[] = {
138 &range_PlusCommaMinusDot, &range_Digits, &range_Z };
vlmee8b06f2004-08-25 02:05:28 +0000139
140 static asn1cnst_range_t range_notPERVisible = {
141 { ARE_MIN, 0, 0 },
142 { ARE_MAX, 0, 0 },
143 0, 0, 0, 0, 0, 0, 1 };
vlmb5be8c32004-08-18 05:42:05 +0000144 static asn1cnst_range_t range_NumericString = {
145 { ARE_VALUE, 0, 0x20 },
146 { ARE_VALUE, 0, 0x39 },
147 range_NumericString_array,
148 sizeof(range_NumericString_array)
149 /sizeof(range_NumericString_array[0]),
vlmee8b06f2004-08-25 02:05:28 +0000150 0, 0, 0, 0, 0 };
vlmb5be8c32004-08-18 05:42:05 +0000151 static asn1cnst_range_t range_PrintableString = {
152 { ARE_VALUE, 0, 0x20 },
153 { ARE_VALUE, 0, 0x7a },
154 range_PrintableString_array,
155 sizeof(range_PrintableString_array)
156 /sizeof(range_PrintableString_array[0]),
vlmee8b06f2004-08-25 02:05:28 +0000157 0, 0, 0, 0, 0 };
vlmb5be8c32004-08-18 05:42:05 +0000158 static asn1cnst_range_t range_VisibleString = {
159 { ARE_VALUE, 0, 0x20 },
160 { ARE_VALUE, 0, 0x7e },
vlmee8b06f2004-08-25 02:05:28 +0000161 0, 0, 0, 0, 0, 0, 0 };
vlmb5be8c32004-08-18 05:42:05 +0000162 static asn1cnst_range_t range_UTCTime = {
163 { ARE_VALUE, 0, 0x2b },
164 { ARE_VALUE, 0, 0x5a },
165 range_UTCTime_array,
166 sizeof(range_UTCTime_array)
167 /sizeof(range_UTCTime_array[0]),
vlmee8b06f2004-08-25 02:05:28 +0000168 0, 0, 0, 0, 1 };
vlmb5be8c32004-08-18 05:42:05 +0000169 static asn1cnst_range_t range_GeneralizedTime = {
170 { ARE_VALUE, 0, 0x2b },
171 { ARE_VALUE, 0, 0x5a },
172 range_GeneralizedTime_array,
173 sizeof(range_GeneralizedTime_array)
174 /sizeof(range_GeneralizedTime_array[0]),
vlmee8b06f2004-08-25 02:05:28 +0000175 0, 0, 0, 0, 1 };
vlmb5be8c32004-08-18 05:42:05 +0000176
177 switch(expr_type) {
178 case ASN_STRING_NumericString:
179 return &range_NumericString;
180 case ASN_STRING_PrintableString:
181 return &range_PrintableString;
182 case ASN_STRING_VisibleString:
183 return &range_VisibleString;
184 case ASN_STRING_IA5String:
185 return &range_uint7;
vlmfef925d2004-08-19 13:28:31 +0000186 case ASN_STRING_BMPString:
vlmee8b06f2004-08-25 02:05:28 +0000187 return &range_bmp;
vlmfef925d2004-08-19 13:28:31 +0000188 case ASN_STRING_UTF8String:
vlmee8b06f2004-08-25 02:05:28 +0000189 /*
190 * X.691, #9.3.6
191 * Not a known-multipler character string type.
192 */
193 assert(range_utf8.not_PER_visible);
194 return &range_utf8;
195 case ASN_STRING_UniversalString:
vlmfef925d2004-08-19 13:28:31 +0000196 return &range_uint31;
vlmb5be8c32004-08-18 05:42:05 +0000197 case ASN_BASIC_UTCTime:
vlmee8b06f2004-08-25 02:05:28 +0000198 /* Permitted alphabet constraint is not applicable */
199 assert(range_UTCTime.not_PER_visible);
vlmb5be8c32004-08-18 05:42:05 +0000200 return &range_UTCTime;
201 case ASN_BASIC_GeneralizedTime:
vlmee8b06f2004-08-25 02:05:28 +0000202 /* Permitted alphabet constraint is not applicable */
203 assert(range_GeneralizedTime.not_PER_visible);
vlmb5be8c32004-08-18 05:42:05 +0000204 return &range_GeneralizedTime;
vlmee8b06f2004-08-25 02:05:28 +0000205 case ASN_BASIC_OCTET_STRING:
206 /*
207 * Permitted alphabet constraint is not applicable
208 * to this type. However, we support it, albeit not
209 * in a strict PER mode.
210 */
211 assert(range_octstr.not_PER_visible);
212 return &range_octstr;
vlmb5be8c32004-08-18 05:42:05 +0000213 default:
vlmee8b06f2004-08-25 02:05:28 +0000214 if(!(expr_type & ASN_STRING_MASK))
215 break;
216 assert(expr_type & ASN_STRING_NKM_MASK);
217 /*
218 * X.691, 9.3.6
219 * Not a known-multiplier character string.
220 */
221 return &range_notPERVisible;
vlmb5be8c32004-08-18 05:42:05 +0000222 }
223
224 return NULL;
225}