public CmsEnvelopedDataParser( Stream envelopedData) : base(envelopedData) { this._attrNotRead = true; this.envelopedData = new EnvelopedDataParser( (Asn1SequenceParser)this.contentInfo.GetContent(Asn1Tags.Sequence)); // TODO Validate version? //DerInteger version = this.envelopedData.Version; // // read the recipients // Asn1Set recipientInfos = Asn1Set.GetInstance(this.envelopedData.GetRecipientInfos().ToAsn1Object()); // // read the encrypted content info // EncryptedContentInfoParser encInfo = this.envelopedData.GetEncryptedContentInfo(); this._encAlg = encInfo.ContentEncryptionAlgorithm; CmsReadable readable = new CmsProcessableInputStream( ((Asn1OctetStringParser)encInfo.GetEncryptedContent(Asn1Tags.OctetString)).GetOctetStream()); CmsSecureReadable secureReadable = new CmsEnvelopedHelper.CmsEnvelopedSecureReadable( this._encAlg, readable); // // build the RecipientInformationStore // this.recipientInfoStore = CmsEnvelopedHelper.BuildRecipientInformationStore( recipientInfos, secureReadable); }
public CmsEnvelopedDataParser( Stream envelopedData) : base(envelopedData) { this._attrNotRead = true; this.envelopedData = new EnvelopedDataParser( (Asn1SequenceParser)this.contentInfo.GetContent(Asn1Tags.Sequence)); // // load the RecepientInfoStore // Asn1SetParser s = this.envelopedData.GetRecipientInfos(); IList baseInfos = new ArrayList(); Asn1Set set = Asn1Set.GetInstance(s.ToAsn1Object()); foreach (object o in set) { baseInfos.Add(RecipientInfo.GetInstance(o)); } // // read the encrypted content info // EncryptedContentInfoParser encInfo = this.envelopedData.GetEncryptedContentInfo(); this._encAlg = encInfo.ContentEncryptionAlgorithm; // // prime the recepients // IList infos = new ArrayList(); Stream dataStream = ((Asn1OctetStringParser)encInfo.GetEncryptedContent(Asn1Tags.OctetString)).GetOctetStream(); foreach (Asn1.Cms.RecipientInfo info in baseInfos) { Asn1Encodable recipInfo = info.Info; if (recipInfo is Asn1.Cms.KeyTransRecipientInfo) { infos.Add(new KeyTransRecipientInformation( (KeyTransRecipientInfo) recipInfo, _encAlg, dataStream)); } else if (recipInfo is Asn1.Cms.KekRecipientInfo) { infos.Add(new KekRecipientInformation( (KekRecipientInfo) recipInfo, _encAlg, dataStream)); } else if (recipInfo is KeyAgreeRecipientInfo) { infos.Add(new KeyAgreeRecipientInformation( (KeyAgreeRecipientInfo) recipInfo, _encAlg, dataStream)); } else if (recipInfo is PasswordRecipientInfo) { infos.Add(new PasswordRecipientInformation( (PasswordRecipientInfo) recipInfo, _encAlg, dataStream)); } } this.recipientInfoStore = new RecipientInformationStore(infos); }
private ITestResult EnvelopedTest() { try { // Key trans ContentInfo info = ContentInfo.GetInstance( Asn1Object.FromByteArray(envDataKeyTrns)); EnvelopedData envData = EnvelopedData.GetInstance(info.Content); Asn1Set s = envData.RecipientInfos; if (s.Count != 1) { return new SimpleTestResult(false, Name + ": CMS KeyTrans enveloped, wrong number of recipients"); } RecipientInfo recip = RecipientInfo.GetInstance(s[0]); if (recip.Info is KeyTransRecipientInfo) { KeyTransRecipientInfo inf = KeyTransRecipientInfo.GetInstance(recip.Info); inf = new KeyTransRecipientInfo(inf.RecipientIdentifier, inf.KeyEncryptionAlgorithm, inf.EncryptedKey); s = new DerSet(new RecipientInfo(inf)); } else { return new SimpleTestResult(false, Name + ": CMS KeyTrans enveloped, wrong recipient type"); } envData = new EnvelopedData(envData.OriginatorInfo, s, envData.EncryptedContentInfo, envData.UnprotectedAttrs); info = new ContentInfo(CmsObjectIdentifiers.EnvelopedData, envData); if (!Arrays.AreEqual(info.GetEncoded(), envDataKeyTrns)) { return new SimpleTestResult(false, Name + ": CMS KeyTrans enveloped failed to re-encode"); } // KEK info = ContentInfo.GetInstance( Asn1Object.FromByteArray(envDataKEK)); envData = EnvelopedData.GetInstance(info.Content); s = envData.RecipientInfos; if (s.Count != 1) { return new SimpleTestResult(false, Name + ": CMS KEK enveloped, wrong number of recipients"); } recip = RecipientInfo.GetInstance(s[0]); if (recip.Info is KekRecipientInfo) { KekRecipientInfo inf = KekRecipientInfo.GetInstance(recip.Info); inf = new KekRecipientInfo(inf.KekID, inf.KeyEncryptionAlgorithm, inf.EncryptedKey); s = new DerSet(new RecipientInfo(inf)); } else { return new SimpleTestResult(false, Name + ": CMS KEK enveloped, wrong recipient type"); } envData = new EnvelopedData(envData.OriginatorInfo, s, envData.EncryptedContentInfo, envData.UnprotectedAttrs); info = new ContentInfo(CmsObjectIdentifiers.EnvelopedData, envData); if (!Arrays.AreEqual(info.GetEncoded(), envDataKEK)) { return new SimpleTestResult(false, Name + ": CMS KEK enveloped failed to re-encode"); } // Nested NDEF problem Asn1StreamParser asn1In = new Asn1StreamParser(new MemoryStream(envDataNestedNDEF, false)); ContentInfoParser ci = new ContentInfoParser((Asn1SequenceParser)asn1In.ReadObject()); EnvelopedDataParser ed = new EnvelopedDataParser((Asn1SequenceParser)ci .GetContent(Asn1Tags.Sequence)); Touch(ed.Version); ed.GetOriginatorInfo(); ed.GetRecipientInfos().ToAsn1Object(); EncryptedContentInfoParser eci = ed.GetEncryptedContentInfo(); Touch(eci.ContentType); Touch(eci.ContentEncryptionAlgorithm); Stream dataIn = ((Asn1OctetStringParser)eci.GetEncryptedContent(Asn1Tags.OctetString)) .GetOctetStream(); Streams.Drain(dataIn); dataIn.Close(); // Test data doesn't have unprotected attrs, bug was being thrown by this call Asn1SetParser upa = ed.GetUnprotectedAttrs(); if (upa != null) { upa.ToAsn1Object(); } return new SimpleTestResult(true, Name + ": Okay"); } catch (Exception e) { return new SimpleTestResult(false, Name + ": CMS enveloped failed - " + e.ToString(), e); } }
private void ParseEnveloped( byte[] data) { Asn1StreamParser aIn = new Asn1StreamParser(data); ContentInfoParser cP = new ContentInfoParser((Asn1SequenceParser)aIn.ReadObject()); EnvelopedDataParser eP = new EnvelopedDataParser((Asn1SequenceParser)cP.GetContent(Asn1Tags.Sequence)); eP.GetRecipientInfos().ToAsn1Object(); // Must drain the parser! EncryptedContentInfoParser ecP = eP.GetEncryptedContentInfo(); Asn1OctetStringParser content = (Asn1OctetStringParser)ecP.GetEncryptedContent(Asn1Tags.OctetString); Streams.Drain(content.GetOctetStream()); }