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

package org.bouncycastle.operator.bc;

import org.bouncycastle.crypto.DataLengthException;
import org.bouncycastle.crypto.CryptoException;
import org.bouncycastle.pqc.crypto.lms.LMSSigner;
import org.bouncycastle.pqc.crypto.lms.LMSPrivateKeyParameters;
import org.bouncycastle.pqc.crypto.lms.LMSPublicKeyParameters;
import org.bouncycastle.pqc.crypto.lms.HSSSigner;
import org.bouncycastle.pqc.crypto.lms.HSSPrivateKeyParameters;
import org.bouncycastle.pqc.crypto.lms.HSSPublicKeyParameters;
import org.bouncycastle.crypto.CipherParameters;
import java.io.ByteArrayOutputStream;
import org.bouncycastle.pqc.crypto.MessageSigner;
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
import org.bouncycastle.operator.OperatorCreationException;
import org.bouncycastle.crypto.Signer;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;

public class BcHssLmsContentSignerBuilder extends BcContentSignerBuilder
{
    private static final AlgorithmIdentifier sigAlgId;
    
    public BcHssLmsContentSignerBuilder() {
        super(BcHssLmsContentSignerBuilder.sigAlgId, null);
    }
    
    @Override
    protected Signer createSigner(final AlgorithmIdentifier algorithmIdentifier, final AlgorithmIdentifier algorithmIdentifier2) throws OperatorCreationException {
        return new HssSigner();
    }
    
    static {
        sigAlgId = new AlgorithmIdentifier(PKCSObjectIdentifiers.id_alg_hss_lms_hashsig);
    }
    
    static class HssSigner implements Signer
    {
        private MessageSigner signer;
        private final ByteArrayOutputStream stream;
        
        public HssSigner() {
            this.stream = new ByteArrayOutputStream();
        }
        
        @Override
        public void init(final boolean b, final CipherParameters cipherParameters) {
            if (cipherParameters instanceof HSSPublicKeyParameters || cipherParameters instanceof HSSPrivateKeyParameters) {
                this.signer = new HSSSigner();
            }
            else {
                if (!(cipherParameters instanceof LMSPublicKeyParameters) && !(cipherParameters instanceof LMSPrivateKeyParameters)) {
                    throw new IllegalArgumentException("Incorrect Key Parameters");
                }
                this.signer = new LMSSigner();
            }
            this.signer.init(b, cipherParameters);
        }
        
        @Override
        public void update(final byte b) {
            this.stream.write(b);
        }
        
        @Override
        public void update(final byte[] b, final int off, final int len) {
            this.stream.write(b, off, len);
        }
        
        @Override
        public byte[] generateSignature() throws CryptoException, DataLengthException {
            final byte[] byteArray = this.stream.toByteArray();
            this.stream.reset();
            return this.signer.generateSignature(byteArray);
        }
        
        @Override
        public boolean verifySignature(final byte[] array) {
            final byte[] byteArray = this.stream.toByteArray();
            this.stream.reset();
            return this.signer.verifySignature(byteArray, array);
        }
        
        @Override
        public void reset() {
            this.stream.reset();
        }
    }
}
