73 lines
2.5 KiB
C#
73 lines
2.5 KiB
C#
using System.Security.Cryptography;
|
||
using FsCheck;
|
||
using FsCheck.Xunit;
|
||
using HuangyanParking.Infrastructure.Services;
|
||
|
||
namespace HuangyanParking.Tests;
|
||
|
||
/// <summary>
|
||
/// 驿公里加解密和签名的属性测试
|
||
/// </summary>
|
||
public class YglCryptoPropertyTests
|
||
{
|
||
private readonly YglCrypto _crypto = new();
|
||
|
||
// DES密钥必须是8字节,Base64编码后用于测试
|
||
private static readonly string TestDesKey = Convert.ToBase64String(
|
||
[0x9B, 0xCE, 0x86, 0x3D, 0x92, 0x61, 0x0E, 0x62]); // "ns6GPZJhDmI="
|
||
|
||
// 生成RSA密钥对用于测试
|
||
private static readonly (string PrivateKey, string PublicKey) TestRsaKeys = GenerateRsaKeyPair();
|
||
|
||
private static (string PrivateKey, string PublicKey) GenerateRsaKeyPair()
|
||
{
|
||
using var rsa = RSA.Create(2048);
|
||
var privateKey = Convert.ToBase64String(rsa.ExportPkcs8PrivateKey());
|
||
var publicKey = Convert.ToBase64String(rsa.ExportSubjectPublicKeyInfo());
|
||
return (privateKey, publicKey);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Feature: huangyan-parking-points, Property 6: 驿公里数据加解密 Round-Trip
|
||
/// 对于任意有效JSON数据,DES加密后解密应得到原始数据
|
||
/// Validates: Requirements 15.4
|
||
/// </summary>
|
||
[Property(MaxTest = 100)]
|
||
public bool YglDesEncryptDecrypt_RoundTrip_ShouldReturnOriginalData(NonEmptyString input)
|
||
{
|
||
var plainText = input.Get;
|
||
|
||
var encrypted = _crypto.EncryptDes(plainText, TestDesKey);
|
||
var decrypted = _crypto.DecryptDes(encrypted, TestDesKey);
|
||
|
||
return decrypted == plainText;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Feature: huangyan-parking-points, Property 6(补充): RSA签名后验签应通过
|
||
/// Validates: Requirements 15.4
|
||
/// </summary>
|
||
[Property(MaxTest = 100)]
|
||
public bool YglRsaSignVerify_ShouldPass(NonEmptyString input)
|
||
{
|
||
var data = input.Get;
|
||
|
||
var signature = _crypto.SignRsa(data, TestRsaKeys.PrivateKey);
|
||
return _crypto.VerifyRsa(data, TestRsaKeys.PublicKey, signature);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Feature: huangyan-parking-points, Property 6(补充): 篡改数据后RSA验签应失败
|
||
/// Validates: Requirements 15.4
|
||
/// </summary>
|
||
[Property(MaxTest = 100)]
|
||
public bool YglRsaSignVerify_TamperedData_ShouldFail(NonEmptyString input)
|
||
{
|
||
var data = input.Get;
|
||
|
||
var signature = _crypto.SignRsa(data, TestRsaKeys.PrivateKey);
|
||
var tampered = data + "_tampered";
|
||
return !_crypto.VerifyRsa(tampered, TestRsaKeys.PublicKey, signature);
|
||
}
|
||
}
|