]> Cypherpunks.ru repositories - pyderasn.git/commitdiff
BER Boolean support
authorSergey Matveev <stargrave@stargrave.org>
Sat, 19 May 2018 14:46:11 +0000 (17:46 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Sat, 19 May 2018 14:46:11 +0000 (17:46 +0300)
pyderasn.py
tests/test_pyderasn.py

index 68d67d07e91a746886d22bb629d19a8ae6000f43..a560eda9b8c0d5fc2ac1346230dc12622de28206 100755 (executable)
@@ -843,6 +843,7 @@ class Obj(object):
         "offset",
         "llen",
         "vlen",
+        "bered",
     )
 
     def __init__(
@@ -864,6 +865,7 @@ class Obj(object):
         self.optional = optional
         self.offset, self.llen, self.vlen = _decoded
         self.default = None
+        self.bered = False
 
     @property
     def ready(self):  # pragma: no cover
@@ -1398,10 +1400,14 @@ class Boolean(Obj):
                 offset=offset,
             )
         first_octet = byte2int(v)
+        bered = False
         if first_octet == 0:
             value = False
         elif first_octet == 0xFF:
             value = True
+        elif ctx.get("bered", False):
+            value = True
+            bered = True
         else:
             raise DecodeError(
                 "unacceptable Boolean value",
@@ -1417,6 +1423,7 @@ class Boolean(Obj):
             optional=self.optional,
             _decoded=(offset, 1, 1),
         )
+        obj.bered = bered
         return obj, v[1:]
 
     def __repr__(self):
index 8fe0502eb0d7028ca591abd5fb5d6ec181823bde..a44906838ea9af54a14729fc75409a8ae1e92854 100644 (file)
@@ -587,13 +587,23 @@ class TestBoolean(CommonMixin, TestCase):
             )))
 
     @given(integers(min_value=0 + 1, max_value=255 - 1))
-    def test_invalid_value(self, value):
+    def test_ber_value(self, value):
         with assertRaisesRegex(self, DecodeError, "unacceptable Boolean value"):
             Boolean().decode(b"".join((
                 Boolean.tag_default,
                 len_encode(1),
                 int2byte(value),
             )))
+        obj, _ = Boolean().decode(
+            b"".join((
+                Boolean.tag_default,
+                len_encode(1),
+                int2byte(value),
+            )),
+            ctx={"bered": True},
+        )
+        self.assertTrue(bool(obj))
+        self.assertTrue(obj.bered)
 
 
 @composite