From f078d5d2ff1d95ebaac507ec67331547a0cac2a9 Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Sun, 9 Feb 2020 19:14:01 +0300 Subject: [PATCH] Allow raw BER *Time access --- pyderasn.py | 21 ++++++++++++--------- tests/test_pyderasn.py | 23 +++++++++++++---------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/pyderasn.py b/pyderasn.py index 6b3a09f..ea26eb0 100755 --- a/pyderasn.py +++ b/pyderasn.py @@ -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() diff --git a/tests/test_pyderasn.py b/tests/test_pyderasn.py index d396c64..b7ee9a9 100644 --- a/tests/test_pyderasn.py +++ b/tests/test_pyderasn.py @@ -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) -- 2.44.0