From: Sergey Matveev Date: Thu, 12 Jul 2018 20:40:04 +0000 (+0300) Subject: Fix CHOICE's tlvlen with explicitly tagged value X-Git-Tag: 3.10^0 X-Git-Url: http://www.git.cypherpunks.ru/?p=pyderasn.git;a=commitdiff_plain;h=fda5cb9cfd5c69b1ae3373a22d27d1b5afffa353 Fix CHOICE's tlvlen with explicitly tagged value --- diff --git a/doc/news.rst b/doc/news.rst index d414284..e8cbacd 100644 --- a/doc/news.rst +++ b/doc/news.rst @@ -5,6 +5,9 @@ News 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 b15af8d..5e2dd2b 100755 --- a/pyderasn.py +++ b/pyderasn.py @@ -3896,7 +3896,7 @@ class Choice(Obj): 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 c730633..864c66b 100644 --- a/tests/test_pyderasn.py +++ b/tests/test_pyderasn.py @@ -3928,12 +3928,18 @@ class TestAny(CommonMixin, TestCase): 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 @@ class TestChoice(CommonMixin, TestCase): 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, )