// 
// Decompiled by Procyon v0.6.0
// 

package org.bouncycastle.cms;

import org.bouncycastle.asn1.ASN1EncodableVector;
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.cms.ContentInfo;
import org.bouncycastle.asn1.ASN1Set;
import org.bouncycastle.asn1.cms.EnvelopedData;
import org.bouncycastle.asn1.DERSet;
import org.bouncycastle.asn1.cms.CMSObjectIdentifiers;
import java.io.IOException;
import org.bouncycastle.operator.OutputAEADEncryptor;
import java.io.OutputStream;
import java.io.ByteArrayOutputStream;
import org.bouncycastle.operator.OutputEncryptor;

public class CMSEnvelopedDataGenerator extends CMSEnvelopedGenerator
{
    private CMSEnvelopedData doGenerate(final CMSTypedData cmsTypedData, final OutputEncryptor outputEncryptor) throws CMSException {
        final ASN1EncodableVector recipentInfos = CMSUtils.getRecipentInfos(outputEncryptor.getKey(), this.recipientInfoGenerators);
        final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        try {
            final OutputStream outputStream = outputEncryptor.getOutputStream(byteArrayOutputStream);
            cmsTypedData.write(outputStream);
            outputStream.close();
            if (outputEncryptor instanceof OutputAEADEncryptor) {
                final byte[] mac = ((OutputAEADEncryptor)outputEncryptor).getMAC();
                byteArrayOutputStream.write(mac, 0, mac.length);
            }
        }
        catch (final IOException ex) {
            throw new CMSException("");
        }
        return new CMSEnvelopedData(new ContentInfo(CMSObjectIdentifiers.envelopedData, new EnvelopedData(this.originatorInfo, new DERSet(recipentInfos), CMSUtils.getEncryptedContentInfo(cmsTypedData, outputEncryptor, byteArrayOutputStream.toByteArray()), CMSUtils.getAttrBERSet(this.unprotectedAttributeGenerator))));
    }
    
    public CMSEnvelopedData generate(final CMSTypedData cmsTypedData, final OutputEncryptor outputEncryptor) throws CMSException {
        return this.doGenerate(cmsTypedData, outputEncryptor);
    }
}
