20 releases

0.6.1 Nov 10, 2023
0.5.9 Aug 8, 2023
0.5.8 Mar 3, 2023
0.5.2 Dec 16, 2022
0.1.2 Nov 13, 2021

#274 in Encoding

Download history 16/week @ 2024-01-27 55/week @ 2024-02-03 13/week @ 2024-02-10 99/week @ 2024-02-17 107/week @ 2024-02-24 47/week @ 2024-03-02 72/week @ 2024-03-09 54/week @ 2024-03-16 21/week @ 2024-03-23 39/week @ 2024-03-30 11/week @ 2024-04-06 18/week @ 2024-04-13 52/week @ 2024-04-20 30/week @ 2024-04-27 20/week @ 2024-05-04 21/week @ 2024-05-11

128 downloads per month
Used in 2 crates

Apache-2.0 OR MIT

115KB
3K SLoC

Hampi - Rust ASN.1 Toolkit

GitHub Workflow Status (branch) Crates.io Crates.io Crates.io

The Goal of this project is to implement an ASN.1 Compiler in Rust which can generate Rust bindings for different ASN.1 specifications, which can be used in various protocol implementations in Rust. Also, support for different ASN.1 encoding rules like DER, BER, PER is planned to be implemented as ASN.1 codecs.

While it is certainly desirable to have a fully compliant ASN.1 Compiler, initial focus of the project is to be able to generate code that can be used in other software. First goal is to work with 3GPP specifications for protocols like Radio Network Access Protocl (RANAP), S1 Application protocl (S1AP) and NG Application Protocol (NGAP). Consequently current implementation also focuses on codecs used by these specifications viz. Aligned Packed Encoding Rules (APER).

The use cases targeted by this implementation are similar to the use cases targeted by asn1c compiler, which generates C bindings from the ASN.1 Specifications.

This project is divided into three crates -

  1. asn1-compiler docs.rs: This crate provides the actual ASN.1 Compiler. Typically a utility (hampi-rs-asn1c) will generate Rust structures starting with ASN.1 Specifications. Basic working features required to work with the 3GPP specifications is provided by the compiler, this includes Parameterized Types, Information Object Classes and Type Constraints.

  2. asn1-codecs docs.rs: Support for different encodings supported by individual ASN.1 specifications is provided in this crate. Currently basic APER/UPER Codecs are supported. Every Codec is supported as a trait implementing respective 'encode' and 'decode' functions. Support for different 'encoding rules' will be implemented in this crate and then the derive macros will utilize this code to actually generate the encoding support for Rust Structures generated by the compiler above.

  3. asn1_codecs_derive docs.rs: This crate provides the derive macros for the codecs in asn-codecs. The code generated using asn-compiler can be directed to derive appropriate codecs by passing the flags during compilation.

Supported Codecs

  • APER
  • UPER

Supported Protocols

Following protocols are currently supported.

  1. RANAP - Code generation and RANAP PDU encode/decode.
  2. S1AP - Code generation and S1AP PDU decode.
  3. NGAP - Code generation and NGAP PDU encode/decode.
  4. E2AP - Code generation
  5. SUPL - Code generation
  6. RRC - Code generation and RRC PDU decode.
  7. E2SM - Code generation and encode/decode functionality.

Getting Started

build.rs Support

Typically the compiler can be invoked also using build.rs mechanism. An example build.rs is provided in the examples/ sub project. And the code generated through this build.rs can be integrated into your project. Examples of that is provided in examples/tests/ directory.

Using CLI tool

A tool hampi-rs-asn1c can be installed using cargo install asn1-compiler and then following the CLI usage.

cargo install asn1-compiler
hampi-rs-asn1c --help

Running Test Cases

  1. Test cases can be run through cargo test.

Generating ASN.1 spec files

Currently there are two ways of generating the 'ASN.1' spec files from the '.docx' specifications (This mainly applies to 3GPP specifications).

  1. Using the script inside examples/specs/parse_specs.py. This is recommended way. (note: this requires installation of docx or python-docx in the case of Python3).
  2. Using the rust binary extract-asn-spec. Note: this is not the recommended way and your mileage may vary. Eventual goal is to make this the default way - so as to also have a build.rs integration. But this is for now a work in progress. This is not available by default and is enabled only with a feature flag rs-specs-gen.

License

Licensed under either of

Dependencies

~2.5MB
~59K SLoC