6 个版本 (重大更改)
0.5.1 | 2024年7月31日 |
---|---|
0.5.0 | 2024年2月23日 |
0.4.0 | 2022年6月20日 |
0.3.0 | 2022年5月24日 |
0.1.0 | 2022年1月27日 |
#11 在 #ber-der
1,365,510 每月下载量
在 1,015 个包中使用 (通过 asn1-rs)
25KB
656 行
BER/DER 解析器/编码器
一组用于基本编码规则 (BER [X.690]) 和选定编码规则 (DER [X.690]) 格式的解析器/编码器,使用 nom 解析器组合框架实现。
它完全用Rust编写,速度快,大量使用零拷贝。在安全性、可靠性方面投入了大量精力,包括设计(递归限制、防御性编程)、测试和模糊测试。它还旨在实现无panic。
这个包是 der-parser 的重写,旨在提供更面向数据的API,并添加对序列化的通用支持。
从 crypto/utils/der 包(如 Any
/TryFrom
/FromDer
机制)中借鉴了许多想法,并合并到一个通用的BER/DER包中。感谢 Tony Arcieri 编写原始包。
BER/DER 解析器
BER代表基本编码规则,定义在 [X.690]。它定义了一组规则来在二进制中对ASN.1 [X.680] 对象进行编码和解码。
[X.690] 还定义了选定编码规则 (DER),它是BER,增加了规则以确保对象的规范和明确的二进制表示。
选择使用哪一种通常由基于BER或DER的数据格式规范指导:例如,X.509使用DER作为编码表示。
解析的主要特性是FromBer
和FromDer
特性。这些特性提供了解析二进制输入的方法,并返回剩余的(未解析的)字节和解析对象,或一个错误。
解析器遵循nom的接口,并且ParseResult
对象是nom::IResult
的专用版本。这意味着大多数nom
组合子(如map
、many0
等)可以组合使用,以及此crate的对象和方法。阅读nom文档可能有助于理解如何编写和组合解析器以及使用输出。
支持的Rust最低版本: 1.63.0
食谱
有关更多示例和食谱,请参阅doc::recipes和doc::derive。
有关调试解析器的建议和工具,请参阅doc::debug。
示例
解析2个BER整数
use asn1_rs::{Integer, FromBer};
let bytes = [ 0x02, 0x03, 0x01, 0x00, 0x01,
0x02, 0x03, 0x01, 0x00, 0x00,
];
let (rem, obj1) = Integer::from_ber(&bytes).expect("parsing failed");
let (rem, obj2) = Integer::from_ber(&bytes).expect("parsing failed");
assert_eq!(obj1, Integer::from_u32(65537));
在上面的示例中,使用了泛型Integer
类型。此类型可以包含任意大小的整数,但不提供简单的API来操作这些数字。
在大多数情况下,整数要么有上限,要么预期可以放入原始类型。要获取简单值,只需使用原始类型的from_ber
/from_der
方法即可
use asn1_rs::FromBer;
let bytes = [ 0x02, 0x03, 0x01, 0x00, 0x01,
0x02, 0x03, 0x01, 0x00, 0x00,
];
let (rem, obj1) = u32::from_ber(&bytes).expect("parsing failed");
let (rem, obj2) = u32::from_ber(&rem).expect("parsing failed");
assert_eq!(obj1, 65537);
assert_eq!(obj2, 65536);
如果解析成功,但整数无法放入预期的类型,则方法将返回一个IntegerTooLarge
错误。
BER/DER编码器
BER/DER编码与解码是对称的,使用ToBer
和ToDer
特性。这些特性提供了将编码内容写入具有io::Write
特质的对象的方法,或者返回一个包含编码数据的分配的Vec<u8>
。如果序列化失败,则返回一个错误。
示例
写入2个BER整数
use asn1_rs::{Integer, ToDer};
let mut writer = Vec::new();
let obj1 = Integer::from_u32(65537);
let obj2 = Integer::from_u32(65536);
let _ = obj1.write_der(&mut writer).expect("serialization failed");
let _ = obj2.write_der(&mut writer).expect("serialization failed");
let bytes = &[ 0x02, 0x03, 0x01, 0x00, 0x01,
0x02, 0x03, 0x01, 0x00, 0x00,
];
assert_eq!(&writer, bytes);
与FromBer
/FromDer
类似,也为原始类型实现了序列化方法
use asn1_rs::ToDer;
let mut writer = Vec::new();
let _ = 65537.write_der(&mut writer).expect("serialization failed");
let _ = 65536.write_der(&mut writer).expect("serialization failed");
let bytes = &[ 0x02, 0x03, 0x01, 0x00, 0x01,
0x02, 0x03, 0x01, 0x00, 0x00,
];
assert_eq!(&writer, bytes);
如果解析成功,但整数无法放入预期的类型,则方法将返回一个IntegerTooLarge
错误。
更改
请参阅CHANGELOG.md
。
参考
更改
有关升级主要版本的说明,请参阅CHANGELOG.md
和UPGRADING.md
。
许可证
根据以下任一项许可
- Apache License,版本2.0(LICENSE-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)
- 麻省理工学院许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确表示 otherwise,否则您有意提交以供包括在作品中的任何贡献,如Apache-2.0许可证中定义,应双许可如上所述,不附加任何其他条款或条件。
依赖项
~340–780KB
~17K SLoC