Skip to main content

ASN.1 parser, compiler and general swiss army knife

Project description

About

A Python package for ASN.1 parsing, encoding and decoding.

This project is under development and does only support a subset of the ASN.1 specification syntax.

Supported codecs:

  • Basic Encoding Rules (BER)

  • Distinguished Encoding Rules (DER)

  • Generic String Encoding Rules (GSER)

  • JSON Encoding Rules (JER)

  • Basic Octet Encoding Rules (OER)

  • Aligned Packed Encoding Rules (PER)

  • Unaligned Packed Encoding Rules (UPER)

  • XML Encoding Rules (XER)

Miscellaneous features:

  • C source code generator for OER and UPER (with some limitations).

Project homepage: https://github.com/boxtheta/asn1tools-ext

Documentation: TODO: add docs url

Known limitations

  • The CLASS keyword (X.681) and its friends are not yet supported.

  • Parametrization (X.683) is not yet supported.

  • The EMBEDDED PDV type is not yet supported.

  • The ANY and ANY DEFINED BY types are not supported. They were removed from the ASN.1 standard 1994.

  • WITH COMPONENT and WITH COMPONENTS constraints are ignored, except for OER REAL.

  • The DURATION type is not yet supported.

Installation

pip install asn1tools_ext

Example Usage

This is an example ASN.1 specification defining the messages of a fictitious Foo protocol (based on the FooProtocol on Wikipedia).

Foo DEFINITIONS ::= BEGIN

    Question ::= SEQUENCE {
        id        INTEGER,
        question  IA5String
    }

    Answer ::= SEQUENCE {
        id        INTEGER,
        answer    BOOLEAN
    }

END

Scripting

Compile the ASN.1 specification, and encode and decode a question using the default codec (BER).

>>> import asn1tools
>>> foo = asn1tools.compile_files('tests/files/foo.asn')
>>> encoded = foo.encode('Question', {'id': 1, 'question': 'Is 1+1=3?'})
>>> encoded
bytearray(b'0\x0e\x02\x01\x01\x16\x09Is 1+1=3?')
>>> foo.decode('Question', encoded)
{'id': 1, 'question': 'Is 1+1=3?'}

The same ASN.1 specification, but using the PER codec.

>>> import asn1tools
>>> foo = asn1tools.compile_files('tests/files/foo.asn', 'per')
>>> encoded = foo.encode('Question', {'id': 1, 'question': 'Is 1+1=3?'})
>>> encoded
bytearray(b'\x01\x01\tIs 1+1=3?')
>>> foo.decode('Question', encoded)
{'id': 1, 'question': 'Is 1+1=3?'}

See the examples folder for additional examples.

CLI will be redesigned and placed under another package

Limitations by design:

  • Only the types BOOLEAN, INTEGER, NULL, OCTET STRING, BIT STRING, ENUMERATED, SEQUENCE, SEQUENCE OF, and CHOICE are supported. The OER generator also supports REAL.

  • All types must have a known maximum size, i.e. INTEGER (0..7), OCTET STRING (SIZE(12)).

  • INTEGER must be 64 bits or less.

  • REAL must be IEEE 754 binary32 or binary64. binary32 is generated as float and binary64 as double.

  • Recursive types are not supported.

Known limitations:

  • Extension additions (...) are only supported in the OER generator. See compact_extensions_uper for how to make UPER CHOICE and SEQUENCE extendable without using ....

  • Named numbers in ENUMERATED are not yet supported.

Other OER and/or UPER C code generators:

See the benchmark example for a comparison of asn1c, asn1scc and asn1tools.

Contributing

  1. Fork the repository.

  2. Install prerequisites.

    pip install -r requirements.txt
  3. Implement the new feature or bug fix.

  4. Implement test case(s) to ensure that future changes do not break legacy.

  5. Run the tests.

    make test
  6. Create a pull request.

Specifications

ASN.1 specifications released by ITU and IETF.

General

Encodings

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

asn1tools_ext-0.2.2.tar.gz (94.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

asn1tools_ext-0.2.2-py3-none-any.whl (112.1 kB view details)

Uploaded Python 3

File details

Details for the file asn1tools_ext-0.2.2.tar.gz.

File metadata

  • Download URL: asn1tools_ext-0.2.2.tar.gz
  • Upload date:
  • Size: 94.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.10 {"installer":{"name":"uv","version":"0.9.10"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"CachyOS Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for asn1tools_ext-0.2.2.tar.gz
Algorithm Hash digest
SHA256 98877c0e7907ca2607bcf4289d5981038feedf2db4aa1f35b53ff1065ac91ea3
MD5 6711508eec2d2e198e1126a69359b949
BLAKE2b-256 1838c9826460f947011f911a740adb935fa0a334e576ec8103482e836b5dd316

See more details on using hashes here.

File details

Details for the file asn1tools_ext-0.2.2-py3-none-any.whl.

File metadata

  • Download URL: asn1tools_ext-0.2.2-py3-none-any.whl
  • Upload date:
  • Size: 112.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.10 {"installer":{"name":"uv","version":"0.9.10"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"CachyOS Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for asn1tools_ext-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 187a611090ddd909dd1e67a4e5d6a9a956fedf2db01d729b2283b491f363a447
MD5 f923f394c9777f66ba9de9957d91cc8f
BLAKE2b-256 0af0db2c52626f4dc1d7df9e4fec8e66beccd3e173c740f530f32b05a7351fd3

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page