From: Sergey Matveev Date: Sat, 21 Jul 2018 15:06:45 +0000 (+0300) Subject: Fix *Time encoding error capture X-Git-Tag: 3.11^0 X-Git-Url: http://www.git.cypherpunks.ru/?p=pyderasn.git;a=commitdiff_plain;h=bea58bc6be2d9a95df53a4201abe858617e961c3 Fix *Time encoding error capture --- diff --git a/VERSION b/VERSION index c8cfe39..2c07333 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.10 +3.11 diff --git a/doc/news.rst b/doc/news.rst index 8a14b3d..24977ab 100644 --- a/doc/news.rst +++ b/doc/news.rst @@ -1,6 +1,13 @@ News ==== +.. _release3.11: + +3.11 +---- +* Fix uncaught UTCTime/GeneralizedTime decode error when dealing with + non ASCII-encoded values + .. _release3.10: 3.10 diff --git a/pyderasn.py b/pyderasn.py index 5e2dd2b..98fb8af 100755 --- a/pyderasn.py +++ b/pyderasn.py @@ -3522,7 +3522,10 @@ class UTCTime(CommonString): if isinstance(value, datetime): return value.strftime(self.fmt).encode("ascii") if isinstance(value, binary_type): - value_decoded = value.decode("ascii") + try: + value_decoded = value.decode("ascii") + except (UnicodeEncodeError, UnicodeDecodeError) as err: + raise DecodeError("invalid UTCTime encoding") if len(value_decoded) == LEN_YYMMDDHHMMSSZ: try: datetime.strptime(value_decoded, self.fmt) @@ -3620,7 +3623,10 @@ class GeneralizedTime(UTCTime): self.fmt_ms if value.microsecond > 0 else self.fmt ).encode("ascii") if isinstance(value, binary_type): - value_decoded = value.decode("ascii") + try: + value_decoded = value.decode("ascii") + except (UnicodeEncodeError, UnicodeDecodeError) as err: + raise DecodeError("invalid GeneralizedTime encoding") if len(value_decoded) == LEN_YYYYMMDDHHMMSSZ: try: datetime.strptime(value_decoded, self.fmt) diff --git a/tests/test_pyderasn.py b/tests/test_pyderasn.py index 864c66b..03e1081 100644 --- a/tests/test_pyderasn.py +++ b/tests/test_pyderasn.py @@ -3609,6 +3609,13 @@ class TestGeneralizedTime(TimeMixin, CommonMixin, TestCase): datetime(2010, 1, 2, 3, 4, 5, 0), ) + def test_encoding(self): + raw = GeneralizedTime(b"20100102030405Z").encode() + with assertRaisesRegex(self, DecodeError, "encoding"): + GeneralizedTime().decode(raw.replace(b"201001", "привет".encode("utf-8"))) + with self.assertRaises(DecodeError): + GeneralizedTime().decode(raw.replace(b"20100", b"hello")) + class TestUTCTime(TimeMixin, CommonMixin, TestCase): base_klass = UTCTime @@ -3673,6 +3680,13 @@ class TestUTCTime(TimeMixin, CommonMixin, TestCase): 1900 + year, ) + def test_encoding(self): + raw = UTCTime(b"910506234540Z").encode() + with assertRaisesRegex(self, DecodeError, "encoding"): + UTCTime().decode(raw.replace(b"910506", "привет".encode("utf-8"))) + with self.assertRaises(DecodeError): + UTCTime().decode(raw.replace(b"91050", b"hello")) + @composite def any_values_strategy(draw, do_expl=False):