@@ -1026,17 +1026,17 @@ def test_open_save(self):
10261026 filenames_in , filenames_out , passwords , transformed_keys ,
10271027 keyfiles , encryption_algorithms , kdf_algorithms , versions
10281028 ):
1029- kp = PyKeePass (
1029+ old_kp = PyKeePass (
10301030 filename_in ,
10311031 password ,
10321032 None if keyfile is None else os .path .join (base_dir , keyfile ),
10331033 transformed_key = transformed_key
10341034 )
1035- self .assertEqual (kp .encryption_algorithm , encryption_algorithm )
1036- self .assertEqual (kp .kdf_algorithm , kdf_algorithm )
1037- self .assertEqual (kp .version , version )
1035+ self .assertEqual (old_kp .encryption_algorithm , encryption_algorithm )
1036+ self .assertEqual (old_kp .kdf_algorithm , kdf_algorithm )
1037+ self .assertEqual (old_kp .version , version )
10381038
1039- kp .save (
1039+ old_kp .save (
10401040 filename_out ,
10411041 transformed_key = transformed_key
10421042 )
@@ -1045,18 +1045,36 @@ def test_open_save(self):
10451045 # rewind so PyKeePass can read from the same stream
10461046 filename_out .seek (0 )
10471047
1048- kp = PyKeePass (
1048+ new_kp = PyKeePass (
10491049 filename_out ,
10501050 password ,
10511051 None if keyfile is None else os .path .join (base_dir , keyfile ),
10521052 transformed_key = transformed_key
10531053 )
10541054
1055+ def regen_test (old_kp , new_kp , attr ):
1056+ # import recursive getattr
1057+ from operator import attrgetter
1058+ self .assertNotEqual (
1059+ attrgetter (attr )(old_kp ),
1060+ attrgetter (attr )(new_kp ),
1061+ "regen test failed for {} on file {}" .format (attr , old_kp .filename )
1062+ )
1063+
1064+ # verify that various seeds have been regenerated after saving
1065+ regen_test (old_kp , new_kp , 'kdbx.header.value.dynamic_header.master_seed.data' )
1066+ regen_test (old_kp , new_kp , 'kdbx.header.value.dynamic_header.encryption_iv.data' )
1067+ if new_kp .version == (3 , 0 ):
1068+ regen_test (old_kp , new_kp , 'kdbx.header.value.dynamic_header.protected_stream_key.data' )
1069+ regen_test (old_kp , new_kp , 'kdbx.header.value.dynamic_header.old_start_bytes.data' )
1070+ if new_kp .version == (4 , 1 ):
1071+ regen_test (old_kp , new_kp , 'kdbx.body.payload.inner_header.protected_stream_key.data' )
1072+
1073+ # remove old files
10551074 for filename in os .listdir (base_dir ):
10561075 if filename .endswith ('.out' ):
10571076 os .remove (os .path .join (base_dir , filename ))
10581077
1059-
10601078 def test_credentials_error (self ):
10611079
10621080 databases = [
0 commit comments