VERSION | 2 +- doc/news.rst | 7 +++++++ pyderasn.py | 10 ++++++++-- tests/test_pyderasn.py | 14 ++++++++++++++ diff --git a/VERSION b/VERSION index 6a1b5285d8889b376acd99a56a8fb62459e80c19242602e88db438447dd26893..16b82d309b48a976371f94d825480574f44d825f4546bf7cdfad0243ec3cac31 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.10 +3.11 diff --git a/doc/news.rst b/doc/news.rst index 825f515234f0277745af3dbcc0e588a79923d1037515e9d3f413eb8ff91389c2..9249f1ae8ba432fc118d442025023379104bd1e81fed48eb754983acfd686c44 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 c98c35301d69f8d7db5b3b8fb9bca80b290dae7fd1222c270f1357133a76950a..3ba7264acecca33a7f96f1607d171952e8f542caacda2da5b2134bbea49dd2f4 100755 --- a/pyderasn.py +++ b/pyderasn.py @@ -3522,7 +3522,10 @@ return value._value 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 @@ return value.strftime( 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 1e732f4ce948462b1d27b89df9437c4374bb13ece827f0d240a2b14b57ccc477..1adae843fd2167b422868d484d53a37610c5401eac9344b8876c4f0672f06964 100644 --- a/tests/test_pyderasn.py +++ b/tests/test_pyderasn.py @@ -3609,6 +3609,13 @@ GeneralizedTime(b"20100102030405Z").todatetime(), 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 @@ -3672,6 +3679,13 @@ self.assertEqual( UTCTime(("%02d1231235959Z" % year).encode("ascii")).todatetime().year, 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