Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / security / system / security / cryptography / x509 / X500Name.cs / 1305376 / X500Name.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== // // X500Name.cs // // 07/10/2003 // namespace System.Security.Cryptography.X509Certificates { using System.Globalization; using System.Runtime.InteropServices; using System.Security.Cryptography; [Flags] public enum X500DistinguishedNameFlags { None = 0x0000, Reversed = 0x0001, UseSemicolons = 0x0010, DoNotUsePlusSign = 0x0020, DoNotUseQuotes = 0x0040, UseCommas = 0x0080, UseNewLines = 0x0100, UseUTF8Encoding = 0x1000, UseT61Encoding = 0x2000, ForceUTF8Encoding = 0x4000, } public sealed class X500DistinguishedName : AsnEncodedData { private string m_distinguishedName = null; // // Constructors. // internal X500DistinguishedName (CAPI.CRYPTOAPI_BLOB encodedDistinguishedNameBlob) : base (new Oid(), encodedDistinguishedNameBlob) {} public X500DistinguishedName (byte[] encodedDistinguishedName) : base(new Oid(), encodedDistinguishedName) {} public X500DistinguishedName (AsnEncodedData encodedDistinguishedName) : base(encodedDistinguishedName) {} public X500DistinguishedName (X500DistinguishedName distinguishedName) : base((AsnEncodedData) distinguishedName) { m_distinguishedName = distinguishedName.Name; } public X500DistinguishedName (string distinguishedName) : this(distinguishedName, X500DistinguishedNameFlags.Reversed) {} public X500DistinguishedName (string distinguishedName, X500DistinguishedNameFlags flag) : base(new Oid(), Encode(distinguishedName, flag)) { m_distinguishedName = distinguishedName; } // // Public properties. // public string Name { get { if (m_distinguishedName == null) m_distinguishedName = Decode(X500DistinguishedNameFlags.Reversed); return m_distinguishedName; } } // // Public methods. // public string Decode (X500DistinguishedNameFlags flag) { uint dwStrType = CAPI.CERT_X500_NAME_STR | MapNameToStrFlag(flag); unsafe { byte[] encodedDistinguishedName = this.m_rawData; fixed (byte * pbEncoded = encodedDistinguishedName) { CAPI.CRYPTOAPI_BLOB nameBlob; IntPtr pNameBlob = new IntPtr(&nameBlob); nameBlob.cbData = (uint) encodedDistinguishedName.Length; nameBlob.pbData = new IntPtr(pbEncoded); uint cchDecoded = CAPI.CertNameToStrW(CAPI.X509_ASN_ENCODING | CAPI.PKCS_7_ASN_ENCODING, pNameBlob, dwStrType, SafeLocalAllocHandle.InvalidHandle, 0); if (cchDecoded == 0) throw new CryptographicException(CAPI.CERT_E_INVALID_NAME); using (SafeLocalAllocHandle pwszDecodeName = CAPI.LocalAlloc(CAPI.LPTR, new IntPtr(2 * cchDecoded))) { if (CAPI.CertNameToStrW(CAPI.X509_ASN_ENCODING | CAPI.PKCS_7_ASN_ENCODING, pNameBlob, dwStrType, pwszDecodeName, cchDecoded) == 0) throw new CryptographicException(CAPI.CERT_E_INVALID_NAME); return Marshal.PtrToStringUni(pwszDecodeName.DangerousGetHandle()); } } } } public override string Format (bool multiLine) { // // We must override to use the "numeric" pointer version of // CryptFormatObject, since X509 DN does not have an official OID. // // Return empty string if no data to format. if (m_rawData == null || m_rawData.Length == 0) return String.Empty; return CAPI.CryptFormatObject(CAPI.X509_ASN_ENCODING, multiLine ? CAPI.CRYPT_FORMAT_STR_MULTI_LINE : 0, new IntPtr(CAPI.X509_NAME), m_rawData); } // // Private methods. // private unsafe static byte[] Encode (string distinguishedName, X500DistinguishedNameFlags flag) { if (distinguishedName == null) throw new ArgumentNullException("distinguishedName"); uint cbEncoded = 0; uint dwStrType = CAPI.CERT_X500_NAME_STR | MapNameToStrFlag(flag); if (!CAPI.CertStrToNameW(CAPI.X509_ASN_ENCODING | CAPI.PKCS_7_ASN_ENCODING, distinguishedName, dwStrType, IntPtr.Zero, IntPtr.Zero, ref cbEncoded, IntPtr.Zero)) throw new CryptographicException(Marshal.GetLastWin32Error()); byte[] encodedName = new byte[cbEncoded]; fixed (byte * pbEncoded = encodedName) { if (!CAPI.CertStrToNameW(CAPI.X509_ASN_ENCODING | CAPI.PKCS_7_ASN_ENCODING, distinguishedName, dwStrType, IntPtr.Zero, new IntPtr(pbEncoded), ref cbEncoded, IntPtr.Zero)) throw new CryptographicException(Marshal.GetLastWin32Error()); } return encodedName; } private static uint MapNameToStrFlag (X500DistinguishedNameFlags flag) { // All values or'ed together. Change this if you add values to the enumeration. uint allFlags = 0x71F1; uint dwFlags = (uint) flag; if ((dwFlags & ~allFlags) != 0) throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.Arg_EnumIllegalVal), "flag")); uint dwStrType = 0; if (dwFlags != 0) { if ((flag & X500DistinguishedNameFlags.Reversed) == X500DistinguishedNameFlags.Reversed) dwStrType |= CAPI.CERT_NAME_STR_REVERSE_FLAG; if ((flag & X500DistinguishedNameFlags.UseSemicolons) == X500DistinguishedNameFlags.UseSemicolons) dwStrType |= CAPI.CERT_NAME_STR_SEMICOLON_FLAG; else if ((flag & X500DistinguishedNameFlags.UseCommas) == X500DistinguishedNameFlags.UseCommas) dwStrType |= CAPI.CERT_NAME_STR_COMMA_FLAG; else if ((flag & X500DistinguishedNameFlags.UseNewLines) == X500DistinguishedNameFlags.UseNewLines) dwStrType |= CAPI.CERT_NAME_STR_CRLF_FLAG; if ((flag & X500DistinguishedNameFlags.DoNotUsePlusSign) == X500DistinguishedNameFlags.DoNotUsePlusSign) dwStrType |= CAPI.CERT_NAME_STR_NO_PLUS_FLAG; if ((flag & X500DistinguishedNameFlags.DoNotUseQuotes) == X500DistinguishedNameFlags.DoNotUseQuotes) dwStrType |= CAPI.CERT_NAME_STR_NO_QUOTING_FLAG; if ((flag & X500DistinguishedNameFlags.ForceUTF8Encoding) == X500DistinguishedNameFlags.ForceUTF8Encoding) dwStrType |= CAPI.CERT_NAME_STR_FORCE_UTF8_DIR_STR_FLAG; if ((flag & X500DistinguishedNameFlags.UseUTF8Encoding) == X500DistinguishedNameFlags.UseUTF8Encoding) dwStrType |= CAPI.CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG; else if ((flag & X500DistinguishedNameFlags.UseT61Encoding) == X500DistinguishedNameFlags.UseT61Encoding) dwStrType |= CAPI.CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG; } return dwStrType; } } } // 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
- ZipFileInfo.cs
- MethodBuilder.cs
- ValidateNames.cs
- InstancePersistence.cs
- MSAAEventDispatcher.cs
- SerializationEventsCache.cs
- CurrencyManager.cs
- Point3DAnimationBase.cs
- DocumentStatusResources.cs
- InheritanceService.cs
- WindowsFormsEditorServiceHelper.cs
- EventLogTraceListener.cs
- SqlNotificationEventArgs.cs
- TransactedBatchingBehavior.cs
- SqlRetyper.cs
- DocumentPageTextView.cs
- ConfigurationErrorsException.cs
- ToolBarDesigner.cs
- JulianCalendar.cs
- ColorBlend.cs
- Transform3D.cs
- BaseTreeIterator.cs
- CommandLibraryHelper.cs
- PropertyGridCommands.cs
- KeyedCollection.cs
- ReadOnlyHierarchicalDataSourceView.cs
- SqlMultiplexer.cs
- CodeArrayCreateExpression.cs
- OdbcConnection.cs
- SettingsBase.cs
- RequestCacheManager.cs
- BinaryUtilClasses.cs
- TextContainer.cs
- XmlSchemas.cs
- SqlIdentifier.cs
- ExpressionServices.cs
- ImageKeyConverter.cs
- Site.cs
- ViewStateException.cs
- Parameter.cs
- XmlAttributeProperties.cs
- DataMemberFieldEditor.cs
- SmiMetaDataProperty.cs
- LogicalCallContext.cs
- ProxyManager.cs
- DataGridPageChangedEventArgs.cs
- PaperSource.cs
- SqlUtil.cs
- NetworkAddressChange.cs
- DynamicResourceExtensionConverter.cs
- ComPlusTypeValidator.cs
- MutexSecurity.cs
- URLString.cs
- ChannelDispatcherCollection.cs
- PropertyEmitter.cs
- DesigntimeLicenseContextSerializer.cs
- SimpleApplicationHost.cs
- DataAdapter.cs
- BamlReader.cs
- ResXResourceReader.cs
- ActivityTypeCodeDomSerializer.cs
- Automation.cs
- CodeTypeDelegate.cs
- MailFileEditor.cs
- CloudCollection.cs
- ParameterModifier.cs
- ValidationHelpers.cs
- XPathNodeInfoAtom.cs
- CaseCqlBlock.cs
- arabicshape.cs
- tabpagecollectioneditor.cs
- SendKeys.cs
- SettingsPropertyValue.cs
- DataBindEngine.cs
- QueueProcessor.cs
- BinaryObjectWriter.cs
- UnsafeNativeMethods.cs
- BaseValidator.cs
- OleDbReferenceCollection.cs
- MappingItemCollection.cs
- XmlAtomicValue.cs
- Binding.cs
- QueryOutputWriter.cs
- MemoryRecordBuffer.cs
- LookupBindingPropertiesAttribute.cs
- Bind.cs
- TreeNodeStyle.cs
- KeyBinding.cs
- DesignerAttribute.cs
- RangeEnumerable.cs
- Span.cs
- SafeArchiveContext.cs
- EventListener.cs
- EntityContainerEntitySetDefiningQuery.cs
- SiteMapPath.cs
- PopOutPanel.cs
- ScopeElement.cs
- TextServicesProperty.cs
- BulletedList.cs
- ClientTarget.cs