X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=pyderasn.py;h=9e94184cd2274311f8a445cea3acd8a1f698c237;hb=f4208ef738d16dc4b7a919106b7bc031179d6a16;hp=9635e71d70de0e89474fb8a958b0bfe10dd13dbb;hpb=b3160726b5f1aaf721569018291e9bc6b25a9ab7;p=pyderasn.git diff --git a/pyderasn.py b/pyderasn.py index 9635e71..9e94184 100755 --- a/pyderasn.py +++ b/pyderasn.py @@ -687,7 +687,7 @@ except ImportError: # pragma: no cover def colored(what, *args, **kwargs): return what -__version__ = "6.0" +__version__ = "6.1" __all__ = ( "Any", @@ -1669,9 +1669,8 @@ def pprint( """Pretty print object :param Obj obj: object you want to pretty print - :param oid_maps: list of ``OID <-> humand readable string`` dictionary. - When OID from it is met, then its humand readable form - is printed + :param oid_maps: list of ``str(OID) <-> human readable string`` dictionary. + Its human readable form is printed when OID is met :param big_blobs: if large binary objects are met (like OctetString values), do we need to print them too, on separate lines @@ -3421,6 +3420,13 @@ ObjectIdentifierState = namedtuple("ObjectIdentifierState", ( )) +def pureint(value): + i = int(value) + if (value[0] in "+- ") or (value[-1] == " "): + raise ValueError("non-pure integer") + return i + + class ObjectIdentifier(Obj): """``OBJECT IDENTIFIER`` OID type @@ -3498,7 +3504,7 @@ class ObjectIdentifier(Obj): return value._value if isinstance(value, string_types): try: - value = tuple(int(arc) for arc in value.split(".")) + value = tuple(pureint(arc) for arc in value.split(".")) except ValueError: raise InvalidOID("unacceptable arcs values") if isinstance(value, tuple): @@ -3512,6 +3518,8 @@ class ObjectIdentifier(Obj): pass else: raise InvalidOID("unacceptable first arc value") + if not all(arc >= 0 for arc in value): + raise InvalidOID("negative arc value") return value raise InvalidValueType((self.__class__, str, tuple)) @@ -4128,7 +4136,14 @@ LEN_YYYYMMDDHHMMSSDMZ = len("YYYYMMDDHHMMSSDMZ") LEN_YYYYMMDDHHMMSSZ = len("YYYYMMDDHHMMSSZ") -class UTCTime(CommonString): +class VisibleString(CommonString): + __slots__ = () + tag_default = tag_encode(26) + encoding = "ascii" + asn1_type_name = "VisibleString" + + +class UTCTime(VisibleString): """``UTCTime`` datetime type >>> t = UTCTime(datetime(2017, 9, 30, 22, 7, 50, 123)) @@ -4301,6 +4316,10 @@ class GeneralizedTime(UTCTime): Only microsecond fractions are supported. :py:exc:`pyderasn.DecodeError` will be raised during decoding of higher precision values. + + .. warning:: + + Zero year is unsupported. """ __slots__ = () tag_default = tag_encode(24) @@ -4309,7 +4328,7 @@ class GeneralizedTime(UTCTime): def _strptime(self, value): l = len(value) if l == LEN_YYYYMMDDHHMMSSZ: - # datetime.strptime's format: %y%m%d%H%M%SZ + # datetime.strptime's format: %Y%m%d%H%M%SZ if value[-1] != "Z": raise ValueError("non UTC timezone") return datetime( @@ -4379,13 +4398,6 @@ class GraphicString(CommonString): asn1_type_name = "GraphicString" -class VisibleString(CommonString): - __slots__ = () - tag_default = tag_encode(26) - encoding = "ascii" - asn1_type_name = "VisibleString" - - class ISO646String(VisibleString): __slots__ = () asn1_type_name = "ISO646String"