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")
    }
}

性能建议

  1. 尽可能使用oid!宏在编译时定义OID
  2. 重复使用的OID应定义为常量
  3. 优先使用引用比较而非值比较

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")
    }
}

这个完整示例展示了:

  1. 定义OID常量
  2. 使用模式匹配处理不同OID
  3. 与x509_cert库集成
  4. DER编码/解码OID
  5. 错误处理
  6. 模块化组织自定义OID

所有用法都遵循了性能建议:在编译时定义OID,使用常量存储常用OID,并通过引用进行比较。

回到顶部