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; }
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; }