cert rdn: fix struct hierarchy

master
occheung 2020-11-11 17:13:45 +08:00
parent 65220dbb46
commit 7229a56eef
2 changed files with 46 additions and 22 deletions

View File

@ -328,7 +328,7 @@ pub struct AlgorithmIdentifier<'a> {
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct Name<'a> { pub struct Name<'a> {
pub relative_distinguished_name: Vec<AttributeTypeAndValue<'a>> pub relative_distinguished_name: Vec<RelativeDistinguishedName<'a>>
} }
impl<'a> PartialEq for Name<'a> { impl<'a> PartialEq for Name<'a> {
@ -344,6 +344,11 @@ impl<'a> PartialEq for Name<'a> {
} }
} }
#[derive(Debug, Clone, PartialEq)]
pub struct RelativeDistinguishedName<'a> {
pub type_and_attributes: Vec<AttributeTypeAndValue<'a>>
}
#[derive(Debug, Clone, PartialEq)] #[derive(Debug, Clone, PartialEq)]
pub struct AttributeTypeAndValue<'a> { pub struct AttributeTypeAndValue<'a> {
pub attribute_type: &'a [u8], // OID pub attribute_type: &'a [u8], // OID

View File

@ -32,6 +32,7 @@ use crate::certificate::{
Name as Asn1DerName, Name as Asn1DerName,
AttributeTypeAndValue as Asn1DerAttribute, AttributeTypeAndValue as Asn1DerAttribute,
GeneralName as Asn1DerGeneralName, GeneralName as Asn1DerGeneralName,
RelativeDistinguishedName as Asn1DerRDN,
}; };
use crate::oid; use crate::oid;
@ -812,10 +813,10 @@ pub fn parse_asn1_der_oid(bytes: &[u8]) -> IResult<&[u8], &[u8]> {
// Parser for Name, applicable to issuer and subject field of TBS cert. // Parser for Name, applicable to issuer and subject field of TBS cert.
pub fn parse_asn1_der_name(bytes: &[u8]) -> IResult<&[u8], Asn1DerName> { pub fn parse_asn1_der_name(bytes: &[u8]) -> IResult<&[u8], Asn1DerName> {
let (rest, mut rdn_sequence) = parse_asn1_der_sequence(bytes)?; let (rest, mut rdn_sequence) = parse_asn1_der_sequence(bytes)?;
let mut attributes_vec: Vec<Asn1DerAttribute> = Vec::new(); let mut attributes_vec: Vec<Asn1DerRDN> = Vec::new();
while rdn_sequence.len() != 0 { while rdn_sequence.len() != 0 {
let (rem, attribute) = parse_asn1_der_attribute_type_and_value( let (rem, attribute) = parse_asn1_der_relative_distinguished_name(
rdn_sequence rdn_sequence
)?; )?;
rdn_sequence = rem; rdn_sequence = rem;
@ -830,19 +831,37 @@ pub fn parse_asn1_der_name(bytes: &[u8]) -> IResult<&[u8], Asn1DerName> {
)) ))
} }
// Parser for Relative Distinguished Name (RDN)
pub fn parse_asn1_der_relative_distinguished_name(bytes: &[u8]) -> IResult<&[u8], Asn1DerRDN> {
let (rest, mut attribute_set) = parse_asn1_der_set(bytes)?;
let mut attributes_vec: Vec<Asn1DerAttribute> = Vec::new();
while attribute_set.len() != 0 {
let (rem, attribute) = parse_asn1_der_attribute_type_and_value(
attribute_set
)?;
attribute_set = rem;
attributes_vec.push(attribute);
}
Ok((
rest,
Asn1DerRDN {
type_and_attributes: attributes_vec
}
))
}
// Parser for AttributeTypeAndValue struct, typically wrapped inside Name struct // Parser for AttributeTypeAndValue struct, typically wrapped inside Name struct
pub fn parse_asn1_der_attribute_type_and_value(bytes: &[u8]) -> IResult<&[u8], Asn1DerAttribute> { pub fn parse_asn1_der_attribute_type_and_value(bytes: &[u8]) -> IResult<&[u8], Asn1DerAttribute> {
let (rest, set) = parse_asn1_der_set(bytes)?; let (rest, set) = parse_asn1_der_sequence(bytes)?;
let (_, attribute) = complete(
parse_asn1_der_sequence
)(set)?;
let (_, (oid, (tag_val, _, value))) = complete( let (_, (oid, (tag_val, _, value))) = complete(
tuple(( tuple((
parse_asn1_der_oid, parse_asn1_der_oid,
parse_asn1_der_object parse_asn1_der_object
)) ))
)(attribute)?; )(set)?;
// Verify that tag_val is either "PrintableString or UTF8String" // Verify that tag_val is either "PrintableString or UTF8String"
if tag_val != 0x13 && tag_val != 0x0C { if tag_val != 0x13 && tag_val != 0x0C {