15
15
from cryptography .hazmat .backends .openssl import aead
16
16
from cryptography .hazmat .backends .openssl .ciphers import _CipherContext
17
17
from cryptography .hazmat .backends .openssl .cmac import _CMACContext
18
- from cryptography .hazmat .backends .openssl .dsa import (
19
- _DSAParameters ,
20
- _DSAPrivateKey ,
21
- _DSAPublicKey ,
22
- )
23
18
from cryptography .hazmat .backends .openssl .ec import (
24
19
_EllipticCurvePrivateKey ,
25
20
_EllipticCurvePublicKey ,
@@ -551,10 +546,9 @@ def _evp_pkey_to_private_key(
551
546
unsafe_skip_rsa_key_validation = unsafe_skip_rsa_key_validation ,
552
547
)
553
548
elif key_type == self ._lib .EVP_PKEY_DSA :
554
- dsa_cdata = self ._lib .EVP_PKEY_get1_DSA (evp_pkey )
555
- self .openssl_assert (dsa_cdata != self ._ffi .NULL )
556
- dsa_cdata = self ._ffi .gc (dsa_cdata , self ._lib .DSA_free )
557
- return _DSAPrivateKey (self , dsa_cdata , evp_pkey )
549
+ return rust_openssl .dsa .private_key_from_ptr (
550
+ int (self ._ffi .cast ("uintptr_t" , evp_pkey ))
551
+ )
558
552
elif key_type == self ._lib .EVP_PKEY_EC :
559
553
ec_cdata = self ._lib .EVP_PKEY_get1_EC_KEY (evp_pkey )
560
554
self .openssl_assert (ec_cdata != self ._ffi .NULL )
@@ -613,10 +607,9 @@ def _evp_pkey_to_public_key(self, evp_pkey) -> PublicKeyTypes:
613
607
self .openssl_assert (res == 1 )
614
608
return self .load_der_public_key (self ._read_mem_bio (bio ))
615
609
elif key_type == self ._lib .EVP_PKEY_DSA :
616
- dsa_cdata = self ._lib .EVP_PKEY_get1_DSA (evp_pkey )
617
- self .openssl_assert (dsa_cdata != self ._ffi .NULL )
618
- dsa_cdata = self ._ffi .gc (dsa_cdata , self ._lib .DSA_free )
619
- return _DSAPublicKey (self , dsa_cdata , evp_pkey )
610
+ return rust_openssl .dsa .public_key_from_ptr (
611
+ int (self ._ffi .cast ("uintptr_t" , evp_pkey ))
612
+ )
620
613
elif key_type == self ._lib .EVP_PKEY_EC :
621
614
ec_cdata = self ._lib .EVP_PKEY_get1_EC_KEY (evp_pkey )
622
615
if ec_cdata == self ._ffi .NULL :
@@ -696,115 +689,41 @@ def generate_dsa_parameters(self, key_size: int) -> dsa.DSAParameters:
696
689
"Key size must be 1024, 2048, 3072, or 4096 bits."
697
690
)
698
691
699
- ctx = self ._lib .DSA_new ()
700
- self .openssl_assert (ctx != self ._ffi .NULL )
701
- ctx = self ._ffi .gc (ctx , self ._lib .DSA_free )
702
-
703
- res = self ._lib .DSA_generate_parameters_ex (
704
- ctx ,
705
- key_size ,
706
- self ._ffi .NULL ,
707
- 0 ,
708
- self ._ffi .NULL ,
709
- self ._ffi .NULL ,
710
- self ._ffi .NULL ,
711
- )
712
-
713
- self .openssl_assert (res == 1 )
714
-
715
- return _DSAParameters (self , ctx )
692
+ return rust_openssl .dsa .generate_parameters (key_size )
716
693
717
694
def generate_dsa_private_key (
718
695
self , parameters : dsa .DSAParameters
719
696
) -> dsa .DSAPrivateKey :
720
- ctx = self ._lib .DSAparams_dup (
721
- parameters ._dsa_cdata # type: ignore[attr-defined]
722
- )
723
- self .openssl_assert (ctx != self ._ffi .NULL )
724
- ctx = self ._ffi .gc (ctx , self ._lib .DSA_free )
725
- self ._lib .DSA_generate_key (ctx )
726
- evp_pkey = self ._dsa_cdata_to_evp_pkey (ctx )
727
-
728
- return _DSAPrivateKey (self , ctx , evp_pkey )
697
+ return parameters .generate_private_key ()
729
698
730
699
def generate_dsa_private_key_and_parameters (
731
700
self , key_size : int
732
701
) -> dsa .DSAPrivateKey :
733
702
parameters = self .generate_dsa_parameters (key_size )
734
703
return self .generate_dsa_private_key (parameters )
735
704
736
- def _dsa_cdata_set_values (
737
- self , dsa_cdata , p , q , g , pub_key , priv_key
738
- ) -> None :
739
- res = self ._lib .DSA_set0_pqg (dsa_cdata , p , q , g )
740
- self .openssl_assert (res == 1 )
741
- res = self ._lib .DSA_set0_key (dsa_cdata , pub_key , priv_key )
742
- self .openssl_assert (res == 1 )
743
-
744
705
def load_dsa_private_numbers (
745
706
self , numbers : dsa .DSAPrivateNumbers
746
707
) -> dsa .DSAPrivateKey :
747
708
dsa ._check_dsa_private_numbers (numbers )
748
- parameter_numbers = numbers .public_numbers .parameter_numbers
749
-
750
- dsa_cdata = self ._lib .DSA_new ()
751
- self .openssl_assert (dsa_cdata != self ._ffi .NULL )
752
- dsa_cdata = self ._ffi .gc (dsa_cdata , self ._lib .DSA_free )
753
-
754
- p = self ._int_to_bn (parameter_numbers .p )
755
- q = self ._int_to_bn (parameter_numbers .q )
756
- g = self ._int_to_bn (parameter_numbers .g )
757
- pub_key = self ._int_to_bn (numbers .public_numbers .y )
758
- priv_key = self ._int_to_bn (numbers .x )
759
- self ._dsa_cdata_set_values (dsa_cdata , p , q , g , pub_key , priv_key )
760
-
761
- evp_pkey = self ._dsa_cdata_to_evp_pkey (dsa_cdata )
762
-
763
- return _DSAPrivateKey (self , dsa_cdata , evp_pkey )
709
+ return rust_openssl .dsa .from_private_numbers (numbers )
764
710
765
711
def load_dsa_public_numbers (
766
712
self , numbers : dsa .DSAPublicNumbers
767
713
) -> dsa .DSAPublicKey :
768
714
dsa ._check_dsa_parameters (numbers .parameter_numbers )
769
- dsa_cdata = self ._lib .DSA_new ()
770
- self .openssl_assert (dsa_cdata != self ._ffi .NULL )
771
- dsa_cdata = self ._ffi .gc (dsa_cdata , self ._lib .DSA_free )
772
-
773
- p = self ._int_to_bn (numbers .parameter_numbers .p )
774
- q = self ._int_to_bn (numbers .parameter_numbers .q )
775
- g = self ._int_to_bn (numbers .parameter_numbers .g )
776
- pub_key = self ._int_to_bn (numbers .y )
777
- priv_key = self ._ffi .NULL
778
- self ._dsa_cdata_set_values (dsa_cdata , p , q , g , pub_key , priv_key )
779
-
780
- evp_pkey = self ._dsa_cdata_to_evp_pkey (dsa_cdata )
781
-
782
- return _DSAPublicKey (self , dsa_cdata , evp_pkey )
715
+ return rust_openssl .dsa .from_public_numbers (numbers )
783
716
784
717
def load_dsa_parameter_numbers (
785
718
self , numbers : dsa .DSAParameterNumbers
786
719
) -> dsa .DSAParameters :
787
720
dsa ._check_dsa_parameters (numbers )
788
- dsa_cdata = self ._lib .DSA_new ()
789
- self .openssl_assert (dsa_cdata != self ._ffi .NULL )
790
- dsa_cdata = self ._ffi .gc (dsa_cdata , self ._lib .DSA_free )
791
-
792
- p = self ._int_to_bn (numbers .p )
793
- q = self ._int_to_bn (numbers .q )
794
- g = self ._int_to_bn (numbers .g )
795
- res = self ._lib .DSA_set0_pqg (dsa_cdata , p , q , g )
796
- self .openssl_assert (res == 1 )
797
-
798
- return _DSAParameters (self , dsa_cdata )
799
-
800
- def _dsa_cdata_to_evp_pkey (self , dsa_cdata ):
801
- evp_pkey = self ._create_evp_pkey_gc ()
802
- res = self ._lib .EVP_PKEY_set1_DSA (evp_pkey , dsa_cdata )
803
- self .openssl_assert (res == 1 )
804
- return evp_pkey
721
+ return rust_openssl .dsa .from_parameter_numbers (numbers )
805
722
806
723
def dsa_supported (self ) -> bool :
807
- return not self ._fips_enabled
724
+ return (
725
+ not self ._lib .CRYPTOGRAPHY_IS_BORINGSSL and not self ._fips_enabled
726
+ )
808
727
809
728
def dsa_hash_supported (self , algorithm : hashes .HashAlgorithm ) -> bool :
810
729
if not self .dsa_supported ():
@@ -1409,8 +1328,6 @@ def _private_key_bytes(
1409
1328
if encoding is serialization .Encoding .PEM :
1410
1329
if key_type == self ._lib .EVP_PKEY_RSA :
1411
1330
write_bio = self ._lib .PEM_write_bio_RSAPrivateKey
1412
- elif key_type == self ._lib .EVP_PKEY_DSA :
1413
- write_bio = self ._lib .PEM_write_bio_DSAPrivateKey
1414
1331
else :
1415
1332
assert key_type == self ._lib .EVP_PKEY_EC
1416
1333
write_bio = self ._lib .PEM_write_bio_ECPrivateKey
@@ -1426,11 +1343,9 @@ def _private_key_bytes(
1426
1343
)
1427
1344
if key_type == self ._lib .EVP_PKEY_RSA :
1428
1345
write_bio = self ._lib .i2d_RSAPrivateKey_bio
1429
- elif key_type == self ._lib .EVP_PKEY_EC :
1430
- write_bio = self ._lib .i2d_ECPrivateKey_bio
1431
1346
else :
1432
- assert key_type == self ._lib .EVP_PKEY_DSA
1433
- write_bio = self ._lib .i2d_DSAPrivateKey_bio
1347
+ assert key_type == self ._lib .EVP_PKEY_EC
1348
+ write_bio = self ._lib .i2d_ECPrivateKey_bio
1434
1349
return self ._bio_func_output (write_bio , cdata )
1435
1350
1436
1351
raise ValueError ("Unsupported encoding for TraditionalOpenSSL" )
0 commit comments