diff options
author | Ilya Etingof <etingof@gmail.com> | 2017-04-21 01:09:10 +0200 |
---|---|---|
committer | Ilya Etingof <etingof@gmail.com> | 2017-09-07 22:59:27 +0200 |
commit | 8308c329ac49af66de054158598194f41855699f (patch) | |
tree | 8884b65f347d5f3b5f54f3f64015638a02b744ae | |
parent | f53f48553c5e683a0c5e9e8009ef754410f2b9e0 (diff) | |
download | pyasn1-git-8308c329ac49af66de054158598194f41855699f.tar.gz |
ANY DEFINED BY decoding implemented
-rw-r--r-- | CHANGES.rst | 5 | ||||
-rw-r--r-- | pyasn1/codec/ber/decoder.py | 12 | ||||
-rw-r--r-- | pyasn1/type/namedtype.py | 28 |
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 |