mirror of
https://github.com/sshnet/SSH.NET.git
synced 2026-09-10 09:15:47 +00:00
8ed8d38fa8
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).
75 lines
1.9 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|