]> Cypherpunks.ru repositories - pyderasn.git/commitdiff
Fix CHOICE's tlvlen with explicitly tagged value 3.10
authorSergey Matveev <stargrave@stargrave.org>
Thu, 12 Jul 2018 20:40:04 +0000 (23:40 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Thu, 12 Jul 2018 20:40:04 +0000 (23:40 +0300)
doc/news.rst
pyderasn.py
tests/test_pyderasn.py

index d414284864787e157684ca0c2367fd8285e2025f..e8cbacd51b917e9eeb441753ed9294701ce82982 100644 (file)
@@ -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:
index b15af8d0bbb502b80c2ff1e1d5deaf521279623a..5e2dd2b5163542a940755d1ac16625ced66ab1d4 100755 (executable)
@@ -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
index c730633c5a8433bd1badd2a05f7ca20d5baeed43..864c66bbbc847b6ed2ae573bedb4ce67e9d4ee66 100644 (file)
@@ -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,
         )