Skip to content

Commit 628d88b

Browse files
committed
refactor: Interface
1 parent 8f27338 commit 628d88b

File tree

14 files changed

+108
-129
lines changed

14 files changed

+108
-129
lines changed

src/CryptoBase.Abstractions/SymmetricCryptos/BlockCryptoBase.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,8 @@ public virtual void Decrypt(ReadOnlySpan<byte> source, Span<byte> destination)
2020

2121
public virtual void Reset() { }
2222

23-
public virtual void Dispose() { }
23+
public virtual void Dispose()
24+
{
25+
GC.SuppressFinalize(this);
26+
}
2427
}

src/CryptoBase.Abstractions/SymmetricCryptos/IAEADCrypto.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@ namespace CryptoBase.Abstractions.SymmetricCryptos;
22

33
public interface IAEADCrypto : ISymmetricCrypto
44
{
5-
void Encrypt(ReadOnlySpan<byte> nonce, ReadOnlySpan<byte> source,
6-
Span<byte> destination, Span<byte> tag, ReadOnlySpan<byte> associatedData = default);
5+
void Encrypt(ReadOnlySpan<byte> nonce, ReadOnlySpan<byte> source, Span<byte> destination, Span<byte> tag, ReadOnlySpan<byte> associatedData = default);
76

8-
void Decrypt(ReadOnlySpan<byte> nonce, ReadOnlySpan<byte> source, ReadOnlySpan<byte> tag,
9-
Span<byte> destination, ReadOnlySpan<byte> associatedData = default);
7+
void Decrypt(ReadOnlySpan<byte> nonce, ReadOnlySpan<byte> source, ReadOnlySpan<byte> tag, Span<byte> destination, ReadOnlySpan<byte> associatedData = default);
108
}

src/CryptoBase.Abstractions/SymmetricCryptos/IBlockCryptoMode.cs

Lines changed: 0 additions & 8 deletions
This file was deleted.

src/CryptoBase.Abstractions/SymmetricCryptos/IStreamBlockCryptoMode.cs

Lines changed: 0 additions & 3 deletions
This file was deleted.

src/CryptoBase/SymmetricCryptos/BlockCryptoModes/BlockCryptoModeCreate.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@ namespace CryptoBase.SymmetricCryptos.BlockCryptoModes;
55

66
public static class BlockCryptoModeCreate
77
{
8-
public static IStreamBlockCryptoMode Ctr(IBlockCrypto crypto, ReadOnlySpan<byte> iv)
8+
public static IStreamCrypto Ctr(IBlockCrypto crypto, ReadOnlySpan<byte> iv)
99
{
1010
if (Sse2.IsSupported && Ssse3.IsSupported && Sse41.IsSupported)
1111
{
1212
return new CTR128StreamModeX86(crypto, iv);
1313
}
14+
1415
return new CTR128StreamMode(crypto, iv);
1516
}
1617
}

src/CryptoBase/SymmetricCryptos/BlockCryptoModes/CBCBlockMode.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,24 @@
22

33
namespace CryptoBase.SymmetricCryptos.BlockCryptoModes;
44

