19
19
20
20
from future .backports .urllib .parse import urlencode
21
21
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
41
29
42
30
from tempfile import NamedTemporaryFile
43
31
from subprocess import Popen
87
75
PREFIX1 = "<?xml version='1.0' encoding='UTF-8'?>"
88
76
PREFIX2 = '<?xml version="1.0" encoding="UTF-8"?>'
89
77
78
+ backend = default_backend ()
79
+
90
80
91
81
class SigverError (SAMLError ):
92
82
pass
@@ -406,18 +396,10 @@ def active_cert(key):
406
396
"""
407
397
try :
408
398
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
421
403
except AssertionError :
422
404
return False
423
405
except AttributeError :
@@ -555,19 +537,8 @@ def rsa_eq(key1, key2):
555
537
556
538
557
539
def 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 ()
571
542
572
543
573
544
def pem_format (key ):
@@ -576,7 +547,7 @@ def pem_format(key):
576
547
577
548
578
549
def 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 )
580
551
581
552
582
553
def parse_xmlsec_output (output ):
@@ -622,25 +593,28 @@ def sign(self, msg, key=None):
622
593
if key is None :
623
594
key = self .key
624
595
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 )
628
597
629
598
def verify (self , msg , sig , key = None ):
630
599
if key is None :
631
600
key = self .key
632
601
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
636
610
637
611
638
612
SIGNER_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 () ),
644
618
}
645
619
646
620
REQ_ORDER = ["SAMLRequest" , "RelayState" , "SigAlg" ]
0 commit comments