using System.Security.Cryptography;
using System.Collections.Generic;
using Newtonsoft.Json.Linq;
static void Main(string[] args)
string signed_jwt = "{\"Msg ID\":\"1727552365203\",\"message\":\"ewogICJjYW5kaWRhdGVzIjogWwogICAgewogICAgICAiY29udGVudCI6IHsKICAgICAgICAicGFydHMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJ0ZXh0IjogIkluc3VsaW4gcmVzaXN0YW5jZSBpcyBhIGNvbmRpdGlvbiBpbiB3aGljaCB0aGUgYm9keSdzIGNlbGxzIGRvIG5vdCByZXNwb25kIG5vcm1hbGx5IHRvIHRoZSBob3Jtb25lIGluc3VsaW4uIEluc3VsaW4gaXMgYSBob3Jtb25lIHRoYXQgaGVscHMgZ2x1Y29zZSAoc3VnYXIpIGdldCBmcm9tIHRoZSBibG9vZHN0cmVhbSBpbnRvIGNlbGxzIGZvciBlbmVyZ3kuIFdoZW4gY2VsbHMgYXJlIGluc3VsaW4gcmVzaXN0YW50LCBnbHVjb3NlIGJ1aWxkcyB1cCBpbiB0aGUgYmxvb2RzdHJlYW0gYW5kIGNhbiBsZWFkIHRvIHR5cGUgMiBkaWFiZXRlcy5cblxuSW4gcGVvcGxlIHdpdGggdHlwZSAyIGRpYWJldGVzLCB0aGUgYm9keSdzIGNlbGxzIGRvIG5vdCByZXNwb25kIHByb3Blcmx5IHRvIGluc3VsaW4sIGFuZCBnbHVjb3NlIGJ1aWxkcyB1cCBpbiB0aGUgYmxvb2RzdHJlYW0uIFRoaXMgY2FuIGxlYWQgdG8gYSBudW1iZXIgb2YgY29tcGxpY2F0aW9ucywgaW5jbHVkaW5nOlxuXG4qIEhlYXJ0IGRpc2Vhc2VcbiogU3Ryb2tlXG4qIEtpZG5leSBkaXNlYXNlXG4qIE5lcnZlIGRhbWFnZVxuKiBFeWUgZGFtYWdlXG5cbkluc3VsaW4gcmVzaXN0YW5jZSBpcyBhIGNvbW1vbiBwcm9ibGVtIGluIHBlb3BsZSB3aXRoIG9iZXNpdHkgYW5kIG92ZXJ3ZWlnaHQuIE90aGVyIHJpc2sgZmFjdG9ycyBmb3IgaW5zdWxpbiByZXNpc3RhbmNlIGluY2x1ZGU6XG5cbiogQSBmYW1pbHkgaGlzdG9yeSBvZiB0eXBlIDIgZGlhYmV0ZXNcbiogQmVpbmcgcGh5c2ljYWxseSBpbmFjdGl2ZVxuKiBFYXRpbmcgYSBkaWV0IGhpZ2ggaW4gc2F0dXJhdGVkIGZhdCBhbmQgY2hvbGVzdGVyb2xcblxuVHJlYXRtZW50IGZvciBpbnN1bGluIHJlc2lzdGFuY2UgdHlwaWNhbGx5IGluY2x1ZGVzIGxpZmVzdHlsZSBjaGFuZ2VzLCBzdWNoIGFzIGxvc2luZyB3ZWlnaHQsIGVhdGluZyBhIGhlYWx0aHkgZGlldCwgYW5kIGdldHRpbmcgcmVndWxhciBleGVyY2lzZS4gTWVkaWNhdGlvbnMgbWF5IGFsc28gYmUgcHJlc2NyaWJlZCB0byBoZWxwIGxvd2VyIGJsb29kIGdsdWNvc2UgbGV2ZWxzLiIKICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJyb2xlIjogIm1vZGVsIgogICAgICB9LAogICAgICAiZmluaXNoUmVhc29uIjogIlNUT1AiLAogICAgICAiaW5kZXgiOiAwLAogICAgICAic2FmZXR5UmF0aW5ncyI6IFsKICAgICAgICB7CiAgICAgICAgICAiY2F0ZWdvcnkiOiAiSEFSTV9DQVRFR09SWV9TRVhVQUxMWV9FWFBMSUNJVCIsCiAgICAgICAgICAicHJvYmFiaWxpdHkiOiAiTkVHTElHSUJMRSIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJjYXRlZ29yeSI6ICJIQVJNX0NBVEVHT1JZX0hBVEVfU1BFRUNIIiwKICAgICAgICAgICJwcm9iYWJpbGl0eSI6ICJORUdMSUdJQkxFIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImNhdGVnb3J5IjogIkhBUk1fQ0FURUdPUllfSEFSQVNTTUVOVCIsCiAgICAgICAgICAicHJvYmFiaWxpdHkiOiAiTkVHTElHSUJMRSIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJjYXRlZ29yeSI6ICJIQVJNX0NBVEVHT1JZX0RBTkdFUk9VU19DT05URU5UIiwKICAgICAgICAgICJwcm9iYWJpbGl0eSI6ICJORUdMSUdJQkxFIgogICAgICAgIH0KICAgICAgXQogICAgfQogIF0sCiAgInVzYWdlTWV0YWRhdGEiOiB7CiAgICAicHJvbXB0VG9rZW5Db3VudCI6IDcsCiAgICAiY2FuZGlkYXRlc1Rva2VuQ291bnQiOiAyMDUsCiAgICAidG90YWxUb2tlbkNvdW50IjogMjEyCiAgfQp9Cg==\",\"signedjwt\":\"eyJhbGciOiJIUzI1NiIsImtpZCI6IkFiOVZVN3lNcFh2VU9XRXBEVm5ZSENTV0dWQjRKa0dUNXlYeWVYNTNKa0dHVHhHcDl3UnZvME1UYzA0bWI4a1pvSWlsQ0U2VGRMdWJvNFlHcVk0dVU2SlFHM24rSEtGOWU0VXhxS0UwWkg4TlhFTWFjVDVUYWgyczFnTjFaU3NyOWtMK241MW85TGhnYmdKYkowTUhRRU9ZQmJIWVhrb0lDNllmVU1abkFWU2lVSk1YWUlqUmhnbHcxUjVYWUF4NktsdnJkcTI2eWJUWnRwRjk3bzJvY2JBMFlickNiRUVsUzNLalBHSkZLVDdDajdOV1QwOW1JTlNkSVJoOFRwVlhvbEJsQ1VsRCtZZ1hTRFVuVVo1K1FqVTN3RHpOT00rOE5pQnljd3cwUVJFUUEyTzVkNHd3aFBhc2NnaTBqYzJWWVdLUm5nbDV2SGdQTHpheGNKT1hWS0pRRXFzeUh6d0tkalBMSHVBeWVRZHBTY1NjUDBkdGc3RUVnQSt3bEs0V2JJQXZTOWcwZW5oamtUa0FibHZiWjJPclNEK0lEZkFlS3h6YWxYRUpRMVdpVUdSOXhvRUdxSzRSNUl5ckFFUnVHZ3Btdm1GWWVCVElpYjB6dEZja2xHRWo0NG4zSFJpLzg2Z2FtenEvdmtIK2VIRTVxaVNaQnJwNXI3M293bFJWb2xDM2I4WVJCN1hRdmdxTitIaHdOWkNTVGtxUWtBOFF0SzNxQlE0YkFDbHNTOStyV0lQMkV6QXlJb0dJTmx0NGNGSUd2VmhFTElHRXA4OU94SHZHVXFKUSIsImlzc3VlciI6ImdlbWluaS5oZXhhZWlnaHQuY29tIiwidHlwIjoiSk9TRSIsImNoYW5uZWxTZWN1cml0eUNvbnRleHQiOiJIZXhhRWlnaHRFbmNyeXB0aW9uIiwiaWF0IjoyODc5MjU0MCwiZXhwIjoyOTMxNzUzMCwia2d0IjoyODc5MjUzMCwiTG9naW5Ub2tlbiI6IjNhNjBiNjZkMjE5YWJlNDg3Yjg1OTgwMWE3MDRmNTJhYWY3OGQ1YmFjMWZhODBjNmUyNjE5ZDU5MWVlNDI0MDg2OTI2ZGY2MTBlYTg5NDMwYjFkMzgwMDA2MDhkODBjOTljNzhjM2Y4YmEyMzc0MTg4Y2I1ZDYyMWYxMTBhY2Y2LmdlbWluaS5oZXhhZWlnaHQuY29tIiwiUmVzb3VyY2UiOiIzYTYwYjY2ZDIxOWFiZTQ4N2I4NTk4MDFhNzA0ZjUyYWFmNzhkNWJhYzFmYTgwYzZlMjYxOWQ1OTFlZTQyNDA4NjkyNmRmNjEwZWE4OTQzMGIxZDM4MDAwNjA4ZDgwYzk5Yzc4YzNmOGJhMjM3NDE4OGNiNWQ2MjFmMTEwYWNmNi5nZW1pbmkuaGV4YWVpZ2h0LmNvbSIsIkF1dGhTaGFyZWRrZXkiOiJUQXdCb29vUnE3OWZWV1NoeUpCUmVRVzlXUTZrQVRwSjl1RzY2SWRpT2EzbWhyaGdNdkdIRkF5T1o2NTBULzJJWW9XdDBCdlNUd1M3RjVIVXFRR2ZsbzNNMUNVcFFaWUdSd1ZjTGNpZWFKcXNjL3NwL21oRm1YTjcwcE1UeXlQekNhQnd2NklSYlpyUERqUlRhMWhUWnM1OFpQSFFOQnljQzdhRDNaU1FBRE9kT1FRMkZkdDlrTmNQdXEvUzBUeDlBQlIzM0lRWlhSSlllNnY1dFZGSi9BPT06eWdZR2xuZ1VqdXkrV1IrZjAzdWhvWll0MHFNaFdhbXFLb2dQam1neVB1ZmwwOGhtSHFYM3hCOUxyRmxhK3VkQ0lqTitUZ2hIQ0I3TklueEJZMmw5Tk9HZDh3aTR6QXY0TVQzd0dRNDJ1ZW5kb05uNWNVd3RhcDlCODU4dUhMNEtBdFhnUEY5eXZLcXEzUUIwdDlCSXVlbFh6b1A3K2hXVUYvbEdkQmZZdUw2T3JQeEFyQkhNOXhqZnordXZUU2lENHhzYlh5NVZmTXZTRjRTc0ZOYmZHWEFuUzRCQmg0QU9DSVBkOUlxeDFtMWx3aURvYlFTODdSSVJmWVFVMkRzSEk5SWN6OWZLYnhGTWhHSWU2MHZwMFlOMkVCVEkxUERsRDFTejRlK21jc2ExQS9lQklSSGI1MWlnRXpUZFlzOStKVjljcVJLWDJ0SWZPU2RJcUo2a0d6M1VrYXRZQnF4SERiM2wxRnJ3STNKT3BqMmJlZDEvTWYyU2xiSHpuTzA9OkZOdlNPL281VTlCUlNmbEJodHJuUVd5OWhYNXhjWlA3WG0rNHpZeEVyT1YvV1IwL3dhQ1JqN1FwUkNYd2p3enozL2ZKRzlvR2NrK0dIRXFKRWJia21oQm4waVJuejN5VS9oU2JkcnJhdW5iQ0E1MERXdnZwS1dtQzdDQjZHbHhjajFhTWJrb0hGOUN0WlJQRGM4MVpGWFBQOXE3VFN1VTZBMGFRM2RxRWZWQk5CVnRQb1c1MnRFeU5MNDMxVG9pclp1NkJvejN4d2c0MWFKbUdrdmQwMHV5QVMzSGE0Q1VFQ0p1S2VzSG4xcGNYRU1EYmV5eWVBc09XSVVLU2RHNFdiSDhDb1pOTE9RVkJ4RU9CQVRLZWtqZS9TTkJDaGxmem5qNzF3SGtpWW5LVStCSDh2TjFKTUU2LzJKZEZPbUVDdFVGSHJkclJTbHJBamJGdnI4SzJ5SVZYM0toTzg2ZHc1WVUwVmtvZnVCdGpzNFRKREVVQW5RWGExSndZeGlRPSIsIkNhcHRjaGFJZCI6IiIsInVuc2VjdXJlZCI6dHJ1ZX0.eyJlbmNyeXB0ZWQiOiJZTkdGbU8xUVlBdWtpNHF1TlZJYXRZMHA5bDRvSm01ZzByKzhxUUVkbGdBSkEyTWpKbHFtUjN3NE9pVjJaVEVjT240TGx5OXF5S2pyaXNESFd0UFBVS0pRWDFaUG4vQmJOVjBremNld1R4MmFqZFdHT01Ud2tQdHpMeEpZclRKQUxINE96Z05nUnhIQ1gxNFppQnJTaXMvTmdpOEVzZWpLb3BaZmVxbzdERkdpVUt0RkpKaHVGSlVpTVUyUWp0QTMvRkd2a0RuSDE1eW1UMnJSbHg2WmtMeXk4eGR6TDFLKzJiUTJEMXNTcHBmTVRnV3RSbXVjVGc2QVlORVZBTjlRb2xCVEx1ZUZZS2pycHFZaC9zYXJXc1BKd25HaVp2QnViNFVSYkFvbDZrMjNOL3RhK0NOOGluVksydzd1dDdXU1A1N2VIUUdlUGsyamhRZGYxbjhnVWFKUTRsYjJYUHQ0ZlF0TVJDVWlSZ2tEY3dvK1FzZTBHcktXaVdic2tDKzduejVkaGg2TmtLN1BYV0NobDNCY0NJMnRRU3NjVmRpQlhIdTRXd1dJSWxHaVVJTmFvejdFeUpnUytBdWh2WkMyNjM4Q09pYk5neDFUSjFrUVd5TXFLREY3TkNydHFTOXpWQzJURmdRWTdISkZyNkdPTEZyOFZxUXpkYng5UXN0UW9sQWdKOFFUVXI3TkxOU25GMDdwSzZZOC9UOTRSNXZRejVNZUR1cGZSNW5jUUtFL2pVOTRNTkU5d1FFdW5GUmlsSE0yRW45VkZRbjhnbHBtaDd3WlVhSlFKRnJycWxsTlU1cFdJV3VaRm5xZFNmaUg1aEFjU2MxQW5vWkZ5TTA5cmFJUUNuQm1Da3BScjVKRFJXN3h1V1pocWNCVFd1UlllQm5DQmVUZUdGR2lVUFkrQ0F2Z1FwbWJ0MzE0czU0M0RFZktIdjl3V05BNEJoSk9SSUROWjdwTmhTUk54RGpOR1JGbFlHRmJnQlk0aERiU3NsdG1yaW9QR3lZcmIrRlFvbENPT0hLM01qTzhFKzV0U1ZzTnZvb3RIcXlSZ1FuRzNZWXJ6K2NDeWwxSlZRb0NkVXBpSDRHczVuNVRiVDlRSTIreE1OaHZRcEgzdStRQ3RyRGdVS0pRVk1Ia01RZ1A4NXNJMExzZ2RtdUtLVmhJM1hMU2xVK1c5Y3hvVHB5US9HWjNxWjB5TzZob3d2cXZKcGJUTzF0OTJrSW9rc0ZJMXljTGc4RGJIVkdpVUFkYWlrSkZyelkvNEwzY0xVd0ZaRFJXek9WblZXSmViVGVzUEE2NlZxTEtza2cxb0lrK3puVU5ndEVwd0RZK09hS0p3aWFEdlNxS2gxT0xqaEJSb2xCaEVDc05NaTlKeVE4NEczV2plV2M4Y29yY24vcDZHYTdMYWZoemVEUUxnWHViYXNVK0I1dDJrVVFQbDNCNHpZQTdrZERHaXNyanVEL0QwSERaVUtKUTV3TURWc1ZiRlFxa0p2UFFucVV3aE9KZEpDRWZhU0VIeThJZ1ZxMGtYRjN2a3BSL0Jub2VGejRBTHEzdmNwUkQ0MmFyaUdKWlBWU0VYTHFPMmxDaVVFQ3B2bjY3TmdWcUVKYlBkVGh6d1JRd1JYUko0TWpvdVNOMmFKTlZtMVBFRHlrYnN0UUlWYUhhaFpOZ01rNWRBbGxFaHE3R0dkWE9pVWFsbmg5Um9sQmtjelNBU0dJSzBrakFUYzR1cmthaWtaaERmRGU4UUdhM1cxdXVuRWN4QU5oZE8wdHh2Y0NzWVFHcmNVS29DbWt3SFo5TDZncVJBS05Fa1ZQNlVLSlFGREtjYnlDMXVoZ0NSYVN3T0xuQWoxSTFIRm1JdHp1SVBqNWFSSXFqV3BFeWN5YWl1a0ZpcG02RldGMENSVlZPVXF6dkJqeHl3cGRXTWVoSTIxQ2lVQT09In0.cKIKx0LyAwBVO_BxD5HlQRg2DndSJQxkJYmBoW1XL9U\"}";
var escpjsonMessage = EscapeQuotes(signed_jwt);
var parsedJson = JObject.Parse(escpjsonMessage);
var msgid = parsedJson["Msg ID"]?.ToString();
var message = parsedJson["message"]?.ToString();
var signedjwt = parsedJson["signedjwt"]?.ToString();
if (string.IsNullOrEmpty(message) || string.IsNullOrEmpty(signedjwt))
Console.WriteLine("Error: 'message' or 'signedjwt' is missing in the JSON.");
var msghash = ComputeSha512Hash(message);
var messagejwt = new HexaEightJose.JWT("");
var kgt = messagejwt.GetKGTFromJWT(signedjwt);
var doublehash = ComputeSha512Hash(msghash.Trim() + kgt.ToString().Trim());
var asharedkey = messagejwt.GetUserAuthSharedkeyFromJWT(signedjwt);
messagejwt.SetHexaEightCredentials("", messagejwt.GetLoginTokenFromJWT(signedjwt), doublehash, "");
string decodeddata = messagejwt.ValidateTokenUsingSharedKey(signedjwt, asharedkey);
dynamic? jsonresp = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(decodeddata);
Console.WriteLine($"Message ID : {msgid}");
Console.WriteLine($"Message: {Encoding.UTF8.GetString(Convert.FromBase64String(message))}");
Console.WriteLine(jsonresp);
Console.WriteLine("Note: The Message ID in the JSON message should match with the decoded JSON properties above.");
Console.WriteLine($"Message could not be verified: {ex.Message}");
static string HashEmail(string email)
using var sha512 = SHA512.Create();
byte[] emailBytes = Encoding.UTF8.GetBytes(email);
byte[] hashedEmailBytes = sha512.ComputeHash(emailBytes);
return BitConverter.ToString(hashedEmailBytes).Replace("-", "").ToLower();
static string ComputeSha512Hash(string input)
using var sha512 = SHA512.Create();
byte[] inputBytes = Encoding.UTF8.GetBytes(input);
byte[] hashBytes = sha512.ComputeHash(inputBytes);
return BitConverter.ToString(hashBytes).Replace("-", "").ToLower();
static string EscapeQuotes(string input)
input = input.Trim('\'', '"', '{', '}');
var pairs = input.Split(',');
var jsonObject = new JObject();
foreach (var pair in pairs)
var parts = pair.Split(':', 2);
var key = parts[0].Trim().Trim('"');
var value = parts[1].Trim().Trim('"');
return jsonObject.ToString(Newtonsoft.Json.Formatting.None);