asn1tools 0.167.0


pip install asn1tools

  Latest version

Released: Jul 13, 2024

Project Links

Meta
Author: Erik Moqvist

Classifiers

License
  • OSI Approved :: MIT License

Programming Language
  • Python :: 2
  • Python :: 3

coverage codecov nala

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/eerimoq/asn1tools

Documentation: http://asn1tools.readthedocs.org/en/latest

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

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.

Command line tool

The shell subcommand

Use the command line shell to convert data between given formats. The default input codec is BER and output codec is GSER (produces human readable text).

> asn1tools shell

Welcome to the asn1tools shell!

$ help
Commands:
  compile
  convert
  exit
  help
$ compile tests/files/foo.asn
$ convert Question 300e0201011609497320312b313d333f
question Question ::= {
    id 1,
    question "Is 1+1=3?"
}
$ compile --output-codec xer tests/files/foo.asn
$ convert Question 300e0201011609497320312b313d333f
<Question>
    <id>1</id>
    <question>Is 1+1=3?</question>
</Question>
$ compile -o uper tests/files/foo.asn
$ convert Question 300e0201011609497320312b313d333f
01010993cd03156c5eb37e
$ exit
>

The convert subcommand

Convert given encoded Question from BER to GSER (produces human readable text).

> asn1tools convert tests/files/foo.asn Question 300e0201011609497320312b313d333f
question Question ::= {
    id 1,
    question "Is 1+1=3?"
}
>

Convert given encoded Question from UPER to XER (xml).

> asn1tools convert -i uper -o xer tests/files/foo.asn Question 01010993cd03156c5eb37e
<Question>
    <id>1</id>
    <question>Is 1+1=3?</question>
</Question>
>

Convert given encoded Question from UPER to JER (json).

> asn1tools convert -i uper -o jer tests/files/foo.asn Question 01010993cd03156c5eb37e
{
    "id": 1,
    "question": "Is 1+1=3?"
}
>

Continuously convert encoded Questions read from standard input. Any line that cannot be converted is printed as is, in this example the dates.

> cat encoded.txt
2018-02-24 11:22:09
300e0201011609497320312b313d333f
2018-02-24 11:24:15
300e0201021609497320322b323d353f
> cat encoded.txt | asn1tools convert tests/files/foo.asn Question -
2018-02-24 11:22:09
question Question ::= {
    id 1,
    question "Is 1+1=3?"
}
2018-02-24 11:24:15
question Question ::= {
    id 2,
    question "Is 2+2=5?"
}
>

The convert subcommand with a cache

Convert given encoded PCCH-Message from UPER to GSER with the --cache-dir option set to my_cache. Using a cache significantly reduces the command execution time after the first call.

> time asn1tools convert --cache-dir my_cache -i uper tests/files/3gpp/rrc_8_6_0.asn PCCH-Message 28
pcch-message PCCH-Message ::= {
    message c1 : paging : {
        systemInfoModification true,
        nonCriticalExtension {
        }
    }
}

real    0m2.090s
user    0m1.977s
sys     0m0.032s
> time asn1tools convert --cache-dir my_cache -i uper tests/files/3gpp/rrc_8_6_0.asn PCCH-Message 28
pcch-message PCCH-Message ::= {
    message c1 : paging : {
        systemInfoModification true,
        nonCriticalExtension {
        }
    }
}

real    0m0.276s
user    0m0.197s
sys     0m0.026s
>

The parse subcommand

Parse given ASN.1 specification and write it as a Python dictionary to given file. Use the created file to convert given encoded Question from BER to GSER (produces human readable text). The conversion is significantly faster than passing .asn-file(s) to the convert subcommand, especially for larger ASN.1 specifications.

> asn1tools parse tests/files/foo.asn foo.py
> asn1tools convert foo.py Question 300e0201011609497320312b313d333f
question Question ::= {
    id 1,
    question "Is 1+1=3?"
}
>

The generate C source subcommand

Generate OER or UPER C source code from an ASN.1 specification.

No dynamic memory is used in the generated code. To achieve this all types in the ASN.1 specification must have a known maximum size, i.e. INTEGER (0..7), OCTET STRING (SIZE(12)), etc.

Below is an example generating OER C source code from tests/files/c_source/c_source.asn.

