Skip to content

Commit 850b2e3

Browse files
committed
x509-cert: provide hash method to certificate
1 parent ee6bf7d commit 850b2e3

5 files changed

Lines changed: 30 additions & 7 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cmpv2/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ alloc = ["der/alloc"]
3232
std = ["der/std", "spki/std"]
3333

3434
pem = ["alloc", "der/pem"]
35-
digest = ["dep:digest", "der/digest"]
35+
digest = ["dep:digest", "x509-cert/digest"]
3636

3737
[package.metadata.docs.rs]
3838
all-features = true

cmpv2/src/oob.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use x509_cert::certificate::{Profile, Rfc5280};
99

1010
#[cfg(feature = "digest")]
1111
use {
12-
der::{DigestWriter, Encode, asn1::Null, oid::AssociatedOid},
12+
der::{asn1::Null, oid::AssociatedOid},
1313
x509_cert::{certificate::CertificateInner, ext::pkix::name::GeneralName},
1414
};
1515

@@ -66,10 +66,6 @@ where
6666
where
6767
D: digest::Digest + AssociatedOid,
6868
{
69-
let mut digest = D::new();
70-
71-
cert.encode(&mut DigestWriter(&mut digest))?;
72-
7369
Ok(Self {
7470
hash_alg: Some(AlgorithmIdentifierOwned {
7571
oid: D::OID,
@@ -80,7 +76,7 @@ where
8076
issuer: GeneralName::DirectoryName(cert.tbs_certificate().issuer().clone()),
8177
serial_number: cert.tbs_certificate().serial_number().clone(),
8278
}),
83-
hash_val: BitString::from_bytes(&digest.finalize())?,
79+
hash_val: BitString::from_bytes(&cert.hash::<D>()?)?,
8480
})
8581
}
8682
}

x509-cert/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ spki = { version = "0.8.0-rc.0", features = ["alloc"] }
2222

2323
# optional dependencies
2424
arbitrary = { version = "1.4", features = ["derive"], optional = true }
25+
digest = { version = "0.11.0-pre.10", optional = true, default-features = false }
2526
sha1 = { version = "0.11.0-pre.5", optional = true }
2627
signature = { version = "=2.3.0-pre.6", features = ["rand_core"], optional = true }
2728
tls_codec = { version = "0.4.0", default-features = false, features = ["derive"], optional = true }
@@ -44,6 +45,7 @@ std = ["der/std", "spki/std", "tls_codec?/std"]
4445

4546
arbitrary = ["dep:arbitrary", "std", "der/arbitrary", "spki/arbitrary"]
4647
builder = ["std", "sha1/default", "signature"]
48+
digest = ["dep:digest", "der/digest"]
4749
hazmat = []
4850
pem = ["der/pem", "spki/pem"]
4951
sct = ["dep:tls_codec"]

x509-cert/src/certificate.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@ use der::{
1313
pem::{self, PemLabel},
1414
};
1515

16+
#[cfg(feature = "digest")]
17+
use {
18+
der::{DigestWriter, Encode},
19+
digest::{Digest, Output},
20+
};
21+
1622
use crate::time::Time;
1723

1824
/// [`Profile`] allows the consumer of this crate to customize the behavior when parsing
@@ -420,3 +426,21 @@ impl<P: Profile> CertificateInner<P> {
420426
Ok(certs)
421427
}
422428
}
429+
430+
#[cfg(feature = "digest")]
431+
impl<P> CertificateInner<P>
432+
where
433+
P: Profile,
434+
{
435+
/// Return the hash of the DER serialization of this cetificate
436+
pub fn hash<D>(&self) -> der::Result<Output<D>>
437+
where
438+
D: Digest,
439+
{
440+
let mut digest = D::new();
441+
442+
self.encode(&mut DigestWriter(&mut digest))?;
443+
444+
Ok(digest.finalize())
445+
}
446+
}

0 commit comments

Comments
 (0)