//------------------------------------------------------------------------------ // // Copyright (c) Microsoft Corporation. All rights reserved. // //------------------------------------------------------------------------------ namespace System.Web.Util { using System; using System.Diagnostics.CodeAnalysis; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Web.Hosting; internal sealed class TlsTokenBindingHandle : HeapAllocHandle { [SuppressMessage("Microsoft.Reliability", "CA2006:UseSafeHandleToEncapsulateNativeResources", Justification = @"Pointer is valid while this SafeHandle is valid.")] private readonly IntPtr _providedTokenBlob; private readonly uint _providedTokenBlobSize; [SuppressMessage("Microsoft.Reliability", "CA2006:UseSafeHandleToEncapsulateNativeResources", Justification = @"Pointer is valid while this SafeHandle is valid.")] private readonly IntPtr _referredTokenBlob; private readonly uint _referredtokenBlobSize; internal TlsTokenBindingHandle(IntPtr mgdContext) { int hr = UnsafeIISMethods.MgdGetTlsTokenBindingIdentifiers( mgdContext, ref handle, out _providedTokenBlob, out _providedTokenBlobSize, out _referredTokenBlob, out _referredtokenBlobSize); Misc.ThrowIfFailedHr(hr); } public byte[] GetProvidedToken() { return GetTokenImpl(_providedTokenBlob, _providedTokenBlobSize); } public byte[] GetReferredToken() { return GetTokenImpl(_referredTokenBlob, _referredtokenBlobSize); } private byte[] GetTokenImpl(IntPtr blob, uint blobSize) { if (blob == IntPtr.Zero || blobSize == 0) { return null; } else { byte[] retVal = new byte[blobSize]; int length = retVal.Length; // checks for overflow bool refAdded = false; RuntimeHelpers.PrepareConstrainedRegions(); try { DangerousAddRef(ref refAdded); Marshal.Copy(blob, retVal, 0, length); } finally { if (refAdded) { DangerousRelease(); } } return retVal; } } } }