5-
public sealed class CBCBlockMode : BlockCryptoBase, IBlockCryptoMode
5+
public sealed class CBCBlockMode : BlockCryptoBase
66
{
7-
public override string Name => InternalBlockCrypto.Name + @"-CBC";
7+
public override string Name => _internalBlockCrypto.Name + @"-CBC";
88

9-
public override int BlockSize => InternalBlockCrypto.BlockSize;
9+
public override int BlockSize => _internalBlockCrypto.BlockSize;
1010

11-
public IBlockCrypto InternalBlockCrypto { get; init; }
11+
private readonly IBlockCrypto _internalBlockCrypto;
1212

13-
public ReadOnlyMemory<byte> Iv { get; init; }
13+
private readonly ReadOnlyMemory<byte> _iv;
1414

1515
private readonly byte[] _block;
1616

1717
public CBCBlockMode(IBlockCrypto crypto, ReadOnlySpan<byte> iv)
1818
{
1919
ArgumentOutOfRangeException.ThrowIfNotEqual(iv.Length, crypto.BlockSize, nameof(iv));
2020

21-
InternalBlockCrypto = crypto;
22-
Iv = iv.ToArray();
21+
_internalBlockCrypto = crypto;
22+
_iv = iv.ToArray();
2323

2424
_block = ArrayPool<byte>.Shared.Rent(BlockSize);
2525

@@ -32,7 +32,7 @@ public override void Encrypt(ReadOnlySpan<byte> source, Span<byte> destination)
3232

3333
FastUtils.Xor(_block, source, destination, BlockSize);
3434

35-
InternalBlockCrypto.Encrypt(destination, destination);
35+
_internalBlockCrypto.Encrypt(destination, destination);
3636

3737
destination.Slice(0, BlockSize).CopyTo(_block);
3838
}
@@ -41,7 +41,7 @@ public override void Decrypt(ReadOnlySpan<byte> source, Span<byte> destination)
4141
{
4242
base.Decrypt(source, destination);
4343

44-
InternalBlockCrypto.Decrypt(source, destination);
44+
_internalBlockCrypto.Decrypt(source, destination);
4545

4646
FastUtils.Xor(destination, _block, BlockSize);
4747

@@ -51,16 +51,16 @@ public override void Decrypt(ReadOnlySpan<byte> source, Span<byte> destination)
5151
public override void Reset()
5252
{
5353
base.Reset();
54-
InternalBlockCrypto.Reset();
54+
_internalBlockCrypto.Reset();
5555

56-
Iv.Span.CopyTo(_block);
56+
_iv.Span.CopyTo(_block);
5757
}
5858

5959
public override void Dispose()
6060
{
6161
base.Dispose();
6262

63-
InternalBlockCrypto.Dispose();
63+
_internalBlockCrypto.Dispose();
6464

6565
ArrayPool<byte>.Shared.Return(_block);
6666
}

src/CryptoBase/SymmetricCryptos/BlockCryptoModes/CFB128StreamMode.cs

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22

33
namespace CryptoBase.SymmetricCryptos.BlockCryptoModes;
44

5-
public class CFB128StreamMode : IStreamBlockCryptoMode
5+
public class CFB128StreamMode : IStreamCrypto
66
{
7-
public string Name => InternalBlockCrypto.Name + @"-CFB";
7+
public string Name => _internalBlockCrypto.Name + @"-CFB";
88

9-
public IBlockCrypto InternalBlockCrypto { get; init; }
9+
private readonly IBlockCrypto _internalBlockCrypto;
1010

11-
public ReadOnlyMemory<byte> Iv { get; init; }
11+
private readonly ReadOnlyMemory<byte> _iv;
1212

1313
private readonly bool _isEncrypt;
1414

@@ -21,13 +21,12 @@ public class CFB128StreamMode : IStreamBlockCryptoMode
2121

2222
public CFB128StreamMode(bool isEncrypt, IBlockCrypto crypto, ReadOnlySpan<byte> iv)
2323
{
24-
ArgumentOutOfRangeException.ThrowIfNotEqual(crypto.BlockSize, 16, nameof(crypto));
25-
26-
ArgumentOutOfRangeException.ThrowIfNotEqual(iv.Length, 16, nameof(iv));
24+
ArgumentOutOfRangeException.ThrowIfNotEqual(crypto.BlockSize, BlockSize, nameof(crypto));
25+
ArgumentOutOfRangeException.ThrowIfNotEqual(iv.Length, BlockSize, nameof(iv));
2726

2827
_isEncrypt = isEncrypt;
29-
InternalBlockCrypto = crypto;
30-
Iv = iv.ToArray();
28+
_internalBlockCrypto = crypto;
29+
_iv = iv.ToArray();
3130

3231
_block = ArrayPool<byte>.Shared.Rent(BlockSize);
3332
_keyStream = ArrayPool<byte>.Shared.Rent(BlockSize);
@@ -65,7 +64,7 @@ public void Update(ReadOnlySpan<byte> source, Span<byte> destination)
6564

6665
while (length >= BlockSize)
6766
{
68-
InternalBlockCrypto.Encrypt(block, stream);
67+
_internalBlockCrypto.Encrypt(block, stream);
6968

7069
FastUtils.Xor16(stream, source.Slice(i, BlockSize), destination.Slice(i, BlockSize));
7170
(_isEncrypt ? destination : source).Slice(i, BlockSize).CopyTo(block);
@@ -75,22 +74,22 @@ public void Update(ReadOnlySpan<byte> source, Span<byte> destination)
7574
}
7675

7776
_index = length;
78-
InternalBlockCrypto.Encrypt(block, stream);
77+
_internalBlockCrypto.Encrypt(block, stream);
7978
FastUtils.Xor(stream.Slice(0, length), source.Slice(i, length), destination.Slice(i, length), length);
8079
(_isEncrypt ? destination : source).Slice(i, length).CopyTo(block);
8180
}
8281

8382
public void Reset()
8483
{
85-
InternalBlockCrypto.Reset();
84+
_internalBlockCrypto.Reset();
8685
_index = 0;
8786

88-
Iv.CopyTo(_block);
87+
_iv.CopyTo(_block);
8988
}
9089

9190
public void Dispose()
9291
{
93-
InternalBlockCrypto.Dispose();
92+
_internalBlockCrypto.Dispose();
9493

9594
ArrayPool<byte>.Shared.Return(_block);
9695
ArrayPool<byte>.Shared.Return(_keyStream);

src/CryptoBase/SymmetricCryptos/BlockCryptoModes/CTR/CTR128StreamMode.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22

33
namespace CryptoBase.SymmetricCryptos.BlockCryptoModes.CTR;
44

5-
public class CTR128StreamMode : IStreamBlockCryptoMode
5+
public class CTR128StreamMode : IStreamCrypto
66
{
7-
public string Name => InternalBlockCrypto.Name + @"-CTR";
7+
public string Name => _internalBlockCrypto.Name + @"-CTR";
88

9-
public IBlockCrypto InternalBlockCrypto { get; init; }
9+
private readonly IBlockCrypto _internalBlockCrypto;
1010

11-
public ReadOnlyMemory<byte> Iv { get; init; }
11+
private readonly ReadOnlyMemory<byte> _iv;
1212

1313
private readonly byte[] _counter;
1414
private readonly byte[] _keyStream;
@@ -22,8 +22,8 @@ public CTR128StreamMode(IBlockCrypto crypto, ReadOnlySpan<byte> iv)
2222
ArgumentOutOfRangeException.ThrowIfNotEqual(crypto.BlockSize, BlockSize);
2323
ArgumentOutOfRangeException.ThrowIfGreaterThan(iv.Length, BlockSize, nameof(iv));
2424

25-
InternalBlockCrypto = crypto;
26-
Iv = iv.ToArray();
25+
_internalBlockCrypto = crypto;
26+
_iv = iv.ToArray();
2727

2828
_counter = ArrayPool<byte>.Shared.Rent(BlockSize);
2929
_keyStream = ArrayPool<byte>.Shared.Rent(BlockSize);
@@ -44,7 +44,7 @@ private void UpdateCore(ReadOnlySpan<byte> source, Span<byte> destination)
4444
int i = 0;
4545
int left = source.Length;
4646

47-
IBlockCrypto crypto = InternalBlockCrypto;
47+
IBlockCrypto crypto = _internalBlockCrypto;
4848
Span<byte> counter = _counter.AsSpan(0, BlockSize);
4949
Span<byte> stream = _keyStream.AsSpan(0, BlockSize);
5050

@@ -86,17 +86,17 @@ private void UpdateCore(ReadOnlySpan<byte> source, Span<byte> destination)
8686

8787
public void Reset()
8888
{
89-
InternalBlockCrypto.Reset();
89+
_internalBlockCrypto.Reset();
9090
_index = 0;
9191

9292
Span<byte> c = _counter.AsSpan(0, BlockSize);
9393
c.Clear();
94-
Iv.Span.CopyTo(c);
94+
_iv.Span.CopyTo(c);
9595
}
9696

9797
public void Dispose()
9898
{
99-
InternalBlockCrypto.Dispose();
99+
_internalBlockCrypto.Dispose();
100100

101101
ArrayPool<byte>.Shared.Return(_counter);
102102
ArrayPool<byte>.Shared.Return(_keyStream);

src/CryptoBase/SymmetricCryptos/BlockCryptoModes/CTR/CTR128StreamModeBlock16X86.cs

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,11 @@
22

33
namespace CryptoBase.SymmetricCryptos.BlockCryptoModes.CTR;
44

5-
public class CTR128StreamModeBlock16X86 : IStreamBlockCryptoMode
5+
public class CTR128StreamModeBlock16X86 : IStreamCrypto
66
{
7-
public string Name => InternalBlockCrypto.Name + @"-CTR";
7+
public string Name => _internalBlockCrypto.Name + @"-CTR";
88

9-
public IBlockCrypto InternalBlockCrypto { get; init; }
10-
11-
public ReadOnlyMemory<byte> Iv { get; init; }
9+
private readonly IBlockCrypto _internalBlockCrypto;
1210

1311
private readonly byte[] _counter;
1412
private readonly byte[] _keyStream;
@@ -29,18 +27,17 @@ public class CTR128StreamModeBlock16X86 : IStreamBlockCryptoMode
2927

3028
public unsafe CTR128StreamModeBlock16X86(IBlockCrypto crypto, ReadOnlySpan<byte> iv)
3129
{
32-
InternalBlockCrypto = crypto;
33-
Iv = iv.ToArray();
34-
35-
ArgumentOutOfRangeException.ThrowIfNotEqual(InternalBlockCrypto.BlockSize, BlockSize16);
30+
ArgumentOutOfRangeException.ThrowIfNotEqual(crypto.BlockSize, BlockSize16);
31+
ArgumentOutOfRangeException.ThrowIfGreaterThan(iv.Length, BlockSize, nameof(iv));
3632

37-
ArgumentOutOfRangeException.ThrowIfGreaterThan(Iv.Length, BlockSize, nameof(iv));
33+
_internalBlockCrypto = crypto;
3834

3935
_counter = ArrayPool<byte>.Shared.Rent(BlockSize16);
4036
_keyStream = ArrayPool<byte>.Shared.Rent(BlockSize16);
4137

4238
Span<byte> c = stackalloc byte[BlockSize];
4339
iv.CopyTo(c);
40+
4441
fixed (byte* p = c)
4542
{
4643
_iCounter = Avx2.BroadcastVector128ToVector256(p).ReverseEndianness128().IncUpper128Le();
@@ -54,6 +51,7 @@ public unsafe void Update(ReadOnlySpan<byte> source, Span<byte> destination)
5451
ArgumentOutOfRangeException.ThrowIfLessThan(destination.Length, source.Length, nameof(destination));
5552

5653
int length = source.Length;
54+
5755
fixed (byte* pStream = _keyStream)
5856
fixed (byte* pSource = source)
5957
fixed (byte* pDestination = destination)
@@ -105,7 +103,7 @@ private unsafe void UpdateKeyStream()
105103
Avx.Store(p + 7 * 2 * BlockSize, _counterV7.ReverseEndianness128());
106104
}
107105

108-
InternalBlockCrypto.Encrypt(c, _keyStream);
106+
_internalBlockCrypto.Encrypt(c, _keyStream);
109107

110108
_counterV0 = _counterV7.AddTwo128Le();
111109
_counterV1 = _counterV0.AddTwo128Le();
@@ -119,7 +117,7 @@ private unsafe void UpdateKeyStream()
119117

120118
public void Reset()
121119
{
122-
InternalBlockCrypto.Reset();
120+
_internalBlockCrypto.Reset();
123121
_index = 0;
124122
_counterV0 = _iCounter;
125123
_counterV1 = _counterV0.AddTwo128Le();
@@ -133,7 +131,7 @@ public void Reset()
133131

134132
public void Dispose()
135133
{
136-
InternalBlockCrypto.Dispose();
134+
_internalBlockCrypto.Dispose();
137135

138136
ArrayPool<byte>.Shared.Return(_counter);
139137
ArrayPool<byte>.Shared.Return(_keyStream);

0 commit comments

Comments
 (0)