diff options
Diffstat (limited to 'pyasn1/codec/cer/decoder.py')
-rw-r--r-- | pyasn1/codec/cer/decoder.py | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/pyasn1/codec/cer/decoder.py b/pyasn1/codec/cer/decoder.py index 3e86fd0..abff803 100644 --- a/pyasn1/codec/cer/decoder.py +++ b/pyasn1/codec/cer/decoder.py @@ -4,12 +4,15 @@ # Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com> # License: http://snmplabs.com/pyasn1/license.html # +from io import BytesIO + from pyasn1 import error from pyasn1.codec.ber import decoder +from pyasn1.codec.ber.decoder import asSeekableStream from pyasn1.compat.octets import oct2int from pyasn1.type import univ -__all__ = ['decode'] +__all__ = ['decode', 'decodeStream'] class BooleanDecoder(decoder.AbstractSimpleDecoder): @@ -19,7 +22,7 @@ class BooleanDecoder(decoder.AbstractSimpleDecoder): tagSet=None, length=None, state=None, decodeFun=None, substrateFun=None, **options): - head, tail = substrate[:length], substrate[length:] + head = substrate.read(1) if not head or length != 1: raise error.PyAsn1Error('Not single-octet Boolean payload') byte = oct2int(head[0]) @@ -32,7 +35,7 @@ class BooleanDecoder(decoder.AbstractSimpleDecoder): value = 0 else: raise error.PyAsn1Error('Unexpected Boolean payload: %s' % byte) - return self._createComponent(asn1Spec, tagSet, value, **options), tail + return self._createComponent(asn1Spec, tagSet, value, **options) # TODO: prohibit non-canonical encoding BitStringDecoder = decoder.BitStringDecoder @@ -61,6 +64,21 @@ class Decoder(decoder.Decoder): pass +_decode = Decoder(tagMap, typeMap) + + +def decodeStream(substrate, asn1Spec=None, **kwargs): + """Iterator of objects in a substrate.""" + # TODO: This should become `decode` after API-breaking approved + substrate = asSeekableStream(substrate) + while True: + result = _decode(substrate, asn1Spec, **kwargs) + if result is None: + break + yield result + # TODO: Check about eoo.endOfOctets? + + #: Turns CER octet stream into an ASN.1 object. #: #: Takes CER octet-stream and decode it into an ASN.1 object @@ -111,4 +129,9 @@ class Decoder(decoder.Decoder): #: SequenceOf: #: 1 2 3 #: -decode = Decoder(tagMap, decoder.typeMap) +def decode(substrate, asn1Spec=None, **kwargs): + # TODO: Temporary solution before merging with upstream + # It preserves the original API + substrate = BytesIO(substrate) + iterator = decodeStream(substrate, asn1Spec=asn1Spec, **kwargs) + return next(iterator), substrate.read() |