From d904d0fb8772134075e0d4ee82d688114cc802b0 Mon Sep 17 00:00:00 2001 From: Kevin Froman Date: Thu, 28 May 2020 17:14:45 -0500 Subject: [PATCH] changed simplepack to an external library --- cli/cli.csproj | 11 +-- cli/translations/spanish.cs | 3 +- cli/translations/text.cs | 4 +- cli/ui/interfaces/{ => encrypt}/encrypt.cs | 45 +++++----- cli/ui/interfaces/keyentry.cs | 5 ++ cli/ui/menus/KeyRingMenu.cs | 0 cli/ui/menus/MainMenu.cs | 2 +- tests/identity/testPrivate.cs | 63 ++++++++++++++ tests/keyring/add.cs | 83 ------------------- tests/keyring/deletePublic.cs | 45 ---------- tests/simplepackTest.cs | 49 ----------- .../chestcrypto/identity/ephemeralkey.cs | 20 ----- .../chestcrypto/identity/exceptions.cs | 23 ----- .../chestcrypto/identity/identity.cs | 38 --------- treasurechest/identity/private.cs | 34 ++++++++ treasurechest/keyring/keyring.cs | 66 ++------------- treasurechest/simplepack/exceptions.cs | 23 ----- treasurechest/simplepack/pack.cs | 37 --------- treasurechest/treasurechest.csproj | 10 +-- 19 files changed, 151 insertions(+), 410 deletions(-) rename cli/ui/interfaces/{ => encrypt}/encrypt.cs (64%) create mode 100644 cli/ui/interfaces/keyentry.cs create mode 100644 cli/ui/menus/KeyRingMenu.cs create mode 100644 tests/identity/testPrivate.cs delete mode 100644 tests/keyring/add.cs delete mode 100644 tests/keyring/deletePublic.cs delete mode 100644 tests/simplepackTest.cs delete mode 100644 treasurechest/chestcrypto/identity/ephemeralkey.cs delete mode 100644 treasurechest/chestcrypto/identity/exceptions.cs delete mode 100644 treasurechest/chestcrypto/identity/identity.cs create mode 100644 treasurechest/identity/private.cs delete mode 100644 treasurechest/simplepack/exceptions.cs delete mode 100644 treasurechest/simplepack/pack.cs diff --git a/cli/cli.csproj b/cli/cli.csproj index d224f3c..65ee111 100644 --- a/cli/cli.csproj +++ b/cli/cli.csproj @@ -5,13 +5,14 @@ netcoreapp3.1 - - - + + + + - - + + diff --git a/cli/translations/spanish.cs b/cli/translations/spanish.cs index efd79ec..da50405 100644 --- a/cli/translations/spanish.cs +++ b/cli/translations/spanish.cs @@ -11,12 +11,13 @@ namespace treasurechestCLI { stringInst.EXIT = "Salir de la aplicación"; stringInst.MAIN_MENU_ENCRYPT = "Encriptar"; stringInst.MAIN_MENU_DECRYPT = "Desencriptar"; + stringInst.MAIN_MENU_KEYRING = "Gestionar contactos"; stringInst.INVALID_OPTION = "Opción inválida"; stringInst.MAIN_MENU_SELECT_INTEGER = "Ingrese un número entero desde el menú"; stringInst.RETURN_TO_PREVIOUS_MENU = "Menú anterior"; stringInst.ENCRYPT_MENU_ENCRYPT_MESSAGE = "Cifrar texto"; stringInst.ENCRYPT_MENU_ENCRYPT_FILE = "Cifrar archivo"; - stringInst.ENCRYPT_MENU_USE_PASSPHRASE = "Usar frase de contraseña"; + stringInst.ENCRYPT_MENU_USE_PASSPHRASE = "Use mnemotécnico"; stringInst.ENCRYPT_MENU_USE_PUBKEY = "Usar clave pública"; stringInst.ENTER_MESSAGE_UNTIL_DONE = "Ingrese su mensaje y termine con -q en una nueva línea."; stringInst.PASSPHRASE = "Frase de contraseña"; diff --git a/cli/translations/text.cs b/cli/translations/text.cs index 10e93ed..762afac 100644 --- a/cli/translations/text.cs +++ b/cli/translations/text.cs @@ -13,6 +13,7 @@ namespace treasurechestCLI { public string EXIT; public string MAIN_MENU_ENCRYPT; public string MAIN_MENU_DECRYPT; + public string MAIN_MENU_KEYRING; public string INVALID_OPTION; public string MAIN_MENU_SELECT_INTEGER; public string RETURN_TO_PREVIOUS_MENU; @@ -37,12 +38,13 @@ namespace treasurechestCLI { EXIT = "Exit application"; MAIN_MENU_ENCRYPT = "Encrypt"; MAIN_MENU_DECRYPT = "Decrypt"; + MAIN_MENU_KEYRING = "Manage contacts"; INVALID_OPTION = "Invalid option"; MAIN_MENU_SELECT_INTEGER = "Enter an integer from the menu"; RETURN_TO_PREVIOUS_MENU = "Previous menu"; ENCRYPT_MENU_ENCRYPT_MESSAGE = "Encrypt text"; ENCRYPT_MENU_ENCRYPT_FILE = "Encrypt file"; - ENCRYPT_MENU_USE_PASSPHRASE = "Use passphrase"; + ENCRYPT_MENU_USE_PASSPHRASE = "Use mnemonic"; ENCRYPT_MENU_USE_PUBKEY = "Use public key"; ENTER_MESSAGE_UNTIL_DONE = "Enter your message and finish with -q on a new line."; PASSPHRASE = "Passphrase"; diff --git a/cli/ui/interfaces/encrypt.cs b/cli/ui/interfaces/encrypt/encrypt.cs similarity index 64% rename from cli/ui/interfaces/encrypt.cs rename to cli/ui/interfaces/encrypt/encrypt.cs index 9a45874..6d95fa5 100644 --- a/cli/ui/interfaces/encrypt.cs +++ b/cli/ui/interfaces/encrypt/encrypt.cs @@ -4,7 +4,7 @@ using System.Text; using Sodium; using niceware; -using chestcrypto.simplepack; +using simplepack; using chestcrypto.symmetric; using treasurechest.STDIOWrapper; @@ -12,12 +12,30 @@ using treasurechest.STDIOWrapper; namespace treasurechestCLI{ internal class EncryptMessageInterface{ + private static void EncryptWithMnemonic(){ + byte[] key = new byte[32]; // Key has to be 32 bytes in size + byte[] message; // Plaintext + string encrypted; // Ciphertext will be encoded with SimplePack. + try { + message = UTF8Encoding.UTF8.GetBytes(GetMessage.getTypedMessage()); + } + catch(System.NullReferenceException){ + return; + } + SimplePack packer = new SimplePack("treasure chest-message ", " end treasure chest message."); + + key = SecretBox.GenerateKey(); + encrypted = packer.encode(Symmetric.encrypt(message, key)); + STDIO.O(encrypted); + foreach (string word in Niceware.ToPassphrase(key)){ + Console.Write(word + " "); + } + STDIO.O(""); + } + public static void EncryptMessage(){ int choice = 0; int counter = 1; - byte[] key = new byte[32]; - byte[] message; - string encrypted; translations.Strings strings = new translations.Strings(); @@ -52,23 +70,12 @@ namespace treasurechestCLI{ choice = encryptMenuOptions.Length; } if (choice == 1){ - try { - message = UTF8Encoding.UTF8.GetBytes(GetMessage.getTypedMessage()); - } - catch(System.NullReferenceException){ - continue; - } - - key = SecretBox.GenerateKey(); - encrypted = SimplePack.pack(Symmetric.encrypt(message, key)); - STDIO.O(encrypted); - foreach (string word in Niceware.ToPassphrase(key)){ - Console.Write(word + " "); - } - STDIO.O(""); + EncryptWithMnemonic(); + } + else if (choice == 2){ } - else if (choice == encryptMenuOptions.Length){ + else if (choice == 3){ break; } diff --git a/cli/ui/interfaces/keyentry.cs b/cli/ui/interfaces/keyentry.cs new file mode 100644 index 0000000..8b36d5a --- /dev/null +++ b/cli/ui/interfaces/keyentry.cs @@ -0,0 +1,5 @@ +namespace treasurechestCLI{ + + + +} \ No newline at end of file diff --git a/cli/ui/menus/KeyRingMenu.cs b/cli/ui/menus/KeyRingMenu.cs new file mode 100644 index 0000000..e69de29 diff --git a/cli/ui/menus/MainMenu.cs b/cli/ui/menus/MainMenu.cs index dc6ef92..0229e20 100644 --- a/cli/ui/menus/MainMenu.cs +++ b/cli/ui/menus/MainMenu.cs @@ -15,7 +15,7 @@ namespace treasurechestCLI internal void showMenu(){ translations.Strings strings = new translations.Strings(); - string[] mainMenuOptions = {strings.MAIN_MENU_ENCRYPT, strings.MAIN_MENU_DECRYPT, strings.EXIT}; + string[] mainMenuOptions = {strings.MAIN_MENU_ENCRYPT, strings.MAIN_MENU_DECRYPT, strings.MAIN_MENU_KEYRING, strings.EXIT}; STDIO.O(strings.WELCOME); int counter = 1; int choice = 0; diff --git a/tests/identity/testPrivate.cs b/tests/identity/testPrivate.cs new file mode 100644 index 0000000..43dad68 --- /dev/null +++ b/tests/identity/testPrivate.cs @@ -0,0 +1,63 @@ +using NUnit.Framework; +using chestcrypto.identity; +using chestcrypto; +using System; +using System.Linq; +using Sodium; + +namespace PrivateIndentityTest +{ + public class Tests + { + [SetUp] + public void Setup() + { + } + + [Test] + public void TestPrivateIdentityGetDoublePrivateKey(){ + byte[] signingKey = PublicKeyAuth.GenerateKeyPair().PrivateKey; + byte[] encryptionKey = PublicKeyBox.GenerateKeyPair().PrivateKey; + + byte[] combinedKey = new byte[signingKey.Length + encryptionKey.Length]; + Buffer.BlockCopy(signingKey, 0, combinedKey, 0, signingKey.Length); + Buffer.BlockCopy(encryptionKey, 0, combinedKey, signingKey.Length, encryptionKey.Length); + + DoublePrivateKey combinedLoad = new chestcrypto.DoublePrivateKey(combinedKey); + + PrivateIdentity iden = new PrivateIdentity(combinedLoad, "Picard"); + + Assert.IsTrue(Enumerable.SequenceEqual(iden.getPrivateKey().getRawDouble(), combinedLoad.getRawDouble())); + + } + + [Test] + public void TestPrivateIdentityConstructor() + { + byte[] signingKey = PublicKeyAuth.GenerateKeyPair().PrivateKey; + byte[] encryptionKey = PublicKeyBox.GenerateKeyPair().PrivateKey; + + byte[] combinedKey = new byte[signingKey.Length + encryptionKey.Length]; + Buffer.BlockCopy(signingKey, 0, combinedKey, 0, signingKey.Length); + Buffer.BlockCopy(encryptionKey, 0, combinedKey, signingKey.Length, encryptionKey.Length); + + DoublePrivateKey combinedLoad = new chestcrypto.DoublePrivateKey(combinedKey); + + PrivateIdentity iden = new PrivateIdentity(combinedLoad, "Picard"); + Assert.AreEqual(iden.getName(), "Picard"); + Assert.AreEqual(iden.getNote(), ""); + + PrivateIdentity iden2 = new PrivateIdentity(combinedLoad, "Picard2", "test"); + Assert.AreEqual(iden2.getName(), "Picard2"); + Assert.AreEqual(iden2.getNote(), "test"); + } + + [Test] + public void TestPrivateIdenToPublic() + { + + } + + + } +} \ No newline at end of file diff --git a/tests/keyring/add.cs b/tests/keyring/add.cs deleted file mode 100644 index 2b570a4..0000000 --- a/tests/keyring/add.cs +++ /dev/null @@ -1,83 +0,0 @@ -using NUnit.Framework; -using System; -using System.IO; -using Sodium; -using System.Collections.Generic; -using keyring; -using chestcrypto; -using chestcrypto.exceptions; - -namespace KeyRingTests -{ - public class Tests - { - [SetUp] - public void Setup() - { - } - - [Test] - public void TestKeyRingStoreNoDupe(){ - string tempFile = Path.GetTempFileName(); - - DoublePublicKey getKey(){ - KeyRing keyRing = new KeyRing(); - byte[] signingKey = PublicKeyAuth.GenerateKeyPair().PublicKey; - byte[] encryptionKey = PublicKeyBox.GenerateKeyPair().PublicKey; - - byte[] combinedKey = new byte[signingKey.Length + encryptionKey.Length]; - Buffer.BlockCopy(signingKey, 0, combinedKey, 0, signingKey.Length); - Buffer.BlockCopy(encryptionKey, 0, combinedKey, signingKey.Length, encryptionKey.Length); - DoublePublicKey combo = new DoublePublicKey(signingKey, encryptionKey); - return combo; - } - DoublePublicKey combo = getKey(); - KeyRing keyRing = new KeyRing(); - keyRing.addPublicKey(combo); - try{ - keyRing.addPublicKey(combo); - Assert.Fail(); - } - catch(DuplicateIdentityException){ - - } - - List storedKeys = keyRing.getIdentityPublicKeys(); - if (storedKeys.Count != 1){ - Assert.Fail(); - } - } - - [Test] - public void TestKeyRingStore() - { - string tempFile = Path.GetTempFileName(); - KeyRing keyRing = new KeyRing(); - byte[] signingKey = PublicKeyAuth.GenerateKeyPair().PublicKey; - byte[] encryptionKey = PublicKeyBox.GenerateKeyPair().PublicKey; - - byte[] combinedKey = new byte[signingKey.Length + encryptionKey.Length]; - Buffer.BlockCopy(signingKey, 0, combinedKey, 0, signingKey.Length); - Buffer.BlockCopy(encryptionKey, 0, combinedKey, signingKey.Length, encryptionKey.Length); - DoublePublicKey combo = new DoublePublicKey(signingKey, encryptionKey); - keyRing.addPublicKey(combo); - - List storedKeys = keyRing.getIdentityPublicKeys(); - bool success = false; - storedKeys.ForEach(delegate(byte[] key) - { - for (int x = 0; x < combinedKey.Length; x++){ - if (combinedKey[x] == key[x]){ - success = true; - continue; - } - success = false; - } - - }); - if (! success){ - Assert.Fail(); - } - } - } -} \ No newline at end of file diff --git a/tests/keyring/deletePublic.cs b/tests/keyring/deletePublic.cs deleted file mode 100644 index bcaf643..0000000 --- a/tests/keyring/deletePublic.cs +++ /dev/null @@ -1,45 +0,0 @@ -using NUnit.Framework; -using System; -using System.IO; -using Sodium; -using System.Collections.Generic; -using keyring; -using chestcrypto; -using chestcrypto.exceptions; - -namespace KeyRingDeletePublicTests -{ - public class Tests - { - [SetUp] - public void Setup() - { - } - - [Test] - public void TestDeleteIdentityByPublicKey(){ - string tempFile = Path.GetTempFileName(); - - DoublePublicKey getKey(){ - KeyRing keyRing = new KeyRing(); - byte[] signingKey = PublicKeyAuth.GenerateKeyPair().PublicKey; - byte[] encryptionKey = PublicKeyBox.GenerateKeyPair().PublicKey; - - byte[] combinedKey = new byte[signingKey.Length + encryptionKey.Length]; - Buffer.BlockCopy(signingKey, 0, combinedKey, 0, signingKey.Length); - Buffer.BlockCopy(encryptionKey, 0, combinedKey, signingKey.Length, encryptionKey.Length); - DoublePublicKey combo = new DoublePublicKey(signingKey, encryptionKey); - return combo; - } - DoublePublicKey combo = getKey(); - KeyRing keyRing = new KeyRing(); - keyRing.addPublicKey(combo); - Assert.IsTrue(keyRing.getIdentityCount() == 1); - keyRing.removeIdentityByPubkey(combo); - Assert.IsTrue(keyRing.getIdentityCount() == 0); - - - } - - } -} \ No newline at end of file diff --git a/tests/simplepackTest.cs b/tests/simplepackTest.cs deleted file mode 100644 index 3b6c9bf..0000000 --- a/tests/simplepackTest.cs +++ /dev/null @@ -1,49 +0,0 @@ -using NUnit.Framework; -using chestcrypto; -using System; - -namespace simplepackTests -{ - public class Tests - { - [SetUp] - public void Setup() - { - } - - [Test] - public void TestPackUnpackString() - { - string message = "hello world"; - string packed; - packed = chestcrypto.simplepack.SimplePack.pack(message); - Assert.AreEqual(message, chestcrypto.simplepack.SimplePack.unpack(packed)); - } - [Test] - public void TestPackUnpackBytes() - { - byte[] message = System.Text.Encoding.UTF8.GetBytes("hello world"); - string packed; - packed = chestcrypto.simplepack.SimplePack.pack(message); - Assert.AreEqual(message, chestcrypto.simplepack.SimplePack.unpack(packed)); - } - [Test] - public void TestPackUnpackInvalid(){ - byte[] message = System.Text.Encoding.UTF8.GetBytes("hello world"); - string packed; - packed = chestcrypto.simplepack.SimplePack.pack(message).Remove(1); - bool success = false; - try{ - chestcrypto.simplepack.SimplePack.unpack(packed); - } - catch(chestcrypto.exceptions.InvalidSimplePackMessage){ - success = true; - } - if (! success){ - Assert.Fail(); - } - } - - - } -} \ No newline at end of file diff --git a/treasurechest/chestcrypto/identity/ephemeralkey.cs b/treasurechest/chestcrypto/identity/ephemeralkey.cs deleted file mode 100644 index 0194027..0000000 --- a/treasurechest/chestcrypto/identity/ephemeralkey.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace chestcrypto{ - - namespace identity{ - internal class EphemeralKey{ - - private int epochTime; - private int secondsToExpire; - private byte[] key = new byte[32]; - private bool isPrivate; - - private Identity identity; - public EphemeralKey(Identity identity, byte[] key, int secondsToExpire){ - - } - - - } - } - -} \ No newline at end of file diff --git a/treasurechest/chestcrypto/identity/exceptions.cs b/treasurechest/chestcrypto/identity/exceptions.cs deleted file mode 100644 index c8ee2ea..0000000 --- a/treasurechest/chestcrypto/identity/exceptions.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -namespace chestcrypto{ - - namespace exceptions{ - public class NoIdentityException : Exception - { - public NoIdentityException() - { - } - - public NoIdentityException(string message) - : base(message) - { - } - - public NoIdentityException(string message, Exception inner) - : base(message, inner) - { - } - } - } - -} \ No newline at end of file diff --git a/treasurechest/chestcrypto/identity/identity.cs b/treasurechest/chestcrypto/identity/identity.cs deleted file mode 100644 index c69a20a..0000000 --- a/treasurechest/chestcrypto/identity/identity.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System.Collections.Generic; - -namespace chestcrypto{ - - namespace identity { - internal class Identity { - private DoublePrivateKey privateKey; - private DoublePublicKey publicKey; - private bool hasPrivate = false; - - private List ephemeralKeys = new List(); - - public DoublePublicKey getDoublePublicKey(){return publicKey;} - public DoublePrivateKey getDoublePrivateKey(){return privateKey;} - - - public Identity(){} - public Identity (List ephemeralKeys){ - - } - public Identity(DoublePublicKey publicKey){ - this.publicKey = publicKey; - } - public Identity(DoublePrivateKey privateKey){ - this.privateKey = privateKey; - } - public Identity(DoublePrivateKey privateKey, List ephemeralKeys){ - - } - public Identity(DoublePublicKey publicKey, List ephemeralKeys){ - - } - - - } - - } -} \ No newline at end of file diff --git a/treasurechest/identity/private.cs b/treasurechest/identity/private.cs new file mode 100644 index 0000000..0fb8f1b --- /dev/null +++ b/treasurechest/identity/private.cs @@ -0,0 +1,34 @@ +using chestcrypto; + +namespace chestcrypto.identity +{ + + public class PrivateIdentity{ + /* + PrivateIdentity is a wrapper around a DoublePrivateKey providing associated metadata such as alias and note + */ + + private DoublePrivateKey key; + private string name; + private string comment; // human's note + + public PrivateIdentity(DoublePrivateKey doublePrivateKey, string alias){ + key = doublePrivateKey; + name = alias; + comment = ""; + } + + public PrivateIdentity(DoublePrivateKey doublePrivateKey, string alias, string note){ + key = doublePrivateKey; + name = alias; + comment = note; + } + + public DoublePrivateKey getPrivateKey(){return key;} + public string getName(){return name;} + public string getNote(){return comment;} + + + } + +} \ No newline at end of file diff --git a/treasurechest/keyring/keyring.cs b/treasurechest/keyring/keyring.cs index 5e9d4c5..b9a60a2 100644 --- a/treasurechest/keyring/keyring.cs +++ b/treasurechest/keyring/keyring.cs @@ -1,72 +1,18 @@ using chestcrypto; -using chestcrypto.identity; using chestcrypto.exceptions; +using chestcrypto.identity; using System.Collections.Generic; namespace keyring{ public class KeyRing { - private string storageFile = null; - private List identities = new List(); + private List publicIdentities; + private List privateIdentities; - private bool identityExists(Identity iden){ - bool success = false; - identities.ForEach(delegate(Identity ident) - { - if (ident.getDoublePublicKey().Equals(iden.getDoublePublicKey())){ - success = true; - return; - } - }); - return success; - } - - internal void removeIdentity(Identity iden){identities.Remove(iden);} - - internal Identity getIdentityInstance(DoublePublicKey key){ - foreach (Identity iden in identities){ - if (iden.getDoublePublicKey().Equals(key)){ - return iden; - } - } - throw new NoIdentityException(); - } - - public KeyRing(string storageFile){ - - } - public KeyRing(){} - - public int getIdentityCount(){return identities.Count;} - - - public List getIdentityPublicKeys(){ - List pubKeys = new List(); - identities.ForEach(delegate(Identity identity){ - pubKeys.Add(identity.getDoublePublicKey().getRawDouble()); - }); - return pubKeys; - } - - public void addPublicKey(DoublePublicKey key){ - // Create an Identity with a public key if it does not exist already - - Identity newIdentity = new Identity(key); - if (identityExists(newIdentity)){ - throw new DuplicateIdentityException("An identity with that public key already exists"); - } - - identities.Add(newIdentity); - - } - - public void addPrivateKey(){ - - } - - public void removeIdentityByPubkey(DoublePublicKey key){ - removeIdentity(getIdentityInstance(key)); + public KeyRing(){ + //publicIdentities = new List(); + privateIdentities = new List(); } } diff --git a/treasurechest/simplepack/exceptions.cs b/treasurechest/simplepack/exceptions.cs deleted file mode 100644 index ffec12c..0000000 --- a/treasurechest/simplepack/exceptions.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -namespace chestcrypto{ - - namespace exceptions{ - public class InvalidSimplePackMessage : Exception - { - public InvalidSimplePackMessage() - { - } - - public InvalidSimplePackMessage(string message) - : base(message) - { - } - - public InvalidSimplePackMessage(string message, Exception inner) - : base(message, inner) - { - } - } - } - -} \ No newline at end of file diff --git a/treasurechest/simplepack/pack.cs b/treasurechest/simplepack/pack.cs deleted file mode 100644 index 5c9ba3a..0000000 --- a/treasurechest/simplepack/pack.cs +++ /dev/null @@ -1,37 +0,0 @@ -using Base58Check; - -namespace chestcrypto{ - - namespace simplepack{ - - public class SimplePack{ - - private const string header = "CHEST-MESSAGE "; - private const string footer = " END-CHEST-MESSAGE."; - - // Test simplepackTest.TestPackUnpackBytes - public static string pack(byte[] data){ - return header + Base58CheckEncoding.Encode(data) + footer; - } - // Test simplepackTest.TestPackUnpackString - public static string pack(string data){ - return pack(System.Text.Encoding.UTF8.GetBytes(data)); - } - // Test simplepackTest.TestPackUnpackBytes - public static byte[] unpack(string checkedBase58String){ - if (! checkedBase58String.Contains(header) | ! checkedBase58String.Contains(footer)){ - throw new exceptions.InvalidSimplePackMessage("Message does not have valid header and footer"); - } - string encodedMessage = ""; - for (int i = header.Length; i < checkedBase58String.Length - footer.Length; i++){ - encodedMessage += checkedBase58String[i]; - } - return Base58CheckEncoding.Decode(encodedMessage); - - } - - } - - } - -} diff --git a/treasurechest/treasurechest.csproj b/treasurechest/treasurechest.csproj index e9003db..61f0982 100644 --- a/treasurechest/treasurechest.csproj +++ b/treasurechest/treasurechest.csproj @@ -1,13 +1,13 @@ - netstandard2.0 + netstandard2.1 - - - - + + + +