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
- AsymmetricSignatureDeformatter.cs
- HashAlgorithm.cs
- DataControlFieldCell.cs
- XmlILModule.cs
- CommandID.cs
- LayoutUtils.cs
- SQLSingleStorage.cs
- SplineKeyFrames.cs
- FormsAuthenticationUserCollection.cs
- SQLString.cs
- IssuedTokenServiceElement.cs
- CornerRadiusConverter.cs
- BStrWrapper.cs
- FileDataSourceCache.cs
- SynchronizationLockException.cs
- RtfToXamlLexer.cs
- TreeNodeEventArgs.cs
- FillErrorEventArgs.cs
- _ShellExpression.cs
- ResolveDuplexAsyncResult.cs
- ProxyGenerator.cs
- ConfigXmlAttribute.cs
- AbstractDataSvcMapFileLoader.cs
- SamlNameIdentifierClaimResource.cs
- XsltSettings.cs
- CreateParams.cs
- BaseProcessProtocolHandler.cs
- TextSelectionHighlightLayer.cs
- GifBitmapEncoder.cs
- TemplateEditingService.cs
- FolderNameEditor.cs
- TextDecorationCollectionConverter.cs
- ControlCollection.cs
- ControlIdConverter.cs
- CompilerCollection.cs
- CustomErrorsSection.cs
- MarkupObject.cs
- HostingEnvironmentSection.cs
- SqlNodeTypeOperators.cs
- TreeViewCancelEvent.cs
- OutputCacheSection.cs
- DataGridViewCellStyleConverter.cs
- UnsafeNativeMethods.cs
- DataGridViewCellStyle.cs
- StyleBamlRecordReader.cs
- SqlDataSourceView.cs
- TreeViewCancelEvent.cs
- SystemIPv4InterfaceProperties.cs
- PersonalizableTypeEntry.cs
- ParsedAttributeCollection.cs
- BindingNavigator.cs
- ObjectStateManagerMetadata.cs
- Hex.cs
- MarshalByRefObject.cs
- BitmapEffectGeneralTransform.cs
- Point3DCollectionConverter.cs
- DefaultPropertyAttribute.cs
- ElementHostAutomationPeer.cs
- JsonDataContract.cs
- WebDescriptionAttribute.cs
- BamlBinaryReader.cs
- RuleProcessor.cs
- ParameterModifier.cs
- ServiceActivationException.cs
- CharAnimationBase.cs
- Listbox.cs
- TransformerConfigurationWizardBase.cs
- QueryContinueDragEventArgs.cs
- WindowsButton.cs
- XmlTextReaderImplHelpers.cs
- LockRenewalTask.cs
- JournalEntryStack.cs
- SafeRightsManagementHandle.cs
- RootBuilder.cs
- KeyInstance.cs
- ItemAutomationPeer.cs
- ResourceReferenceExpressionConverter.cs
- TriggerCollection.cs
- AsnEncodedData.cs
- TemplateControlParser.cs
- HashCodeCombiner.cs
- AddingNewEventArgs.cs
- InvariantComparer.cs
- SingleConverter.cs
- SmtpDateTime.cs
- ReflectionUtil.cs
- ServiceDescriptionSerializer.cs
- Utilities.cs
- TextSegment.cs
- Calendar.cs
- RemoteWebConfigurationHostStream.cs
- SecondaryViewProvider.cs
- GatewayDefinition.cs
- OneToOneMappingSerializer.cs
- IntranetCredentialPolicy.cs
- TypeProvider.cs
- StdRegProviderWrapper.cs
- AnimationClockResource.cs
- ConfigurationSection.cs
- XmlDataLoader.cs