|
|
@@ -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");
|