def colored(what, *args, **kwargs):
return what
-__version__ = "6.0"
+__version__ = "6.1"
__all__ = (
"Any",
return raw
return b"".join((self._expl, len_encode(len(raw)), raw))
+ def hexencode(self):
+ """Do hexadecimal encoded :py:meth:`pyderasn.Obj.encode`
+ """
+ return hexenc(self.encode())
+
def decode(
self,
data,
raise ExceedingData(len(tail))
return obj
+ def hexdecode(self, data, *args, **kwargs):
+ """Do :py:meth:`pyderasn.Obj.decode` with hexadecimal decoded data
+ """
+ return self.decode(hexdec(data), *args, **kwargs)
+
+ def hexdecod(self, data, *args, **kwargs):
+ """Do :py:meth:`pyderasn.Obj.decod` with hexadecimal decoded data
+ """
+ return self.decod(hexdec(data), *args, **kwargs)
+
@property
def expled(self):
"""See :ref:`decoding`
"""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
))
+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
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):
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))
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))
raise ValueError("non UTC timezone")
return datetime(
2000 + int(value[:2]), # %y
- int(value[2:4]), # %m
- int(value[4:6]), # %d
- int(value[6:8]), # %H
- int(value[8:10]), # %M
- int(value[10:12]), # %S
+ pureint(value[2:4]), # %m
+ pureint(value[4:6]), # %d
+ pureint(value[6:8]), # %H
+ pureint(value[8:10]), # %M
+ pureint(value[10:12]), # %S
)
def _value_sanitize(self, value):
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)
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(
- int(value[:4]), # %Y
- int(value[4:6]), # %m
- int(value[6:8]), # %d
- int(value[8:10]), # %H
- int(value[10:12]), # %M
- int(value[12:14]), # %S
+ pureint(value[:4]), # %Y
+ pureint(value[4:6]), # %m
+ pureint(value[6:8]), # %d
+ pureint(value[8:10]), # %H
+ pureint(value[10:12]), # %M
+ pureint(value[12:14]), # %S
)
if l >= LEN_YYYYMMDDHHMMSSDMZ:
# datetime.strptime's format: %Y%m%d%H%M%S.%fZ
us_len = len(us)
if us_len > 6:
raise ValueError("only microsecond fractions are supported")
- us = int(us + ("0" * (6 - us_len)))
+ us = pureint(us + ("0" * (6 - us_len)))
decoded = datetime(
- int(value[:4]), # %Y
- int(value[4:6]), # %m
- int(value[6:8]), # %d
- int(value[8:10]), # %H
- int(value[10:12]), # %M
- int(value[12:14]), # %S
+ pureint(value[:4]), # %Y
+ pureint(value[4:6]), # %m
+ pureint(value[6:8]), # %d
+ pureint(value[8:10]), # %H
+ pureint(value[10:12]), # %M
+ pureint(value[12:14]), # %S
us, # %f
)
return decoded
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"