asn1vnparser package

Submodules

asn1vnparser.cli module

Console script for asn1vnparser.

asn1vnparser.cli.main(orig_args=None)[source]

Console script for asn1vnparser.

See python cli.py –help.

asn1vnparser.jsonencoder module

Defines json.JSONEncoder subclass that makes parsed object (including bytes and bitarray) JSON-serializable

class asn1vnparser.jsonencoder.JSONEncoder(compact_bitarray=False, *args, **kwargs)[source]

Bases: json.encoder.JSONEncoder

JSON encoder with additional support for bytes and bitarray

Examples

>>> JSONEncoder().encode({"field1": 123})
'{"field1": 123}'
>>> JSONEncoder().encode({"field1": b'4'})
'{"field1": "1234"}'
>>> JSONEncoder().encode({"field1": bitarray.bitarray('01010')})
'{"field1": "01010"}'
>>> JSONEncoder(compact_bitarray=True).encode({"field1": bitarray.bitarray('01010')})
'{"field1": {"value": "50", "length": 5}}'
>>> JSONEncoder().encode({"field1": {"Type": 567}})
'{"field1": {"Type": 567}}'
default(o)[source]

Implement this method in a subclass such that it returns a serializable object for o, or calls the base implementation (to raise a TypeError).

For example, to support arbitrary iterators, you could implement default like this:

def default(self, o):
    try:
        iterable = iter(o)
    except TypeError:
        pass
    else:
        return list(iterable)
    # Let the base class default method raise the TypeError
    return JSONEncoder.default(self, o)

Module contents

Parses ASN.1 value notation into a Python object or JSON without requiring its ASN.1 schema.

class asn1vnparser.AsnValueAssignment(toks: pyparsing.ParseResults)[source]

Bases: asn1vnparser._grammar.AsnDefinition

Object that represents ASN.1 value assignment (X.680 16.2).

Parses:

value_name TypeName ::= value

Limitations:

  • Considers anything that matches typereference as Type
value_name

name of the assigned value.

Type:str
type_name

name of the value’s type.

Type:str
value

Python object that holds the value.

Type:Any
asn1vnparser.parse_asn1_value(asn1_value: str, as_json: bool = False, parse_all: bool = True) → Union[Any, str, Tuple[Any, str], Tuple[str, str]][source]

Converts ASN.1 value (mainly BuiltinValue in ITU-T Rec. X.680) to Python object.

Parameters:
  • asn1_value – a str representing ASN.1 value notation(s).
  • as_json – Returns JSON when True.
  • parse_all – When True, it is assumed that the whole asn1_value represents an ASN.1 value.
Returns:

  • When parse_all is True, result.
  • When parse_all is False, a tuple of (result, rest),

where result is:

  • When as_json = False, a Python object representation of asn1_value
  • When as_json = True, a JSON representation of asn1_value as str

and rest is the remaining str from asn1_value after reading the value notation.

Examples

>>> parse_asn1_value("123")  # INTEGER
123
>>> parse_asn1_value("{TRUE, FALSE}")  # SEQUENCE OF
[True, False]
>>> parse_asn1_value(
...     "{field1 NULL, field2 '1204'H, field3 '01011010 01'B}"
...     )  # SEQUENCE
{'field1': None, 'field2': b'\x12\x04', 'field3': bitarray('0101101001')}
>>> parse_asn1_value("alt1 : enum1")  # CHOICE
{'alt1': 'enum1'}
>>> parse_asn1_value("alt1: enum1", as_json=True)  # as_json
'{"alt1": "enum1"}'
>>> parse_asn1_value("blah blah")  # raises when not foune  # doctest: +ELLIPSIS
Traceback (most recent call last):
...
pyparsing.ParseException: ...
>>> parse_asn1_value("alt1: enum1\n---this is remaining string---", as_json=True)  # by default: parse_all=True. # doctest: +ELLIPSIS
Traceback (most recent call last):
...
pyparsing.ParseException: Expected end of text...
>>> parse_asn1_value("alt1: enum1\n---this is remaining string---", as_json=True, parse_all=False)  # as_json
('{"alt1": "enum1"}', '\n---this is remaining string---')
asn1vnparser.parse_asn1_value_assignment(asn1_val_assignment: str, as_json: bool = False, parse_all: bool = True) → Union[asn1vnparser._grammar.AsnValueAssignment, str, Tuple[asn1vnparser._grammar.AsnValueAssignment, str], Tuple[str, str]][source]

Converts ASN.1 value assignment to Python object.

Parameters:
  • asn1_val_assignment – A str representing ASN.1 value assignment(s).
  • as_json – Returns JSON when True.
  • parse_all – When True, it is assumed that the whole asn1_val_assignment represents an ASN.1 value assignment.
Returns:

  • When parse_all is True, result.
  • When parse_all is False, a tuple of (result, rest),

where result is:

  • When as_json = False, parsing result as AsnValueAssignment.
  • When as_json = True, a JSON representation of asn1_val_assignment as str

and rest is the remaining str from asn1_val_assinment after reading the value assignment.

Examples

>>> parse_asn1_value_assignment("valuename Typename ::= 1234")
{'value_name': 'valuename', 'type_name': 'Typename', 'value': 1234}
>>> parse_asn1_value_assignment("nonsense")  # raises when not found  # doctest: +ELLIPSIS
Traceback (most recent call last):
...
pyparsing.ParseException: ...
>>> parse_asn1_value_assignment("valuename Typename ::= 1234\n...remainremain...")  # doctest: +ELLIPSIS
Traceback (most recent call last):
...
pyparsing.ParseException: Expected end of text...
>>> parse_asn1_value_assignment("valuename Typename ::= 1234\n...remainremain...", parse_all=False)
({'value_name': 'valuename', 'type_name': 'Typename', 'value': 1234}, '\n...remainremain...')
asn1vnparser.parse_asn1_value_assignments(asn1_val_assignments: str, as_json: bool = False) → List[Union[asn1vnparser._grammar.AsnValueAssignment, str]][source]

Parses multiple ASN.1 value assignments.

Examples

>>> parse_asn1_value_assignments('value1 INTEGER ::= 1\nvalue2 Type2 ::= the-value')
[{'value_name': 'value1', 'type_name': 'INTEGER', 'value': 1}, {'value_name': 'value2', 'type_name': 'Type2', 'value': 'the-value'}]
>>> parse_asn1_value_assignments('nonsense')  # returns [] when not found
[]
>>> parse_asn1_value_assignments('value1 INTEGER ::= 1\nvalue2 Type2 ::= the-value', as_json=True)
'[{"value_name": "value1", "type_name": "INTEGER", "value": 1}, {"value_name": "value2", "type_name": "Type2", "value": "the-value"}]'
>>> parse_asn1_value_assignments('nonsense', as_json=True)  # returns '[]' when not found
'[]'