aboutsummaryrefslogtreecommitdiff
path: root/src/ber/parser.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/ber/parser.rs')
-rw-r--r--src/ber/parser.rs44
1 files changed, 16 insertions, 28 deletions
diff --git a/src/ber/parser.rs b/src/ber/parser.rs
index ace4937..81ccef8 100644
--- a/src/ber/parser.rs
+++ b/src/ber/parser.rs
@@ -7,8 +7,6 @@ use nom::multi::{many0, many_till};
use nom::number::streaming::be_u8;
use nom::{Err, Needed, Offset};
use rusticata_macros::{combinator::parse_hex_to_u64, custom_check};
-use std::borrow::Cow;
-use std::convert::{Into, TryFrom};
/// Default maximum recursion limit
pub const MAX_RECURSION: usize = 50;
@@ -280,7 +278,7 @@ fn ber_read_content_enum(i: &[u8], len: usize) -> BerResult<BerObjectContent> {
fn ber_read_content_utf8string(i: &[u8], len: usize) -> BerResult<BerObjectContent> {
let (i, bytes) = take(len)(i)?;
- let s = std::str::from_utf8(bytes)
+ let s = core::str::from_utf8(bytes)
.map_err(|_| Err::Error(BerError::StringInvalidCharset))
.map(|s| BerObjectContent::UTF8String(s))?;
Ok((i, s))
@@ -345,7 +343,7 @@ fn ber_read_content_numericstring<'a>(i: &'a [u8], len: usize) -> BerResult<BerO
if !bytes.iter().all(is_numeric) {
return Err(Err::Error(BerError::StringInvalidCharset));
}
- let s = std::str::from_utf8(bytes)
+ let s = core::str::from_utf8(bytes)
.map_err(|_| Err::Error(BerError::StringInvalidCharset))
.map(|s| BerObjectContent::NumericString(s))?;
Ok((i, s))
@@ -361,7 +359,7 @@ fn ber_read_content_visiblestring<'a>(i: &'a [u8], len: usize) -> BerResult<BerO
if !bytes.iter().all(is_visible) {
return Err(Err::Error(BerError::StringInvalidCharset));
}
- let s = std::str::from_utf8(bytes)
+ let s = core::str::from_utf8(bytes)
.map_err(|_| Err::Error(BerError::StringInvalidCharset))
.map(|s| BerObjectContent::VisibleString(s))?;
Ok((i, s))
@@ -395,7 +393,7 @@ fn ber_read_content_printablestring<'a>(
if !bytes.iter().all(is_printable) {
return Err(Err::Error(BerError::StringInvalidCharset));
}
- let s = std::str::from_utf8(bytes)
+ let s = core::str::from_utf8(bytes)
.map_err(|_| Err::Error(BerError::StringInvalidCharset))
.map(|s| BerObjectContent::PrintableString(s))?;
Ok((i, s))
@@ -416,7 +414,7 @@ fn ber_read_content_ia5string<'a>(i: &'a [u8], len: usize) -> BerResult<BerObjec
if !bytes.iter().all(u8::is_ascii) {
return Err(Err::Error(BerError::StringInvalidCharset));
}
- let s = std::str::from_utf8(bytes)
+ let s = core::str::from_utf8(bytes)
.map_err(|_| Err::Error(BerError::StringInvalidCharset))
.map(|s| BerObjectContent::IA5String(s))?;
Ok((i, s))
@@ -432,7 +430,7 @@ fn ber_read_content_utctime<'a>(i: &'a [u8], len: usize) -> BerResult<BerObjectC
if !bytes.iter().all(is_visible) {
return Err(Err::Error(BerError::StringInvalidCharset));
}
- let s = std::str::from_utf8(bytes)
+ let s = core::str::from_utf8(bytes)
.map_err(|_| Err::Error(BerError::StringInvalidCharset))
.map(|s| BerObjectContent::UTCTime(s))?;
Ok((i, s))
@@ -451,7 +449,7 @@ fn ber_read_content_generalizedtime<'a>(
if !bytes.iter().all(is_visible) {
return Err(Err::Error(BerError::StringInvalidCharset));
}
- let s = std::str::from_utf8(bytes)
+ let s = core::str::from_utf8(bytes)
.map_err(|_| Err::Error(BerError::StringInvalidCharset))
.map(|s| BerObjectContent::GeneralizedTime(s))?;
Ok((i, s))
@@ -995,22 +993,6 @@ where
}))(i)
}
-/// Parse an optional tagged object, applying function to get content
-///
-/// This function is deprecated, use
-/// [parse_ber_explicit_optional](fn.parse_ber_explicit_optional.html) instead.
-#[deprecated(
- since = "5.0.0",
- note = "Please use `parse_ber_explicit_optional` instead"
-)]
-#[inline]
-pub fn parse_ber_explicit<F>(i: &[u8], tag: BerTag, f: F) -> BerResult
-where
- F: Fn(&[u8]) -> BerResult,
-{
- parse_ber_explicit_optional(i, tag, f)
-}
-
/// Parse an implicit tagged object, applying function to read content
///
/// Note: unlike explicit tagged functions, the callback must be a *content* parsing function,
@@ -1184,10 +1166,16 @@ pub fn parse_ber_recursive(i: &[u8], max_depth: usize) -> BerResult {
custom_check!(i, l > MAX_OBJECT_SIZE, BerError::InvalidLength)?;
}
match hdr.class {
- BerClass::Universal | BerClass::Private => (),
+ BerClass::Universal => (),
+ BerClass::Private => {
+ let (rem, content) = ber_get_object_content(rem, &hdr, max_depth)?;
+ let content = BerObjectContent::Private(hdr.clone(), content);
+ let obj = BerObject::from_header_and_content(hdr, content);
+ return Ok((rem, obj));
+ }
_ => {
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));
}
@@ -1196,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))
}