Skip to content

Commit 57eaec9

Browse files
feat(pki): Verify&Load submit request
Closes #11322
1 parent 6b1a6be commit 57eaec9

File tree

5 files changed

+56
-9
lines changed

5 files changed

+56
-9
lines changed

libparsec/crates/platform_pki/examples/verify_certificate.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ pub fn main() -> anyhow::Result<()> {
2626
.context("Cannot get certificate")?;
2727

2828
let end_cert = untrusted_certificate
29-
.into_end_certificate()
29+
.to_end_certificate()
3030
.context("Invalid certificate")?;
3131
println!("Untrusted certificate: {}", utils::display_cert(&end_cert));
3232

libparsec/crates/platform_pki/examples/verify_message.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,10 @@ fn main() -> anyhow::Result<()> {
4444
message: data,
4545
};
4646

47-
match verify_message(&signed_message, cert) {
47+
match verify_message(
48+
&signed_message,
49+
&cert.to_end_certificate().context("Invalid certificate")?,
50+
) {
4851
Ok(_) => {
4952
println!("The message as a correct signature")
5053
}

libparsec/crates/platform_pki/src/errors.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ error_set::error_set! {
3333
#[display("Invalid certificate: {0}")]
3434
InvalidCertificateDer(webpki::Error),
3535
}
36-
VerifySignatureError := InvalidCertificateDer || {
36+
VerifySignatureError := {
3737
#[display("Invalid signature for the given message and certificate")]
3838
InvalidSignature,
3939
#[display("Unexpected signature will verifying signature of a message: {0}")]
@@ -50,4 +50,12 @@ error_set::error_set! {
5050
#[display("The provided certificate cannot be trusted: {0}")]
5151
Untrusted(webpki::Error),
5252
}
53+
ValidatePayloadError := InvalidCertificateDer
54+
|| ListTrustedRootCertificatesError
55+
|| VerifyCertificateError
56+
|| VerifySignatureError
57+
DataError := {
58+
DataError(libparsec_types::DataError)
59+
}
60+
LoadSubmitPayloadError := ValidatePayloadError || DataError
5361
}

libparsec/crates/platform_pki/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,3 +179,6 @@ pub use platform::is_available;
179179

180180
pub use errors::VerifyCertificateError;
181181
pub use shared::verify_certificate;
182+
183+
pub use errors::LoadSubmitPayloadError;
184+
pub use shared::load_submit_payload;

libparsec/crates/platform_pki/src/shared/mod.rs

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ mod signature_verification;
44

55
use crate::{
66
encrypt_message,
7-
errors::{InvalidPemContent, VerifyCertificateError, VerifySignatureError},
7+
errors::{
8+
InvalidPemContent, ValidatePayloadError, VerifyCertificateError, VerifySignatureError,
9+
},
810
shared::signature_verification::{RsassaPssSha256SignatureVerifier, SUPPORTED_SIG_ALGS},
911
EncryptedMessage, SignatureAlgorithm,
1012
};
@@ -38,7 +40,7 @@ impl<'a> Certificate<'a> {
3840
Certificate::new(self.internal.clone().into_owned())
3941
}
4042

41-
pub fn into_end_certificate(&self) -> Result<EndEntityCert<'_>, WebPkiError> {
43+
pub fn to_end_certificate(&self) -> Result<EndEntityCert<'_>, WebPkiError> {
4244
EndEntityCert::try_from(&self.internal)
4345
}
4446
}
@@ -61,15 +63,14 @@ pub struct SignedMessage {
6163
pub message: Vec<u8>,
6264
}
6365

64-
pub fn verify_message<'message>(
66+
pub fn verify_message<'message, 'a>(
6567
signed_message: &'message SignedMessage,
66-
certificate: Certificate<'_>,
68+
certificate: &'a EndEntityCert<'a>,
6769
) -> Result<&'message [u8], VerifySignatureError> {
6870
let verifier = match signed_message.algo {
6971
SignatureAlgorithm::RsassaPssSha256 => &RsassaPssSha256SignatureVerifier,
7072
};
71-
EndEntityCert::try_from(&certificate.internal)
72-
.map_err(VerifySignatureError::InvalidCertificateDer)?
73+
certificate
7374
.verify_signature(verifier, &signed_message.message, &signed_message.signature)
7475
.map(|_| signed_message.message.as_ref())
7576
.map_err(|e| match e {
@@ -134,3 +135,35 @@ pub fn verify_certificate<'der>(
134135
)
135136
.map_err(VerifyCertificateError::Untrusted)
136137
}
138+
139+
pub fn load_submit_payload(
140+
der_certificate: &[u8],
141+
signed_message: &SignedMessage,
142+
now: DateTime,
143+
) -> Result<PkiEnrollmentSubmitPayload, crate::errors::LoadSubmitPayloadError> {
144+
let validated_payload = validate_payload(der_certificate, signed_message, now)?;
145+
PkiEnrollmentSubmitPayload::load(validated_payload).map_err(Into::into)
146+
}
147+
148+
pub fn validate_payload<'message>(
149+
der_certificate: &[u8],
150+
signed_message: &'message SignedMessage,
151+
now: DateTime,
152+
) -> Result<&'message [u8], ValidatePayloadError> {
153+
let binding = Certificate::from_der(der_certificate);
154+
let untrusted_cert = binding
155+
.to_end_certificate()
156+
.map_err(ValidatePayloadError::InvalidCertificateDer)?;
157+
let trusted_anchor = crate::list_trusted_root_certificate_anchor()?;
158+
let verified_path = verify_certificate(
159+
&untrusted_cert,
160+
&trusted_anchor,
161+
// TODO: Consider listing intermediate certificate
162+
&[],
163+
now,
164+
KeyUsage::client_auth(),
165+
)?;
166+
let trusted_cert = verified_path.end_entity();
167+
168+
verify_message(signed_message, trusted_cert).map_err(Into::into)
169+
}

0 commit comments

Comments
 (0)