using System.Text.Json;
namespace StellaOps.AirGap.Bundle.Services;
public sealed partial class SnapshotManifestSigner
{
///
/// Verifies a DSSE envelope signature.
///
public async Task VerifyAsync(
ManifestVerificationRequest request,
CancellationToken cancellationToken = default)
{
ArgumentNullException.ThrowIfNull(request);
ArgumentNullException.ThrowIfNull(request.EnvelopeBytes);
try
{
using var envelope = JsonDocument.Parse(request.EnvelopeBytes);
var root = envelope.RootElement;
if (!TryReadEnvelope(root, out var parts, out var error))
{
return new ManifestVerificationResult
{
Success = false,
Error = error
};
}
var payloadDigest = ComputeSha256(parts.PayloadBytes);
var verifiedSignatures = await VerifySignaturesAsync(
parts.SignaturesElement,
request.PublicKey,
parts.PaeBytes,
cancellationToken)
.ConfigureAwait(false);
return new ManifestVerificationResult
{
Success = true,
PayloadDigest = payloadDigest,
SignatureCount = parts.SignatureCount,
VerifiedSignatures = verifiedSignatures,
PayloadType = parts.PayloadType
};
}
catch (JsonException ex)
{
return new ManifestVerificationResult
{
Success = false,
Error = $"Failed to parse envelope: {ex.Message}"
};
}
}
}