1 //------------------------------------------------------------------------------
2 // <copyright file="TlsTokenBindingHandle.cs" company="Microsoft">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
5 //------------------------------------------------------------------------------
7 namespace System.Web.Util {
9 using System.Diagnostics.CodeAnalysis;
10 using System.Runtime.CompilerServices;
11 using System.Runtime.InteropServices;
12 using System.Web.Hosting;
14 internal sealed class TlsTokenBindingHandle : HeapAllocHandle {
15 [SuppressMessage("Microsoft.Reliability", "CA2006:UseSafeHandleToEncapsulateNativeResources", Justification = @"Pointer is valid while this SafeHandle is valid.")]
16 private readonly IntPtr _providedTokenBlob;
17 private readonly uint _providedTokenBlobSize;
18 [SuppressMessage("Microsoft.Reliability", "CA2006:UseSafeHandleToEncapsulateNativeResources", Justification = @"Pointer is valid while this SafeHandle is valid.")]
19 private readonly IntPtr _referredTokenBlob;
20 private readonly uint _referredtokenBlobSize;
22 internal TlsTokenBindingHandle(IntPtr mgdContext) {
23 int hr = UnsafeIISMethods.MgdGetTlsTokenBindingIdentifiers(
26 out _providedTokenBlob,
27 out _providedTokenBlobSize,
28 out _referredTokenBlob,
29 out _referredtokenBlobSize);
30 Misc.ThrowIfFailedHr(hr);
33 public byte[] GetProvidedToken() {
34 return GetTokenImpl(_providedTokenBlob, _providedTokenBlobSize);
37 public byte[] GetReferredToken() {
38 return GetTokenImpl(_referredTokenBlob, _referredtokenBlobSize);
41 private byte[] GetTokenImpl(IntPtr blob, uint blobSize) {
42 if (blob == IntPtr.Zero || blobSize == 0) {
46 byte[] retVal = new byte[blobSize];
47 int length = retVal.Length; // checks for overflow
48 bool refAdded = false;
50 RuntimeHelpers.PrepareConstrainedRegions();
53 DangerousAddRef(ref refAdded);
54 Marshal.Copy(blob, retVal, 0, length);