using System.Security.Cryptography; using System.Text; namespace ROLAC.API.Services.Notifications; /// Verifies the X-Line-Signature header (HMAC-SHA256 of the raw body, base64). public static class LineSignature { public static bool IsValid(string channelSecret, byte[] rawBody, string? signatureHeader) { if (string.IsNullOrEmpty(signatureHeader)) return false; using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(channelSecret)); var expected = Convert.ToBase64String(hmac.ComputeHash(rawBody)); return CryptographicOperations.FixedTimeEquals( Encoding.UTF8.GetBytes(expected), Encoding.UTF8.GetBytes(signatureHeader)); } }