解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
大石头 authored at 2018-05-15 21:21:05
3.14 KiB
X
using System.Security.Cryptography;
using NewLife.Security;
using Xunit;

namespace XUnitTest.Security;

/// <summary>Zero填充转换测试</summary>
public class ZerosPaddingTransformTests
{
    [Fact(DisplayName = "属性传递自内部Transform")]
    public void PropertiesDelegateToInner()
    {
        using var aes = Aes.Create();
        aes.Mode = CipherMode.ECB;
        aes.Padding = PaddingMode.None;
        using var inner = aes.CreateEncryptor();
        using var zeros = new ZerosPaddingTransform(inner, true);

        Assert.Equal(inner.InputBlockSize, zeros.InputBlockSize);
        Assert.Equal(inner.OutputBlockSize, zeros.OutputBlockSize);
        Assert.Equal(inner.CanReuseTransform, zeros.CanReuseTransform);
        Assert.Equal(inner.CanTransformMultipleBlocks, zeros.CanTransformMultipleBlocks);
    }

    [Fact(DisplayName = "TransformFinalBlock空数据返回空")]
    public void TransformFinalBlockEmptyReturnsEmpty()
    {
        using var aes = Aes.Create();
        aes.Mode = CipherMode.ECB;
        aes.Padding = PaddingMode.None;
        using var inner = aes.CreateEncryptor();
        using var zeros = new ZerosPaddingTransform(inner, true);

        var result = zeros.TransformFinalBlock([], 0, 0);
        Assert.Empty(result);
    }

    [Fact(DisplayName = "加密时自动补零到块边界")]
    public void EncryptPadsToBlockBoundary()
    {
        using var aes = Aes.Create();
        aes.Mode = CipherMode.ECB;
        aes.Padding = PaddingMode.None;
        using var inner = aes.CreateEncryptor();
        using var zeros = new ZerosPaddingTransform(inner, true);

        // 输入10字节,不足16字节块大小,应该补零到16字节
        var input = new Byte[10];
        new Random(42).NextBytes(input);
        var result = zeros.TransformFinalBlock(input, 0, input.Length);

        Assert.Equal(16, result.Length); // 应该是一个完整块
    }

    [Fact(DisplayName = "对齐数据不额外填充")]
    public void AlignedDataNoExtraPadding()
    {
        using var aes = Aes.Create();
        aes.Mode = CipherMode.ECB;
        aes.Padding = PaddingMode.None;
        using var inner = aes.CreateEncryptor();
        using var zeros = new ZerosPaddingTransform(inner, true);

        // 输入16字节,刚好一个块
        var input = new Byte[16];
        new Random(42).NextBytes(input);
        var result = zeros.TransformFinalBlock(input, 0, input.Length);

        Assert.Equal(16, result.Length);
    }

    [Fact(DisplayName = "加密解密往返")]
    public void EncryptDecryptRoundTrip()
    {
        using var aes = Aes.Create();
        aes.Mode = CipherMode.ECB;
        aes.Padding = PaddingMode.None;

        // 对齐数据
        var input = new Byte[32];
        new Random(42).NextBytes(input);

        using var encTransform = new ZerosPaddingTransform(aes.CreateEncryptor(), true);
        var encrypted = encTransform.TransformFinalBlock(input, 0, input.Length);

        using var decTransform = new ZerosPaddingTransform(aes.CreateDecryptor(), false);
        var decrypted = decTransform.TransformFinalBlock(encrypted, 0, encrypted.Length);

        Assert.Equal(input, decrypted);
    }
}