Skip to content

Commit 61342eb

Browse files
committed
x509-cert: provide hash method to certificate
1 parent f676cef commit 61342eb

File tree

5 files changed

+31
-8
lines changed

5 files changed

+31
-8
lines changed

Cargo.lock

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cmpv2/Cargo.toml

+1-1
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", "spki/digest"]
35+
digest = ["dep:digest", "x509-cert/digest"]
3636

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

cmpv2/src/oob.rs

+2-7
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ use x509_cert::certificate::{Profile, Rfc5280};
99

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

@@ -67,10 +66,6 @@ where
6766
where
6867
D: digest::Digest + AssociatedOid,
6968
{
70-
let mut digest = D::new();
71-
72-
cert.encode(&mut DigestWriter(&mut digest))?;
73-
7469
Ok(Self {
7570
hash_alg: Some(AlgorithmIdentifierOwned {
7671
oid: D::OID,
@@ -81,7 +76,7 @@ where
8176
issuer: GeneralName::DirectoryName(cert.tbs_certificate().issuer().clone()),
8277
serial_number: cert.tbs_certificate().serial_number().clone(),
8378
}),
84-
hash_val: BitString::from_bytes(&digest.finalize())?,
79+
hash_val: BitString::from_bytes(&cert.hash::<D>()?)?,
8580
})
8681
}
8782
}

x509-cert/Cargo.toml

+2
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", "spki/digest"]
4749
hazmat = []
4850
pem = ["der/pem", "spki/pem"]
4951
sct = ["dep:tls_codec"]

x509-cert/src/certificate.rs

+25
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,13 @@ use der::{
1313
pem::{self, PemLabel},
1414
};
1515

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

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

0 commit comments

Comments
 (0)