Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / ServiceModel / System / ServiceModel / Channels / PeerUnsafeNativeCryptMethods.cs / 1 / PeerUnsafeNativeCryptMethods.cs
//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------- namespace System.ServiceModel.Channels { using System; using System.ComponentModel; using System.Diagnostics; using System.Runtime.InteropServices; using System.Runtime.ConstrainedExecution; using System.Security; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; using System.ServiceModel.Channels; using System.Text; [StructLayout(LayoutKind.Sequential)] internal struct SystemTime { public short wYear; public short wMonth; public short wDayOfWeek; public short wDay; public short wHour; public short wMinute; public short wSecond; public short wMilliseconds; public SystemTime(DateTime date) { wYear = (short)date.Year; wMonth = (short)date.Month; wDayOfWeek = (short)date.DayOfWeek; wDay = (short)date.Day; wHour = (short)date.Hour; wMinute = (short)date.Minute; wSecond = (short)date.Second; wMilliseconds = (short)date.Millisecond; } } [SuppressUnmanagedCodeSecurity] class CertificateHandle : SafeHandle { #region PInvoke declarations [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] [DllImport("Crypt32.dll", CallingConvention=CallingConvention.StdCall)] private extern static bool CertFreeCertificateContext(IntPtr pCertContext); [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] [DllImport("Crypt32.dll", CallingConvention = CallingConvention.StdCall, SetLastError=true)] private extern static bool CertDeleteCertificateFromStore(IntPtr pCertContext); #endregion protected bool delete = false; protected CertificateHandle() : base(IntPtr.Zero, true) { return; } public override bool IsInvalid { get { return handle == IntPtr.Zero; } } protected override bool ReleaseHandle() { if(delete) return CertDeleteCertificateFromStore(handle); else return CertFreeCertificateContext(handle); } } [SuppressUnmanagedCodeSecurity] sealed class StoreCertificateHandle : CertificateHandle { private StoreCertificateHandle() : base(){ base.delete = true;} } [SuppressUnmanagedCodeSecurity] sealed class CertificateStoreHandle : SafeHandle { [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] [DllImport("Crypt32.dll", CallingConvention = CallingConvention.StdCall)] private static extern bool CertCloseStore(IntPtr hCertStore, int dwFlags); private CertificateStoreHandle() : base(IntPtr.Zero, true) { return; } public override bool IsInvalid { get { return handle == IntPtr.Zero; } } protected override bool ReleaseHandle() { return CertCloseStore(handle, 0); } } [SuppressUnmanagedCodeSecurity] sealed class KeyContainerHandle : SafeHandle { [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] [DllImport("Advapi32.dll", CallingConvention = CallingConvention.StdCall)] private static extern bool CryptReleaseContext(IntPtr hProv, int dwFlags); private KeyContainerHandle() : base(IntPtr.Zero, true) { return; } public override bool IsInvalid { get { return handle == IntPtr.Zero; } } protected override bool ReleaseHandle() { return CryptReleaseContext(handle, 0); } } sealed class KeyHandle : SafeHandle { [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] [DllImport("Advapi32.dll", CallingConvention = CallingConvention.StdCall)] private static extern bool CryptDestroyKey(IntPtr hKey); private KeyHandle() : base(IntPtr.Zero, true) { return; } public override bool IsInvalid { get { return handle == IntPtr.Zero; } } protected override bool ReleaseHandle() { return CryptDestroyKey(handle); } } sealed class CryptoApiBlob : IDisposable { private int cbData = 0; private CriticalAllocHandle data; public CryptoApiBlob() { } public CryptoApiBlob(byte[] bytes) { DiagnosticUtility.DebugAssert(bytes != null, "Cannot set null data"); AllocateBlob(bytes.Length); Marshal.Copy(bytes, 0, (IntPtr)data, bytes.Length); cbData = bytes.Length; return; } public int DataSize { get { DiagnosticUtility.DebugAssert(cbData >= 0, "Size must be greater than or equal to zero"); return cbData; } } public void AllocateBlob(int size) { data = CriticalAllocHandle.FromSize(size); cbData = size; } [StructLayout(LayoutKind.Sequential)] public class InteropHelper { public int size; public IntPtr data; public InteropHelper(int size, IntPtr data) { this.size = size; this.data = data; } } public InteropHelper GetMemoryForPinning() { return new InteropHelper(cbData, (IntPtr)data); } public byte[] GetBytes() { if(cbData == 0) return null; byte[] bytes = DiagnosticUtility.Utility.AllocateByteArray(cbData); Marshal.Copy((IntPtr)data, bytes, 0, cbData); return bytes; } private void Dispose(bool disposing) { if(disposing) GC.SuppressFinalize(this); return; } public void Dispose() { Dispose(true); return; } } sealed class CertificateName { #region PInvoke Declarations [DllImport("Crypt32.dll", CallingConvention=CallingConvention.StdCall, CharSet=CharSet.Auto, SetLastError=true)] private extern static bool CertStrToName(CertEncodingType dwCertEncodingType, [MarshalAs(UnmanagedType.LPTStr)]string pszX500, StringType dwStrType, IntPtr pvReserved, [In, Out]byte[] pbEncoded, [In, Out]ref int pcbEncoded, [MarshalAs(UnmanagedType.LPTStr)]ref StringBuilder ppszError); [Flags] private enum CertEncodingType : int { X509AsnEncoding = 0x00000001, PKCS7AsnEncoding = 0x00010000 } [Flags] private enum StringType : int { SimpleNameString = 1, OIDNameString = 2, X500NameString= 3, CommaFlag = 0x04000000, SemicolonFlag = 0x40000000, CRLFFlag = 0x08000000, NoPlusFlag = 0x20000000, NoQuotingFlag = 0x10000000, ReverseFlag = 0x02000000, DisableIE4UTF8Flag = 0x00010000, EnableT61UnicodeFlag = 0x00020000, EnableUTF8UnicodeFlag = 0x00040000 } #endregion private string dn = null; public CertificateName(string dn) { DiagnosticUtility.DebugAssert(!String.IsNullOrEmpty(dn), "Empty subject name for certificate!"); this.dn = dn; } public string DistinguishedName { get {return dn; } } public CryptoApiBlob GetCryptoApiBlob() { byte[] encodedName = GetEncodedName(); return new CryptoApiBlob(encodedName); } private byte[] GetEncodedName() { int encodingSize = 0; StringBuilder errorString = null; CertStrToName(CertEncodingType.X509AsnEncoding | CertEncodingType.PKCS7AsnEncoding, DistinguishedName, StringType.OIDNameString | StringType.ReverseFlag, IntPtr.Zero, null, ref encodingSize, ref errorString); byte[] encodedBytes = new byte[encodingSize]; bool ok = CertStrToName(CertEncodingType.X509AsnEncoding | CertEncodingType.PKCS7AsnEncoding, DistinguishedName, StringType.OIDNameString | StringType.ReverseFlag, IntPtr.Zero, encodedBytes, ref encodingSize, ref errorString); if(!ok) { PeerExceptionHelper.ThrowInvalidOperation_PeerCertGenFailure(PeerExceptionHelper.GetLastException()); } return encodedBytes; } } sealed partial class SelfSignedCertificate : IDisposable { #region PInvoke declarations [DllImport("Crypt32.dll", CallingConvention = CallingConvention.StdCall, SetLastError = true)] private extern static CertificateHandle CertCreateSelfSignCertificate( KeyContainerHandle hProv, CryptoApiBlob.InteropHelper pSubjectIssuerBlob, SelfSignFlags dwFlags, IntPtr pKeyProvInfo, IntPtr pSignatureAlgorithm, [In] ref SystemTime pStartTime, [In] ref SystemTime pEndTime, IntPtr pExtensions); [DllImport("Crypt32.dll", CallingConvention = CallingConvention.StdCall, SetLastError = true)] private extern static CertificateStoreHandle CertOpenStore( IntPtr lpszStoreProvider, int dwMsgAndCertEncodingType, IntPtr hCryptProv, int dwFlags, IntPtr pvPara); [DllImport("Crypt32.dll", CallingConvention = CallingConvention.StdCall, SetLastError = true)] private extern static bool CertAddCertificateContextToStore( CertificateStoreHandle hCertStore, CertificateHandle pCertContext, AddDisposition dwAddDisposition, [Out]out StoreCertificateHandle ppStoreContext); [DllImport("Advapi32.dll", CallingConvention = CallingConvention.StdCall, SetLastError = true)] private extern static bool CryptAcquireContext( [Out]out KeyContainerHandle phProv, string pszContainer, string pszProvider, ProviderType dwProvType, ContextFlags dwFlags); [DllImport("Advapi32.dll", CallingConvention = CallingConvention.StdCall, SetLastError = true)] private extern static bool CryptGenKey( KeyContainerHandle hProv, AlgorithmType algId, KeyFlags dwFlags, [Out]out KeyHandle phKey); [DllImport("Crypt32.dll", CallingConvention = CallingConvention.StdCall, SetLastError = true, CharSet=CharSet.Unicode)] private extern static bool PFXExportCertStoreEx( CertificateStoreHandle hStore, IntPtr pPFX, //IntPtr szPassword, string password, IntPtr pvReserved, PfxExportFlags dwFlags); [DllImport("Crypt32.dll", CallingConvention = CallingConvention.StdCall, SetLastError = true)] private extern static bool CertSetCertificateContextProperty( CertificateHandle context, int propId, int flags, KeyHandle pv); [Flags] private enum SelfSignFlags : int { None= 0, NoSign = 1, NoKeyInfo = 2, } private enum AddDisposition : int { New = 1, UseExisting = 2, ReplaceExisting = 3, Always = 4, ReplaceExistingInheritProperties = 5 } [Flags] private enum PfxExportFlags : int { ReportNoPrivateKey = 0x00000001, ReportNotAbleToExportPrivateKey = 0x00000002, ExportPrivateKeys = 0x00000004 } private enum ProviderType : int { RsaFull = 1, RsaSignature = 2, Dss = 3, Fortezza = 4, MsExchange = 5, Ssl = 6, RsaSecureChannel = 12, /* SSS_WARNINGS_OFF */ DssDiffieHellman = 13, EcDsaSignature = 14, EcNraSignature = 15, EcDsaFull = 16, EcNraFull = 17, DiffieHellmanSecureChannel = 18, SpyrusLynks = 20, RandomNumberGenerator = 21, IntelSec = 22, ReplaceOwf = 23, RsaAes= 24 } /* SSS_WARNINGS_ON */ [Flags] private enum ContextFlags : uint { VerifyContext= 0xF0000000, NewKeySet= 0x00000008, DeleteKeySet= 0x00000010, MachineKeySet= 0x00000020, Silent= 0x00000040 } private enum AlgorithmType : int { KeyExchange= 1, Signature = 2 } private enum KeyFlags : int { Exportable= 0x00000001, UserProtected= 0x00000002, CreateSalt= 0x00000004, UpdateKey= 0x00000008, NoSalt= 0x00000010, PreGenerate= 0x00000040, Online= 0x00000080, Sf= 0x00000100, CreateIv= 0x00000200, KeyExchangeKey= 0x00000400, DataKey= 0x00000800, Volatile= 0x00001000, SgcKey= 0x00002000, Archivable= 0x00004000, Exportable2k= 0x08000001, } const int CERT_KEY_SPEC_PROP_ID = 1; const int CERT_KEY_PROV_INFO_PROP_ID = 2; #endregion [Serializable] [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)] public class CRYPT_KEY_PROV_INFO { public string container; public string provName; public int providerType; public int flags; public int paramsCount; public IntPtr param; public int keySpec; } [Serializable] [StructLayout(LayoutKind.Sequential)] public struct CRYPT_OBJID_BLOB { public int count; public IntPtr parameters; } [Serializable] [StructLayout(LayoutKind.Sequential)] public class CRYPT_ALGORITHM_IDENTIFIER { public CRYPT_ALGORITHM_IDENTIFIER(string id) { this.pszObjId = id; } public string pszObjId; public CRYPT_OBJID_BLOB Parameters; } [Serializable] [StructLayout(LayoutKind.Sequential)] public class Sha1AlgorithmId : CRYPT_ALGORITHM_IDENTIFIER { const string AlgId = "1.2.840.113549.1.1.5"; public Sha1AlgorithmId():base(AlgId){} } CriticalAllocHandle GetProviderInfo() { CRYPT_KEY_PROV_INFO provInfo = new CRYPT_KEY_PROV_INFO(); provInfo.container = this.keyContainerName; provInfo.providerType = (int)ProviderType.RsaSecureChannel; provInfo.paramsCount = 0; provInfo.keySpec = (int)AlgorithmType.KeyExchange; return CriticalAllocHandleBlob.FromBlob(provInfo); } static CriticalAllocHandle GetSha1AlgorithmId() { Sha1AlgorithmId sha1Id = new Sha1AlgorithmId(); return CriticalAllocHandleBlob.FromBlob (sha1Id); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DynamicRendererThreadManager.cs
- HtmlToClrEventProxy.cs
- ReferenceService.cs
- SqlDelegatedTransaction.cs
- SubMenuStyle.cs
- TextFormatterHost.cs
- FixedSOMGroup.cs
- WebPartMenuStyle.cs
- CommandID.cs
- BrowserDefinitionCollection.cs
- Stroke2.cs
- Code.cs
- ClientBuildManager.cs
- infer.cs
- SecurityPolicySection.cs
- SharedPerformanceCounter.cs
- DictionarySectionHandler.cs
- GrabHandleGlyph.cs
- NamespaceQuery.cs
- EntityContainer.cs
- LogicalCallContext.cs
- ArglessEventHandlerProxy.cs
- NameSpaceEvent.cs
- ConnectionAcceptor.cs
- SQLMoney.cs
- DataServiceProcessingPipeline.cs
- ToolStripSeparator.cs
- InheritedPropertyChangedEventArgs.cs
- BooleanAnimationUsingKeyFrames.cs
- FileNotFoundException.cs
- RequestQueue.cs
- CriticalHandle.cs
- TypeInitializationException.cs
- RotateTransform.cs
- TransactionState.cs
- TextPointerBase.cs
- StylusDownEventArgs.cs
- NonParentingControl.cs
- FileDialog.cs
- GreaterThan.cs
- _DigestClient.cs
- HttpListenerRequestUriBuilder.cs
- DataGridViewLinkColumn.cs
- PerformanceCounterPermission.cs
- TextBoxRenderer.cs
- BoolExpr.cs
- IfAction.cs
- AssociativeAggregationOperator.cs
- IOException.cs
- ACL.cs
- BufferModesCollection.cs
- VisualBasicDesignerHelper.cs
- QuaternionRotation3D.cs
- Button.cs
- ImageAnimator.cs
- TouchPoint.cs
- IEnumerable.cs
- UnsafeNativeMethods.cs
- ValueQuery.cs
- CodeVariableReferenceExpression.cs
- AccessedThroughPropertyAttribute.cs
- IpcManager.cs
- NameValueConfigurationCollection.cs
- SqlClientMetaDataCollectionNames.cs
- HashSetDebugView.cs
- SystemFonts.cs
- KeyValueSerializer.cs
- DataControlField.cs
- XmlILAnnotation.cs
- HandlerMappingMemo.cs
- SafeFileMapViewHandle.cs
- BindingsCollection.cs
- UmAlQuraCalendar.cs
- FtpRequestCacheValidator.cs
- Constants.cs
- Win32SafeHandles.cs
- WSSecureConversation.cs
- RSAPKCS1SignatureDeformatter.cs
- EditorBrowsableAttribute.cs
- ProviderConnectionPoint.cs
- LayoutDump.cs
- Int32RectValueSerializer.cs
- ObjectAssociationEndMapping.cs
- SqlClientWrapperSmiStreamChars.cs
- TransactionManager.cs
- FormsAuthenticationUserCollection.cs
- RsaSecurityToken.cs
- IndicShape.cs
- OracleMonthSpan.cs
- ReferenceConverter.cs
- DefaultValueMapping.cs
- ArraySubsetEnumerator.cs
- SecurityCriticalDataForSet.cs
- BitmapEditor.cs
- IisTraceWebEventProvider.cs
- FontFaceLayoutInfo.cs
- XmlKeywords.cs
- DateTime.cs
- AuthenticationException.cs
- ValueTable.cs