private Asn1Object BuildObject(int tag, int tagNo, int length) { bool flag = (tag & 0x20) != 0; DefiniteLengthInputStream definiteLengthInputStream = new DefiniteLengthInputStream(s, length); if ((tag & 0x40) != 0) { return(new DerApplicationSpecific(flag, tagNo, definiteLengthInputStream.ToArray())); } if ((tag & 0x80) != 0) { return(new Asn1StreamParser(definiteLengthInputStream).ReadTaggedObject(flag, tagNo)); } if (flag) { switch (tagNo) { case 4: return(new BerOctetString(BuildDerEncodableVector(definiteLengthInputStream))); case 16: return(CreateDerSequence(definiteLengthInputStream)); case 17: return(CreateDerSet(definiteLengthInputStream)); case 8: return(new DerExternal(BuildDerEncodableVector(definiteLengthInputStream))); default: throw new IOException("unknown tag " + tagNo + " encountered"); } } return(CreatePrimitiveDerObject(tagNo, definiteLengthInputStream, tmpBuffers)); }
internal static byte[] GetBuffer(DefiniteLengthInputStream defIn, byte[][] tmpBuffers) { int remaining = defIn.GetRemaining(); if (remaining >= tmpBuffers.Length) { return(defIn.ToArray()); } byte[] array = tmpBuffers[remaining]; if (array == null) { array = (tmpBuffers[remaining] = new byte[remaining]); } defIn.ReadAllIntoByteArray(array); return(array); }
internal Asn1Object ReadTaggedObject(bool constructed, int tag) { if (!constructed) { DefiniteLengthInputStream definiteLengthInputStream = (DefiniteLengthInputStream)_in; return(new DerTaggedObject(explicitly: false, tag, new DerOctetString(definiteLengthInputStream.ToArray()))); } Asn1EncodableVector asn1EncodableVector = ReadVector(); if (_in is IndefiniteLengthInputStream) { if (asn1EncodableVector.Count != 1) { return(new BerTaggedObject(explicitly: false, tag, BerSequence.FromVector(asn1EncodableVector))); } return(new BerTaggedObject(explicitly: true, tag, asn1EncodableVector[0])); } if (asn1EncodableVector.Count != 1) { return(new DerTaggedObject(explicitly: false, tag, DerSequence.FromVector(asn1EncodableVector))); } return(new DerTaggedObject(explicitly: true, tag, asn1EncodableVector[0])); }
public virtual IAsn1Convertible ReadObject() { int num = _in.ReadByte(); if (num == -1) { return(null); } Set00Check(enabled: false); int num2 = Asn1InputStream.ReadTagNumber(_in, num); bool flag = (num & 0x20) != 0; int num3 = Asn1InputStream.ReadLength(_in, _limit); if (num3 < 0) { if (!flag) { throw new IOException("indefinite length primitive encoding encountered"); } IndefiniteLengthInputStream inStream = new IndefiniteLengthInputStream(_in, _limit); Asn1StreamParser asn1StreamParser = new Asn1StreamParser(inStream, _limit); if ((num & 0x40) != 0) { return(new BerApplicationSpecificParser(num2, asn1StreamParser)); } if ((num & 0x80) != 0) { return(new BerTaggedObjectParser(constructed: true, num2, asn1StreamParser)); } return(asn1StreamParser.ReadIndef(num2)); } DefiniteLengthInputStream definiteLengthInputStream = new DefiniteLengthInputStream(_in, num3); if ((num & 0x40) != 0) { return(new DerApplicationSpecific(flag, num2, definiteLengthInputStream.ToArray())); } if ((num & 0x80) != 0) { return(new BerTaggedObjectParser(flag, num2, new Asn1StreamParser(definiteLengthInputStream))); } if (flag) { switch (num2) { case 4: return(new BerOctetStringParser(new Asn1StreamParser(definiteLengthInputStream))); case 16: return(new DerSequenceParser(new Asn1StreamParser(definiteLengthInputStream))); case 17: return(new DerSetParser(new Asn1StreamParser(definiteLengthInputStream))); case 8: return(new DerExternalParser(new Asn1StreamParser(definiteLengthInputStream))); default: throw new IOException("unknown tag " + num2 + " encountered"); } } int num4 = num2; if (num4 == 4) { return(new DerOctetStringParser(definiteLengthInputStream)); } try { return(Asn1InputStream.CreatePrimitiveDerObject(num2, definiteLengthInputStream, tmpBuffers)); } catch (ArgumentException exception) { throw new Asn1Exception("corrupted stream detected", exception); } }
internal virtual DerSequence CreateDerSequence(DefiniteLengthInputStream dIn) { return(DerSequence.FromVector(BuildDerEncodableVector(dIn))); }
internal virtual Asn1EncodableVector BuildDerEncodableVector(DefiniteLengthInputStream dIn) { return(new Asn1InputStream(dIn).BuildEncodableVector()); }
internal static Asn1Object CreatePrimitiveDerObject(int tagNo, DefiniteLengthInputStream defIn, byte[][] tmpBuffers) { switch (tagNo) { case 1: return(DerBoolean.FromOctetString(GetBuffer(defIn, tmpBuffers))); case 10: return(DerEnumerated.FromOctetString(GetBuffer(defIn, tmpBuffers))); case 6: return(DerObjectIdentifier.FromOctetString(GetBuffer(defIn, tmpBuffers))); default: { byte[] array = defIn.ToArray(); switch (tagNo) { case 3: return(DerBitString.FromAsn1Octets(array)); case 30: return(new DerBmpString(array)); case 24: return(new DerGeneralizedTime(array)); case 27: return(new DerGeneralString(array)); case 25: return(new DerGraphicString(array)); case 22: return(new DerIA5String(array)); case 2: return(new DerInteger(array)); case 5: return(DerNull.Instance); case 18: return(new DerNumericString(array)); case 4: return(new DerOctetString(array)); case 19: return(new DerPrintableString(array)); case 20: return(new DerT61String(array)); case 28: return(new DerUniversalString(array)); case 23: return(new DerUtcTime(array)); case 12: return(new DerUtf8String(array)); case 21: return(new DerVideotexString(array)); case 26: return(new DerVisibleString(array)); default: throw new IOException("unknown tag " + tagNo + " encountered"); } } } }
internal virtual DerSet CreateDerSet(DefiniteLengthInputStream dIn) { return(DerSet.FromVector(BuildDerEncodableVector(dIn), needsSorting: false)); }
internal DerOctetStringParser(DefiniteLengthInputStream stream) { this.stream = stream; }
internal override DerSet CreateDerSet(DefiniteLengthInputStream dIn) { return(new LazyDerSet(dIn.ToArray())); }