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
- AxHost.cs
- ValidationHelper.cs
- QuadraticBezierSegment.cs
- CheckedPointers.cs
- SpnEndpointIdentity.cs
- SchemaTableOptionalColumn.cs
- TimelineGroup.cs
- SqlDuplicator.cs
- __Error.cs
- ViewStateChangedEventArgs.cs
- GenericWebPart.cs
- NotFiniteNumberException.cs
- SqlWriter.cs
- DataGridColumnHeaderAutomationPeer.cs
- TableTextElementCollectionInternal.cs
- CollectionViewSource.cs
- ScriptBehaviorDescriptor.cs
- PbrsForward.cs
- GenericsNotImplementedException.cs
- DesignerWithHeader.cs
- ToolStripDropDownItem.cs
- SQLConvert.cs
- OptimalTextSource.cs
- EventLogReader.cs
- StorageConditionPropertyMapping.cs
- SamlAuthorityBinding.cs
- EventLog.cs
- FormsAuthenticationUser.cs
- PageParserFilter.cs
- XmlTextAttribute.cs
- WeakReferenceList.cs
- XsltArgumentList.cs
- WorkflowInstanceTerminatedRecord.cs
- SerializationHelper.cs
- WSFederationHttpBindingElement.cs
- Point3DIndependentAnimationStorage.cs
- SqlSelectStatement.cs
- PocoEntityKeyStrategy.cs
- DataViewManagerListItemTypeDescriptor.cs
- PenContexts.cs
- PropertyConverter.cs
- UrlAuthFailedErrorFormatter.cs
- DbRetry.cs
- InternalTransaction.cs
- Ref.cs
- cookiecontainer.cs
- VisualStyleElement.cs
- HttpWriter.cs
- SourceFilter.cs
- PageParser.cs
- Animatable.cs
- StateChangeEvent.cs
- Condition.cs
- ViewCellSlot.cs
- ValidationContext.cs
- SerializerProvider.cs
- ComponentConverter.cs
- EdmTypeAttribute.cs
- LinqDataSourceValidationException.cs
- AcceleratedTokenAuthenticator.cs
- FileDialog.cs
- SqlDataReader.cs
- ResourcePart.cs
- Attributes.cs
- SaveFileDialog.cs
- Decoder.cs
- SupportingTokenParameters.cs
- MarkupProperty.cs
- GuidTagList.cs
- ErrorFormatter.cs
- ValidationResults.cs
- ComEventsMethod.cs
- ListViewDeleteEventArgs.cs
- StrokeIntersection.cs
- XmlC14NWriter.cs
- PagesSection.cs
- DataGridViewRowHeaderCell.cs
- SynchronizedDispatch.cs
- GraphicsPath.cs
- ThumbAutomationPeer.cs
- BaseComponentEditor.cs
- SByte.cs
- TableAutomationPeer.cs
- SqlCrossApplyToCrossJoin.cs
- ProxyHwnd.cs
- TextShapeableCharacters.cs
- PathSegmentCollection.cs
- RefreshPropertiesAttribute.cs
- Stylesheet.cs
- TemplateControlBuildProvider.cs
- Switch.cs
- Claim.cs
- ReversePositionQuery.cs
- TableSectionStyle.cs
- PerspectiveCamera.cs
- CapacityStreamGeometryContext.cs
- WebPartEditVerb.cs
- Asn1IntegerConverter.cs
- GridViewRowCollection.cs
- BindingBase.cs