summaryrefslogtreecommitdiff
path: root/pyasn1/codec
diff options
context:
space:
mode:
authorIlya Etingof <etingof@gmail.com>2017-09-13 01:10:42 +0200
committerIlya Etingof <etingof@gmail.com>2017-09-13 01:10:42 +0200
commitc40b8c22c9679e017871617d7cf558b1b7f0ff84 (patch)
treeea0c3a608294cb740c2a9e6b15f776143c8f2c27 /pyasn1/codec
parent789a4e2f4f921fdac37f28df557319b89df3050c (diff)
downloadpyasn1-git-c40b8c22c9679e017871617d7cf558b1b7f0ff84.tar.gz
refactored OpenType() into a mutable object
Diffstat (limited to 'pyasn1/codec')
-rw-r--r--pyasn1/codec/ber/decoder.py101
1 files changed, 61 insertions, 40 deletions
diff --git a/pyasn1/codec/ber/decoder.py b/pyasn1/codec/ber/decoder.py
index 8aac8c9..4a1ef01 100644
--- a/pyasn1/codec/ber/decoder.py
+++ b/pyasn1/codec/ber/decoder.py
@@ -511,35 +511,45 @@ class UniversalConstructedTypeDecoder(AbstractConstructedDecoder):
seenIndices.add(idx)
idx += 1
- if namedTypes and options.get('decodeOpenTypes', False):
+ if namedTypes:
if not namedTypes.requiredComponents.issubset(seenIndices):
raise error.PyAsn1Error('ASN.1 object %s has uninitialized components' % asn1Object.__class__.__name__)
+ if namedTypes.hasOpenTypes:
- for idx, namedType in enumerate(namedTypes.namedTypes):
- if not namedType.openType:
- continue
+ openTypes = options.get('openTypes', {})
- governingValue = asn1Object.getComponentByName(
- namedType.openType.name
- )
+ if openTypes or options.get('decodeOpenTypes', False):
- try:
- asn1Spec = namedType.openType[governingValue]
+ for idx, namedType in enumerate(namedTypes.namedTypes):
+ if not namedType.openType:
+ continue
- except KeyError:
- continue
+ governingValue = asn1Object.getComponentByName(
+ namedType.openType.name
+ )
- component, rest = decodeFun(
- asn1Object.getComponentByPosition(idx).asOctets(),
- asn1Spec=asn1Spec
- )
+ try:
+ asn1Spec = openTypes[governingValue]
- asn1Object.setComponentByPosition(
- idx, component,
- matchTags=False,
- matchConstraints=False
- )
+ except KeyError:
+
+ try:
+ asn1Spec = namedType.openType[governingValue]
+
+ except KeyError:
+ continue
+
+ component, rest = decodeFun(
+ asn1Object.getComponentByPosition(idx).asOctets(),
+ asn1Spec=asn1Spec
+ )
+
+ asn1Object.setComponentByPosition(
+ idx, component,
+ matchTags=False,
+ matchConstraints=False
+ )
else:
asn1Object.verifySizeSpec()
@@ -637,31 +647,42 @@ class UniversalConstructedTypeDecoder(AbstractConstructedDecoder):
if not namedTypes.requiredComponents.issubset(seenIndices):
raise error.PyAsn1Error('ASN.1 object %s has uninitialized components' % asn1Object.__class__.__name__)
- for idx, namedType in enumerate(namedTypes.namedTypes):
- if not namedType.openType:
- continue
+ if namedTypes.hasOpenTypes:
- governingValue = asn1Object.getComponentByName(
- namedType.openType.name
- )
+ openTypes = options.get('openTypes', None)
- try:
- asn1Spec = namedType.openType[governingValue]
+ if openTypes or options.get('decodeOpenTypes', False):
- except KeyError:
- continue
+ for idx, namedType in enumerate(namedTypes.namedTypes):
+ if not namedType.openType:
+ continue
- component, rest = decodeFun(
- asn1Object.getComponentByPosition(idx).asOctets(),
- asn1Spec=asn1Spec, allowEoo=True
- )
+ governingValue = asn1Object.getComponentByName(
+ namedType.openType.name
+ )
- if component is not eoo.endOfOctets:
- asn1Object.setComponentByPosition(
- idx, component,
- matchTags=False,
- matchConstraints=False
- )
+ try:
+ asn1Spec = openTypes[governingValue]
+
+ except KeyError:
+
+ try:
+ asn1Spec = namedType.openType[governingValue]
+
+ except KeyError:
+ continue
+
+ component, rest = decodeFun(
+ asn1Object.getComponentByPosition(idx).asOctets(),
+ asn1Spec=asn1Spec, allowEoo=True
+ )
+
+ if component is not eoo.endOfOctets:
+ asn1Object.setComponentByPosition(
+ idx, component,
+ matchTags=False,
+ matchConstraints=False
+ )
else:
asn1Object.verifySizeSpec()