> asn1tools generate_c_source --namespace oer tests/files/c_source/c_source.asn
Successfully generated oer.h and oer.c.

The same as above, but generate UPER C source code instead of OER.

> asn1tools generate_c_source --codec uper --namespace uper tests/files/c_source/c_source.asn
Successfully generated uper.h and uper.c.

The same as the first example, but also generate fuzz testing C source code for libFuzzer.

> asn1tools generate_c_source --namespace oer --generate-fuzzer tests/files/c_source/c_source.asn
Successfully generated oer.h and oer.c.
Successfully generated oer_fuzzer.c and oer_fuzzer.mk.

Run "make -f oer_fuzzer.mk" to build and run the fuzzer. Requires a
recent version of clang.

See oer.h, oer.c, uper.h, uper.c, oer_fuzzer.c and oer_fuzzer.mk for the contents of the generated files.

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

0.167.0 Jul 13, 2024
0.166.0 Mar 10, 2023
0.165.0 Dec 13, 2022
0.164.0 Aug 25, 2022
0.163.0 May 08, 2022
0.161.0 Jan 02, 2022
0.160.0 Nov 28, 2021
0.159.0 Oct 12, 2021
0.158.0 Mar 30, 2021
0.157.0 Mar 29, 2021
0.155.3 Jan 14, 2021
0.155.2 Jan 13, 2021
0.155.1 Jan 11, 2021
0.155.0 Dec 17, 2020
0.153.2 Aug 18, 2020
0.153.1 Aug 07, 2020
0.153.0 Aug 03, 2020
0.152.0 Jul 06, 2020
0.151.0 Jun 29, 2020
0.150.0 Jun 10, 2020
0.149.1 May 02, 2020
0.149.0 Apr 20, 2020
0.148.1 Apr 17, 2020
0.148.0 Apr 17, 2020
0.147.0 Apr 13, 2020
0.146.6 Oct 17, 2019
0.146.5 Aug 11, 2019
0.146.4 Jul 21, 2019
0.146.3 Jun 02, 2019
0.146.2 May 24, 2019
0.146.1 Apr 01, 2019
0.146.0 Mar 25, 2019
0.145.3 Jan 24, 2019
0.145.2 Jan 19, 2019
0.145.1 Jan 17, 2019
0.145.0 Jan 13, 2019
0.144.0 Jan 07, 2019
0.143.0 Jan 06, 2019
0.142.2 Jan 03, 2019
0.142.1 Jan 03, 2019
0.142.0 Jan 03, 2019
0.141.1 Jan 03, 2019
0.141.0 Jan 02, 2019
0.140.0 Jan 02, 2019
0.139.0 Jan 01, 2019
0.138.2 Dec 25, 2018
0.138.0 Dec 20, 2018
0.137.4 Dec 05, 2018
0.137.3 Dec 04, 2018
0.137.2 Dec 03, 2018
0.137.1 Nov 30, 2018
0.137.0 Nov 13, 2018
0.136.0 Nov 07, 2018
0.135.0 Nov 06, 2018
0.134.0 Nov 04, 2018
0.133.0 Nov 03, 2018
0.132.0 Oct 22, 2018
0.131.0 Oct 20, 2018
0.130.0 Oct 19, 2018
0.129.0 Oct 19, 2018
0.128.0 Oct 17, 2018
0.127.0 Oct 17, 2018
0.126.0 Oct 17, 2018
0.125.1 Oct 11, 2018
0.125.0 Sep 29, 2018
0.124.1 Sep 28, 2018
0.124.0 Jul 16, 2018
0.123.2 Jul 14, 2018
0.123.1 Jul 12, 2018
0.123.0 Jul 10, 2018
0.122.0 Jul 03, 2018
0.121.0 Jul 01, 2018
0.120.0 Jul 01, 2018
0.119.0 Jun 30, 2018
0.118.0 Jun 29, 2018
0.117.0 Jun 27, 2018
0.116.0 Jun 26, 2018
0.115.0 Jun 26, 2018
0.114.0 Jun 24, 2018
0.113.0 Jun 23, 2018
0.112.0 Jun 21, 2018
0.111.0 Jun 20, 2018
0.110.0 Jun 19, 2018
0.109.0 Jun 18, 2018
0.107.0 Jun 14, 2018
0.106.0 Jun 13, 2018
0.105.0 Jun 13, 2018
0.104.0 Jun 12, 2018
0.103.0 Jun 10, 2018
0.102.0 Jun 09, 2018
0.101.0 Jun 09, 2018
0.100.0 Jun 07, 2018
0.98.0 Jun 06, 2018
0.97.0 Jun 03, 2018
0.95.0 Jun 02, 2018
0.94.0 Jun 02, 2018
0.93.0 Jun 02, 2018
0.92.1 Jun 01, 2018
0.92.0 May 31, 2018
0.91.0 May 30, 2018
0.90.0 May 29, 2018
0.89.0 May 27, 2018
0.88.0 May 23, 2018
0.87.0 May 21, 2018
0.86.0 May 19, 2018
0.85.0 May 16, 2018
0.84.0 May 15, 2018
0.83.0 May 15, 2018
0.82.0 May 13, 2018
0.81.0 May 13, 2018
0.80.1 May 13, 2018
0.80.0 May 12, 2018
0.79.0 May 10, 2018
0.78.0 Apr 26, 2018
0.77.0 Apr 24, 2018
0.76.0 Apr 22, 2018
0.75.0 Apr 21, 2018
0.74.0 Apr 19, 2018
0.73.0 Apr 14, 2018
0.72.0 Apr 08, 2018
0.71.0 Apr 08, 2018
0.70.0 Apr 08, 2018
0.69.0 Apr 07, 2018
0.68.0 Apr 07, 2018
0.67.0 Apr 02, 2018
0.66.0 Apr 02, 2018
0.65.0 Mar 31, 2018
0.64.0 Mar 26, 2018
0.63.0 Mar 25, 2018
0.62.0 Mar 24, 2018
0.61.0 Mar 21, 2018
0.60.0 Mar 21, 2018
0.59.0 Mar 21, 2018
0.58.0 Mar 20, 2018
0.57.0 Mar 20, 2018
0.55.0 Mar 19, 2018
0.54.0 Mar 18, 2018
0.53.0 Mar 13, 2018
0.52.0 Mar 11, 2018
0.51.0 Mar 10, 2018
0.50.0 Mar 10, 2018
0.49.0 Mar 10, 2018
0.48.0 Mar 09, 2018
0.47.0 Mar 07, 2018
0.46.0 Mar 06, 2018
0.45.0 Mar 06, 2018
0.44.0 Mar 05, 2018
0.43.0 Mar 04, 2018
0.42.0 Mar 03, 2018
0.41.0 Mar 01, 2018
0.40.0 Mar 01, 2018
0.39.0 Feb 27, 2018
0.38.0 Feb 27, 2018
0.37.0 Feb 27, 2018
0.36.0 Feb 26, 2018
0.35.0 Feb 24, 2018
0.34.0 Feb 24, 2018
0.33.0 Feb 23, 2018
0.32.0 Feb 16, 2018
0.31.0 Feb 11, 2018
0.30.0 Feb 11, 2018
0.29.0 Feb 11, 2018
0.28.0 Feb 10, 2018
0.27.0 Feb 09, 2018
0.26.0 Feb 08, 2018
0.25.0 Feb 05, 2018
0.24.0 Jan 29, 2018
0.23.0 Jan 24, 2018
0.22.0 Jan 14, 2018
0.21.0 Jan 13, 2018
0.20.0 Jan 07, 2018
0.19.0 Jan 02, 2018
0.18.0 Dec 31, 2017
0.17.1 Dec 29, 2017
0.17.0 Dec 28, 2017
0.16.0 Oct 19, 2017
0.15.0 Oct 15, 2017
0.14.0 Oct 12, 2017
0.13.0 Oct 10, 2017
0.12.0 Oct 09, 2017
0.11.0 Oct 08, 2017
0.10.0 Oct 08, 2017
0.9.0 Aug 27, 2017
0.8.0 Aug 27, 2017
0.7.0 Aug 26, 2017
0.6.0 Aug 22, 2017
0.5.0 Aug 16, 2017
0.3.0 Aug 13, 2017
0.1.0 Aug 02, 2017
No dependencies