using FsCheck; using FsCheck.Xunit; using HuangyanParking.Infrastructure.Services; namespace HuangyanParking.Tests; /// /// 特来电加解密和签名的属性测试 /// public class TldCryptoPropertyTests { private readonly TldCrypto _crypto = new(); // 固定16位密钥和IV用于测试 private const string TestDataSecret = "1234567890abcdef"; private const string TestDataSecretIV = "abcdef1234567890"; private const string TestSigSecret = "1234567890abcdef"; private const string TestOperatorId = "123456789"; /// /// Feature: huangyan-parking-points, Property 4: 特来电数据加解密 Round-Trip /// 对于任意有效JSON数据,AES-128-CBC加密后解密应得到原始数据 /// Validates: Requirements 14.2, 14.4 /// [Property(MaxTest = 100)] public bool TldEncryptDecrypt_RoundTrip_ShouldReturnOriginalData(NonEmptyString input) { var plainText = input.Get; var encrypted = _crypto.Encrypt(plainText, TestDataSecret, TestDataSecretIV); var decrypted = _crypto.Decrypt(encrypted, TestDataSecret, TestDataSecretIV); return decrypted == plainText; } /// /// Feature: huangyan-parking-points, Property 5: 特来电签名验签一致性 /// 对于任意消息数据,HMAC-MD5签名后验签应通过;篡改数据后验签应失败 /// Validates: Requirements 14.5 /// [Property(MaxTest = 100)] public bool TldSign_ShouldVerifySuccessfully(NonEmptyString data) { var timestamp = "20240101120000"; var seq = "0001"; var sig = _crypto.Sign(TestOperatorId, data.Get, timestamp, seq, TestSigSecret); return _crypto.Verify(TestOperatorId, data.Get, timestamp, seq, sig, TestSigSecret); } /// /// Feature: huangyan-parking-points, Property 5(补充): 篡改数据后验签应失败 /// Validates: Requirements 14.5 /// [Property(MaxTest = 100)] public bool TldSign_TamperedData_ShouldFailVerification(NonEmptyString data) { var timestamp = "20240101120000"; var seq = "0001"; var sig = _crypto.Sign(TestOperatorId, data.Get, timestamp, seq, TestSigSecret); // 篡改数据 var tampered = data.Get + "_tampered"; return !_crypto.Verify(TestOperatorId, tampered, timestamp, seq, sig, TestSigSecret); } }