Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
EccKeyFormatHelper.cs
Go to the documentation of this file.
5
7
8internal static class EccKeyFormatHelper
9{
11 {
12 ValidateParameters(key.Parameters, in algId);
13 if (key.Version != 1)
14 {
16 }
17 byte[] x = null;
18 byte[] y = null;
19 if (key.PublicKey.HasValue)
20 {
21 ReadOnlySpan<byte> span = key.PublicKey.Value.Span;
22 if (span.Length == 0)
23 {
25 }
26 if (span[0] != 4)
27 {
29 }
30 if (span.Length != 2 * key.PrivateKey.Length + 1)
31 {
33 }
34 x = span.Slice(1, key.PrivateKey.Length).ToArray();
35 y = span.Slice(1 + key.PrivateKey.Length).ToArray();
36 }
37 System.Security.Cryptography.Asn1.ECDomainParameters domainParameters = ((!key.Parameters.HasValue) ? System.Security.Cryptography.Asn1.ECDomainParameters.Decode(algId.Parameters.Value, AsnEncodingRules.DER) : key.Parameters.Value);
38 ret = new ECParameters
39 {
40 Curve = GetCurve(domainParameters),
41 Q =
42 {
43 X = x,
44 Y = y
45 },
46 D = key.PrivateKey.ToArray()
47 };
48 ret.Validate();
49 }
50
52 {
53 if (!keyParameters.HasValue && !algId.Parameters.HasValue)
54 {
56 }
57 if (keyParameters.HasValue && algId.Parameters.HasValue)
58 {
59 ReadOnlySpan<byte> span = algId.Parameters.Value.Span;
60 AsnWriter asnWriter = new AsnWriter(AsnEncodingRules.DER);
61 keyParameters.Value.Encode(asnWriter);
62 if (!asnWriter.EncodedValueEquals(span))
63 {
65 }
66 }
67 }
68
70 {
71 if (domainParameters.Specified.HasValue)
72 {
73 return GetSpecifiedECCurve(domainParameters.Specified.Value);
74 }
75 if (domainParameters.Named == null)
76 {
78 }
79 return ECCurve.CreateFromOid(domainParameters.Named switch
80 {
81 "1.2.840.10045.3.1.7" => System.Security.Cryptography.Oids.secp256r1Oid,
82 "1.3.132.0.34" => System.Security.Cryptography.Oids.secp384r1Oid,
83 "1.3.132.0.35" => System.Security.Cryptography.Oids.secp521r1Oid,
84 _ => new Oid(domainParameters.Named, null),
85 });
86 }
87
89 {
90 try
91 {
92 return GetSpecifiedECCurveCore(specifiedParameters);
93 }
94 catch (AsnContentException inner)
95 {
97 }
98 }
99
101 {
102 if (specifiedParameters.Version < 1 || specifiedParameters.Version > 3)
103 {
105 }
106 if (specifiedParameters.Version > 1 && !specifiedParameters.Curve.Seed.HasValue)
107 {
109 }
110 string fieldType = specifiedParameters.FieldID.FieldType;
111 bool flag;
112 byte[] array;
113 if (!(fieldType == "1.2.840.10045.1.1"))
114 {
115 if (!(fieldType == "1.2.840.10045.1.2"))
116 {
118 }
119 flag = false;
120 AsnReader asnReader = new AsnReader(specifiedParameters.FieldID.Parameters, AsnEncodingRules.BER);
121 AsnReader asnReader2 = asnReader.ReadSequence();
122 asnReader.ThrowIfNotEmpty();
123 if (!asnReader2.TryReadInt32(out var value) || value > 661 || value < 0)
124 {
126 }
127 int value2 = -1;
128 int value3 = -1;
129 string text = asnReader2.ReadObjectIdentifier();
130 int value4;
131 if (!(text == "1.2.840.10045.1.2.3.2"))
132 {
133 if (!(text == "1.2.840.10045.1.2.3.3"))
134 {
136 }
137 AsnReader asnReader3 = asnReader2.ReadSequence();
138 if (!asnReader3.TryReadInt32(out value4) || !asnReader3.TryReadInt32(out value2) || !asnReader3.TryReadInt32(out value3) || value4 < 1 || value2 <= value4 || value3 <= value2 || value3 >= value)
139 {
141 }
142 asnReader3.ThrowIfNotEmpty();
143 }
144 else if (!asnReader2.TryReadInt32(out value4) || value4 >= value || value4 < 1)
145 {
147 }
148 asnReader2.ThrowIfNotEmpty();
149 BitArray bitArray = new BitArray(value + 1);
150 bitArray.Set(value, value: true);
151 bitArray.Set(value4, value: true);
152 bitArray.Set(0, value: true);
153 if (value2 > 0)
154 {
155 bitArray.Set(value2, value: true);
156 bitArray.Set(value3, value: true);
157 }
158 array = new byte[(value + 7) / 8];
159 bitArray.CopyTo(array, 0);
161 }
162 else
163 {
164 flag = true;
165 AsnReader asnReader4 = new AsnReader(specifiedParameters.FieldID.Parameters, AsnEncodingRules.BER);
166 ReadOnlySpan<byte> readOnlySpan = asnReader4.ReadIntegerBytes().Span;
167 asnReader4.ThrowIfNotEmpty();
168 if (readOnlySpan[0] == 0)
169 {
170 readOnlySpan = readOnlySpan.Slice(1);
171 }
172 if (readOnlySpan.Length > 82)
173 {
175 }
176 array = readOnlySpan.ToArray();
177 }
178 ECCurve result;
179 if (flag)
180 {
181 ECCurve eCCurve = default(ECCurve);
182 eCCurve.CurveType = ECCurve.ECCurveType.PrimeShortWeierstrass;
183 eCCurve.Prime = array;
184 result = eCCurve;
185 }
186 else
187 {
188 ECCurve eCCurve = default(ECCurve);
189 eCCurve.CurveType = ECCurve.ECCurveType.Characteristic2;
190 eCCurve.Polynomial = array;
191 result = eCCurve;
192 }
193 result.A = specifiedParameters.Curve.A.ToUnsignedIntegerBytes(array.Length);
194 result.B = specifiedParameters.Curve.B.ToUnsignedIntegerBytes(array.Length);
195 result.Order = specifiedParameters.Order.ToUnsignedIntegerBytes(array.Length);
196 ReadOnlySpan<byte> span = specifiedParameters.Base.Span;
197 if (span[0] != 4 || span.Length != 2 * array.Length + 1)
198 {
200 }
201 result.G.X = span.Slice(1, array.Length).ToArray();
202 result.G.Y = span.Slice(1 + array.Length).ToArray();
203 if (specifiedParameters.Cofactor.HasValue)
204 {
205 result.Cofactor = specifiedParameters.Cofactor.Value.ToUnsignedIntegerBytes();
206 }
207 return result;
208 }
209
210 private static AsnWriter WriteAlgorithmIdentifier(in ECParameters ecParameters)
211 {
212 AsnWriter asnWriter = new AsnWriter(AsnEncodingRules.DER);
213 WriteAlgorithmIdentifier(in ecParameters, asnWriter);
214 return asnWriter;
215 }
216
217 private static void WriteAlgorithmIdentifier(in ECParameters ecParameters, AsnWriter writer)
218 {
219 writer.PushSequence();
220 writer.WriteObjectIdentifier("1.2.840.10045.2.1");
221 WriteEcParameters(ecParameters, writer);
222 writer.PopSequence();
223 }
224
225 internal static AsnWriter WritePkcs8PrivateKey(ECParameters ecParameters, System.Security.Cryptography.Asn1.AttributeAsn[] attributes = null)
226 {
227 ecParameters.Validate();
228 if (ecParameters.D == null)
229 {
231 }
232 AsnWriter privateKeyWriter = WriteEcPrivateKey(in ecParameters, includeDomainParameters: false);
233 AsnWriter algorithmIdentifierWriter = WriteAlgorithmIdentifier(in ecParameters);
234 AsnWriter attributesWriter = WritePrivateKeyInfoAttributes(attributes);
235 return System.Security.Cryptography.KeyFormatHelper.WritePkcs8(algorithmIdentifierWriter, privateKeyWriter, attributesWriter);
236 }
237
238 [return: NotNullIfNotNull("attributes")]
240 {
241 if (attributes == null)
242 {
243 return null;
244 }
245 AsnWriter asnWriter = new AsnWriter(AsnEncodingRules.DER);
246 Asn1Tag value = new Asn1Tag(TagClass.ContextSpecific, 0);
247 asnWriter.PushSetOf(value);
248 for (int i = 0; i < attributes.Length; i++)
249 {
250 attributes[i].Encode(asnWriter);
251 }
252 asnWriter.PopSetOf(value);
253 return asnWriter;
254 }
255
256 private static void WriteEcParameters(ECParameters ecParameters, AsnWriter writer)
257 {
258 if (ecParameters.Curve.IsNamed)
259 {
260 Oid oid = ecParameters.Curve.Oid;
261 if (string.IsNullOrEmpty(oid.Value))
262 {
264 }
265 writer.WriteObjectIdentifier(oid.Value);
266 }
267 else
268 {
269 if (!ecParameters.Curve.IsExplicit)
270 {
272 }
273 WriteSpecifiedECDomain(ecParameters, writer);
274 }
275 }
276
277 private static void WriteSpecifiedECDomain(ECParameters ecParameters, AsnWriter writer)
278 {
279 int k3;
280 int k2;
281 int k;
282 int m = (k3 = (k2 = (k = -1)));
283 if (ecParameters.Curve.IsCharacteristic2)
284 {
285 DetermineChar2Parameters(in ecParameters, ref m, ref k3, ref k2, ref k);
286 }
287 writer.PushSequence();
288 writer.WriteInteger(1L);
289 writer.PushSequence();
290 if (ecParameters.Curve.IsPrime)
291 {
292 writer.WriteObjectIdentifier("1.2.840.10045.1.1");
293 writer.WriteIntegerUnsigned(ecParameters.Curve.Prime);
294 }
295 else
296 {
297 writer.WriteObjectIdentifier("1.2.840.10045.1.2");
298 writer.PushSequence();
299 writer.WriteInteger((long)m, (Asn1Tag?)null);
300 if (k > 0)
301 {
302 writer.WriteObjectIdentifier("1.2.840.10045.1.2.3.3");
303 writer.PushSequence();
304 writer.WriteInteger((long)k3, (Asn1Tag?)null);
305 writer.WriteInteger((long)k2, (Asn1Tag?)null);
306 writer.WriteInteger((long)k, (Asn1Tag?)null);
307 writer.PopSequence();
308 }
309 else
310 {
311 writer.WriteObjectIdentifier("1.2.840.10045.1.2.3.2");
312 writer.WriteInteger((long)k3, (Asn1Tag?)null);
313 }
314 writer.PopSequence();
315 }
316 writer.PopSequence();
317 WriteCurve(in ecParameters.Curve, writer);
318 WriteUncompressedBasePoint(in ecParameters, writer);
319 writer.WriteIntegerUnsigned(ecParameters.Curve.Order);
320 if (ecParameters.Curve.Cofactor != null)
321 {
322 writer.WriteIntegerUnsigned(ecParameters.Curve.Cofactor);
323 }
324 writer.PopSequence();
325 }
326
327 private static void DetermineChar2Parameters(in ECParameters ecParameters, ref int m, ref int k1, ref int k2, ref int k3)
328 {
329 byte[] polynomial = ecParameters.Curve.Polynomial;
330 int num = polynomial.Length - 1;
331 if (polynomial[0] == 0 || (polynomial[num] & 1) != 1)
332 {
334 }
335 for (int num2 = 7; num2 >= 0; num2--)
336 {
337 int num3 = 1 << num2;
338 if ((polynomial[0] & num3) == num3)
339 {
340 m = checked(8 * num + num2);
341 }
342 }
343 for (int i = 0; i < polynomial.Length; i++)
344 {
345 int num4 = num - i;
346 byte b = polynomial[num4];
347 for (int j = 0; j < 8; j++)
348 {
349 int num5 = 1 << j;
350 if ((b & num5) != num5)
351 {
352 continue;
353 }
354 int num6 = 8 * i + j;
355 if (num6 == 0)
356 {
357 continue;
358 }
359 if (num6 == m)
360 {
361 break;
362 }
363 if (k1 < 0)
364 {
365 k1 = num6;
366 continue;
367 }
368 if (k2 < 0)
369 {
370 k2 = num6;
371 continue;
372 }
373 if (k3 < 0)
374 {
375 k3 = num6;
376 continue;
377 }
379 }
380 }
381 if (k3 <= 0)
382 {
383 if (k2 > 0)
384 {
386 }
387 if (k1 <= 0)
388 {
390 }
391 }
392 }
393
394 private static void WriteCurve(in ECCurve curve, AsnWriter writer)
395 {
396 writer.PushSequence();
397 WriteFieldElement(curve.A, writer);
398 WriteFieldElement(curve.B, writer);
399 if (curve.Seed != null)
400 {
401 writer.WriteBitString(curve.Seed);
402 }
403 writer.PopSequence();
404 }
405
406 private static void WriteFieldElement(byte[] fieldElement, AsnWriter writer)
407 {
408 int i;
409 for (i = 0; i < fieldElement.Length - 1 && fieldElement[i] == 0; i++)
410 {
411 }
412 writer.WriteOctetString(fieldElement.AsSpan(i));
413 }
414
415 private static void WriteUncompressedBasePoint(in ECParameters ecParameters, AsnWriter writer)
416 {
417 int num = ecParameters.Curve.G.X.Length * 2 + 1;
419 array[0] = 4;
420 ecParameters.Curve.G.X.CopyTo(array.AsSpan(1));
421 ecParameters.Curve.G.Y.CopyTo(array.AsSpan(1 + ecParameters.Curve.G.X.Length));
422 writer.WriteOctetString(array.AsSpan(0, num));
424 }
425
426 private static void WriteUncompressedPublicKey(in ECParameters ecParameters, AsnWriter writer)
427 {
428 int num = ecParameters.Q.X.Length * 2 + 1;
430 array[0] = 4;
431 ecParameters.Q.X.AsSpan().CopyTo(array.AsSpan(1));
432 ecParameters.Q.Y.AsSpan().CopyTo(array.AsSpan(1 + ecParameters.Q.X.Length));
433 writer.WriteBitString(array.AsSpan(0, num));
434 }
435
436 private static AsnWriter WriteEcPrivateKey(in ECParameters ecParameters, bool includeDomainParameters)
437 {
438 AsnWriter asnWriter = new AsnWriter(AsnEncodingRules.DER);
439 asnWriter.PushSequence();
440 asnWriter.WriteInteger(1L);
441 asnWriter.WriteOctetString(ecParameters.D);
442 if (includeDomainParameters)
443 {
444 Asn1Tag value = new Asn1Tag(TagClass.ContextSpecific, 0, isConstructed: true);
445 asnWriter.PushSequence(value);
446 WriteEcParameters(ecParameters, asnWriter);
447 asnWriter.PopSequence(value);
448 }
449 if (ecParameters.Q.X != null)
450 {
451 Asn1Tag value2 = new Asn1Tag(TagClass.ContextSpecific, 1, isConstructed: true);
452 asnWriter.PushSequence(value2);
453 WriteUncompressedPublicKey(in ecParameters, asnWriter);
454 asnWriter.PopSequence(value2);
455 }
456 asnWriter.PopSequence();
457 return asnWriter;
458 }
459}
static void Reverse(Array array)
Definition Array.cs:2207
void Set(int index, bool value)
Definition BitArray.cs:326
unsafe void CopyTo(Array array, int index)
Definition BitArray.cs:820
string ReadObjectIdentifier(Asn1Tag? expectedTag=null)
Definition AsnReader.cs:256
AsnReader ReadSequence(Asn1Tag? expectedTag=null)
Definition AsnReader.cs:264
ReadOnlyMemory< byte > ReadIntegerBytes(Asn1Tag? expectedTag=null)
Definition AsnReader.cs:139
bool TryReadInt32(out int value, Asn1Tag? expectedTag=null)
Definition AsnReader.cs:156
Scope PushSetOf(Asn1Tag? tag=null)
bool EncodedValueEquals(ReadOnlySpan< byte > other)
Definition AsnWriter.cs:232
void WriteOctetString(ReadOnlySpan< byte > value, Asn1Tag? tag=null)
Definition AsnWriter.cs:904
Scope PushSequence(Asn1Tag? tag=null)
void PopSetOf(Asn1Tag? tag=null)
void WriteInteger(long value, Asn1Tag? tag=null)
Definition AsnWriter.cs:665
void PopSequence(Asn1Tag? tag=null)
static string Cryptography_Der_Invalid_Encoding
Definition SR.cs:50
static string Cryptography_CurveNotSupported
Definition SR.cs:64
static string Cryptography_ECC_NamedCurvesOnly
Definition SR.cs:56
static string Format(string resourceFormat, object p1)
Definition SR.cs:118
static string Cryptography_NotValidPublicOrPrivateKey
Definition SR.cs:122
static string Cryptography_CSP_NoPrivateKey
Definition SR.cs:48
static string Cryptography_InvalidECCharacteristic2Curve
Definition SR.cs:86
Definition SR.cs:7
static void Return(byte[] array, int clearSize=-1)
Definition CryptoPool.cs:12
static byte[] Rent(int minimumLength)
Definition CryptoPool.cs:7
static void DetermineChar2Parameters(in ECParameters ecParameters, ref int m, ref int k1, ref int k2, ref int k3)
static void WriteUncompressedPublicKey(in ECParameters ecParameters, AsnWriter writer)
static ECCurve GetSpecifiedECCurve(System.Security.Cryptography.Asn1.SpecifiedECDomain specifiedParameters)
static AsnWriter WriteAlgorithmIdentifier(in ECParameters ecParameters)
static void WriteAlgorithmIdentifier(in ECParameters ecParameters, AsnWriter writer)
static AsnWriter WritePrivateKeyInfoAttributes(System.Security.Cryptography.Asn1.AttributeAsn[] attributes)
static AsnWriter WritePrivateKeyInfoAttributes(AttributeAsn[] attributes)
static ECCurve GetSpecifiedECCurveCore(System.Security.Cryptography.Asn1.SpecifiedECDomain specifiedParameters)
static void WriteSpecifiedECDomain(ECParameters ecParameters, AsnWriter writer)
static AsnWriter WritePkcs8PrivateKey(ECParameters ecParameters, System.Security.Cryptography.Asn1.AttributeAsn[] attributes=null)
static void ValidateParameters(System.Security.Cryptography.Asn1.ECDomainParameters? keyParameters, in System.Security.Cryptography.Asn1.AlgorithmIdentifierAsn algId)
static ECCurve GetSpecifiedECCurve(SpecifiedECDomain specifiedParameters)
static AsnWriter WriteEcPrivateKey(in ECParameters ecParameters, bool includeDomainParameters)
static void FromECPrivateKey(System.Security.Cryptography.Asn1.ECPrivateKey key, in System.Security.Cryptography.Asn1.AlgorithmIdentifierAsn algId, out ECParameters ret)
static void WriteEcParameters(ECParameters ecParameters, AsnWriter writer)
static void WriteUncompressedBasePoint(in ECParameters ecParameters, AsnWriter writer)
static void WriteCurve(in ECCurve curve, AsnWriter writer)
static ECCurve GetCurve(System.Security.Cryptography.Asn1.ECDomainParameters domainParameters)
static void ValidateParameters(ECDomainParameters? keyParameters, in AlgorithmIdentifierAsn algId)
static ECCurve GetSpecifiedECCurveCore(SpecifiedECDomain specifiedParameters)
static ECCurve GetCurve(ECDomainParameters domainParameters)
static void WriteFieldElement(byte[] fieldElement, AsnWriter writer)
static AsnWriter WritePkcs8(AsnWriter algorithmIdentifierWriter, AsnWriter privateKeyWriter, AsnWriter attributesWriter=null)
static Oid FromFriendlyName(string friendlyName, OidGroup group)
Definition Oid.cs:106
unsafe ReadOnlySpan< T > Span
ReadOnlySpan< T > Slice(int start)
static ECDomainParameters Decode(ReadOnlyMemory< byte > encoded, AsnEncodingRules ruleSet)
static ECCurve CreateFromOid(Oid curveOid)
Definition ECCurve.cs:127