55
66from base64 import b64decode
77import json
8+ from defusedxml .lxml import fromstring
89from lxml import etree
910from os .path import dirname , join , exists
1011import unittest
@@ -718,15 +719,28 @@ def testDecryptElement(self):
718719 key2 = f .read ()
719720 f .close ()
720721
721- with self .assertRaisesRegexp (Exception , "('failed to decrypt', -1)" ):
722- OneLogin_Saml2_Utils .decrypt_element (encrypted_data , key2 )
722+ # sp.key and sp2.key are equivalent we should be able to decrypt the nameID again
723+ decrypted_nameid = OneLogin_Saml2_Utils .decrypt_element (encrypted_data , key2 )
724+ self .assertIn ('{%s}NameID' % (OneLogin_Saml2_Constants .NS_SAML ), decrypted_nameid .tag )
725+ self .assertEqual ('457bdb600de717891c77647b0806ce59c089d5b8' , decrypted_nameid .text )
723726
724727 key_3_file_name = join (self .data_path , 'misc' , 'sp3.key' )
725728 f = open (key_3_file_name , 'r' )
726729 key3 = f .read ()
727730 f .close ()
731+
732+ # sp.key and sp3.key are equivalent we should be able to decrypt the nameID again
733+ decrypted_nameid = OneLogin_Saml2_Utils .decrypt_element (encrypted_data , key3 )
734+ self .assertIn ('{%s}NameID' % (OneLogin_Saml2_Constants .NS_SAML ), decrypted_nameid .tag )
735+ self .assertEqual ('457bdb600de717891c77647b0806ce59c089d5b8' , decrypted_nameid .text )
736+
737+ key_4_file_name = join (self .data_path , 'misc' , 'sp4.key' )
738+ f = open (key_4_file_name , 'r' )
739+ key4 = f .read ()
740+ f .close ()
741+
728742 with self .assertRaisesRegexp (Exception , "('failed to decrypt', -1)" ):
729- OneLogin_Saml2_Utils .decrypt_element (encrypted_data , key3 )
743+ OneLogin_Saml2_Utils .decrypt_element (encrypted_data , key4 )
730744
731745 xml_nameid_enc_2 = b64decode (self .file_contents (join (self .data_path , 'responses' , 'invalids' , 'encrypted_nameID_without_EncMethod.xml.base64' )))
732746 dom_nameid_enc_2 = parseString (xml_nameid_enc_2 )
@@ -744,6 +758,33 @@ def testDecryptElement(self):
744758 with self .assertRaisesRegexp (Exception , "('failed to decrypt', -1)" ):
745759 OneLogin_Saml2_Utils .decrypt_element (encrypted_data_3 , key )
746760
761+ def testDecryptElementInplace (self ):
762+ """
763+ Tests the decrypt_element method of the OneLogin_Saml2_Utils with inplace=True
764+ """
765+ settings = OneLogin_Saml2_Settings (self .loadSettingsJSON ())
766+
767+ key = settings .get_sp_key ()
768+
769+ xml_nameid_enc = b64decode (self .file_contents (join (self .data_path , 'responses' , 'response_encrypted_nameid.xml.base64' )))
770+ dom = fromstring (xml_nameid_enc )
771+ encrypted_node = dom .xpath ('//saml:EncryptedID/xenc:EncryptedData' , namespaces = OneLogin_Saml2_Constants .NSMAP )[0 ]
772+
773+ # can be decrypted twice when copy the node first
774+ for _ in range (2 ):
775+ decrypted_nameid = OneLogin_Saml2_Utils .decrypt_element (encrypted_node , key , inplace = False )
776+ self .assertIn ('NameID' , decrypted_nameid .tag )
777+ self .assertEqual ('2de11defd199f8d5bb63f9b7deb265ba5c675c10' , decrypted_nameid .text )
778+
779+ # can only be decrypted once in place
780+ decrypted_nameid = OneLogin_Saml2_Utils .decrypt_element (encrypted_node , key , inplace = True )
781+ self .assertIn ('NameID' , decrypted_nameid .tag )
782+ self .assertEqual ('2de11defd199f8d5bb63f9b7deb265ba5c675c10' , decrypted_nameid .text )
783+
784+ # can't be decrypted twice since it has been dcrypted inplace
785+ with self .assertRaisesRegexp (Exception , "('failed to decrypt', -1)" ):
786+ OneLogin_Saml2_Utils .decrypt_element (encrypted_node , key , inplace = True )
787+
747788 def testAddSign (self ):
748789 """
749790 Tests the add_sign method of the OneLogin_Saml2_Utils
0 commit comments