FFXIVLauncher-Netmaui
72 строки · 2.1 Кб
1// NOTE: This file is copy-pasted almost *as-is* from the previous work `Aither.Crypto`
2// hence currently it does not follow XL's naming convetions.
3//
4// It's totally okay to change this. But for now, this is what it is atm.
5// ReSharper disable InconsistentNaming
6
7using System;
8
9namespace XIVLauncher.Common.Encryption.BlockCipher
10{
11public sealed class Ecb<T> : IBlockMode where T : IBlockCipher
12{
13private T m_cipher;
14
15public Ecb(T cipher)
16{
17m_cipher = cipher;
18}
19
20private void AssertSliceLength(ReadOnlySpan<byte> input, ReadOnlySpan<byte> output)
21{
22if (input.Length > output.Length)
23{
24throw new ArgumentException("The output slice must be larger than the input.", nameof(output));
25}
26
27var blockSize = m_cipher.BlockSize;
28
29if (input.Length % blockSize != 0)
30{
31throw new ArgumentException("The length of the input slice must be divisible by the block length.",
32nameof(input));
33}
34}
35
36public void Encrypt(ReadOnlySpan<byte> input, Span<byte> output)
37{
38AssertSliceLength(input, output);
39
40unsafe
41{
42fixed (byte* pInput = input)
43fixed (byte* pOutput = output)
44{
45for (var i = 0; i < input.Length; i += m_cipher.BlockSize)
46{
47m_cipher.EncryptBlockUnsafe(pInput + i, pOutput + i);
48}
49}
50}
51}
52
53public void Decrypt(ReadOnlySpan<byte> input, Span<byte> output)
54{
55AssertSliceLength(input, output);
56
57unsafe
58{
59fixed (byte* pInput = input)
60fixed (byte* pOutput = output)
61{
62for (var i = 0; i < input.Length; i += m_cipher.BlockSize)
63{
64m_cipher.DecryptBlockUnsafe(pInput + i, pOutput + i);
65}
66}
67}
68}
69}
70}
71
72// ReSharper restore InconsistentNaming
73