@@ -154,11 +154,7 @@ impl CertificateParams {
154
154
issuer_key : & KeyPair ,
155
155
) -> Result < Certificate , Error > {
156
156
let subject_public_key_info = key_pair. public_key_der ( ) ;
157
- let der = self . serialize_der_with_signer (
158
- key_pair,
159
- issuer_key,
160
- & issuer. params . distinguished_name ,
161
- ) ?;
157
+ let der = self . serialize_der_with_signer ( key_pair, issuer_key, & issuer. params ) ?;
162
158
Ok ( Certificate {
163
159
params : self ,
164
160
subject_public_key_info,
@@ -172,7 +168,7 @@ impl CertificateParams {
172
168
/// [`Certificate::pem`].
173
169
pub fn self_signed ( self , key_pair : & KeyPair ) -> Result < Certificate , Error > {
174
170
let subject_public_key_info = key_pair. public_key_der ( ) ;
175
- let der = self . serialize_der_with_signer ( key_pair, key_pair, & self . distinguished_name ) ?;
171
+ let der = self . serialize_der_with_signer ( key_pair, key_pair, & self ) ?;
176
172
Ok ( Certificate {
177
173
params : self ,
178
174
subject_public_key_info,
@@ -567,7 +563,7 @@ impl CertificateParams {
567
563
& self ,
568
564
pub_key : & K ,
569
565
issuer : & KeyPair ,
570
- issuer_name : & DistinguishedName ,
566
+ issuer_params : & CertificateParams ,
571
567
) -> Result < CertificateDer < ' static > , Error > {
572
568
let der = issuer. sign_der ( |writer| {
573
569
let pub_key_spki =
@@ -596,7 +592,7 @@ impl CertificateParams {
596
592
// Write signature algorithm
597
593
issuer. alg . write_alg_ident ( writer. next ( ) ) ;
598
594
// Write issuer name
599
- write_distinguished_name ( writer. next ( ) , issuer_name ) ;
595
+ write_distinguished_name ( writer. next ( ) , & issuer_params . distinguished_name ) ;
600
596
// Write validity
601
597
writer. next ( ) . write_sequence ( |writer| {
602
598
// Not before
@@ -626,7 +622,13 @@ impl CertificateParams {
626
622
if self . use_authority_key_identifier_extension {
627
623
write_x509_authority_key_identifier (
628
624
writer. next ( ) ,
629
- self . key_identifier_method . derive ( issuer. public_key_der ( ) ) ,
625
+ match & issuer_params. key_identifier_method {
626
+ KeyIdMethod :: PreSpecified ( aki) => aki. clone ( ) ,
627
+ #[ cfg( feature = "crypto" ) ]
628
+ _ => issuer_params
629
+ . key_identifier_method
630
+ . derive ( issuer. public_key_der ( ) ) ,
631
+ } ,
630
632
) ;
631
633
}
632
634
// Write subject_alt_names
@@ -1397,24 +1399,24 @@ PITGdT9dgN88nHPCle0B1+OY+OZ5
1397
1399
-----END PRIVATE KEY-----"# ;
1398
1400
1399
1401
let params = CertificateParams :: from_ca_cert_pem ( ca_cert) . unwrap ( ) ;
1400
- let expected_ski = vec ! [
1402
+ let ca_ski = vec ! [
1401
1403
0x97 , 0xD4 , 0x76 , 0xA1 , 0x9B , 0x1A , 0x71 , 0x35 , 0x2A , 0xC7 , 0xF4 , 0xA1 , 0x84 , 0x12 ,
1402
1404
0x56 , 0x06 , 0xBA , 0x5D , 0x61 , 0x84 ,
1403
1405
] ;
1404
1406
1405
1407
assert_eq ! (
1406
- KeyIdMethod :: PreSpecified ( expected_ski . clone( ) ) ,
1408
+ KeyIdMethod :: PreSpecified ( ca_ski . clone( ) ) ,
1407
1409
params. key_identifier_method
1408
1410
) ;
1409
1411
1410
- let kp = KeyPair :: from_pem ( ca_key) . unwrap ( ) ;
1411
- let ca_cert = params. self_signed ( & kp ) . unwrap ( ) ;
1412
- assert_eq ! ( & expected_ski , & ca_cert. key_identifier( ) ) ;
1412
+ let ca_kp = KeyPair :: from_pem ( ca_key) . unwrap ( ) ;
1413
+ let ca_cert = params. self_signed ( & ca_kp ) . unwrap ( ) ;
1414
+ assert_eq ! ( & ca_ski , & ca_cert. key_identifier( ) ) ;
1413
1415
1414
- let ( _remainder , x509 ) = x509_parser:: parse_x509_certificate ( ca_cert. der ( ) ) . unwrap ( ) ;
1416
+ let ( _ , x509_ca ) = x509_parser:: parse_x509_certificate ( ca_cert. der ( ) ) . unwrap ( ) ;
1415
1417
assert_eq ! (
1416
- & expected_ski ,
1417
- & x509
1418
+ & ca_ski ,
1419
+ & x509_ca
1418
1420
. iter_extensions( )
1419
1421
. find_map( |ext| match ext. parsed_extension( ) {
1420
1422
x509_parser:: extensions:: ParsedExtension :: SubjectKeyIdentifier ( key_id) => {
@@ -1424,6 +1426,25 @@ PITGdT9dgN88nHPCle0B1+OY+OZ5
1424
1426
} )
1425
1427
. unwrap( )
1426
1428
) ;
1429
+
1430
+ let ee_key = KeyPair :: generate ( ) . unwrap ( ) ;
1431
+ let mut ee_params = CertificateParams :: default ( ) ;
1432
+ ee_params. use_authority_key_identifier_extension = true ;
1433
+ let ee_cert = ee_params. signed_by ( & ee_key, & ca_cert, & ee_key) . unwrap ( ) ;
1434
+
1435
+ let ( _, x509_ee) = x509_parser:: parse_x509_certificate ( ee_cert. der ( ) ) . unwrap ( ) ;
1436
+ assert_eq ! (
1437
+ & ca_ski,
1438
+ & x509_ee
1439
+ . iter_extensions( )
1440
+ . find_map( |ext| match ext. parsed_extension( ) {
1441
+ x509_parser:: extensions:: ParsedExtension :: AuthorityKeyIdentifier ( aki) => {
1442
+ aki. key_identifier. as_ref( ) . map( |ki| ki. 0 . to_vec( ) )
1443
+ } ,
1444
+ _ => None ,
1445
+ } )
1446
+ . unwrap( )
1447
+ ) ;
1427
1448
}
1428
1449
}
1429
1450
}
0 commit comments