예제 #1
0
파일: DDer.cs 프로젝트: modulexcite/DDer
    static void Parse(TextWriter tw, int depth, AsnElt ae)
    {
        Indent(tw, depth);
        tw.Write("(");
        switch (ae.TagClass)
        {
        case AsnElt.APPLICATION:
            tw.Write("[application " + ae.TagValue + "]");
            break;

        case AsnElt.CONTEXT:
            tw.Write("[" + ae.TagValue + "]");
            break;

        case AsnElt.PRIVATE:
            tw.Write("[private " + ae.TagValue + "]");
            break;

        default:
            switch (ae.TagValue)
            {
            case AsnElt.BOOLEAN:
                tw.Write("bool " + ae.GetBoolean() + ")");
                return;

            case AsnElt.INTEGER:
                tw.Write("int " + ae.GetIntegerHex() + ")");
                return;

            case AsnElt.BIT_STRING:
                int    bitLen;
                byte[] bs = ae.GetBitString(out bitLen);
                tw.Write("bits "
                         + (bs.Length * 8 - bitLen));
                PrintBytes(tw, depth, bs);
                tw.Write(")");
                return;

            case AsnElt.OCTET_STRING:
                tw.Write("blob");
                PrintBytes(tw, depth, ae.CopyValue());
                tw.Write(")");
                return;

            case AsnElt.NULL:
                ae.CheckNull();
                tw.Write("null)");
                return;

            case AsnElt.OBJECT_IDENTIFIER:
                string oid = ae.GetOID();
                if (!numOID)
                {
                    oid = AsnOID.ToName(oid);
                }
                tw.Write("oid " + oid + ")");
                return;

            case AsnElt.NumericString:
                tw.Write("numeric "
                         + EscapeString(ae.GetString()) + ")");
                return;

            case AsnElt.PrintableString:
                tw.Write("printable "
                         + EscapeString(ae.GetString()) + ")");
                return;

            case AsnElt.IA5String:
                tw.Write("ia5 "
                         + EscapeString(ae.GetString()) + ")");
                return;

            case AsnElt.TeletexString:
                tw.Write("teletex "
                         + EscapeString(ae.GetString()) + ")");
                return;

            case AsnElt.UTF8String:
                tw.Write("utf8 "
                         + EscapeString(ae.GetString()) + ")");
                return;

            case AsnElt.BMPString:
                tw.Write("bmp "
                         + EscapeString(ae.GetString()) + ")");
                return;

            case AsnElt.UniversalString:
                tw.Write("utf32 "
                         + EscapeString(ae.GetString()) + ")");
                return;

            case AsnElt.UTCTime:
                tw.Write("utc "
                         + EscapeString(ae.GetString())
                         + " {" + ae.GetTime() + "} )");
                return;

            case AsnElt.GeneralizedTime:
                tw.Write("gentime "
                         + EscapeString(ae.GetString())
                         + " {" + ae.GetTime() + "} )");
                return;

            case AsnElt.SEQUENCE:
                if (!ae.Constructed)
                {
                    throw new AsnException(
                              "Non-constructed SEQUENCE");
                }
                tw.Write("sequence");
                ParseSubs(tw, depth, ae);
                tw.Write(")");
                return;

            case AsnElt.SET:
                if (!ae.Constructed)
                {
                    throw new AsnException(
                              "Non-constructed SET");
                }
                tw.Write("set");
                ParseSubs(tw, depth, ae);
                tw.Write(")");
                return;

            default:
                tw.Write(
                    "[universal " + ae.TagValue + "]");
                break;
            }
            break;
        }
        if (ae.Constructed)
        {
            tw.Write("sequence");
            ParseSubs(tw, depth, ae);
            tw.Write(")");
        }
        else
        {
            tw.Write("blob");
            PrintBytes(tw, depth, ae.CopyValue());
            tw.Write(")");
        }
    }