1个不稳定版本
0.1.0 | 2021年11月8日 |
---|
#1997 在 编码
28KB
672 行
Hampi - Rust ASN.1工具包
本项目的目标是实现一个Rust的ASN.1编译器,该编译器可以生成不同ASN.1规范的Rust绑定,这些绑定可以用于Rust的各种协议实现。还计划实现DER、BER、PER等不同的ASN.1编码规则作为ASN.1编码器。
虽然拥有一个完全符合规范的ASN.1编译器是很有吸引力的,但项目的初步重点是能够生成可以在其他软件中使用的代码。首要目标是与3GPP规范(如无线网络接入协议(RANAP)、S1应用协议(S1AP)和NG应用协议(NGAP))合作。因此,当前的实现也专注于这些规范使用的编码器,即对齐打包编码规则(APER)。
本实现的目标用例与asn1c编译器的目标用例相似,asn1c编译器从ASN.1规范生成C绑定。
本项目分为三个crate -
-
asn1-compiler
: 此crate提供实际的ASN.1编译器。通常,一个实用工具(hampi-rs-asn1c
)将从ASN.1规范生成Rust结构。编译器提供与3GPP规范一起工作的基本功能,包括参数化类型、信息对象类和类型约束。 -
asn1-codecs
: 在此crate中提供对各个ASN.1规范支持的不同编码的支持。目前支持基本的APER/UPER编码器。每个编码器都作为实现相应“encode”和“decode”函数的trait支持。将在本crate中实现不同的“编码规则”支持,然后derive宏将利用此代码为上述编译器生成的Rust结构生成实际的编码支持。 -
asn1_codecs_derive
:此crate提供了derive
宏,用于在asn-codecs
中的编解码器。使用asn-compiler
生成的代码,在编译时可以通过传递标志来指定适当的编解码器。
支持的编解码器
- APER
- UPER
支持的协议
以下协议目前得到支持。
- RANAP - 代码生成和RANAP PDU编解码。
- S1AP - 代码生成和S1AP PDU解码。
- NGAP - 代码生成和NGAP PDU编解码。
- E2AP - 代码生成
- SUPL - 代码生成
- RRC - 代码生成和RRC PDU解码。
- 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
运行测试用例
- 可以通过
cargo test
运行测试用例。
生成ASN.1规范文件
目前有两种从'.docx'规范(主要适用于3GPP规范)生成'ASN.1'规范文件的方法。
- 使用
examples/specs/parse_specs.py
中的脚本。这是推荐的方法。(注意:在Python3的情况下,这需要安装docx
或python-docx
)。 - 使用rust二进制文件
extract-asn-spec
。注意:这不是推荐的方法,效果可能因设备而异。最终目标是将其作为默认方法——以便也有build.rs
集成。但到目前为止,这还是一个进行中的工作。默认情况下不可用,并且只能通过功能标志rs-specs-gen
启用。
许可协议
受以下协议中的任一协议许可:
- Apache License,版本2.0(LICENSE-Apache 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT License(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
依赖项
~2.5MB
~58K SLoC