summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlya Etingof <etingof@gmail.com>2017-04-21 01:09:10 +0200
committerIlya Etingof <etingof@gmail.com>2017-09-07 22:59:27 +0200
commit8308c329ac49af66de054158598194f41855699f (patch)
tree8884b65f347d5f3b5f54f3f64015638a02b744ae
parentf53f48553c5e683a0c5e9e8009ef754410f2b9e0 (diff)
downloadpyasn1-git-8308c329ac49af66de054158598194f41855699f.tar.gz
ANY DEFINED BY decoding implemented
-rw-r--r--CHANGES.rst5
-rw-r--r--pyasn1/codec/ber/decoder.py12
-rw-r--r--pyasn1/type/namedtype.py28
3 files changed, 45 insertions, 0 deletions
diff --git a/CHANGES.rst b/CHANGES.rst
index dfdf3ce..065ac18 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -1,4 +1,9 @@
+Revision 0.4.1, released XX-09-2017
+-----------------------------------
+
+- ANY DEFINED BY clause support implemented
+
Revision 0.3.4, released 07-09-2017
-----------------------------------
diff --git a/pyasn1/codec/ber/decoder.py b/pyasn1/codec/ber/decoder.py
index 4fff81b..75960cf 100644
--- a/pyasn1/codec/ber/decoder.py
+++ b/pyasn1/codec/ber/decoder.py
@@ -493,6 +493,18 @@ class UniversalConstructedTypeDecoder(AbstractConstructedDecoder):
)
idx += 1
+ for holeName, governingName, typesMap in namedTypes.holes:
+ holeComponent = asn1Object[holeName]
+ if holeComponent.isValue:
+ governingComponent = asn1Object[governingName]
+ if governingComponent in typesMap:
+ component, rest = decodeFun(
+ holeComponent.asOctets(),
+ asn1Spec=typesMap[governingComponent]
+ )
+ asn1Object.setComponentByName(holeName, component, matchTags=False, matchConstraints=False)
+
+ if not namedTypes:
asn1Object.verifySizeSpec()
return asn1Object, tail
diff --git a/pyasn1/type/namedtype.py b/pyasn1/type/namedtype.py
index 7a51f18..6bf82f4 100644
--- a/pyasn1/type/namedtype.py
+++ b/pyasn1/type/namedtype.py
@@ -34,6 +34,8 @@ class NamedType(object):
self.__name = name
self.__type = asn1Object
self.__nameAndType = name, asn1Object
+ self.__governingName = None
+ self.__typesMap = None
def __repr__(self):
return '%s(%r, %r)' % (self.__class__.__name__, self.__name, self.__type)
@@ -73,6 +75,19 @@ class NamedType(object):
def asn1Object(self):
return self.__type
+ def definedBy(self, governingName, typesMap):
+ self.__governingName = governingName
+ self.__typesMap = typesMap
+ return self
+
+ @property
+ def governingName(self):
+ return self.__governingName
+
+ @property
+ def typesMap(self):
+ return self.__typesMap
+
# Backward compatibility
def getName(self):
@@ -123,6 +138,7 @@ class NamedTypes(object):
self.__keys = frozenset([namedType.name for namedType in self.__namedTypes])
self.__values = tuple([namedType.asn1Object for namedType in self.__namedTypes])
self.__items = tuple([(namedType.name, namedType.asn1Object) for namedType in self.__namedTypes])
+ self.__holes = self.__computeTypeHoles()
def __repr__(self):
return '%s(%s)' % (
@@ -509,3 +525,15 @@ class NamedTypes(object):
@property
def requiredComponents(self):
return self.__requiredComponents
+
+ @property
+ def holes(self):
+ return self.__holes
+
+ def __computeTypeHoles(self):
+ holes = []
+ for namedType in self.__namedTypes:
+ if namedType.governingName:
+ holes.append((namedType.name, namedType.governingName, namedType.typesMap))
+
+ return holes