< Summary

Information
Class: AsiBackbone.Core.Signing.VerificationPolicyContext
Assembly: AsiBackbone.Core
File(s): /home/runner/work/AsiBackbone/AsiBackbone/src/AsiBackbone.Core/Signing/VerificationPolicyContext.cs
Line coverage
100%
Covered lines: 52
Uncovered lines: 0
Coverable lines: 52
Total lines: 142
Line coverage: 100%
Branch coverage
100%
Covered branches: 16
Total branches: 16
Branch coverage: 100%
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%
get_Default()100%11100%
get_Purpose()100%11100%
get_ExpectedKeyId()100%11100%
get_ExpectedKeyVersion()100%11100%
get_ExpectedPolicyVersion()100%11100%
get_ExpectedPolicyHash()100%11100%
get_RequiredProvider()100%11100%
get_RequiredHashAlgorithm()100%11100%
get_Metadata()100%11100%
get_HasMetadata()100%11100%
Create(...)100%11100%
NormalizeOptional(...)100%22100%
NormalizeMetadata(...)100%1414100%

File(s)

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

#LineLine coverage
 1using System.Collections.ObjectModel;
 2
 3namespace AsiBackbone.Core.Signing;
 4
 5/// <summary>
 6/// Provides host expectations used while evaluating signature verification policy.
 7/// </summary>
 8/// <remarks>
 9/// The context is provider-neutral. It can carry expected key references, policy identifiers, and request metadata with
 10/// </remarks>
 11public sealed class VerificationPolicyContext
 12{
 113    private static readonly IReadOnlyDictionary<string, string> EmptyMetadata =
 114        new ReadOnlyDictionary<string, string>(
 115            new Dictionary<string, string>(StringComparer.Ordinal));
 16
 917    private VerificationPolicyContext(
 918        string? purpose,
 919        string? expectedKeyId,
 920        string? expectedKeyVersion,
 921        string? expectedPolicyVersion,
 922        string? expectedPolicyHash,
 923        string? requiredProvider,
 924        string? requiredHashAlgorithm,
 925        IReadOnlyDictionary<string, string> metadata)
 26    {
 927        Purpose = NormalizeOptional(purpose);
 928        ExpectedKeyId = NormalizeOptional(expectedKeyId);
 929        ExpectedKeyVersion = NormalizeOptional(expectedKeyVersion);
 930        ExpectedPolicyVersion = NormalizeOptional(expectedPolicyVersion);
 931        ExpectedPolicyHash = NormalizeOptional(expectedPolicyHash);
 932        RequiredProvider = NormalizeOptional(requiredProvider);
 933        RequiredHashAlgorithm = NormalizeOptional(requiredHashAlgorithm);
 934        Metadata = metadata;
 935    }
 36
 37    /// <summary>
 38    /// Gets a context with no additional host expectations.
 39    /// </summary>
 2840    public static VerificationPolicyContext Default { get; } = new(null, null, null, null, null, null, null, EmptyMetada
 41
 42    /// <summary>
 43    /// Gets the host-defined verification purpose.
 44    /// </summary>
 2045    public string? Purpose { get; }
 46
 47    /// <summary>
 48    /// Gets the expected signing key identifier, when required by host policy.
 49    /// </summary>
 2550    public string? ExpectedKeyId { get; }
 51
 52    /// <summary>
 53    /// Gets the expected signing key version, when required by host policy.
 54    /// </summary>
 2455    public string? ExpectedKeyVersion { get; }
 56
 57    /// <summary>
 58    /// Gets the expected policy version, when the signed metadata is expected to carry one.
 59    /// </summary>
 2160    public string? ExpectedPolicyVersion { get; }
 61
 62    /// <summary>
 63    /// Gets the expected policy hash, when the signed metadata is expected to carry one.
 64    /// </summary>
 2065    public string? ExpectedPolicyHash { get; }
 66
 67    /// <summary>
 68    /// Gets the required signing provider descriptor, when required by host policy.
 69    /// </summary>
 2370    public string? RequiredProvider { get; }
 71
 72    /// <summary>
 73    /// Gets the required hash algorithm descriptor, when required by host policy.
 74    /// </summary>
 3075    public string? RequiredHashAlgorithm { get; }
 76
 77    /// <summary>
 78    /// Gets additional provider-neutral verification request metadata.
 79    /// </summary>
 2580    public IReadOnlyDictionary<string, string> Metadata { get; }
 81
 82    /// <summary>
 83    /// Gets a value indicating whether additional metadata is present.
 84    /// </summary>
 385    public bool HasMetadata => Metadata.Count > 0;
 86
 87    /// <summary>
 88    /// Creates a provider-neutral verification policy context.
 89    /// </summary>
 90    public static VerificationPolicyContext Create(
 91        string? purpose = null,
 92        string? expectedKeyId = null,
 93        string? expectedKeyVersion = null,
 94        string? expectedPolicyVersion = null,
 95        string? expectedPolicyHash = null,
 96        string? requiredProvider = null,
 97        string? requiredHashAlgorithm = null,
 98        IReadOnlyDictionary<string, string>? metadata = null)
 99    {
 8100        return new VerificationPolicyContext(
 8101            purpose,
 8102            expectedKeyId,
 8103            expectedKeyVersion,
 8104            expectedPolicyVersion,
 8105            expectedPolicyHash,
 8106            requiredProvider,
 8107            requiredHashAlgorithm,
 8108            NormalizeMetadata(metadata));
 109    }
 110
 111    private static string? NormalizeOptional(string? value)
 112    {
 63113        return string.IsNullOrWhiteSpace(value)
 63114            ? null
 63115            : value.Trim();
 116    }
 117
 118    private static IReadOnlyDictionary<string, string> NormalizeMetadata(
 119        IReadOnlyDictionary<string, string>? metadata)
 120    {
 8121        if (metadata is null || metadata.Count == 0)
 122        {
 6123            return EmptyMetadata;
 124        }
 125
 2126        Dictionary<string, string> normalizedMetadata = new(StringComparer.Ordinal);
 127
 12128        foreach (KeyValuePair<string, string> item in metadata)
 129        {
 4130            if (string.IsNullOrWhiteSpace(item.Key))
 131            {
 132                continue;
 133            }
 134
 2135            normalizedMetadata[item.Key.Trim()] = item.Value?.Trim() ?? string.Empty;
 136        }
 137
 2138        return normalizedMetadata.Count == 0
 2139            ? EmptyMetadata
 2140            : new ReadOnlyDictionary<string, string>(normalizedMetadata);
 141    }
 142}