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
- WebPartMenuStyle.cs
- DtrList.cs
- ConsoleTraceListener.cs
- CacheHelper.cs
- RoleManagerModule.cs
- EmptyStringExpandableObjectConverter.cs
- SqlStream.cs
- MatrixTransform3D.cs
- DocumentSequenceHighlightLayer.cs
- TracingConnectionListener.cs
- DataContractJsonSerializer.cs
- BitStack.cs
- XamlSerializerUtil.cs
- RemotingConfigParser.cs
- MenuItemAutomationPeer.cs
- ResourceType.cs
- WindowsListViewGroupHelper.cs
- ElementMarkupObject.cs
- ResetableIterator.cs
- BitmapEditor.cs
- Attributes.cs
- SQLStringStorage.cs
- ExternalException.cs
- assemblycache.cs
- TextTrailingWordEllipsis.cs
- UnsignedPublishLicense.cs
- StreamWriter.cs
- BinaryFormatterWriter.cs
- Label.cs
- CookieProtection.cs
- StringResourceManager.cs
- HtmlInputRadioButton.cs
- HashHelper.cs
- EndPoint.cs
- PolicyStatement.cs
- GlobalizationSection.cs
- DecodeHelper.cs
- AtomParser.cs
- TypefaceCollection.cs
- ExpressionWriter.cs
- ItemChangedEventArgs.cs
- PictureBox.cs
- EntitySqlQueryBuilder.cs
- documentsequencetextcontainer.cs
- QueueProcessor.cs
- RelatedImageListAttribute.cs
- CompiledRegexRunnerFactory.cs
- CodeNamespaceImportCollection.cs
- ImmutableAssemblyCacheEntry.cs
- BamlResourceDeserializer.cs
- MetadataPropertyAttribute.cs
- Normalization.cs
- XamlDesignerSerializationManager.cs
- ImmComposition.cs
- WorkflowTransactionService.cs
- InertiaTranslationBehavior.cs
- CompilerState.cs
- TextBoxAutoCompleteSourceConverter.cs
- DataGridRow.cs
- ReadOnlyTernaryTree.cs
- EnumValAlphaComparer.cs
- Context.cs
- XmlSchemaAppInfo.cs
- WindowsToolbarAsMenu.cs
- ChtmlTextWriter.cs
- UpdatePanelTriggerCollection.cs
- WindowsTreeView.cs
- SqlRemoveConstantOrderBy.cs
- GridViewHeaderRowPresenter.cs
- NestedContainer.cs
- TypeDelegator.cs
- CachedFontFace.cs
- COM2PropertyBuilderUITypeEditor.cs
- ModelPropertyCollectionImpl.cs
- StrokeNodeEnumerator.cs
- ConfigXmlReader.cs
- CodeCatchClause.cs
- NetPeerTcpBindingCollectionElement.cs
- Font.cs
- RawAppCommandInputReport.cs
- UIElement.cs
- ItemContainerGenerator.cs
- CalendarDataBindingHandler.cs
- Automation.cs
- BamlStream.cs
- UpdatePanelControlTrigger.cs
- DefaultValueTypeConverter.cs
- GetRecipientListRequest.cs
- HttpModuleAction.cs
- SafeEventLogWriteHandle.cs
- Repeater.cs
- EntityDataSourceChangedEventArgs.cs
- RegistryKey.cs
- TdsParameterSetter.cs
- ToolStripMenuItem.cs
- ImageBrush.cs
- RepeatButton.cs
- CodeGotoStatement.cs
- EntityType.cs
- StatusStrip.cs