doc/news.rst | 3 +++ pyderasn.py | 2 +- tests/test_pyderasn.py | 16 +++++++++++----- diff --git a/doc/news.rst b/doc/news.rst index ecd06c605683581a1718159c61aafd4dfa0c9feabb61cc990c5c763f40a51873..873bfff42a32af65a0b5c4611cd73da558a4ef238c9f25257c43435889a4ea31 100644 --- a/doc/news.rst +++ b/doc/news.rst @@ -5,6 +5,9 @@ .. _release3.10: 3.10 ---- +* Fix long-standing bug with explicitly tagged objects inside the + Choice. If Choice had explicitly tagged value, then its ``.tlvlen`` + reports the size without taking value's explicit tag in advance. * Add ``.fulllen`` and ``.fulloffset`` properties for all objects .. _release3.9: diff --git a/pyderasn.py b/pyderasn.py index 08e66a7071f9788f049c00c22cd57284afc0bedf7a397be838da7e6d2dfd943d..c98c35301d69f8d7db5b3b8fb9bca80b290dae7fd1222c270f1357133a76950a 100755 --- a/pyderasn.py +++ b/pyderasn.py @@ -3896,7 +3896,7 @@ schema=self.specs, expl=self._expl, default=self.default, optional=self.optional, - _decoded=(offset, 0, value.tlvlen), + _decoded=(offset, 0, value.fulllen), ) obj._value = (choice, value) return obj, tail diff --git a/tests/test_pyderasn.py b/tests/test_pyderasn.py index 6ae434c4b491cc8587bbeb563c5548d7e697094fae876090c43ceea8d157543c..1e732f4ce948462b1d27b89df9437c4374bb13ece827f0d240a2b14b57ccc477 100644 --- a/tests/test_pyderasn.py +++ b/tests/test_pyderasn.py @@ -3928,12 +3928,18 @@ @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( @@ -4175,8 +4181,8 @@ ) 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, )