@@ -360,7 +360,7 @@ mod test_parse_other_name_alt_name {
360
360
361
361
#[ cfg( feature = "x509-parser" ) ]
362
362
mod test_csr {
363
- use rcgen:: { CertificateParams , CertificateSigningRequestParams , KeyPair } ;
363
+ use rcgen:: { CertificateParams , CertificateSigningRequestParams , KeyPair , KeyUsagePurpose } ;
364
364
365
365
#[ test]
366
366
fn test_csr_roundtrip ( ) {
@@ -375,4 +375,32 @@ mod test_csr {
375
375
// Ensure algorithms match.
376
376
assert_eq ! ( key_pair. algorithm( ) , csrp. public_key. algorithm( ) ) ;
377
377
}
378
+
379
+ #[ test]
380
+ fn test_nontrivial_csr_roundtrip ( ) {
381
+ let key_pair = KeyPair :: generate ( ) . unwrap ( ) ;
382
+
383
+ // We should be able to serialize a CSR, and then parse the CSR.
384
+ let mut params = CertificateParams :: default ( ) ;
385
+ params. key_usages = vec ! [
386
+ KeyUsagePurpose :: DigitalSignature ,
387
+ KeyUsagePurpose :: ContentCommitment ,
388
+ KeyUsagePurpose :: KeyEncipherment ,
389
+ KeyUsagePurpose :: DataEncipherment ,
390
+ KeyUsagePurpose :: KeyAgreement ,
391
+ KeyUsagePurpose :: KeyCertSign ,
392
+ KeyUsagePurpose :: CrlSign ,
393
+ // It doesn't make sense to have both encipher and decipher only
394
+ // So we'll take this opportunity to test omitting a key usage
395
+ // KeyUsagePurpose::EncipherOnly,
396
+ KeyUsagePurpose :: DecipherOnly ,
397
+ ] ;
398
+ let csr = params. serialize_request ( & key_pair) . unwrap ( ) ;
399
+ let csrp = CertificateSigningRequestParams :: from_der ( csr. der ( ) ) . unwrap ( ) ;
400
+
401
+ // Ensure algorithms match.
402
+ assert_eq ! ( key_pair. algorithm( ) , csrp. public_key. algorithm( ) ) ;
403
+ // Ensure key usages match.
404
+ assert_eq ! ( csrp. params. key_usages, params. key_usages) ;
405
+ }
378
406
}
0 commit comments