using System; using System.Globalization; using System.IO; using System.Text; using Org.BouncyCastle.Utilities.Encoders; namespace Org.BouncyCastle.Asn1.X509 { /** * It turns out that the number of standard ways the fields in a DN should be * encoded into their ASN.1 counterparts is rapidly approaching the * number of machines on the internet. By default the X509Name class * will produce UTF8Strings in line with the current recommendations (RFC 3280). *
* An example of an encoder look like below: *
* public class X509DirEntryConverter * : X509NameEntryConverter * { * public Asn1Object GetConvertedValue( * DerObjectIdentifier oid, * string value) * { * if (str.Length() != 0 && str.charAt(0) == '#') * { * return ConvertHexEncoded(str, 1); * } * if (oid.Equals(EmailAddress)) * { * return new DerIA5String(str); * } * else if (CanBePrintable(str)) * { * return new DerPrintableString(str); * } * else if (CanBeUTF8(str)) * { * return new DerUtf8String(str); * } * else * { * return new DerBmpString(str); * } * } * } ** */ public abstract class X509NameEntryConverter { /** * Convert an inline encoded hex string rendition of an ASN.1 * object back into its corresponding ASN.1 object. * * @param str the hex encoded object * @param off the index at which the encoding starts * @return the decoded object */ protected Asn1Object ConvertHexEncoded( string hexString, int offset) { return Asn1Object.FromByteArray(Hex.DecodeStrict(hexString, offset, hexString.Length - offset)); } /** * return true if the passed in string can be represented without * loss as a PrintableString, false otherwise. */ protected bool CanBePrintable( string str) { return DerPrintableString.IsPrintableString(str); } /** * Convert the passed in string value into the appropriate ASN.1 * encoded object. * * @param oid the oid associated with the value in the DN. * @param value the value of the particular DN component. * @return the ASN.1 equivalent for the value. */ public abstract Asn1Object GetConvertedValue(DerObjectIdentifier oid, string value); } }