Rust OID处理库der-oid-macro的使用:高效解析与生成ASN.1对象标识符(OID)的宏工具
Rust OID处理库der-oid-macro的使用:高效解析与生成ASN.1对象标识符(OID)的宏工具
安装
在项目目录中运行以下Cargo命令:
cargo add der-oid-macro
或者在Cargo.toml中添加以下行:
der-oid-macro = "0.5.0"
使用示例
der-oid-macro提供了一个方便的宏来定义和解析OID(ASN.1对象标识符)。下面是一个完整的使用示例:
use der_oid_macro::oid;
// 定义OID常量
const OID_1_2_840_113549_1_1_1: const_oid::ObjectIdentifier = oid!(1.2.840.113549.1.1.1);
const OID_1_2_840_113549_1_1_11: const_oid::ObjectIdentifier = oid!(1.2.840.113549.1.1.11);
fn main() {
// 打印OID
println!("RSA加密OID: {}", OID_1_2_840_113549_1_1_1);
println!("SHA256withRSA签名OID: {}", OID_1_2_840_113549_1_1_11);
// 比较OID
assert_eq!(OID_1_2_840_113549_1_1_1, oid!(1.2.840.113549.1.1.1));
assert_ne!(OID_1_2_840_113549_1_1_1, OID_1_2_840_113549_1_1_11);
}
更多完整示例
use der_oid_macro::oid;
use const_oid::ObjectIdentifier;
// 定义常见加密算法的OID
const RSA_ENCRYPTION_OID: ObjectIdentifier = oid!(1.2.840.113549.1.1.1);
const SHA256_WITH_RSA_OID: ObjectIdentifier = oid!(1.2.840.113549.1.1.11);
const EC_PUBLIC_KEY_OID: ObjectIdentifier = oid!(1.2.840.10045.2.1);
const SECP256R1_OID: ObjectIdentifier = oid!(1.2.840.10045.3.1.7);
fn print_oid_info(oid: &ObjectIdentifier, name: &str) {
println!("{} OID: {}", name, oid);
println!(" Arc values: {:?}", oid.arcs().collect::<Vec<_>>());
}
fn main() {
// 打印各种加密算法的OID信息
print_oid_info(&RSA_ENCRYPTION_OID, "RSA加密");
print_oid_info(&SHA256_WITH_RSA_OID, "SHA256withRSA签名");
print_oid_info(&EC_PUBLIC_KEY_OID, "椭圆曲线公钥");
print_oid_info(&SECP256R1_OID, "secp256r1曲线");
// 动态创建和比较OID
let dynamic_oid = oid!(1.3.6.1.4.1);
println!("动态创建的OID: {}", dynamic_oid);
// OID匹配示例
match dynamic_oid {
oid if oid == oid!(1.3.6.1.4.1) => {
println!("匹配到企业OID分支");
}
_ => println!("未知OID"),
}
}
完整示例demo
下面是一个更完整的示例,展示如何使用der-oid-macro处理各种OID操作:
use der_oid_macro::oid;
use const_oid::ObjectIdentifier;
// 常用OID定义
const RSA_OID: ObjectIdentifier = oid!(1.2.840.113549.1.1.1);
const SHA256_RSA_OID: ObjectIdentifier = oid!(1.2.840.113549.1.1.11);
const EC_OID: ObjectIdentifier = oid!(1.2.840.10045.2.1);
const SECP256R1_OID: ObjectIdentifier = oid!(1.2.840.10045.3.1.7);
const CERTIFICATE_OID: ObjectIdentifier = oid!(1.2.840.113549.1.9.16.1.2);
// OID工具函数
fn describe_oid(oid: &ObjectIdentifier) {
println!("OID描述:");
println!(" 字符串表示: {}", oid);
println!(" 弧值: {:?}", oid.arcs().collect::<Vec<_>>());
println!(" 长度: {}", oid.arcs().count());
}
fn main() {
// 打印预定义OID信息
describe_oid(&RSA_OID);
describe_oid(&SHA256_RSA_OID);
describe_oid(&EC_OID);
describe_oid(&SECP256R1_OID);
// 动态创建OID
let custom_oid = oid!(1.3.6.1.4.1.99999);
println!("自定义OID: {}", custom_oid);
// OID比较
if custom_oid == oid!(1.3.6.1.4.1.99999) {
println!("自定义OID匹配成功");
}
// OID匹配模式
match CERTIFICATE_OID {
oid if oid == oid!(1.2.840.113549.1.9.16.1.2) => {
println!("这是X.509证书OID");
}
_ => println!("未知证书类型"),
}
// 从字符串解析OID
let parsed_oid: ObjectIdentifier = "1.2.840.113549.1.1.1".parse().unwrap();
assert_eq!(parsed_oid, RSA_OID);
}
特性
- 编译时OID验证
- 高效的内存表示
- 简单的宏语法定义OID
- 完整的OID比较和操作支持
许可证
该库采用MIT或Apache-2.0双重许可。
1 回复
Rust OID处理库der-oid-macro的使用指南
简介
der-oid-macro
是一个Rust宏工具库,专门用于高效解析和生成ASN.1对象标识符(OID)。它提供了编译时OID验证和高效的运行时表示,是处理X.509证书、密码学算法标识等场景的理想选择。
主要特性
- 编译时OID验证
- 零成本抽象
- 符合DER编码规范
- 友好的宏语法
安装
在Cargo.toml中添加依赖:
[dependencies]
der-oid-macro = "0.7"
基本用法
定义OID常量
use der_oid_macro::oid;
// 定义常见的OID
const RSA_ENCRYPTION_OID: const_oid::ObjectIdentifier = oid!(1.2.840.113549.1.1.1);
const SHA256_WITH_RSA_ENCRYPTION_OID: const_oid::ObjectIdentifier = oid!(1.2.840.113549.1.1.11);
模式匹配
use der::Decodable;
use der_oid_macro::oid;
fn handle_oid(oid: &const_oid::ObjectIdentifier) {
match oid {
oid!(1.2.840.113549.极好的1.1) => println!("RSA encryption"),
oid!(1.2.840.113549.1.1.11) => println!("SHA-256 with RSA encryption"),
_ => println!("Unknown OID"),
}
}
解析DER编码的OID
use der::{Decodable, Encodable};
use der_oid_macro::oid;
let der_bytes = oid!(1.2.840.10045.2.1).to_der().unwrap();
let parsed_oid = const_oid::ObjectIdentifier::from_der(&der_bytes).unwrap();
assert_eq!(parsed_oid, oid!(1.2.840.10045.2.1));
高级用法
自定义OID类型
use der_oid_macro::oid;
pub mod my_oids {
use super::*;
pub const MY_ALGORITHM: const_oid::ObjectIdentifier = oid!(1.3.6.1.4.1.54392);
pub const MY_EXTENSION: const_oid::ObjectIdentifier = oid!(1.3.6.1.4.1.54392.1);
}
与其它库集成
use der_oid_macro::oid;
use x509_cert::attr::AttributeTypeAndValue;
let attribute = AttributeTypeAndValue {
oid: oid!(2.5.4.3), // commonName
value: "example.com".into(),
};
错误处理
use der_oid_macro::oid;
// 无效的OID会在编译时报错
// const INVALID_OID: const_oid::ObjectIdentifier = oid!(0.39); // 编译错误
// 运行时处理未知OID
fn process_oid(oid: &const_oid::ObjectIdentifier) -> Result<(), &'static str> {
if oid == &oid!(1.2.840.113549.1.1.1) {
Ok(())
} else {
Err("Unsupported OID")
}
}
性能建议
- 尽可能使用
oid!
宏在编译时定义OID - 重复使用的OID应定义为常量
- 优先使用引用比较而非值比较
der-oid-macro
通过编译时处理提供了极高的运行时效率,是处理ASN.1 OID的理想选择。
完整示例demo
下面是一个完整的示例,展示如何使用der-oid-macro
处理OID:
use der_oid_macro::oid;
use der::{Decodable, Encodable};
use x509_cert::attr::AttributeTypeAndValue;
// 定义常用OID常量
const RSA_ENCRYPTION_OID: const_oid::ObjectIdentifier = oid!(1.2.840.113549.1.1.1);
const COMMON_NAME_OID: const_oid::ObjectIdentifier = oid!(2.5.4.3);
// 自定义OID模块
pub mod my_oids {
use super::*;
pub const CUSTOM_OID: const_oid::ObjectIdentifier = oid!(1.3.6.1.4.1.54392);
}
fn main() {
// 模式匹配示例
let oid = oid!(1.2.840.113549.1.1.1);
match_oid(&oid);
// 与x509_cert集成示例
let attr = create_attribute();
println!("Created attribute with OID: {:?}", attr.oid);
// DER编码/解码示例
let der_data = oid!(1.2.840.10045.2.1).to_der().unwrap();
let decoded_oid = const_oid::ObjectIdentifier::from_der(&der_data).unwrap();
println!("Decoded OID: {:?}", decoded_oid);
// 错误处理示例
if let Err(e) = check_supported_oid(&oid!(1.3.6.1.4.1.54392)) {
println!("Error: {}", e);
}
}
fn match_oid(oid: &const_oid::ObjectIdentifier) {
match oid {
oid!(1.2.840.113549.1.1.1) => println!("Found RSA encryption OID"),
oid!(2.5.4.3) => println!("Found commonName OID"),
_ => println!("Unknown OID: {:?}", oid),
}
}
fn create_attribute() -> AttributeTypeAndValue {
AttributeTypeAndValue {
oid: COMMON_NAME_OID,
value: "example.com".into(),
}
}
fn check_supported_oid(oid: &const_oid::ObjectIdentifier) -> Result<(), &'static str> {
if oid == &RSA_ENCRYPTION_OID {
Ok(())
} else {
Err("Unsupported OID")
}
}
这个完整示例展示了:
- 定义OID常量
- 使用模式匹配处理不同OID
- 与x509_cert库集成
- DER编码/解码OID
- 错误处理
- 模块化组织自定义OID
所有用法都遵循了性能建议:在编译时定义OID,使用常量存储常用OID,并通过引用进行比较。