// 
// 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.ASN1OctetString;
import org.bouncycastle.asn1.ASN1Set;
import org.bouncycastle.asn1.cms.AuthEnvelopedData;
import org.bouncycastle.asn1.DEROctetString;
import org.bouncycastle.operator.OutputEncryptor;
import org.bouncycastle.asn1.DERSet;
import org.bouncycastle.asn1.cms.CMSObjectIdentifiers;
import java.io.IOException;
import org.bouncycastle.asn1.ASN1Primitive;
import java.io.OutputStream;
import java.io.ByteArrayOutputStream;
import org.bouncycastle.operator.OutputAEADEncryptor;

public class CMSAuthEnvelopedDataGenerator extends CMSAuthEnvelopedGenerator
{
    private CMSAuthEnvelopedData doGenerate(final CMSTypedData cmsTypedData, final OutputAEADEncryptor outputAEADEncryptor) throws CMSException {
        final ASN1EncodableVector recipentInfos = CMSUtils.getRecipentInfos(outputAEADEncryptor.getKey(), this.recipientInfoGenerators);
        final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ASN1Set set;
        try {
            final OutputStream outputStream = outputAEADEncryptor.getOutputStream(byteArrayOutputStream);
            if (CMSAlgorithm.ChaCha20Poly1305.equals(outputAEADEncryptor.getAlgorithmIdentifier().getAlgorithm())) {
                set = CMSUtils.processAuthAttrSet(this.authAttrsGenerator, outputAEADEncryptor);
                cmsTypedData.write(outputStream);
            }
            else {
                cmsTypedData.write(outputStream);
                set = CMSUtils.processAuthAttrSet(this.authAttrsGenerator, outputAEADEncryptor);
            }
            outputStream.close();
        }
        catch (final IOException ex) {
            throw new CMSException("unable to process authenticated content: " + ex.getMessage(), ex);
        }
        return new CMSAuthEnvelopedData(new ContentInfo(CMSObjectIdentifiers.authEnvelopedData, new AuthEnvelopedData(this.originatorInfo, new DERSet(recipentInfos), CMSUtils.getEncryptedContentInfo(cmsTypedData, outputAEADEncryptor, byteArrayOutputStream.toByteArray()), set, new DEROctetString(outputAEADEncryptor.getMAC()), CMSUtils.getAttrDLSet(this.unauthAttrsGenerator))));
    }
    
    public CMSAuthEnvelopedData generate(final CMSTypedData cmsTypedData, final OutputAEADEncryptor outputAEADEncryptor) throws CMSException {
        return this.doGenerate(cmsTypedData, outputAEADEncryptor);
    }
}
