FFXIVLauncher-Netmaui

Форк
0
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

7
using System;
8

9
namespace XIVLauncher.Common.Encryption.BlockCipher
10
{
11
    public sealed class Ecb<T> : IBlockMode where T : IBlockCipher
12
    {
13
        private T m_cipher;
14

15
        public Ecb(T cipher)
16
        {
17
            m_cipher = cipher;
18
        }
19

20
        private void AssertSliceLength(ReadOnlySpan<byte> input, ReadOnlySpan<byte> output)
21
        {
22
            if (input.Length > output.Length)
23
            {
24
                throw new ArgumentException("The output slice must be larger than the input.", nameof(output));
25
            }
26

27
            var blockSize = m_cipher.BlockSize;
28

29
            if (input.Length % blockSize != 0)
30
            {
31
                throw new ArgumentException("The length of the input slice must be divisible by the block length.",
32
                    nameof(input));
33
            }
34
        }
35

36
        public void Encrypt(ReadOnlySpan<byte> input, Span<byte> output)
37
        {
38
            AssertSliceLength(input, output);
39

40
            unsafe
41
            {
42
                fixed (byte* pInput = input)
43
                fixed (byte* pOutput = output)
44
                {
45
                    for (var i = 0; i < input.Length; i += m_cipher.BlockSize)
46
                    {
47
                        m_cipher.EncryptBlockUnsafe(pInput + i, pOutput + i);
48
                    }
49
                }
50
            }
51
        }
52

53
        public void Decrypt(ReadOnlySpan<byte> input, Span<byte> output)
54
        {
55
            AssertSliceLength(input, output);
56

57
            unsafe
58
            {
59
                fixed (byte* pInput = input)
60
                fixed (byte* pOutput = output)
61
                {
62
                    for (var i = 0; i < input.Length; i += m_cipher.BlockSize)
63
                    {
64
                        m_cipher.DecryptBlockUnsafe(pInput + i, pOutput + i);
65
                    }
66
                }
67
            }
68
        }
69
    }
70
}
71

72
// ReSharper restore InconsistentNaming
73

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.