Skip to content

Commit

Permalink
Include the tag class in BerObjectContent::Unknown (closes #47)
Browse files Browse the repository at this point in the history
  • Loading branch information
pc-anssi committed Sep 3, 2021
1 parent c235e3a commit 5f76d92
Show file tree
Hide file tree
Showing 7 changed files with 31 additions and 15 deletions.
6 changes: 3 additions & 3 deletions src/ber/ber.rs
Expand Up @@ -189,7 +189,7 @@ pub enum BerObjectContent<'a> {
Private(BerObjectHeader<'a>, &'a [u8]),

/// Unknown object: object tag (copied from header), and raw content
Unknown(BerTag, &'a [u8]),
Unknown(BerClass, BerTag, &'a [u8]),
}

impl fmt::Display for BerClass {
Expand Down Expand Up @@ -827,7 +827,7 @@ impl<'a> BerObjectContent<'a> {
BerObjectContent::ObjectDescriptor(s) |
BerObjectContent::GraphicString(s) |
BerObjectContent::GeneralString(s) |
BerObjectContent::Unknown(_,s) |
BerObjectContent::Unknown(_, _,s) |
BerObjectContent::Private(_,s) => Ok(s),
_ => Err(BerError::BerTypeError),
}
Expand Down Expand Up @@ -876,7 +876,7 @@ impl<'a> BerObjectContent<'a> {
BerObjectContent::GraphicString(_) => BerTag::GraphicString,
BerObjectContent::GeneralString(_) => BerTag::GeneralString,
BerObjectContent::Tagged(_,x,_) |
BerObjectContent::Unknown(x,_) => *x,
BerObjectContent::Unknown(_, x,_) => *x,
&BerObjectContent::Private(ref hdr, _) => hdr.tag,
BerObjectContent::Optional(Some(obj)) => obj.content.tag(),
BerObjectContent::Optional(None) => BerTag(0x00), // XXX invalid !
Expand Down
4 changes: 2 additions & 2 deletions src/ber/parser.rs
Expand Up @@ -1175,7 +1175,7 @@ pub fn parse_ber_recursive(i: &[u8], max_depth: usize) -> BerResult {
}
_ => {
let (rem, content) = ber_get_object_content(rem, &hdr, max_depth)?;
let content = BerObjectContent::Unknown(hdr.tag, content);
let content = BerObjectContent::Unknown(hdr.class, hdr.tag, content);
let obj = BerObject::from_header_and_content(hdr, content);
return Ok((rem, obj));
}
Expand All @@ -1184,7 +1184,7 @@ pub fn parse_ber_recursive(i: &[u8], max_depth: usize) -> BerResult {
Ok((rem, content)) => Ok((rem, BerObject::from_header_and_content(hdr, content))),
Err(Err::Error(BerError::UnknownTag)) => {
let (rem, content) = ber_get_object_content(rem, &hdr, max_depth)?;
let content = BerObjectContent::Unknown(hdr.tag, content);
let content = BerObjectContent::Unknown(hdr.class, hdr.tag, content);
let obj = BerObject::from_header_and_content(hdr, content);
Ok((rem, obj))
}
Expand Down
2 changes: 1 addition & 1 deletion src/ber/print.rs
Expand Up @@ -143,7 +143,7 @@ impl<'a> fmt::Debug for PrettyBer<'a> {
writeln!(f, "]")?;
Ok(())
},
BerObjectContent::Unknown(tag,o) => writeln!(f, "Unknown({:?},{:x?})", tag, o),
BerObjectContent::Unknown(class, tag,o) => writeln!(f, "Unknown({:?},{:?},{:x?})", class, tag, o),
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/ber/serialize.rs
Expand Up @@ -161,7 +161,7 @@ fn ber_encode_object_content<'a, W: Write + Default + AsRef<[u8]> + 'a>(
// XXX wrong, we should wrap it!
ber_encode_object(inner)(out)
}
BerObjectContent::Unknown(_tag, s) => slice(s)(out),
BerObjectContent::Unknown(_, _, s) => slice(s)(out),
}
}

Expand Down
4 changes: 2 additions & 2 deletions src/der/parser.rs
Expand Up @@ -567,7 +567,7 @@ fn der_read_element_content_recursive<'a>(
}
_ => {
let (i, content) = ber_get_object_content(i, &hdr, max_depth)?;
let content = DerObjectContent::Unknown(hdr.tag, content);
let content = DerObjectContent::Unknown(hdr.class, hdr.tag, content);
let obj = DerObject::from_header_and_content(hdr, content);
return Ok((i, obj));
}
Expand All @@ -576,7 +576,7 @@ fn der_read_element_content_recursive<'a>(
Ok((rem, content)) => Ok((rem, DerObject::from_header_and_content(hdr, content))),
Err(Err::Error(BerError::UnknownTag)) => {
let (rem, content) = ber_get_object_content(i, &hdr, max_depth)?;
let content = DerObjectContent::Unknown(hdr.tag, content);
let content = DerObjectContent::Unknown(hdr.class, hdr.tag, content);
let obj = DerObject::from_header_and_content(hdr, content);
Ok((rem, obj))
}
Expand Down
2 changes: 1 addition & 1 deletion tests/der_parser.rs
Expand Up @@ -308,7 +308,7 @@ fn test_der_contextspecific() {
let expected = DerObject {
header: BerObjectHeader::new(BerClass::ContextSpecific, 1, BerTag(0), 3)
.with_raw_tag(Some(&[0xa0])),
content: BerObjectContent::Unknown(BerTag(0), &bytes[2..]),
content: BerObjectContent::Unknown(BerClass::ContextSpecific, BerTag(0), &bytes[2..]),
};
assert_eq!(parse_der(&bytes), Ok((empty, expected)));
}
Expand Down
26 changes: 21 additions & 5 deletions tests/primitive.rs
Expand Up @@ -89,13 +89,21 @@ fn test_unknown_tag() {
assert!(res.0.is_empty());
assert_eq!(
res.1,
BerObject::from_obj(BerObjectContent::Unknown(BerTag(0x1d), &bytes[2..]))
BerObject::from_obj(BerObjectContent::Unknown(
BerClass::Universal,
BerTag(0x1d),
&bytes[2..]
))
);
let res = parse_der(&bytes).expect("parsing failed");
assert!(res.0.is_empty());
assert_eq!(
res.1,
BerObject::from_obj(BerObjectContent::Unknown(BerTag(0x1d), &bytes[2..]))
BerObject::from_obj(BerObjectContent::Unknown(
BerClass::Universal,
BerTag(0x1d),
&bytes[2..]
))
);
}

Expand All @@ -109,7 +117,7 @@ fn test_unknown_context_specific() {
BerObject {
header: BerObjectHeader::new(BerClass::ContextSpecific, 0, BerTag(0), 1)
.with_raw_tag(Some(&[0x80])),
content: BerObjectContent::Unknown(BerTag(0x0), &bytes[2..]),
content: BerObjectContent::Unknown(BerClass::ContextSpecific, BerTag(0x0), &bytes[2..]),
}
);
}
Expand All @@ -124,7 +132,11 @@ fn test_unknown_long_tag() {
BerObject {
header: BerObjectHeader::new(BerClass::ContextSpecific, 0, BerTag(0x22), 1)
.with_raw_tag(Some(&[0x9f, 0x22])),
content: BerObjectContent::Unknown(BerTag(0x22), &bytes[3..]),
content: BerObjectContent::Unknown(
BerClass::ContextSpecific,
BerTag(0x22),
&bytes[3..]
),
}
);
}
Expand All @@ -139,7 +151,11 @@ fn test_unknown_longer_tag() {
BerObject {
header: BerObjectHeader::new(BerClass::ContextSpecific, 0, BerTag(0x1122), 1)
.with_raw_tag(Some(&[0x9f, 0xa2, 0x22])),
content: BerObjectContent::Unknown(BerTag(0x1122), &bytes[4..]),
content: BerObjectContent::Unknown(
BerClass::ContextSpecific,
BerTag(0x1122),
&bytes[4..]
),
}
);
}
Expand Down

0 comments on commit 5f76d92

Please sign in to comment.