Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WCF / infocard / Client / System / IdentityModel / Selectors / CardSpaceShim.cs / 1305376 / CardSpaceShim.cs
//------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
namespace System.IdentityModel.Selectors
{
using System;
using System.IO;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.IdentityModel.Claims;
using System.Text;
using System.Xml;
using System.IdentityModel.Tokens;
using System.ServiceProcess;
using System.Globalization;
using System.Runtime.ConstrainedExecution;
using System.Runtime.CompilerServices;
using Microsoft.InfoCards.Diagnostics;
using Microsoft.Win32;
using System.Text.RegularExpressions;
using IDT = Microsoft.InfoCards.Diagnostics.InfoCardTrace;
//
// For common & resources
//
using Microsoft.InfoCards;
using System.Security;
//
// Summary:
// If v2 is installed, this class will route calls to the native dll that was installed with v2.
// This class essentially mimics the behavior in CSD Main 58552 which has been checked into the .Net branch for Win7
//
class CardSpaceShim
{
private const string REDIRECT_DLL_REG_KEY = @"software\microsoft\cardspace\v1";
private const string REDIRECT_DLL_IMPLEMENTATION_VALUE = "ImplementationDLL";
private const string REDIRECT_DLL_IMPLEMENTATION_VALUE_DEFAULT = "infocardapi2";
private const string REDIRECT_DLL_CARDSPACE_V1 = "infocardapi";
private object m_syncRoot = new Object();
private bool m_isInitialized = false;
//
// Delegates defined as public for convenience in invocation
//
public CsV2ManageCardSpace m_csShimManageCardSpace;
public CsV2GetToken m_csShimGetToken;
public CsV2ImportInformationCard m_csShimImportInformationCard;
public CsV2Encrypt m_csShimEncrypt;
public CsV2Decrypt m_csShimDecrypt;
public CsV2SignHash m_csShimSignHash;
public CsV2VerifyHash m_csShimVerifyHash;
public CsV2GenerateDerivedKey m_csShimGenerateDerivedKey;
public CsV2GetCryptoTransform m_csShimGetCryptoTransform;
public CsV2TransformBlock m_csShimTransformBlock;
public CsV2TransformFinalBlock m_csShimTransformFinalBlock;
public CsV2GetKeyedHash m_csShimGetKeyedHash;
public CsV2HashCore m_csShimHashCore;
public CsV2HashFinal m_csShimHashFinal;
public CsV2FreeToken m_csShimFreeToken;
public CsV2CloseCryptoHandle m_csShimCloseCryptoHandle;
SafeLibraryHandle m_implementationDll;
//
// GetBrowserToken not required because that is accomplished via Pheonix bit etc. (not exposed thru
// managed interface).
//
//
// Summary:
// Performs initialization of the CardSpaceShim if necessary.
// The v1 service will only allow one request from the user,
// however locking anyway in case we change our behavior in v2.
//
public void InitializeIfNecessary()
{
if( !m_isInitialized )
{
lock( m_syncRoot )
{
if( !m_isInitialized )
{
string implDllPath = GetCardSpaceImplementationDll();
m_implementationDll = SafeLibraryHandle.LoadLibraryW( implDllPath );
if ( m_implementationDll.IsInvalid )
{
throw NativeMethods.ThrowWin32ExceptionWithContext( new Win32Exception(), implDllPath );
}
try
{
//
// Functions are listed in alphabetical order
//
IntPtr procaddr1 = NativeMethods.GetProcAddressWrapper( m_implementationDll, "CloseCryptoHandle" );
m_csShimCloseCryptoHandle =
( CsV2CloseCryptoHandle ) Marshal.GetDelegateForFunctionPointer(
procaddr1, typeof( CsV2CloseCryptoHandle ) );
IntPtr procaddr2 = NativeMethods.GetProcAddressWrapper(
m_implementationDll, "Decrypt" );
m_csShimDecrypt =
( CsV2Decrypt )Marshal.GetDelegateForFunctionPointer(
procaddr2, typeof( CsV2Decrypt ) );
IntPtr procaddr3 = NativeMethods.GetProcAddressWrapper( m_implementationDll, "Encrypt" );
m_csShimEncrypt =
( CsV2Encrypt )Marshal.GetDelegateForFunctionPointer(
procaddr3, typeof( CsV2Encrypt ) );
IntPtr procaddr4 = NativeMethods.GetProcAddressWrapper( m_implementationDll, "FreeToken" );
m_csShimFreeToken =
( CsV2FreeToken )Marshal.GetDelegateForFunctionPointer(
procaddr4, typeof( CsV2FreeToken ) );
IntPtr procaddr5 = NativeMethods.GetProcAddressWrapper(m_implementationDll, "GenerateDerivedKey");
m_csShimGenerateDerivedKey =
( CsV2GenerateDerivedKey ) Marshal.GetDelegateForFunctionPointer(
procaddr5, typeof( CsV2GenerateDerivedKey ) );
IntPtr procaddr6 = NativeMethods.GetProcAddressWrapper( m_implementationDll, "GetCryptoTransform" );
m_csShimGetCryptoTransform =
( CsV2GetCryptoTransform ) Marshal.GetDelegateForFunctionPointer(
procaddr6, typeof( CsV2GetCryptoTransform ) );
IntPtr procaddr7 = NativeMethods.GetProcAddressWrapper( m_implementationDll, "GetKeyedHash" );
m_csShimGetKeyedHash =
( CsV2GetKeyedHash ) Marshal.GetDelegateForFunctionPointer(
procaddr7, typeof( CsV2GetKeyedHash ) );
IntPtr procaddr8 = NativeMethods.GetProcAddressWrapper( m_implementationDll, "GetToken" );
m_csShimGetToken =
( CsV2GetToken ) Marshal.GetDelegateForFunctionPointer(
procaddr8, typeof( CsV2GetToken ) );
IntPtr procaddr9 = NativeMethods.GetProcAddressWrapper( m_implementationDll, "HashCore" );
m_csShimHashCore =
( CsV2HashCore ) Marshal.GetDelegateForFunctionPointer(
procaddr9, typeof( CsV2HashCore ) );
IntPtr procaddr10 = NativeMethods.GetProcAddressWrapper( m_implementationDll, "HashFinal" );
m_csShimHashFinal =
( CsV2HashFinal ) Marshal.GetDelegateForFunctionPointer(
procaddr10, typeof( CsV2HashFinal ) );
IntPtr procaddr11 = NativeMethods.GetProcAddressWrapper( m_implementationDll, "ImportInformationCard" );
m_csShimImportInformationCard =
( CsV2ImportInformationCard ) Marshal.GetDelegateForFunctionPointer(
procaddr11, typeof( CsV2ImportInformationCard ) );
IntPtr procaddr12 = NativeMethods.GetProcAddressWrapper( m_implementationDll, "ManageCardSpace" );
m_csShimManageCardSpace =
( CsV2ManageCardSpace ) Marshal.GetDelegateForFunctionPointer(
procaddr12, typeof( CsV2ManageCardSpace ) );
IntPtr procaddr13 = NativeMethods.GetProcAddressWrapper( m_implementationDll, "SignHash" );
m_csShimSignHash =
( CsV2SignHash ) Marshal.GetDelegateForFunctionPointer(
procaddr13, typeof( CsV2SignHash ) );
IntPtr procaddr14 = NativeMethods.GetProcAddressWrapper( m_implementationDll, "TransformBlock" );
m_csShimTransformBlock =
( CsV2TransformBlock ) Marshal.GetDelegateForFunctionPointer(
procaddr14, typeof( CsV2TransformBlock ) );
IntPtr procaddr15 = NativeMethods.GetProcAddressWrapper( m_implementationDll, "TransformFinalBlock" );
m_csShimTransformFinalBlock =
( CsV2TransformFinalBlock ) Marshal.GetDelegateForFunctionPointer(
procaddr15, typeof( CsV2TransformFinalBlock ) );
IntPtr procaddr16 = NativeMethods.GetProcAddressWrapper( m_implementationDll, "VerifyHash" );
m_csShimVerifyHash =
( CsV2VerifyHash ) Marshal.GetDelegateForFunctionPointer(
procaddr16, typeof( CsV2VerifyHash ) );
}
catch( Win32Exception )
{
//
// NB: IDT.ThrowHelperError would have logged for the Win32Exception
//
IDT.Assert( !m_isInitialized, "If an exception occurred, we expect this to be false" );
throw;
}
m_isInitialized = true;
}
}
}
}
//
// Summary:
// Returns true if fileName has only alphanumeric characters
//
bool IsSafeFile( string fileName )
{
//
// If any match from outside the range of [A-Za-z0-9] then we will not use this file
//
return Regex.IsMatch( fileName, "^[A-Za-z0-9]+$" );
}
//
// Summary:
// Return the path to the v2 (or a version above v2) implementation dll.
// We expect this to be infocardapi2.dll unless overriden by a registry key
//
// Remarks: It is left upto the caller to check if the v2+ implementation
// dll actually exists or not.
//
private string GetV2ImplementationDllPath()
{
string v2AndAboveImplementationDll = String.Empty;
//
// First look in the registry key to see if this is defined
//
using( RegistryKey implDllKey = Registry.LocalMachine.OpenSubKey( REDIRECT_DLL_REG_KEY ) )
{
if ( null != implDllKey )
{
v2AndAboveImplementationDll = ( string )implDllKey.GetValue( REDIRECT_DLL_IMPLEMENTATION_VALUE );
if ( !String.IsNullOrEmpty( v2AndAboveImplementationDll ) )
{
string v2RegPath = Path.Combine(
Environment.GetFolderPath( Environment.SpecialFolder.System ),
v2AndAboveImplementationDll + ".dll" );
//
// Is the filename safe (use alphanumeric like the CSD Main 58552). Does it exist?
// If not, discard the registry key we just read.
//
if ( !IsSafeFile( v2AndAboveImplementationDll ) || !File.Exists( v2RegPath ) )
{
v2AndAboveImplementationDll = String.Empty;
}
}
}
}
//
// If reg key was not found or not safe, or value was not found, or found to be empty,
// then use the default of infocardapi2.dll
//
if( String.IsNullOrEmpty( v2AndAboveImplementationDll ) )
{
v2AndAboveImplementationDll = REDIRECT_DLL_IMPLEMENTATION_VALUE_DEFAULT;
}
IDT.Assert( !String.IsNullOrEmpty( v2AndAboveImplementationDll ), "v2AndAboveImplementationDll should not be empty" );
//
// Get the full path to the v2Above dll
//
return Path.Combine(
Environment.GetFolderPath( Environment.SpecialFolder.System ),
v2AndAboveImplementationDll + ".dll" );
}
//
// Summary:
// Return handle to the CardSpace implementation dll.
// We will first check to see if a v2 (or above) redirection dll has been installed.
// If not we will check to see if the v1 infocardapi.dll is installed.
// If that's not found as well, an exception is thrown
//
private string GetCardSpaceImplementationDll()
{
string implDllFullPath = GetV2ImplementationDllPath();
if( !File.Exists( implDllFullPath ) )
{
//
// Choose infocardapi.dll, if v2+ dll does not exist
//
implDllFullPath = Path.Combine(
Environment.GetFolderPath( Environment.SpecialFolder.System ),
REDIRECT_DLL_CARDSPACE_V1 + ".dll" );
if( !File.Exists( implDllFullPath ) )
{
//
// If this does not exist either, then even CardSpace v1 is NOT installed
// on this machine. Note: Throwing an exception using IDT.ThrowHelperError
// does not log to event log unless it derives from InfoCardBaseException.
// This seems fine given that we don't want to be logging as "CardSpace X.0.0.0",
// rather we'll let the client application log to event log if desired.
//
throw IDT.ThrowHelperError(
new CardSpaceException( SR.GetString( SR.ClientAPIServiceNotInstalledError ) ) );
}
}
return implDllFullPath;
}
//
// Delegate definitions ported from NativeMethods.cs
//
internal delegate System.Int32 CsV2ManageCardSpace();
//[ReliabilityContract( Consistency.WillNotCorruptState, Cer.MayFail )]
internal delegate System.Int32 CsV2GetToken(
int cPolicyChain,
SafeHandle pPolicyChain,
out SafeTokenHandle securityToken,
out InternalRefCountedHandle pCryptoHandle);
internal delegate System.Int32 CsV2ImportInformationCard(
[MarshalAs( UnmanagedType.LPWStr )]
string nativeFileName);
//[ReliabilityContract( Consistency.WillNotCorruptState, Cer.MayFail )]
internal delegate int CsV2Encrypt(
InternalRefCountedHandle nativeCryptoHandle,
bool fOAEP,
[MarshalAs( UnmanagedType.U4 )]
int cbInData,
SafeHandle pInData,
[MarshalAs( UnmanagedType.U4 )]
out int pcbOutData,
out GlobalAllocSafeHandle pOutData);
//[ReliabilityContract( Consistency.WillNotCorruptState, Cer.MayFail )]
internal delegate int CsV2Decrypt(
InternalRefCountedHandle nativeCryptoHandle,
bool fOAEP,
[MarshalAs( UnmanagedType.U4 )]
int cbInData,
SafeHandle pInData,
[MarshalAs( UnmanagedType.U4 )]
out int pcbOutData,
out GlobalAllocSafeHandle pOutData);
//[ReliabilityContract( Consistency.WillNotCorruptState, Cer.MayFail )]
internal delegate int CsV2SignHash(
InternalRefCountedHandle nativeCryptoHandle,
[MarshalAs( UnmanagedType.U4 )]
int cbHash,
SafeHandle pInData,
SafeHandle pHashAlgOid,
[MarshalAs( UnmanagedType.U4 )]
out int pcbSig,
out GlobalAllocSafeHandle pSig);
//[ReliabilityContract( Consistency.WillNotCorruptState, Cer.MayFail )]
internal delegate int CsV2VerifyHash(
InternalRefCountedHandle nativeCryptoHandle,
[MarshalAs( UnmanagedType.U4 )]
int cbHash,
SafeHandle pInData,
SafeHandle pHashAlgOid,
[MarshalAs( UnmanagedType.U4 )]
int pcbSig,
SafeHandle pSig,
out bool verified);
//[ReliabilityContract( Consistency.WillNotCorruptState, Cer.MayFail )]
internal delegate int CsV2GenerateDerivedKey(InternalRefCountedHandle nativeCryptoHandle,
int cbLabel,
SafeHandle pLabel,
int cbNonce,
SafeHandle pNonce,
int derivedKeyLength,
int offset,
[MarshalAs( UnmanagedType.LPWStr )]
string derivationAlgUri,
out int cbDerivedKey,
out GlobalAllocSafeHandle pDerivedKey);
//[ReliabilityContract( Consistency.WillNotCorruptState, Cer.MayFail )]
internal delegate int CsV2GetCryptoTransform(
InternalRefCountedHandle nativeCryptoHandle,
int mode,
int padding,
int feedbackSize,
int direction,
int cbIV,
SafeHandle pIV,
out InternalRefCountedHandle nativeTransformHandle);
//[ReliabilityContract( Consistency.WillNotCorruptState, Cer.MayFail )]
internal delegate int CsV2TransformBlock(InternalRefCountedHandle nativeCryptoHandle,
int cbInData,
SafeHandle pInData,
out int cbOutData,
out GlobalAllocSafeHandle pOutData);
//[ReliabilityContract( Consistency.WillNotCorruptState, Cer.MayFail )]
internal delegate int CsV2TransformFinalBlock(InternalRefCountedHandle nativeCryptoHandle,
int cbInData,
SafeHandle pInData,
out int cbOutData,
out GlobalAllocSafeHandle pOutData);
//[ReliabilityContract( Consistency.WillNotCorruptState, Cer.MayFail )]
internal delegate int CsV2GetKeyedHash(
InternalRefCountedHandle nativeCryptoHandle,
out InternalRefCountedHandle nativeHashHandle);
//[ReliabilityContract( Consistency.WillNotCorruptState, Cer.MayFail )]
internal delegate int CsV2HashCore(InternalRefCountedHandle nativeCryptoHandle,
int cbInData,
SafeHandle pInData);
//[ReliabilityContract( Consistency.WillNotCorruptState, Cer.MayFail )]
internal delegate int CsV2HashFinal(InternalRefCountedHandle nativeCryptoHandle,
int cbInData,
SafeHandle pInData,
out int cbOutData,
out GlobalAllocSafeHandle pOutData);
[SuppressUnmanagedCodeSecurity]
//[ReliabilityContract( Consistency.WillNotCorruptState, Cer.Success )]
internal delegate bool CsV2CloseCryptoHandle([In] IntPtr hKey);
[SuppressUnmanagedCodeSecurity]
//[ReliabilityContract( Consistency.WillNotCorruptState, Cer.Success )]
internal delegate System.Int32 CsV2FreeToken([In] IntPtr token);
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
namespace System.IdentityModel.Selectors
{
using System;
using System.IO;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.IdentityModel.Claims;
using System.Text;
using System.Xml;
using System.IdentityModel.Tokens;
using System.ServiceProcess;
using System.Globalization;
using System.Runtime.ConstrainedExecution;
using System.Runtime.CompilerServices;
using Microsoft.InfoCards.Diagnostics;
using Microsoft.Win32;
using System.Text.RegularExpressions;
using IDT = Microsoft.InfoCards.Diagnostics.InfoCardTrace;
//
// For common & resources
//
using Microsoft.InfoCards;
using System.Security;
//
// Summary:
// If v2 is installed, this class will route calls to the native dll that was installed with v2.
// This class essentially mimics the behavior in CSD Main 58552 which has been checked into the .Net branch for Win7
//
class CardSpaceShim
{
private const string REDIRECT_DLL_REG_KEY = @"software\microsoft\cardspace\v1";
private const string REDIRECT_DLL_IMPLEMENTATION_VALUE = "ImplementationDLL";
private const string REDIRECT_DLL_IMPLEMENTATION_VALUE_DEFAULT = "infocardapi2";
private const string REDIRECT_DLL_CARDSPACE_V1 = "infocardapi";
private object m_syncRoot = new Object();
private bool m_isInitialized = false;
//
// Delegates defined as public for convenience in invocation
//
public CsV2ManageCardSpace m_csShimManageCardSpace;
public CsV2GetToken m_csShimGetToken;
public CsV2ImportInformationCard m_csShimImportInformationCard;
public CsV2Encrypt m_csShimEncrypt;
public CsV2Decrypt m_csShimDecrypt;
public CsV2SignHash m_csShimSignHash;
public CsV2VerifyHash m_csShimVerifyHash;
public CsV2GenerateDerivedKey m_csShimGenerateDerivedKey;
public CsV2GetCryptoTransform m_csShimGetCryptoTransform;
public CsV2TransformBlock m_csShimTransformBlock;
public CsV2TransformFinalBlock m_csShimTransformFinalBlock;
public CsV2GetKeyedHash m_csShimGetKeyedHash;
public CsV2HashCore m_csShimHashCore;
public CsV2HashFinal m_csShimHashFinal;
public CsV2FreeToken m_csShimFreeToken;
public CsV2CloseCryptoHandle m_csShimCloseCryptoHandle;
SafeLibraryHandle m_implementationDll;
//
// GetBrowserToken not required because that is accomplished via Pheonix bit etc. (not exposed thru
// managed interface).
//
//
// Summary:
// Performs initialization of the CardSpaceShim if necessary.
// The v1 service will only allow one request from the user,
// however locking anyway in case we change our behavior in v2.
//
public void InitializeIfNecessary()
{
if( !m_isInitialized )
{
lock( m_syncRoot )
{
if( !m_isInitialized )
{
string implDllPath = GetCardSpaceImplementationDll();
m_implementationDll = SafeLibraryHandle.LoadLibraryW( implDllPath );
if ( m_implementationDll.IsInvalid )
{
throw NativeMethods.ThrowWin32ExceptionWithContext( new Win32Exception(), implDllPath );
}
try
{
//
// Functions are listed in alphabetical order
//
IntPtr procaddr1 = NativeMethods.GetProcAddressWrapper( m_implementationDll, "CloseCryptoHandle" );
m_csShimCloseCryptoHandle =
( CsV2CloseCryptoHandle ) Marshal.GetDelegateForFunctionPointer(
procaddr1, typeof( CsV2CloseCryptoHandle ) );
IntPtr procaddr2 = NativeMethods.GetProcAddressWrapper(
m_implementationDll, "Decrypt" );
m_csShimDecrypt =
( CsV2Decrypt )Marshal.GetDelegateForFunctionPointer(
procaddr2, typeof( CsV2Decrypt ) );
IntPtr procaddr3 = NativeMethods.GetProcAddressWrapper( m_implementationDll, "Encrypt" );
m_csShimEncrypt =
( CsV2Encrypt )Marshal.GetDelegateForFunctionPointer(
procaddr3, typeof( CsV2Encrypt ) );
IntPtr procaddr4 = NativeMethods.GetProcAddressWrapper( m_implementationDll, "FreeToken" );
m_csShimFreeToken =
( CsV2FreeToken )Marshal.GetDelegateForFunctionPointer(
procaddr4, typeof( CsV2FreeToken ) );
IntPtr procaddr5 = NativeMethods.GetProcAddressWrapper(m_implementationDll, "GenerateDerivedKey");
m_csShimGenerateDerivedKey =
( CsV2GenerateDerivedKey ) Marshal.GetDelegateForFunctionPointer(
procaddr5, typeof( CsV2GenerateDerivedKey ) );
IntPtr procaddr6 = NativeMethods.GetProcAddressWrapper( m_implementationDll, "GetCryptoTransform" );
m_csShimGetCryptoTransform =
( CsV2GetCryptoTransform ) Marshal.GetDelegateForFunctionPointer(
procaddr6, typeof( CsV2GetCryptoTransform ) );
IntPtr procaddr7 = NativeMethods.GetProcAddressWrapper( m_implementationDll, "GetKeyedHash" );
m_csShimGetKeyedHash =
( CsV2GetKeyedHash ) Marshal.GetDelegateForFunctionPointer(
procaddr7, typeof( CsV2GetKeyedHash ) );
IntPtr procaddr8 = NativeMethods.GetProcAddressWrapper( m_implementationDll, "GetToken" );
m_csShimGetToken =
( CsV2GetToken ) Marshal.GetDelegateForFunctionPointer(
procaddr8, typeof( CsV2GetToken ) );
IntPtr procaddr9 = NativeMethods.GetProcAddressWrapper( m_implementationDll, "HashCore" );
m_csShimHashCore =
( CsV2HashCore ) Marshal.GetDelegateForFunctionPointer(
procaddr9, typeof( CsV2HashCore ) );
IntPtr procaddr10 = NativeMethods.GetProcAddressWrapper( m_implementationDll, "HashFinal" );
m_csShimHashFinal =
( CsV2HashFinal ) Marshal.GetDelegateForFunctionPointer(
procaddr10, typeof( CsV2HashFinal ) );
IntPtr procaddr11 = NativeMethods.GetProcAddressWrapper( m_implementationDll, "ImportInformationCard" );
m_csShimImportInformationCard =
( CsV2ImportInformationCard ) Marshal.GetDelegateForFunctionPointer(
procaddr11, typeof( CsV2ImportInformationCard ) );
IntPtr procaddr12 = NativeMethods.GetProcAddressWrapper( m_implementationDll, "ManageCardSpace" );
m_csShimManageCardSpace =
( CsV2ManageCardSpace ) Marshal.GetDelegateForFunctionPointer(
procaddr12, typeof( CsV2ManageCardSpace ) );
IntPtr procaddr13 = NativeMethods.GetProcAddressWrapper( m_implementationDll, "SignHash" );
m_csShimSignHash =
( CsV2SignHash ) Marshal.GetDelegateForFunctionPointer(
procaddr13, typeof( CsV2SignHash ) );
IntPtr procaddr14 = NativeMethods.GetProcAddressWrapper( m_implementationDll, "TransformBlock" );
m_csShimTransformBlock =
( CsV2TransformBlock ) Marshal.GetDelegateForFunctionPointer(
procaddr14, typeof( CsV2TransformBlock ) );
IntPtr procaddr15 = NativeMethods.GetProcAddressWrapper( m_implementationDll, "TransformFinalBlock" );
m_csShimTransformFinalBlock =
( CsV2TransformFinalBlock ) Marshal.GetDelegateForFunctionPointer(
procaddr15, typeof( CsV2TransformFinalBlock ) );
IntPtr procaddr16 = NativeMethods.GetProcAddressWrapper( m_implementationDll, "VerifyHash" );
m_csShimVerifyHash =
( CsV2VerifyHash ) Marshal.GetDelegateForFunctionPointer(
procaddr16, typeof( CsV2VerifyHash ) );
}
catch( Win32Exception )
{
//
// NB: IDT.ThrowHelperError would have logged for the Win32Exception
//
IDT.Assert( !m_isInitialized, "If an exception occurred, we expect this to be false" );
throw;
}
m_isInitialized = true;
}
}
}
}
//
// Summary:
// Returns true if fileName has only alphanumeric characters
//
bool IsSafeFile( string fileName )
{
//
// If any match from outside the range of [A-Za-z0-9] then we will not use this file
//
return Regex.IsMatch( fileName, "^[A-Za-z0-9]+$" );
}
//
// Summary:
// Return the path to the v2 (or a version above v2) implementation dll.
// We expect this to be infocardapi2.dll unless overriden by a registry key
//
// Remarks: It is left upto the caller to check if the v2+ implementation
// dll actually exists or not.
//
private string GetV2ImplementationDllPath()
{
string v2AndAboveImplementationDll = String.Empty;
//
// First look in the registry key to see if this is defined
//
using( RegistryKey implDllKey = Registry.LocalMachine.OpenSubKey( REDIRECT_DLL_REG_KEY ) )
{
if ( null != implDllKey )
{
v2AndAboveImplementationDll = ( string )implDllKey.GetValue( REDIRECT_DLL_IMPLEMENTATION_VALUE );
if ( !String.IsNullOrEmpty( v2AndAboveImplementationDll ) )
{
string v2RegPath = Path.Combine(
Environment.GetFolderPath( Environment.SpecialFolder.System ),
v2AndAboveImplementationDll + ".dll" );
//
// Is the filename safe (use alphanumeric like the CSD Main 58552). Does it exist?
// If not, discard the registry key we just read.
//
if ( !IsSafeFile( v2AndAboveImplementationDll ) || !File.Exists( v2RegPath ) )
{
v2AndAboveImplementationDll = String.Empty;
}
}
}
}
//
// If reg key was not found or not safe, or value was not found, or found to be empty,
// then use the default of infocardapi2.dll
//
if( String.IsNullOrEmpty( v2AndAboveImplementationDll ) )
{
v2AndAboveImplementationDll = REDIRECT_DLL_IMPLEMENTATION_VALUE_DEFAULT;
}
IDT.Assert( !String.IsNullOrEmpty( v2AndAboveImplementationDll ), "v2AndAboveImplementationDll should not be empty" );
//
// Get the full path to the v2Above dll
//
return Path.Combine(
Environment.GetFolderPath( Environment.SpecialFolder.System ),
v2AndAboveImplementationDll + ".dll" );
}
//
// Summary:
// Return handle to the CardSpace implementation dll.
// We will first check to see if a v2 (or above) redirection dll has been installed.
// If not we will check to see if the v1 infocardapi.dll is installed.
// If that's not found as well, an exception is thrown
//
private string GetCardSpaceImplementationDll()
{
string implDllFullPath = GetV2ImplementationDllPath();
if( !File.Exists( implDllFullPath ) )
{
//
// Choose infocardapi.dll, if v2+ dll does not exist
//
implDllFullPath = Path.Combine(
Environment.GetFolderPath( Environment.SpecialFolder.System ),
REDIRECT_DLL_CARDSPACE_V1 + ".dll" );
if( !File.Exists( implDllFullPath ) )
{
//
// If this does not exist either, then even CardSpace v1 is NOT installed
// on this machine. Note: Throwing an exception using IDT.ThrowHelperError
// does not log to event log unless it derives from InfoCardBaseException.
// This seems fine given that we don't want to be logging as "CardSpace X.0.0.0",
// rather we'll let the client application log to event log if desired.
//
throw IDT.ThrowHelperError(
new CardSpaceException( SR.GetString( SR.ClientAPIServiceNotInstalledError ) ) );
}
}
return implDllFullPath;
}
//
// Delegate definitions ported from NativeMethods.cs
//
internal delegate System.Int32 CsV2ManageCardSpace();
//[ReliabilityContract( Consistency.WillNotCorruptState, Cer.MayFail )]
internal delegate System.Int32 CsV2GetToken(
int cPolicyChain,
SafeHandle pPolicyChain,
out SafeTokenHandle securityToken,
out InternalRefCountedHandle pCryptoHandle);
internal delegate System.Int32 CsV2ImportInformationCard(
[MarshalAs( UnmanagedType.LPWStr )]
string nativeFileName);
//[ReliabilityContract( Consistency.WillNotCorruptState, Cer.MayFail )]
internal delegate int CsV2Encrypt(
InternalRefCountedHandle nativeCryptoHandle,
bool fOAEP,
[MarshalAs( UnmanagedType.U4 )]
int cbInData,
SafeHandle pInData,
[MarshalAs( UnmanagedType.U4 )]
out int pcbOutData,
out GlobalAllocSafeHandle pOutData);
//[ReliabilityContract( Consistency.WillNotCorruptState, Cer.MayFail )]
internal delegate int CsV2Decrypt(
InternalRefCountedHandle nativeCryptoHandle,
bool fOAEP,
[MarshalAs( UnmanagedType.U4 )]
int cbInData,
SafeHandle pInData,
[MarshalAs( UnmanagedType.U4 )]
out int pcbOutData,
out GlobalAllocSafeHandle pOutData);
//[ReliabilityContract( Consistency.WillNotCorruptState, Cer.MayFail )]
internal delegate int CsV2SignHash(
InternalRefCountedHandle nativeCryptoHandle,
[MarshalAs( UnmanagedType.U4 )]
int cbHash,
SafeHandle pInData,
SafeHandle pHashAlgOid,
[MarshalAs( UnmanagedType.U4 )]
out int pcbSig,
out GlobalAllocSafeHandle pSig);
//[ReliabilityContract( Consistency.WillNotCorruptState, Cer.MayFail )]
internal delegate int CsV2VerifyHash(
InternalRefCountedHandle nativeCryptoHandle,
[MarshalAs( UnmanagedType.U4 )]
int cbHash,
SafeHandle pInData,
SafeHandle pHashAlgOid,
[MarshalAs( UnmanagedType.U4 )]
int pcbSig,
SafeHandle pSig,
out bool verified);
//[ReliabilityContract( Consistency.WillNotCorruptState, Cer.MayFail )]
internal delegate int CsV2GenerateDerivedKey(InternalRefCountedHandle nativeCryptoHandle,
int cbLabel,
SafeHandle pLabel,
int cbNonce,
SafeHandle pNonce,
int derivedKeyLength,
int offset,
[MarshalAs( UnmanagedType.LPWStr )]
string derivationAlgUri,
out int cbDerivedKey,
out GlobalAllocSafeHandle pDerivedKey);
//[ReliabilityContract( Consistency.WillNotCorruptState, Cer.MayFail )]
internal delegate int CsV2GetCryptoTransform(
InternalRefCountedHandle nativeCryptoHandle,
int mode,
int padding,
int feedbackSize,
int direction,
int cbIV,
SafeHandle pIV,
out InternalRefCountedHandle nativeTransformHandle);
//[ReliabilityContract( Consistency.WillNotCorruptState, Cer.MayFail )]
internal delegate int CsV2TransformBlock(InternalRefCountedHandle nativeCryptoHandle,
int cbInData,
SafeHandle pInData,
out int cbOutData,
out GlobalAllocSafeHandle pOutData);
//[ReliabilityContract( Consistency.WillNotCorruptState, Cer.MayFail )]
internal delegate int CsV2TransformFinalBlock(InternalRefCountedHandle nativeCryptoHandle,
int cbInData,
SafeHandle pInData,
out int cbOutData,
out GlobalAllocSafeHandle pOutData);
//[ReliabilityContract( Consistency.WillNotCorruptState, Cer.MayFail )]
internal delegate int CsV2GetKeyedHash(
InternalRefCountedHandle nativeCryptoHandle,
out InternalRefCountedHandle nativeHashHandle);
//[ReliabilityContract( Consistency.WillNotCorruptState, Cer.MayFail )]
internal delegate int CsV2HashCore(InternalRefCountedHandle nativeCryptoHandle,
int cbInData,
SafeHandle pInData);
//[ReliabilityContract( Consistency.WillNotCorruptState, Cer.MayFail )]
internal delegate int CsV2HashFinal(InternalRefCountedHandle nativeCryptoHandle,
int cbInData,
SafeHandle pInData,
out int cbOutData,
out GlobalAllocSafeHandle pOutData);
[SuppressUnmanagedCodeSecurity]
//[ReliabilityContract( Consistency.WillNotCorruptState, Cer.Success )]
internal delegate bool CsV2CloseCryptoHandle([In] IntPtr hKey);
[SuppressUnmanagedCodeSecurity]
//[ReliabilityContract( Consistency.WillNotCorruptState, Cer.Success )]
internal delegate System.Int32 CsV2FreeToken([In] IntPtr token);
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- Metadata.cs
- Matrix3DStack.cs
- DropDownButton.cs
- XmlIlTypeHelper.cs
- MultipartContentParser.cs
- CurrencyManager.cs
- CodeConditionStatement.cs
- PermissionSetEnumerator.cs
- CreateUserWizardStep.cs
- CanonicalFontFamilyReference.cs
- PrintPreviewControl.cs
- documentsequencetextcontainer.cs
- EntityCommandCompilationException.cs
- CodeArrayIndexerExpression.cs
- ProxyHelper.cs
- ResourceDictionaryCollection.cs
- AutoResetEvent.cs
- TableParaClient.cs
- Span.cs
- SmtpNtlmAuthenticationModule.cs
- DataGridParentRows.cs
- Image.cs
- Vector3DCollectionValueSerializer.cs
- XmlObjectSerializerReadContextComplex.cs
- VisualTarget.cs
- LogicalExpr.cs
- ExternalFile.cs
- SchemaTypeEmitter.cs
- RemotingConfiguration.cs
- MsmqChannelFactoryBase.cs
- XsltContext.cs
- XmlSchemaFacet.cs
- WpfWebRequestHelper.cs
- ByteAnimationBase.cs
- StreamSecurityUpgradeProvider.cs
- TableRow.cs
- FixedDocumentSequencePaginator.cs
- NavigationWindow.cs
- DependencyPropertyDescriptor.cs
- ContractMapping.cs
- baseaxisquery.cs
- TextSearch.cs
- GradientStop.cs
- FilteredReadOnlyMetadataCollection.cs
- SecurityIdentifierConverter.cs
- CqlQuery.cs
- Source.cs
- SiteMapSection.cs
- BlockCollection.cs
- Attribute.cs
- InternalRelationshipCollection.cs
- ItemTypeToolStripMenuItem.cs
- KeyPressEvent.cs
- CurrencyManager.cs
- TemplateColumn.cs
- HttpListenerException.cs
- DbModificationClause.cs
- ISSmlParser.cs
- TreeNodeStyle.cs
- NodeFunctions.cs
- NamedPipeAppDomainProtocolHandler.cs
- HttpCacheVary.cs
- SerialErrors.cs
- VSWCFServiceContractGenerator.cs
- View.cs
- SqlMethods.cs
- FaultImportOptions.cs
- EntityTypeEmitter.cs
- SpStreamWrapper.cs
- TileBrush.cs
- RangeBase.cs
- ListDictionaryInternal.cs
- EventListenerClientSide.cs
- BindingSourceDesigner.cs
- DynamicRenderer.cs
- ObfuscationAttribute.cs
- ManagementQuery.cs
- ObjectHelper.cs
- RoutingEndpointTrait.cs
- GregorianCalendar.cs
- WebPartTransformerCollection.cs
- GC.cs
- ParameterReplacerVisitor.cs
- CollectionChangedEventManager.cs
- EncodingNLS.cs
- MessageTraceRecord.cs
- HttpListenerPrefixCollection.cs
- TrustLevelCollection.cs
- _OverlappedAsyncResult.cs
- Globals.cs
- OleDbEnumerator.cs
- MultipartContentParser.cs
- Vector3D.cs
- SctClaimDictionary.cs
- Double.cs
- ObjectToken.cs
- Context.cs
- XmlElementList.cs
- VisualTreeHelper.cs
- HtmlToClrEventProxy.cs