< Summary

Information
Class: AsiBackbone.Core.Signing.VerificationPolicyOptions
Assembly: AsiBackbone.Core
File(s): /home/runner/work/AsiBackbone/AsiBackbone/src/AsiBackbone.Core/Signing/VerificationPolicyOptions.cs
Line coverage
100%
Covered lines: 42
Uncovered lines: 0
Coverable lines: 42
Total lines: 110
Line coverage: 100%
Branch coverage
92%
Covered branches: 24
Total branches: 26
Branch coverage: 92.3%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%11100%
.ctor(...)100%11100%
Create(...)100%1818100%
GetAction(...)75%88100%

File(s)

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

#LineLine coverage
 1using System.Collections.ObjectModel;
 2
 3namespace AsiBackbone.Core.Signing;
 4
 5/// <summary>
 6/// Maps signature verification categories to host-facing verification policy actions.
 7/// </summary>
 8public sealed class VerificationPolicyOptions
 9{
 210    private static readonly IReadOnlyDictionary<SignatureVerificationCategory, VerificationPolicyAction> DefaultActionMa
 211        new ReadOnlyDictionary<SignatureVerificationCategory, VerificationPolicyAction>(
 212            new Dictionary<SignatureVerificationCategory, VerificationPolicyAction>
 213            {
 214                [SignatureVerificationCategory.Valid] = VerificationPolicyAction.Allow,
 215                [SignatureVerificationCategory.InvalidSignature] = VerificationPolicyAction.Deny,
 216                [SignatureVerificationCategory.HashMismatch] = VerificationPolicyAction.Deny,
 217                [SignatureVerificationCategory.MissingSignature] = VerificationPolicyAction.Deny,
 218                [SignatureVerificationCategory.UnknownKeyVersion] = VerificationPolicyAction.Escalate,
 219                [SignatureVerificationCategory.RevokedKey] = VerificationPolicyAction.Deny,
 220                [SignatureVerificationCategory.ProviderUnavailable] = VerificationPolicyAction.Defer,
 221                [SignatureVerificationCategory.CanonicalizationMismatch] = VerificationPolicyAction.Deny,
 222                [SignatureVerificationCategory.UnsupportedAlgorithm] = VerificationPolicyAction.Deny,
 223                [SignatureVerificationCategory.UntrustedKey] = VerificationPolicyAction.Deny,
 224                [SignatureVerificationCategory.UntrustedSigningContext] = VerificationPolicyAction.Deny,
 225                [SignatureVerificationCategory.Failed] = VerificationPolicyAction.Escalate
 226            });
 27
 828    private VerificationPolicyOptions(IReadOnlyDictionary<SignatureVerificationCategory, VerificationPolicyAction> actio
 29    {
 830        Actions = actions;
 831    }
 32
 33    /// <summary>
 34    /// Gets the default verification policy action map.
 35    /// </summary>
 36    /// <remarks>
 37    /// Only <see cref="SignatureVerificationCategory.Valid" /> allows. Every category that reports an integrity or trus
 38    /// failure denies: an invalid or missing signature, a hash, canonicalization, or algorithm mismatch, a revoked or
 39    /// untrusted key, and an untrusted signing context. Only conditions that a retry or an operator could legitimately
 40    /// resolve use softer actions: <see cref="SignatureVerificationCategory.ProviderUnavailable" /> defers, and
 41    /// <see cref="SignatureVerificationCategory.UnknownKeyVersion" /> and <see cref="SignatureVerificationCategory.Fail
 42    /// escalate.
 43    /// </remarks>
 44    public static VerificationPolicyOptions Default { get; } = new(DefaultActionMap);
 45
 46    /// <summary>
 47    /// Gets the configured verification category to host action map.
 48    /// </summary>
 49    public IReadOnlyDictionary<SignatureVerificationCategory, VerificationPolicyAction> Actions { get; }
 50
 51    /// <summary>
 52    /// Creates verification policy options with optional host overrides.
 53    /// </summary>
 54    /// <param name="actionOverrides">Category to action overrides applied over the defaults.</param>
 55    /// <param name="allowUnsafeAllowOverrides">
 56    /// When <see langword="true" />, permits mapping a failure category to <see cref="VerificationPolicyAction.Allow" /
 57    /// Such a mapping makes a failed verification indistinguishable from a successful one, so it must be opted into
 58    /// deliberately rather than reached by configuration drift.
 59    /// </param>
 60    /// <exception cref="ArgumentOutOfRangeException">A category or action is undefined, or a failure category was mappe
 61    public static VerificationPolicyOptions Create(
 62        IReadOnlyDictionary<SignatureVerificationCategory, VerificationPolicyAction>? actionOverrides = null,
 63        bool allowUnsafeAllowOverrides = false)
 64    {
 965        Dictionary<SignatureVerificationCategory, VerificationPolicyAction> actions = new(DefaultActionMap);
 66
 967        if (actionOverrides is not null)
 68        {
 3569            foreach (KeyValuePair<SignatureVerificationCategory, VerificationPolicyAction> item in actionOverrides)
 70            {
 1071                if (!Enum.IsDefined(item.Key) || item.Key is SignatureVerificationCategory.Unspecified)
 72                {
 173                    throw new ArgumentOutOfRangeException(nameof(actionOverrides), item.Key, "Verification category must
 74                }
 75
 976                if (!Enum.IsDefined(item.Value) || item.Value is VerificationPolicyAction.Unspecified)
 77                {
 178                    throw new ArgumentOutOfRangeException(nameof(actionOverrides), item.Value, "Verification policy acti
 79                }
 80
 881                if (!allowUnsafeAllowOverrides
 882                    && item.Value is VerificationPolicyAction.Allow
 883                    && item.Key is not SignatureVerificationCategory.Valid)
 84                {
 185                    throw new ArgumentOutOfRangeException(
 186                        nameof(actionOverrides),
 187                        item.Key,
 188                        "Mapping a failure category to Allow requires allowUnsafeAllowOverrides, because it makes a fail
 89                }
 90
 791                actions[item.Key] = item.Value;
 92            }
 93        }
 94
 695        return new VerificationPolicyOptions(new ReadOnlyDictionary<SignatureVerificationCategory, VerificationPolicyAct
 96    }
 97
 98    /// <summary>
 99    /// Gets the action configured for the supplied verification category.
 100    /// </summary>
 101    public VerificationPolicyAction GetAction(SignatureVerificationCategory category)
 102    {
 85103        return !Enum.IsDefined(category) || category is SignatureVerificationCategory.Unspecified
 85104            ? throw new ArgumentOutOfRangeException(nameof(category), category, "Verification category must be a specifi
 85105            : Actions.TryGetValue(category, out VerificationPolicyAction action)
 85106            && action is not VerificationPolicyAction.Unspecified
 85107            ? action
 85108            : VerificationPolicyAction.Escalate;
 109    }
 110}