Exemple #1
0
 def __init__(self):
     self._producer = None
     self._decoder = asn1.StreamingASN1Decoder()
     # Consumer of the decrypted payload.
     self._consumer = None
     # Result of the last step.
     self._last_tag = None
Exemple #2
0
    def test_read_constructed(self):
        """
        Will return the tag and consume the stream.
        """
        sut = asn1.StreamingASN1Decoder()

        sut.dataReceived(TEST_DATA[0:6])
        tag = sut.getTag()

        error = self.assertRaises(asn1.ASN1Error, sut.read, tag)

        self.assertEqual('Only primitive types can be read.', error.message)
Exemple #3
0
    def test_getTag_want_more(self):
        """
        Will return the tag, as soon as all header is available.
        """
        sut = asn1.StreamingASN1Decoder()

        for i in range(3):
            sut.dataReceived(TEST_DATA[i:i + 1])
            self.assertRaises(asn1.ASN1WantMore, sut.getTag)

        sut.dataReceived(TEST_DATA[3:4])
        result = sut.getTag()

        self.assertEqual(asn1.Numbers.Sequence, result.number)
        self.assertEqual(asn1.Types.Constructed, result.type)
        self.assertEqual(asn1.Classes.Universal, result.cls)
        self.assertEqual(1143, result.length)
Exemple #4
0
    def test_read(self):
        """
        Will return the tag and consume the stream.
        """
        sut = asn1.StreamingASN1Decoder()

        sut.dataReceived(TEST_DATA[0:6])
        sut.getTag()
        tag = sut.getTag()

        self.assertRaises(asn1.ASN1WantMore, sut.read, tag)

        # Partial data received.
        sut.dataReceived(TEST_DATA[6:10])
        self.assertRaises(asn1.ASN1WantMore, sut.read, tag)

        # All value data received.
        sut.dataReceived(TEST_DATA[10:15])
        result = sut.read(tag)

        # enveloped_data UID
        self.assertEqual(b'1.2.840.113549.1.7.3', result)

        # Steam was consumed.
        self.assertRaises(asn1.ASN1WantMore, sut.getTag)

        sut.dataReceived(TEST_DATA[15:100])
        # Content sequence and BER marker.
        tag = sut.getTag()
        self.assertEqual(0, tag.number)
        tag = sut.getTag()
        self.assertEqual(asn1.Numbers.Sequence, tag.number)

        # CMS version
        tag = sut.getTag()
        self.assertEqual(asn1.Numbers.Integer, tag.number)
        result = sut.read(tag)
        self.assertEqual(0, result)

        # recipient_infos set.
        tag = sut.getTag()
        self.assertEqual(asn1.Numbers.Set, tag.number)
Exemple #5
0
    def test_getTag_continue(self):
        """
        Will return the tag and consume the stream.
        """
        sut = asn1.StreamingASN1Decoder()

        sut.dataReceived(TEST_DATA[0:4])
        result = sut.getTag()
        self.assertEqual(asn1.Numbers.Sequence, result.number)

        # Stream is consumed.
        self.assertRaises(asn1.ASN1WantMore, sut.getTag)

        # Once more data is available, it can read the next tag.
        sut.dataReceived(TEST_DATA[4:6])

        result = sut.getTag()
        self.assertEqual(asn1.Numbers.ObjectIdentifier, result.number)
        self.assertEqual(asn1.Types.Primitive, result.type)
        self.assertEqual(asn1.Classes.Universal, result.cls)
        self.assertEqual(9, result.length)
Exemple #6
0
    def test_dump(self):
        """
        Will return the raw data for the tag, including the tag itself.
        """
        sut = asn1.StreamingASN1Decoder()

        sut.dataReceived(TEST_DATA[0:100])
        # Root sequence.
        sut.getTag()
        # Content type.
        sut.read(sut.getTag())
        # Content itself
        sut.getTag()
        sut.getTag()
        # CMS version
        self.assertEqual(0, sut.read(sut.getTag()))

        # recipient_infos set.
        tag = sut.getTag()
        self.assertEqual(asn1.Numbers.Set, tag.number)

        # Full data not available.
        self.assertRaises(asn1.ASN1WantMore, sut.dump, tag)

        sut.dataReceived(TEST_DATA[100:300])

        raw = sut.dump(tag)

        # Raw data can be parsed by any external ASN1 decoder.
        result = RecipientInfos.load(raw)
        self.assertEqual(
            'rsa', result.native[0]['key_encryption_algorithm']['algorithm'])

        # The cursor is advanced
        # EncryptedContentInfo sequence.
        tag = sut.getTag()
        self.assertEqual(asn1.Numbers.Set, tag.number)
        # content_type -> data OID
        self.assertEqual('1.2.840.113549.1.7.1', sut.read(tag))
Exemple #7
0
    def test_init(self):
        sut = asn1.StreamingASN1Decoder()

        self.assertRaises(asn1.ASN1WantMore, sut.getTag)