@@ -340,83 +340,109 @@ pub fn serialize_private_key(
340
340
let g_bytes;
341
341
let q_bytes_dh;
342
342
343
- let ( params, private_key_der) = if let Ok ( rsa) = pkey. rsa ( ) {
344
- let pkcs1_der = rsa:: serialize_pkcs1_private_key ( & rsa) ?;
345
- ( AlgorithmParameters :: Rsa ( Some ( ( ) ) ) , pkcs1_der)
346
- } else if let Ok ( ec) = pkey. ec_key ( ) {
347
- let curve_oid = ec:: group_to_curve_oid ( ec. group ( ) ) . expect ( "Unknown curve" ) ;
348
- let pkcs1_der = ec:: serialize_pkcs1_private_key ( & ec, false ) ?;
349
- (
350
- AlgorithmParameters :: Ec ( cryptography_x509:: common:: EcParameters :: NamedCurve (
351
- curve_oid,
352
- ) ) ,
353
- pkcs1_der,
354
- )
355
- } else if pkey. id ( ) == openssl:: pkey:: Id :: ED25519 {
356
- let raw_bytes = pkey. raw_private_key ( ) ?;
357
- let private_key_der = asn1:: write_single ( & raw_bytes. as_slice ( ) ) ?;
358
- ( AlgorithmParameters :: Ed25519 , private_key_der)
359
- } else if pkey. id ( ) == openssl:: pkey:: Id :: X25519 {
360
- let raw_bytes = pkey. raw_private_key ( ) ?;
361
- let private_key_der = asn1:: write_single ( & raw_bytes. as_slice ( ) ) ?;
362
- ( AlgorithmParameters :: X25519 , private_key_der)
363
- } else if crate :: utils:: is_ed448 ( pkey. id ( ) ) {
364
- let raw_bytes = pkey. raw_private_key ( ) ?;
365
- let private_key_der = asn1:: write_single ( & raw_bytes. as_slice ( ) ) ?;
366
- ( AlgorithmParameters :: Ed448 , private_key_der)
367
- } else if crate :: utils:: is_x448 ( pkey. id ( ) ) {
368
- let raw_bytes = pkey. raw_private_key ( ) ?;
369
- let private_key_der = asn1:: write_single ( & raw_bytes. as_slice ( ) ) ?;
370
- ( AlgorithmParameters :: X448 , private_key_der)
371
- } else if let Ok ( dsa) = pkey. dsa ( ) {
372
- p_bytes = cryptography_openssl:: utils:: bn_to_big_endian_bytes ( dsa. p ( ) ) ?;
373
- q_bytes = cryptography_openssl:: utils:: bn_to_big_endian_bytes ( dsa. q ( ) ) ?;
374
- g_bytes = cryptography_openssl:: utils:: bn_to_big_endian_bytes ( dsa. g ( ) ) ?;
375
-
376
- let priv_key_bytes = cryptography_openssl:: utils:: bn_to_big_endian_bytes ( dsa. priv_key ( ) ) ?;
377
- let priv_key_int = asn1:: BigUint :: new ( & priv_key_bytes) . unwrap ( ) ;
378
- let private_key_der = asn1:: write_single ( & priv_key_int) ?;
379
-
380
- let dsa_params = cryptography_x509:: common:: DssParams {
381
- p : asn1:: BigUint :: new ( & p_bytes) . unwrap ( ) ,
382
- q : asn1:: BigUint :: new ( & q_bytes) . unwrap ( ) ,
383
- g : asn1:: BigUint :: new ( & g_bytes) . unwrap ( ) ,
384
- } ;
385
-
386
- ( AlgorithmParameters :: Dsa ( dsa_params) , private_key_der)
387
- } else if let Ok ( dh) = pkey. dh ( ) {
388
- p_bytes = cryptography_openssl:: utils:: bn_to_big_endian_bytes ( dh. prime_p ( ) ) ?;
389
- g_bytes = cryptography_openssl:: utils:: bn_to_big_endian_bytes ( dh. generator ( ) ) ?;
390
- q_bytes_dh = dh
391
- . prime_q ( )
392
- . map ( cryptography_openssl:: utils:: bn_to_big_endian_bytes)
393
- . transpose ( ) ?;
394
-
395
- let priv_key_bytes = cryptography_openssl:: utils:: bn_to_big_endian_bytes ( dh. private_key ( ) ) ?;
396
- let priv_key_int = asn1:: BigUint :: new ( & priv_key_bytes) . unwrap ( ) ;
397
- let private_key_der = asn1:: write_single ( & priv_key_int) ?;
398
-
399
- let params = if let Some ( ref q_bytes) = q_bytes_dh {
400
- let dhx_params = cryptography_x509:: common:: DHXParams {
343
+ let ( params, private_key_der) = match pkey. id ( ) {
344
+ openssl:: pkey:: Id :: RSA => {
345
+ let rsa = pkey. rsa ( ) ?;
346
+ let pkcs1_der = rsa:: serialize_pkcs1_private_key ( & rsa) ?;
347
+ ( AlgorithmParameters :: Rsa ( Some ( ( ) ) ) , pkcs1_der)
348
+ }
349
+ openssl:: pkey:: Id :: EC => {
350
+ let ec = pkey. ec_key ( ) ?;
351
+ let curve_oid = ec:: group_to_curve_oid ( ec. group ( ) ) . expect ( "Unknown curve" ) ;
352
+ let pkcs1_der = ec:: serialize_pkcs1_private_key ( & ec, false ) ?;
353
+ (
354
+ AlgorithmParameters :: Ec ( cryptography_x509:: common:: EcParameters :: NamedCurve (
355
+ curve_oid,
356
+ ) ) ,
357
+ pkcs1_der,
358
+ )
359
+ }
360
+ openssl:: pkey:: Id :: ED25519 => {
361
+ let raw_bytes = pkey. raw_private_key ( ) ?;
362
+ let private_key_der = asn1:: write_single ( & raw_bytes. as_slice ( ) ) ?;
363
+ ( AlgorithmParameters :: Ed25519 , private_key_der)
364
+ }
365
+ openssl:: pkey:: Id :: X25519 => {
366
+ let raw_bytes = pkey. raw_private_key ( ) ?;
367
+ let private_key_der = asn1:: write_single ( & raw_bytes. as_slice ( ) ) ?;
368
+ ( AlgorithmParameters :: X25519 , private_key_der)
369
+ }
370
+ #[ cfg( not( any(
371
+ CRYPTOGRAPHY_IS_LIBRESSL ,
372
+ CRYPTOGRAPHY_IS_BORINGSSL ,
373
+ CRYPTOGRAPHY_IS_AWSLC
374
+ ) ) ) ]
375
+ openssl:: pkey:: Id :: ED448 => {
376
+ let raw_bytes = pkey. raw_private_key ( ) ?;
377
+ let private_key_der = asn1:: write_single ( & raw_bytes. as_slice ( ) ) ?;
378
+ ( AlgorithmParameters :: Ed448 , private_key_der)
379
+ }
380
+ #[ cfg( not( any(
381
+ CRYPTOGRAPHY_IS_LIBRESSL ,
382
+ CRYPTOGRAPHY_IS_BORINGSSL ,
383
+ CRYPTOGRAPHY_IS_AWSLC
384
+ ) ) ) ]
385
+ openssl:: pkey:: Id :: X448 => {
386
+ let raw_bytes = pkey. raw_private_key ( ) ?;
387
+ let private_key_der = asn1:: write_single ( & raw_bytes. as_slice ( ) ) ?;
388
+ ( AlgorithmParameters :: X448 , private_key_der)
389
+ }
390
+ openssl:: pkey:: Id :: DSA => {
391
+ let dsa = pkey. dsa ( ) ?;
392
+ p_bytes = cryptography_openssl:: utils:: bn_to_big_endian_bytes ( dsa. p ( ) ) ?;
393
+ q_bytes = cryptography_openssl:: utils:: bn_to_big_endian_bytes ( dsa. q ( ) ) ?;
394
+ g_bytes = cryptography_openssl:: utils:: bn_to_big_endian_bytes ( dsa. g ( ) ) ?;
395
+
396
+ let priv_key_bytes =
397
+ cryptography_openssl:: utils:: bn_to_big_endian_bytes ( dsa. priv_key ( ) ) ?;
398
+ let priv_key_int = asn1:: BigUint :: new ( & priv_key_bytes) . unwrap ( ) ;
399
+ let private_key_der = asn1:: write_single ( & priv_key_int) ?;
400
+
401
+ let dsa_params = cryptography_x509:: common:: DssParams {
401
402
p : asn1:: BigUint :: new ( & p_bytes) . unwrap ( ) ,
403
+ q : asn1:: BigUint :: new ( & q_bytes) . unwrap ( ) ,
402
404
g : asn1:: BigUint :: new ( & g_bytes) . unwrap ( ) ,
403
- q : asn1:: BigUint :: new ( q_bytes) . unwrap ( ) ,
404
- j : None ,
405
- validation_params : None ,
406
405
} ;
407
- AlgorithmParameters :: Dh ( dhx_params)
408
- } else {
409
- let basic_params = cryptography_x509:: common:: BasicDHParams {
410
- p : asn1:: BigUint :: new ( & p_bytes) . unwrap ( ) ,
411
- g : asn1:: BigUint :: new ( & g_bytes) . unwrap ( ) ,
412
- private_value_length : None ,
406
+
407
+ ( AlgorithmParameters :: Dsa ( dsa_params) , private_key_der)
408
+ }
409
+ id if crate :: utils:: is_dh ( id) => {
410
+ let dh = pkey. dh ( ) ?;
411
+ p_bytes = cryptography_openssl:: utils:: bn_to_big_endian_bytes ( dh. prime_p ( ) ) ?;
412
+ g_bytes = cryptography_openssl:: utils:: bn_to_big_endian_bytes ( dh. generator ( ) ) ?;
413
+ q_bytes_dh = dh
414
+ . prime_q ( )
415
+ . map ( cryptography_openssl:: utils:: bn_to_big_endian_bytes)
416
+ . transpose ( ) ?;
417
+
418
+ let priv_key_bytes =
419
+ cryptography_openssl:: utils:: bn_to_big_endian_bytes ( dh. private_key ( ) ) ?;
420
+ let priv_key_int = asn1:: BigUint :: new ( & priv_key_bytes) . unwrap ( ) ;
421
+ let private_key_der = asn1:: write_single ( & priv_key_int) ?;
422
+
423
+ let params = if let Some ( ref q_bytes) = q_bytes_dh {
424
+ let dhx_params = cryptography_x509:: common:: DHXParams {
425
+ p : asn1:: BigUint :: new ( & p_bytes) . unwrap ( ) ,
426
+ g : asn1:: BigUint :: new ( & g_bytes) . unwrap ( ) ,
427
+ q : asn1:: BigUint :: new ( q_bytes) . unwrap ( ) ,
428
+ j : None ,
429
+ validation_params : None ,
430
+ } ;
431
+ AlgorithmParameters :: Dh ( dhx_params)
432
+ } else {
433
+ let basic_params = cryptography_x509:: common:: BasicDHParams {
434
+ p : asn1:: BigUint :: new ( & p_bytes) . unwrap ( ) ,
435
+ g : asn1:: BigUint :: new ( & g_bytes) . unwrap ( ) ,
436
+ private_value_length : None ,
437
+ } ;
438
+ AlgorithmParameters :: DhKeyAgreement ( basic_params)
413
439
} ;
414
- AlgorithmParameters :: DhKeyAgreement ( basic_params)
415
- } ;
416
440
417
- ( params, private_key_der)
418
- } else {
419
- unimplemented ! ( "Unknown key type" ) ;
441
+ ( params, private_key_der)
442
+ }
443
+ _ => {
444
+ unimplemented ! ( "Unknown key type" ) ;
445
+ }
420
446
} ;
421
447
422
448
let pki = PrivateKeyInfo {
0 commit comments