VERSION | 2 +- doc/news.rst | 6 ++++++ pyderasn.py | 6 +++--- tests/test_pyderasn.py | 72 +++++++++++++++++++++++++++++++++++++++++++++-------- diff --git a/VERSION b/VERSION index 16b82d309b48a976371f94d825480574f44d825f4546bf7cdfad0243ec3cac31..83093a4c757d72ef2fadcb0427c0d2fab8467aaeb388493489b5db25d0dd1d6d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.11 +3.12 diff --git a/doc/news.rst b/doc/news.rst index 9249f1ae8ba432fc118d442025023379104bd1e81fed48eb754983acfd686c44..914c31d3827a65a41a4037f18f081a207ebfbac2073c690bcb4b4e62e9639986 100644 --- a/doc/news.rst +++ b/doc/news.rst @@ -1,6 +1,12 @@ News ==== +.. _release3.12: + +3.12 +---- +* Fix possible uncaught TypeError in Py2 with zero bytes inside the value. + .. _release3.11: 3.11 diff --git a/pyderasn.py b/pyderasn.py index 6a158a324bf3581b96bd89972355bd53a4946de68104c5f385bc034d19a00cd8..1764fcbacd846bb3e0a5ced57066e05ebc31d817a5a68bb54fe4786f9c2e3828 100755 --- a/pyderasn.py +++ b/pyderasn.py @@ -3529,7 +3529,7 @@ raise DecodeError("invalid UTCTime encoding") if len(value_decoded) == LEN_YYMMDDHHMMSSZ: try: datetime.strptime(value_decoded, self.fmt) - except ValueError: + except (TypeError, ValueError): raise DecodeError("invalid UTCTime format") return value else: @@ -3630,7 +3630,7 @@ raise DecodeError("invalid GeneralizedTime encoding") if len(value_decoded) == LEN_YYYYMMDDHHMMSSZ: try: datetime.strptime(value_decoded, self.fmt) - except ValueError: + except (TypeError, ValueError): raise DecodeError( "invalid GeneralizedTime (without ms) format", ) @@ -3638,7 +3638,7 @@ return value elif len(value_decoded) >= LEN_YYYYMMDDHHMMSSDMZ: try: datetime.strptime(value_decoded, self.fmt_ms) - except ValueError: + except (TypeError, ValueError): raise DecodeError( "invalid GeneralizedTime (with ms) format", ) diff --git a/tests/test_pyderasn.py b/tests/test_pyderasn.py index 1adae843fd2167b422868d484d53a37610c5401eac9344b8876c4f0672f06964..0f48dc92d628ca923b04ab515bb05b817d654049cd8a1aa3663644b9233d60c7 100644 --- a/tests/test_pyderasn.py +++ b/tests/test_pyderasn.py @@ -77,6 +77,9 @@ from pyderasn import InvalidOID from pyderasn import InvalidValueType from pyderasn import len_decode from pyderasn import len_encode +from pyderasn import LEN_YYMMDDHHMMSSZ +from pyderasn import LEN_YYYYMMDDHHMMSSDMZ +from pyderasn import LEN_YYYYMMDDHHMMSSZ from pyderasn import LENINDEF from pyderasn import NotEnoughData from pyderasn import Null @@ -3609,12 +3612,47 @@ 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"))) + @given( + binary( + min_size=(LEN_YYYYMMDDHHMMSSZ - 1) // 2, + max_size=(LEN_YYYYMMDDHHMMSSZ - 1) // 2, + ), + binary(min_size=1, max_size=1), + binary( + min_size=(LEN_YYYYMMDDHHMMSSZ - 1) // 2, + max_size=(LEN_YYYYMMDDHHMMSSZ - 1) // 2, + ), + ) + def test_junk(self, part0, part1, part2): + junk = part0 + part1 + part2 + assume(not (set(junk) <= set(digits.encode("ascii")))) + with self.assertRaises(DecodeError): + GeneralizedTime().decode( + GeneralizedTime.tag_default + + len_encode(len(junk)) + + junk + ) + + @given( + binary( + min_size=(LEN_YYYYMMDDHHMMSSDMZ - 1) // 2, + max_size=(LEN_YYYYMMDDHHMMSSDMZ - 1) // 2, + ), + binary(min_size=1, max_size=1), + binary( + min_size=(LEN_YYYYMMDDHHMMSSDMZ - 1) // 2, + max_size=(LEN_YYYYMMDDHHMMSSDMZ - 1) // 2, + ), + ) + def test_junk_dm(self, part0, part1, part2): + junk = part0 + part1 + part2 + assume(not (set(junk) <= set(digits.encode("ascii")))) with self.assertRaises(DecodeError): - GeneralizedTime().decode(raw.replace(b"20100", b"hello")) + GeneralizedTime().decode( + GeneralizedTime.tag_default + + len_encode(len(junk)) + + junk + ) class TestUTCTime(TimeMixin, CommonMixin, TestCase): @@ -3680,12 +3718,26 @@ 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"))) + @given( + binary( + min_size=(LEN_YYMMDDHHMMSSZ - 1) // 2, + max_size=(LEN_YYMMDDHHMMSSZ - 1) // 2, + ), + binary(min_size=1, max_size=1), + binary( + min_size=(LEN_YYMMDDHHMMSSZ - 1) // 2, + max_size=(LEN_YYMMDDHHMMSSZ - 1) // 2, + ), + ) + def test_junk(self, part0, part1, part2): + junk = part0 + part1 + part2 + assume(not (set(junk) <= set(digits.encode("ascii")))) with self.assertRaises(DecodeError): - UTCTime().decode(raw.replace(b"91050", b"hello")) + UTCTime().decode( + UTCTime.tag_default + + len_encode(len(junk)) + + junk + ) @composite