diff options
author | Ilya Etingof <etingof@gmail.com> | 2017-09-17 23:18:17 +0200 |
---|---|---|
committer | Ilya Etingof <etingof@gmail.com> | 2017-09-17 23:18:17 +0200 |
commit | d6c09ffbb51518669c0889ff1081888aebfcb16e (patch) | |
tree | 24f593bf8f336e6f83f04a4e1aa928b801552a90 /pyasn1/codec | |
parent | 1b44b804945df5a19e73c0d75321a77438076243 (diff) | |
download | pyasn1-d6c09ffbb51518669c0889ff1081888aebfcb16e.tar.gz |
OctetString and Any encoders save on ASN.1 schema instantiation
Diffstat (limited to 'pyasn1/codec')
-rw-r--r-- | pyasn1/codec/ber/encoder.py | 36 |
1 files changed, 22 insertions, 14 deletions
diff --git a/pyasn1/codec/ber/encoder.py b/pyasn1/codec/ber/encoder.py index 89fcca0..ef12bb4 100644 --- a/pyasn1/codec/ber/encoder.py +++ b/pyasn1/codec/ber/encoder.py @@ -6,7 +6,7 @@ # from pyasn1.type import tag, univ, char, useful from pyasn1.codec.ber import eoo -from pyasn1.compat.octets import int2oct, oct2int, ints2octs, null, str2octs +from pyasn1.compat.octets import int2oct, oct2int, ints2octs, null, str2octs, isOctetsType from pyasn1.compat.integer import to_bytes from pyasn1 import debug, error @@ -127,6 +127,7 @@ class IntegerEncoder(AbstractItemEncoder): class BitStringEncoder(AbstractItemEncoder): def encodeValue(self, value, asn1Spec, encodeFun, **options): if asn1Spec is not None: + # TODO: try to avoid ASN.1 schema instantiation value = asn1Spec.clone(value) valueLength = len(value) @@ -159,24 +160,29 @@ class BitStringEncoder(AbstractItemEncoder): class OctetStringEncoder(AbstractItemEncoder): def encodeValue(self, value, asn1Spec, encodeFun, **options): - if asn1Spec is not None: - value = asn1Spec.clone(value) + 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() + + elif not isOctetsType(value): + # will strip off explicit tags + tagSet = asn1Spec.tagSet + asn1Spec = asn1Spec.clone(tagSet=tag.TagSet(tagSet.baseTag, tagSet.baseTag)) + + value = asn1Spec.clone(value).asOctets() maxChunkSize = options.get('maxChunkSize', 0) if not maxChunkSize or len(value) <= maxChunkSize: - return value.asOctets(), False, True + return value, False, True else: - tagSet = value.tagSet - - # will strip off explicit tags - baseTagSet = tag.TagSet(tagSet.baseTag, tagSet.baseTag) - pos = 0 substrate = null while True: - chunk = value.clone(value[pos:pos + maxChunkSize], - tagSet=baseTagSet) + chunk = value[pos:pos + maxChunkSize] if not chunk: break @@ -475,10 +481,12 @@ class ChoiceEncoder(AbstractItemEncoder): class AnyEncoder(OctetStringEncoder): def encodeValue(self, value, asn1Spec, encodeFun, **options): - if asn1Spec is not None: - value = asn1Spec.clone(value) + if asn1Spec is None: + value = value.asOctets() + elif not isOctetsType(value): + value = asn1Spec.clone(value).asOctets() - return value.asOctets(), not options.get('defMode', True), True + return value, not options.get('defMode', True), True tagMap = { |