using Microsoft.IdentityModel.Tokens; using System.Text.Json; namespace StellaOps.Auth.Security.Dpop; public sealed partial class DpopProofValidator { private static string NormalizeHtu(Uri uri) { var builder = new UriBuilder(uri) { Fragment = null, Query = null }; return builder.Uri.ToString(); } private static bool TryDecodeSegment( string token, int segmentIndex, out JsonElement element, out string? error) { element = default; error = null; var segments = token.Split('.'); if (segments.Length != 3) { error = "Token must contain three segments."; return false; } if (segmentIndex < 0 || segmentIndex > 2) { error = "Segment index out of range."; return false; } try { var json = Base64UrlEncoder.Decode(segments[segmentIndex]); using var document = JsonDocument.Parse(json); element = document.RootElement.Clone(); return true; } catch (Exception ex) { error = ex.Message; return false; } } }