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
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)
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)
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)
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)
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))
def test_init(self): sut = asn1.StreamingASN1Decoder() self.assertRaises(asn1.ASN1WantMore, sut.getTag)