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
- DataSourceHelper.cs
- StickyNote.cs
- TypeContext.cs
- RepeatInfo.cs
- InkCanvasSelectionAdorner.cs
- ApplicationId.cs
- PropertyTabAttribute.cs
- CodeTypeReferenceCollection.cs
- _IPv6Address.cs
- RemoveStoryboard.cs
- TreeViewImageGenerator.cs
- TreeViewDataItemAutomationPeer.cs
- CopyAction.cs
- HttpModulesSection.cs
- MultiPartWriter.cs
- sqlnorm.cs
- ToolStripManager.cs
- DesignerCommandAdapter.cs
- IISUnsafeMethods.cs
- XamlStream.cs
- EqualityComparer.cs
- WebExceptionStatus.cs
- CounterSample.cs
- Help.cs
- RenamedEventArgs.cs
- UnsafeNativeMethods.cs
- ProxyGenerationError.cs
- ZipIOLocalFileHeader.cs
- AsymmetricSecurityProtocolFactory.cs
- DateTimeValueSerializer.cs
- Transactions.cs
- DLinqColumnProvider.cs
- MultiSelector.cs
- ConnectionProviderAttribute.cs
- DomNameTable.cs
- DataTemplateKey.cs
- TranslateTransform.cs
- ConvertTextFrag.cs
- WorkflowMarkupSerializationException.cs
- BufferedResponseStream.cs
- WindowsGraphics.cs
- Style.cs
- WeakReference.cs
- shaper.cs
- AppSettingsReader.cs
- GeneralTransform2DTo3DTo2D.cs
- BamlWriter.cs
- TextServicesCompartment.cs
- ToolStrip.cs
- ImmComposition.cs
- TextServicesProperty.cs
- StdValidatorsAndConverters.cs
- QuaternionAnimation.cs
- ParsedAttributeCollection.cs
- DocumentPageViewAutomationPeer.cs
- TextHidden.cs
- SQLBinaryStorage.cs
- SkipStoryboardToFill.cs
- PocoPropertyAccessorStrategy.cs
- DataMisalignedException.cs
- SynchronizationContext.cs
- CriticalFinalizerObject.cs
- ServiceBuildProvider.cs
- GroupQuery.cs
- WebServiceParameterData.cs
- DockProviderWrapper.cs
- oledbconnectionstring.cs
- EncodingNLS.cs
- PackWebResponse.cs
- HostingPreferredMapPath.cs
- ValueTable.cs
- SpeakCompletedEventArgs.cs
- IndexOutOfRangeException.cs
- ReceiveReply.cs
- TraceSwitch.cs
- FixedDSBuilder.cs
- VisualTreeUtils.cs
- _ConnectionGroup.cs
- TreeViewDesigner.cs
- DataProtection.cs
- DbParameterCollectionHelper.cs
- NonSerializedAttribute.cs
- TableLayoutCellPaintEventArgs.cs
- LiteralControl.cs
- InternalMappingException.cs
- ConnectionOrientedTransportChannelFactory.cs
- ToolStripDesignerUtils.cs
- ColumnBinding.cs
- HtmlShimManager.cs
- ExpressionBindingCollection.cs
- SettingsProperty.cs
- ColumnResizeAdorner.cs
- GetPageNumberCompletedEventArgs.cs
- SqlWebEventProvider.cs
- AppearanceEditorPart.cs
- CaretElement.cs
- SessionPageStatePersister.cs
- xml.cs
- TemplateBamlTreeBuilder.cs
- EventToken.cs