From 870d6063302d167ee852c6835fe28bc497682d98 Mon Sep 17 00:00:00 2001
From: Klaus Fischer <klaus.fischer@eloware.com>
Date: Thu, 7 Jul 2022 08:56:16 +0200
Subject: [PATCH] Ready to test

---
 Encryption/FitEncryption.cs                   |  8 +++----
 Encryption/IEncryptor.cs                      |  2 +-
 Encryption/JoseEncryptor.cs                   |  4 ++--
 EncryptionTests/EncryptionTests.csproj        |  1 +
 EncryptionTests/FileEncryptionTest.cs         |  2 +-
 EncryptionTests/JweTest.cs                    |  2 +-
 ...EncryptionWithSelfSignedCertificateTest.cs | 11 ++++------
 .../SenderEncryptionWithoutCertificateTest.cs | 10 +++------
 FitConnect/FluentSubscriber.cs                | 21 +++++++++----------
 FitConnect/Models/Submission.cs               |  4 ++--
 10 files changed, 29 insertions(+), 36 deletions(-)

diff --git a/Encryption/FitEncryption.cs b/Encryption/FitEncryption.cs
index 130cf855..911a5194 100644
--- a/Encryption/FitEncryption.cs
+++ b/Encryption/FitEncryption.cs
@@ -36,8 +36,8 @@ public class FitEncryption {
         PublicKeyEncryption = keySet.PublicKeyEncryption;
         PublicKeySignatureVerification = keySet.PublicKeySignatureVerification;
     }
-    
-    public string Decrypt(string cypherText) {
+
+    public (string cypher, byte[] tag) Decrypt(string cypherText) {
         if (PrivateKeyDecryption == null) {
             throw new InvalidOperationException("PrivateKey is not provided");
         }
@@ -50,7 +50,7 @@ public class FitEncryption {
             throw new InvalidOperationException("PrivateKey is not provided");
         }
 
-        return _encryptor.Encrypt(plain, PrivateKeyDecryption);
+        return _encryptor.Encrypt( PrivateKeyDecryption, plain);
     }
 
     public string Encrypt(byte[] plain) {
@@ -58,6 +58,6 @@ public class FitEncryption {
             throw new InvalidOperationException("PrivateKey is not provided");
         }
 
-        return _encryptor.Encrypt( PrivateKeyDecryption, plain);
+        return _encryptor.Encrypt(PrivateKeyDecryption, plain);
     }
 }
diff --git a/Encryption/IEncryptor.cs b/Encryption/IEncryptor.cs
index 636d2ae0..113cf579 100644
--- a/Encryption/IEncryptor.cs
+++ b/Encryption/IEncryptor.cs
@@ -7,6 +7,6 @@ namespace FitConnect.Encryption;
 
 public interface IEncryptor {
     public string Encrypt(string key, string plain);
-    public string Decrypt(string key, string cipher);
+    public (string cypher, byte[] tag) Decrypt(string key, string cipher);
     public string Encrypt(string key, byte[] plain);
 }
\ No newline at end of file
diff --git a/Encryption/JoseEncryptor.cs b/Encryption/JoseEncryptor.cs
index af233555..5851f869 100644
--- a/Encryption/JoseEncryptor.cs
+++ b/Encryption/JoseEncryptor.cs
@@ -20,9 +20,9 @@ public class JoseEncryptor : IEncryptor {
         return Encrypt(jwk, plain);
     }
 
