Files
scadaproj/ZB.MOM.WW.Secrets/tests/ZB.MOM.WW.Secrets.Tests/Cli/Interactive/LiteralMasterKeyProviderTests.cs
T
Joseph Doherty 1b65e820fb test(secrets): serialize env-var-mutating test classes into one xunit collection
Environment.SetEnvironmentVariable/GetEnvironmentVariable mutate the
process-wide environ; concurrent setenv/getenv across parallel xunit test
classes is a documented crash/flake source on glibc even with unique
variable names. Group the six classes that touch process env vars into a
DisableParallelization=true collection so they run serially against each
other while everything else keeps running in parallel.
2026-07-19 10:27:09 -04:00

76 lines
2.3 KiB
C#

using System.Security.Cryptography;
using ZB.MOM.WW.Secrets.Abstractions;
using ZB.MOM.WW.Secrets.Cli.Interactive;
using ZB.MOM.WW.Secrets.MasterKey;
namespace ZB.MOM.WW.Secrets.Tests.Cli.Interactive;
/// <summary>
/// Pins <see cref="LiteralMasterKeyProvider"/> — the operator-pasted-key provider used to recover a
/// locked-out session — to the family's key contract: 32-byte enforcement and, critically, a
/// <see cref="IMasterKeyProvider.KekId"/> derived identically to the configured providers so a key
/// entered by hand can decrypt (and re-wrap) rows another provider kind sealed.
/// </summary>
[Collection("Process environment")]
public sealed class LiteralMasterKeyProviderTests
{
private static string NewKeyBase64()
{
byte[] key = new byte[32];
RandomNumberGenerator.Fill(key);
return Convert.ToBase64String(key);
}
[Fact]
public void Accepts_base64_32_byte_key()
{
string b64 = NewKeyBase64();
var sut = new LiteralMasterKeyProvider(b64);
Assert.Equal(32, sut.GetMasterKey().Length);
Assert.StartsWith("sha256:", sut.KekId);
}
[Fact]
public void Rejects_wrong_length()
{
string sixteenBytes = Convert.ToBase64String(new byte[16]);
Assert.Throws<ArgumentException>(() => new LiteralMasterKeyProvider(sixteenBytes));
}
[Fact]
public void Derives_same_kekid_as_environment_provider_for_same_material()
{
byte[] key = new byte[32];
RandomNumberGenerator.Fill(key);
string b64 = Convert.ToBase64String(key);
string envVar = $"ZB_TEST_KEK_{Guid.NewGuid():N}";
Environment.SetEnvironmentVariable(envVar, b64);
try
{
IMasterKeyProvider environment = MasterKeyProviderFactory.Create(new MasterKeyOptions
{
Source = MasterKeySource.Environment,
EnvVarName = envVar,
});
var literal = new LiteralMasterKeyProvider(b64);
Assert.Equal(environment.KekId, literal.KekId);
}
finally
{
Environment.SetEnvironmentVariable(envVar, null);
}
}
[Fact]
public void Explicit_kekid_wins()
{
var sut = new LiteralMasterKeyProvider(NewKeyBase64(), "kek:operator-override");
Assert.Equal("kek:operator-override", sut.KekId);
}
}