예제 #1
0
        public static void SafeNCryptKeyHandle_ValidKey_ParentHandle_KeptAlive()
        {
            // NCryptFreeObject will check dwMagic values to determine what kind of object
            // it was given.  Since we don't really want to leak a key in this test we'll
            // track a test-local buffer.
            IntPtr fakeKeyPtr = Marshal.AllocHGlobal(512);

            try
            {
                Marshal.WriteInt32(fakeKeyPtr, 0);

                using (SafeHandle parentHandle = new StateInformingSafeHandle())
                {
                    using (var keyHandle = new SafeNCryptKeyHandle(fakeKeyPtr, parentHandle))
                    {
                        Assert.False(parentHandle.IsInvalid, "After ctor, parentHandle.IsInvalid");
                        Assert.False(parentHandle.IsClosed, "After ctor, parentHandle.IsClosed");

                        parentHandle.Dispose();

                        Assert.False(parentHandle.IsInvalid, "After parentHandle.Dispose, parentHandle.IsInvalid");
                        Assert.False(parentHandle.IsClosed, "After parentHandle.Dispose, parentHandle.IsClosed");
                    }

                    Assert.True(parentHandle.IsInvalid, "After keyHandle.Dispose, parentHandle.IsInvalid");
                    Assert.True(parentHandle.IsClosed, "After keyHandle.Dispose, parentHandle.IsClosed");
                }
            }
            finally
            {
                Marshal.FreeHGlobal(fakeKeyPtr);
            }
        }
예제 #2
0
        public static void SafeNCryptKeyHandle_ParentHandle_Invalid()
        {
            Assert.Throws <ArgumentNullException>(() => new SafeNCryptKeyHandle(IntPtr.Zero, null));

            using (SafeHandle openButInvalid = new StateInformingSafeHandle(false))
                using (SafeHandle closedAndInvalid = new StateInformingSafeHandle())
                    using (SafeHandle closedButValid = new StateInformingSafeHandle(true, false))
                    {
                        closedAndInvalid.Dispose();
                        closedButValid.Dispose();

                        // Preconditions.
                        Assert.False(openButInvalid.IsClosed, "openButInvalid.IsClosed");
                        Assert.True(openButInvalid.IsInvalid, "openButInvalid.IsInvalid");
                        Assert.True(closedButValid.IsClosed, "closedButValid.IsClosed");
                        Assert.False(closedButValid.IsInvalid, "closedButValid.IsInvalid");
                        Assert.True(closedAndInvalid.IsClosed, "closedAndInvalid.IsClosed");
                        Assert.True(closedAndInvalid.IsInvalid, "closedAndInvalid.IsInvalid");

                        // Tests
                        AssertExtensions.Throws <ArgumentException>("parentHandle", () => new SafeNCryptKeyHandle(IntPtr.Zero, openButInvalid));
                        AssertExtensions.Throws <ArgumentException>("parentHandle", () => new SafeNCryptKeyHandle(IntPtr.Zero, closedButValid));
                        AssertExtensions.Throws <ArgumentException>("parentHandle", () => new SafeNCryptKeyHandle(IntPtr.Zero, closedAndInvalid));
                    }
        }
