From df3a2b7781c72ffc703e80d788618d93634e17ab Mon Sep 17 00:00:00 2001 From: Ilya Etingof Date: Thu, 23 Nov 2017 19:48:19 +0100 Subject: Fixed bad TagSet initializer at OctetString encoder (#107) localize explicit tag slitting to chunked mode at OctetString and BitString encoders The inner chunks tagging logic is to be researched -- I'm not certain it works as it supposed to --- pyasn1/codec/ber/encoder.py | 57 +++++++++++++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 15 deletions(-) (limited to 'pyasn1/codec') diff --git a/pyasn1/codec/ber/encoder.py b/pyasn1/codec/ber/encoder.py index 1f6c11c..28c5071 100644 --- a/pyasn1/codec/ber/encoder.py +++ b/pyasn1/codec/ber/encoder.py @@ -157,12 +157,15 @@ class BitStringEncoder(AbstractItemEncoder): 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 @@ class BitStringEncoder(AbstractItemEncoder): 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: -- cgit v1.2.3