From 6c8b88f1a7c9f44c33dad1116f341524a20cda60 Mon Sep 17 00:00:00 2001 From: elie Date: Sun, 27 Jan 2013 21:23:51 +0000 Subject: fix to CHOICE decoder to handle explicitly tagged, indefinite length mode encoding --- pyasn1/codec/ber/decoder.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) (limited to 'pyasn1/codec/ber/decoder.py') diff --git a/pyasn1/codec/ber/decoder.py b/pyasn1/codec/ber/decoder.py index b7330a9..82b3352 100644 --- a/pyasn1/codec/ber/decoder.py +++ b/pyasn1/codec/ber/decoder.py @@ -427,7 +427,26 @@ class ChoiceDecoder(AbstractConstructedDecoder): r.setComponentByType(effectiveTagSet, component, 0, asn1Spec is None) return r, tail - indefLenValueDecoder = valueDecoder + def indefLenValueDecoder(self, fullSubstrate, substrate, asn1Spec, tagSet, + length, state, decodeFun, substrateFun): + r = self._createComponent(asn1Spec, tagSet) + if substrateFun: + return substrateFun(r, substrate, length) + if r.getTagSet() == tagSet: # explicitly tagged Choice + component, substrate = decodeFun(substrate, r.getComponentTagMap()) + eooMarker, substrate = decodeFun(substrate) # eat up EOO marker + if eooMarker != eoo.endOfOctets: + raise error.PyAsn1Error('No EOO seen before substrate ends') + else: + component, substrate= decodeFun( + substrate, r.getComponentTagMap(), tagSet, length, state + ) + if isinstance(component, univ.Choice): + effectiveTagSet = component.getEffectiveTagSet() + else: + effectiveTagSet = component.getTagSet() + r.setComponentByType(effectiveTagSet, component, 0, asn1Spec is None) + return r, substrate class AnyDecoder(AbstractSimpleDecoder): protoComponent = univ.Any() -- cgit v1.2.1