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

package org.bouncycastle.pqc.crypto.lms;

import org.bouncycastle.util.Objects;
import org.bouncycastle.util.Arrays;
import java.io.IOException;
import org.bouncycastle.util.io.Streams;
import java.io.InputStream;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import org.bouncycastle.util.Encodable;

class HSSSignature implements Encodable
{
    private final int lMinus1;
    private final LMSSignedPubKey[] signedPubKey;
    private final LMSSignature signature;
    
    public HSSSignature(final int lMinus1, final LMSSignedPubKey[] signedPubKey, final LMSSignature signature) {
        this.lMinus1 = lMinus1;
        this.signedPubKey = signedPubKey;
        this.signature = signature;
    }
    
    public static HSSSignature getInstance(final Object obj, final int n) throws IOException {
        if (obj instanceof HSSSignature) {
            return (HSSSignature)obj;
        }
        if (obj instanceof DataInputStream) {
            final int int1 = ((DataInputStream)obj).readInt();
            if (int1 != n - 1) {
                throw new IllegalStateException("nspk exceeded maxNspk");
            }
            final LMSSignedPubKey[] array = new LMSSignedPubKey[int1];
            if (int1 != 0) {
                for (int i = 0; i < array.length; ++i) {
                    array[i] = new LMSSignedPubKey(LMSSignature.getInstance(obj), LMSPublicKeyParameters.getInstance(obj));
                }
            }
            return new HSSSignature(int1, array, LMSSignature.getInstance(obj));
        }
        else {
            if (obj instanceof byte[]) {
                Object o = null;
                try {
                    o = new DataInputStream(new ByteArrayInputStream((byte[])obj));
                    return getInstance(o, n);
                }
                finally {
                    if (o != null) {
                        ((InputStream)o).close();
                    }
                }
            }
            if (obj instanceof InputStream) {
                return getInstance(Streams.readAll((InputStream)obj), n);
            }
            throw new IllegalArgumentException("cannot parse " + obj);
        }
    }
    
    public int getlMinus1() {
        return this.lMinus1;
    }
    
    public LMSSignedPubKey[] getSignedPubKey() {
        return this.signedPubKey;
    }
    
    public LMSSignature getSignature() {
        return this.signature;
    }
    
    @Override
    public boolean equals(final Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || this.getClass() != o.getClass()) {
            return false;
        }
        final HSSSignature hssSignature = (HSSSignature)o;
        return this.lMinus1 == hssSignature.lMinus1 && Arrays.areEqual(this.signedPubKey, hssSignature.signedPubKey) && Objects.areEqual(this.signature, hssSignature.signature);
    }
    
    @Override
    public int hashCode() {
        return 31 * (31 * this.lMinus1 + Arrays.hashCode(this.signedPubKey)) + Objects.hashCode(this.signature);
    }
    
    @Override
    public byte[] getEncoded() throws IOException {
        final Composer compose = Composer.compose();
        compose.u32str(this.lMinus1);
        if (this.signedPubKey != null) {
            final LMSSignedPubKey[] signedPubKey = this.signedPubKey;
            for (int length = signedPubKey.length, i = 0; i < length; ++i) {
                compose.bytes(signedPubKey[i]);
            }
        }
        compose.bytes(this.signature);
        return compose.build();
    }
}
