< Summary

Information
Class: AsiBackbone.Core.Signing.VerificationPolicyEvaluator
Assembly: AsiBackbone.Core
File(s): /home/runner/work/AsiBackbone/AsiBackbone/src/AsiBackbone.Core/Signing/VerificationPolicyEvaluator.cs
Line coverage
100%
Covered lines: 47
Uncovered lines: 0
Coverable lines: 47
Total lines: 110
Line coverage: 100%
Branch coverage
95%
Covered branches: 19
Total branches: 20
Branch coverage: 95%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%11100%
Evaluate(...)100%11100%
Categorize(...)90%1010100%
Matches(...)100%11100%
get_Category()100%11100%
get_AnyPatterns()100%11100%
get_AllPatterns()100%11100%
IsMatch(...)100%1010100%

File(s)

/home/runner/work/AsiBackbone/AsiBackbone/src/AsiBackbone.Core/Signing/VerificationPolicyEvaluator.cs

#LineLine coverage
 1namespace AsiBackbone.Core.Signing;
 2
 3/// <summary>
 4/// Evaluates provider-neutral signature verification results against host verification policy.
 5/// </summary>
 6public static class VerificationPolicyEvaluator
 7{
 28    private static readonly CategoryRule[] FailureCodeCategoryRules =
 29    [
 210        new(SignatureVerificationCategory.MissingSignature, ["missing"]),
 211        new(SignatureVerificationCategory.HashMismatch, ["hash"]),
 212        new(SignatureVerificationCategory.CanonicalizationMismatch, ["canonicalization", "payload-schema", "artifact"]),
 213        new(SignatureVerificationCategory.UnsupportedAlgorithm, ["unsupported", "algorithm"]),
 214        new(SignatureVerificationCategory.RevokedKey, ["revoked", "disabled"]),
 215        new(
 216            SignatureVerificationCategory.UnknownKeyVersion,
 217            ["key-version", "key.mismatch", "key-mismatch"],
 218            ["unknown", "key"]),
 219        new(SignatureVerificationCategory.ProviderUnavailable, ["provider-unavailable", "unavailable", "timeout", "netwo
 220        new(SignatureVerificationCategory.InvalidSignature, ["invalid", "malformed", "signature"])
 221    ];
 22
 23    /// <summary>
 24    /// Evaluates a signed governance artifact and verification result against verification policy.
 25    /// </summary>
 26    public static VerificationPolicyOutcome Evaluate<TArtifact>(
 27        SignedGovernanceArtifact<TArtifact> artifact,
 28        SignatureVerificationResult verificationResult,
 29        VerificationPolicyOptions? options = null)
 30    {
 7231        ArgumentNullException.ThrowIfNull(artifact);
 7232        ArgumentNullException.ThrowIfNull(verificationResult);
 33
 7234        return VerificationPolicyOutcome.CreateCore(
 7235            artifact.ArtifactType,
 7236            artifact.ArtifactId,
 7237            artifact.SigningHash,
 7238            artifact.HashAlgorithm,
 7239            artifact.SigningMetadata,
 7240            verificationResult,
 7241            options);
 42    }
 43
 44    /// <summary>
 45    /// Maps a provider-neutral verification result to a stable verification category.
 46    /// </summary>
 47    public static SignatureVerificationCategory Categorize(SignatureVerificationResult verificationResult)
 48    {
 15049        ArgumentNullException.ThrowIfNull(verificationResult);
 50
 14851        if (verificationResult.IsValid)
 52        {
 1453            return SignatureVerificationCategory.Valid;
 54        }
 55
 13456        if (Matches(verificationResult.Status, "MissingSignature"))
 57        {
 1258            return SignatureVerificationCategory.MissingSignature;
 59        }
 60
 12261        string failureCode = verificationResult.FailureCode ?? string.Empty;
 62
 142063        foreach (CategoryRule rule in FailureCodeCategoryRules)
 64        {
 64665            if (rule.IsMatch(failureCode))
 66            {
 11667                return rule.Category;
 68            }
 69        }
 70
 671        return SignatureVerificationCategory.Failed;
 72    }
 73
 74    private static bool Matches(string value, string pattern)
 75    {
 137876        return value.Contains(pattern, StringComparison.OrdinalIgnoreCase);
 77    }
 78
 79    private readonly record struct CategoryRule(
 11680        SignatureVerificationCategory Category,
 64681        string[] AnyPatterns,
 59082        string[]? AllPatterns = null)
 83    {
 84        public bool IsMatch(string failureCode)
 85        {
 355286            foreach (string pattern in AnyPatterns)
 87            {
 118688                if (Matches(failureCode, pattern))
 89                {
 11290                    return true;
 91                }
 92            }
 93
 53494            if (AllPatterns is null)
 95            {
 48296                return false;
 97            }
 98
 17299            foreach (string pattern in AllPatterns)
 100            {
 58101                if (!Matches(failureCode, pattern))
 102                {
 48103                    return false;
 104                }
 105            }
 106
 4107            return AllPatterns.Length > 0;
 108        }
 109    }
 110}