Files
Rob Hague 8ed8d38fa8 Encrypt packets in-place (#1787)
Support in-place encryption in the cipher types, then use it on the plaintext packets
instead of allocating a new array each time. Removes 2 of 4 bytes allocated for each
byte uploaded over SFTP.

For AES-CTR, supporting in-place encryption in this case means adding a persistent buffer
for the keystream and encrypting in chunks. The performance difference is ~1-2% i.e.
marginal versus one-shotting it. The variance is similar also for different choices of
buffer size (here 4096 is used).
2026-05-05 12:57:13 +02:00

75 lines
1.9 KiB
C#

using BenchmarkDotNet.Attributes;
using Renci.SshNet.Security.Cryptography.Ciphers;
namespace Renci.SshNet.Benchmarks.Security.Cryptography.Ciphers
{
[MemoryDiagnoser]
public class AesCipherBenchmarks
{
private readonly byte[] _key;
private readonly byte[] _iv;
private readonly byte[] _data;
public AesCipherBenchmarks()
{
_key = new byte[32];
_iv = new byte[16];
_data = new byte[32 * 1024];
Random random = new(Seed: 12345);
random.NextBytes(_key);
random.NextBytes(_iv);
random.NextBytes(_data);
}
[Benchmark]
public byte[] Encrypt_CBC()
{
return new AesCipher(_key, _iv, AesCipherMode.CBC, false).Encrypt(_data);
}
[Benchmark]
public byte[] Decrypt_CBC()
{
return new AesCipher(_key, _iv, AesCipherMode.CBC, false).Decrypt(_data);
}
[Benchmark]
public byte[] Encrypt_CFB()
{
return new AesCipher(_key, _iv, AesCipherMode.CFB, false).Encrypt(_data);
}
[Benchmark]
public byte[] Decrypt_CFB()
{
return new AesCipher(_key, _iv, AesCipherMode.CFB, false).Decrypt(_data);
}
[Benchmark]
public byte[] Encrypt_CTR()
{
return new AesCipher(_key, _iv, AesCipherMode.CTR, false).Encrypt(_data);
}
[Benchmark]
public byte[] Decrypt_CTR()
{
return new AesCipher(_key, _iv, AesCipherMode.CTR, false).Decrypt(_data);
}
[Benchmark]
public byte[] Encrypt_ECB()
{
return new AesCipher(_key, [], AesCipherMode.ECB, false).Encrypt(_data);
}
[Benchmark]
public byte[] Decrypt_ECB()
{
return new AesCipher(_key, [], AesCipherMode.ECB, false).Decrypt(_data);
}
}
}