-    public string Decrypt(string key, string cipher) {
+    public (string cypher, byte[] tag) Decrypt(string key, string cipher) {
         var jwk = Jwk.FromJson(key, new Jose.JsonMapper());
-        return Decrypt(jwk, cipher).cypher;
+        return Decrypt(jwk, cipher);
     }
 
     public string Encrypt(string key, byte[] plain) {
diff --git a/EncryptionTests/EncryptionTests.csproj b/EncryptionTests/EncryptionTests.csproj
index 0df409b4..6d8174f8 100644
--- a/EncryptionTests/EncryptionTests.csproj
+++ b/EncryptionTests/EncryptionTests.csproj
@@ -25,6 +25,7 @@
     </ItemGroup>
 
     <ItemGroup>
+        <Folder Include="assets" />
         <Folder Include="Certificates" />
     </ItemGroup>
 
diff --git a/EncryptionTests/FileEncryptionTest.cs b/EncryptionTests/FileEncryptionTest.cs
index 76c15b9e..75660b83 100644
--- a/EncryptionTests/FileEncryptionTest.cs
+++ b/EncryptionTests/FileEncryptionTest.cs
@@ -8,7 +8,7 @@ namespace SenderTest;
 public class FileEncryptionTest {
     private byte[] sourceFile = null!;
     private FitEncryption _encryption;
-    private byte[] _encryptedFile;
+    private string _encryptedFile;
 
     [SetUp]
     public void Setup() {
diff --git a/EncryptionTests/JweTest.cs b/EncryptionTests/JweTest.cs
index 0d16ac69..2a52b3b9 100644
--- a/EncryptionTests/JweTest.cs
+++ b/EncryptionTests/JweTest.cs
@@ -45,6 +45,6 @@ public class JweTest {
 
 
         // Assert
-        plain.Should().Be(dummyText);
+        plain.cypher.Should().Be(dummyText);
     }
 }
diff --git a/EncryptionTests/SenderEncryptionWithSelfSignedCertificateTest.cs b/EncryptionTests/SenderEncryptionWithSelfSignedCertificateTest.cs
index 19e25d49..47f53817 100644
--- a/EncryptionTests/SenderEncryptionWithSelfSignedCertificateTest.cs
+++ b/EncryptionTests/SenderEncryptionWithSelfSignedCertificateTest.cs
@@ -13,7 +13,7 @@ namespace SenderTest;
 [Ignore("Encryption strategy does not match the one used on server")]
 public class SenderEncryptionWithSelfSignedCertificateTest {
     private const string ToEncrypt = "This is a test message";
-    private static byte[]? cypher;
+    private static string? cypher;
     private X509Certificate2 _certificate = null!;
     private ILogger<SenderEncryptionWithSelfSignedCertificateTest> _logger = null!;
     private Sender _sender = null!;
@@ -52,16 +52,13 @@ public class SenderEncryptionWithSelfSignedCertificateTest {
     public void CryptWithOutPublicKeyImport() {
         cypher = _sender.Encryption.Encrypt(Encoding.UTF8.GetBytes(ToEncrypt));
 
-        _logger.LogInformation("Cypher: {}", Convert.ToBase64String(cypher));
+        _logger.LogInformation("Cypher: {}", cypher);
     }
 
     [Test]
     [Order(20)]
     public void Decrypt_ResultShouldMatchToEncrypt() {
-        var result = _sender.Encryption.Decrypt(cypher!);
-        Encoding.UTF8.GetString(result).Should().Be(ToEncrypt);
+        var (result, tag) = _sender.Encryption.Decrypt(cypher!);
+        result.Should().Be(ToEncrypt);
     }
-
-
-    
 }
diff --git a/EncryptionTests/SenderEncryptionWithoutCertificateTest.cs b/EncryptionTests/SenderEncryptionWithoutCertificateTest.cs
index 2ae2dd76..a77c902f 100644
--- a/EncryptionTests/SenderEncryptionWithoutCertificateTest.cs
+++ b/EncryptionTests/SenderEncryptionWithoutCertificateTest.cs
@@ -33,19 +33,15 @@ public class SenderEncryptionWithoutCertificateTest {
     [Order(10)]
     public void EncryptData_ShouldNotThrowAnyException() {
         var cypher = _sender.Encryption.Encrypt(Encoding.UTF8.GetBytes(ToEncrypt));
-
-        _cypherText = Convert.ToBase64String(cypher);
-        _logger.LogInformation("Cypher: {}", _cypherText);
+        _logger.LogInformation("Cypher: {}", cypher);
     }
 
 
     [Test]
     [Order(20)]
     public void DecryptData_ShouldMatchToEncrypt() {
-        var cypher = Convert.FromBase64String(_cypherText);
-        var plain = _sender.Encryption.Decrypt(cypher);
+        var (plain, tag) = _sender.Encryption.Decrypt(_cypherText);
 
-        Encoding.UTF8.GetString(plain).Should().Be(ToEncrypt);
+        plain.Should().Be(ToEncrypt);
     }
-
 }
diff --git a/FitConnect/FluentSubscriber.cs b/FitConnect/FluentSubscriber.cs
index 60bf3342..86785e23 100644
--- a/FitConnect/FluentSubscriber.cs
+++ b/FitConnect/FluentSubscriber.cs
@@ -61,15 +61,16 @@ public class FluentSubscriber : Subscriber,
             Authenticate(Owner.ClientId, Owner.ClientSecret);
 
         var submission = (Submission)SubmissionService.GetSubmission(submissionId);
-        var metaDataString = Encryption.Decrypt(submission.EncryptedMetadata);
-        if (metaDataString != null)
-            submission.Metadata =
-                JsonConvert.DeserializeObject<Metadata>(metaDataString);
+        var (metaDataString, metaHash) = Encryption.Decrypt(submission.EncryptedMetadata);
+        submission.Metadata =
+            JsonConvert.DeserializeObject<Metadata>(metaDataString);
 
-        var dataString = Encryption.Decrypt(submission.EncryptedData);
-        if (dataString != null)
+        if (submission.EncryptedData != null) {
+            var (dataString, dataHash) = Encryption.Decrypt(submission.EncryptedData);
             submission.Data =
                 JsonConvert.DeserializeObject<Data>(dataString);
+        }
+
         Submission = submission;
         return this;
     }
@@ -90,13 +91,11 @@ public class FluentSubscriber : Subscriber,
         foreach (var id in Submission!.Attachments.Select(a => a.Id)) {
             var encryptedAttachment = SubmissionService.GetAttachment(Submission.Id, id);
 
-            var content = _encryption.Decrypt(Convert.FromBase64String(encryptedAttachment));
+            var (content, hash) = _encryption.Decrypt(encryptedAttachment);
 
-            // TODO where do I get the hash from the server to verify the attachment?
-            var hash = MD5.Create(HashAlgorithmName.SHA512.ToString())?.ComputeHash(content) ??
-                       Array.Empty<byte>();
 
-            attachments.Add(new Attachment(id, content, Convert.ToBase64String(hash), "dummy.pdf"));
+            attachments.Add(new Attachment(id, Convert.FromBase64String(content),
+                Convert.ToBase64String(hash), "dummy.pdf"));
         }
 
         Submission.Attachments = attachments;
diff --git a/FitConnect/Models/Submission.cs b/FitConnect/Models/Submission.cs
index 57b96428..59fc2ff9 100644
--- a/FitConnect/Models/Submission.cs
+++ b/FitConnect/Models/Submission.cs
@@ -32,8 +32,8 @@ public class Submission {
     public Callback? Callback { get; set; }
     public Metadata? Metadata { get; set; }
     public Data? Data { get; set; }
-    public string EncryptedMetadata { get; set; }
-    public string EncryptedData { get; set; }
+    public string? EncryptedMetadata { get; set; }
+    public string? EncryptedData { get; set; }
 
     public bool IsSubmissionReadyToAdd(out string? error) {
         var innerError = "";
-- 
GitLab