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

Download history 211643/week @ 2024-05-01 201795/week @ 2024-05-08 241412/week @ 2024-05-15 247250/week @ 2024-05-22 273484/week @ 2024-05-29 262795/week @ 2024-06-05 253774/week @ 2024-06-12 243008/week @ 2024-06-19 260790/week @ 2024-06-26 247276/week @ 2024-07-03 286587/week @ 2024-07-10 329357/week @ 2024-07-17 320871/week @ 2024-07-24 323297/week @ 2024-07-31 346558/week @ 2024-08-07 305822/week @ 2024-08-14

1,365,510 每月下载量
1,015 个包中使用 (通过 asn1-rs)

MIT/Apache

25KB
656

License: MIT Apache License 2.0 docs.rs crates.io Download numbers Github CI Minimum rustc version

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作为编码表示。

解析的主要特性是FromBerFromDer特性。这些特性提供了解析二进制输入的方法,并返回剩余的(未解析的)字节和解析对象,或一个错误。

解析器遵循nom的接口,并且ParseResult对象是nom::IResult的专用版本。这意味着大多数nom组合子(如mapmany0等)可以组合使用,以及此crate的对象和方法。阅读nom文档可能有助于理解如何编写和组合解析器以及使用输出。

支持的Rust最低版本: 1.63.0

食谱

有关更多示例和食谱,请参阅doc::recipesdoc::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编码与解码是对称的,使用ToBerToDer特性。这些特性提供了将编码内容写入具有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

参考

  • [X.680] 抽象语法表示法一(ASN.1):基本表示规范。
  • [X.690] ASN.1编码规则:基本编码规则(BER)、规范编码规则(CER)和特有编码规则(DER)的规范。

更改

有关升级主要版本的说明,请参阅CHANGELOG.mdUPGRADING.md

许可证

根据以下任一项许可

由您选择。

贡献

除非您明确表示 otherwise,否则您有意提交以供包括在作品中的任何贡献,如Apache-2.0许可证中定义,应双许可如上所述,不附加任何其他条款或条件。

依赖项

~340–780KB
~17K SLoC