Is ProtectedObject really secure? Otherwise, do you have any advice?
public class ProtectedBinary : IDisposable
{
private byte[] pBArray;
private int originPBArraySize;
public ProtectedBinary(byte[] data)
{
originPBArraySize = data.Length;
Pad(ref data);
ProtectedMemory.Protect(data, MemoryProtectionScope.SameProcess);
pBArray = new byte[data.Length];
Array.ConstrainedCopy(data, 0, pBArray, 0, data.Length);
}
public void Get(out byte[] outArray)
{
ProtectedMemory.Unprotect(pBArray, MemoryProtectionScope.SameProcess);
outArray = new byte[originPBArraySize];
Array.Copy(pBArray, outArray, originPBArraySize);
Unpad(ref outArray);
ProtectedMemory.Protect(pBArray, MemoryProtectionScope.SameProcess);
}
public void Clear()
{
pBArray.Clear(); // set all bytes to 0x00
originPBArraySize = 0;
}
public void Dispose()
{
Clear();
}
private void Pad(ref byte[] bytes)
{
Array.Resize(ref bytes, 16 * ((bytes.Length + 15) / 16));
}
private void Unpad(ref byte[] bytes)
{
Array.Resize(ref bytes, originPBArraySize);
}
}
public class ProtectedObject<T> : IDisposable
{
private ProtectedBinary pBin;
private bool isDisposed;
public ProtectedObject(T obj)
{
byte[] serializedObject = ULBinConvert.Serialize(obj);
pBin = new ProtectedBinary(serializedObject);
}
public void Get(out T obj)
{
if (isDisposed)
throw new ObjectDisposedException("Protected object is disposed");
byte[] serializedObject;
pBin.Get(out serializedObject);
obj = ULBinConvert.Deserialize<T>(serializedObject);
serializedObject.Clear();
}
public void Dispose()
{
if (!isDisposed)
{
pBin.Dispose();
isDisposed = true;
}
}
}
ProtectedMemory. \$\endgroup\$