2个不稳定版本

0.2.0 2024年2月23日
0.1.0 2022年1月7日

11#ber-der

Download history 186771/week @ 2024-03-14 190230/week @ 2024-03-21 199999/week @ 2024-03-28 232485/week @ 2024-04-04 195315/week @ 2024-04-11 210310/week @ 2024-04-18 195338/week @ 2024-04-25 196985/week @ 2024-05-02 196188/week @ 2024-05-09 229525/week @ 2024-05-16 235852/week @ 2024-05-23 260795/week @ 2024-05-30 236202/week @ 2024-06-06 234659/week @ 2024-06-13 244039/week @ 2024-06-20 198141/week @ 2024-06-27

963,512 个月的下载量
980 个crate中(通过 asn1-rs)使用

MIT/Apache

6KB
86

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编写,速度快,并广泛使用零拷贝。在确保此crate的安全性和安全性方面进行了大量关注,包括设计(递归限制、防御性编程)、测试和模糊测试。它还旨在实现无panic。

此crate是对der-parser的重写,以提出更面向数据的API,并添加对序列化的通用支持。

许多想法借鉴自crypto/utils/dercrate(如Any/TryFrom/FromDer机制),进行了修改并合并到通用的BER/DERcrate中。感谢Tony Arcieri编写原始crate。

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等)可以组合使用,并使用此存储库的对象和方法。阅读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

许可证

根据以下任一许可证授权:

由您选择。

贡献

除非您明确表示,否则根据Apache-2.0许可证定义,您提交的任何有意用于包含在作品中的贡献,将根据上述方式双许可,不附加任何额外的条款或条件。

依赖项

~275–720KB
~17K SLoC