internal BerApplicationSpecificParser( int tag, Asn1StreamParser parser) { this.tag = tag; this.parser = parser; }
internal BerTaggedObjectParser( bool constructed, int tagNumber, Asn1StreamParser parser) { _constructed = constructed; _tagNumber = tagNumber; _parser = parser; }
internal Asn1ObjectParser( int baseTag, int tagNumber, Stream contentStream) { _baseTag = baseTag; _tagNumber = tagNumber; _aIn = new Asn1StreamParser(contentStream); }
public byte[] UnWrapCMS(byte[] cipher, out byte[] sessionKey, out byte[] IV) { //These method calls must remain in this order. //Content Info A.Asn1StreamParser strmParser = new A.Asn1StreamParser(cipher); A.Cms.ContentInfoParser cInfoParser = new A.Cms.ContentInfoParser((A.Asn1SequenceParser)strmParser.ReadObject()); A.Asn1SequenceParser seqParser = (A.Asn1SequenceParser)cInfoParser.GetContent(A.Asn1Tags.Sequence); //Enveloped Data A.Cms.EnvelopedDataParser envDataParser = new A.Cms.EnvelopedDataParser(seqParser); //Recipent Info //GetOriginatorInfo() This method gets called from GetRecipientInfos A.DerSetParser rec = (A.DerSetParser)envDataParser.GetRecipientInfos(); A.Asn1Object recInfoData = rec.ReadObject().ToAsn1Object(); A.Cms.RecipientInfo recipInfo = new A.Cms.RecipientInfo(recInfoData); //Symmetric session key A.Cms.KeyTransRecipientInfo trans = (A.Cms.KeyTransRecipientInfo)recipInfo.Info; byte[] cipherSessionKey = trans.EncryptedKey.GetOctets(); X509Certificate2 cert = this.Certificate; RSACryptoServiceProvider rsaCrypto = (RSACryptoServiceProvider)cert.PrivateKey; sessionKey = rsaCrypto.Decrypt(cipherSessionKey, false); //Encrypted Content Info A.Cms.EncryptedContentInfoParser encrContentInfoParser = envDataParser.GetEncryptedContentInfo(); //Symmetric Initialization Vector A.X509.AlgorithmIdentifier aes = encrContentInfoParser.ContentEncryptionAlgorithm; A.DerOctetString initVector = (A.DerOctetString)aes.Parameters; IV = initVector.GetOctets(); //Card data List<byte> cipherBytes = new List<byte>(); A.DerOctetStringParser cipherContent = (A.DerOctetStringParser)encrContentInfoParser.GetEncryptedContent(A.Asn1Tags.OctetString); using (System.IO.Stream cipherStrm = cipherContent.GetOctetStream()) { int b = cipherStrm.ReadByte(); while (b > -1) { cipherBytes.Add((byte)b); b = cipherStrm.ReadByte(); } } return cipherBytes.ToArray(); }
protected CmsContentInfoParser( Stream data) { if (data == null) throw new ArgumentNullException("data"); this.data = data; try { Asn1StreamParser inStream = new Asn1StreamParser(data); this.contentInfo = new ContentInfoParser((Asn1SequenceParser)inStream.ReadObject()); } catch (IOException e) { throw new CmsException("IOException reading content.", e); } catch (InvalidCastException e) { throw new CmsException("Unexpected object reading content.", e); } }
public Asn1Object ReadObject() { int tag = ReadByte(); if (tag <= 0) { if (tag == 0) throw new IOException("unexpected end-of-contents marker"); return null; } // // calculate tag number // int tagNo = ReadTagNumber(this.s, tag); bool isConstructed = (tag & Asn1Tags.Constructed) != 0; // // calculate length // int length = ReadLength(this.s, limit); if (length < 0) // indefinite length method { if (!isConstructed) throw new IOException("indefinite length primitive encoding encountered"); IndefiniteLengthInputStream indIn = new IndefiniteLengthInputStream(this.s, limit); Asn1StreamParser sp = new Asn1StreamParser(indIn, limit); if ((tag & Asn1Tags.Application) != 0) { return new BerApplicationSpecificParser(tagNo, sp).ToAsn1Object(); } if ((tag & Asn1Tags.Tagged) != 0) { return new BerTaggedObjectParser(true, tagNo, sp).ToAsn1Object(); } // TODO There are other tags that may be constructed (e.g. BitString) switch (tagNo) { case Asn1Tags.OctetString: return new BerOctetStringParser(sp).ToAsn1Object(); case Asn1Tags.Sequence: return new BerSequenceParser(sp).ToAsn1Object(); case Asn1Tags.Set: return new BerSetParser(sp).ToAsn1Object(); case Asn1Tags.External: return new DerExternalParser(sp).ToAsn1Object(); default: throw new IOException("unknown BER object encountered"); } } else { try { return BuildObject(tag, tagNo, length); } catch (ArgumentException e) { throw new Asn1Exception("corrupted stream detected", e); } } }
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: // TODO Add DerUnknownTagParser class? return new DerUnknownTag(true, tagNo, defIn.ToArray()); } } // Some primitive encodings can be handled by parsers too... switch (tagNo) { case Asn1Tags.OctetString: return new DerOctetStringParser(defIn); } try { return Asn1InputStream.CreatePrimitiveDerObject(tagNo, defIn.ToArray()); } catch (ArgumentException e) { throw new Asn1Exception("corrupted stream detected", e); } } }
internal BerOctetStringParser( Asn1StreamParser parser) { _parser = parser; }
private Asn1EncodableVector loadVector( Stream inStream) { Asn1StreamParser aIn = new Asn1StreamParser(inStream); Asn1EncodableVector v = new Asn1EncodableVector(); IAsn1Convertible obj; while ((obj = aIn.ReadObject()) != null) { v.Add(obj.ToAsn1Object()); } return v; }
public Asn1Object ReadObject() { int num = ReadByte(); if (num <= 0) { if (num == 0) { throw new IOException("unexpected end-of-contents marker"); } return(null); } int num2 = ReadTagNumber(s, num); bool flag = (num & 0x20) != 0; int num3 = ReadLength(s, limit); if (num3 >= 0) { try { return(BuildObject(num, num2, num3)); IL_0130: Asn1Object result; return(result); } catch (ArgumentException exception) { throw new Asn1Exception("corrupted stream detected", exception); IL_0144: Asn1Object result; return(result); } } if (!flag) { throw new IOException("indefinite length primitive encoding encountered"); } IndefiniteLengthInputStream inStream = new IndefiniteLengthInputStream(s, limit); Asn1StreamParser parser = new Asn1StreamParser(inStream, limit); if ((num & 0x40) != 0) { return(new BerApplicationSpecificParser(num2, parser).ToAsn1Object()); } if ((num & 0x80) == 0) { switch (num2) { case 4: return(new BerOctetStringParser(parser).ToAsn1Object()); case 16: return(new BerSequenceParser(parser).ToAsn1Object()); case 17: return(new BerSetParser(parser).ToAsn1Object()); case 8: return(new DerExternalParser(parser).ToAsn1Object()); default: throw new IOException("unknown BER object encountered"); } } return(new BerTaggedObjectParser(constructed: true, num2, parser).ToAsn1Object()); }
public Asn1Object ReadObject() { int tag = ReadByte(); if (tag <= 0) { if (tag == 0) { throw new IOException("unexpected end-of-contents marker"); } return(null); } // // calculate tag number // int tagNo = ReadTagNumber(this, tag); bool isConstructed = (tag & Asn1Tags.Constructed) != 0; // // calculate length // int length = ReadLength(this, limit); if (length < 0) // indefinite length method { if (!isConstructed) { throw new IOException("indefinite length primitive encoding encountered"); } IndefiniteLengthInputStream indIn = new IndefiniteLengthInputStream(this); if ((tag & Asn1Tags.Application) != 0) { Asn1StreamParser sp2 = new Asn1StreamParser(indIn); return(new BerApplicationSpecificParser(tagNo, sp2).ToAsn1Object()); } if ((tag & Asn1Tags.Tagged) != 0) { // TODO Investigate passing an Asn1StreamParser into this constructor return(new BerTaggedObjectParser(tag, tagNo, indIn).ToAsn1Object()); } Asn1StreamParser sp = new Asn1StreamParser(indIn); // TODO There are other tags that may be constructed (e.g. BitString) switch (tagNo) { case Asn1Tags.OctetString: return(new BerOctetStringParser(sp).ToAsn1Object()); case Asn1Tags.Sequence: return(new BerSequenceParser(sp).ToAsn1Object()); case Asn1Tags.Set: return(new BerSetParser(sp).ToAsn1Object()); default: throw new IOException("unknown BER object encountered"); } } else { DefiniteLengthInputStream defIn = new DefiniteLengthInputStream(this, length); if ((tag & Asn1Tags.Application) != 0) { return(new DerApplicationSpecific(isConstructed, tagNo, defIn.ToArray())); } if ((tag & Asn1Tags.Tagged) != 0) { return(new BerTaggedObjectParser(tag, tagNo, defIn).ToAsn1Object()); } 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)); default: return(new DerUnknownTag(true, tagNo, defIn.ToArray())); } } return(CreatePrimitiveDerObject(tagNo, defIn.ToArray())); } }
public DerExternalParser(Asn1StreamParser parser) { this._parser = parser; }
internal ConstructedOctetStream( Asn1StreamParser parser) { _parser = parser; }
internal DerSetParser(Asn1StreamParser parser) { this._parser = parser; }
/** * Replace the signerinformation store associated with the passed * in message contained in the stream original with the new one passed in. * You would probably only want to do this if you wanted to change the unsigned * attributes associated with a signer, or perhaps delete one. * <p> * The output stream is returned unclosed. * </p> * @param original the signed data stream to be used as a base. * @param signerInformationStore the new signer information store to use. * @param out the stream to Write the new signed data object to. * @return out. */ public static Stream ReplaceSigners( Stream original, SignerInformationStore signerInformationStore, Stream outStr) { Asn1StreamParser inStr = new Asn1StreamParser(original, CmsUtilities.MaximumMemory); ContentInfoParser contentInfo = new ContentInfoParser((Asn1SequenceParser)inStr.ReadObject()); SignedDataParser signedData = SignedDataParser.GetInstance(contentInfo.GetContent(Asn1Tags.Sequence)); BerSequenceGenerator sGen = new BerSequenceGenerator(outStr); sGen.AddObject(CmsObjectIdentifiers.SignedData); BerSequenceGenerator sigGen = new BerSequenceGenerator(sGen.GetRawOutputStream(), 0, true); // version number sigGen.AddObject(signedData.Version); // digests signedData.GetDigestAlgorithms().ToAsn1Object(); // skip old ones Asn1EncodableVector digestAlgs = new Asn1EncodableVector(); foreach (SignerInformation signer in signerInformationStore.GetSigners()) { digestAlgs.Add(FixAlgID(signer.DigestAlgorithmID)); } WriteToGenerator(sigGen, new DerSet(digestAlgs)); // encap content info ContentInfoParser encapContentInfo = signedData.GetEncapContentInfo(); BerSequenceGenerator eiGen = new BerSequenceGenerator(sigGen.GetRawOutputStream()); eiGen.AddObject(encapContentInfo.ContentType); Asn1OctetStringParser octs = (Asn1OctetStringParser)encapContentInfo.GetContent(Asn1Tags.OctetString); if (octs != null) { BerOctetStringGenerator octGen = new BerOctetStringGenerator( eiGen.GetRawOutputStream(), 0, true); byte[] inBuffer = new byte[4096]; byte[] outBuffer = new byte[4096]; Stream inOctets = octs.GetOctetStream(); Stream outOctets = octGen.GetOctetOutputStream(outBuffer); int len; while ((len = inOctets.Read(inBuffer, 0, inBuffer.Length)) > 0) { outOctets.Write(inBuffer, 0, len); } outOctets.Close(); } eiGen.Close(); WriteSetToGeneratorTagged(sigGen, signedData.GetCertificates(), 0); WriteSetToGeneratorTagged(sigGen, signedData.GetCrls(), 1); Asn1EncodableVector signerInfos = new Asn1EncodableVector(); foreach (SignerInformation signer in signerInformationStore.GetSigners()) { signerInfos.Add(signer.ToSignerInfo()); } WriteToGenerator(sigGen, new DerSet(signerInfos)); sigGen.Close(); sGen.Close(); return outStr; }
/** * Replace the certificate and CRL information associated with this * CMSSignedData object with the new one passed in. * <p> * The output stream is returned unclosed. * </p> * @param original the signed data stream to be used as a base. * @param certsAndCrls the new certificates and CRLs to be used. * @param out the stream to Write the new signed data object to. * @return out. * @exception CmsException if there is an error processing the CertStore */ public static Stream ReplaceCertificatesAndCrls( Stream original, IX509Store x509Certs, IX509Store x509Crls, IX509Store x509AttrCerts, Stream outStr) { if (x509AttrCerts != null) throw new NotImplementedException("Currently can't replace attribute certificates"); Asn1StreamParser inStr = new Asn1StreamParser(original, CmsUtilities.MaximumMemory); ContentInfoParser contentInfo = new ContentInfoParser((Asn1SequenceParser)inStr.ReadObject()); SignedDataParser signedData = SignedDataParser.GetInstance(contentInfo.GetContent(Asn1Tags.Sequence)); BerSequenceGenerator sGen = new BerSequenceGenerator(outStr); sGen.AddObject(CmsObjectIdentifiers.SignedData); BerSequenceGenerator sigGen = new BerSequenceGenerator(sGen.GetRawOutputStream(), 0, true); // version number sigGen.AddObject(signedData.Version); // digests WriteToGenerator(sigGen, signedData.GetDigestAlgorithms().ToAsn1Object()); // encap content info ContentInfoParser encapContentInfo = signedData.GetEncapContentInfo(); BerSequenceGenerator eiGen = new BerSequenceGenerator(sigGen.GetRawOutputStream()); eiGen.AddObject(encapContentInfo.ContentType); Asn1OctetStringParser octs = (Asn1OctetStringParser)encapContentInfo.GetContent(Asn1Tags.OctetString); if (octs != null) { BerOctetStringGenerator octGen = new BerOctetStringGenerator(eiGen.GetRawOutputStream(), 0, true); byte[] inBuffer = new byte[4096]; byte[] outBuffer = new byte[4096]; Stream inOctets = octs.GetOctetStream(); Stream outOctets = octGen.GetOctetOutputStream(outBuffer); int len; while ((len = inOctets.Read(inBuffer, 0, inBuffer.Length)) > 0) { outOctets.Write(inBuffer, 0, len); } outOctets.Close(); } eiGen.Close(); // // skip existing certs and CRLs // GetAsn1Set(signedData.GetCertificates()); GetAsn1Set(signedData.GetCrls()); // // replace the certs and crls in the SignedData object // Asn1Set certs; try { certs = CmsUtilities.CreateDerSetFromList( CmsUtilities.GetCertificatesFromStore(x509Certs)); } catch (X509StoreException e) { throw new CmsException("error getting certs from certStore", e); } if (certs.Count > 0) { WriteToGenerator(sigGen, new DerTaggedObject(false, 0, certs)); } Asn1Set crls; try { crls = CmsUtilities.CreateDerSetFromList( CmsUtilities.GetCrlsFromStore(x509Crls)); } catch (X509StoreException e) { throw new CmsException("error getting crls from certStore", e); } if (crls.Count > 0) { WriteToGenerator(sigGen, new DerTaggedObject(false, 1, crls)); } WriteToGenerator(sigGen, signedData.GetSignerInfos().ToAsn1Object()); sigGen.Close(); sGen.Close(); return outStr; }
internal BerApplicationSpecificParser(int tag, Asn1StreamParser parser) { this.tag = tag; this.parser = parser; }
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); if ((tag & Asn1Tags.Application) != 0) { Asn1StreamParser sp2 = new Asn1StreamParser(indIn, _limit); return(new BerApplicationSpecificParser(tagNo, sp2)); } if ((tag & Asn1Tags.Tagged) != 0) { // TODO Investigate passing an Asn1StreamParser into this constructor return(new BerTaggedObjectParser(tag, tagNo, indIn)); } Asn1StreamParser sp = new Asn1StreamParser(indIn, _limit); // TODO There are other tags that may be constructed (e.g. BitString) switch (tagNo) { case Asn1Tags.OctetString: return(new BerOctetStringParser(sp)); case Asn1Tags.Sequence: return(new BerSequenceParser(sp)); case Asn1Tags.Set: return(new BerSetParser(sp)); case Asn1Tags.External: return(new DerExternalParser(sp)); default: throw new IOException("unknown BER object encountered: 0x" + tagNo.ToString("X")); } } 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(tag, tagNo, 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: // TODO Add DerUnknownTagParser class? return(new DerUnknownTag(true, tagNo, defIn.ToArray())); } } // Some primitive encodings can be handled by parsers too... switch (tagNo) { case Asn1Tags.OctetString: return(new DerOctetStringParser(defIn)); } return(Asn1InputStream.CreatePrimitiveDerObject(tagNo, defIn.ToArray())); } }
private static String FormatX509Name(X500DistinguishedName name) { Asn1StreamParser parser = new Asn1StreamParser(name.RawData); X509Name _name = X509Name.GetInstance(parser.ReadObject().ToAsn1Object()); return _name.ToString(true, X509Name.RFC1779Symbols); }
public Asn1Object ReadObject() { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Expected O, but got Unknown int num = ((Stream)this).ReadByte(); if (num <= 0) { if (num == 0) { throw new IOException("unexpected end-of-contents marker"); } return(null); } int num2 = ReadTagNumber(s, num); bool flag = (num & 0x20) != 0; int num3 = ReadLength(s, limit); if (num3 < 0) { if (!flag) { throw new IOException("indefinite length primitive encoding encountered"); } IndefiniteLengthInputStream inStream = new IndefiniteLengthInputStream(s, limit); Asn1StreamParser parser = new Asn1StreamParser((Stream)(object)inStream, limit); if (((uint)num & 0x40u) != 0) { return(new BerApplicationSpecificParser(num2, parser).ToAsn1Object()); } if (((uint)num & 0x80u) != 0) { return(new BerTaggedObjectParser(constructed: true, num2, parser).ToAsn1Object()); } switch (num2) { case 4: return(new BerOctetStringParser(parser).ToAsn1Object()); case 16: return(new BerSequenceParser(parser).ToAsn1Object()); case 17: return(new BerSetParser(parser).ToAsn1Object()); case 8: return(new DerExternalParser(parser).ToAsn1Object()); default: throw new IOException("unknown BER object encountered"); } } try { return(BuildObject(num, num2, num3)); } catch (ArgumentException val) { ArgumentException exception = val; throw new Asn1Exception("corrupted stream detected", (global::System.Exception)(object) exception); } }
internal BerTaggedObjectParser(bool constructed, int tagNumber, Asn1StreamParser parser) { this._constructed = constructed; this._tagNumber = tagNumber; this._parser = parser; }
public Asn1Object ReadObject() { int tag = ReadByte(); if (tag <= 0) { if (tag == 0) throw new IOException("unexpected end-of-contents marker"); return null; } // // calculate tag number // int tagNo = ReadTagNumber(this, tag); bool isConstructed = (tag & Asn1Tags.Constructed) != 0; // // calculate length // int length = ReadLength(this, limit); if (length < 0) // indefinite length method { if (!isConstructed) throw new IOException("indefinite length primitive encoding encountered"); IndefiniteLengthInputStream indIn = new IndefiniteLengthInputStream(this); if ((tag & Asn1Tags.Application) != 0) { Asn1StreamParser sp2 = new Asn1StreamParser(indIn); return new BerApplicationSpecificParser(tagNo, sp2).ToAsn1Object(); } if ((tag & Asn1Tags.Tagged) != 0) { // TODO Investigate passing an Asn1StreamParser into this constructor return new BerTaggedObjectParser(tag, tagNo, indIn).ToAsn1Object(); } Asn1StreamParser sp = new Asn1StreamParser(indIn); // TODO There are other tags that may be constructed (e.g. BitString) switch (tagNo) { case Asn1Tags.OctetString: return new BerOctetStringParser(sp).ToAsn1Object(); case Asn1Tags.Sequence: return new BerSequenceParser(sp).ToAsn1Object(); case Asn1Tags.Set: return new BerSetParser(sp).ToAsn1Object(); default: throw new IOException("unknown BER object encountered"); } } else { DefiniteLengthInputStream defIn = new DefiniteLengthInputStream(this, length); if ((tag & Asn1Tags.Application) != 0) { return new DerApplicationSpecific(isConstructed, tagNo, defIn.ToArray()); } if ((tag & Asn1Tags.Tagged) != 0) { return new BerTaggedObjectParser(tag, tagNo, defIn).ToAsn1Object(); } 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); default: return new DerUnknownTag(true, tagNo, defIn.ToArray()); } } return CreatePrimitiveDerObject(tagNo, defIn.ToArray()); } }
public Asn1Object ReadObject() { int tag = ReadByte(); if (tag <= 0) { if (tag == 0) { throw new IOException("unexpected end-of-contents marker"); } return(null); } // // calculate tag number // int tagNo = ReadTagNumber(this.s, tag); bool isConstructed = (tag & Asn1Tags.Constructed) != 0; // // calculate length // int length = ReadLength(this.s, limit); if (length < 0) // indefinite length method { if (!isConstructed) { throw new IOException("indefinite length primitive encoding encountered"); } IndefiniteLengthInputStream indIn = new IndefiniteLengthInputStream(this.s, limit); Asn1StreamParser sp = new Asn1StreamParser(indIn, limit); if ((tag & Asn1Tags.Application) != 0) { return(new BerApplicationSpecificParser(tagNo, sp).ToAsn1Object()); } if ((tag & Asn1Tags.Tagged) != 0) { return(new BerTaggedObjectParser(true, tagNo, sp).ToAsn1Object()); } // TODO There are other tags that may be constructed (e.g. BitString) switch (tagNo) { case Asn1Tags.OctetString: return(new BerOctetStringParser(sp).ToAsn1Object()); case Asn1Tags.Sequence: return(new BerSequenceParser(sp).ToAsn1Object()); case Asn1Tags.Set: return(new BerSetParser(sp).ToAsn1Object()); case Asn1Tags.External: return(new DerExternalParser(sp).ToAsn1Object()); default: throw new IOException("unknown BER object encountered"); } } else { try { return(BuildObject(tag, tagNo, length)); } catch (ArgumentException e) { throw new Asn1Exception("corrupted stream detected", e); } } }
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) { try { return(Asn1InputStream.CreatePrimitiveDerObject(num2, definiteLengthInputStream, tmpBuffers)); IL_019e: IAsn1Convertible result; return(result); } catch (ArgumentException exception) { throw new Asn1Exception("corrupted stream detected", exception); IL_01b2: IAsn1Convertible result; return(result); } } return(new DerOctetStringParser(definiteLengthInputStream)); }