Skip to content

Commit cd0da59

Browse files
committed
Update to der-parser 7.0 and asn1-rs, and remove chrono (closes #111)
1 parent fc3b804 commit cd0da59

12 files changed

+142
-166
lines changed

Cargo.toml

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,14 @@ verify = ["ring"]
3838
validate = []
3939

4040
[dependencies]
41+
asn1-rs = { version = "0.3", features=["datetime"] }
4142
base64 = "0.13"
42-
chrono = { version="0.4", default-features=false, features=["std"] }
4343
data-encoding = "2.2.1"
4444
lazy_static = "1.4"
4545
nom = "7.0"
46-
oid-registry = { version="0.2.0", features=["crypto", "x509"] }
46+
oid-registry = { version="0.4", features=["crypto", "x509"] }
4747
rusticata-macros = "4.0"
4848
ring = { version="0.16", optional=true }
49-
der-parser = { version = "6.0.0", features=["bigint"] }
49+
der-parser = { version = "7.0.0", features=["bigint"] }
5050
thiserror = "1.0"
51-
52-
[patch.crates-io]
53-
oid-registry = { git="https://github.com/rusticata/oid-registry" }
51+
time = { version="0.3", features=["formatting"] }

examples/print-cert.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use der_parser::ber::BerTag;
1+
use der_parser::der::Tag;
22
use der_parser::oid::Oid;
33
use nom::HexDisplay;
44
use std::cmp::min;
@@ -136,12 +136,12 @@ fn print_x509_digest_algorithm(alg: &AlgorithmIdentifier, level: usize) {
136136
indent = level
137137
);
138138
if let Some(parameter) = &alg.parameters {
139-
let s = match parameter.header.tag {
140-
BerTag::Oid => {
139+
let s = match parameter.tag() {
140+
Tag::Oid => {
141141
let oid = parameter.as_oid().unwrap();
142142
format_oid(oid)
143143
}
144-
_ => format!("{}", parameter.header.tag),
144+
_ => format!("{}", parameter.tag()),
145145
};
146146
println!("{:indent$}Parameter: <PRESENT> {}", "", s, indent = level);
147147
if let Ok(bytes) = parameter.as_slice() {

examples/print-crl.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ fn print_x509_digest_algorithm(alg: &AlgorithmIdentifier, level: usize) {
8383
println!(
8484
"{:indent$}Parameter: <PRESENT> {:?}",
8585
"",
86-
parameter.header.tag,
86+
parameter.tag(),
8787
indent = level
8888
);
8989
if let Ok(bytes) = parameter.as_slice() {

src/certificate.rs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,16 @@ use crate::x509::{
1212
X509Version,
1313
};
1414

15-
use der_parser::ber::{parse_ber_optional, BerTag, BitStringObject};
15+
use der_parser::ber::{parse_ber_optional, BitStringObject, Tag};
1616
use der_parser::der::*;
1717
use der_parser::error::*;
1818
use der_parser::num_bigint::BigUint;
19-
use der_parser::oid::Oid;
2019
use der_parser::*;
2120
use nom::{Offset, Parser};
21+
use oid_registry::Oid;
2222
use oid_registry::*;
2323
use std::collections::HashMap;
24+
use time::Duration;
2425

2526
/// An X.509 v3 Certificate.
2627
///
@@ -472,7 +473,7 @@ impl<'a> FromDer<'a> for TbsCertificate<'a> {
472473
let (i, subject_pki) = SubjectPublicKeyInfo::from_der(i)?;
473474
let (i, issuer_uid) = UniqueIdentifier::from_der_issuer(i)?;
474475
let (i, subject_uid) = UniqueIdentifier::from_der_subject(i)?;
475-
let (i, extensions) = parse_extensions(i, BerTag(3))?;
476+
let (i, extensions) = parse_extensions(i, Tag(3))?;
476477
let len = start_i.offset(i);
477478
let tbs = TbsCertificate {
478479
version,
@@ -530,9 +531,9 @@ impl<'a> Parser<&'a [u8], TbsCertificate<'a>, X509Error> for TbsCertificateParse
530531
let (i, issuer_uid) = UniqueIdentifier::from_der_issuer(i)?;
531532
let (i, subject_uid) = UniqueIdentifier::from_der_subject(i)?;
532533
let (i, extensions) = if self.deep_parse_extensions {
533-
parse_extensions(i, BerTag(3))?
534+
parse_extensions(i, Tag(3))?
534535
} else {
535-
parse_extensions_envelope(i, BerTag(3))?
536+
parse_extensions_envelope(i, Tag(3))?
536537
};
537538
let len = start_i.offset(i);
538539
let tbs = TbsCertificate {
@@ -580,7 +581,7 @@ impl Validity {
580581
/// If the certificate is not currently valid, then `None` is
581582
/// returned. Otherwise, the `Duration` until the certificate
582583
/// expires is returned.
583-
pub fn time_to_expiration(&self) -> Option<std::time::Duration> {
584+
pub fn time_to_expiration(&self) -> Option<Duration> {
584585
let now = ASN1Time::now();
585586
if !self.is_valid_at(now) {
586587
return None;
@@ -637,7 +638,7 @@ impl<'a> UniqueIdentifier<'a> {
637638
fn parse(i: &[u8], tag: u32) -> BerResult<Option<UniqueIdentifier>> {
638639
let (rem, obj) = parse_ber_optional(parse_der_tagged_implicit(
639640
tag,
640-
parse_der_content(DerTag::BitString),
641+
parse_der_content(Tag::BitString),
641642
))(i)?;
642643
let unique_id = match obj.content {
643644
DerObjectContent::Optional(None) => Ok(None),
@@ -662,11 +663,11 @@ mod tests {
662663
not_after: ASN1Time::now(),
663664
};
664665
assert_eq!(v.time_to_expiration(), None);
665-
v.not_after = (v.not_after + std::time::Duration::new(60, 0)).unwrap();
666+
v.not_after = (v.not_after + Duration::new(60, 0)).unwrap();
666667
assert!(v.time_to_expiration().is_some());
667-
assert!(v.time_to_expiration().unwrap() <= std::time::Duration::from_secs(60));
668+
assert!(v.time_to_expiration().unwrap() <= Duration::new(60, 0));
668669
// The following assumes this timing won't take 10 seconds... I
669670
// think that is safe.
670-
assert!(v.time_to_expiration().unwrap() > std::time::Duration::from_secs(50));
671+
assert!(v.time_to_expiration().unwrap() > Duration::new(50, 0));
671672
}
672673
}

src/cri_attributes.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@ use crate::{
44
traits::FromDer,
55
};
66

7-
use der_parser::der::{
8-
der_read_element_header, parse_der_oid, parse_der_sequence_defined_g, DerTag,
9-
};
7+
use der_parser::der::{der_read_element_header, parse_der_oid, parse_der_sequence_defined_g, Tag};
108
use der_parser::error::BerError;
119
use der_parser::oid::Oid;
1210
use nom::combinator::map_res;
@@ -28,7 +26,7 @@ impl<'a> FromDer<'a> for X509CriAttribute<'a> {
2826
let (i, oid) = map_res(parse_der_oid, |x| x.as_oid_val())(i)?;
2927
let value_start = i;
3028
let (i, hdr) = der_read_element_header(i)?;
31-
if hdr.tag != DerTag::Set {
29+
if hdr.tag() != Tag::Set {
3230
return Err(Err::Error(BerError::BerTypeError));
3331
};
3432

@@ -119,7 +117,8 @@ pub(crate) fn parse_cri_attributes(i: &[u8]) -> X509Result<Vec<X509CriAttribute>
119117
if i.is_empty() {
120118
return Ok((i, Vec::new()));
121119
}
122-
(0..hdr.structured)
120+
let constructed = if hdr.constructed() { 1 } else { 0 };
121+
(0..constructed)
123122
.into_iter()
124123
.try_fold((i, Vec::new()), |(i, mut attrs), _| {
125124
let (rem, attr) = X509CriAttribute::from_der(i)?;

src/extensions/generalname.rs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use der_parser::error::BerError;
88
use der_parser::oid::Oid;
99
use nom::bytes::streaming::take;
1010
use nom::combinator::{all_consuming, verify};
11-
use nom::{Err, IResult};
11+
use nom::{Err, IResult, Needed};
1212
use std::fmt;
1313

1414
#[derive(Clone, Debug, PartialEq)]
@@ -60,20 +60,21 @@ impl<'a> fmt::Display for GeneralName<'a> {
6060

6161
pub(crate) fn parse_generalname<'a>(i: &'a [u8]) -> IResult<&'a [u8], GeneralName, BerError> {
6262
let (rest, hdr) = verify(der_read_element_header, |hdr| hdr.is_contextspecific())(i)?;
63-
let len = hdr.len.primitive()?;
63+
let len = hdr.length().definite()?;
6464
if len > rest.len() {
65-
return Err(nom::Err::Failure(BerError::ObjectTooShort));
65+
let needed = Needed::new(len - rest.len());
66+
return Err(nom::Err::Failure(BerError::Incomplete(needed)));
6667
}
67-
fn ia5str<'a>(i: &'a [u8], hdr: DerObjectHeader) -> Result<&'a str, Err<BerError>> {
68+
fn ia5str<'a>(i: &'a [u8], hdr: Header) -> Result<&'a str, Err<BerError>> {
6869
// Relax constraints from RFC here: we are expecting an IA5String, but many certificates
6970
// are using unicode characters
70-
der_read_element_content_as(i, DerTag::Utf8String, hdr.len, hdr.is_constructed(), 0)?
71+
der_read_element_content_as(i, Tag::Utf8String, hdr.length(), hdr.is_constructed(), 1)?
7172
.1
7273
.as_slice()
7374
.and_then(|s| std::str::from_utf8(s).map_err(|_| BerError::BerValueError))
7475
.map_err(nom::Err::Failure)
7576
}
76-
let name = match hdr.tag.0 {
77+
let name = match hdr.tag().0 {
7778
0 => {
7879
// otherName SEQUENCE { OID, [0] explicit any defined by oid }
7980
let (any, oid) = parse_der_oid(rest)?;
@@ -106,10 +107,10 @@ pub(crate) fn parse_generalname<'a>(i: &'a [u8]) -> IResult<&'a [u8], GeneralNam
106107
// IPAddress, OctetString
107108
let ip = der_read_element_content_as(
108109
rest,
109-
DerTag::OctetString,
110-
hdr.len,
110+
Tag::OctetString,
111+
hdr.length(),
111112
hdr.is_constructed(),
112-
0,
113+
1,
113114
)?
114115
.1
115116
.as_slice()
@@ -118,13 +119,13 @@ pub(crate) fn parse_generalname<'a>(i: &'a [u8]) -> IResult<&'a [u8], GeneralNam
118119
}
119120
8 => {
120121
let oid =
121-
der_read_element_content_as(rest, DerTag::Oid, hdr.len, hdr.is_constructed(), 0)?
122+
der_read_element_content_as(rest, Tag::Oid, hdr.length(), hdr.is_constructed(), 1)?
122123
.1
123124
.as_oid_val()
124125
.map_err(nom::Err::Failure)?;
125126
GeneralName::RegisteredID(oid)
126127
}
127-
_ => return Err(Err::Failure(BerError::UnknownTag)),
128+
_ => return Err(Err::Failure(BerError::unexpected_tag(None, hdr.tag()))),
128129
};
129130
Ok((&rest[len..], name))
130131
}

src/extensions/keyusage.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ pub(crate) fn parse_extendedkeyusage(i: &[u8]) -> IResult<&[u8], ExtendedKeyUsag
128128
if !seen.insert(oid.clone()) {
129129
continue;
130130
}
131-
let asn1 = oid.bytes();
131+
let asn1 = oid.as_bytes();
132132
if asn1 == oid!(raw 2.5.29.37.0) {
133133
eku.any = true;
134134
} else if asn1 == oid!(raw 1.3.6.1.5.5.7.3.1) {

src/extensions/mod.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ impl<'a> FromDer<'a> for IssuerAlternativeName<'a> {
503503

504504
#[derive(Clone, Debug, PartialEq)]
505505
pub struct UnparsedObject<'a> {
506-
pub header: DerObjectHeader<'a>,
506+
pub header: Header<'a>,
507507
pub data: &'a [u8],
508508
}
509509

@@ -789,11 +789,11 @@ pub(crate) mod parser {
789789
pub(super) fn parse_policyconstraints(i: &[u8]) -> IResult<&[u8], PolicyConstraints, BerError> {
790790
parse_der_sequence_defined_g(|input, _| {
791791
let (i, require_explicit_policy) = opt(complete(map_res(
792-
parse_der_tagged_implicit(0, parse_der_content(DerTag::Integer)),
792+
parse_der_tagged_implicit(0, parse_der_content(Tag::Integer)),
793793
|x| x.as_u32(),
794794
)))(input)?;
795795
let (i, inhibit_policy_mapping) = all_consuming(opt(complete(map_res(
796-
parse_der_tagged_implicit(1, parse_der_content(DerTag::Integer)),
796+
parse_der_tagged_implicit(1, parse_der_content(Tag::Integer)),
797797
|x| x.as_u32(),
798798
))))(i)?;
799799
let policy_constraint = PolicyConstraints {
@@ -829,7 +829,7 @@ pub(crate) mod parser {
829829
// nameRelativeToCRLIssuer [1] RelativeDistinguishedName }
830830
fn parse_distributionpointname(i: &[u8]) -> IResult<&[u8], DistributionPointName, BerError> {
831831
let (rem, header) = der_read_element_header(i)?;
832-
match header.tag.0 {
832+
match header.tag().0 {
833833
0 => {
834834
let (rem, names) = many1(complete(parse_generalname))(rem)?;
835835
Ok((rem, DistributionPointName::FullName(names)))
@@ -854,7 +854,7 @@ pub(crate) mod parser {
854854
// privilegeWithdrawn (7),
855855
// aACompromise (8) }
856856
fn parse_tagged1_reasons(i: &[u8]) -> BerResult<ReasonFlags> {
857-
let (rem, obj) = parse_der_tagged_implicit(1, parse_der_content(DerTag::BitString))(i)?;
857+
let (rem, obj) = parse_der_tagged_implicit(1, parse_der_content(Tag::BitString))(i)?;
858858
if let DerObjectContent::BitString(_, b) = obj.content {
859859
let flags = b
860860
.data
@@ -940,7 +940,7 @@ pub(crate) mod parser {
940940

941941
fn parse_aki_content<'a>(
942942
i: &'a [u8],
943-
_hdr: DerObjectHeader<'_>,
943+
_hdr: Header<'_>,
944944
) -> IResult<&'a [u8], AuthorityKeyIdentifier<'a>, BerError> {
945945
let (i, key_identifier) = opt(complete(parse_der_tagged_implicit_g(0, |d, _, _| {
946946
Ok((&[], KeyIdentifier(d)))
@@ -951,7 +951,7 @@ pub(crate) mod parser {
951951
})))(i)?;
952952
let (i, authority_cert_serial) = opt(complete(parse_der_tagged_implicit(
953953
2,
954-
parse_der_content(DerTag::Integer),
954+
parse_der_content(Tag::Integer),
955955
)))(i)?;
956956
let authority_cert_serial = authority_cert_serial.and_then(|o| o.as_slice().ok());
957957
let aki = AuthorityKeyIdentifier {
@@ -1131,14 +1131,14 @@ pub(crate) fn parse_extension_sequence(i: &[u8]) -> X509Result<Vec<X509Extension
11311131
)
11321132
}
11331133

1134-
pub(crate) fn parse_extensions(i: &[u8], explicit_tag: DerTag) -> X509Result<Vec<X509Extension>> {
1134+
pub(crate) fn parse_extensions(i: &[u8], explicit_tag: Tag) -> X509Result<Vec<X509Extension>> {
11351135
if i.is_empty() {
11361136
return Ok((i, Vec::new()));
11371137
}
11381138

11391139
match der_read_element_header(i) {
11401140
Ok((rem, hdr)) => {
1141-
if hdr.tag != explicit_tag {
1141+
if hdr.tag() != explicit_tag {
11421142
return Err(Err::Error(X509Error::InvalidExtensions));
11431143
}
11441144
all_consuming(parse_extension_sequence)(rem)
@@ -1156,15 +1156,15 @@ pub(crate) fn parse_extension_envelope_sequence(i: &[u8]) -> X509Result<Vec<X509
11561156

11571157
pub(crate) fn parse_extensions_envelope(
11581158
i: &[u8],
1159-
explicit_tag: DerTag,
1159+
explicit_tag: Tag,
11601160
) -> X509Result<Vec<X509Extension>> {
11611161
if i.is_empty() {
11621162
return Ok((i, Vec::new()));
11631163
}
11641164

11651165
match der_read_element_header(i) {
11661166
Ok((rem, hdr)) => {
1167-
if hdr.tag != explicit_tag {
1167+
if hdr.tag() != explicit_tag {
11681168
return Err(Err::Error(X509Error::InvalidExtensions));
11691169
}
11701170
all_consuming(parse_extension_envelope_sequence)(rem)

src/revocation_list.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::x509::{
77
parse_serial, parse_signature_value, AlgorithmIdentifier, ReasonCode, X509Name, X509Version,
88
};
99

10-
use der_parser::ber::{BerTag, BitStringObject};
10+
use der_parser::ber::{BitStringObject, Tag};
1111
use der_parser::der::*;
1212
use der_parser::num_bigint::BigUint;
1313
use der_parser::oid::Oid;
@@ -215,7 +215,7 @@ impl<'a> FromDer<'a> for TbsCertList<'a> {
215215
let (i, this_update) = ASN1Time::from_der(i)?;
216216
let (i, next_update) = ASN1Time::from_der_opt(i)?;
217217
let (i, revoked_certificates) = opt(complete(parse_revoked_certificates))(i)?;
218-
let (i, extensions) = parse_extensions(i, BerTag(0))?;
218+
let (i, extensions) = parse_extensions(i, Tag(0))?;
219219
let len = start_i.offset(i);
220220
let tbs = TbsCertList {
221221
version,

0 commit comments

Comments
 (0)