Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
AsymmetricAlgorithmHelpers.cs
Go to the documentation of this file.
1using System;
4
6
7internal static class AsymmetricAlgorithmHelpers
8{
10 {
12 return asnWriter.Encode();
13 }
14
15 internal static bool TryConvertIeee1363ToDer(ReadOnlySpan<byte> input, Span<byte> destination, out int bytesWritten)
16 {
18 return asnWriter.TryEncode(destination, out bytesWritten);
19 }
20
22 {
23 int num = input.Length / 2;
24 AsnWriter asnWriter = new AsnWriter(AsnEncodingRules.DER);
25 asnWriter.PushSequence();
26 asnWriter.WriteKeyParameterInteger(input.Slice(0, num));
27 asnWriter.WriteKeyParameterInteger(input.Slice(num, num));
28 asnWriter.PopSequence();
29 return asnWriter;
30 }
31
32 public static byte[] ConvertDerToIeee1363(ReadOnlySpan<byte> input, int fieldSizeBits)
33 {
34 int num = BitsToBytes(fieldSizeBits);
35 int num2 = 2 * num;
36 byte[] array = new byte[num2];
37 ConvertDerToIeee1363(input, fieldSizeBits, array);
38 return array;
39 }
40
41 internal static int ConvertDerToIeee1363(ReadOnlySpan<byte> input, int fieldSizeBits, Span<byte> destination)
42 {
43 int num = BitsToBytes(fieldSizeBits);
44 int result = 2 * num;
45 try
46 {
47 AsnValueReader asnValueReader = new AsnValueReader(input, AsnEncodingRules.DER);
48 AsnValueReader asnValueReader2 = asnValueReader.ReadSequence();
49 asnValueReader.ThrowIfNotEmpty();
50 ReadOnlySpan<byte> signatureField = asnValueReader2.ReadIntegerBytes();
51 ReadOnlySpan<byte> signatureField2 = asnValueReader2.ReadIntegerBytes();
52 asnValueReader2.ThrowIfNotEmpty();
53 CopySignatureField(signatureField, destination.Slice(0, num));
54 CopySignatureField(signatureField2, destination.Slice(num, num));
55 return result;
56 }
57 catch (AsnContentException inner)
58 {
60 }
61 }
62
63 internal static int GetMaxDerSignatureSize(int fieldSizeBits)
64 {
65 int num = BitsToBytes(fieldSizeBits + 1);
66 if (num <= 61)
67 {
68 return 2 * num + 6;
69 }
70 if (num <= 127)
71 {
72 return 2 * num + 7;
73 }
74 int num2 = 2 + GetDerLengthLength(num) + num;
75 int num3 = 2 * num2;
76 return 2 + GetDerLengthLength(num3) + num3;
77 static int GetDerLengthLength(int payloadLength)
78 {
79 if (payloadLength <= 127)
80 {
81 return 0;
82 }
83 if (payloadLength <= 255)
84 {
85 return 1;
86 }
87 if (payloadLength <= 65535)
88 {
89 return 2;
90 }
91 if (payloadLength <= 16777215)
92 {
93 return 3;
94 }
95 return 4;
96 }
97 }
98
99 internal static byte[] ConvertFromIeeeP1363Signature(byte[] signature, DSASignatureFormat targetFormat)
100 {
101 return targetFormat switch
102 {
103 DSASignatureFormat.IeeeP1363FixedFieldConcatenation => signature,
104 DSASignatureFormat.Rfc3279DerSequence => ConvertIeee1363ToDer(signature),
105 _ => throw new CryptographicException(System.SR.Cryptography_UnknownSignatureFormat, targetFormat.ToString()),
106 };
107 }
108
109 internal static byte[] ConvertSignatureToIeeeP1363(DSASignatureFormat currentFormat, ReadOnlySpan<byte> signature, int fieldSizeBits)
110 {
111 return currentFormat switch
112 {
113 DSASignatureFormat.IeeeP1363FixedFieldConcatenation => signature.ToArray(),
114 DSASignatureFormat.Rfc3279DerSequence => ConvertDerToIeee1363(signature, fieldSizeBits),
115 _ => throw new CryptographicException(System.SR.Cryptography_UnknownSignatureFormat, currentFormat.ToString()),
116 };
117 }
118
119 public static int BitsToBytes(int bitLength)
120 {
121 return (bitLength + 7) / 8;
122 }
123
124 private static void CopySignatureField(ReadOnlySpan<byte> signatureField, Span<byte> response)
125 {
126 if (signatureField.Length > response.Length)
127 {
128 if (signatureField.Length != response.Length + 1 || signatureField[0] != 0 || signatureField[1] <= 127)
129 {
130 throw new CryptographicException();
131 }
132 signatureField = signatureField.Slice(1);
133 }
134 int num = response.Length - signatureField.Length;
135 response.Slice(0, num).Clear();
136 signatureField.CopyTo(response.Slice(num));
137 }
138
139 internal static byte[] ConvertSignatureToIeeeP1363(this DSA dsa, DSASignatureFormat currentFormat, ReadOnlySpan<byte> signature, int fieldSizeBits = 0)
140 {
141 try
142 {
143 if (fieldSizeBits == 0)
144 {
145 fieldSizeBits = dsa.ExportParameters(includePrivateParameters: false).Q.Length * 8;
146 }
147 return ConvertSignatureToIeeeP1363(currentFormat, signature, fieldSizeBits);
148 }
150 {
151 return null;
152 }
153 }
154
155 internal static byte[] ConvertSignatureToIeeeP1363(this ECDsa ecdsa, DSASignatureFormat currentFormat, ReadOnlySpan<byte> signature)
156 {
157 try
158 {
159 return ConvertSignatureToIeeeP1363(currentFormat, signature, ecdsa.KeySize);
160 }
162 {
163 return null;
164 }
165 }
166}
static byte[] ConvertIeee1363ToDer(ReadOnlySpan< byte > input)
static void CopySignatureField(ReadOnlySpan< byte > signatureField, Span< byte > response)
static byte[] ConvertDerToIeee1363(ReadOnlySpan< byte > input, int fieldSizeBits)
static byte[] ConvertSignatureToIeeeP1363(this ECDsa ecdsa, DSASignatureFormat currentFormat, ReadOnlySpan< byte > signature)
static int ConvertDerToIeee1363(ReadOnlySpan< byte > input, int fieldSizeBits, Span< byte > destination)
static bool TryConvertIeee1363ToDer(ReadOnlySpan< byte > input, Span< byte > destination, out int bytesWritten)
static byte[] ConvertFromIeeeP1363Signature(byte[] signature, DSASignatureFormat targetFormat)
static byte[] ConvertSignatureToIeeeP1363(this DSA dsa, DSASignatureFormat currentFormat, ReadOnlySpan< byte > signature, int fieldSizeBits=0)
static byte[] ConvertSignatureToIeeeP1363(DSASignatureFormat currentFormat, ReadOnlySpan< byte > signature, int fieldSizeBits)
static AsnWriter WriteIeee1363ToDer(ReadOnlySpan< byte > input)
bool TryEncode(Span< byte > destination, out int bytesWritten)
Definition AsnWriter.cs:173
Scope PushSequence(Asn1Tag? tag=null)
int Encode(Span< byte > destination)
Definition AsnWriter.cs:195
void PopSequence(Asn1Tag? tag=null)
static string Cryptography_Der_Invalid_Encoding
Definition SR.cs:50
static string Cryptography_UnknownSignatureFormat
Definition SR.cs:156
Definition SR.cs:7
DSAParameters ExportParameters(bool includePrivateParameters)
ReadOnlySpan< byte > ReadIntegerBytes(Asn1Tag? expectedTag=null)
AsnValueReader ReadSequence(Asn1Tag? expectedTag=null)
void CopyTo(Span< T > destination)
ReadOnlySpan< T > Slice(int start)
Span< T > Slice(int start)
Definition Span.cs:271
int Length
Definition Span.cs:70