@@ -4,7 +4,9 @@ use crate::{DistinguishedName, SanType};
4
4
use pem:: Pem ;
5
5
use std:: hash:: Hash ;
6
6
7
- use crate :: { Certificate , CertificateParams , PublicKeyData , RcgenError , SignatureAlgorithm } ;
7
+ use crate :: {
8
+ Certificate , CertificateParams , CustomExtension , PublicKeyData , RcgenError , SignatureAlgorithm ,
9
+ } ;
8
10
9
11
/// A public key, extracted from a CSR
10
12
#[ derive( Debug , PartialEq , Eq , Hash ) ]
@@ -66,17 +68,44 @@ impl CertificateSigningRequest {
66
68
params. distinguished_name = DistinguishedName :: from_name ( & info. subject ) ?;
67
69
let raw = info. subject_pki . subject_public_key . data . to_vec ( ) ;
68
70
69
- if let Some ( extensions) = csr. requested_extensions ( ) {
70
- for ext in extensions {
71
- match ext {
71
+ // Pull out the extension requests attributes from the CSR.
72
+ // Note: we avoid using csr.requested_extensions() here because it maps to the parsed
73
+ // extension value and we want the raw extension value to handle unknown extensions
74
+ // ourselves.
75
+ let requested_exts = csr
76
+ . certification_request_info
77
+ . iter_attributes ( )
78
+ . filter_map ( |attr| {
79
+ if let x509_parser:: prelude:: ParsedCriAttribute :: ExtensionRequest ( requested) =
80
+ & attr. parsed_attribute ( )
81
+ {
82
+ Some ( requested. extensions . iter ( ) . collect :: < Vec < _ > > ( ) )
83
+ } else {
84
+ None
85
+ }
86
+ } )
87
+ . flatten ( )
88
+ . collect :: < Vec < _ > > ( ) ;
89
+
90
+ if !requested_exts. is_empty ( ) {
91
+ for ext in requested_exts {
92
+ let supported = match ext. parsed_extension ( ) {
72
93
x509_parser:: extensions:: ParsedExtension :: SubjectAlternativeName ( san) => {
73
94
for name in & san. general_names {
74
95
params
75
96
. subject_alt_names
76
97
. push ( SanType :: try_from_general ( name) ?) ;
77
98
}
99
+ true
78
100
} ,
79
- _ => return Err ( RcgenError :: UnsupportedExtension ) ,
101
+ _ => false ,
102
+ } ;
103
+ if !supported {
104
+ params. custom_extensions . push ( CustomExtension {
105
+ oid : ext. oid . iter ( ) . unwrap ( ) . collect ( ) ,
106
+ critical : ext. critical ,
107
+ content : ext. value . to_vec ( ) ,
108
+ } )
80
109
}
81
110
}
82
111
}
0 commit comments