1 个不稳定版本

0.1.0 2021年11月8日

#4#aper

自定义许可

78KB
2K SLoC

Hampi - Rust ASN.1 工具包

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

此项目的目标是实现一个在 Rust 中的 ASN.1 编译器,该编译器可以生成不同 ASN.1 规范的 Rust 绑定,这些绑定可用于 Rust 中的各种协议实现。还计划实现不同的 ASN.1 编码规则,如 DER、BER、PER,作为 ASN.1 编解码器。

尽管拥有一个完全符合 ASN.1 编译器是非常理想的,但项目的初期重点是能够生成可以在其他软件中使用的代码。第一个目标是与 3GPP 规范合作,如无线网络接入协议 (RANAP)、S1 应用协议 (S1AP) 和 NG 应用协议 (NGAP)。因此,当前的实现也侧重于这些规范使用的编解码器,即对齐打包编码规则 (APER)。

此实现的目标用例与 asn1c 编译器的目标用例类似,该编译器从 ASN.1 规范生成 C 绑定。

此项目分为三个包 -

  1. asn1-compiler docs.rs:此包提供了实际的 ASN.1 编译器。通常,一个实用工具(hampi-rs-asn1c)将根据 ASN.1 规范生成 Rust 结构。编译器提供了与 3GPP 规范一起工作的基本功能,包括参数化类型、信息对象类和类型约束。

  2. asn1-codecs docs.rs:此包提供对各个 ASN.1 规范支持的编码的支持。目前支持基本的 APER/UPER 编解码器。每个编解码器都作为一个实现相应 'encode' 和 'decode' 函数的 trait 支持。此包将实现不同的 '编码规则',然后 derive 宏将利用此代码为上述编译器生成的 Rust 结构生成编码支持。

  3. asn1_codecs_derive docs.rs:本软件包提供了 derive 宏,用于在 asn-codecs 中的编解码器。使用 asn-compiler 生成的代码可以通过在编译时传递标志来指定适当的编解码器。

支持的编解码器

  • A PER
  • A UPER

支持的协议

以下协议目前受到支持。

  1. RANAP - 代码生成和 RANAP PDU 编码/解码。
  2. S1AP - 代码生成和 S1AP PDU 解码。
  3. NGAP - 代码生成和 NGAP PDU 编码/解码。
  4. E2AP - 代码生成
  5. SUPL - 代码生成
  6. RRC - 代码生成和 RRC PDU 解码。
  7. E2SM - 代码生成和编码/解码功能。

入门指南

build.rs 支持

通常也可以使用 build.rs 机制调用编译器。在 examples/ 子项目中提供了一个示例 build.rs。通过此 build.rs 生成的代码可以集成到您的项目中。示例在 examples/tests/ 目录中提供。

使用 CLI 工具

可以使用 hampi-rs-asn1c 工具,通过 cargo install asn1-compiler 安装,然后按照 CLI 使用说明进行操作。

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

运行测试用例

  1. 可以通过 cargo test 运行测试用例。

生成 ASN.1 规范文件

目前有两种从 '.docx' 规范生成 'ASN.1' 规范文件的方法(这主要适用于 3GPP 规范)。

  1. 使用 examples/specs/parse_specs.py 中的脚本。这是推荐的方法。(注意:如果使用 Python3,则需要安装 docxpython-docx)。
  2. 使用 rust 二进制文件 extract-asn-spec。注意:这不是推荐的方法,效果可能因情况而异。最终目标是使其成为默认方法——以便也能在 build.rs 中进行集成。但目前这还是一个正在进行中的工作。默认情况下不可用,并且只有通过功能标志 rs-specs-gen 才可启用。

许可证

根据以下任何一个许可证授权

依赖项

~2.5MB
~59K SLoC