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

package org.bouncycastle.cms;

import java.util.List;
import java.io.IOException;
import java.util.Collection;
import java.util.ArrayList;
import org.bouncycastle.asn1.cms.SignerInfo;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import java.util.Iterator;
import org.bouncycastle.asn1.ASN1Set;
import org.bouncycastle.asn1.cms.SignedData;
import org.bouncycastle.asn1.DERSet;
import org.bouncycastle.asn1.cms.ContentInfo;
import org.bouncycastle.asn1.cms.CMSObjectIdentifiers;
import org.bouncycastle.asn1.BEROctetString;
import org.bouncycastle.asn1.DEROctetString;
import java.io.OutputStream;
import java.io.ByteArrayOutputStream;
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import java.util.Set;
import org.bouncycastle.asn1.ASN1EncodableVector;
import java.util.LinkedHashSet;
import org.bouncycastle.operator.DigestAlgorithmIdentifierFinder;

public class CMSSignedDataGenerator extends CMSSignedGenerator
{
    private boolean isDefiniteLength;
    
    public CMSSignedDataGenerator() {
        this.isDefiniteLength = false;
    }
    
    public CMSSignedDataGenerator(final DigestAlgorithmIdentifierFinder digestAlgorithmIdentifierFinder) {
        super(digestAlgorithmIdentifierFinder);
        this.isDefiniteLength = false;
    }
    
    public void setDefiniteLengthEncoding(final boolean isDefiniteLength) {
        this.isDefiniteLength = isDefiniteLength;
    }
    
    public CMSSignedData generate(final CMSTypedData cmsTypedData) throws CMSException {
        return this.generate(cmsTypedData, false);
    }
    
    public CMSSignedData generate(final CMSTypedData cmsTypedData, final boolean b) throws CMSException {
        final LinkedHashSet set = new LinkedHashSet();
        final ASN1EncodableVector asn1EncodableVector = new ASN1EncodableVector();
        this.digests.clear();
        for (final SignerInformation signerInformation : this._signers) {
            CMSUtils.addDigestAlgs(set, signerInformation, this.digestAlgIdFinder);
            asn1EncodableVector.add(signerInformation.toASN1Structure());
        }
        final ASN1ObjectIdentifier contentType = cmsTypedData.getContentType();
        ASN1Encodable asn1Encodable = null;
        if (cmsTypedData.getContent() != null) {
            if (b) {
                final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                this.writeContentViaSignerGens(cmsTypedData, byteArrayOutputStream);
                if (this.isDefiniteLength) {
                    asn1Encodable = new DEROctetString(byteArrayOutputStream.toByteArray());
                }
                else {
                    asn1Encodable = new BEROctetString(byteArrayOutputStream.toByteArray());
                }
            }
            else {
                this.writeContentViaSignerGens(cmsTypedData, null);
            }
        }
        final Iterator iterator2 = this.signerGens.iterator();
        while (iterator2.hasNext()) {
            final SignerInfo generateSignerInfo = this.generateSignerInfo((SignerInfoGenerator)iterator2.next(), contentType);
            set.add(generateSignerInfo.getDigestAlgorithm());
            asn1EncodableVector.add(generateSignerInfo);
        }
        return new CMSSignedData(cmsTypedData, new ContentInfo(CMSObjectIdentifiers.signedData, new SignedData(CMSUtils.convertToDlSet(set), new ContentInfo(contentType, asn1Encodable), createSetFromList(this.certs, this.isDefiniteLength), createSetFromList(this.crls, this.isDefiniteLength), new DERSet(asn1EncodableVector))));
    }
    
    public SignerInformationStore generateCounterSigners(final SignerInformation signerInformation) throws CMSException {
        this.digests.clear();
        final CMSProcessableByteArray cmsProcessableByteArray = new CMSProcessableByteArray(null, signerInformation.getSignature());
        final ArrayList list = new ArrayList();
        final Iterator iterator = this._signers.iterator();
        while (iterator.hasNext()) {
            list.add(new SignerInformation(((SignerInformation)iterator.next()).toASN1Structure(), null, cmsProcessableByteArray, null));
        }
        this.writeContentViaSignerGens(cmsProcessableByteArray, null);
        final Iterator iterator2 = this.signerGens.iterator();
        while (iterator2.hasNext()) {
            list.add(new SignerInformation(this.generateSignerInfo((SignerInfoGenerator)iterator2.next(), null), null, cmsProcessableByteArray, null));
        }
        return new SignerInformationStore(list);
    }
    
    private SignerInfo generateSignerInfo(final SignerInfoGenerator signerInfoGenerator, final ASN1ObjectIdentifier asn1ObjectIdentifier) throws CMSException {
        final SignerInfo generate = signerInfoGenerator.generate(asn1ObjectIdentifier);
        final byte[] calculatedDigest = signerInfoGenerator.getCalculatedDigest();
        if (calculatedDigest != null) {
            this.digests.put(generate.getDigestAlgorithm().getAlgorithm().getId(), calculatedDigest);
        }
        return generate;
    }
    
    private void writeContentViaSignerGens(final CMSTypedData cmsTypedData, final OutputStream outputStream) throws CMSException {
        final OutputStream safeOutputStream = CMSUtils.getSafeOutputStream(CMSUtils.attachSignersToOutputStream(this.signerGens, outputStream));
        try {
            cmsTypedData.write(safeOutputStream);
            safeOutputStream.close();
        }
        catch (final IOException ex) {
            throw new CMSException("data processing exception: " + ex.getMessage(), ex);
        }
    }
    
    private static ASN1Set createSetFromList(final List list, final boolean b) {
        return (list.size() < 1) ? null : (b ? CMSUtils.createDlSetFromList(list) : CMSUtils.createBerSetFromList(list));
    }
}
