Some checks failed
Docs CI / lint-and-preview (push) Has been cancelled
Notify Smoke Test / Notifier Service Tests (push) Has been cancelled
Notify Smoke Test / Notification Smoke Test (push) Has been cancelled
Notify Smoke Test / Notify Unit Tests (push) Has been cancelled
AOC Guard CI / aoc-guard (push) Has been cancelled
AOC Guard CI / aoc-verify (push) Has been cancelled
Export Center CI / export-ci (push) Has been cancelled
Manifest Integrity / Validate Schema Integrity (push) Has been cancelled
Manifest Integrity / Validate Contract Documents (push) Has been cancelled
Manifest Integrity / Validate Pack Fixtures (push) Has been cancelled
Manifest Integrity / Audit SHA256SUMS Files (push) Has been cancelled
Manifest Integrity / Verify Merkle Roots (push) Has been cancelled
Policy Lint & Smoke / policy-lint (push) Has been cancelled
Risk Bundle CI / risk-bundle-build (push) Has been cancelled
Scanner Analyzers / Discover Analyzers (push) Has been cancelled
Scanner Analyzers / Validate Test Fixtures (push) Has been cancelled
Risk Bundle CI / risk-bundle-offline-kit (push) Has been cancelled
Risk Bundle CI / publish-checksums (push) Has been cancelled
Scanner Analyzers / Build Analyzers (push) Has been cancelled
Scanner Analyzers / Test Language Analyzers (push) Has been cancelled
Scanner Analyzers / Verify Deterministic Output (push) Has been cancelled
devportal-offline / build-offline (push) Has been cancelled
Mirror Thin Bundle Sign & Verify / mirror-sign (push) Has been cancelled
86 lines
3.1 KiB
C#
86 lines
3.1 KiB
C#
using System.Net.Http.Json;
|
|
using System.Text.Json.Serialization;
|
|
|
|
var baseUrl = Environment.GetEnvironmentVariable("STELLAOPS_CRYPTO_SIM_URL") ?? "http://localhost:8080";
|
|
var algList = Environment.GetEnvironmentVariable("SIM_ALGORITHMS")?
|
|
.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)
|
|
: new[] { "SM2", "pq.sim", "ES256" };
|
|
|
|
using var client = new HttpClient { BaseAddress = new Uri(baseUrl) };
|
|
|
|
static async Task<(bool Ok, string Error)> SignAndVerify(HttpClient client, string algorithm, string message, CancellationToken ct)
|
|
{
|
|
var signPayload = new SignRequest(message, algorithm);
|
|
var signResponse = await client.PostAsJsonAsync("/sign", signPayload, ct).ConfigureAwait(false);
|
|
if (!signResponse.IsSuccessStatusCode)
|
|
{
|
|
return (false, $"sign failed: {(int)signResponse.StatusCode} {signResponse.ReasonPhrase}");
|
|
}
|
|
|
|
var signResult = await signResponse.Content.ReadFromJsonAsync<SignResponse>(cancellationToken: ct).ConfigureAwait(false);
|
|
if (signResult is null || string.IsNullOrWhiteSpace(signResult.SignatureBase64))
|
|
{
|
|
return (false, "sign returned empty payload");
|
|
}
|
|
|
|
var verifyPayload = new VerifyRequest(message, signResult.SignatureBase64, algorithm);
|
|
var verifyResponse = await client.PostAsJsonAsync("/verify", verifyPayload, ct).ConfigureAwait(false);
|
|
if (!verifyResponse.IsSuccessStatusCode)
|
|
{
|
|
return (false, $"verify failed: {(int)verifyResponse.StatusCode} {verifyResponse.ReasonPhrase}");
|
|
}
|
|
|
|
var verifyResult = await verifyResponse.Content.ReadFromJsonAsync<VerifyResponse>(cancellationToken: ct).ConfigureAwait(false);
|
|
if (verifyResult?.Ok is not true)
|
|
{
|
|
return (false, "verify returned false");
|
|
}
|
|
|
|
return (true, "");
|
|
}
|
|
|
|
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(20));
|
|
var failures = new List<string>();
|
|
|
|
foreach (var alg in algList)
|
|
{
|
|
var (ok, error) = await SignAndVerify(client, alg, "stellaops-sim-smoke", cts.Token);
|
|
if (!ok)
|
|
{
|
|
failures.Add($"{alg}: {error}");
|
|
continue;
|
|
}
|
|
|
|
Console.WriteLine($"[ok] {alg} via {baseUrl}");
|
|
}
|
|
|
|
if (failures.Count > 0)
|
|
{
|
|
Console.Error.WriteLine("Simulation smoke failed:");
|
|
foreach (var f in failures)
|
|
{
|
|
Console.Error.WriteLine($" - {f}");
|
|
}
|
|
|
|
Environment.Exit(1);
|
|
}
|
|
|
|
Console.WriteLine("Simulation smoke passed.");
|
|
|
|
internal sealed record SignRequest(
|
|
[property: JsonPropertyName("message")] string Message,
|
|
[property: JsonPropertyName("algorithm")] string Algorithm);
|
|
|
|
internal sealed record SignResponse(
|
|
[property: JsonPropertyName("signature_b64")] string SignatureBase64,
|
|
[property: JsonPropertyName("algorithm")] string Algorithm);
|
|
|
|
internal sealed record VerifyRequest(
|
|
[property: JsonPropertyName("message")] string Message,
|
|
[property: JsonPropertyName("signature_b64")] string SignatureBase64,
|
|
[property: JsonPropertyName("algorithm")] string Algorithm);
|
|
|
|
internal sealed record VerifyResponse(
|
|
[property: JsonPropertyName("ok")] bool Ok,
|
|
[property: JsonPropertyName("algorithm")] string Algorithm);
|