< Summary

Information
Class: AsiBackbone.Core.Signing.SignatureVerificationRequest
Assembly: AsiBackbone.Core
File(s): /home/runner/work/AsiBackbone/AsiBackbone/src/AsiBackbone.Core/Signing/SignatureVerificationRequest.cs
Line coverage
100%
Covered lines: 32
Uncovered lines: 0
Coverable lines: 32
Total lines: 88
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_SigningHash()100%11100%
get_SigningMetadata()100%11100%
get_Purpose()100%11100%
get_Metadata()100%11100%
get_HasMetadata()100%11100%
NormalizeOptional(...)100%22100%
NormalizeMetadata(...)100%1414100%

File(s)

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

#LineLine coverage
 1using System.Collections.ObjectModel;
 2
 3namespace AsiBackbone.Core.Signing;
 4
 5/// <summary>
 6/// Represents a provider-neutral request to verify signing metadata against a precomputed artifact hash.
 7/// </summary>
 8public sealed class SignatureVerificationRequest
 9{
 210    private static readonly IReadOnlyDictionary<string, string> EmptyMetadata =
 211        new ReadOnlyDictionary<string, string>(
 212            new Dictionary<string, string>(StringComparer.Ordinal));
 13
 14    /// <summary>
 15    /// Initializes a new instance of the <see cref="SignatureVerificationRequest" /> class.
 16    /// </summary>
 2417    public SignatureVerificationRequest(
 2418        string signingHash,
 2419        SigningMetadata signingMetadata,
 2420        string? purpose = null,
 2421        IReadOnlyDictionary<string, string>? metadata = null)
 22    {
 2423        ArgumentException.ThrowIfNullOrWhiteSpace(signingHash);
 2424        ArgumentNullException.ThrowIfNull(signingMetadata);
 25
 2426        SigningHash = signingHash.Trim();
 2427        SigningMetadata = signingMetadata;
 2428        Purpose = NormalizeOptional(purpose);
 2429        Metadata = NormalizeMetadata(metadata);
 2430    }
 31
 32    /// <summary>
 33    /// Gets the precomputed artifact hash expected to have been signed.
 34    /// </summary>
 735    public string SigningHash { get; }
 36
 37    /// <summary>
 38    /// Gets the provider-neutral signing metadata to verify.
 39    /// </summary>
 540    public SigningMetadata SigningMetadata { get; }
 41
 42    /// <summary>
 43    /// Gets the host-defined verification purpose, when supplied.
 44    /// </summary>
 245    public string? Purpose { get; }
 46
 47    /// <summary>
 48    /// Gets additional provider-neutral request metadata.
 49    /// </summary>
 850    public IReadOnlyDictionary<string, string> Metadata { get; }
 51
 52    /// <summary>
 53    /// Gets a value indicating whether metadata is present.
 54    /// </summary>
 355    public bool HasMetadata => Metadata.Count > 0;
 56
 57    private static string? NormalizeOptional(string? value)
 58    {
 2459        return string.IsNullOrWhiteSpace(value)
 2460            ? null
 2461            : value.Trim();
 62    }
 63
 64    private static IReadOnlyDictionary<string, string> NormalizeMetadata(
 65        IReadOnlyDictionary<string, string>? metadata)
 66    {
 2467        if (metadata is null || metadata.Count == 0)
 68        {
 2269            return EmptyMetadata;
 70        }
 71
 272        Dictionary<string, string> normalizedMetadata = new(StringComparer.Ordinal);
 73
 1274        foreach (KeyValuePair<string, string> item in metadata)
 75        {
 476            if (string.IsNullOrWhiteSpace(item.Key))
 77            {
 78                continue;
 79            }
 80
 281            normalizedMetadata[item.Key.Trim()] = item.Value?.Trim() ?? string.Empty;
 82        }
 83
 284        return normalizedMetadata.Count == 0
 285            ? EmptyMetadata
 286            : new ReadOnlyDictionary<string, string>(normalizedMetadata);
 87    }
 88}