From b0d3fdb192e19b85060c638b2f2abd7b2b5a020b Mon Sep 17 00:00:00 2001
From: Klaus Fischer <klaus.fischer@eloware.com>
Date: Thu, 15 Sep 2022 07:36:09 +0200
Subject: [PATCH] WIP: TokenVerification for SET events not working for sender
 due to missing public key

---
 FitConnect/Encryption/FitEncryption.cs  |  2 +-
 FitConnect/FitConnectClient.cs          | 14 +++++++++++---
 FitConnect/Models/SecurityEventToken.cs | 12 +++++-------
 3 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/FitConnect/Encryption/FitEncryption.cs b/FitConnect/Encryption/FitEncryption.cs
index 4975ed14..c5005d87 100644
--- a/FitConnect/Encryption/FitEncryption.cs
+++ b/FitConnect/Encryption/FitEncryption.cs
@@ -209,7 +209,7 @@ public class FitEncryption {
         return sb.ToString();
     }
 
-
+    
     public static bool VerifyJwt(string signature, IEnumerable<JsonWebKey> keys,
         ILogger? logger = null) {
         foreach (var key in keys)
diff --git a/FitConnect/FitConnectClient.cs b/FitConnect/FitConnectClient.cs
index 19089979..fa1c531f 100644
--- a/FitConnect/FitConnectClient.cs
+++ b/FitConnect/FitConnectClient.cs
@@ -104,9 +104,17 @@ public abstract class FitConnectClient {
     public List<SecurityEventToken> GetStatusForSubmission(string caseId, string destinationId,
         bool skipTest = false) {
         var events = SubmissionService.GetStatusForSubmissionAsync(caseId, destinationId, skipTest)
-            .Result;
-        return events?.Where(s => s != null)
-            .Select(e => new SecurityEventToken(e!)).ToList() ?? new List<SecurityEventToken>();
+                         .Result?.Select(e => new SecurityEventToken(e!)).ToList() ??
+                     new List<SecurityEventToken>();
+
+        // Check OCSP Signature of SET Event
+        #warning Sender has no way to verify the OCSP signature
+        if (_publicKeySignatureVerification != null) {
+            var setsSignatureValid = events.Aggregate(true,
+                (run, e) => run &= FitEncryption.VerifyJwt(e.TokenString,
+                    new JsonWebKey(_publicKeySignatureVerification), Logger));
+        }
+        return events;
     }
 
     /// <summary>
diff --git a/FitConnect/Models/SecurityEventToken.cs b/FitConnect/Models/SecurityEventToken.cs
index de3b3ec1..91ac89b8 100644
--- a/FitConnect/Models/SecurityEventToken.cs
+++ b/FitConnect/Models/SecurityEventToken.cs
@@ -18,7 +18,6 @@ public enum EventType {
 }
 
 public class SecurityEventToken {
-
     public const string CreateSubmissionSchema =
         "https://schema.fitko.de/fit-connect/events/create-submission";
 
@@ -42,12 +41,12 @@ public class SecurityEventToken {
 
 
     public SecurityEventToken(string jwtEncodedString) {
-        Token = new JsonWebToken(jwtEncodedString);
+        TokenString = jwtEncodedString;
         EventType = DecodeEventType(Token.Claims);
 
-        if (Token.Claims.All(c => c.Type != "iat")) 
+        if (Token.Claims.All(c => c.Type != "iat"))
             return;
-        
+
         var iat = Token.Claims.FirstOrDefault(c => c.Type == "iat")!.Value;
         if (long.TryParse(iat, out var timeEpoch))
             EventTime = DateTime.UnixEpoch.AddSeconds(timeEpoch);
@@ -59,7 +58,8 @@ public class SecurityEventToken {
     public Events? Event { get; set; }
 
     public object? Payload { get; set; }
-    public JsonWebToken Token { get; set; }
+    public JsonWebToken Token => new JsonWebToken(TokenString);
+    public string TokenString { get; set; }
 
     private EventType DecodeEventType(IEnumerable<Claim> claims) {
         var eventsClaim = claims.FirstOrDefault(c => c.Type == "events");
@@ -87,14 +87,12 @@ public class SecurityEventToken {
                 ForwardSubmissionSchema))
             return EventType.Forward;
         if (eventsClaim.Value.Contains(
-
                 RejectSubmissionSchema)) {
             Problems = GetProblems(events?.Values?.FirstOrDefault()?.ToString() ?? "");
             return EventType.Reject;
         }
 
 
-
         if (eventsClaim.Value.Contains(AcceptSubmissionSchema))
 
             return EventType.Accept;
-- 
GitLab