]> Cypherpunks.ru repositories - pyderasn.git/commitdiff
Allow raw BER *Time access
authorSergey Matveev <stargrave@stargrave.org>
Sun, 9 Feb 2020 16:14:01 +0000 (19:14 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Sun, 9 Feb 2020 16:34:40 +0000 (19:34 +0300)
pyderasn.py
tests/test_pyderasn.py

index 6b3a09f0e245c700377e56c4d5dc3a6502cb7c44..ea26eb036a4209c78b8b87921816579f2d182a54 100755 (executable)
@@ -4188,6 +4188,9 @@ class UTCTime(VisibleString):
     >>> UTCTime(datetime(2057, 9, 30, 22, 7, 50)).todatetime()
     datetime.datetime(1957, 9, 30, 22, 7, 50)
 
+    If BER encoded value was met, then ``ber_raw`` attribute will hold
+    its raw representation.
+
     .. warning::
 
        Pay attention that UTCTime can not hold full year, so all years
@@ -4201,7 +4204,7 @@ class UTCTime(VisibleString):
        * minutes are not exceeding 60
        * offset value is not exceeding 14 hours
     """
-    __slots__ = ("_ber_raw",)
+    __slots__ = ("ber_raw",)
     tag_default = tag_encode(23)
     encoding = "ascii"
     asn1_type_name = "UTCTime"
@@ -4229,10 +4232,10 @@ class UTCTime(VisibleString):
             None, None, impl, expl, None, optional, _decoded, ctx,
         )
         self._value = value
-        self._ber_raw = None
+        self.ber_raw = None
         if value is not None:
-            self._value, self._ber_raw = self._value_sanitize(value, ctx)
-            self.ber_encoded = self._ber_raw is not None
+            self._value, self.ber_raw = self._value_sanitize(value, ctx)
+            self.ber_encoded = self.ber_raw is not None
         if default is not None:
             default, _ = self._value_sanitize(default)
             self.default = self.__class__(
@@ -4312,7 +4315,7 @@ class UTCTime(VisibleString):
                     try:
                         offset, _value = self._strptime_bered(value_decoded)
                         _value = _value - timedelta(seconds=offset)
-                        return self._dt_sanitize(_value), value_decoded
+                        return self._dt_sanitize(_value), value
                     except (TypeError, ValueError, OverflowError) as _err:
                         err = _err
             raise DecodeError(
@@ -4329,26 +4332,26 @@ class UTCTime(VisibleString):
         if self.ready:
             value = self._value.isoformat()
             if self.ber_encoded:
-                value += " (%s)" % self._ber_raw
+                value += " (%s)" % self.ber_raw
             return value
 
     def __unicode__(self):
         if self.ready:
             value = self._value.isoformat()
             if self.ber_encoded:
-                value += " (%s)" % self._ber_raw
+                value += " (%s)" % self.ber_raw
             return value
         return text_type(self._pp_value())
 
     def __getstate__(self):
         return UTCTimeState(
             *super(UTCTime, self).__getstate__(),
-            **{"ber_raw": self._ber_raw}
+            **{"ber_raw": self.ber_raw}
         )
 
     def __setstate__(self, state):
         super(UTCTime, self).__setstate__(state)
-        self._ber_raw = state.ber_raw
+        self.ber_raw = state.ber_raw
 
     def __bytes__(self):
         self._assert_ready()
index d396c64ba300f610b4f1bafa31d6e1188ea9a6a0..b7ee9a9da9571a1f29b2a8feac0ae9ac9166a11a 100644 (file)
@@ -4085,14 +4085,14 @@ class TestGeneralizedTime(TimeMixin, CommonMixin, TestCase):
                 dt -= timedelta(seconds=sign * 60 * offset_minute)
                 data += "%s%02d" % (minutes_separator, offset_minute)
         data = data.encode("ascii")
-        data = GeneralizedTime.tag_default + len_encode(len(data)) + data
+        data_der = GeneralizedTime.tag_default + len_encode(len(data)) + data
         try:
-            GeneralizedTime().decod(data)
+            GeneralizedTime().decod(data_der)
         except DecodeError:
             dered = False
         else:
             dered = True
-        obj = GeneralizedTime().decod(data, ctx={"bered": True})
+        obj = GeneralizedTime().decod(data_der, ctx={"bered": True})
         if dt.year > 1970:
             self.assertEqual(
                 mktime(obj.todatetime().timetuple()),
@@ -4102,7 +4102,8 @@ class TestGeneralizedTime(TimeMixin, CommonMixin, TestCase):
             self.assertEqual(obj.todatetime().timestamp(), dt.timestamp())
         self.assertEqual(obj.ber_encoded, not dered)
         self.assertEqual(obj.bered, not dered)
-        self.assertEqual(obj.encode() == data, dered)
+        self.assertEqual(obj.ber_raw, None if dered else data)
+        self.assertEqual(obj.encode() == data_der, dered)
         repr(obj)
         bytes(obj)
         str(obj)
@@ -4428,13 +4429,14 @@ class TestUTCTime(TimeMixin, CommonMixin, TestCase):
                 (b"0101021200Z", datetime(2001, 1, 2, 12)),
                 (b"0101020700-0500", datetime(2001, 1, 2, 12)),
         )):
-            data = UTCTime.tag_default + len_encode(len(data)) + data
-            obj = UTCTime().decod(data, ctx={"bered": True})
+            data_der = UTCTime.tag_default + len_encode(len(data)) + data
+            obj = UTCTime().decod(data_der, ctx={"bered": True})
             self.assertEqual(obj, dt)
             self.assertEqual(obj.todatetime(), dt)
             self.assertTrue(obj.ber_encoded)
             self.assertTrue(obj.bered)
-            self.assertNotEqual(obj.encode(), data)
+            self.assertEqual(obj.ber_raw, data)
+            self.assertNotEqual(obj.encode(), data_der)
             repr(obj)
 
     def test_go_vectors_valid_ber(self):
@@ -4488,13 +4490,14 @@ class TestUTCTime(TimeMixin, CommonMixin, TestCase):
                 data += "+"
             data += "%02d%02d" % (offset_hour, offset_minute)
         data = data.encode("ascii")
-        data = UTCTime.tag_default + len_encode(len(data)) + data
-        obj = UTCTime().decod(data, ctx={"bered": True})
+        data_der = UTCTime.tag_default + len_encode(len(data)) + data
+        obj = UTCTime().decod(data_der, ctx={"bered": True})
         self.assertEqual(obj, dt)
         self.assertEqual(obj.todatetime(), dt)
         self.assertEqual(obj.ber_encoded, not dered)
         self.assertEqual(obj.bered, not dered)
-        self.assertEqual(obj.encode() == data, dered)
+        self.assertEqual(obj.ber_raw, None if dered else data)
+        self.assertEqual(obj.encode() == data_der, dered)
         repr(obj)
         bytes(obj)
         str(obj)