Premiere commit - Omika
This commit is contained in:
@@ -0,0 +1,85 @@
|
||||
using Omika.Diagnostics.Security;
|
||||
|
||||
namespace Omika.Diagnostics.Tests;
|
||||
|
||||
/// <summary>Tests de la génération/hachage de la clé d'accès serveur client (T19, §27-§32).</summary>
|
||||
public class DiagnosticApiKeyGeneratorTests
|
||||
{
|
||||
[Fact]
|
||||
public void GenerateKey_HasPrefix_AndDecodesTo32Bytes()
|
||||
{
|
||||
string key = DiagnosticApiKeyGenerator.GenerateKey();
|
||||
|
||||
Assert.StartsWith(DiagnosticApiKeyGenerator.KeyPrefix, key);
|
||||
string base64Url = key[DiagnosticApiKeyGenerator.KeyPrefix.Length..];
|
||||
byte[] bytes = DecodeBase64Url(base64Url);
|
||||
Assert.Equal(DiagnosticApiKeyGenerator.KeyBytes, bytes.Length);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GenerateKey_ProducesUniqueKeys()
|
||||
{
|
||||
HashSet<string> keys = Enumerable.Range(0, 100).Select(_ => DiagnosticApiKeyGenerator.GenerateKey()).ToHashSet();
|
||||
Assert.Equal(100, keys.Count);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Hash_IsDeterministic_And64HexChars()
|
||||
{
|
||||
string hash1 = DiagnosticApiKeyGenerator.Hash("omkdiag_test");
|
||||
string hash2 = DiagnosticApiKeyGenerator.Hash("omkdiag_test");
|
||||
|
||||
Assert.Equal(hash1, hash2);
|
||||
Assert.Equal(64, hash1.Length);
|
||||
Assert.Matches("^[0-9A-F]{64}$", hash1);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Verify_ReturnsTrue_ForMatchingKey()
|
||||
{
|
||||
string key = DiagnosticApiKeyGenerator.GenerateKey();
|
||||
string hash = DiagnosticApiKeyGenerator.Hash(key);
|
||||
|
||||
Assert.True(DiagnosticApiKeyGenerator.Verify(key, hash));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Verify_ReturnsFalse_ForWrongKey()
|
||||
{
|
||||
string hash = DiagnosticApiKeyGenerator.Hash("omkdiag_real_key");
|
||||
Assert.False(DiagnosticApiKeyGenerator.Verify("omkdiag_other_key", hash));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Verify_ReturnsFalse_ForMalformedHash()
|
||||
{
|
||||
Assert.False(DiagnosticApiKeyGenerator.Verify("omkdiag_x", "not-a-hex-hash"));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Verify_ReturnsFalse_ForEmptyInputs()
|
||||
{
|
||||
Assert.False(DiagnosticApiKeyGenerator.Verify("", "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"));
|
||||
Assert.False(DiagnosticApiKeyGenerator.Verify("omkdiag_x", ""));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DisplayPrefix_ReturnsFirst8Chars()
|
||||
{
|
||||
string prefix = DiagnosticApiKeyGenerator.DisplayPrefix("omkdiag_abcdefgh", 8);
|
||||
Assert.Equal("omkdiag_", prefix);
|
||||
Assert.Equal(8, prefix.Length);
|
||||
}
|
||||
|
||||
private static byte[] DecodeBase64Url(string value)
|
||||
{
|
||||
string base64 = value.Replace('-', '+').Replace('_', '/');
|
||||
switch (base64.Length % 4)
|
||||
{
|
||||
case 2: base64 += "=="; break;
|
||||
case 3: base64 += "="; break;
|
||||
}
|
||||
|
||||
return Convert.FromBase64String(base64);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user