Skip to content

Commit e7b25b3

Browse files
committed
cmpv2: build OobCertHash from a certificate
1 parent 92ea781 commit e7b25b3

File tree

3 files changed

+37
-0
lines changed

3 files changed

+37
-0
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

+3
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", "spki/digest"]
3336

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

cmpv2/src/oob.rs

+33
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@ use der::asn1::BitString;
66
use crmf::controls::CertId;
77
use spki::AlgorithmIdentifierOwned;
88

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

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

0 commit comments

Comments
 (0)