Skip to content

Commit 7951db2

Browse files
s-arashArash Sahebolamri
andauthored
Add Certificate::verify() variants that return VerifyError as well (#334)
Co-authored-by: Arash Sahebolamri <[email protected]>
1 parent 053ce3b commit 7951db2

File tree

1 file changed

+64
-3
lines changed

1 file changed

+64
-3
lines changed

mbedtls/src/x509/certificate.rs

Lines changed: 64 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ use crate::x509::{self, Crl, Time, VerifyCallback};
2626
#[cfg(feature = "std")]
2727
use yasna::{models::ObjectIdentifier, ASN1Error, ASN1ErrorKind, ASN1Result, BERDecodable, BERReader};
2828

29+
use super::VerifyError;
30+
2931
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
3032
pub enum CertificateVersion {
3133
V1,
@@ -225,12 +227,12 @@ impl Certificate {
225227
err_info: Option<&mut String>,
226228
cb: Option<F>,
227229
expected_common_name: Option<&str>,
228-
) -> Result<()>
230+
) -> core::result::Result<(), (Error, VerifyError)>
229231
where
230232
F: VerifyCallback + 'static,
231233
{
232234
if chain.is_empty() {
233-
return Err(Error::X509BadInputData);
235+
return Err((Error::X509BadInputData, VerifyError::CERT_MISSING));
234236
}
235237
let (f_vrfy, p_vrfy): (Option<unsafe extern "C" fn(_, _, _, _) -> _>, _) = if let Some(cb) = cb.as_ref() {
236238
(Some(x509::verify_callback::<F>), cb as *const _ as *mut c_void)
@@ -267,7 +269,8 @@ impl Certificate {
267269
}
268270
}
269271
}
270-
result.map(|_| ())
272+
let verify_err = VerifyError::from_bits_truncate(flags);
273+
result.map_err(|e| (e, verify_err)).map(|_| ())
271274
}
272275

273276
pub fn verify(
@@ -276,6 +279,16 @@ impl Certificate {
276279
ca_crl: Option<&mut Crl>,
277280
err_info: Option<&mut String>,
278281
) -> Result<()> {
282+
Self::verify_ex(chain, trust_ca, ca_crl, err_info, None::<&dyn VerifyCallback>, None).map_err(|(e, _ve)| e)
283+
}
284+
285+
/// Like `verify`. In case of errors, returns `VerifyError` as well.
286+
pub fn verify_return_verify_err(
287+
chain: &MbedtlsList<Certificate>,
288+
trust_ca: &MbedtlsList<Certificate>,
289+
ca_crl: Option<&mut Crl>,
290+
err_info: Option<&mut String>,
291+
) -> core::result::Result<(), (Error, VerifyError)> {
279292
Self::verify_ex(chain, trust_ca, ca_crl, err_info, None::<&dyn VerifyCallback>, None)
280293
}
281294

@@ -302,6 +315,25 @@ impl Certificate {
302315
None::<&dyn VerifyCallback>,
303316
expected_common_name,
304317
)
318+
.map_err(|(e, _ve)| e)
319+
}
320+
321+
/// Like `verify_with_expected_common_name`. In case of errors, returns `VerifyError` as well.
322+
pub fn verify_with_expected_common_name_return_verify_err(
323+
chain: &MbedtlsList<Certificate>,
324+
trust_ca: &MbedtlsList<Certificate>,
325+
ca_crl: Option<&mut Crl>,
326+
err_info: Option<&mut String>,
327+
expected_common_name: Option<&str>,
328+
) -> core::result::Result<(), (Error, VerifyError)> {
329+
Self::verify_ex(
330+
chain,
331+
trust_ca,
332+
ca_crl,
333+
err_info,
334+
None::<&dyn VerifyCallback>,
335+
expected_common_name,
336+
)
305337
}
306338

307339
pub fn verify_with_callback<F>(
@@ -311,6 +343,20 @@ impl Certificate {
311343
err_info: Option<&mut String>,
312344
cb: F,
313345
) -> Result<()>
346+
where
347+
F: VerifyCallback + 'static,
348+
{
349+
Self::verify_ex(chain, trust_ca, ca_crl, err_info, Some(cb), None).map_err(|(e, _ve)| e)
350+
}
351+
352+
/// Like `verify_with_callback`. In case of errors, returns `VerifyError` as well.
353+
pub fn verify_with_callback_return_verify_err<F>(
354+
chain: &MbedtlsList<Certificate>,
355+
trust_ca: &MbedtlsList<Certificate>,
356+
ca_crl: Option<&mut Crl>,
357+
err_info: Option<&mut String>,
358+
cb: F,
359+
) -> core::result::Result<(), (Error, VerifyError)>
314360
where
315361
F: VerifyCallback + 'static,
316362
{
@@ -333,6 +379,21 @@ impl Certificate {
333379
cb: F,
334380
expected_common_name: Option<&str>,
335381
) -> Result<()>
382+
where
383+
F: VerifyCallback + 'static,
384+
{
385+
Self::verify_ex(chain, trust_ca, ca_crl, err_info, Some(cb), expected_common_name).map_err(|(e, _ve)| e)
386+
}
387+
388+
/// Like `verify_with_callback_expected_common_name`. In case of errors, returns `VerifyError` as well.
389+
pub fn verify_with_callback_expected_common_name_return_verify_err<F>(
390+
chain: &MbedtlsList<Certificate>,
391+
trust_ca: &MbedtlsList<Certificate>,
392+
ca_crl: Option<&mut Crl>,
393+
err_info: Option<&mut String>,
394+
cb: F,
395+
expected_common_name: Option<&str>,
396+
) -> core::result::Result<(), (Error, VerifyError)>
336397
where
337398
F: VerifyCallback + 'static,
338399
{

0 commit comments

Comments
 (0)