diff --git a/CHANGES.rst b/CHANGES.rst index 27d30677..3c068123 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,4 +1,10 @@ +Revision 0.4.2, released 23-11-2017 +----------------------------------- + +- Fixed explicit tag splitting in chunked encoding mode at + OctetString and BitString encoders + Revision 0.4.1, released 23-11-2017 ----------------------------------- diff --git a/pyasn1/__init__.py b/pyasn1/__init__.py index 42f4704d..1e99d6be 100644 --- a/pyasn1/__init__.py +++ b/pyasn1/__init__.py @@ -1,7 +1,7 @@ import sys # http://www.python.org/dev/peps/pep-0396/ -__version__ = '0.4.1' +__version__ = '0.4.2' if sys.version_info[:2] < (2, 4): raise RuntimeError('PyASN1 requires Python 2.4 or later') diff --git a/pyasn1/codec/ber/encoder.py b/pyasn1/codec/ber/encoder.py index 1f6c11c5..28c50717 100644 --- a/pyasn1/codec/ber/encoder.py +++ b/pyasn1/codec/ber/encoder.py @@ -157,12 +157,15 @@ def encodeValue(self, value, asn1Spec, encodeFun, **options): substrate = alignedValue.asOctets() return int2oct(len(substrate) * 8 - valueLength) + substrate, False, True - tagSet = value.tagSet + baseTag = value.tagSet.baseTag # strip off explicit tags - alignedValue = alignedValue.clone( - tagSet=tag.TagSet(tagSet.baseTag, tagSet.baseTag) - ) + if baseTag: + tagSet = tag.TagSet(baseTag, baseTag) + else: + tagSet = tag.TagSet() + + alignedValue = alignedValue.clone(tagSet=tagSet) stop = 0 substrate = null @@ -175,28 +178,52 @@ def encodeValue(self, value, asn1Spec, encodeFun, **options): class OctetStringEncoder(AbstractItemEncoder): + def encodeValue(self, value, asn1Spec, encodeFun, **options): - if asn1Spec is None: - # will strip off explicit tags - tagSet = value.tagSet - asn1Spec = value.clone(tagSet=tag.TagSet(tagSet.baseTag, tagSet.baseTag)) - value = value.asOctets() + if asn1Spec is None: + substrate = value.asOctets() elif not isOctetsType(value): - # will strip off explicit tags - tagSet = asn1Spec.tagSet - asn1Spec = asn1Spec.clone(tagSet=tag.TagSet(tagSet.baseTag, tagSet.baseTag)) + substrate = asn1Spec.clone(value).asOctets() - value = asn1Spec.clone(value).asOctets() + else: + substrate = value maxChunkSize = options.get('maxChunkSize', 0) - if not maxChunkSize or len(value) <= maxChunkSize: - return value, False, True + + if not maxChunkSize or len(substrate) <= maxChunkSize: + return substrate, False, True else: + + # strip off explicit tags for inner chunks + + if asn1Spec is None: + baseTag = value.tagSet.baseTag + + # strip off explicit tags + if baseTag: + tagSet = tag.TagSet(baseTag, baseTag) + else: + tagSet = tag.TagSet() + + asn1Spec = value.clone(tagSet=tagSet) + + elif not isOctetsType(value): + baseTag = asn1Spec.tagSet.baseTag + + # strip off explicit tags + if baseTag: + tagSet = tag.TagSet(baseTag, baseTag) + else: + tagSet = tag.TagSet() + + asn1Spec = asn1Spec.clone(tagSet=tagSet) + pos = 0 substrate = null + while True: chunk = value[pos:pos + maxChunkSize] if not chunk: