From fb886082caa36cd63c1ded81a3facce34e491ef4 Mon Sep 17 00:00:00 2001 From: Klaus Fischer <klaus.fischer@eloware.com> Date: Wed, 8 Jun 2022 09:37:25 +0200 Subject: [PATCH] Self signed certificate does not export public key --- FitConnect/EncryptionBaseClass.cs | 11 ++-- ...=> SenderEncryptionWithCertificateTest.cs} | 13 +++-- ...erEncryptionWithImportedCertificateTest.cs | 4 ++ .../SenderEncryptionWithoutCertificateTest.cs | 53 +++++++++++++++++++ 4 files changed, 71 insertions(+), 10 deletions(-) rename SenderTest/{SenderEncryptionTest.cs => SenderEncryptionWithCertificateTest.cs} (91%) create mode 100644 SenderTest/SenderEncryptionWithImportedCertificateTest.cs create mode 100644 SenderTest/SenderEncryptionWithoutCertificateTest.cs diff --git a/FitConnect/EncryptionBaseClass.cs b/FitConnect/EncryptionBaseClass.cs index bdcf0ff8..a51874da 100644 --- a/FitConnect/EncryptionBaseClass.cs +++ b/FitConnect/EncryptionBaseClass.cs @@ -31,18 +31,23 @@ public class EncryptionBaseClass { } _publicKey = cert.GetRSAPublicKey(); + // _publicKey = RSA.Create(2048); + // _publicKey.ImportRSAPublicKey(cert.GetPublicKey(), out int _); - if (_publicKey == null) + 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(); - _logger.LogInformation("Certificate imported"); } + + if (_privateKey != null) + _logger.LogInformation("Certificate with private key imported"); + else + _logger.LogInformation("Certificate has no private key"); } /// <summary> diff --git a/SenderTest/SenderEncryptionTest.cs b/SenderTest/SenderEncryptionWithCertificateTest.cs similarity index 91% rename from SenderTest/SenderEncryptionTest.cs rename to SenderTest/SenderEncryptionWithCertificateTest.cs index ac3409a4..5aadfd97 100644 --- a/SenderTest/SenderEncryptionTest.cs +++ b/SenderTest/SenderEncryptionWithCertificateTest.cs @@ -9,9 +9,9 @@ using NUnit.Framework; namespace SenderTest; -public partial class SenderEncryptionTest { +public class SenderEncryptionWithCertificateTest { private Sender _sender = null!; - private ILogger<SenderEncryptionTest> _logger = null!; + private ILogger<SenderEncryptionWithCertificateTest> _logger = null!; /* * Encryption test must be changed for production to only allow extern signed certificates @@ -21,11 +21,11 @@ public partial class SenderEncryptionTest { [SetUp] public void Setup() { _logger = LoggerFactory.Create(cfg => cfg.AddConsole()) - .CreateLogger<SenderEncryptionTest>(); + .CreateLogger<SenderEncryptionWithCertificateTest>(); _sender = new Sender(_logger, FitConnectEndpoints.Create(FitConnectEndpoints.EndpointType.Development)); var certificate = CreateSelfSignedCertificate(null); - // _sender.ImportCertificate(certificate); + _sender.ImportCertificate(certificate); } @@ -53,11 +53,10 @@ public partial class SenderEncryptionTest { var privateKey = _sender.ExportPrivateKey(); _logger.LogInformation("Private key: {}", Convert.ToBase64String(privateKey)); } -} -#region Static helpers -public partial class SenderEncryptionTest { + #region Static helpers + private X509Certificate2 CreateSelfSignedCertificate(string? exportPath = "../../../") { var req = new CertificateRequest("cn=foobar", ECDsa.Create(), HashAlgorithmName.SHA256); var cert = req.CreateSelfSigned(DateTimeOffset.Now, DateTimeOffset.Now.AddYears(5)); diff --git a/SenderTest/SenderEncryptionWithImportedCertificateTest.cs b/SenderTest/SenderEncryptionWithImportedCertificateTest.cs new file mode 100644 index 00000000..772bcfde --- /dev/null +++ b/SenderTest/SenderEncryptionWithImportedCertificateTest.cs @@ -0,0 +1,4 @@ +namespace SenderTest; + +public class SenderEncryptionWithImportedCertificateTest { +} diff --git a/SenderTest/SenderEncryptionWithoutCertificateTest.cs b/SenderTest/SenderEncryptionWithoutCertificateTest.cs new file mode 100644 index 00000000..06bd1d06 --- /dev/null +++ b/SenderTest/SenderEncryptionWithoutCertificateTest.cs @@ -0,0 +1,53 @@ +using System; +using System.Text; +using FitConnect; +using Microsoft.Extensions.Logging; +using NUnit.Framework; + +namespace SenderTest; + + +public class SenderEncryptionWithoutCertificateTest { + private Sender _sender = null!; + private ILogger<SenderEncryptionWithoutCertificateTest> _logger = null!; + + /* + * Encryption test must be changed for production to only allow extern signed certificates + * and forbid self-signed certificates. + */ + + [SetUp] + public void Setup() { + _logger = LoggerFactory.Create(cfg => cfg.AddConsole()) + .CreateLogger<SenderEncryptionWithoutCertificateTest>(); + _sender = new Sender(_logger, + FitConnectEndpoints.Create(FitConnectEndpoints.EndpointType.Development)); + } + + + [Test] + public void CryptWithOutPublicKeyImport() { + var cypher = _sender.EncryptData(Encoding.UTF8.GetBytes("test")); + + _logger.LogInformation("Cypher: {}", Convert.ToBase64String(cypher)); + } + + + [Test] + [Ignore("Not applicable for production")] + public void CryptWithPublicKeyImport() { + var publicKey = Convert.FromBase64String( + "MIIBCgKCAQEAzu/ek6A5AMuROs+12pncbYNteGkd6ReU28ZY5gCM4hNFI0h1E+0+OST+Yxw7zhvbFhZbYdVt8LmzonMAtENituLxzZj7MsWom/ZzxTdp4Cx5zlx8x6Qx/ZPoSS2T2Sf0ttymaMc6ZadpWsDhg/Mnf6beF1W/QoGH/bHBa8U4rhkUa+OKf3wyo08km8oyUJaj6kkB0VdhRp5rSyvXJtUMZ5A0LcYFygnkHTSQlQhdrAK+6nTo//mfNfPtqta2wBb9ONpVwN0V7I5PSdH2WxZMZsYFicLOGbNeF08gibmL+7TeBTssYtrNVM88cG0v+aWeBun0WVrpCntDIA9HIujWowIDAQAB"); + + var cypher = _sender.EncryptData(Encoding.UTF8.GetBytes("test"), publicKey); + + _logger.LogInformation("Cypher: {}", Convert.ToBase64String(cypher)); + } + + [Test] + public void ExportPrivateKey() { + var privateKey = _sender.ExportPrivateKey(); + _logger.LogInformation("Private key: {}", Convert.ToBase64String(privateKey)); + } + +} -- GitLab