summaryrefslogtreecommitdiff
path: root/pyasn1/codec/cer/decoder.py
diff options
context:
space:
mode:
Diffstat (limited to 'pyasn1/codec/cer/decoder.py')
-rw-r--r--pyasn1/codec/cer/decoder.py31
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()