-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathXXTEA.cs
108 lines (94 loc) · 3.37 KB
/
XXTEA.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
using System;
using System.Runtime.InteropServices;
namespace Gibbed
{
public static partial class XXTEA
{
public unsafe static byte[] Encrypt(
byte[] dataBytes,
int dataOffset,
int dataCount,
byte[] keyBytes,
int keyOffset,
int keyCount)
{
if (dataBytes == null)
{
throw new ArgumentNullException(nameof(dataBytes));
}
if (dataOffset < 0 || dataOffset >= dataBytes.Length)
{
throw new ArgumentOutOfRangeException(nameof(dataOffset));
}
if (dataCount <= 0 || dataOffset + dataCount > dataBytes.Length)
{
throw new ArgumentOutOfRangeException(nameof(dataCount));
}
if (keyBytes == null)
{
throw new ArgumentNullException(nameof(keyBytes));
}
if (keyOffset < 0 || keyOffset >= keyBytes.Length)
{
throw new ArgumentOutOfRangeException(nameof(keyOffset));
}
if (keyCount <= 0 || keyOffset + keyCount > keyBytes.Length)
{
throw new ArgumentOutOfRangeException(nameof(keyCount));
}
fixed (byte* dataBuffer = &dataBytes[dataOffset])
fixed (byte* keyBuffer = &dataBytes[keyOffset])
{
var resultBytes = Native.Encrypt(dataBuffer, dataCount, keyBuffer, keyCount, out var resultCount);
if (resultBytes != null && resultCount != resultBytes.Length)
{
Array.Resize(ref resultBytes, resultCount);
}
return resultBytes;
}
}
public unsafe static byte[] Decrypt(
byte[] dataBytes,
int dataOffset,
int dataCount,
byte[] keyBytes,
int keyOffset,
int keyCount)
{
if (dataBytes == null)
{
throw new ArgumentNullException(nameof(dataBytes));
}
if (dataOffset < 0 || dataOffset >= dataBytes.Length)
{
throw new ArgumentOutOfRangeException(nameof(dataOffset));
}
if (dataCount <= 0 || dataOffset + dataCount > dataBytes.Length)
{
throw new ArgumentOutOfRangeException(nameof(dataCount));
}
if (keyBytes == null)
{
throw new ArgumentNullException(nameof(keyBytes));
}
if (keyOffset < 0 || keyOffset >= keyBytes.Length)
{
throw new ArgumentOutOfRangeException(nameof(keyOffset));
}
if (keyCount <= 0 || keyOffset + keyCount > keyBytes.Length)
{
throw new ArgumentOutOfRangeException(nameof(keyCount));
}
fixed (byte* dataBuffer = &dataBytes[dataOffset])
fixed (byte* keyBuffer = &keyBytes[keyOffset])
{
var resultBytes = Native.Decrypt(dataBuffer, dataCount, keyBuffer, keyCount, out var resultCount);
if (resultBytes != null && resultCount != resultBytes.Length)
{
Array.Resize(ref resultBytes, resultCount);
}
return resultBytes;
}
}
}
}