Package: asn1tools
AboutA Python package forASN.1parsing, encoding and decoding.This project isunder developmentand 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:Csource code generator for OER and UPER (with some limitations).Project homepage:https://github.com/eerimoq/asn1toolsDocumentation:http://asn1tools.readthedocs.org/en/latestKnown limitationsTheCLASSkeyword (X.681) and its friends are not yet supported.Parametrization (X.683) is not yet supported.TheEMBEDDED PDVtype is not yet supported.TheANYandANY DEFINED BYtypes are not supported. They
were removed from the ASN.1 standard 1994.WITH COMPONENTandWITH COMPONENTSconstraints are ignored,
except for OERREAL.TheDURATIONtype is not yet supported.Installationpipinstallasn1toolsExample UsageThis 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
    }

ENDScriptingCompilethe ASN.1 specification, andencodeanddecodea
question using the default codec (BER).>>>importasn1tools>>>foo=asn1tools.compile_files('tests/files/foo.asn')>>>encoded=foo.encode('Question',{'id':1,'question':'Is 1+1=3?'})>>>encodedbytearray(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.>>>importasn1tools>>>foo=asn1tools.compile_files('tests/files/foo.asn','per')>>>encoded=foo.encode('Question',{'id':1,'question':'Is 1+1=3?'})>>>encodedbytearray(b'\x01\x01\tIs 1+1=3?')>>>foo.decode('Question',encoded){'id':1,'question':'Is 1+1=3?'}See theexamplesfolder for additional examples.Command line toolThe shell subcommandUse 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 subcommandConvert 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 cacheConvert given encoded PCCH-Message from UPER to GSER with the--cache-diroption set tomy_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 subcommandParse 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 subcommandGenerate 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 fromtests/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 forlibFuzzer.> 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.Seeoer.h,oer.c,uper.h,uper.c,oer_fuzzer.candoer_fuzzer.mkfor the contents of the generated files.Limitations by design:Only the typesBOOLEAN,INTEGER,NULL,OCTET STRING,BIT STRING,ENUMERATED,SEQUENCE,SEQUENCE OF, andCHOICEare supported. The OER generator also supportsREAL.All types must have a known maximum size, i.e.INTEGER(0..7),OCTET STRING (SIZE(12)).INTEGERmust be 64 bits or less.REALmust be IEEE 754 binary32 or binary64. binary32 is
generated asfloatand binary64 asdouble.Recursive types are not supported.Known limitations:Extension additions (...) are only supported in the OER generator.
Seecompact_extensions_uperfor how to make UPERCHOICEandSEQUENCEextendable without using....Named numbers inENUMERATEDare not yet supported.Other OER and/or UPER C code generators:https://github.com/vlm/asn1chttps://github.com/ttsiodras/asn1sccSee thebenchmark examplefor a comparison ofasn1c,asn1sccandasn1tools.ContributingFork the repository.Install prerequisites.pip install -r requirements.txtImplement the new feature or bug fix.Implement test case(s) to ensure that future changes do not break
legacy.Run the tests.make testCreate a pull request.SpecificationsASN.1 specifications released by ITU and IETF.GeneralX.680: Specification of basic notationX.681: Information object specificationX.682: Constraint specificationX.683: Parameterization of ASN.1 specificationsEncodingsX.690: Specification of Basic Encoding Rules (BER), Canonical
Encoding Rules (CER) and Distinguished Encoding Rules (DER)X.691: Specification of Packed Encoding Rules (PER)X.693: XML Encoding Rules (XER)X.696: Specification of Octet Encoding Rules (OER)RFC 3641: Generic String Encoding Rules (GSER) for ASN.1Overview of the JSON Encoding Rules (JER)