Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
CngSymmetricAlgorithmCore.cs
Go to the documentation of this file.
1using System;
4
6
8{
9 private readonly ICngSymmetricAlgorithm _outer;
10
11 private string _keyName;
12
13 private readonly CngProvider _provider;
14
16
17 private bool KeyInPlainText => _keyName == null;
18
20 {
21 _outer = outer;
22 _keyName = null;
23 _provider = null;
25 }
26
27 public CngSymmetricAlgorithmCore(ICngSymmetricAlgorithm outer, string keyName, CngProvider provider, CngKeyOpenOptions openOptions)
28 {
29 if (keyName == null)
30 {
31 throw new ArgumentNullException("keyName");
32 }
33 if (provider == null)
34 {
35 throw new ArgumentNullException("provider");
36 }
37 _outer = outer;
38 _keyName = keyName;
39 _provider = provider;
40 _optionOptions = openOptions;
41 using CngKey cngKey = ProduceCngKey();
42 CngAlgorithm algorithm = cngKey.Algorithm;
43 string nCryptAlgorithmIdentifier = _outer.GetNCryptAlgorithmIdentifier();
44 if (nCryptAlgorithmIdentifier != algorithm.Algorithm)
45 {
46 throw new CryptographicException(System.SR.Format(System.SR.Cryptography_CngKeyWrongAlgorithm, algorithm.Algorithm, nCryptAlgorithmIdentifier));
47 }
48 _outer.BaseKeySize = cngKey.KeySize;
49 }
50
51 public byte[] GetKeyIfExportable()
52 {
54 {
55 return _outer.BaseKey;
56 }
57 using CngKey cngKey = ProduceCngKey();
58 return cngKey.GetSymmetricKeyDataIfExportable(_outer.GetNCryptAlgorithmIdentifier());
59 }
60
61 public void SetKey(byte[] key)
62 {
63 _outer.BaseKey = key;
64 _keyName = null;
65 }
66
67 public void SetKeySize(int keySize, ICngSymmetricAlgorithm outer)
68 {
69 outer.BaseKeySize = keySize;
70 _keyName = null;
71 }
72
73 public void GenerateKey()
74 {
75 byte[] key = Internal.Cryptography.Helpers.GenerateRandom(_outer.BaseKeySize.BitSizeToByteSize());
76 SetKey(key);
77 }
78
79 public void GenerateIV()
80 {
81 byte[] iV = Internal.Cryptography.Helpers.GenerateRandom(_outer.BlockSize.BitSizeToByteSize());
82 _outer.IV = iV;
83 }
84
86 {
87 return CreateCryptoTransform(encrypting: true);
88 }
89
91 {
92 return CreateCryptoTransform(encrypting: false);
93 }
94
95 public ICryptoTransform CreateEncryptor(byte[] rgbKey, byte[] rgbIV)
96 {
97 return CreateCryptoTransform(rgbKey, rgbIV, encrypting: true, _outer.Padding, _outer.Mode, _outer.FeedbackSize);
98 }
99
100 public ICryptoTransform CreateDecryptor(byte[] rgbKey, byte[] rgbIV)
101 {
102 return CreateCryptoTransform(rgbKey, rgbIV, encrypting: false, _outer.Padding, _outer.Mode, _outer.FeedbackSize);
103 }
104
113
114 public Internal.Cryptography.UniversalCryptoTransform CreateCryptoTransform(byte[] iv, bool encrypting, PaddingMode padding, CipherMode mode, int feedbackSizeInBits)
115 {
116 if (KeyInPlainText)
117 {
118 return CreateCryptoTransform(_outer.BaseKey, iv, encrypting, padding, mode, feedbackSizeInBits);
119 }
120 return CreatePersistedCryptoTransformCore(ProduceCngKey, iv, encrypting, padding, mode, feedbackSizeInBits);
121 }
122
123 private Internal.Cryptography.UniversalCryptoTransform CreateCryptoTransform(byte[] rgbKey, byte[] rgbIV, bool encrypting, PaddingMode padding, CipherMode mode, int feedbackSizeInBits)
124 {
125 if (rgbKey == null)
126 {
127 throw new ArgumentNullException("rgbKey");
128 }
129 ValidateFeedbackSize(mode, feedbackSizeInBits);
130 byte[] array = rgbKey.CloneByteArray();
131 long num = (long)array.Length * 8L;
132 if (num > int.MaxValue || !((int)num).IsLegalSize(_outer.LegalKeySizes))
133 {
135 }
137 {
139 }
140 if (rgbIV != null && rgbIV.Length != _outer.BlockSize.BitSizeToByteSize())
141 {
143 }
144 byte[] iv = mode.GetCipherIv(rgbIV).CloneByteArray();
146 return CreateEphemeralCryptoTransformCore(array, iv, encrypting, padding, mode, feedbackSizeInBits);
147 }
148
149 private Internal.Cryptography.UniversalCryptoTransform CreateEphemeralCryptoTransformCore(byte[] key, byte[] iv, bool encrypting, PaddingMode padding, CipherMode mode, int feedbackSizeInBits)
150 {
151 int blockSizeInBytes = _outer.BlockSize.BitSizeToByteSize();
152 Internal.NativeCrypto.SafeAlgorithmHandle ephemeralModeHandle = _outer.GetEphemeralModeHandle(mode, feedbackSizeInBits);
153 Internal.Cryptography.BasicSymmetricCipher cipher = new Internal.Cryptography.BasicSymmetricCipherBCrypt(ephemeralModeHandle, mode, blockSizeInBytes, _outer.GetPaddingSize(mode, feedbackSizeInBits), key, ownsParentHandle: false, iv, encrypting);
154 return Internal.Cryptography.UniversalCryptoTransform.Create(padding, cipher, encrypting);
155 }
156
157 private Internal.Cryptography.UniversalCryptoTransform CreatePersistedCryptoTransformCore(Func<CngKey> cngKeyFactory, byte[] iv, bool encrypting, PaddingMode padding, CipherMode mode, int feedbackSizeInBits)
158 {
159 ValidateFeedbackSize(mode, feedbackSizeInBits);
160 int blockSizeInBytes = _outer.BlockSize.BitSizeToByteSize();
161 Internal.Cryptography.BasicSymmetricCipher cipher = new BasicSymmetricCipherNCrypt(cngKeyFactory, mode, blockSizeInBytes, iv, encrypting, _outer.GetPaddingSize(mode, feedbackSizeInBits));
162 return Internal.Cryptography.UniversalCryptoTransform.Create(padding, cipher, encrypting);
163 }
164
166 {
168 }
169
170 private void ValidateFeedbackSize(CipherMode mode, int feedbackSizeInBits)
171 {
172 if (mode != CipherMode.CFB)
173 {
174 return;
175 }
176 if (KeyInPlainText)
177 {
178 if (!_outer.IsValidEphemeralFeedbackSize(feedbackSizeInBits))
179 {
181 }
182 }
183 else if (feedbackSizeInBits != 8)
184 {
186 }
187 }
188}
static byte[] GenerateRandom(int count)
Definition Helpers.cs:139
static UniversalCryptoTransform Create(PaddingMode paddingMode, BasicSymmetricCipher cipher, bool encrypting)
static string Cryptography_WeakKey
Definition SR.cs:122
static string Format(string resourceFormat, object p1)
Definition SR.cs:118
static string Cryptography_CipherModeFeedbackNotSupported
Definition SR.cs:146
static string Cryptography_CngKeyWrongAlgorithm
Definition SR.cs:42
static string Cryptography_InvalidKeySize
Definition SR.cs:92
static string Cryptography_InvalidIVSize
Definition SR.cs:102
Definition SR.cs:7
static CngKey Open(string keyName)
Definition CngKey.cs:799
int GetPaddingSize(CipherMode mode, int feedbackSizeBits)
Internal.NativeCrypto.SafeAlgorithmHandle GetEphemeralModeHandle(CipherMode mode, int feedbackSizeInBits)
bool IsValidEphemeralFeedbackSize(int feedbackSizeInBits)
void ValidateFeedbackSize(CipherMode mode, int feedbackSizeInBits)
ICryptoTransform CreateEncryptor(byte[] rgbKey, byte[] rgbIV)
void SetKeySize(int keySize, ICngSymmetricAlgorithm outer)
Internal.Cryptography.UniversalCryptoTransform CreateEphemeralCryptoTransformCore(byte[] key, byte[] iv, bool encrypting, PaddingMode padding, CipherMode mode, int feedbackSizeInBits)
Internal.Cryptography.UniversalCryptoTransform CreateCryptoTransform(byte[] rgbKey, byte[] rgbIV, bool encrypting, PaddingMode padding, CipherMode mode, int feedbackSizeInBits)
Internal.Cryptography.UniversalCryptoTransform CreatePersistedCryptoTransformCore(Func< CngKey > cngKeyFactory, byte[] iv, bool encrypting, PaddingMode padding, CipherMode mode, int feedbackSizeInBits)
Internal.Cryptography.UniversalCryptoTransform CreateCryptoTransform(byte[] iv, bool encrypting, PaddingMode padding, CipherMode mode, int feedbackSizeInBits)
CngSymmetricAlgorithmCore(ICngSymmetricAlgorithm outer, string keyName, CngProvider provider, CngKeyOpenOptions openOptions)
ICryptoTransform CreateDecryptor(byte[] rgbKey, byte[] rgbIV)