from pyderasn import InvalidValueType
from pyderasn import len_decode
from pyderasn import len_encode
+from pyderasn import LEN_YYMMDDHHMMSSZ
+from pyderasn import LEN_YYYYMMDDHHMMSSDMZ
+from pyderasn import LEN_YYYYMMDDHHMMSSZ
+from pyderasn import LENINDEF
+from pyderasn import LenIndefForm
from pyderasn import NotEnoughData
from pyderasn import Null
from pyderasn import NumericString
settings.register_profile("local", settings(
deadline=5000,
- perform_health_check=False,
))
settings.load_profile("local")
LONG_TEST_MAX_EXAMPLES = settings().max_examples * 4
obj = Boolean()
self.assertFalse(obj.ready)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
with self.assertRaises(ObjNotReady) as err:
obj.encode()
repr(err.exception)
obj = Boolean(value)
self.assertTrue(obj.ready)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
@given(booleans(), booleans(), binary(), binary())
def test_comparison(self, value1, value2, tag1, tag2):
_decoded=_decoded,
)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
self.assertFalse(obj.expled)
obj_encoded = obj.encode()
obj_expled = obj(value, expl=tag_expl)
self.assertTrue(obj_expled.expled)
repr(obj_expled)
- pprint(obj_expled)
+ list(obj_expled.pps())
+ pprint(obj_expled, big_blobs=True, with_decode_path=True)
obj_expled_encoded = obj_expled.encode()
obj_decoded, tail = obj_expled.decode(
obj_expled_encoded + tail_junk,
offset=offset,
)
repr(obj_decoded)
- pprint(obj_decoded)
+ list(obj_decoded.pps())
+ pprint(obj_decoded, big_blobs=True, with_decode_path=True)
self.assertEqual(tail, tail_junk)
self.assertEqual(obj_decoded, obj_expled)
self.assertNotEqual(obj_decoded, obj)
ctx={"bered": True},
)
self.assertTrue(bool(obj))
+ self.assertTrue(obj.ber_encoded)
+ self.assertFalse(obj.lenindef)
self.assertTrue(obj.bered)
+
+ @given(
+ integers(min_value=1).map(tag_ctxc),
+ binary().filter(lambda x: not x.startswith(EOC)),
+ )
+ def test_ber_expl_no_eoc(self, expl, junk):
+ encoded = expl + LENINDEF + Boolean(False).encode()
+ with self.assertRaises(LenIndefForm):
+ Boolean(expl=expl).decode(encoded + junk)
+ with assertRaisesRegex(self, DecodeError, "no EOC"):
+ Boolean(expl=expl).decode(encoded + junk, ctx={"bered": True})
+ obj, tail = Boolean(expl=expl).decode(
+ encoded + EOC + junk,
+ ctx={"bered": True},
+ )
+ self.assertTrue(obj.expl_lenindef)
self.assertFalse(obj.lenindef)
+ self.assertFalse(obj.ber_encoded)
+ self.assertTrue(obj.bered)
+ self.assertSequenceEqual(tail, junk)
+ repr(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
@given(
integers(min_value=1).map(tag_ctxc),
for value in values:
encoded += (
expl +
- b"\x80" +
+ LENINDEF +
Boolean(value).encode() +
EOC
)
class SeqOf(SequenceOf):
schema = Boolean(expl=expl)
+ with self.assertRaises(LenIndefForm):
+ SeqOf().decode(encoded)
seqof, tail = SeqOf().decode(encoded, ctx={"bered": True})
self.assertSequenceEqual(tail, b"")
self.assertSequenceEqual([bool(v) for v in seqof], values)
v.expl_tlvlen,
v.expl_tlen,
v.expl_llen,
- v.bered,
+ v.ber_encoded,
v.lenindef,
v.expl_lenindef,
+ v.bered,
) for v in seqof
),
set(((
False,
False,
True,
+ True,
),)),
)
+ repr(seqof)
+ list(seqof.pps())
+ pprint(seqof, big_blobs=True, with_decode_path=True)
@composite
obj = Integer()
self.assertFalse(obj.ready)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
with self.assertRaises(ObjNotReady) as err:
obj.encode()
repr(err.exception)
obj = Integer(value)
self.assertTrue(obj.ready)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
hash(obj)
@given(integers(), integers(), binary(), binary())
with self.assertRaises(BoundsError) as err:
Integer(value=values[0], bounds=(values[1], values[2]))
repr(err.exception)
+ with assertRaisesRegex(self, DecodeError, "bounds") as err:
+ Integer(bounds=(values[1], values[2])).decode(
+ Integer(values[0]).encode()
+ )
+ repr(err.exception)
with self.assertRaises(BoundsError) as err:
Integer(value=values[2], bounds=(values[0], values[1]))
repr(err.exception)
+ with assertRaisesRegex(self, DecodeError, "bounds") as err:
+ Integer(bounds=(values[0], values[1])).decode(
+ Integer(values[2]).encode()
+ )
+ repr(err.exception)
@given(data_strategy())
def test_call(self, d):
_decoded=_decoded,
)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
self.assertFalse(obj.expled)
obj_encoded = obj.encode()
obj_expled = obj(value, expl=tag_expl)
self.assertTrue(obj_expled.expled)
repr(obj_expled)
- pprint(obj_expled)
+ list(obj_expled.pps())
+ pprint(obj_expled, big_blobs=True, with_decode_path=True)
obj_expled_encoded = obj_expled.encode()
obj_decoded, tail = obj_expled.decode(
obj_expled_encoded + tail_junk,
offset=offset,
)
repr(obj_decoded)
- pprint(obj_decoded)
+ list(obj_decoded.pps())
+ pprint(obj_decoded, big_blobs=True, with_decode_path=True)
self.assertEqual(tail, tail_junk)
self.assertEqual(obj_decoded, obj_expled)
self.assertNotEqual(obj_decoded, obj)
obj = BitString()
self.assertFalse(obj.ready)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
with self.assertRaises(ObjNotReady) as err:
obj.encode()
repr(err.exception)
obj = BitString(value)
self.assertTrue(obj.ready)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
@given(
tuples(integers(min_value=0), binary()),
_decoded=_decoded,
)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
self.assertFalse(obj.expled)
obj_encoded = obj.encode()
obj_expled = obj(value, expl=tag_expl)
self.assertTrue(obj_expled.expled)
repr(obj_expled)
- pprint(obj_expled)
+ list(obj_expled.pps())
+ pprint(obj_expled, big_blobs=True, with_decode_path=True)
obj_expled_encoded = obj_expled.encode()
obj_decoded, tail = obj_expled.decode(
obj_expled_encoded + tail_junk,
offset=offset,
)
repr(obj_decoded)
- pprint(obj_decoded)
+ list(obj_decoded.pps())
+ pprint(obj_decoded, big_blobs=True, with_decode_path=True)
self.assertEqual(tail, tail_junk)
self.assertEqual(obj_decoded, obj_expled)
self.assertNotEqual(obj_decoded, obj)
max_size=3,
),
lists(booleans(), min_size=1),
+ binary(),
)
- def test_constructed(self, impl, chunk_inputs, chunk_last_bits):
+ def test_constructed(self, impl, chunk_inputs, chunk_last_bits, junk):
def chunk_constructed(contents):
return (
tag_encode(form=TagFormConstructed, num=3) +
- b"\x80" +
+ LENINDEF +
b"".join(BitString(content).encode() for content in contents) +
EOC
)
bit_len_expected += chunk_last.bit_len
encoded_indefinite = (
tag_encode(form=TagFormConstructed, num=impl) +
- b"\x80" +
+ LENINDEF +
b"".join(chunks) +
chunk_last.encode() +
EOC
(False, encoded_definite),
):
obj, tail = BitString(impl=tag_encode(impl)).decode(
- encoded, ctx={"bered": True}
+ encoded + junk,
+ ctx={"bered": True},
)
- self.assertSequenceEqual(tail, b"")
+ self.assertSequenceEqual(tail, junk)
self.assertEqual(obj.bit_len, bit_len_expected)
self.assertSequenceEqual(bytes(obj), payload_expected)
- self.assertTrue(obj.bered)
+ self.assertTrue(obj.ber_encoded)
self.assertEqual(obj.lenindef, lenindef_expected)
+ self.assertTrue(obj.bered)
self.assertEqual(len(encoded), obj.tlvlen)
+ @given(
+ integers(min_value=0),
+ decode_path_strat,
+ )
+ def test_ber_definite_too_short(self, offset, decode_path):
+ with assertRaisesRegex(self, DecodeError, "longer than data") as err:
+ BitString().decode(
+ tag_encode(3, form=TagFormConstructed) + len_encode(1),
+ offset=offset,
+ decode_path=decode_path,
+ ctx={"bered": True},
+ )
+ self.assertEqual(err.exception.decode_path, decode_path)
+ self.assertEqual(err.exception.offset, offset)
+
+ @given(
+ integers(min_value=0),
+ decode_path_strat,
+ )
+ def test_ber_definite_no_data(self, offset, decode_path):
+ with assertRaisesRegex(self, DecodeError, "zero length") as err:
+ BitString().decode(
+ tag_encode(3, form=TagFormConstructed) + len_encode(0),
+ offset=offset,
+ decode_path=decode_path,
+ ctx={"bered": True},
+ )
+ self.assertEqual(err.exception.decode_path, decode_path)
+ self.assertEqual(err.exception.offset, offset)
+
+ @given(
+ integers(min_value=0),
+ decode_path_strat,
+ integers(min_value=1, max_value=3),
+ )
+ def test_ber_indefinite_no_eoc(self, offset, decode_path, chunks):
+ bs = BitString(b"data").encode()
+ with self.assertRaises(NotEnoughData) as err:
+ BitString().decode(
+ tag_encode(3, form=TagFormConstructed) + LENINDEF + chunks * bs,
+ offset=offset,
+ decode_path=decode_path,
+ ctx={"bered": True},
+ )
+ self.assertEqual(err.exception.decode_path, decode_path + (str(chunks),))
+ self.assertEqual(err.exception.offset, offset + 1 + 1 + chunks * len(bs))
+
+ @given(
+ integers(min_value=0),
+ decode_path_strat,
+ integers(min_value=1, max_value=3),
+ )
+ def test_ber_definite_chunk_out_of_bounds(self, offset, decode_path, chunks):
+ bs = BitString(b"data").encode()
+ bs_longer = BitString(b"data-longer").encode()
+ with assertRaisesRegex(self, DecodeError, "chunk out of bounds") as err:
+ BitString().decode(
+ (
+ tag_encode(3, form=TagFormConstructed) +
+ len_encode((chunks + 1) * len(bs)) +
+ chunks * bs +
+ bs_longer
+ ),
+ offset=offset,
+ decode_path=decode_path,
+ ctx={"bered": True},
+ )
+ self.assertEqual(err.exception.decode_path, decode_path + (str(chunks),))
+ self.assertEqual(err.exception.offset, offset + 1 + 1 + chunks * len(bs))
+
+ @given(
+ integers(min_value=0),
+ decode_path_strat,
+ )
+ def test_ber_indefinite_no_chunks(self, offset, decode_path):
+ with assertRaisesRegex(self, DecodeError, "no chunks") as err:
+ BitString().decode(
+ tag_encode(3, form=TagFormConstructed) + LENINDEF + EOC,
+ offset=offset,
+ decode_path=decode_path,
+ ctx={"bered": True},
+ )
+ self.assertEqual(err.exception.decode_path, decode_path)
+ self.assertEqual(err.exception.offset, offset)
+
+ @given(data_strategy())
+ def test_ber_indefinite_not_multiple(self, d):
+ bs_short = BitString("'A'H").encode()
+ bs_full = BitString("'AA'H").encode()
+ chunks = [bs_full for _ in range(d.draw(integers(min_value=0, max_value=3)))]
+ chunks.append(bs_short)
+ d.draw(permutations(chunks))
+ chunks.append(bs_short)
+ offset = d.draw(integers(min_value=0))
+ decode_path = d.draw(decode_path_strat)
+ with assertRaisesRegex(self, DecodeError, "multiple of 8 bits") as err:
+ BitString().decode(
+ (
+ tag_encode(3, form=TagFormConstructed) +
+ LENINDEF +
+ b"".join(chunks) +
+ EOC
+ ),
+ offset=offset,
+ decode_path=decode_path,
+ ctx={"bered": True},
+ )
+ self.assertEqual(
+ err.exception.decode_path,
+ decode_path + (str(chunks.index(bs_short)),),
+ )
+ self.assertEqual(
+ err.exception.offset,
+ offset + 1 + 1 + chunks.index(bs_short) * len(bs_full),
+ )
+
def test_x690_vector(self):
vector = BitString("'0A3B5F291CD'H")
obj, tail = BitString().decode(hexdec("0307040A3B5F291CD0"))
)
self.assertSequenceEqual(tail, b"")
self.assertEqual(obj, vector)
- self.assertTrue(obj.bered)
+ self.assertTrue(obj.ber_encoded)
self.assertTrue(obj.lenindef)
+ self.assertTrue(obj.bered)
@composite
obj = OctetString()
self.assertFalse(obj.ready)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
with self.assertRaises(ObjNotReady) as err:
obj.encode()
repr(err.exception)
obj = OctetString(value)
self.assertTrue(obj.ready)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
@given(binary(), binary(), binary(min_size=1), binary(min_size=1))
def test_comparison(self, value1, value2, tag1, tag2):
with self.assertRaises(BoundsError) as err:
OctetString(value=value, bounds=(bound_min, bound_max))
repr(err.exception)
+ with assertRaisesRegex(self, DecodeError, "bounds") as err:
+ OctetString(bounds=(bound_min, bound_max)).decode(
+ OctetString(value).encode()
+ )
+ repr(err.exception)
value = d.draw(binary(min_size=bound_max + 1))
with self.assertRaises(BoundsError) as err:
OctetString(value=value, bounds=(bound_min, bound_max))
repr(err.exception)
+ with assertRaisesRegex(self, DecodeError, "bounds") as err:
+ OctetString(bounds=(bound_min, bound_max)).decode(
+ OctetString(value).encode()
+ )
+ repr(err.exception)
@given(data_strategy())
def test_call(self, d):
_decoded=_decoded,
)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
self.assertFalse(obj.expled)
obj_encoded = obj.encode()
obj_expled = obj(value, expl=tag_expl)
self.assertTrue(obj_expled.expled)
repr(obj_expled)
- pprint(obj_expled)
+ list(obj_expled.pps())
+ pprint(obj_expled, big_blobs=True, with_decode_path=True)
obj_expled_encoded = obj_expled.encode()
obj_decoded, tail = obj_expled.decode(
obj_expled_encoded + tail_junk,
offset=offset,
)
repr(obj_decoded)
- pprint(obj_decoded)
+ list(obj_decoded.pps())
+ pprint(obj_decoded, big_blobs=True, with_decode_path=True)
self.assertEqual(tail, tail_junk)
self.assertEqual(obj_decoded, obj_expled)
self.assertNotEqual(obj_decoded, obj)
min_size=1,
max_size=3,
),
+ binary(),
)
- def test_constructed(self, impl, chunk_inputs):
+ def test_constructed(self, impl, chunk_inputs, junk):
def chunk_constructed(contents):
return (
tag_encode(form=TagFormConstructed, num=4) +
- b"\x80" +
+ LENINDEF +
b"".join(OctetString(content).encode() for content in contents) +
EOC
)
payload_expected += payload
encoded_indefinite = (
tag_encode(form=TagFormConstructed, num=impl) +
- b"\x80" +
+ LENINDEF +
b"".join(chunks) +
EOC
)
(False, encoded_definite),
):
obj, tail = OctetString(impl=tag_encode(impl)).decode(
- encoded, ctx={"bered": True}
+ encoded + junk,
+ ctx={"bered": True},
)
- self.assertSequenceEqual(tail, b"")
+ self.assertSequenceEqual(tail, junk)
self.assertSequenceEqual(bytes(obj), payload_expected)
- self.assertTrue(obj.bered)
+ self.assertTrue(obj.ber_encoded)
self.assertEqual(obj.lenindef, lenindef_expected)
+ self.assertTrue(obj.bered)
self.assertEqual(len(encoded), obj.tlvlen)
+ @given(
+ integers(min_value=0),
+ decode_path_strat,
+ )
+ def test_ber_definite_too_short(self, offset, decode_path):
+ with assertRaisesRegex(self, DecodeError, "longer than data") as err:
+ OctetString().decode(
+ tag_encode(4, form=TagFormConstructed) + len_encode(1),
+ offset=offset,
+ decode_path=decode_path,
+ ctx={"bered": True},
+ )
+ self.assertEqual(err.exception.decode_path, decode_path)
+ self.assertEqual(err.exception.offset, offset)
+
+ @given(
+ integers(min_value=0),
+ decode_path_strat,
+ integers(min_value=1, max_value=3),
+ )
+ def test_ber_indefinite_no_eoc(self, offset, decode_path, chunks):
+ bs = OctetString(b"data").encode()
+ with self.assertRaises(NotEnoughData) as err:
+ OctetString().decode(
+ tag_encode(4, form=TagFormConstructed) + LENINDEF + chunks * bs,
+ offset=offset,
+ decode_path=decode_path,
+ ctx={"bered": True},
+ )
+ self.assertEqual(err.exception.decode_path, decode_path + (str(chunks),))
+ self.assertEqual(err.exception.offset, offset + 1 + 1 + chunks * len(bs))
+
+ @given(
+ integers(min_value=0),
+ decode_path_strat,
+ integers(min_value=1, max_value=3),
+ )
+ def test_ber_definite_chunk_out_of_bounds(self, offset, decode_path, chunks):
+ bs = OctetString(b"data").encode()
+ bs_longer = OctetString(b"data-longer").encode()
+ with assertRaisesRegex(self, DecodeError, "chunk out of bounds") as err:
+ OctetString().decode(
+ (
+ tag_encode(4, form=TagFormConstructed) +
+ len_encode((chunks + 1) * len(bs)) +
+ chunks * bs +
+ bs_longer
+ ),
+ offset=offset,
+ decode_path=decode_path,
+ ctx={"bered": True},
+ )
+ self.assertEqual(err.exception.decode_path, decode_path + (str(chunks),))
+ self.assertEqual(err.exception.offset, offset + 1 + 1 + chunks * len(bs))
+
@composite
def null_values_strategy(draw, do_expl=False):
obj = Null()
self.assertTrue(obj.ready)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
@given(binary(), binary())
def test_comparison(self, tag1, tag2):
_, _, optional, _decoded = values
obj = klass(optional=optional, _decoded=_decoded)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
self.assertFalse(obj.expled)
obj_encoded = obj.encode()
obj_expled = obj(expl=tag_expl)
self.assertTrue(obj_expled.expled)
repr(obj_expled)
- pprint(obj_expled)
+ list(obj_expled.pps())
+ pprint(obj_expled, big_blobs=True, with_decode_path=True)
obj_expled_encoded = obj_expled.encode()
obj_decoded, tail = obj_expled.decode(
obj_expled_encoded + tail_junk,
offset=offset,
)
repr(obj_decoded)
- pprint(obj_decoded)
+ list(obj_decoded.pps())
+ pprint(obj_decoded, big_blobs=True, with_decode_path=True)
self.assertEqual(tail, tail_junk)
self.assertEqual(obj_decoded, obj_expled)
self.assertNotEqual(obj_decoded, obj)
obj = ObjectIdentifier()
self.assertFalse(obj.ready)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
with self.assertRaises(ObjNotReady) as err:
obj.encode()
repr(err.exception)
obj = ObjectIdentifier(value)
self.assertTrue(obj.ready)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
hash(obj)
@given(oid_strategy(), oid_strategy(), binary(), binary())
self.assertEqual(obj, ObjectIdentifier(".".join(str(arc) for arc in oid)))
str(obj)
repr(obj)
- pprint(obj)
+ pprint(obj, big_blobs=True, with_decode_path=True)
@settings(max_examples=LONG_TEST_MAX_EXAMPLES)
@given(
_decoded=_decoded,
)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
self.assertFalse(obj.expled)
obj_encoded = obj.encode()
obj_expled = obj(value, expl=tag_expl)
self.assertTrue(obj_expled.expled)
repr(obj_expled)
- pprint(obj_expled)
+ list(obj_expled.pps())
+ pprint(obj_expled, big_blobs=True, with_decode_path=True)
obj_expled_encoded = obj_expled.encode()
obj_decoded, tail = obj_expled.decode(
obj_expled_encoded + tail_junk,
offset=offset,
)
repr(obj_decoded)
- pprint(obj_decoded)
+ list(obj_decoded.pps())
+ pprint(obj_decoded, big_blobs=True, with_decode_path=True)
self.assertEqual(tail, tail_junk)
self.assertEqual(obj_decoded, obj_expled)
self.assertNotEqual(obj_decoded, obj)
obj = self.base_klass()
self.assertFalse(obj.ready)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
with self.assertRaises(ObjNotReady) as err:
obj.encode()
repr(err.exception)
obj = self.base_klass("whatever")
self.assertTrue(obj.ready)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
@given(integers(), integers(), binary(), binary())
def test_comparison(self, value1, value2, tag1, tag2):
_decoded=_decoded,
)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
self.assertFalse(obj.expled)
obj_encoded = obj.encode()
obj_expled = obj(value, expl=tag_expl)
self.assertTrue(obj_expled.expled)
repr(obj_expled)
- pprint(obj_expled)
+ list(obj_expled.pps())
+ pprint(obj_expled, big_blobs=True, with_decode_path=True)
obj_expled_encoded = obj_expled.encode()
obj_decoded, tail = obj_expled.decode(
obj_expled_encoded + tail_junk,
offset=offset,
)
repr(obj_decoded)
- pprint(obj_decoded)
+ list(obj_decoded.pps())
+ pprint(obj_decoded, big_blobs=True, with_decode_path=True)
self.assertEqual(tail, tail_junk)
self.assertEqual(obj_decoded, obj_expled)
self.assertNotEqual(obj_decoded, obj)
obj = self.base_klass()
self.assertFalse(obj.ready)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
text_type(obj)
with self.assertRaises(ObjNotReady) as err:
obj.encode()
obj = self.base_klass(value)
self.assertTrue(obj.ready)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
text_type(obj)
@given(data_strategy())
with self.assertRaises(BoundsError) as err:
self.base_klass(value=value, bounds=(bound_min, bound_max))
repr(err.exception)
+ with assertRaisesRegex(self, DecodeError, "bounds") as err:
+ self.base_klass(bounds=(bound_min, bound_max)).decode(
+ self.base_klass(value).encode()
+ )
+ repr(err.exception)
value = d.draw(text(alphabet=self.text_alphabet(), min_size=bound_max + 1))
with self.assertRaises(BoundsError) as err:
self.base_klass(value=value, bounds=(bound_min, bound_max))
repr(err.exception)
+ with assertRaisesRegex(self, DecodeError, "bounds") as err:
+ self.base_klass(bounds=(bound_min, bound_max)).decode(
+ self.base_klass(value).encode()
+ )
+ repr(err.exception)
@given(data_strategy())
def test_call(self, d):
_decoded=_decoded,
)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
self.assertFalse(obj.expled)
obj_encoded = obj.encode()
obj_expled = obj(value, expl=tag_expl)
self.assertTrue(obj_expled.expled)
repr(obj_expled)
- pprint(obj_expled)
+ list(obj_expled.pps())
+ pprint(obj_expled, big_blobs=True, with_decode_path=True)
obj_expled_encoded = obj_expled.encode()
obj_decoded, tail = obj_expled.decode(
obj_expled_encoded + tail_junk,
offset=offset,
)
repr(obj_decoded)
- pprint(obj_decoded)
+ list(obj_decoded.pps())
+ pprint(obj_decoded, big_blobs=True, with_decode_path=True)
self.assertEqual(tail, tail_junk)
self.assertEqual(obj_decoded, obj_expled)
self.assertNotEqual(obj_decoded, obj)
base_klass = UTF8String
+cyrillic_letters = text(
+ alphabet="".join(six_unichr(i) for i in list(range(0x0410, 0x044f + 1))),
+ min_size=1,
+ max_size=5,
+)
+
+
class UnicodeDecodeErrorMixin(object):
- @given(text(
- alphabet="".join(six_unichr(i) for i in list(range(0x0410, 0x044f + 1))),
- min_size=1,
- max_size=5,
- ))
+ @given(cyrillic_letters)
def test_unicode_decode_error(self, cyrillic_text):
with self.assertRaises(DecodeError):
self.base_klass(cyrillic_text)
base_klass = NumericString
def text_alphabet(self):
- return digits
+ return digits + " "
@given(text(alphabet=ascii_letters, min_size=1, max_size=5))
- def test_non_numeric(self, cyrillic_text):
+ def test_non_numeric(self, non_numeric_text):
with assertRaisesRegex(self, DecodeError, "non-numeric"):
- self.base_klass(cyrillic_text)
+ self.base_klass(non_numeric_text)
@given(
sets(integers(min_value=0, max_value=10), min_size=2, max_size=2),
):
base_klass = PrintableString
+ def text_alphabet(self):
+ return ascii_letters + digits + " '()+,-./:=?"
+
+ @given(text(alphabet=sorted(set(whitespace) - set(" ")), min_size=1, max_size=5))
+ def test_non_printable(self, non_printable_text):
+ with assertRaisesRegex(self, DecodeError, "non-printable"):
+ self.base_klass(non_printable_text)
+
+ @given(
+ sets(integers(min_value=0, max_value=10), min_size=2, max_size=2),
+ integers(min_value=0),
+ decode_path_strat,
+ )
+ def test_invalid_bounds_while_decoding(self, ints, offset, decode_path):
+ value, bound_min = list(sorted(ints))
+
+ class String(self.base_klass):
+ bounds = (bound_min, bound_min)
+ with self.assertRaises(DecodeError) as err:
+ String().decode(
+ self.base_klass(b"1" * value).encode(),
+ offset=offset,
+ decode_path=decode_path,
+ )
+ repr(err.exception)
+ self.assertEqual(err.exception.offset, offset)
+ self.assertEqual(err.exception.decode_path, decode_path)
+
class TestTeletexString(
UnicodeDecodeErrorMixin,
obj, tail = VisibleString().decode(hexdec("1A054A6F6E6573"))
self.assertSequenceEqual(tail, b"")
self.assertEqual(str(obj), "Jones")
- self.assertFalse(obj.bered)
+ self.assertFalse(obj.ber_encoded)
self.assertFalse(obj.lenindef)
+ self.assertFalse(obj.bered)
obj, tail = VisibleString().decode(
hexdec("3A0904034A6F6E04026573"),
)
self.assertSequenceEqual(tail, b"")
self.assertEqual(str(obj), "Jones")
- self.assertTrue(obj.bered)
+ self.assertTrue(obj.ber_encoded)
self.assertFalse(obj.lenindef)
+ self.assertTrue(obj.bered)
obj, tail = VisibleString().decode(
hexdec("3A8004034A6F6E040265730000"),
)
self.assertSequenceEqual(tail, b"")
self.assertEqual(str(obj), "Jones")
- self.assertTrue(obj.bered)
+ self.assertTrue(obj.ber_encoded)
self.assertTrue(obj.lenindef)
+ self.assertTrue(obj.bered)
class TestGeneralString(
obj = self.base_klass()
self.assertFalse(obj.ready)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
with self.assertRaises(ObjNotReady) as err:
obj.encode()
repr(err.exception)
obj = self.base_klass(value)
self.assertTrue(obj.ready)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
@given(data_strategy())
def test_comparison(self, d):
_decoded=_decoded,
)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
self.assertFalse(obj.expled)
obj_encoded = obj.encode()
obj_expled = obj(value, expl=tag_expl)
self.assertTrue(obj_expled.expled)
repr(obj_expled)
- pprint(obj_expled)
+ list(obj_expled.pps())
+ pprint(obj_expled, big_blobs=True, with_decode_path=True)
obj_expled_encoded = obj_expled.encode()
obj_decoded, tail = obj_expled.decode(
obj_expled_encoded + tail_junk,
offset=offset,
)
repr(obj_decoded)
- pprint(obj_decoded)
+ list(obj_decoded.pps())
+ pprint(obj_decoded, big_blobs=True, with_decode_path=True)
self.assertEqual(tail, tail_junk)
self.assertEqual(obj_decoded, obj_expled)
self.assertEqual(obj_decoded.todatetime(), obj_expled.todatetime())
datetime(2010, 1, 2, 3, 4, 5, 0),
)
+ @given(
+ binary(
+ min_size=(LEN_YYYYMMDDHHMMSSZ - 1) // 2,
+ max_size=(LEN_YYYYMMDDHHMMSSZ - 1) // 2,
+ ),
+ binary(min_size=1, max_size=1),
+ binary(
+ min_size=(LEN_YYYYMMDDHHMMSSZ - 1) // 2,
+ max_size=(LEN_YYYYMMDDHHMMSSZ - 1) // 2,
+ ),
+ )
+ def test_junk(self, part0, part1, part2):
+ junk = part0 + part1 + part2
+ assume(not (set(junk) <= set(digits.encode("ascii"))))
+ with self.assertRaises(DecodeError):
+ GeneralizedTime().decode(
+ GeneralizedTime.tag_default +
+ len_encode(len(junk)) +
+ junk
+ )
+
+ @given(
+ binary(
+ min_size=(LEN_YYYYMMDDHHMMSSDMZ - 1) // 2,
+ max_size=(LEN_YYYYMMDDHHMMSSDMZ - 1) // 2,
+ ),
+ binary(min_size=1, max_size=1),
+ binary(
+ min_size=(LEN_YYYYMMDDHHMMSSDMZ - 1) // 2,
+ max_size=(LEN_YYYYMMDDHHMMSSDMZ - 1) // 2,
+ ),
+ )
+ def test_junk_dm(self, part0, part1, part2):
+ junk = part0 + part1 + part2
+ assume(not (set(junk) <= set(digits.encode("ascii"))))
+ with self.assertRaises(DecodeError):
+ GeneralizedTime().decode(
+ GeneralizedTime.tag_default +
+ len_encode(len(junk)) +
+ junk
+ )
+
class TestUTCTime(TimeMixin, CommonMixin, TestCase):
base_klass = UTCTime
1900 + year,
)
+ @given(
+ binary(
+ min_size=(LEN_YYMMDDHHMMSSZ - 1) // 2,
+ max_size=(LEN_YYMMDDHHMMSSZ - 1) // 2,
+ ),
+ binary(min_size=1, max_size=1),
+ binary(
+ min_size=(LEN_YYMMDDHHMMSSZ - 1) // 2,
+ max_size=(LEN_YYMMDDHHMMSSZ - 1) // 2,
+ ),
+ )
+ def test_junk(self, part0, part1, part2):
+ junk = part0 + part1 + part2
+ assume(not (set(junk) <= set(digits.encode("ascii"))))
+ with self.assertRaises(DecodeError):
+ UTCTime().decode(
+ UTCTime.tag_default +
+ len_encode(len(junk)) +
+ junk
+ )
+
@composite
def any_values_strategy(draw, do_expl=False):
obj = Any()
self.assertFalse(obj.ready)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
with self.assertRaises(ObjNotReady) as err:
obj.encode()
repr(err.exception)
obj = Any(value)
self.assertTrue(obj.ready)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
@given(integers())
def test_basic(self, value):
len(integer_encoded),
)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
self.assertSequenceEqual(obj.encode(), integer_encoded)
@given(binary(), binary())
_, _, optional, _decoded = values
obj = klass(value=value, optional=optional, _decoded=_decoded)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
self.assertFalse(obj.expled)
obj_encoded = obj.encode()
obj_expled = obj(value, expl=tag_expl)
self.assertTrue(obj_expled.expled)
repr(obj_expled)
- pprint(obj_expled)
+ list(obj_expled.pps())
+ pprint(obj_expled, big_blobs=True, with_decode_path=True)
obj_expled_encoded = obj_expled.encode()
obj_decoded, tail = obj_expled.decode(
obj_expled_encoded + tail_junk,
offset=offset,
)
repr(obj_decoded)
- pprint(obj_decoded)
+ list(obj_decoded.pps())
+ pprint(obj_decoded, big_blobs=True, with_decode_path=True)
self.assertEqual(tail, tail_junk)
self.assertEqual(obj_decoded, obj_expled)
self.assertEqual(bytes(obj_decoded), bytes(obj_expled))
self.assertEqual(obj_decoded.llen, 0)
self.assertEqual(obj_decoded.vlen, len(value))
+ @given(
+ integers(min_value=1).map(tag_ctxc),
+ integers(min_value=0, max_value=3),
+ integers(min_value=0),
+ decode_path_strat,
+ binary(),
+ )
+ def test_indefinite(self, expl, chunks, offset, decode_path, junk):
+ chunk = Boolean(False, expl=expl).encode()
+ encoded = (
+ OctetString.tag_default +
+ LENINDEF +
+ b"".join([chunk] * chunks) +
+ EOC
+ )
+ with self.assertRaises(LenIndefForm):
+ Any().decode(
+ encoded + junk,
+ offset=offset,
+ decode_path=decode_path,
+ )
+ obj, tail = Any().decode(
+ encoded + junk,
+ offset=offset,
+ decode_path=decode_path,
+ ctx={"bered": True},
+ )
+ self.assertSequenceEqual(tail, junk)
+ self.assertEqual(obj.offset, offset)
+ self.assertEqual(obj.tlvlen, len(encoded))
+ self.assertTrue(obj.lenindef)
+ self.assertFalse(obj.ber_encoded)
+ self.assertTrue(obj.bered)
+ repr(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
+ with self.assertRaises(NotEnoughData) as err:
+ Any().decode(
+ encoded[:-1],
+ offset=offset,
+ decode_path=decode_path,
+ ctx={"bered": True},
+ )
+ self.assertEqual(err.exception.offset, offset + 1 + 1 + len(chunk) * chunks)
+ self.assertEqual(err.exception.decode_path, decode_path + (str(chunks),))
+
+ class SeqOf(SequenceOf):
+ schema = Boolean(expl=expl)
+
+ class Seq(Sequence):
+ schema = (
+ ("type", ObjectIdentifier(defines=((("value",), {
+ ObjectIdentifier("1.2.3"): SeqOf(impl=OctetString.tag_default),
+ }),))),
+ ("value", Any()),
+ )
+ seq = Seq((
+ ("type", ObjectIdentifier("1.2.3")),
+ ("value", Any(encoded)),
+ ))
+ seq_encoded = seq.encode()
+ seq_decoded, _ = Seq().decode(seq_encoded, ctx={"bered": True})
+ self.assertIsNotNone(seq_decoded["value"].defined)
+ repr(seq_decoded)
+ list(seq_decoded.pps())
+ pprint(seq_decoded, big_blobs=True, with_decode_path=True)
+ self.assertTrue(seq_decoded.bered)
+ self.assertFalse(seq_decoded["type"].bered)
+ self.assertTrue(seq_decoded["value"].bered)
+
+ chunk = chunk[:-1] + b"\x01"
+ chunks = b"".join([chunk] * (chunks + 1))
+ encoded = OctetString.tag_default + len_encode(len(chunks)) + chunks
+ seq = Seq((
+ ("type", ObjectIdentifier("1.2.3")),
+ ("value", Any(encoded)),
+ ))
+ seq_encoded = seq.encode()
+ seq_decoded, _ = Seq().decode(seq_encoded, ctx={"bered": True})
+ self.assertIsNotNone(seq_decoded["value"].defined)
+ repr(seq_decoded)
+ list(seq_decoded.pps())
+ pprint(seq_decoded, big_blobs=True, with_decode_path=True)
+ self.assertTrue(seq_decoded.bered)
+ self.assertFalse(seq_decoded["type"].bered)
+ self.assertTrue(seq_decoded["value"].bered)
+
@composite
def choice_values_strategy(draw, value_required=False, schema=None, do_expl=False):
if schema is None:
names = list(draw(sets(text_letters(), min_size=1, max_size=5)))
- tags = [tag_encode(tag) for tag in draw(sets(
- integers(min_value=0),
+ tags = [{tag_type: tag_value} for tag_type, tag_value in draw(sets(
+ one_of(
+ tuples(just("impl"), integers(min_value=0).map(tag_encode)),
+ tuples(just("expl"), integers(min_value=0).map(tag_ctxp)),
+ ),
min_size=len(names),
max_size=len(names),
))]
- schema = [(name, Integer(impl=tag)) for name, tag in zip(names, tags)]
+ schema = [
+ (name, Integer(**tag_kwargs))
+ for name, tag_kwargs in zip(names, tags)
+ ]
value = None
if value_required or draw(booleans()):
value = draw(tuples(
obj = self.base_klass()
self.assertFalse(obj.ready)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
self.assertIsNone(obj["whatever"])
with self.assertRaises(ObjNotReady) as err:
obj.encode()
obj["whatever"] = Boolean()
self.assertFalse(obj.ready)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
obj["whatever"] = Boolean(value)
self.assertTrue(obj.ready)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
@given(booleans(), booleans())
def test_comparison(self, value1, value2):
_decoded=_decoded,
)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
self.assertFalse(obj.expled)
obj_encoded = obj.encode()
obj_expled = obj(value, expl=tag_expl)
self.assertTrue(obj_expled.expled)
repr(obj_expled)
- pprint(obj_expled)
+ list(obj_expled.pps())
+ pprint(obj_expled, big_blobs=True, with_decode_path=True)
obj_expled_encoded = obj_expled.encode()
obj_decoded, tail = obj_expled.decode(
obj_expled_encoded + tail_junk,
offset=offset,
)
repr(obj_decoded)
- pprint(obj_decoded)
+ list(obj_decoded.pps())
+ pprint(obj_decoded, big_blobs=True, with_decode_path=True)
self.assertEqual(tail, tail_junk)
self.assertEqual(obj_decoded, obj_expled)
self.assertEqual(obj_decoded.choice, obj_expled.choice)
self.assertEqual(obj_decoded.expl_offset, offset)
self.assertSequenceEqual(
obj_expled_encoded[
- obj_decoded.value.offset - offset:
- obj_decoded.value.offset + obj_decoded.value.tlvlen - offset
+ obj_decoded.value.fulloffset - offset:
+ obj_decoded.value.fulloffset + obj_decoded.value.fulllen - offset
],
obj_encoded,
)
seq[name] = Boolean()
self.assertFalse(seq.ready)
repr(seq)
- pprint(seq)
+ list(seq.pps())
+ pprint(seq, big_blobs=True, with_decode_path=True)
for name, value in ready.items():
seq[name] = Boolean(value)
self.assertFalse(seq.ready)
repr(seq)
- pprint(seq)
+ list(seq.pps())
+ pprint(seq, big_blobs=True, with_decode_path=True)
with self.assertRaises(ObjNotReady) as err:
seq.encode()
repr(err.exception)
seq[name] = Boolean(value)
self.assertTrue(seq.ready)
repr(seq)
- pprint(seq)
+ list(seq.pps())
+ pprint(seq, big_blobs=True, with_decode_path=True)
@given(data_strategy())
def test_call(self, d):
self.assertFalse(seq.decoded)
self._assert_expects(seq, expects)
repr(seq)
- pprint(seq)
+ list(seq.pps())
+ pprint(seq, big_blobs=True, with_decode_path=True)
+ self.assertTrue(seq.ready)
seq_encoded = seq.encode()
seq_decoded, tail = seq.decode(seq_encoded + tail_junk)
- self.assertEqual(tail, tail_junk)
- self.assertTrue(seq.ready)
- self._assert_expects(seq_decoded, expects)
- self.assertEqual(seq, seq_decoded)
- self.assertEqual(seq_decoded.encode(), seq_encoded)
- for expect in expects:
- if not expect["presented"]:
- self.assertNotIn(expect["name"], seq_decoded)
- continue
- self.assertIn(expect["name"], seq_decoded)
- obj = seq_decoded[expect["name"]]
- self.assertTrue(obj.decoded)
- offset = obj.expl_offset if obj.expled else obj.offset
- tlvlen = obj.expl_tlvlen if obj.expled else obj.tlvlen
- self.assertSequenceEqual(
- seq_encoded[offset:offset + tlvlen],
- obj.encode(),
- )
+ self.assertFalse(seq_decoded.lenindef)
+ self.assertFalse(seq_decoded.ber_encoded)
+ self.assertFalse(seq_decoded.bered)
+
+ t, _, lv = tag_strip(seq_encoded)
+ _, _, v = len_decode(lv)
+ seq_encoded_lenindef = t + LENINDEF + v + EOC
+ seq_decoded_lenindef, tail_lenindef = seq.decode(
+ seq_encoded_lenindef + tail_junk,
+ ctx={"bered": True},
+ )
+ self.assertTrue(seq_decoded_lenindef.lenindef)
+ self.assertTrue(seq_decoded_lenindef.bered)
+ with self.assertRaises(DecodeError):
+ seq.decode(seq_encoded_lenindef[:-1], ctx={"bered": True})
+ with self.assertRaises(DecodeError):
+ seq.decode(seq_encoded_lenindef[:-2], ctx={"bered": True})
+ repr(seq_decoded_lenindef)
+ list(seq_decoded_lenindef.pps())
+ pprint(seq_decoded_lenindef, big_blobs=True, with_decode_path=True)
+ self.assertTrue(seq_decoded_lenindef.ready)
+
+ for decoded, decoded_tail, encoded in (
+ (seq_decoded, tail, seq_encoded),
+ (seq_decoded_lenindef, tail_lenindef, seq_encoded_lenindef),
+ ):
+ self.assertEqual(decoded_tail, tail_junk)
+ self._assert_expects(decoded, expects)
+ self.assertEqual(seq, decoded)
+ self.assertEqual(decoded.encode(), seq_encoded)
+ self.assertEqual(decoded.tlvlen, len(encoded))
+ for expect in expects:
+ if not expect["presented"]:
+ self.assertNotIn(expect["name"], decoded)
+ continue
+ self.assertIn(expect["name"], decoded)
+ obj = decoded[expect["name"]]
+ self.assertTrue(obj.decoded)
+ offset = obj.expl_offset if obj.expled else obj.offset
+ tlvlen = obj.expl_tlvlen if obj.expled else obj.tlvlen
+ self.assertSequenceEqual(
+ seq_encoded[offset:offset + tlvlen],
+ obj.encode(),
+ )
@settings(max_examples=LONG_TEST_MAX_EXAMPLES)
@given(data_strategy())
self.assertSequenceEqual(seq.encode(), empty_seq)
@given(data_strategy())
- def test_encoded_default_accepted(self, d):
+ def test_encoded_default_not_accepted(self, d):
_schema = list(d.draw(dictionaries(
text_letters(),
integers(),
for (n, v), t in zip(_schema, tags)
]
seq_with_default = SeqWithDefault()
- seq_decoded, _ = seq_with_default.decode(seq_encoded)
- for name, value in _schema:
- self.assertEqual(seq_decoded[name], seq_with_default[name])
- self.assertEqual(seq_decoded[name], value)
+ with assertRaisesRegex(self, DecodeError, "DEFAULT value met"):
+ seq_with_default.decode(seq_encoded)
+ for ctx in ({"bered": True}, {"allow_default_values": True}):
+ seq_decoded, _ = seq_with_default.decode(seq_encoded, ctx=ctx)
+ self.assertTrue(seq_decoded.ber_encoded)
+ self.assertTrue(seq_decoded.bered)
+ for name, value in _schema:
+ self.assertEqual(seq_decoded[name], seq_with_default[name])
+ self.assertEqual(seq_decoded[name], value)
@given(data_strategy())
def test_missing_from_spec(self, d):
with self.assertRaises(TagMismatch):
seq_missing.decode(seq_encoded)
+ @given(data_strategy())
+ def test_bered(self, d):
+ class Seq(self.base_klass):
+ schema = (("underlying", Boolean()),)
+ encoded = Boolean.tag_default + len_encode(1) + b"\x01"
+ encoded = Seq.tag_default + len_encode(len(encoded)) + encoded
+ decoded, _ = Seq().decode(encoded, ctx={"bered": True})
+ self.assertFalse(decoded.ber_encoded)
+ self.assertFalse(decoded.lenindef)
+ self.assertTrue(decoded.bered)
+
+ class Seq(self.base_klass):
+ schema = (("underlying", OctetString()),)
+ encoded = (
+ tag_encode(form=TagFormConstructed, num=4) +
+ LENINDEF +
+ OctetString(b"whatever").encode() +
+ EOC
+ )
+ encoded = Seq.tag_default + len_encode(len(encoded)) + encoded
+ with self.assertRaises(DecodeError):
+ Seq().decode(encoded)
+ decoded, _ = Seq().decode(encoded, ctx={"bered": True})
+ self.assertFalse(decoded.ber_encoded)
+ self.assertFalse(decoded.lenindef)
+ self.assertTrue(decoded.bered)
+
class TestSequence(SeqMixing, CommonMixin, TestCase):
base_klass = Sequence
b"".join(sorted([seq[name].encode() for name, _ in Seq.schema])),
)
+ @settings(max_examples=LONG_TEST_MAX_EXAMPLES)
+ @given(data_strategy())
+ def test_unsorted(self, d):
+ tags = [
+ tag_encode(tag) for tag in
+ d.draw(sets(integers(min_value=1), min_size=2, max_size=5))
+ ]
+ tags = d.draw(permutations(tags))
+ assume(tags != sorted(tags))
+ encoded = b"".join(OctetString(t, impl=t).encode() for t in tags)
+ seq_encoded = b"".join((
+ Set.tag_default,
+ len_encode(len(encoded)),
+ encoded,
+ ))
+
+ class Seq(Set):
+ schema = [(str(i), OctetString(impl=t)) for i, t in enumerate(tags)]
+ seq = Seq()
+ with assertRaisesRegex(self, DecodeError, "unordered SET"):
+ seq.decode(seq_encoded)
+ for ctx in ({"bered": True}, {"allow_unordered_set": True}):
+ seq_decoded, _ = Seq().decode(seq_encoded, ctx=ctx)
+ self.assertTrue(seq_decoded.ber_encoded)
+ self.assertTrue(seq_decoded.bered)
+ self.assertSequenceEqual(
+ [bytes(seq_decoded[str(i)]) for i, t in enumerate(tags)],
+ [t for t in tags],
+ )
+
@composite
def seqof_values_strategy(draw, schema=None, do_expl=False):
seqof.append(value)
self.assertFalse(seqof.ready)
repr(seqof)
- pprint(seqof)
+ list(seqof.pps())
+ pprint(seqof, big_blobs=True, with_decode_path=True)
with self.assertRaises(ObjNotReady) as err:
seqof.encode()
repr(err.exception)
seqof[i] = Integer(i)
self.assertTrue(seqof.ready)
repr(seqof)
- pprint(seqof)
+ list(seqof.pps())
+ pprint(seqof, big_blobs=True, with_decode_path=True)
def test_spec_mismatch(self):
class SeqOf(self.base_klass):
schema = Boolean()
bound_min = d.draw(integers(min_value=1, max_value=1 << 7))
bound_max = d.draw(integers(min_value=bound_min, max_value=1 << 7))
- value = [Boolean()] * d.draw(integers(max_value=bound_min - 1))
+ value = [Boolean(False)] * d.draw(integers(max_value=bound_min - 1))
with self.assertRaises(BoundsError) as err:
SeqOf(value=value, bounds=(bound_min, bound_max))
repr(err.exception)
- value = [Boolean()] * d.draw(integers(
+ with assertRaisesRegex(self, DecodeError, "bounds") as err:
+ SeqOf(bounds=(bound_min, bound_max)).decode(
+ SeqOf(value).encode()
+ )
+ repr(err.exception)
+ value = [Boolean(True)] * d.draw(integers(
min_value=bound_max + 1,
max_value=bound_max + 10,
))
with self.assertRaises(BoundsError) as err:
SeqOf(value=value, bounds=(bound_min, bound_max))
repr(err.exception)
+ with assertRaisesRegex(self, DecodeError, "bounds") as err:
+ SeqOf(bounds=(bound_min, bound_max)).decode(
+ SeqOf(value).encode()
+ )
+ repr(err.exception)
@given(integers(min_value=1, max_value=10))
def test_out_of_bounds(self, bound_max):
_decoded=_decoded,
)
repr(obj)
- pprint(obj)
+ list(obj.pps())
+ pprint(obj, big_blobs=True, with_decode_path=True)
self.assertFalse(obj.expled)
obj_encoded = obj.encode()
obj_expled = obj(value, expl=tag_expl)
self.assertTrue(obj_expled.expled)
repr(obj_expled)
- pprint(obj_expled)
+ list(obj_expled.pps())
+ pprint(obj_expled, big_blobs=True, with_decode_path=True)
obj_expled_encoded = obj_expled.encode()
obj_decoded, tail = obj_expled.decode(
obj_expled_encoded + tail_junk,
offset=offset,
)
repr(obj_decoded)
- pprint(obj_decoded)
+ list(obj_decoded.pps())
+ pprint(obj_decoded, big_blobs=True, with_decode_path=True)
self.assertEqual(tail, tail_junk)
self._test_symmetric_compare_objs(obj_decoded, obj_expled)
self.assertSequenceEqual(obj_decoded.encode(), obj_expled_encoded)
],
)
+ t, _, lv = tag_strip(obj_encoded)
+ _, _, v = len_decode(lv)
+ obj_encoded_lenindef = t + LENINDEF + v + EOC
+ obj_decoded_lenindef, tail_lenindef = obj.decode(
+ obj_encoded_lenindef + tail_junk,
+ ctx={"bered": True},
+ )
+ self.assertTrue(obj_decoded_lenindef.lenindef)
+ self.assertTrue(obj_decoded_lenindef.bered)
+ repr(obj_decoded_lenindef)
+ list(obj_decoded_lenindef.pps())
+ pprint(obj_decoded_lenindef, big_blobs=True, with_decode_path=True)
+ self.assertEqual(obj_decoded_lenindef.tlvlen, len(obj_encoded_lenindef))
+ with self.assertRaises(DecodeError):
+ obj.decode(obj_encoded_lenindef[:-1], ctx={"bered": True})
+ with self.assertRaises(DecodeError):
+ obj.decode(obj_encoded_lenindef[:-2], ctx={"bered": True})
+
+ @given(data_strategy())
+ def test_bered(self, d):
+ class SeqOf(self.base_klass):
+ schema = Boolean()
+ encoded = Boolean(False).encode()
+ encoded += Boolean.tag_default + len_encode(1) + b"\x01"
+ encoded = SeqOf.tag_default + len_encode(len(encoded)) + encoded
+ with self.assertRaises(DecodeError):
+ SeqOf().decode(encoded)
+ decoded, _ = SeqOf().decode(encoded, ctx={"bered": True})
+ self.assertFalse(decoded.ber_encoded)
+ self.assertFalse(decoded.lenindef)
+ self.assertTrue(decoded.bered)
+
+ class SeqOf(self.base_klass):
+ schema = OctetString()
+ encoded = OctetString(b"whatever").encode()
+ encoded += (
+ tag_encode(form=TagFormConstructed, num=4) +
+ LENINDEF +
+ OctetString(b"whatever").encode() +
+ EOC
+ )
+ encoded = SeqOf.tag_default + len_encode(len(encoded)) + encoded
+ with self.assertRaises(DecodeError):
+ SeqOf().decode(encoded)
+ decoded, _ = SeqOf().decode(encoded, ctx={"bered": True})
+ self.assertFalse(decoded.ber_encoded)
+ self.assertFalse(decoded.lenindef)
+ self.assertTrue(decoded.bered)
+
class TestSequenceOf(SeqOfMixing, CommonMixin, TestCase):
class SeqOf(SequenceOf):
b"".join(sorted([v.encode() for v in values])),
)
+ @settings(max_examples=LONG_TEST_MAX_EXAMPLES)
+ @given(data_strategy())
+ def test_unsorted(self, d):
+ values = [OctetString(v).encode() for v in d.draw(sets(
+ binary(min_size=1, max_size=5),
+ min_size=2,
+ max_size=5,
+ ))]
+ values = d.draw(permutations(values))
+ assume(values != sorted(values))
+ encoded = b"".join(values)
+ seq_encoded = b"".join((
+ SetOf.tag_default,
+ len_encode(len(encoded)),
+ encoded,
+ ))
+
+ class Seq(SetOf):
+ schema = OctetString()
+ seq = Seq()
+ with assertRaisesRegex(self, DecodeError, "unordered SET OF"):
+ seq.decode(seq_encoded)
+
+ for ctx in ({"bered": True}, {"allow_unordered_set": True}):
+ seq_decoded, _ = Seq().decode(seq_encoded, ctx=ctx)
+ self.assertTrue(seq_decoded.ber_encoded)
+ self.assertTrue(seq_decoded.bered)
+ self.assertSequenceEqual(
+ [obj.encode() for obj in seq_decoded],
+ values,
+ )
+
class TestGoMarshalVectors(TestCase):
def runTest(self):
seq = Seq()
seq["erste"] = PrintableString("test")
self.assertSequenceEqual(seq.encode(), hexdec("3006130474657374"))
+ # Asterisk is actually not allowable
+ PrintableString.allowable_chars |= set(b"*")
seq["erste"] = PrintableString("test*")
self.assertSequenceEqual(seq.encode(), hexdec("30071305746573742a"))
+ PrintableString.allowable_chars -= set(b"*")
class Seq(Sequence):
schema = (
self.assertIsNotNone(seq[value_name_chosen].defined)
self.assertEqual(seq[value_name_chosen].defined[0], oid_chosen)
self.assertIsInstance(seq[value_name_chosen].defined[1], Integer)
+ repr(seq)
+ list(seq.pps())
+ pprint(seq, big_blobs=True, with_decode_path=True)
class TestDefinesByPath(TestCase):
seq_sequenced["type"] = type_sequenced
seq_sequenced["value"] = OctetString(seq_inner.encode())
seq_sequenced_raw = seq_sequenced.encode()
+ repr(seq_sequenced)
+ list(seq_sequenced.pps())
+ pprint(seq_sequenced, big_blobs=True, with_decode_path=True)
defines_by_path = []
seq_integered, _ = Seq().decode(seq_integered_raw)
self.assertTrue(seq_integered_raw[
seq_integered["value"].defined[1].offset:
].startswith(Integer(123).encode()))
+ repr(seq_integered)
+ list(seq_integered.pps())
+ pprint(seq_integered, big_blobs=True, with_decode_path=True)
seq_sequenced, _ = Seq().decode(
seq_sequenced_raw,
self.assertEqual(seq_sequenced["value"].defined[0], type_sequenced)
seq_inner = seq_sequenced["value"].defined[1]
self.assertIsNone(seq_inner["valueInner"].defined)
+ repr(seq_sequenced)
+ list(seq_sequenced.pps())
+ pprint(seq_sequenced, big_blobs=True, with_decode_path=True)
defines_by_path.append((
("value", DecodePathDefBy(type_sequenced), "typeInner"),
pairs = seq_inner["valueInner"].defined[1]
for pair in pairs:
self.assertIsNone(pair["value"][0].defined)
+ repr(seq_sequenced)
+ list(seq_sequenced.pps())
+ pprint(seq_sequenced, big_blobs=True, with_decode_path=True)
defines_by_path.append((
(
for pair_input, pair_got in zip(pairs_input, pairs_got):
self.assertEqual(pair_got["value"][0].defined[0], pair_input[0])
self.assertEqual(pair_got["value"][0].defined[1], pair_input[1])
+ repr(seq_sequenced)
+ list(seq_sequenced.pps())
+ pprint(seq_sequenced, big_blobs=True, with_decode_path=True)
@given(oid_strategy(), integers())
def test_simple(self, oid, tgt):
("int%d" % i, Integer(expl=tag_ctxc(i + 1)))
for i in range(count)
]
-
- class Seq(Sequence):
- schema = _schema
- seq = Seq()
- for i in range(count):
- seq["int%d" % i] = Integer(123)
- raw = seq.encode()
- chosen = "int%d" % chosen
- seq.specs[chosen] = seq.specs[chosen](default=123)
- seq.decode(raw)
- with assertRaisesRegex(self, DecodeError, "DEFAULT value met"):
- seq.decode(raw, ctx={"strict_default_existence": True})
+ for klass in (Sequence, Set):
+ class Seq(klass):
+ schema = _schema
+ seq = Seq()
+ for i in range(count):
+ seq["int%d" % i] = Integer(123)
+ raw = seq.encode()
+ chosen_choice = "int%d" % chosen
+ seq.specs[chosen_choice] = seq.specs[chosen_choice](default=123)
+ with assertRaisesRegex(self, DecodeError, "DEFAULT value met"):
+ seq.decode(raw)
+ decoded, _ = seq.decode(raw, ctx={"allow_default_values": True})
+ self.assertTrue(decoded.ber_encoded)
+ self.assertTrue(decoded.bered)
+ decoded, _ = seq.decode(raw, ctx={"bered": True})
+ self.assertTrue(decoded.ber_encoded)
+ self.assertTrue(decoded.bered)
class TestX690PrefixedType(TestCase):
VisibleString("Jones", impl=tag_ctxp(2)).encode(),
hexdec("82054A6F6E6573"),
)
+
+
+class TestExplOOB(TestCase):
+ def runTest(self):
+ expl = tag_ctxc(123)
+ raw = Integer(123).encode() + Integer(234).encode()
+ raw = b"".join((expl, len_encode(len(raw)), raw))
+ with assertRaisesRegex(self, DecodeError, "explicit tag out-of-bound"):
+ Integer(expl=expl).decode(raw)
+ Integer(expl=expl).decode(raw, ctx={"allow_expl_oob": True})