From 460c453011d645ca72ad7a26d3445cd9b293c9d3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?No=C3=A9=20Comte?= <zalir0@live.fr>
Date: Sat, 18 Aug 2018 16:12:51 +0200
Subject: [PATCH 1/2] Encrypted private keys can now be passed in Api
 Credentials

---
 .../Authentication/ApiCredentials.cs          | 22 +----
 .../Authentication/PrivateKey.cs              | 98 +++++++++++++++++++
 2 files changed, 101 insertions(+), 19 deletions(-)
 create mode 100644 CryptoExchange.Net/Authentication/PrivateKey.cs

diff --git a/CryptoExchange.Net/Authentication/ApiCredentials.cs b/CryptoExchange.Net/Authentication/ApiCredentials.cs
index 836a5c5..4f98cfb 100644
--- a/CryptoExchange.Net/Authentication/ApiCredentials.cs
+++ b/CryptoExchange.Net/Authentication/ApiCredentials.cs
@@ -18,33 +18,17 @@ namespace CryptoExchange.Net.Authentication
         /// <summary>
         /// The private key to authenticate requests
         /// </summary>
-        public SecureString PrivateKey { get; }
+        public PrivateKey PrivateKey { get; }
 
         /// <summary>
-        /// Create Api credentials providing a private key for authenication
+        /// Create Api credentials providing a private key for authentication
         /// </summary>
         /// <param name="privateKey">The private key used for signing</param>
-        public ApiCredentials(SecureString privateKey)
+        public ApiCredentials(PrivateKey privateKey)
         {
             PrivateKey = privateKey;
         }
 
-        /// <summary>
-        /// Create Api credentials providing a private key for authenication
-        /// </summary>
-        /// <param name="privateKey">The private key used for signing</param>
-        public ApiCredentials(string privateKey)
-        {
-            if(string.IsNullOrEmpty(privateKey))
-                throw new ArgumentException("Private key can't be null/empty");
-
-            var securePrivateKey = new SecureString();
-            foreach (var c in privateKey)
-                securePrivateKey.AppendChar(c);
-            securePrivateKey.MakeReadOnly();
-            PrivateKey = securePrivateKey;
-        }
-
         /// <summary>
         /// Create Api credentials providing a api key and secret for authenciation
         /// </summary>
diff --git a/CryptoExchange.Net/Authentication/PrivateKey.cs b/CryptoExchange.Net/Authentication/PrivateKey.cs
new file mode 100644
index 0000000..31372d9
--- /dev/null
+++ b/CryptoExchange.Net/Authentication/PrivateKey.cs
@@ -0,0 +1,98 @@
+using System;
+using System.Collections.Generic;
+using System.Security;
+using System.Text;
+
+namespace CryptoExchange.Net.Authentication
+{
+    public class PrivateKey : IDisposable
+    {
+        /// <summary>
+        /// The private key
+        /// </summary>
+        public SecureString Key { get; }
+
+        /// <summary>
+        /// The private key's passphrase
+        /// </summary>
+        public SecureString Passphrase { get; }
+
+        /// <summary>
+        /// Indicates if the private key is encrypted or not
+        /// </summary>
+        public bool IsEncrypted { get; }
+
+        /// <summary>
+        /// Create a private key providing an encrypted key informations
+        /// </summary>
+        /// <param name="key">The private key used for signing</param>
+        /// <param name="passphrase">The private key's passphrase</param>
+        public PrivateKey(SecureString key, SecureString passphrase)
+        {
+            Key = key;
+            Passphrase = passphrase;
+
+            IsEncrypted = true;
+        }
+
+        /// <summary>
+        /// Create a private key providing an encrypted key informations
+        /// </summary>
+        /// <param name="key">The private key used for signing</param>
+        /// <param name="passphrase">The private key's passphrase</param>
+        public PrivateKey(string key, string passphrase)
+        {
+            if (string.IsNullOrEmpty(key) || string.IsNullOrEmpty(passphrase))
+                throw new ArgumentException("Key and passphrase can't be null/empty");
+
+            var secureKey = new SecureString();
+            foreach (var c in key)
+                secureKey.AppendChar(c);
+            secureKey.MakeReadOnly();
+            Key = secureKey;
+
+            var securePassphrase = new SecureString();
+            foreach (var c in passphrase)
+                securePassphrase.AppendChar(c);
+            securePassphrase.MakeReadOnly();
+            Passphrase = securePassphrase;
+
+            IsEncrypted = true;
+        }
+
+        /// <summary>
+        /// Create a private key providing an unencrypted key informations
+        /// </summary>
+        /// <param name="key">The private key used for signing</param>
+        public PrivateKey(SecureString key)
+        {
+            Key = key;
+
+            IsEncrypted = false;
+        }
+
+        /// <summary>
+        /// Create a private key providing an encrypted key informations
+        /// </summary>
+        /// <param name="key">The private key used for signing</param>
+        public PrivateKey(string key)
+        {
+            if (string.IsNullOrEmpty(key))
+                throw new ArgumentException("Key can't be null/empty");
+
+            var secureKey = new SecureString();
+            foreach (var c in key)
+                secureKey.AppendChar(c);
+            secureKey.MakeReadOnly();
+            Key = secureKey;
+
+            IsEncrypted = false;
+        }
+
+        public void Dispose()
+        {
+            Key?.Dispose();
+            Passphrase?.Dispose();
+        }
+    }
+}

From 4b7caae9d680ec8c92e6fc55a5b43f2f7eeb9447 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?No=C3=A9=20Comte?= <zalir0@live.fr>
Date: Sat, 18 Aug 2018 16:17:19 +0200
Subject: [PATCH 2/2] Fix typo

---
 CryptoExchange.Net/Authentication/ApiCredentials.cs | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/CryptoExchange.Net/Authentication/ApiCredentials.cs b/CryptoExchange.Net/Authentication/ApiCredentials.cs
index 4f98cfb..2c6d65d 100644
--- a/CryptoExchange.Net/Authentication/ApiCredentials.cs
+++ b/CryptoExchange.Net/Authentication/ApiCredentials.cs
@@ -30,7 +30,7 @@ namespace CryptoExchange.Net.Authentication
         }
 
         /// <summary>
-        /// Create Api credentials providing a api key and secret for authenciation
+        /// Create Api credentials providing a api key and secret for authentication
         /// </summary>
         /// <param name="key">The api key used for identification</param>
         /// <param name="secret">The api secret used for signing</param>
@@ -41,7 +41,7 @@ namespace CryptoExchange.Net.Authentication
         }
 
         /// <summary>
-        /// Create Api credentials providing a api key and secret for authenciation
+        /// Create Api credentials providing a api key and secret for authentication
         /// </summary>
         /// <param name="key">The api key used for identification</param>
         /// <param name="secret">The api secret used for signing</param>