Skip to content

Commit d9afb47

Browse files
committed
cmpv2: build OobCertHash from a certificate
1 parent abb6ca0 commit d9afb47

File tree

7 files changed

+62
-0
lines changed

7 files changed

+62
-0
lines changed

Cargo.lock

Lines changed: 2 additions & 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: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ der = { version = "0.8.0-rc.0", features = ["alloc", "derive", "flagset", "oid"]
2121
spki = { version = "0.8.0-rc.0" }
2222
x509-cert = { version = "=0.3.0-pre.0", default-features = false }
2323

24+
digest = { version = "0.11.0-pre.10", optional = true, default-features = false }
25+
2426
[dev-dependencies]
2527
const-oid = { version = "0.10.0-rc.0", features = ["db"] }
2628
hex-literal = "0.4"
@@ -30,6 +32,7 @@ alloc = ["der/alloc"]
3032
std = ["der/std", "spki/std"]
3133

3234
pem = ["alloc", "der/pem"]
35+
digest = ["dep:digest", "der/digest"]
3336

3437
[package.metadata.docs.rs]
3538
all-features = true

cmpv2/src/oob.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@ use der::asn1::BitString;
66
use crmf::controls::CertId;
77
use spki::AlgorithmIdentifierOwned;
88

9+
#[cfg(feature = "digest")]
10+
use {
11+
der::{DigestWriter, Encode, asn1::Null, oid::AssociatedOid},
12+
x509_cert::{Certificate, ext::pkix::name::GeneralName},
13+
};
14+
915
use crate::header::CmpCertificate;
1016

1117
/// The `OOBCert` type is defined in [RFC 4210 Section 5.2.5].
@@ -48,3 +54,29 @@ pub struct OobCertHash {
4854
pub cert_id: Option<CertId>,
4955
pub hash_val: BitString,
5056
}
57+
58+
#[cfg(feature = "digest")]
59+
impl OobCertHash {
60+
/// Create an [`OobCertHash`] from a given certificate
61+
pub fn from_certificate<D>(cert: &Certificate) -> der::Result<Self>
62+
where
63+
D: digest::Digest + AssociatedOid,
64+
{
65+
let mut digest = D::new();
66+
67+
cert.encode(&mut DigestWriter(&mut digest))?;
68+
69+
Ok(Self {
70+
hash_alg: Some(AlgorithmIdentifierOwned {
71+
oid: D::OID,
72+
parameters: Some(Null.into()),
73+
}),
74+
// TODO
75+
cert_id: Some(CertId {
76+
issuer: GeneralName::DirectoryName(cert.tbs_certificate().issuer().clone()),
77+
serial_number: cert.tbs_certificate().serial_number().clone(),
78+
}),
79+
hash_val: BitString::from_bytes(&digest.finalize())?,
80+
})
81+
}
82+
}

der/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ arbitrary = { version = "1.4", features = ["derive"], optional = true }
2121
bytes = { version = "1", optional = true, default-features = false }
2222
const-oid = { version = "0.10", optional = true }
2323
der_derive = { version = "0.8.0-rc.0", optional = true }
24+
digest = { version = "0.11.0-pre.10", optional = true, default-features = false }
2425
flagset = { version = "0.4.7", optional = true }
2526
pem-rfc7468 = { version = "1.0.0-rc.1", optional = true, features = ["alloc"] }
2627
time = { version = "0.3.4", optional = true, default-features = false }

der/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,9 @@ pub use {
399399
pem_rfc7468 as pem,
400400
};
401401

402+
#[cfg(feature = "digest")]
403+
pub use crate::writer::digest::DigestWriter;
404+
402405
#[cfg(feature = "time")]
403406
pub use time;
404407

der/src/writer.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
//! Writer trait.
22
3+
#[cfg(feature = "digest")]
4+
pub(crate) mod digest;
35
#[cfg(feature = "pem")]
46
pub(crate) mod pem;
57
pub(crate) mod slice;

der/src/writer/digest.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//! Adapter for Digest objects to write bytes to
2+
3+
use digest::Digest;
4+
5+
use super::Writer;
6+
use crate::Result;
7+
8+
/// Adapter object to write to a digest backend
9+
pub struct DigestWriter<'d, D>(pub &'d mut D);
10+
11+
impl<D> Writer for DigestWriter<'_, D>
12+
where
13+
D: Digest,
14+
{
15+
fn write(&mut self, slice: &[u8]) -> Result<()> {
16+
self.0.update(slice);
17+
Ok(())
18+
}
19+
}

0 commit comments

Comments
 (0)