@@ -21,7 +21,7 @@ use crate::hash::Type as MdType;
21
21
use crate :: pk:: Pk ;
22
22
use crate :: private:: UnsafeFrom ;
23
23
use crate :: rng:: Random ;
24
- use crate :: x509:: { self , Time , VerifyCallback } ;
24
+ use crate :: x509:: { self , Crl , Time , VerifyCallback } ;
25
25
26
26
extern "C" {
27
27
pub ( crate ) fn forward_mbedtls_calloc ( n : mbedtls_sys:: types:: size_t , size : mbedtls_sys:: types:: size_t ) -> * mut mbedtls_sys:: types:: raw_types:: c_void ;
@@ -226,6 +226,7 @@ impl Certificate {
226
226
fn verify_ex < F > (
227
227
chain : & MbedtlsList < Certificate > ,
228
228
trust_ca : & MbedtlsList < Certificate > ,
229
+ ca_crl : Option < & mut Crl > ,
229
230
err_info : Option < & mut String > ,
230
231
cb : Option < F > ,
231
232
) -> Result < ( ) >
@@ -243,7 +244,7 @@ impl Certificate {
243
244
x509_crt_verify (
244
245
chain. inner_ffi_mut ( ) ,
245
246
trust_ca. inner_ffi_mut ( ) ,
246
- :: core:: ptr:: null_mut ( ) ,
247
+ ca_crl . map_or ( :: core:: ptr:: null_mut ( ) , |crl| crl . handle_mut ( ) ) ,
247
248
:: core:: ptr:: null ( ) ,
248
249
& mut flags,
249
250
f_vrfy,
@@ -269,21 +270,23 @@ impl Certificate {
269
270
pub fn verify (
270
271
chain : & MbedtlsList < Certificate > ,
271
272
trust_ca : & MbedtlsList < Certificate > ,
273
+ ca_crl : Option < & mut Crl > ,
272
274
err_info : Option < & mut String > ,
273
275
) -> Result < ( ) > {
274
- Self :: verify_ex ( chain, trust_ca, err_info, None :: < & dyn VerifyCallback > )
276
+ Self :: verify_ex ( chain, trust_ca, ca_crl , err_info, None :: < & dyn VerifyCallback > )
275
277
}
276
278
277
279
pub fn verify_with_callback < F > (
278
280
chain : & MbedtlsList < Certificate > ,
279
281
trust_ca : & MbedtlsList < Certificate > ,
282
+ ca_crl : Option < & mut Crl > ,
280
283
err_info : Option < & mut String > ,
281
284
cb : F ,
282
285
) -> Result < ( ) >
283
286
where
284
287
F : VerifyCallback + ' static ,
285
288
{
286
- Self :: verify_ex ( chain, trust_ca, err_info, Some ( cb) )
289
+ Self :: verify_ex ( chain, trust_ca, ca_crl , err_info, Some ( cb) )
287
290
}
288
291
}
289
292
@@ -1014,7 +1017,7 @@ cYp0bH/RcPTC0Z+ZaqSWMtfxRrk63MJQF9EXpDCdvQRcTMD9D85DJrMKn8aumq0M
1014
1017
chain. push ( c_leaf. clone ( ) ) ;
1015
1018
chain. push ( c_int1. clone ( ) ) ;
1016
1019
1017
- let err = Certificate :: verify ( & chain, & mut c_root, None ) . unwrap_err ( ) ;
1020
+ let err = Certificate :: verify ( & chain, & mut c_root, None , None ) . unwrap_err ( ) ;
1018
1021
assert_eq ! ( err, Error :: X509CertVerifyFailed ) ;
1019
1022
1020
1023
// try again after fixing the chain
@@ -1028,8 +1031,8 @@ cYp0bH/RcPTC0Z+ZaqSWMtfxRrk63MJQF9EXpDCdvQRcTMD9D85DJrMKn8aumq0M
1028
1031
Ok ( ( ) )
1029
1032
} ;
1030
1033
1031
- Certificate :: verify ( & chain, & mut c_root, None ) . unwrap ( ) ;
1032
- let res = Certificate :: verify_with_callback ( & chain, & mut c_root, Some ( & mut err_str) , verify_callback) ;
1034
+ Certificate :: verify ( & chain, & mut c_root, None , None ) . unwrap ( ) ;
1035
+ let res = Certificate :: verify_with_callback ( & chain, & mut c_root, None , Some ( & mut err_str) , verify_callback) ;
1033
1036
1034
1037
match res {
1035
1038
Ok ( ( ) ) => ( ) ,
@@ -1043,15 +1046,15 @@ cYp0bH/RcPTC0Z+ZaqSWMtfxRrk63MJQF9EXpDCdvQRcTMD9D85DJrMKn8aumq0M
1043
1046
chain. push ( c_int1. clone ( ) ) ;
1044
1047
chain. push ( c_int2. clone ( ) ) ;
1045
1048
1046
- Certificate :: verify ( & chain, & mut c_root, None ) . unwrap ( ) ;
1049
+ Certificate :: verify ( & chain, & mut c_root, None , None ) . unwrap ( ) ;
1047
1050
1048
1051
let verify_callback = |_crt : & Certificate , _depth : i32 , verify_flags : & mut VerifyError | {
1049
1052
verify_flags. remove ( VerifyError :: CERT_EXPIRED ) ;
1050
1053
Ok ( ( ) )
1051
1054
} ;
1052
1055
1053
1056
let mut err_str = String :: new ( ) ;
1054
- let res = Certificate :: verify_with_callback ( & chain, & mut c_root, Some ( & mut err_str) , verify_callback) ;
1057
+ let res = Certificate :: verify_with_callback ( & chain, & mut c_root, None , Some ( & mut err_str) , verify_callback) ;
1055
1058
1056
1059
match res {
1057
1060
Ok ( ( ) ) => ( ) ,
@@ -1443,4 +1446,44 @@ cYp0bH/RcPTC0Z+ZaqSWMtfxRrk63MJQF9EXpDCdvQRcTMD9D85DJrMKn8aumq0M
1443
1446
assert ! ( crate :: tests:: TestTrait :: <dyn Sync , MbedtlsBox <Certificate >>:: new( ) . impls_trait( ) , "MbedtlsBox<Certificate> should be Sync" ) ;
1444
1447
assert ! ( crate :: tests:: TestTrait :: <dyn Sync , MbedtlsList <Certificate >>:: new( ) . impls_trait( ) , "MbedtlsList<Certificate> should be Sync" ) ;
1445
1448
}
1449
+
1450
+ #[ test]
1451
+ fn empty_crl_test ( ) {
1452
+ const C_CERT : & ' static str = concat ! ( include_str!( "../../tests/data/certificate.crt" ) , "\0 " ) ;
1453
+ const C_ROOT : & ' static str = concat ! ( include_str!( "../../tests/data/root.crt" ) , "\0 " ) ;
1454
+ const C_CRL : & ' static [ u8 ] = include_bytes ! ( "../../tests/data/root.empty.crl" ) ;
1455
+
1456
+ let mut certs = MbedtlsList :: new ( ) ;
1457
+ certs. push ( Certificate :: from_pem ( & C_CERT . as_bytes ( ) ) . unwrap ( ) ) ;
1458
+ let mut roots = MbedtlsList :: new ( ) ;
1459
+ roots. push ( Certificate :: from_pem ( & C_ROOT . as_bytes ( ) ) . unwrap ( ) ) ;
1460
+
1461
+ assert ! ( Certificate :: verify( & certs, & roots, None , None ) . is_ok( ) ) ;
1462
+
1463
+ let mut crl = Crl :: new ( ) ;
1464
+ crl. push_from_der ( C_CRL ) . unwrap ( ) ;
1465
+ assert ! ( Certificate :: verify( & certs, & roots, Some ( & mut crl) , None ) . is_ok( ) ) ;
1466
+ }
1467
+
1468
+ #[ test]
1469
+ fn revoked_cert_crl_test ( ) {
1470
+ const C_CERT : & ' static str = concat ! ( include_str!( "../../tests/data/certificate.crt" ) , "\0 " ) ;
1471
+ const C_ROOT : & ' static str = concat ! ( include_str!( "../../tests/data/root.crt" ) , "\0 " ) ;
1472
+ const C_CRL : & ' static [ u8 ] = include_bytes ! ( "../../tests/data/root.revoked.crl" ) ;
1473
+
1474
+ let mut certs = MbedtlsList :: new ( ) ;
1475
+ certs. push ( Certificate :: from_pem ( & C_CERT . as_bytes ( ) ) . unwrap ( ) ) ;
1476
+ let mut roots = MbedtlsList :: new ( ) ;
1477
+ roots. push ( Certificate :: from_pem ( & C_ROOT . as_bytes ( ) ) . unwrap ( ) ) ;
1478
+
1479
+ let mut crl = Crl :: new ( ) ;
1480
+ crl. push_from_der ( C_CRL ) . unwrap ( ) ;
1481
+
1482
+ let mut err = String :: new ( ) ;
1483
+ assert_eq ! (
1484
+ Certificate :: verify( & certs, & roots, Some ( & mut crl) , Some ( & mut err) ) . unwrap_err( ) ,
1485
+ Error :: X509CertVerifyFailed
1486
+ ) ;
1487
+ assert_eq ! ( err, "The certificate has been revoked (is on a CRL)\n " ) ;
1488
+ }
1446
1489
}
0 commit comments