11 #define RETURN(_code) do {\
12 asn_dec_rval_t tmprval;\
13 tmprval.code = _code;\
14 tmprval.consumed = consumed_myself;\
19 { APC_CONSTRAINED, 8, 8, 0, 255 },
20 { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 },
40 ssize_t consumed_myself = 0;
48 unsigned int unit_bits;
49 unsigned int canonical_unit_bits;
61 switch(specs->subvariant) {
64 canonical_unit_bits = unit_bits = 8;
65 if(cval->flags & APC_CONSTRAINED) {
67 if (cval->range_bits <= 2) {
70 if (cval->range_bits <= 4) {
76 ASN_DEBUG(
"APER decoding ASN_OSUBV_STR range_bits = %d unit_bits = %d\n",
77 cval->range_bits, unit_bits);
82 canonical_unit_bits = unit_bits = 16;
83 if(cval->flags & APC_CONSTRAINED) {
84 unit_bits = cval->range_bits;
85 ASN_DEBUG(
"APER decoding ASN_OSUBV_U16 range_bits = %d\n", cval->range_bits);
90 canonical_unit_bits = unit_bits = 32;
91 if(cval->flags & APC_CONSTRAINED) {
92 unit_bits = cval->range_bits;
93 ASN_DEBUG(
"APER decoding ASN_OSUBV_U32 range_bits = %d\n", cval->range_bits);
104 canonical_unit_bits = unit_bits = 1;
117 ASN_DEBUG(
"PER Decoding %s size %lld .. %lld bits %d",
118 csiz->flags & APC_EXTENSIBLE ?
"extensible" :
"non-extensible",
119 (
long long int)csiz->lower_bound, (
long long int)csiz->upper_bound,
120 csiz->effective_bits);
122 if(csiz->flags & APC_EXTENSIBLE) {
128 unit_bits = canonical_unit_bits;
132 if(csiz->effective_bits >= 0) {
135 st->
size = csiz->upper_bound * bpc;
137 st->
size = (csiz->upper_bound + 7) >> 3;
146 if(csiz->effective_bits == 0) {
149 if (st->
size > 2 || csiz->range_bits != 0) {
154 ASN_DEBUG(
"Decoding OCTET STRING size %lld",
155 (
long long int)csiz->upper_bound);
164 ASN_DEBUG(
"Decoding BIT STRING size %lld",
165 (
long long int)csiz->upper_bound);
167 unit_bits * csiz->upper_bound);
170 consumed_myself += unit_bits * csiz->upper_bound;
173 int ubs = (csiz->upper_bound & 0x7);
189 if (csiz->upper_bound - csiz->lower_bound == 0)
194 csiz->effective_bits, &repeat);
197 ASN_DEBUG(
"Got PER length eb %ld, len %ld, %s (%s)",
198 (
long)csiz->effective_bits, (
long)raw_len,
199 repeat ?
"repeat" :
"once", td->name);
202 if ((raw_len > 2) || (csiz->upper_bound > 2) || (csiz->range_bits != 0))
209 len_bytes = raw_len * bpc;
210 len_bits = len_bytes * unit_bits;
213 len_bytes = (len_bits + 7) >> 3;
220 st->
buf = (uint8_t *)p;
236 st->
size += len_bytes;
259 unsigned int unit_bits;
260 unsigned int canonical_unit_bits;
261 unsigned int sizeinunits;
272 if(!st || (!st->
buf && st->
size))
282 ct_extensible = csiz->
flags & APC_EXTENSIBLE;
287 canonical_unit_bits = unit_bits = 8;
288 if(cval->flags & APC_CONSTRAINED) {
290 if (cval->range_bits <= 2) {
293 if (cval->range_bits <= 4)
298 ASN_DEBUG(
"APER encoding ASN_OSUBV_STR range_bits = %d unit_bits = %d\n",
299 cval->range_bits, unit_bits);
302 sizeinunits = st->
size;
305 canonical_unit_bits = unit_bits = 16;
306 if(cval->flags & APC_CONSTRAINED) {
307 unit_bits = cval->range_bits;
308 ASN_DEBUG(
"APER encoding ASN_OSUBV_U16 range_bits = %d\n", cval->range_bits);
311 sizeinunits = st->
size / 2;
314 canonical_unit_bits = unit_bits = 32;
315 if(cval->flags & APC_CONSTRAINED) {
316 unit_bits = cval->range_bits;
317 ASN_DEBUG(
"APER encoding ASN_OSUBV_U32 range_bits = %d\n", cval->range_bits);
320 sizeinunits = st->
size / 4;
328 canonical_unit_bits = unit_bits = 1;
331 ASN_DEBUG(
"BIT STRING of %d bytes", sizeinunits);
335 ASN_DEBUG(
"Encoding %s into %d units of %d bits"
336 " (%lld..%lld, effective %d)%s",
337 td->
name, sizeinunits, unit_bits,
338 (
long long int)csiz->lower_bound,
339 (
long long int)csiz->upper_bound,
340 csiz->effective_bits, ct_extensible ?
" EXT" :
"");
344 if(csiz->effective_bits >= 0) {
345 if((
int)sizeinunits < csiz->lower_bound
346 || (
int)sizeinunits > csiz->upper_bound) {
350 unit_bits = canonical_unit_bits;
368 if(csiz->effective_bits >= 0) {
369 ASN_DEBUG(
"Encoding %zu bytes (%lld), length in %d bits",
370 st->
size, (
long long int)(sizeinunits - csiz->lower_bound),
371 csiz->effective_bits);
372 if (csiz->effective_bits > 0) {
374 sizeinunits - csiz->lower_bound, NULL);
377 if (csiz->effective_bits > 0 || (st->
size > 2)
378 || (csiz->upper_bound > (2 * 8 / unit_bits))
379 || (csiz->range_bits != 0))
393 sizeinunits * unit_bits);
399 ASN_DEBUG(
"Encoding %zu bytes", st->
size);
401 if(sizeinunits == 0) {
414 ASN_DEBUG(
"Encoding %ld of %ld",
415 (
long)maySave, (
long)sizeinunits);
429 buf += maySave * bpc;
432 sizeinunits -= maySave;
433 assert(!(maySave & 0x07) || !sizeinunits);