]> Cypherpunks.ru repositories - pyderasn.git/commitdiff
Fix *Time encoding error capture 3.11
authorSergey Matveev <stargrave@stargrave.org>
Sat, 21 Jul 2018 15:06:45 +0000 (18:06 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Sat, 21 Jul 2018 15:06:45 +0000 (18:06 +0300)
VERSION
doc/news.rst
pyderasn.py
tests/test_pyderasn.py

diff --git a/VERSION b/VERSION
index c8cfe3959183f8e9a50f83f54cd723f2dc9c252d..2c0733315e415bfb5e5b353f9996ecd964d395b2 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-3.10
+3.11
index 8a14b3dd514a26445acbbe1ffe6a633e02a12e2c..24977ab78c9961b0010665c274c8b13069fb3432 100644 (file)
@@ -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
index 5e2dd2b5163542a940755d1ac16625ced66ab1d4..98fb8afe5501c3f6564d84f1fe16029967aac284 100755 (executable)
@@ -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)
index 864c66bbbc847b6ed2ae573bedb4ce67e9d4ee66..03e10813999f56ff20276290ff170a9992229c42 100644 (file)
@@ -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):