Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ ProcessConstructedBitString()

static int System.Formats.Asn1.AsnDecoder.ProcessConstructedBitString ( ReadOnlySpan< byte > source,
AsnEncodingRules ruleSet,
Span< byte > destination,
BitStringCopyAction copyAction,
bool isIndefinite,
out int lastUnusedBitCount,
out int bytesRead )
inlinestaticprivate

Definition at line 518 of file AsnDecoder.cs.

519 {
521 bytesRead = 0;
522 int num = 1000;
524 Stack<(int, int, bool, int)> stack = null;
525 int num2 = 0;
526 Asn1Tag asn1Tag = Asn1Tag.ConstructedBitString;
528 while (true)
529 {
530 if (!readOnlySpan.IsEmpty)
531 {
533 if (asn1Tag == Asn1Tag.PrimitiveBitString)
534 {
535 if (lastUnusedBitCount != 0)
536 {
537 throw new AsnContentException();
538 }
539 if (ruleSet == AsnEncodingRules.CER && num != 1000)
540 {
541 throw new AsnContentException(System.SR.ContentException_InvalidUnderCer_TryBerOrDer);
542 }
545 int num3 = bytesRead2 + source2.Length;
547 bytesRead += num3;
548 num2 += value.Length;
549 num = source2.Length;
550 if (copyAction != null)
551 {
553 destination2 = destination2.Slice(value.Length);
554 }
555 continue;
556 }
557 if (!(asn1Tag == Asn1Tag.EndOfContents && isIndefinite))
558 {
559 if (asn1Tag == Asn1Tag.ConstructedBitString)
560 {
561 if (ruleSet == AsnEncodingRules.CER)
562 {
563 throw new AsnContentException(System.SR.ContentException_InvalidUnderCerOrDer_TryBer);
564 }
565 if (stack == null)
566 {
567 stack = new Stack<(int, int, bool, int)>();
568 }
569 if (!source.Overlaps(readOnlySpan, out var elementOffset))
570 {
571 throw new AsnContentException();
572 }
573 stack.Push((elementOffset, readOnlySpan.Length, isIndefinite, bytesRead));
576 isIndefinite = !contentsLength.HasValue;
577 continue;
578 }
579 throw new AsnContentException();
580 }
583 if (stack != null && stack.Count > 0)
584 {
585 (int, int, bool, int) tuple = stack.Pop();
586 int item = tuple.Item1;
587 int item2 = tuple.Item2;
588 bool item3 = tuple.Item3;
589 int item4 = tuple.Item4;
590 readOnlySpan = source.Slice(item, item2).Slice(bytesRead);
591 bytesRead += item4;
593 continue;
594 }
595 }
596 if (isIndefinite && asn1Tag != Asn1Tag.EndOfContents)
597 {
598 throw new AsnContentException();
599 }
600 if (stack == null || stack.Count <= 0)
601 {
602 break;
603 }
604 (int, int, bool, int) tuple2 = stack.Pop();
605 int item5 = tuple2.Item1;
606 int item6 = tuple2.Item2;
607 bool item7 = tuple2.Item3;
608 int item8 = tuple2.Item4;
609 readOnlySpan = source.Slice(item5, item6).Slice(bytesRead);
611 bytesRead += item8;
612 }
613 return num2;
614 }
static void ValidateEndOfContents(Asn1Tag tag, int? length, int headerLength)
static ReadOnlySpan< byte > Slice(ReadOnlySpan< byte > source, int offset, int length)
static void ParsePrimitiveBitStringContents(ReadOnlySpan< byte > source, AsnEncodingRules ruleSet, out int unusedBitCount, out ReadOnlySpan< byte > value, out byte normalizedLastByte)
static Asn1Tag ReadTagAndLength(ReadOnlySpan< byte > source, AsnEncodingRules ruleSet, out int? contentsLength, out int bytesRead)
static string ContentException_InvalidUnderCerOrDer_TryBer
Definition SR.cs:56
static string ContentException_InvalidUnderCer_TryBerOrDer
Definition SR.cs:54
Definition SR.cs:7

References System.Formats.Asn1.Asn1Tag.ConstructedBitString, System.SR.ContentException_InvalidUnderCer_TryBerOrDer, System.SR.ContentException_InvalidUnderCerOrDer_TryBer, System.destination, System.Formats.Asn1.Asn1Tag.EndOfContents, System.item, System.Formats.Asn1.AsnDecoder.ParsePrimitiveBitStringContents(), System.Formats.Asn1.Asn1Tag.PrimitiveBitString, System.Formats.Asn1.AsnDecoder.ReadTagAndLength(), System.Formats.Asn1.AsnDecoder.Slice(), System.source, System.Formats.Asn1.AsnDecoder.ValidateEndOfContents(), and System.value.

Referenced by System.Formats.Asn1.AsnDecoder.CopyConstructedBitString(), and System.Formats.Asn1.AsnDecoder.CountConstructedBitString().