Ik schreef in een vorige post dat ik van plan was om rond te neuzen met Weergavestaat, het uitbreiden van de dingen die ik heb gedaan op compressie in encryptie en ondertekening etc... Nou, er is goed en slecht nieuws voor dit plan. Het lijkt erop (onheil) dat de MAC en encryptie spullen daadwerkelijk worden behandeld in de LosWriter klasse; een interne klasse gebruikt door LosFormatter om het object serialisatie te doen... het gebruikt de volgende code om dit te doen (nogmaals dankzij de onmisbare Reflector) :
internal void CompleteTransforms(TextWriter output, bool enableMac, byte[] macKey)
{ int num1;
byte[] array1;
string text1;
char[] array2;
string text2;
num1 = 0;
if (this._recyclable)
{
this._byteBuffer = ((byte[]) LosWriter._byteBufferAllocator.GetBuffer());
if (this._freePos > 0)
{
num1 = Encoding.UTF8.GetBytes(this._charBuffer, 0, this._freePos, this._byteBuffer, 0);
}
if (enableMac)
{
array1 = MachineKey.GetEncodedData(this._byteBuffer, macKey, 0, &(num1));
text1 = Convert.ToBase64String(array1, 0, num1);
output.Write(text1);
return;
}
array2 = ((char[]) LosWriter._charBufferAllocatorBase64.GetBuffer());
num1 = Convert.ToBase64CharArray(this._byteBuffer, 0, num1, array2, 0);
output.Write(array2, 0, num1);
LosWriter._charBufferAllocatorBase64.ReuseBuffer(array2);
return;
}
this._byteBuffer = Encoding.UTF8.GetBytes(this._charBuffer, 0, this._freePos);
num1 = this._byteBuffer.Length;
if (enableMac)
{
this._byteBuffer = MachineKey.GetEncodedData(this._byteBuffer, macKey, 0, &(num1));
}
text2 = Convert.ToBase64String(this._byteBuffer);
output.Write(text2);
}
Zoals u waarschijnlijk kunt zien, behandelt deze code de toepassing van de MAC-sleutel en encryptie naar de geserialiseerde gegevens. Dit is de code die wordt gebruikt door de 'MachineKey' om de encryptie uit te voeren:
internal static byte[] EncryptOrDecryptData(bool fEncrypt, byte[] buf, byte[] modifier, int start, int length)
{ MemoryStream stream1;
ICryptoTransform transform1;
CryptoStream stream2;
byte[] array1;
byte[] array2;
MachineKey.EnsureConfig();
stream1 = new MemoryStream();
transform1 = MachineKey.GetCryptoTransform(fEncrypt);
stream2 = new CryptoStream(stream1, transform1, 1);
stream2.Write(buf, start, length);
if (fEncrypt && (modifier != null))
{
stream2.Write(modifier, 0, modifier.Length);
}
stream2.FlushFinalBlock();
array1 = stream1.ToArray();
stream2.Close();
MachineKey.ReturnCryptoTransform(fEncrypt, transform1);
if (!fEncrypt && (modifier != null))
{
array2 = new byte[((uint) (array1.Length - modifier.Length))];
Buffer.BlockCopy(array1, 0, array2, 0, array2.Length);
array1 = array2;
}
return array1;
}
Helaas betekent dit dat ik ofwel moet spelen over met reflectie / dump de bron van Refelector / volledig opnieuw uitvinden hoe dit werkt om veel verder te gaan met mijn ViewState knutselen, god het zou leuk zijn geweest als dit spul werd gedaan met een Fabriek oorspronkelijk...guess ze dachten niet dat iemand zou zijn gek genoeg om te willen spelen met het ...:-)
Ik zal uiteindelijk moeten toegeven en eigenlijk een artikel schrijven een dezer dagen... probleem voor mij is het structureren van het ding, zodat het leesbaar is voor niet-obsessieve mensen...
© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.