]> Cypherpunks.ru repositories - pyderasn.git/blobdiff - pyderasn.py
Prepare for 4.3 release
[pyderasn.git] / pyderasn.py
index 2e63b5a2320bc672bf7d01f35acb053d241b3145..9c4da4ec76b94b3561581453e2b981fa18e14ad3 100755 (executable)
@@ -542,6 +542,7 @@ from collections import OrderedDict
 from datetime import datetime
 from math import ceil
 from os import environ
+from string import ascii_letters
 from string import digits
 
 from six import add_metaclass
@@ -3491,13 +3492,14 @@ class UTF8String(CommonString):
 class NumericString(CommonString):
     """Numeric string
 
-    Its value is properly sanitized: only ASCII digits can be stored.
+    Its value is properly sanitized: only ASCII digits with spaces can
+    be stored.
     """
     __slots__ = ()
     tag_default = tag_encode(18)
     encoding = "ascii"
     asn1_type_name = "NumericString"
-    allowable_chars = set(digits.encode("ascii"))
+    allowable_chars = set(digits.encode("ascii") + b" ")
 
     def _value_sanitize(self, value):
         value = super(NumericString, self)._value_sanitize(value)
@@ -3507,10 +3509,21 @@ class NumericString(CommonString):
 
 
 class PrintableString(CommonString):
+    """Printable string
+
+    Its value is properly sanitized: see X.680 41.4 table 10.
+    """
     __slots__ = ()
     tag_default = tag_encode(19)
     encoding = "ascii"
     asn1_type_name = "PrintableString"
+    allowable_chars = set((ascii_letters + digits + " '()+,-./:=?").encode("ascii"))
+
+    def _value_sanitize(self, value):
+        value = super(PrintableString, self)._value_sanitize(value)
+        if not set(value) <= self.allowable_chars:
+            raise DecodeError("non-printable value")
+        return value
 
 
 class TeletexString(CommonString):