diff --git a/FitConnect/EncryptionBaseClass.cs b/FitConnect/EncryptionBaseClass.cs index 8e7919c0ff00c86116a91255ea1508854a03f519..76e7802a312e7c7c3678ff9ee1c074f8462a6827 100644 --- a/FitConnect/EncryptionBaseClass.cs +++ b/FitConnect/EncryptionBaseClass.cs @@ -10,9 +10,12 @@ public class EncryptionBaseClass { private RSA? _publicKey; private RSA? _privateKey; - protected EncryptionBaseClass(ILogger? logger) { + protected EncryptionBaseClass(ILogger? logger, X509Certificate2? certificate) { _logger = logger; _rsa = RSA.Create(4096); + + if (certificate != null) + ImportCertificate(certificate); } @@ -31,15 +34,10 @@ public class EncryptionBaseClass { } _publicKey = cert.GetRSAPublicKey(); - // _publicKey = RSA.Create(2048); - // _publicKey.ImportRSAPublicKey(cert.GetPublicKey(), out int _); if ((_publicKey?.KeySize ?? 0) == 0) throw new Exception("Invalid certificate, no public key"); - _logger.LogInformation("Public key imported {}", - Convert.ToBase64String(_publicKey.ExportRSAPrivateKey())); - if (cert.HasPrivateKey) { _privateKey = cert.GetRSAPrivateKey(); } diff --git a/FitConnect/FunctionalBaseClass.cs b/FitConnect/FunctionalBaseClass.cs index 844b2fe928b0703b19f3eeb3e45b2b0896667352..787a62d167b9ef9e712eb25bcac3df4512e4056f 100644 --- a/FitConnect/FunctionalBaseClass.cs +++ b/FitConnect/FunctionalBaseClass.cs @@ -1,5 +1,6 @@ using System.Net.Http.Headers; using System.Net.Http.Json; +using System.Security.Cryptography.X509Certificates; using System.Text; using FitConnect.Models; using Microsoft.Extensions.Logging; @@ -15,7 +16,7 @@ public class FunctionalBaseClass : EncryptionBaseClass { /// </summary> /// <param name="logger">ILogger implementation</param> /// <param name="endpoints">FitConnect endpoints</param> - protected FunctionalBaseClass(ILogger? logger, FitConnectEndpoints? endpoints) : base(logger) { + protected FunctionalBaseClass(ILogger? logger, FitConnectEndpoints? endpoints, X509Certificate2? certificate) : base(logger, certificate) { Endpoints = endpoints ?? FitConnectEndpoints.Create(FitConnectEndpoints.EndpointType.Development); diff --git a/FitConnect/Sender.cs b/FitConnect/Sender.cs index aea7797415c5d49c82a8b4426ef1075d8e36d185..f5172c83a8c885106dfe090639e979f1f6a71ac1 100644 --- a/FitConnect/Sender.cs +++ b/FitConnect/Sender.cs @@ -1,13 +1,14 @@ using System.Buffers.Text; using System.ComponentModel; using System.Security.Cryptography; +using System.Security.Cryptography.X509Certificates; using System.Text; using Microsoft.Extensions.Logging; namespace FitConnect; public class Sender : FunctionalBaseClass { - public Sender(ILogger? logger, FitConnectEndpoints endpoints) : base(logger, endpoints) { + public Sender(ILogger? logger, FitConnectEndpoints endpoints, X509Certificate2? certificate = null) : base(logger, endpoints, certificate) { } /// <summary> diff --git a/FitConnect/Subscriber.cs b/FitConnect/Subscriber.cs index d96cc0d14feb7da9d956fc536fcafed49776bb1b..47ec56c1cb50a700e9efb2d0e22b11589e3c522c 100644 --- a/FitConnect/Subscriber.cs +++ b/FitConnect/Subscriber.cs @@ -1,4 +1,5 @@ using System.Reflection; +using System.Security.Cryptography.X509Certificates; using FitConnect.Models; using Microsoft.Extensions.Logging; using Newtonsoft.Json.Linq; @@ -7,7 +8,8 @@ using Newtonsoft.Json.Schema; namespace FitConnect; public class Subscriber : FunctionalBaseClass { - public Subscriber(ILogger logger, FitConnectEndpoints endpoints) : base(logger, endpoints) { + public Subscriber(ILogger logger, FitConnectEndpoints endpoints, + X509Certificate2? certificate = null) : base(logger, endpoints, certificate) { } diff --git a/SenderTest/SenderEncryptionWithImportedCertificateTest.cs b/SenderTest/SenderEncryptionWithImportedCertificateTest.cs index 772bcfde18b62e23b2591303d38c739db24c393b..16507d1f6b673b43b404fe61a79583a65b4ba328 100644 --- a/SenderTest/SenderEncryptionWithImportedCertificateTest.cs +++ b/SenderTest/SenderEncryptionWithImportedCertificateTest.cs @@ -1,4 +1,44 @@ +using System.Security.Cryptography.X509Certificates; +using FitConnect; +using Microsoft.Extensions.Logging; +using NUnit.Framework; + namespace SenderTest; public class SenderEncryptionWithImportedCertificateTest { + private Sender _sender = null!; + private ILogger _logger = null!; + + [OneTimeSetUp] + public void OneTimeSetUp() { + // Import certificate + + } + + [SetUp] + public void SetUp() { + // Create a new Sender + var fileName = "certificate.pfx"; + var cert = new X509Certificate2(fileName); + _logger = LoggerFactory.Create(cfg => cfg.AddConsole()) + .CreateLogger<SenderEncryptionWithSelfSignedCertificateTest>(); + + _sender = new Sender(_logger, + FitConnectEndpoints.Create(FitConnectEndpoints.EndpointType.Development), cert); + } + + [TearDown] + public void TearDown() { + // Dispose the Sender + } + + [OneTimeTearDown] + public void OneTimeTearDown() { + // Delete certificate + } + + [Test] + public void TestEncryption() { + // Encrypt a message + } } diff --git a/SenderTest/SenderEncryptionWithSelfSignedCertificateTest.cs b/SenderTest/SenderEncryptionWithSelfSignedCertificateTest.cs index b9ee72802b98f9da0cc3eac0c3e3dd410f576ed3..e6468cf666611fd04923c5a66185ad5f5311c3a9 100644 --- a/SenderTest/SenderEncryptionWithSelfSignedCertificateTest.cs +++ b/SenderTest/SenderEncryptionWithSelfSignedCertificateTest.cs @@ -4,6 +4,7 @@ using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; using System.Text; using FitConnect; +using FluentAssertions; using Microsoft.Extensions.Logging; using NUnit.Framework; @@ -13,6 +14,10 @@ public class SenderEncryptionWithSelfSignedCertificateTest { private Sender _sender = null!; private ILogger<SenderEncryptionWithSelfSignedCertificateTest> _logger = null!; private X509Certificate2 _certificate = null!; + private static byte[]? cypher; + + private const string ToEncrypt = "This is a test message"; + /* * Encryption test must be changed for production to only allow extern signed certificates @@ -43,12 +48,20 @@ public class SenderEncryptionWithSelfSignedCertificateTest { [Test] + [Order(10)] public void CryptWithOutPublicKeyImport() { - var cypher = _sender.EncryptData(Encoding.UTF8.GetBytes("test")); + cypher = _sender.EncryptData(Encoding.UTF8.GetBytes(ToEncrypt)); _logger.LogInformation("Cypher: {}", Convert.ToBase64String(cypher)); } + [Test] + [Order(20)] + public void Decrypt_ResultShouldMatchToEncrypt() { + var result = _sender.DecryptDataAsync(cypher!); + Encoding.UTF8.GetString(result).Should().Be(ToEncrypt); + } + [Test] public void ExportPrivateKey() { @@ -67,8 +80,13 @@ public class SenderEncryptionWithSelfSignedCertificateTest { /// <returns></returns> /// <exception cref="Exception"></exception> private X509Certificate2 CreateSelfSignedCertificate(string? exportPath = null) { - var req = new CertificateRequest("cn=foobar", ECDsa.Create(), HashAlgorithmName.SHA256); - var cert = req.CreateSelfSigned(DateTimeOffset.Now, DateTimeOffset.Now.AddYears(5)); + var rsa = RSA.Create(4096); + + var req = new CertificateRequest("c=DE, cn=fitconnect.de", + rsa, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); + + var cert = req.CreateSelfSigned(DateTimeOffset.Now.AddSeconds(-5), + DateTimeOffset.Now.AddYears(5)); if (cert.GetRSAPublicKey() == null) throw new Exception("Certificate does not contain a public key");