@@ -4,7 +4,9 @@ mod signature_verification;
44
55use 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