在Rust中用预编码的DER部分创建DER编码的ASN.1



我想在Rust中DER编码以下ASN.1结构:

issuerAndSubject ::= SEQUENCE {
issuer     Name,
subject    Name
}

Name结构在RFC5280中定义,比较复杂。我不想在Rust中重新定义这个

我已经在rust-openssl中创建了issuersubject:

let issuer: &X509NameRef = get_issuer();
let subject: &X509NameRef = get_subject();

我可以很容易地得到这些对象的DER编码:

let issuer_der = issuer.to_der().unwrap();
let subject_der = subject.to_der().unwrap();

,但我需要将它们插入SEQUENCE。我更倾向于使用Rust的asn1 crate,它允许创建SEQUENCEs:

let ias_der = asn1::write(|w| {
w.write_element(
&asn1::SequenceWriter::new(&|w| {
w.write_element(&issuer_der);   // I know, this doesn't work, but
w.write_element(&subject_der);  // how do I do it?
}));
});

是否有一种方法来创建一个序列与der编码的数据?

您可以使用device宏并使用一个简单的结构:

#[derive(asn1::Asn1Read, asn1::Asn1Write, Debug)]
struct Signature {
issuer: u64,
subject: u64,
}
fn main() {
let data = asn1::write_single(&Signature{issuer: 0, subject: 1});
let sig: Signature = asn1::parse_single::<Signature>(data.as_slice()).unwrap();
let data = asn1::write_single(&sig);
eprintln!("{:?}", sig);
eprintln!("{:?}", data);
}