# coding: utf-8
-# PyDERASN -- Python ASN.1 DER codec with abstract structures
+# PyDERASN -- Python ASN.1 DER/BER codec with abstract structures
# Copyright (C) 2017-2018 Sergey Matveev <stargrave@stargrave.org>
#
# This program is free software: you can redistribute it and/or modify
from pyderasn import DecodePathDefBy
from pyderasn import Enumerated
from pyderasn import EOC
+from pyderasn import EOC_LEN
from pyderasn import GeneralizedTime
from pyderasn import GeneralString
from pyderasn import GraphicString
)
self.assertTrue(bool(obj))
self.assertTrue(obj.bered)
+ self.assertFalse(obj.lenindef)
+
+ @given(
+ integers(min_value=1).map(tag_ctxc),
+ lists(
+ booleans(),
+ min_size=1,
+ max_size=5,
+ ),
+ )
+ def test_ber_expl(self, expl, values):
+ encoded = b""
+ for value in values:
+ encoded += (
+ expl +
+ b"\x80" +
+ Boolean(value).encode() +
+ EOC
+ )
+ encoded = SequenceOf.tag_default + len_encode(len(encoded)) + encoded
+
+ class SeqOf(SequenceOf):
+ schema = Boolean(expl=expl)
+ seqof, tail = SeqOf().decode(encoded, ctx={"bered": True})
+ self.assertSequenceEqual(tail, b"")
+ self.assertSequenceEqual([bool(v) for v in seqof], values)
+ self.assertSetEqual(
+ set(
+ (
+ v.tlvlen,
+ v.expl_tlvlen,
+ v.expl_tlen,
+ v.expl_llen,
+ v.bered,
+ v.lenindef,
+ v.expl_lenindef,
+ ) for v in seqof
+ ),
+ set(((
+ 3 + EOC_LEN,
+ len(expl) + 1 + 3 + EOC_LEN,
+ len(expl),
+ 1,
+ False,
+ False,
+ True,
+ ),)),
+ )
@composite
)
with assertRaisesRegex(self, DecodeError, "unallowed BER"):
BitString(impl=tag_encode(impl)).decode(encoded_indefinite)
- for encoded in (encoded_indefinite, encoded_definite):
+ for lenindef_expected, encoded in (
+ (True, encoded_indefinite),
+ (False, encoded_definite),
+ ):
obj, tail = BitString(impl=tag_encode(impl)).decode(
encoded, ctx={"bered": True}
)
self.assertEqual(obj.bit_len, bit_len_expected)
self.assertSequenceEqual(bytes(obj), payload_expected)
self.assertTrue(obj.bered)
+ self.assertEqual(obj.lenindef, lenindef_expected)
self.assertEqual(len(encoded), obj.tlvlen)
def test_x690_vector(self):
- vector_payload = hexdec("0A3B5F291CD0")
- vector = BitString((len(vector_payload) * 8 - 4, vector_payload))
+ vector = BitString("'0A3B5F291CD'H")
obj, tail = BitString().decode(hexdec("0307040A3B5F291CD0"))
self.assertSequenceEqual(tail, b"")
self.assertEqual(obj, vector)
)
self.assertSequenceEqual(tail, b"")
self.assertEqual(obj, vector)
+ self.assertTrue(obj.bered)
+ self.assertTrue(obj.lenindef)
@composite
)
with assertRaisesRegex(self, DecodeError, "unallowed BER"):
OctetString(impl=tag_encode(impl)).decode(encoded_indefinite)
- for encoded in (encoded_indefinite, encoded_definite):
+ for lenindef_expected, encoded in (
+ (True, encoded_indefinite),
+ (False, encoded_definite),
+ ):
obj, tail = OctetString(impl=tag_encode(impl)).decode(
encoded, ctx={"bered": True}
)
self.assertSequenceEqual(tail, b"")
self.assertSequenceEqual(bytes(obj), payload_expected)
self.assertTrue(obj.bered)
+ self.assertEqual(obj.lenindef, lenindef_expected)
self.assertEqual(len(encoded), obj.tlvlen)
base_klass = VisibleString
def test_x690_vector(self):
- self.assertEqual(
- str(VisibleString().decode(hexdec("1A054A6F6E6573"))[0]),
- "Jones",
- )
- self.assertEqual(
- str(VisibleString().decode(
- hexdec("3A0904034A6F6E04026573"),
- ctx={"bered": True},
- )[0]),
- "Jones",
+ obj, tail = VisibleString().decode(hexdec("1A054A6F6E6573"))
+ self.assertSequenceEqual(tail, b"")
+ self.assertEqual(str(obj), "Jones")
+ self.assertFalse(obj.bered)
+ self.assertFalse(obj.lenindef)
+
+ obj, tail = VisibleString().decode(
+ hexdec("3A0904034A6F6E04026573"),
+ ctx={"bered": True},
)
- self.assertEqual(
- str(VisibleString().decode(
- hexdec("3A8004034A6F6E040265730000"),
- ctx={"bered": True},
- )[0]),
- "Jones",
+ self.assertSequenceEqual(tail, b"")
+ self.assertEqual(str(obj), "Jones")
+ self.assertTrue(obj.bered)
+ self.assertFalse(obj.lenindef)
+
+ obj, tail = VisibleString().decode(
+ hexdec("3A8004034A6F6E040265730000"),
+ ctx={"bered": True},
)
+ self.assertSequenceEqual(tail, b"")
+ self.assertEqual(str(obj), "Jones")
+ self.assertTrue(obj.bered)
+ self.assertTrue(obj.lenindef)
class TestGeneralString(