1919
2020from future .backports .urllib .parse import urlencode
2121
22- # from Crypto.PublicKey.RSA import importKey
23- # from Crypto.Signature import PKCS1_v1_5
24- # from Crypto.Util.asn1 import DerSequence
25- # from Crypto.PublicKey import RSA
26- # from Crypto.Hash import SHA
27- # from Crypto.Hash import SHA224
28- # from Crypto.Hash import SHA256
29- # from Crypto.Hash import SHA384
30- # from Crypto.Hash import SHA512
31-
32- from Cryptodome .PublicKey .RSA import importKey
33- from Cryptodome .Signature import PKCS1_v1_5
34- from Cryptodome .Util .asn1 import DerSequence
35- from Cryptodome .PublicKey import RSA
36- from Cryptodome .Hash import SHA
37- from Cryptodome .Hash import SHA224
38- from Cryptodome .Hash import SHA256
39- from Cryptodome .Hash import SHA384
40- from Cryptodome .Hash import SHA512
22+ from cryptography .exceptions import InvalidSignature
23+ from cryptography .hazmat .backends import default_backend
24+ from cryptography .hazmat .primitives import hashes
25+ from cryptography .hazmat .primitives .asymmetric import rsa
26+ from cryptography .hazmat .primitives .asymmetric .padding import PKCS1v15
27+ from cryptography .hazmat .primitives .serialization import load_pem_private_key
28+ from cryptography .x509 import load_pem_x509_certificate
4129
4230from tempfile import NamedTemporaryFile
4331from subprocess import Popen
8775PREFIX1 = "<?xml version='1.0' encoding='UTF-8'?>"
8876PREFIX2 = '<?xml version="1.0" encoding="UTF-8"?>'
8977
78+ backend = default_backend ()
79+
9080
9181class SigverError (SAMLError ):
9282 pass
@@ -406,18 +396,10 @@ def active_cert(key):
406396 """
407397 try :
408398 cert_str = pem_format (key )
409- try :
410- certificate = importKey (cert_str )
411- not_before = to_time (str (certificate .get_not_before ()))
412- not_after = to_time (str (certificate .get_not_after ()))
413- assert not_before < utc_now ()
414- assert not_after > utc_now ()
415- return True
416- except :
417- cert = crypto .load_certificate (crypto .FILETYPE_PEM , cert_str )
418- assert cert .has_expired () == 0
419- assert not OpenSSLWrapper ().certificate_not_valid_yet (cert )
420- return True
399+ cert = crypto .load_certificate (crypto .FILETYPE_PEM , cert_str )
400+ assert cert .has_expired () == 0
401+ assert not OpenSSLWrapper ().certificate_not_valid_yet (cert )
402+ return True
421403 except AssertionError :
422404 return False
423405 except AttributeError :
@@ -555,19 +537,8 @@ def rsa_eq(key1, key2):
555537
556538
557539def extract_rsa_key_from_x509_cert (pem ):
558- # Convert from PEM to DER
559- der = ssl .PEM_cert_to_DER_cert (pem .decode ('ascii' ))
560-
561- # Extract subjectPublicKeyInfo field from X.509 certificate (see RFC3280)
562- cert = DerSequence ()
563- cert .decode (der )
564- tbsCertificate = DerSequence ()
565- tbsCertificate .decode (cert [0 ])
566- subjectPublicKeyInfo = tbsCertificate [6 ]
567-
568- # Initialize RSA key
569- rsa_key = RSA .importKey (subjectPublicKeyInfo )
570- return rsa_key
540+ cert = load_pem_x509_certificate (pem , backend )
541+ return cert .public_key ()
571542
572543
573544def pem_format (key ):
@@ -576,7 +547,7 @@ def pem_format(key):
576547
577548
578549def import_rsa_key_from_file (filename ):
579- return RSA . importKey (read_file (filename , 'r' ) )
550+ return load_pem_private_key (read_file (filename , 'rb' ), None , backend )
580551
581552
582553def parse_xmlsec_output (output ):
@@ -622,25 +593,28 @@ def sign(self, msg, key=None):
622593 if key is None :
623594 key = self .key
624595
625- h = self .digest .new (msg )
626- signer = PKCS1_v1_5 .new (key )
627- return signer .sign (h )
596+ return key .sign (msg , PKCS1v15 (), self .digest )
628597
629598 def verify (self , msg , sig , key = None ):
630599 if key is None :
631600 key = self .key
632601
633- h = self .digest .new (msg )
634- verifier = PKCS1_v1_5 .new (key )
635- return verifier .verify (h , sig )
602+ try :
603+ if isinstance (key , rsa .RSAPrivateKey ):
604+ key = key .public_key ()
605+
606+ key .verify (sig , msg , PKCS1v15 (), self .digest )
607+ return True
608+ except InvalidSignature :
609+ return False
636610
637611
638612SIGNER_ALGS = {
639- SIG_RSA_SHA1 : RSASigner (SHA ),
640- SIG_RSA_SHA224 : RSASigner (SHA224 ),
641- SIG_RSA_SHA256 : RSASigner (SHA256 ),
642- SIG_RSA_SHA384 : RSASigner (SHA384 ),
643- SIG_RSA_SHA512 : RSASigner (SHA512 ),
613+ SIG_RSA_SHA1 : RSASigner (hashes . SHA1 () ),
614+ SIG_RSA_SHA224 : RSASigner (hashes . SHA224 () ),
615+ SIG_RSA_SHA256 : RSASigner (hashes . SHA256 () ),
616+ SIG_RSA_SHA384 : RSASigner (hashes . SHA384 () ),
617+ SIG_RSA_SHA512 : RSASigner (hashes . SHA512 () ),
644618}
645619
646620REQ_ORDER = ["SAMLRequest" , "RelayState" , "SigAlg" ]
0 commit comments