From 7af6ff46e2927030706fc4c0df0ddeadfa55dd79 Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Sat, 8 Feb 2020 22:44:54 +0300 Subject: [PATCH] Cython compatibility Module has to be specified for namedtuples for pickling under Cython. --- doc/features.rst | 3 ++- doc/news.rst | 1 + pyderasn.py | 31 +++++++++++++++++++------------ 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/doc/features.rst b/doc/features.rst index 1c91fee..76d6830 100644 --- a/doc/features.rst +++ b/doc/features.rst @@ -47,7 +47,8 @@ Also there is `asn1crypto `__. automatically set required tags) * Descriptive errors, like ``pyderasn.DecodeError: UTCTime (tbsCertificate:validity:notAfter:utcTime) (at 328) invalid UTCTime format`` -* ``__slots__``, ``copy.copy()``, ``pickle`` friendliness +* ``__slots__``, ``copy.copy()``, ``pickle``, `Cython `__ + friendliness * Could be significantly faster and have lower memory usage For example parsing of CACert.org's CRL (8.48 MiB) on FreeBSD 12.0 amd64, Intel Core i5-6200U 2.3 GHz machine, Python 3.5.5/2.7.15: diff --git a/doc/news.rst b/doc/news.rst index cbaa344..50c3408 100644 --- a/doc/news.rst +++ b/doc/news.rst @@ -8,6 +8,7 @@ News * UTCTime and GeneralizedTime allowed values to have plus sign in them, passing int() check successfully. Prohibit that incorrect behaviour * UTCTime and GeneralizedTime BER decoding support +* Workability under Cython * Explicitly Check that all ObjectIdentifier arcs are non-negative .. _release6.0: diff --git a/pyderasn.py b/pyderasn.py index 0d3a663..6c14e46 100755 --- a/pyderasn.py +++ b/pyderasn.py @@ -1,5 +1,6 @@ #!/usr/bin/env python # coding: utf-8 +# cython: language_level=3 # PyDERASN -- Python ASN.1 DER/BER codec with abstract structures # Copyright (C) 2017-2020 Sergey Matveev # @@ -763,6 +764,7 @@ EOC = b"\x00\x00" EOC_LEN = len(EOC) LENINDEF = b"\x80" # length indefinite mark LENINDEF_PP_CHAR = "I" if PY2 else "∞" +NAMEDTUPLE_KWARGS = {} if PY2 else {"module": __name__} ######################################################################## @@ -1479,7 +1481,7 @@ PP = namedtuple("PP", ( "lenindef", "ber_encoded", "bered", -)) +), **NAMEDTUPLE_KWARGS) def _pp( @@ -1739,7 +1741,7 @@ BooleanState = namedtuple("BooleanState", ( "expl_lenindef", "lenindef", "ber_encoded", -)) +), **NAMEDTUPLE_KWARGS) class Boolean(Obj): @@ -1983,7 +1985,7 @@ IntegerState = namedtuple("IntegerState", ( "expl_lenindef", "lenindef", "ber_encoded", -)) +), **NAMEDTUPLE_KWARGS) class Integer(Obj): @@ -2353,7 +2355,7 @@ BitStringState = namedtuple("BitStringState", ( "ber_encoded", "tag_constructed", "defined", -)) +), **NAMEDTUPLE_KWARGS) class BitString(Obj): @@ -2864,7 +2866,7 @@ OctetStringState = namedtuple("OctetStringState", ( "ber_encoded", "tag_constructed", "defined", -)) +), **NAMEDTUPLE_KWARGS) class OctetString(Obj): @@ -3252,7 +3254,7 @@ NullState = namedtuple("NullState", ( "expl_lenindef", "lenindef", "ber_encoded", -)) +), **NAMEDTUPLE_KWARGS) class Null(Obj): @@ -3422,7 +3424,7 @@ ObjectIdentifierState = namedtuple("ObjectIdentifierState", ( "lenindef", "ber_encoded", "defines", -)) +), **NAMEDTUPLE_KWARGS) def pureint(value): @@ -4009,6 +4011,7 @@ class NumericString(AllowableCharsMixin, CommonString): PrintableStringState = namedtuple( "PrintableStringState", OctetStringState._fields + ("allowable_chars",), + **NAMEDTUPLE_KWARGS ) @@ -4154,7 +4157,11 @@ class VisibleString(CommonString): asn1_type_name = "VisibleString" -UTCTimeState = namedtuple("UTCTimeState", OctetStringState._fields + ("ber_raw",)) +UTCTimeState = namedtuple( + "UTCTimeState", + OctetStringState._fields + ("ber_raw",), + **NAMEDTUPLE_KWARGS +) class UTCTime(VisibleString): @@ -4598,7 +4605,7 @@ ChoiceState = namedtuple("ChoiceState", ( "expl_lenindef", "lenindef", "ber_encoded", -)) +), **NAMEDTUPLE_KWARGS) class Choice(Obj): @@ -4916,7 +4923,7 @@ AnyState = namedtuple("AnyState", ( "lenindef", "ber_encoded", "defined", -)) +), **NAMEDTUPLE_KWARGS) class Any(Obj): @@ -5195,7 +5202,7 @@ SequenceState = namedtuple("SequenceState", ( "expl_lenindef", "lenindef", "ber_encoded", -)) +), **NAMEDTUPLE_KWARGS) class Sequence(Obj): @@ -5860,7 +5867,7 @@ SequenceOfState = namedtuple("SequenceOfState", ( "expl_lenindef", "lenindef", "ber_encoded", -)) +), **NAMEDTUPLE_KWARGS) class SequenceOf(Obj): -- 2.44.0