@@ -124,28 +124,44 @@ impl CsrOptions {
124
124
#[ cfg( test) ]
125
125
mod tests {
126
126
use crate :: tls;
127
+ use itertools:: Itertools ;
127
128
128
129
#[ test]
129
130
fn test_csr ( ) {
130
- use x509_parser:: prelude:: FromDer ;
131
+ use x509_parser:: prelude:: * ;
131
132
let csr = tls:: csr:: CsrOptions {
132
133
san : "spiffe://td/ns/ns1/sa/sa1" . to_string ( ) ,
133
134
}
134
135
. generate ( )
135
136
. unwrap ( ) ;
137
+
136
138
let ( _, der) = x509_parser:: pem:: parse_x509_pem ( csr. csr . as_bytes ( ) ) . unwrap ( ) ;
137
139
138
140
let ( _, cert) =
139
141
x509_parser:: certification_request:: X509CertificationRequest :: from_der ( & der. contents )
140
142
. unwrap ( ) ;
141
143
cert. verify_signature ( ) . unwrap ( ) ;
144
+ let subject = cert. certification_request_info . subject . iter ( ) . collect_vec ( ) ;
145
+ assert_eq ! ( subject. len( ) , 0 ) ;
142
146
let attr = cert
143
147
. certification_request_info
144
148
. iter_attributes ( )
145
149
. next ( )
146
150
. unwrap ( ) ;
147
- // SAN is encoded in some format I don't understand how to parse; this could be improved.
148
- // but make sure it's there in a hacky manner
149
- assert ! ( attr. value. ends_with( b"spiffe://td/ns/ns1/sa/sa1" ) ) ;
151
+
152
+ let ParsedCriAttribute :: ExtensionRequest ( parsed) = attr. parsed_attribute ( ) else {
153
+ panic ! ( "not a ExtensionRequest" )
154
+ } ;
155
+ let ext = parsed. clone ( ) . extensions ;
156
+ assert_eq ! ( ext. len( ) , 1 ) ;
157
+ let ext = ext. into_iter ( ) . next ( ) . unwrap ( ) ;
158
+ assert ! ( ext. critical) ;
159
+ let ParsedExtension :: SubjectAlternativeName ( san) = ext. parsed_extension ( ) else {
160
+ panic ! ( "not a SubjectAlternativeName" )
161
+ } ;
162
+ assert_eq ! (
163
+ & format!( "{san:?}" ) ,
164
+ "SubjectAlternativeName { general_names: [URI(\" spiffe://td/ns/ns1/sa/sa1\" )] }"
165
+ )
150
166
}
151
167
}
0 commit comments