21个版本

0.7.0 2024年6月27日
0.6.1 2023年11月10日
0.5.9 2023年8月8日
0.5.8 2023年3月3日
0.1.2 2021年11月13日

#asn-1 中排名第 32

Download history 17/week @ 2024-04-16 54/week @ 2024-04-23 25/week @ 2024-04-30 17/week @ 2024-05-07 14/week @ 2024-05-14 87/week @ 2024-05-21 87/week @ 2024-05-28 194/week @ 2024-06-04 137/week @ 2024-06-11 255/week @ 2024-06-18 753/week @ 2024-06-25 1135/week @ 2024-07-02 777/week @ 2024-07-09 591/week @ 2024-07-16 1115/week @ 2024-07-23 769/week @ 2024-07-30

每月下载量 3,458
2 个crate中使用(通过 types_lte_3gpp

Apache-2.0 OR MIT

190KB
4.5K 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 绑定。

此项目分为三个crate -

  1. asn1-compiler docs.rs:此crate提供实际的 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:此库为 asn-codecs 中的编解码器提供 derive 宏。使用 asn-compiler 生成的代码可以通过在编译时传递标志来指向适当的编解码器。

支持的编码器

  • A PER
  • 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' 规范(主要适用于 3GPP 规范)生成 'ASN.1' 规范文件的方法。

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

许可证

根据以下之一获得许可:

依赖项

~2.5MB
~60K SLoC