Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
KeyFormatHelper.cs
Go to the documentation of this file.
3
5
6internal static class KeyFormatHelper
7{
8 internal static AsnWriter WritePkcs8(AsnWriter algorithmIdentifierWriter, AsnWriter privateKeyWriter, AsnWriter attributesWriter = null)
9 {
10 int encodedLength = algorithmIdentifierWriter.GetEncodedLength();
11 int encodedLength2 = privateKeyWriter.GetEncodedLength();
12 AsnWriter asnWriter = new AsnWriter(AsnEncodingRules.DER);
13 asnWriter.PushSequence();
14 asnWriter.WriteInteger(0L);
15 algorithmIdentifierWriter.CopyTo(asnWriter);
16 using (asnWriter.PushOctetString())
17 {
18 privateKeyWriter.CopyTo(asnWriter);
19 }
20 attributesWriter?.CopyTo(asnWriter);
21 asnWriter.PopSequence();
22 return asnWriter;
23 }
24
25 internal static AsnWriter WriteEncryptedPkcs8(ReadOnlySpan<char> password, AsnWriter pkcs8Writer, PbeParameters pbeParameters)
26 {
27 return WriteEncryptedPkcs8(password, ReadOnlySpan<byte>.Empty, pkcs8Writer, pbeParameters);
28 }
29
30 internal static AsnWriter WriteEncryptedPkcs8(ReadOnlySpan<byte> passwordBytes, AsnWriter pkcs8Writer, PbeParameters pbeParameters)
31 {
32 return WriteEncryptedPkcs8(ReadOnlySpan<char>.Empty, passwordBytes, pkcs8Writer, pbeParameters);
33 }
34
35 private static AsnWriter WriteEncryptedPkcs8(ReadOnlySpan<char> password, ReadOnlySpan<byte> passwordBytes, AsnWriter pkcs8Writer, PbeParameters pbeParameters)
36 {
37 System.Security.Cryptography.PasswordBasedEncryption.InitiateEncryption(pbeParameters, out var cipher, out var hmacOid, out var encryptionAlgorithmOid, out var isPkcs);
38 Span<byte> span = default(Span<byte>);
39 AsnWriter asnWriter = null;
40 Span<byte> span2 = stackalloc byte[cipher.BlockSize / 8];
41 Span<byte> span3 = stackalloc byte[16];
42 checked
43 {
44 byte[] array = System.Security.Cryptography.CryptoPool.Rent(pkcs8Writer.GetEncodedLength() + unchecked(cipher.BlockSize / 8));
45 try
46 {
48 int length = System.Security.Cryptography.PasswordBasedEncryption.Encrypt(password, passwordBytes, cipher, isPkcs, pkcs8Writer, pbeParameters, span3, array, span2);
49 span = array.AsSpan(0, length);
50 asnWriter = new AsnWriter(AsnEncodingRules.DER);
51 asnWriter.PushSequence();
52 System.Security.Cryptography.PasswordBasedEncryption.WritePbeAlgorithmIdentifier(asnWriter, isPkcs, encryptionAlgorithmOid, span3, pbeParameters.IterationCount, hmacOid, span2);
53 asnWriter.WriteOctetString(span);
54 asnWriter.PopSequence();
55 return asnWriter;
56 }
57 finally
58 {
61 cipher.Dispose();
62 }
63 }
64 }
65
66 internal static ArraySegment<byte> DecryptPkcs8(ReadOnlySpan<char> inputPassword, ReadOnlyMemory<byte> source, out int bytesRead)
67 {
68 return DecryptPkcs8(inputPassword, ReadOnlySpan<byte>.Empty, source, out bytesRead);
69 }
70
71 internal static ArraySegment<byte> DecryptPkcs8(ReadOnlySpan<byte> inputPasswordBytes, ReadOnlyMemory<byte> source, out int bytesRead)
72 {
73 return DecryptPkcs8(ReadOnlySpan<char>.Empty, inputPasswordBytes, source, out bytesRead);
74 }
75
103
104 internal static AsnWriter ReencryptPkcs8(ReadOnlySpan<char> inputPassword, ReadOnlyMemory<byte> current, ReadOnlySpan<char> newPassword, PbeParameters pbeParameters)
105 {
106 int bytesRead;
107 ArraySegment<byte> arraySegment = DecryptPkcs8(inputPassword, current, out bytesRead);
108 try
109 {
110 if (bytesRead != current.Length)
111 {
113 }
114 AsnWriter asnWriter = new AsnWriter(AsnEncodingRules.BER);
115 asnWriter.WriteEncodedValueForCrypto(arraySegment);
116 return WriteEncryptedPkcs8(newPassword, asnWriter, pbeParameters);
117 }
118 catch (CryptographicException inner)
119 {
121 }
122 finally
123 {
125 }
126 }
127
128 internal static AsnWriter ReencryptPkcs8(ReadOnlySpan<char> inputPassword, ReadOnlyMemory<byte> current, ReadOnlySpan<byte> newPasswordBytes, PbeParameters pbeParameters)
129 {
130 int bytesRead;
131 ArraySegment<byte> arraySegment = DecryptPkcs8(inputPassword, current, out bytesRead);
132 try
133 {
134 if (bytesRead != current.Length)
135 {
137 }
138 AsnWriter asnWriter = new AsnWriter(AsnEncodingRules.BER);
139 asnWriter.WriteEncodedValueForCrypto(arraySegment);
140 return WriteEncryptedPkcs8(newPasswordBytes, asnWriter, pbeParameters);
141 }
142 catch (CryptographicException inner)
143 {
145 }
146 finally
147 {
149 }
150 }
151}
void WriteOctetString(ReadOnlySpan< byte > value, Asn1Tag? tag=null)
Definition AsnWriter.cs:904
Scope PushSequence(Asn1Tag? tag=null)
void CopyTo(AsnWriter destination)
Definition AsnWriter.cs:328
Scope PushOctetString(Asn1Tag? tag=null)
Definition AsnWriter.cs:892
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_Pkcs8_EncryptedReadFailed
Definition SR.cs:126
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 ArraySegment< byte > DecryptPkcs8(ReadOnlySpan< char > inputPassword, ReadOnlySpan< byte > inputPasswordBytes, ReadOnlyMemory< byte > source, out int bytesRead)
static ArraySegment< byte > DecryptPkcs8(ReadOnlySpan< char > inputPassword, ReadOnlyMemory< byte > source, out int bytesRead)
static ArraySegment< byte > DecryptPkcs8(ReadOnlySpan< byte > inputPasswordBytes, ReadOnlyMemory< byte > source, out int bytesRead)
static AsnWriter WriteEncryptedPkcs8(ReadOnlySpan< char > password, AsnWriter pkcs8Writer, PbeParameters pbeParameters)
static AsnWriter ReencryptPkcs8(ReadOnlySpan< char > inputPassword, ReadOnlyMemory< byte > current, ReadOnlySpan< char > newPassword, PbeParameters pbeParameters)
static AsnWriter WriteEncryptedPkcs8(ReadOnlySpan< byte > passwordBytes, AsnWriter pkcs8Writer, PbeParameters pbeParameters)
static AsnWriter WriteEncryptedPkcs8(ReadOnlySpan< char > password, ReadOnlySpan< byte > passwordBytes, AsnWriter pkcs8Writer, PbeParameters pbeParameters)
static AsnWriter WritePkcs8(AsnWriter algorithmIdentifierWriter, AsnWriter privateKeyWriter, AsnWriter attributesWriter=null)
static AsnWriter ReencryptPkcs8(ReadOnlySpan< char > inputPassword, ReadOnlyMemory< byte > current, ReadOnlySpan< byte > newPasswordBytes, PbeParameters pbeParameters)
static void InitiateEncryption(PbeParameters pbeParameters, out SymmetricAlgorithm cipher, out string hmacOid, out string encryptionAlgorithmOid, out bool isPkcs12)
static unsafe int Encrypt(ReadOnlySpan< char > password, ReadOnlySpan< byte > passwordBytes, SymmetricAlgorithm cipher, bool isPkcs12, AsnWriter source, PbeParameters pbeParameters, ReadOnlySpan< byte > salt, byte[] destination, Span< byte > ivDest)
static unsafe int Decrypt(in AlgorithmIdentifierAsn algorithmIdentifier, ReadOnlySpan< char > password, ReadOnlySpan< byte > passwordBytes, ReadOnlySpan< byte > encryptedData, Span< byte > destination)
static void WritePbeAlgorithmIdentifier(AsnWriter writer, bool isPkcs12, string encryptionAlgorithmOid, Span< byte > salt, int iterationCount, string hmacOid, Span< byte > iv)
ReadOnlySpan< byte > PeekEncodedValue()
unsafe ReadOnlySpan< T > Span
static void Decode(ref AsnValueReader reader, ReadOnlyMemory< byte > rebind, out EncryptedPrivateKeyInfoAsn decoded)