@@ -518,3 +518,54 @@ mod test_csr {
518518 assert_eq ! ( * params, csrp. params) ;
519519 }
520520}
521+
522+ #[ cfg( feature = "x509-parser" ) ]
523+ mod test_subject_alternative_name_criticality {
524+ use x509_parser:: certificate:: X509Certificate ;
525+ use x509_parser:: extensions:: X509Extension ;
526+ use x509_parser:: { oid_registry, parse_x509_certificate} ;
527+
528+ use crate :: util:: default_params;
529+
530+ #[ test]
531+ fn with_subject_sans_not_critical ( ) {
532+ let ( params, keypair) = default_params ( ) ;
533+ assert ! (
534+ !params
535+ . distinguished_name
536+ . iter( )
537+ . collect:: <Vec <_>>( )
538+ . is_empty( ) ,
539+ "non-empty subject required for test"
540+ ) ;
541+
542+ let cert = params. self_signed ( & keypair) . unwrap ( ) ;
543+ let cert = cert. der ( ) ;
544+ let ( _, parsed) = parse_x509_certificate ( cert) . unwrap ( ) ;
545+ assert ! (
546+ !san_ext( & parsed) . critical,
547+ "with subject, SAN ext should not be critical"
548+ ) ;
549+ }
550+
551+ #[ test]
552+ fn without_subject_sans_critical ( ) {
553+ let ( mut params, keypair) = default_params ( ) ;
554+ params. distinguished_name = Default :: default ( ) ;
555+
556+ let cert = params. self_signed ( & keypair) . unwrap ( ) ;
557+ let cert = cert. der ( ) ;
558+ let ( _, parsed) = parse_x509_certificate ( cert) . unwrap ( ) ;
559+ assert ! (
560+ san_ext( & parsed) . critical,
561+ "without subject, SAN ext should be critical"
562+ ) ;
563+ }
564+
565+ fn san_ext < ' cert > ( cert : & ' cert X509Certificate ) -> & ' cert X509Extension < ' cert > {
566+ cert. extensions ( )
567+ . iter ( )
568+ . find ( |ext| ext. oid == oid_registry:: OID_X509_EXT_SUBJECT_ALT_NAME )
569+ . expect ( "missing SAN extension" )
570+ }
571+ }
0 commit comments