| 
					
				 | 
			
			
				@@ -18,6 +18,10 @@ import msgpack 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 PREFIX = b'\0' * 8 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+class PassphraseWrong(Error): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """passphrase supplied in BORG_PASSPHRASE is incorrect""" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 class PasswordRetriesExceeded(Error): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     """exceeded the maximum password retries""" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -284,13 +288,19 @@ class KeyfileKeyBase(AESKeyBase): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         key = cls(repository) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         target = key.find_key() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         prompt = 'Enter passphrase for key %s: ' % target 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        passphrase = Passphrase.env_passphrase(default='') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        for retry in range(1, 4): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if key.load(target, passphrase): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            passphrase = Passphrase.getpass(prompt) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        passphrase = Passphrase.env_passphrase() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if passphrase is None: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            passphrase = Passphrase() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if not key.load(target, passphrase): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                for retry in range(0, 3): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    passphrase = Passphrase.getpass(prompt) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if key.load(target, passphrase): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    raise PasswordRetriesExceeded 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            raise PasswordRetriesExceeded 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if not key.load(target, passphrase): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                raise PassphraseWrong 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         num_blocks = num_aes_blocks(len(manifest_data) - 41) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         key.init_ciphers(PREFIX + long_to_bytes(key.extract_nonce(manifest_data) + num_blocks)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return key 
			 |