Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/pyasn1/codec/der/decoder.py: 95%
19 statements
« prev ^ index » next coverage.py v7.2.2, created at 2023-03-26 06:25 +0000
« prev ^ index » next coverage.py v7.2.2, created at 2023-03-26 06:25 +0000
1#
2# This file is part of pyasn1 software.
3#
4# Copyright (c) 2005-2019, Ilya Etingof <etingof@gmail.com>
5# License: http://snmplabs.com/pyasn1/license.html
6#
7from pyasn1.codec.cer import decoder
8from pyasn1.type import univ
10__all__ = ['decode']
13class BitStringDecoder(decoder.BitStringDecoder):
14 supportConstructedForm = False
17class OctetStringDecoder(decoder.OctetStringDecoder):
18 supportConstructedForm = False
20# TODO: prohibit non-canonical encoding
21RealDecoder = decoder.RealDecoder
23tagMap = decoder.tagMap.copy()
24tagMap.update(
25 {univ.BitString.tagSet: BitStringDecoder(),
26 univ.OctetString.tagSet: OctetStringDecoder(),
27 univ.Real.tagSet: RealDecoder()}
28)
30typeMap = decoder.typeMap.copy()
32# Put in non-ambiguous types for faster codec lookup
33for typeDecoder in tagMap.values():
34 if typeDecoder.protoComponent is not None:
35 typeId = typeDecoder.protoComponent.__class__.typeId
36 if typeId is not None and typeId not in typeMap:
37 typeMap[typeId] = typeDecoder
40class Decoder(decoder.Decoder):
41 supportIndefLength = False
44#: Turns DER octet stream into an ASN.1 object.
45#:
46#: Takes DER octet-stream and decode it into an ASN.1 object
47#: (e.g. :py:class:`~pyasn1.type.base.PyAsn1Item` derivative) which
48#: may be a scalar or an arbitrary nested structure.
49#:
50#: Parameters
51#: ----------
52#: substrate: :py:class:`bytes` (Python 3) or :py:class:`str` (Python 2)
53#: DER octet-stream
54#:
55#: Keyword Args
56#: ------------
57#: asn1Spec: any pyasn1 type object e.g. :py:class:`~pyasn1.type.base.PyAsn1Item` derivative
58#: A pyasn1 type object to act as a template guiding the decoder. Depending on the ASN.1 structure
59#: being decoded, *asn1Spec* may or may not be required. Most common reason for
60#: it to require is that ASN.1 structure is encoded in *IMPLICIT* tagging mode.
61#:
62#: Returns
63#: -------
64#: : :py:class:`tuple`
65#: A tuple of pyasn1 object recovered from DER substrate (:py:class:`~pyasn1.type.base.PyAsn1Item` derivative)
66#: and the unprocessed trailing portion of the *substrate* (may be empty)
67#:
68#: Raises
69#: ------
70#: ~pyasn1.error.PyAsn1Error, ~pyasn1.error.SubstrateUnderrunError
71#: On decoding errors
72#:
73#: Examples
74#: --------
75#: Decode DER serialisation without ASN.1 schema
76#:
77#: .. code-block:: pycon
78#:
79#: >>> s, _ = decode(b'0\t\x02\x01\x01\x02\x01\x02\x02\x01\x03')
80#: >>> str(s)
81#: SequenceOf:
82#: 1 2 3
83#:
84#: Decode DER serialisation with ASN.1 schema
85#:
86#: .. code-block:: pycon
87#:
88#: >>> seq = SequenceOf(componentType=Integer())
89#: >>> s, _ = decode(b'0\t\x02\x01\x01\x02\x01\x02\x02\x01\x03', asn1Spec=seq)
90#: >>> str(s)
91#: SequenceOf:
92#: 1 2 3
93#:
94decode = Decoder(tagMap, typeMap)