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>