/** * build an object given its tag and the number of bytes to construct it from. */ private Asn1Object BuildObject( int tag, int tagNo, int length) { bool isConstructed = (tag & Asn1Tags.Constructed) != 0; DefiniteLengthInputStream defIn = new DefiniteLengthInputStream(this.s, length); if((tag & Asn1Tags.Application) != 0) { throw new IOException("invalid ECDSA sig"); } if((tag & Asn1Tags.Tagged) != 0) { throw new IOException("invalid ECDSA sig"); } if(isConstructed) { switch(tagNo) { case Asn1Tags.Sequence: return CreateDerSequence(defIn); default: throw new IOException("unknown tag " + tagNo + " encountered"); } } return CreatePrimitiveDerObject(tagNo, defIn, tmpBuffers); }
internal static Asn1Object CreatePrimitiveDerObject( int tagNo, DefiniteLengthInputStream defIn, byte[][] tmpBuffers) { switch (tagNo) { case Asn1Tags.Boolean: throw new IOException("invalid ECDSA sig"); case Asn1Tags.Enumerated: throw new IOException("invalid ECDSA sig"); case Asn1Tags.ObjectIdentifier: throw new IOException("invalid ECDSA sig"); } byte[] bytes = defIn.ToArray(); switch (tagNo) { case Asn1Tags.Integer: return(new DerInteger(bytes)); default: throw new IOException("unknown tag " + tagNo + " encountered"); } }
/** * build an object given its tag and the number of bytes to construct it from. */ private Asn1Object BuildObject( int tag, int tagNo, int length) { bool isConstructed = (tag & Asn1Tags.Constructed) != 0; DefiniteLengthInputStream defIn = new DefiniteLengthInputStream(this.s, length); if ((tag & Asn1Tags.Application) != 0) { throw new IOException("invalid ECDSA sig"); } if ((tag & Asn1Tags.Tagged) != 0) { throw new IOException("invalid ECDSA sig"); } if (isConstructed) { switch (tagNo) { case Asn1Tags.Sequence: return(CreateDerSequence(defIn)); default: throw new IOException("unknown tag " + tagNo + " encountered"); } } return(CreatePrimitiveDerObject(tagNo, defIn, tmpBuffers)); }
/** * build an object given its tag and the number of bytes to construct it from. */ private Asn1Object BuildObject( int tag, int tagNo, int length) { bool isConstructed = (tag & Asn1Tags.Constructed) != 0; DefiniteLengthInputStream defIn = new DefiniteLengthInputStream(this.s, length); if ((tag & Asn1Tags.Application) != 0) { return(new DerApplicationSpecific(isConstructed, tagNo, defIn.ToArray())); } if ((tag & Asn1Tags.Tagged) != 0) { return(new Asn1StreamParser(defIn).ReadTaggedObject(isConstructed, tagNo)); } if (isConstructed) { // TODO There are other tags that may be constructed (e.g. BitString) switch (tagNo) { case Asn1Tags.OctetString: // // yes, people actually do this... // return(new BerOctetString(BuildDerEncodableVector(defIn))); case Asn1Tags.Sequence: return(CreateDerSequence(defIn)); case Asn1Tags.Set: return(CreateDerSet(defIn)); case Asn1Tags.External: return(new DerExternal(BuildDerEncodableVector(defIn))); default: throw new IOException("unknown tag " + tagNo + " encountered"); } } return(CreatePrimitiveDerObject(tagNo, defIn, tmpBuffers)); }
internal static byte[] GetBuffer(DefiniteLengthInputStream defIn, byte[][] tmpBuffers) { int len = defIn.GetRemaining(); if (len >= tmpBuffers.Length) { return(defIn.ToArray()); } byte[] buf = tmpBuffers[len]; if (buf == null) { buf = tmpBuffers[len] = new byte[len]; } defIn.ReadAllIntoByteArray(buf); return(buf); }
/** * build an object given its tag and the number of bytes to construct it from. */ private Asn1Object BuildObject( int tag, int tagNo, int length) { bool isConstructed = (tag & Asn1Tags.Constructed) != 0; DefiniteLengthInputStream defIn = new DefiniteLengthInputStream(this.s, length); if ((tag & Asn1Tags.Application) != 0) { return new DerApplicationSpecific(isConstructed, tagNo, defIn.ToArray()); } if ((tag & Asn1Tags.Tagged) != 0) { return new Asn1StreamParser(defIn).ReadTaggedObject(isConstructed, tagNo); } if (isConstructed) { // TODO There are other tags that may be constructed (e.g. BitString) switch (tagNo) { case Asn1Tags.OctetString: // // yes, people actually do this... // return new BerOctetString(BuildDerEncodableVector(defIn)); case Asn1Tags.Sequence: return CreateDerSequence(defIn); case Asn1Tags.Set: return CreateDerSet(defIn); case Asn1Tags.External: return new DerExternal(BuildDerEncodableVector(defIn)); default: throw new IOException("unknown tag " + tagNo + " encountered"); } } return CreatePrimitiveDerObject(tagNo, defIn, tmpBuffers); }
internal Asn1Object ReadTaggedObject(bool constructed, int tag) { if (!constructed) { // Note: !CONSTRUCTED => IMPLICIT DefiniteLengthInputStream defIn = (DefiniteLengthInputStream)_in; return(new DerTaggedObject(false, tag, new DerOctetString(defIn.ToArray()))); } Asn1EncodableVector v = ReadVector(); if (_in is IndefiniteLengthInputStream) { return(v.Count == 1 ? new BerTaggedObject(true, tag, v[0]) : new BerTaggedObject(false, tag, BerSequence.FromVector(v))); } return(v.Count == 1 ? new DerTaggedObject(true, tag, v[0]) : new DerTaggedObject(false, tag, DerSequence.FromVector(v))); }
internal virtual Asn1EncodableVector BuildDerEncodableVector( DefiniteLengthInputStream dIn) { return(new Asn1InputStream(dIn).BuildEncodableVector()); }
internal static Asn1Object CreatePrimitiveDerObject( int tagNo, DefiniteLengthInputStream defIn, byte[][] tmpBuffers) { switch (tagNo) { case Asn1Tags.Boolean: return DerBoolean.FromOctetString(GetBuffer(defIn, tmpBuffers)); case Asn1Tags.Enumerated: return DerEnumerated.FromOctetString(GetBuffer(defIn, tmpBuffers)); case Asn1Tags.ObjectIdentifier: return DerObjectIdentifier.FromOctetString(GetBuffer(defIn, tmpBuffers)); } byte[] bytes = defIn.ToArray(); switch (tagNo) { case Asn1Tags.BitString: return DerBitString.FromAsn1Octets(bytes); case Asn1Tags.BmpString: return new DerBmpString(bytes); case Asn1Tags.GeneralizedTime: return new DerGeneralizedTime(bytes); case Asn1Tags.GeneralString: return new DerGeneralString(bytes); case Asn1Tags.IA5String: return new DerIA5String(bytes); case Asn1Tags.Integer: return new DerInteger(bytes); case Asn1Tags.Null: return DerNull.Instance; // actual content is ignored (enforce 0 length?) case Asn1Tags.NumericString: return new DerNumericString(bytes); case Asn1Tags.OctetString: return new DerOctetString(bytes); case Asn1Tags.PrintableString: return new DerPrintableString(bytes); case Asn1Tags.T61String: return new DerT61String(bytes); case Asn1Tags.UniversalString: return new DerUniversalString(bytes); case Asn1Tags.UtcTime: return new DerUtcTime(bytes); case Asn1Tags.Utf8String: return new DerUtf8String(bytes); case Asn1Tags.VisibleString: return new DerVisibleString(bytes); default: throw new IOException("unknown tag " + tagNo + " encountered"); } }
internal static byte[] GetBuffer(DefiniteLengthInputStream defIn, byte[][] tmpBuffers) { int len = defIn.GetRemaining(); if (len >= tmpBuffers.Length) { return defIn.ToArray(); } byte[] buf = tmpBuffers[len]; if (buf == null) { buf = tmpBuffers[len] = new byte[len]; } defIn.ReadAllIntoByteArray(buf); return buf; }
internal virtual DerSet CreateDerSet( DefiniteLengthInputStream dIn) { return DerSet.FromVector(BuildDerEncodableVector(dIn), false); }
internal DerOctetStringParser( DefiniteLengthInputStream stream) { this.stream = stream; }
public virtual IAsn1Convertible ReadObject() { int tag = _in.ReadByte(); if (tag == -1) { return(null); } // turn of looking for "00" while we resolve the tag Set00Check(false); // // calculate tag number // int tagNo = Asn1InputStream.ReadTagNumber(_in, tag); bool isConstructed = (tag & Asn1Tags.Constructed) != 0; // // calculate length // int length = Asn1InputStream.ReadLength(_in, _limit); if (length < 0) // indefinite length method { if (!isConstructed) { throw new IOException("indefinite length primitive encoding encountered"); } IndefiniteLengthInputStream indIn = new IndefiniteLengthInputStream(_in, _limit); Asn1StreamParser sp = new Asn1StreamParser(indIn, _limit); if ((tag & Asn1Tags.Application) != 0) { return(new BerApplicationSpecificParser(tagNo, sp)); } if ((tag & Asn1Tags.Tagged) != 0) { return(new BerTaggedObjectParser(true, tagNo, sp)); } return(sp.ReadIndef(tagNo)); } else { DefiniteLengthInputStream defIn = new DefiniteLengthInputStream(_in, length); if ((tag & Asn1Tags.Application) != 0) { return(new DerApplicationSpecific(isConstructed, tagNo, defIn.ToArray())); } if ((tag & Asn1Tags.Tagged) != 0) { return(new BerTaggedObjectParser(isConstructed, tagNo, new Asn1StreamParser(defIn))); } if (isConstructed) { // TODO There are other tags that may be constructed (e.g. BitString) switch (tagNo) { case Asn1Tags.OctetString: // // yes, people actually do this... // return(new BerOctetStringParser(new Asn1StreamParser(defIn))); case Asn1Tags.Sequence: return(new DerSequenceParser(new Asn1StreamParser(defIn))); case Asn1Tags.Set: return(new DerSetParser(new Asn1StreamParser(defIn))); case Asn1Tags.External: return(new DerExternalParser(new Asn1StreamParser(defIn))); default: throw new IOException("unknown tag " + tagNo + " encountered"); } } // Some primitive encodings can be handled by parsers too... switch (tagNo) { case Asn1Tags.OctetString: return(new DerOctetStringParser(defIn)); } try { return(Asn1InputStream.CreatePrimitiveDerObject(tagNo, defIn, tmpBuffers)); } catch (ArgumentException e) { throw new Asn1Exception("corrupted stream detected", e); } } }
internal static Asn1Object CreatePrimitiveDerObject( int tagNo, DefiniteLengthInputStream defIn, byte[][] tmpBuffers) { switch (tagNo) { case Asn1Tags.Boolean: return(DerBoolean.FromOctetString(GetBuffer(defIn, tmpBuffers))); case Asn1Tags.Enumerated: return(DerEnumerated.FromOctetString(GetBuffer(defIn, tmpBuffers))); case Asn1Tags.ObjectIdentifier: return(DerObjectIdentifier.FromOctetString(GetBuffer(defIn, tmpBuffers))); } byte[] bytes = defIn.ToArray(); switch (tagNo) { case Asn1Tags.BitString: return(DerBitString.FromAsn1Octets(bytes)); case Asn1Tags.BmpString: return(new DerBmpString(bytes)); case Asn1Tags.GeneralizedTime: return(new DerGeneralizedTime(bytes)); case Asn1Tags.GeneralString: return(new DerGeneralString(bytes)); case Asn1Tags.IA5String: return(new DerIA5String(bytes)); case Asn1Tags.Integer: return(new DerInteger(bytes)); case Asn1Tags.Null: return(DerNull.Instance); // actual content is ignored (enforce 0 length?) case Asn1Tags.NumericString: return(new DerNumericString(bytes)); case Asn1Tags.OctetString: return(new DerOctetString(bytes)); case Asn1Tags.PrintableString: return(new DerPrintableString(bytes)); case Asn1Tags.T61String: return(new DerT61String(bytes)); case Asn1Tags.UniversalString: return(new DerUniversalString(bytes)); case Asn1Tags.UtcTime: return(new DerUtcTime(bytes)); case Asn1Tags.Utf8String: return(new DerUtf8String(bytes)); case Asn1Tags.VisibleString: return(new DerVisibleString(bytes)); default: throw new IOException("unknown tag " + tagNo + " encountered"); } }
internal virtual DerSet CreateDerSet( DefiniteLengthInputStream dIn) { return(DerSet.FromVector(BuildDerEncodableVector(dIn), false)); }
public virtual IAsn1Convertible ReadObject() { int tag = _in.ReadByte(); if (tag == -1) return null; // turn of looking for "00" while we resolve the tag Set00Check(false); // // calculate tag number // int tagNo = Asn1InputStream.ReadTagNumber(_in, tag); bool isConstructed = (tag & Asn1Tags.Constructed) != 0; // // calculate length // int length = Asn1InputStream.ReadLength(_in, _limit); if (length < 0) // indefinite length method { if (!isConstructed) throw new IOException("indefinite length primitive encoding encountered"); IndefiniteLengthInputStream indIn = new IndefiniteLengthInputStream(_in, _limit); Asn1StreamParser sp = new Asn1StreamParser(indIn, _limit); if ((tag & Asn1Tags.Application) != 0) { return new BerApplicationSpecificParser(tagNo, sp); } if ((tag & Asn1Tags.Tagged) != 0) { return new BerTaggedObjectParser(true, tagNo, sp); } return sp.ReadIndef(tagNo); } else { DefiniteLengthInputStream defIn = new DefiniteLengthInputStream(_in, length); if ((tag & Asn1Tags.Application) != 0) { return new DerApplicationSpecific(isConstructed, tagNo, defIn.ToArray()); } if ((tag & Asn1Tags.Tagged) != 0) { return new BerTaggedObjectParser(isConstructed, tagNo, new Asn1StreamParser(defIn)); } if (isConstructed) { // TODO There are other tags that may be constructed (e.g. BitString) switch (tagNo) { case Asn1Tags.OctetString: // // yes, people actually do this... // return new BerOctetStringParser(new Asn1StreamParser(defIn)); case Asn1Tags.Sequence: return new DerSequenceParser(new Asn1StreamParser(defIn)); case Asn1Tags.Set: return new DerSetParser(new Asn1StreamParser(defIn)); case Asn1Tags.External: return new DerExternalParser(new Asn1StreamParser(defIn)); default: throw new IOException("unknown tag " + tagNo + " encountered"); } } // Some primitive encodings can be handled by parsers too... switch (tagNo) { case Asn1Tags.OctetString: return new DerOctetStringParser(defIn); } try { return Asn1InputStream.CreatePrimitiveDerObject(tagNo, defIn, tmpBuffers); } catch (ArgumentException e) { throw new Asn1Exception("corrupted stream detected", e); } } }
internal override DerSet CreateDerSet( DefiniteLengthInputStream dIn) { return new LazyDerSet(dIn.ToArray()); }
internal override DerSet CreateDerSet( DefiniteLengthInputStream dIn) { return(new LazyDerSet(dIn.ToArray())); }
internal virtual DerSequence CreateDerSequence( DefiniteLengthInputStream dIn) { return(DerSequence.FromVector(BuildDerEncodableVector(dIn))); }
internal virtual Asn1EncodableVector BuildDerEncodableVector( DefiniteLengthInputStream dIn) { return new Asn1InputStream(dIn).BuildEncodableVector(); }
internal virtual DerSequence CreateDerSequence( DefiniteLengthInputStream dIn) { return DerSequence.FromVector(BuildDerEncodableVector(dIn)); }
public static Asn1Object CreatePrimitiveDerObject( int tagNo, DefiniteLengthInputStream defIn, byte[][] tmpBuffers) { switch(tagNo) { case Asn1Tags.Boolean: throw new IOException("invalid ECDSA sig"); case Asn1Tags.Enumerated: throw new IOException("invalid ECDSA sig"); case Asn1Tags.ObjectIdentifier: throw new IOException("invalid ECDSA sig"); } byte[] bytes = defIn.ToArray(); switch(tagNo) { case Asn1Tags.Integer: return new DerInteger(bytes); default: throw new IOException("unknown tag " + tagNo + " encountered"); } }