예제 #3
0
        public static void SafeNCryptKeyHandle_ParentHandle_Invalid()
        {
            Assert.Throws<ArgumentNullException>(() => new SafeNCryptKeyHandle(IntPtr.Zero, null));

            using (SafeHandle openButInvalid = new StateInformingSafeHandle(false))
            using (SafeHandle closedAndInvalid = new StateInformingSafeHandle())
            using (SafeHandle closedButValid = new StateInformingSafeHandle(true, false))
            {
                closedAndInvalid.Dispose();
                closedButValid.Dispose();

                // Preconditions.
                Assert.False(openButInvalid.IsClosed, "openButInvalid.IsClosed");
                Assert.True(openButInvalid.IsInvalid, "openButInvalid.IsInvalid");
                Assert.True(closedButValid.IsClosed, "closedButValid.IsClosed");
                Assert.False(closedButValid.IsInvalid, "closedButValid.IsInvalid");
                Assert.True(closedAndInvalid.IsClosed, "closedAndInvalid.IsClosed");
                Assert.True(closedAndInvalid.IsInvalid, "closedAndInvalid.IsInvalid");

                // Tests
                Assert.Throws<ArgumentException>(() => new SafeNCryptKeyHandle(IntPtr.Zero, openButInvalid));
                Assert.Throws<ArgumentException>(() => new SafeNCryptKeyHandle(IntPtr.Zero, closedButValid));
                Assert.Throws<ArgumentException>(() => new SafeNCryptKeyHandle(IntPtr.Zero, closedAndInvalid));
            }
        }
예제 #4
0
        public static void SafeNCryptKeyHandle_InvalidKey_ParentHandle_NotKeptAlive()
        {
            using (SafeHandle parentHandle = new StateInformingSafeHandle())
                using (var keyHandle = new SafeNCryptKeyHandle(IntPtr.Zero, parentHandle))
                {
                    Assert.False(parentHandle.IsInvalid, "After ctor, parentHandle.IsInvalid");
                    Assert.False(parentHandle.IsClosed, "After ctor, parentHandle.IsClosed");

                    parentHandle.Dispose();

                    Assert.True(parentHandle.IsInvalid, "After parentHandle.Dispose, parentHandle.IsInvalid");
                    Assert.True(parentHandle.IsClosed, "After parentHandle.Dispose, parentHandle.IsClosed");
                }
        }
예제 #5
0
        public static void SafeNCryptKeyHandle_InvalidKey_ParentHandle_NotKeptAlive()
        {
            using (SafeHandle parentHandle = new StateInformingSafeHandle())
            using (var keyHandle = new SafeNCryptKeyHandle(IntPtr.Zero, parentHandle))
            {
                Assert.False(parentHandle.IsInvalid, "After ctor, parentHandle.IsInvalid");
                Assert.False(parentHandle.IsClosed, "After ctor, parentHandle.IsClosed");

                parentHandle.Dispose();

                Assert.True(parentHandle.IsInvalid, "After parentHandle.Dispose, parentHandle.IsInvalid");
                Assert.True(parentHandle.IsClosed, "After parentHandle.Dispose, parentHandle.IsClosed");
            }
        }
예제 #6
0
        public static void SafeNCryptKeyHandle_ValidKey_ParentHandle_KeptAlive()
        {
            // NCryptFreeObject will check dwMagic values to determine what kind of object
            // it was given.  Since we don't really want to leak a key in this test we'll
            // track a test-local buffer.
            IntPtr fakeKeyPtr = Marshal.AllocHGlobal(512);
            try
            {
                Marshal.WriteInt32(fakeKeyPtr, 0);

                using (SafeHandle parentHandle = new StateInformingSafeHandle())
                {
                    using (var keyHandle = new SafeNCryptKeyHandle(fakeKeyPtr, parentHandle))
                    {
                        Assert.False(parentHandle.IsInvalid, "After ctor, parentHandle.IsInvalid");
                        Assert.False(parentHandle.IsClosed, "After ctor, parentHandle.IsClosed");

                        parentHandle.Dispose();

                        Assert.False(parentHandle.IsInvalid, "After parentHandle.Dispose, parentHandle.IsInvalid");
                        Assert.False(parentHandle.IsClosed, "After parentHandle.Dispose, parentHandle.IsClosed");
                    }

                    Assert.True(parentHandle.IsInvalid, "After keyHandle.Dispose, parentHandle.IsInvalid");
                    Assert.True(parentHandle.IsClosed, "After keyHandle.Dispose, parentHandle.IsClosed");
                }
            }
            finally
            {
                Marshal.FreeHGlobal(fakeKeyPtr);
            }
        }