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

package org.bouncycastle.its;

import org.bouncycastle.oer.its.template.etsi103097.EtsiTs103097Module;
import java.io.OutputStream;
import org.bouncycastle.operator.ContentVerifier;
import org.bouncycastle.its.operator.ECDSAEncoder;
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.oer.OEREncoder;
import org.bouncycastle.oer.its.template.ieee1609dot2.IEEE1609dot2;
import org.bouncycastle.its.operator.ITSContentVerifierProvider;
import org.bouncycastle.oer.its.ieee1609dot2.Ieee1609Dot2Content;
import org.bouncycastle.oer.its.etsi103097.EtsiTs103097DataSigned;
import org.bouncycastle.oer.OERInputStream;
import java.io.InputStream;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import org.bouncycastle.oer.its.ieee1609dot2.Opaque;
import org.bouncycastle.oer.Element;
import org.bouncycastle.oer.its.ieee1609dot2.SignedData;

public class ETSISignedData
{
    private final SignedData signedData;
    private static final Element oerDef;
    
    public ETSISignedData(final Opaque opaque) throws IOException {
        this(opaque.getInputStream());
    }
    
    public ETSISignedData(final byte[] buf) throws IOException {
        this(new ByteArrayInputStream(buf));
    }
    
    public ETSISignedData(final InputStream inputStream) throws IOException {
        OERInputStream oerInputStream;
        if (inputStream instanceof OERInputStream) {
            oerInputStream = (OERInputStream)inputStream;
        }
        else {
            oerInputStream = new OERInputStream(inputStream);
        }
        final Ieee1609Dot2Content content = EtsiTs103097DataSigned.getInstance(oerInputStream.parse(ETSISignedData.oerDef)).getContent();
        if (content.getChoice() != 1) {
            throw new IllegalStateException("EtsiTs103097Data-Signed did not have signed data content");
        }
        this.signedData = SignedData.getInstance(content.getIeee1609Dot2Content());
    }
    
    public ETSISignedData(final EtsiTs103097DataSigned etsiTs103097DataSigned) {
        if (etsiTs103097DataSigned.getContent().getChoice() != 1) {
            throw new IllegalStateException("EtsiTs103097Data-Signed did not have signed data content");
        }
        this.signedData = SignedData.getInstance(etsiTs103097DataSigned.getContent());
    }
    
    public ETSISignedData(final SignedData signedData) {
        this.signedData = signedData;
    }
    
    public boolean signatureValid(final ITSContentVerifierProvider itsContentVerifierProvider) throws Exception {
        final ContentVerifier value = itsContentVerifierProvider.get(this.signedData.getSignature().getChoice());
        final OutputStream outputStream = value.getOutputStream();
        outputStream.write(OEREncoder.toByteArray(this.signedData.getTbsData(), IEEE1609dot2.ToBeSignedData.build()));
        outputStream.close();
        return value.verify(ECDSAEncoder.toX962(this.signedData.getSignature()));
    }
    
    public byte[] getEncoded() {
        return OEREncoder.toByteArray(new EtsiTs103097DataSigned(Ieee1609Dot2Content.signedData(this.signedData)), EtsiTs103097Module.EtsiTs103097Data_Signed.build());
    }
    
    public SignedData getSignedData() {
        return this.signedData;
    }
    
    static {
        oerDef = EtsiTs103097Module.EtsiTs103097Data_Signed.build();
    }
}
