File tree Expand file tree Collapse file tree 2 files changed +26
-4
lines changed Expand file tree Collapse file tree 2 files changed +26
-4
lines changed Original file line number Diff line number Diff line change @@ -546,6 +546,12 @@ impl CertificateParams {
546
546
return Err ( Error :: UnsupportedInCsr ) ;
547
547
}
548
548
549
+ // Whether or not to write an extension request attribute
550
+ let write_extension_request = !key_usages. is_empty ( )
551
+ || !subject_alt_names. is_empty ( )
552
+ || !extended_key_usages. is_empty ( )
553
+ || !custom_extensions. is_empty ( ) ;
554
+
549
555
let der = subject_key. sign_der ( |writer| {
550
556
// Write version
551
557
writer. next ( ) . write_u8 ( 0 ) ;
@@ -556,10 +562,7 @@ impl CertificateParams {
556
562
// Write extensions
557
563
// According to the spec in RFC 2986, even if attributes are empty we need the empty attribute tag
558
564
writer. next ( ) . write_tagged ( Tag :: context ( 0 ) , |writer| {
559
- if !key_usages. is_empty ( )
560
- || !subject_alt_names. is_empty ( )
561
- || !custom_extensions. is_empty ( )
562
- {
565
+ if write_extension_request {
563
566
writer. write_sequence ( |writer| {
564
567
let oid = ObjectIdentifier :: from_slice ( oid:: PKCS_9_AT_EXTENSION_REQUEST ) ;
565
568
writer. next ( ) . write_oid ( & oid) ;
Original file line number Diff line number Diff line change @@ -375,6 +375,25 @@ mod test_csr_extension_request {
375
375
. unwrap( )
376
376
. any( |ext| matches!( ext, ParsedExtension :: SubjectAlternativeName ( _) ) ) ) ;
377
377
}
378
+
379
+ #[ test]
380
+ fn write_extension_request_if_ekus_are_present ( ) {
381
+ let mut params = CertificateParams :: default ( ) ;
382
+ params
383
+ . extended_key_usages
384
+ . push ( ExtendedKeyUsagePurpose :: ClientAuth ) ;
385
+ let key_pair = KeyPair :: generate ( ) . unwrap ( ) ;
386
+ let csr = params. serialize_request ( & key_pair) . unwrap ( ) ;
387
+ let ( _, parsed_csr) = X509CertificationRequest :: from_der ( csr. der ( ) ) . unwrap ( ) ;
388
+ let requested_extensions = parsed_csr
389
+ . requested_extensions ( )
390
+ . unwrap ( )
391
+ . collect :: < Vec < _ > > ( ) ;
392
+ assert ! ( matches!(
393
+ requested_extensions. first( ) . unwrap( ) ,
394
+ ParsedExtension :: ExtendedKeyUsage ( _)
395
+ ) ) ;
396
+ }
378
397
}
379
398
380
399
#[ cfg( feature = "x509-parser" ) ]
You can’t perform that action at this time.
0 commit comments