public static List <RdnAttribute> GetRdnAttributes(X500DistinguishedName name)
        {
            List <RdnAttribute> retValue = new List <RdnAttribute>();
            ASN1 asn = new ASN1(name.RawData);

            asn.MoveNext();
            do
            {
                ASN1 asn2 = new ASN1(asn.Payload);
                asn2.MoveNext();
                List <Byte> oidRawData = new List <Byte>(asn2.Header);
                oidRawData.AddRange(asn2.Payload);
                Oid oid = ASN1.DecodeObjectIdentifier(oidRawData.ToArray());
                asn2.MoveNext();
                String value;
                switch (asn2.Tag)
                {
                case (Byte)ASN1Tags.UniversalString:
                    value = Encoding.UTF32.GetString(asn2.Payload);
                    break;

                case (Byte)ASN1Tags.BMPString:
                    value = Encoding.BigEndianUnicode.GetString(asn2.Payload);
                    break;

                default:
                    value = Encoding.UTF8.GetString(asn2.Payload);
                    break;
                }
                retValue.Add(new RdnAttribute {
                    OID = oid, Value = value
                });
            } while (asn.MoveNextCurrentLevel());
            return(retValue);
        }