X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem.Security%2FSecureString.cs;h=765f61981df9a2f11fbca50627965f35295e4174;hb=468225a247b8897b2a4fa1e6bd7ffa32aa8c243b;hp=bc9f579e48b886d828427e29ca673f1d83824f07;hpb=b2262f41726a89c8209facb3ea9e4be9582422b5;p=mono.git diff --git a/mcs/class/corlib/System.Security/SecureString.cs b/mcs/class/corlib/System.Security/SecureString.cs index bc9f579e48b..765f61981df 100644 --- a/mcs/class/corlib/System.Security/SecureString.cs +++ b/mcs/class/corlib/System.Security/SecureString.cs @@ -26,18 +26,19 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // -#if NET_2_0 - using System.Globalization; +using System.Reflection; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.ConstrainedExecution; using System.Security.Cryptography; using System.Security.Permissions; +using System.Runtime.ExceptionServices; namespace System.Security { [MonoTODO ("work in progress - encryption is missing")] - public sealed class SecureString : CriticalFinalizerObject, IDisposable { + public sealed class SecureString : IDisposable { private const int BlockSize = 16; private const int MaxSize = 65536; @@ -88,6 +89,7 @@ namespace System.Security { } } + [HandleProcessCorruptedStateExceptions] public void AppendChar (char c) { if (disposed) @@ -128,6 +130,7 @@ namespace System.Security { { SecureString ss = new SecureString (); ss.data = (byte[]) data.Clone (); + ss.length = length; return ss; } @@ -143,6 +146,7 @@ namespace System.Security { length = 0; } + [HandleProcessCorruptedStateExceptions] public void InsertAt (int index, char c) { if (disposed) @@ -163,7 +167,7 @@ namespace System.Security { Decrypt (); Alloc (++length, true); int n = index * 2; - Buffer.BlockCopy (data, n, data, n + 2, data.Length - 2); + Buffer.BlockCopy (data, n, data, n + 2, data.Length - n - 2); data[n++] = (byte) (c >> 8); data[n] = (byte) c; } @@ -184,6 +188,7 @@ namespace System.Security { read_only = true; } + [HandleProcessCorruptedStateExceptions] public void RemoveAt (int index) { if (disposed) @@ -197,7 +202,7 @@ namespace System.Security { try { Decrypt (); - Buffer.BlockCopy (data, index + 1, data, index, data.Length - index - 1); + Buffer.BlockCopy (data, index * 2 + 2, data, index * 2, data.Length - index * 2 - 2); Alloc (--length, true); } finally { @@ -205,6 +210,7 @@ namespace System.Security { } } + [HandleProcessCorruptedStateExceptions] public void SetAt (int index, char c) { if (disposed) @@ -229,19 +235,31 @@ namespace System.Security { // internal/private stuff - [MonoTODO ("ProtectedMemory is in System.Security.dll - move this into the runtime/icall")] +// [MethodImplAttribute(MethodImplOptions.InternalCall)] +// extern static void EncryptInternal (byte [] data, object scope); + +// [MethodImplAttribute(MethodImplOptions.InternalCall)] +// extern static void DecryptInternal (byte [] data, object scope); + +// static readonly object scope = Enum.Parse ( +// Assembly.Load (Consts.AssemblySystem_Security) +// .GetType ("System.Security.Cryptography.MemoryProtectionScope"), "SameProcess"); + + // Note that ProtectedMemory is not supported on non-Windows environment right now. private void Encrypt () { if ((data != null) && (data.Length > 0)) { -// ProtectedMemory.Protect (data, MemoryProtectionScope.SameProcess); + // It somehow causes nunit test breakage + // EncryptInternal (data, scope); } } - [MonoTODO ("ProtectedMemory is in System.Security.dll - move this into the runtime/icall")] + // Note that ProtectedMemory is not supported on non-Windows environment right now. private void Decrypt () { if ((data != null) && (data.Length > 0)) { -// ProtectedMemory.Unprotect (data, MemoryProtectionScope.SameProcess); + // It somehow causes nunit test breakage + // DecryptInternal (data, scope); } } @@ -289,5 +307,3 @@ namespace System.Security { } } } - -#endif