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

package org.bouncycastle.its;

import org.bouncycastle.oer.its.template.ieee1609dot2.IEEE1609dot2;
import java.io.OutputStream;
import org.bouncycastle.oer.its.ieee1609dot2.basetypes.HashedId8;
import java.util.Iterator;
import org.bouncycastle.oer.its.ieee1609dot2.SequenceOfCertificate;
import org.bouncycastle.oer.its.ieee1609dot2.Certificate;
import java.util.ArrayList;
import java.util.List;
import org.bouncycastle.its.operator.ECDSAEncoder;
import org.bouncycastle.oer.its.ieee1609dot2.SignerIdentifier;
import org.bouncycastle.oer.its.ieee1609dot2.SignedData;
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.oer.OEREncoder;
import org.bouncycastle.its.operator.ITSContentSigner;
import org.bouncycastle.oer.its.ieee1609dot2.SignedDataPayload;
import org.bouncycastle.oer.its.ieee1609dot2.ToBeSignedData;
import org.bouncycastle.oer.its.ieee1609dot2.Opaque;
import org.bouncycastle.oer.its.ieee1609dot2.basetypes.UINT8;
import org.bouncycastle.oer.its.ieee1609dot2.Ieee1609Dot2Content;
import org.bouncycastle.oer.its.ieee1609dot2.basetypes.Time64;
import org.bouncycastle.oer.its.ieee1609dot2.basetypes.Psid;
import org.bouncycastle.oer.its.ieee1609dot2.HashedData;
import org.bouncycastle.oer.its.ieee1609dot2.Ieee1609Dot2Data;
import org.bouncycastle.oer.its.ieee1609dot2.HeaderInfo;
import org.bouncycastle.oer.Element;

public class ETSISignedDataBuilder
{
    private static final Element def;
    private final HeaderInfo headerInfo;
    private Ieee1609Dot2Data data;
    private HashedData extDataHash;
    
    private ETSISignedDataBuilder(final Psid psid) {
        this(HeaderInfo.builder().setPsid(psid).setGenerationTime(Time64.now()).createHeaderInfo());
    }
    
    private ETSISignedDataBuilder(final HeaderInfo headerInfo) {
        this.headerInfo = headerInfo;
    }
    
    public static ETSISignedDataBuilder builder(final Psid psid) {
        return new ETSISignedDataBuilder(psid);
    }
    
    public static ETSISignedDataBuilder builder(final HeaderInfo headerInfo) {
        return new ETSISignedDataBuilder(headerInfo);
    }
    
    public ETSISignedDataBuilder setData(final Ieee1609Dot2Content content) {
        this.data = Ieee1609Dot2Data.builder().setProtocolVersion(new UINT8(3)).setContent(content).createIeee1609Dot2Data();
        return this;
    }
    
    public ETSISignedDataBuilder setUnsecuredData(final byte[] array) {
        this.data = Ieee1609Dot2Data.builder().setProtocolVersion(new UINT8(3)).setContent(Ieee1609Dot2Content.unsecuredData(new Opaque(array))).createEtsiTs103097Data();
        return this;
    }
    
    public ETSISignedDataBuilder setExtDataHash(final HashedData extDataHash) {
        this.extDataHash = extDataHash;
        return this;
    }
    
    private ToBeSignedData getToBeSignedData() {
        return ToBeSignedData.builder().setPayload(new SignedDataPayload(this.data, this.extDataHash)).setHeaderInfo(this.headerInfo).createToBeSignedData();
    }
    
    public ETSISignedData build(final ITSContentSigner itsContentSigner) {
        final ToBeSignedData toBeSignedData = this.getToBeSignedData();
        write(itsContentSigner.getOutputStream(), OEREncoder.toByteArray(toBeSignedData, ETSISignedDataBuilder.def));
        return new ETSISignedData(SignedData.builder().setHashId(ITSAlgorithmUtils.getHashAlgorithm(itsContentSigner.getDigestAlgorithm().getAlgorithm())).setTbsData(toBeSignedData).setSigner(SignerIdentifier.self()).setSignature(ECDSAEncoder.toITS(itsContentSigner.getCurveID(), itsContentSigner.getSignature())).createSignedData());
    }
    
    public ETSISignedData build(final ITSContentSigner itsContentSigner, final List<ITSCertificate> list) {
        final ToBeSignedData toBeSignedData = this.getToBeSignedData();
        write(itsContentSigner.getOutputStream(), OEREncoder.toByteArray(toBeSignedData, ETSISignedDataBuilder.def));
        final ArrayList list2 = new ArrayList();
        final Iterator<ITSCertificate> iterator = list.iterator();
        while (iterator.hasNext()) {
            list2.add(Certificate.getInstance(iterator.next().toASN1Structure()));
        }
        return new ETSISignedData(SignedData.builder().setHashId(ITSAlgorithmUtils.getHashAlgorithm(itsContentSigner.getDigestAlgorithm().getAlgorithm())).setTbsData(toBeSignedData).setSigner(SignerIdentifier.certificate(new SequenceOfCertificate(list2))).setSignature(ECDSAEncoder.toITS(itsContentSigner.getCurveID(), itsContentSigner.getSignature())).createSignedData());
    }
    
    public ETSISignedData build(final ITSContentSigner itsContentSigner, final HashedId8 hashedId8) {
        final ToBeSignedData toBeSignedData = this.getToBeSignedData();
        write(itsContentSigner.getOutputStream(), OEREncoder.toByteArray(toBeSignedData, ETSISignedDataBuilder.def));
        return new ETSISignedData(SignedData.builder().setHashId(ITSAlgorithmUtils.getHashAlgorithm(itsContentSigner.getDigestAlgorithm().getAlgorithm())).setTbsData(toBeSignedData).setSigner(SignerIdentifier.digest(hashedId8)).setSignature(ECDSAEncoder.toITS(itsContentSigner.getCurveID(), itsContentSigner.getSignature())).createSignedData());
    }
    
    private static void write(final OutputStream outputStream, final byte[] b) {
        try {
            outputStream.write(b);
            outputStream.flush();
            outputStream.close();
        }
        catch (final Exception cause) {
            throw new RuntimeException(cause.getMessage(), cause);
        }
    }
    
    static {
        def = IEEE1609dot2.ToBeSignedData.build();
    }
}
