Exemplo n.º 1
0
            static void ParseNestedType(Asn1Reader asn1Reader)
            {
                // processing rules (assuming zero-based bits):
                // if bit 5 is set to "1", or the type is SEQUENCE/SET -- the type is constructed. Unroll nested types.
                // if bit 5 is set to "0", attempt to resolve nested types only for UNIVERSAL tags.
                Logger.writeLog("ParseNestedType-1");
                Logger.writeLog(asn1Reader.Tag + "");
                Logger.writeLog("ParseNestedType-1.0");
                Logger.writeLog(asn1Reader.PayloadLength + "");
                Logger.writeLog("ParseNestedType-1.0.0");
                bool tag = asn1Reader.excludedTags[asn1Reader.Tag];

                Logger.writeLog("ParseNestedType-1.1");
                if ((asn1Reader.excludedTags[asn1Reader.Tag] != null && asn1Reader.excludedTags[asn1Reader.Tag] == true) || asn1Reader.PayloadLength < 2)
                {
                    Logger.writeLog("ParseNestedType-2");
                    return;
                }
                Int64 pstart  = asn1Reader.PayloadStartOffset;
                Int32 plength = asn1Reader.PayloadLength;

                if (asn1Reader.Tag == 3)
                {
                    Logger.writeLog("ParseNestedType-3");
                    pstart  = asn1Reader.PayloadStartOffset + 1;
                    plength = asn1Reader.PayloadLength - 1;
                }
                Logger.writeLog("ParseNestedType-4");

                if (asn1Reader.multiNestedTypes[asn1Reader.Tag] == true || (asn1Reader.Tag & (Byte)Asn1Class.CONSTRUCTED) > 0)
                {
                    Logger.writeLog("ParseNestedType-5");
                    asn1Reader.IsConstructed = true;
                    if (asn1Reader.offsetMap[pstart] != null)
                    {
                        Logger.writeLog("ParseNestedType-6");
                        PredictResult predictResult = Predict(asn1Reader, pstart, plength, true);
                        asn1Reader.childCount = predictResult.estimatedChildCount;
                    }
                    Logger.writeLog("ParseNestedType-7");
                    asn1Reader.isTaggedConstructed = false;
                    return;
                }
                Logger.writeLog("ParseNestedType-8");

                if (asn1Reader.Tag > 0 && asn1Reader.Tag < (Byte)Asn1Type.TAG_MASK)
                {
                    Logger.writeLog("ParseNestedType-9");
                    PredictResult predictResult = Predict(asn1Reader, pstart, plength, false);
                    Logger.writeLog("ParseNestedType-10");
                    asn1Reader.childCount    = predictResult.estimatedChildCount;
                    asn1Reader.IsConstructed = predictResult.result;
                    // reiterate again and build map for children
                    if (asn1Reader.IsConstructed && asn1Reader.offsetMap[pstart] == null)
                    {
                        Logger.writeLog("ParseNestedType-11");
                        PredictResult predictResultOther = Predict(asn1Reader, pstart, plength, false);
                        Logger.writeLog("ParseNestedType-12");
                        asn1Reader.childCount = predictResultOther.estimatedChildCount;
                    }
                }
                Logger.writeLog("ParseNestedType-13");
                asn1Reader.isTaggedConstructed = false;
            }
Exemplo n.º 2
0
            static void ParseNestedType(Asn1Reader asn1Reader)
            {
                // processing rules (assuming zero-based bits):
                // if bit 5 is set to "1", or the type is SEQUENCE/SET -- the type is constructed. Unroll nested types.
                // if bit 5 is set to "0", attempt to resolve nested types only for UNIVERSAL tags.
                Logger.writeLog("ParseNestedType-1");
                if (asn1Reader.excludedTags.HasKey(asn1Reader.Tag) || asn1Reader.PayloadLength < 2)
                {
                    Logger.writeLog("ParseNestedType-2");
                    return;
                }
                Logger.writeLog("ParseNestedType-3");
                Int64 pstart  = asn1Reader.PayloadStartOffset;
                Int32 plength = asn1Reader.PayloadLength;

                Storage.Put(Storage.CurrentContext, "asn1Reader.Tag", asn1Reader.Tag);
                Storage.Put(Storage.CurrentContext, "pstart", pstart);
                Storage.Put(Storage.CurrentContext, "plength", plength);

                if (asn1Reader.Tag == 3)
                {
                    Logger.writeLog("ParseNestedType-4");
                    pstart  = asn1Reader.PayloadStartOffset + 1;
                    plength = asn1Reader.PayloadLength - 1;
                    Logger.writeLog("ParseNestedType-5");
                }

                if (asn1Reader.multiNestedTypes.HasKey(asn1Reader.Tag) ||
                    (asn1Reader.Tag & (Byte)Asn1Class.CONSTRUCTED) > 0)
                {
                    Logger.writeLog("ParseNestedType-6");
                    asn1Reader.IsConstructed = true;
                    if (!asn1Reader.offsetMap.HasKey(pstart))
                    {
                        Logger.writeLog("ParseNestedType-7");
                        PredictResult predictResult = Predict(asn1Reader, pstart, plength, true);
                        asn1Reader.childCount = predictResult.estimatedChildCount;
                        Logger.writeLog("ParseNestedType-8");
                    }
                    Logger.writeLog("ParseNestedType-9");
                    asn1Reader.isTaggedConstructed = false;
                    return;
                }
                Logger.writeLog("ParseNestedType-10");
                if (asn1Reader.Tag > 0 && asn1Reader.Tag < (Byte)Asn1Type.TAG_MASK)
                {
                    Logger.writeLog("ParseNestedType-11");
                    PredictResult predictResult = Predict(asn1Reader, pstart, plength, false);
                    Logger.writeLog("ParseNestedType-12");
                    asn1Reader.childCount    = predictResult.estimatedChildCount;
                    asn1Reader.IsConstructed = predictResult.result;
                    Logger.writeLog("ParseNestedType-13");
                    // reiterate again and build map for children
                    if (asn1Reader.IsConstructed && !asn1Reader.offsetMap.HasKey(pstart))
                    {
                        Logger.writeLog("ParseNestedType-14");
                        PredictResult predictResultOther = Predict(asn1Reader, pstart, plength, false);
                        asn1Reader.childCount = predictResultOther.estimatedChildCount;
                        Logger.writeLog("ParseNestedType-15");
                    }
                    Logger.writeLog("ParseNestedType-16");
                }
                Logger.writeLog("ParseNestedType-17");
                asn1Reader.isTaggedConstructed = false;
            }