diff --git a/asn1crypto/core.py b/asn1crypto/core.py index 2edd4f3..c08cec4 100644 --- a/asn1crypto/core.py +++ b/asn1crypto/core.py @@ -925,6 +925,9 @@ class Any(Asn1Value): return self._parsed[0].native + def as_source_code(self): + return repr(self.native) + @property def parsed(self): """ @@ -1248,6 +1251,9 @@ class Choice(Asn1Value): return self.chosen.native + def as_source_code(self): + return f"{type_name(self)}({repr(self.name)}, {self.chosen.as_source_code()})" + def validate(self, class_, tag, contents): """ Ensures that the class and tag specified exist as an alternative @@ -1858,6 +1864,9 @@ class AbstractString(Constructable, Primitive): return self.__unicode__() + def as_source_code(self): + return f"{type_name(self)}({repr(self.native)})" + class Boolean(Primitive): """ @@ -1911,6 +1920,9 @@ class Boolean(Primitive): self._native = self.__bool__() return self._native + def as_source_code(self): + return repr(self.native) + class Integer(Primitive, ValueMap): """ @@ -1992,6 +2004,9 @@ class Integer(Primitive, ValueMap): self._native = self._map[self._native] return self._native + def as_source_code(self): + return repr(self.native) + class _IntegerBitString(object): """ @@ -2355,6 +2370,9 @@ class BitString(_IntegerBitString, Constructable, Castable, Primitive, ValueMap) self._native = bits return self._native + def as_source_code(self): + return repr(self.native) + class OctetBitString(Constructable, Castable, Primitive): """ @@ -2487,6 +2505,9 @@ class OctetBitString(Constructable, Castable, Primitive): return self.__bytes__() + def as_source_code(self): + return repr(self.native) + @property def unused_bits(self): """ @@ -2566,6 +2587,9 @@ class IntegerBitString(_IntegerBitString, Constructable, Castable, Primitive): return self._native + def as_source_code(self): + return repr(self.native) + class OctetString(Constructable, Castable, Primitive): """ @@ -2644,6 +2668,9 @@ class OctetString(Constructable, Castable, Primitive): return self.__bytes__() + def as_source_code(self): + return repr(self.native) + class IntegerOctetString(Constructable, Castable, Primitive): """ @@ -2712,6 +2739,9 @@ class IntegerOctetString(Constructable, Castable, Primitive): self._native = int_from_bytes(self._merge_chunks()) return self._native + def as_source_code(self): + return repr(self.native) + def set_encoded_width(self, width): """ Set the explicit enoding width for the integer @@ -2863,6 +2893,11 @@ class ParsableOctetString(Constructable, Castable, Primitive): else: return self.__bytes__() + def as_source_code(self): + if self._parsed is not None: + return self._parsed[0].as_source_code() + return None + @property def parsed(self): """ @@ -2986,6 +3021,8 @@ class Null(Primitive): return None + def as_source_code(self): + return "asn1crypto.core.Null()" class ObjectIdentifier(Primitive, ValueMap): """ @@ -3211,6 +3248,9 @@ class ObjectIdentifier(Primitive, ValueMap): self._native = self._map[self._native] return self._native + def as_source_code(self): + return repr(self.native) + class ObjectDescriptor(Primitive): """ @@ -4075,6 +4115,28 @@ class Sequence(Asn1Value): raise e return self._native + def as_source_code(self): + if self.children is None: + self._parse_children(recurse=True) + try: + source_code_map = OrderedDict() + for index, child in enumerate(self.children): + if child.__class__ == tuple: + child = _build(*child) + self.children[index] = child + try: + name = self._fields[index][0] + except (IndexError): + name = str_cls(index) + if not isinstance(child, Void): + source_code_map[name] = child.as_source_code() + except (ValueError, TypeError) as e: + args = e.args[1:] + e.args = (e.args[0] + '\n while reconstructing %s' % type_name(self),) + args + raise e + child_list = ", ".join([f"'{key}': {child}" for key, child in source_code_map.items()]) + return f"{type_name(self)}({{ {child_list} }})" + def _copy(self, other, copy_func): """ Copies the contents of another Sequence object to itself @@ -4550,6 +4612,18 @@ class SequenceOf(Asn1Value): raise e return self._native + def as_source_code(self): + if self.children is None: + self._parse_children(recurse=True) + try: + source_code = [child.as_source_code() for child in self if not isinstance(child, Void)] + except (ValueError, TypeError) as e: + args = e.args[1:] + e.args = (e.args[0] + '\n while reconstructing %s' % type_name(self),) + args + raise e + child_list = ", ".join(source_code) + return f"{type_name(self)}([{child_list}])" + def _copy(self, other, copy_func): """ Copies the contents of another SequenceOf object to itself