|  | @@ -22,9 +22,9 @@ namespace Renci.SshNet
 | 
	
		
			
				|  |  |      public class PrivateKeyFile
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |  #if SILVERLIGHT
 | 
	
		
			
				|  |  | -        private static Regex _privateKeyRegex = new Regex(@"^-----BEGIN (?<keyName>\w+) PRIVATE KEY-----\r?\n(Proc-Type: 4,ENCRYPTED\r?\nDEK-Info: (?<cipherName>[A-Z0-9-]+),(?<salt>[A-F0-9]{16})\r?\n\r?\n)?(?<data>([a-zA-Z0-9/+=]{1,64}\r?\n)+)-----END \k<keyName> PRIVATE KEY-----.*", RegexOptions.Multiline);
 | 
	
		
			
				|  |  | +        private static Regex _privateKeyRegex = new Regex(@"^-----BEGIN (?<keyName>\w+) PRIVATE KEY-----\r?\n(Proc-Type: 4,ENCRYPTED\r?\nDEK-Info: (?<cipherName>[A-Z0-9-]+),(?<salt>[A-F0-9]+)\r?\n\r?\n)?(?<data>([a-zA-Z0-9/+=]{1,64}\r?\n)+)-----END \k<keyName> PRIVATE KEY-----.*", RegexOptions.Multiline);
 | 
	
		
			
				|  |  |  #else
 | 
	
		
			
				|  |  | -        private static Regex _privateKeyRegex = new Regex(@"^-----BEGIN (?<keyName>\w+) PRIVATE KEY-----\r?\n(Proc-Type: 4,ENCRYPTED\r?\nDEK-Info: (?<cipherName>[A-Z0-9-]+),(?<salt>[A-F0-9]{16})\r?\n\r?\n)?(?<data>([a-zA-Z0-9/+=]{1,64}\r?\n)+)-----END \k<keyName> PRIVATE KEY-----.*", RegexOptions.Compiled | RegexOptions.Multiline);
 | 
	
		
			
				|  |  | +        private static Regex _privateKeyRegex = new Regex(@"^-----BEGIN (?<keyName>\w+) PRIVATE KEY-----\r?\n(Proc-Type: 4,ENCRYPTED\r?\nDEK-Info: (?<cipherName>[A-Z0-9-]+),(?<salt>[A-F0-9]+)\r?\n\r?\n)?(?<data>([a-zA-Z0-9/+=]{1,64}\r?\n)+)-----END \k<keyName> PRIVATE KEY-----.*", RegexOptions.Compiled | RegexOptions.Multiline);
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          /// <summary>
 | 
	
	
		
			
				|  | @@ -117,7 +117,7 @@ namespace Renci.SshNet
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              var binaryData = System.Convert.FromBase64String(data);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            IEnumerable<byte> decryptedData;
 | 
	
		
			
				|  |  | +            byte[] decryptedData;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              if (!string.IsNullOrEmpty(cipherName) && !string.IsNullOrEmpty(salt))
 | 
	
		
			
				|  |  |              {
 | 
	
	
		
			
				|  | @@ -138,23 +138,20 @@ namespace Renci.SshNet
 | 
	
		
			
				|  |  |                          cipher = new CipherInfo(192, (key, iv) => { return new TripleDesCipher(key, new CfbCipherMode(iv), new PKCS7Padding()); });
 | 
	
		
			
				|  |  |                          break;
 | 
	
		
			
				|  |  |                      case "DES-CBC":
 | 
	
		
			
				|  |  | -                        //  TODO:   Not tested
 | 
	
		
			
				|  |  |                          cipher = new CipherInfo(64, (key, iv) => { return new DesCipher(key, new CbcCipherMode(iv), new PKCS7Padding()); });
 | 
	
		
			
				|  |  |                          break;
 | 
	
		
			
				|  |  | -                    case "AES-128-CBC":
 | 
	
		
			
				|  |  | -                        //  TODO:   Not tested
 | 
	
		
			
				|  |  | -                        cipher = new CipherInfo(128, (key, iv) => { return new AesCipher(key, new CbcCipherMode(iv), new PKCS7Padding()); });
 | 
	
		
			
				|  |  | -                        break;
 | 
	
		
			
				|  |  | -                    case "AES-192-CBC":
 | 
	
		
			
				|  |  | -                        //  TODO:   Not tested
 | 
	
		
			
				|  |  | -                        cipher = new CipherInfo(192, (key, iv) => { return new AesCipher(key, new CbcCipherMode(iv), new PKCS7Padding()); });
 | 
	
		
			
				|  |  | -                        break;
 | 
	
		
			
				|  |  | -                    case "AES-256-CBC":
 | 
	
		
			
				|  |  | -                        //  TODO:   Not tested
 | 
	
		
			
				|  |  | -                        cipher = new CipherInfo(256, (key, iv) => { return new AesCipher(key, new CbcCipherMode(iv), new PKCS7Padding()); });
 | 
	
		
			
				|  |  | -                        break;
 | 
	
		
			
				|  |  | +                        //  TODO:   Implement more private key ciphers
 | 
	
		
			
				|  |  | +                    //case "AES-128-CBC":
 | 
	
		
			
				|  |  | +                    //    cipher = new CipherInfo(128, (key, iv) => { return new AesCipher(key, new CbcCipherMode(iv), new PKCS7Padding()); });
 | 
	
		
			
				|  |  | +                    //    break;
 | 
	
		
			
				|  |  | +                    //case "AES-192-CBC":
 | 
	
		
			
				|  |  | +                    //    cipher = new CipherInfo(192, (key, iv) => { return new AesCipher(key, new CbcCipherMode(iv), new PKCS7Padding()); });
 | 
	
		
			
				|  |  | +                    //    break;
 | 
	
		
			
				|  |  | +                    //case "AES-256-CBC":
 | 
	
		
			
				|  |  | +                    //    cipher = new CipherInfo(256, (key, iv) => { return new AesCipher(key, new CbcCipherMode(iv), new PKCS7Padding()); });
 | 
	
		
			
				|  |  | +                    //    break;
 | 
	
		
			
				|  |  |                      default:
 | 
	
		
			
				|  |  | -                        throw new SshException(string.Format(CultureInfo.CurrentCulture, "Unknown private key cipher \"{0}\".", cipherName));
 | 
	
		
			
				|  |  | +                        throw new SshException(string.Format(CultureInfo.CurrentCulture, "Private key cipher \"{0}\" is not supported.", cipherName));
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  decryptedData = DecryptKey(cipher, binaryData, passPhrase, binarySalt);
 | 
	
	
		
			
				|  | @@ -186,7 +183,7 @@ namespace Renci.SshNet
 | 
	
		
			
				|  |  |          /// <param name="binarySalt">Decryption binary salt.</param>
 | 
	
		
			
				|  |  |          /// <returns></returns>
 | 
	
		
			
				|  |  |          /// <exception cref="ArgumentNullException"><paramref name="cipherInfo"/>, <paramref name="cipherData"/>, <paramref name="passPhrase"/> or <paramref name="binarySalt"/> is null.</exception>
 | 
	
		
			
				|  |  | -        public static IEnumerable<byte> DecryptKey(CipherInfo cipherInfo, byte[] cipherData, string passPhrase, byte[] binarySalt)
 | 
	
		
			
				|  |  | +        public static byte[] DecryptKey(CipherInfo cipherInfo, byte[] cipherData, string passPhrase, byte[] binarySalt)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              if (cipherInfo == null)
 | 
	
		
			
				|  |  |                  throw new ArgumentNullException("cipherInfo");
 |