]> Cypherpunks.ru repositories - pyderasn.git/commitdiff
ber_encoded at ObjectIdentifier
authorSergey Matveev <stargrave@stargrave.org>
Sun, 30 Dec 2018 16:34:00 +0000 (19:34 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Sun, 30 Dec 2018 17:23:01 +0000 (20:23 +0300)
VERSION
doc/news.rst
pyderasn.py
tests/test_pyderasn.py

diff --git a/VERSION b/VERSION
index b3d791d7525d40f365fab7fb6d7b34448af4aeb8..4f8c639658e5402d16ccf26e328856c263c891f8 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-4.6
+4.7
index a187825eb3bc0be3610c599a78a0874024279672..a6695f387f85175420b937793032e99c4508f668 100644 (file)
@@ -1,6 +1,13 @@
 News
 ====
 
+.. _release4.7:
+
+4.7
+---
+* ObjectIdentifier has ``ber_encoded`` set to True, if non-normalized
+  arc encoding is met
+
 .. _release4.6:
 
 4.6
index 4e9def7bff226e6a53c6b4b4abba12ad3787480b..516036862de84a150bd57bd8f29941da40985393 100755 (executable)
@@ -384,7 +384,8 @@ constructed primitive types should be parsed successfully.
 
 * If object is encoded in BER form (not the DER one), then ``ber_encoded``
   attribute is set to True. Only ``BOOLEAN``, ``BIT STRING``, ``OCTET
-  STRING``, ``SEQUENCE``, ``SET``, ``SET OF`` can contain it.
+  STRING``, ``OBJECT IDENTIFIER``, ``SEQUENCE``, ``SET``, ``SET OF``
+  can contain it.
 * If object has an indefinite length encoding, then its ``lenindef``
   attribute is set to True. Only ``BIT STRING``, ``OCTET STRING``,
   ``SEQUENCE``, ``SET``, ``SEQUENCE OF``, ``SET OF``, ``ANY`` can
@@ -3223,13 +3224,17 @@ class ObjectIdentifier(Obj):
             )
         v, tail = v[:l], v[l:]
         arcs = []
+        ber_encoded = False
         while len(v) > 0:
             i = 0
             arc = 0
             while True:
                 octet = indexbytes(v, i)
-                if i == 0 and octet == 0x80 and not ctx.get("bered", False):
-                    raise DecodeError("non normalized arc encoding")
+                if i == 0 and octet == 0x80:
+                    if ctx.get("bered", False):
+                        ber_encoded = True
+                    else:
+                        raise DecodeError("non normalized arc encoding")
                 arc = (arc << 7) | (octet & 0x7F)
                 if octet & 0x80 == 0:
                     arcs.append(arc)
@@ -3261,6 +3266,8 @@ class ObjectIdentifier(Obj):
             optional=self.optional,
             _decoded=(offset, llen, l),
         )
+        if ber_encoded:
+            obj.ber_encoded = True
         return obj, tail
 
     def __repr__(self):
@@ -3286,6 +3293,7 @@ class ObjectIdentifier(Obj):
             expl_llen=self.expl_llen if self.expled else None,
             expl_vlen=self.expl_vlen if self.expled else None,
             expl_lenindef=self.expl_lenindef,
+            ber_encoded=self.ber_encoded,
             bered=self.bered,
         )
         for pp in self.pps_lenindef(decode_path):
index 174abb6d7beaaca1871cc4fadb84c208d0e8cc37..68c8861597b541665432af21a22e3d543e21a38a 100644 (file)
@@ -2410,6 +2410,7 @@ class TestObjectIdentifier(CommonMixin, TestCase):
         repr(err.exception)
         obj = ObjectIdentifier(value)
         self.assertTrue(obj.ready)
+        self.assertFalse(obj.ber_encoded)
         repr(obj)
         list(obj.pps())
         pprint(obj, big_blobs=True, with_decode_path=True)
@@ -2728,7 +2729,8 @@ class TestObjectIdentifier(CommonMixin, TestCase):
             b'\x80' +
             ObjectIdentifier((1, 0)).encode()[-1:]
         )
-        ObjectIdentifier().decode(tampered, ctx={"bered": True})
+        obj, _ = ObjectIdentifier().decode(tampered, ctx={"bered": True})
+        self.assertTrue(obj.ber_encoded)
         with assertRaisesRegex(self, DecodeError, "non normalized arc encoding"):
             ObjectIdentifier().decode(tampered)
 
@@ -2756,7 +2758,8 @@ class TestObjectIdentifier(CommonMixin, TestCase):
             len_encode(len(tampered)) +
             tampered
         )
-        ObjectIdentifier().decode(tampered, ctx={"bered": True})
+        obj, _ = ObjectIdentifier().decode(tampered, ctx={"bered": True})
+        self.assertTrue(obj.ber_encoded)
         with assertRaisesRegex(self, DecodeError, "non normalized arc encoding"):
             ObjectIdentifier().decode(tampered)