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

package org.bouncycastle.pqc.crypto.xmss;

import java.util.Collections;
import org.bouncycastle.asn1.nist.NISTObjectIdentifiers;
import java.util.HashMap;
import org.bouncycastle.util.Integers;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import java.util.Map;

public final class XMSSParameters
{
    private static final Map<Integer, XMSSParameters> paramsLookupTable;
    private final XMSSOid oid;
    private final int height;
    private final int k;
    private final ASN1ObjectIdentifier treeDigestOID;
    private final int winternitzParameter;
    private final String treeDigest;
    private final int treeDigestSize;
    private final WOTSPlusParameters wotsPlusParams;
    
    public XMSSParameters(final int n, final Digest digest) {
        this(n, DigestUtil.getDigestOID(digest.getAlgorithmName()));
    }
    
    public XMSSParameters(final int height, final ASN1ObjectIdentifier treeDigestOID) {
        if (height < 2) {
            throw new IllegalArgumentException("height must be >= 2");
        }
        if (treeDigestOID == null) {
            throw new NullPointerException("digest == null");
        }
        this.height = height;
        this.k = this.determineMinK();
        this.treeDigest = DigestUtil.getDigestName(treeDigestOID);
        this.treeDigestOID = treeDigestOID;
        this.wotsPlusParams = new WOTSPlusParameters(treeDigestOID);
        this.treeDigestSize = this.wotsPlusParams.getTreeDigestSize();
        this.winternitzParameter = this.wotsPlusParams.getWinternitzParameter();
        this.oid = DefaultXMSSOid.lookup(this.treeDigest, this.treeDigestSize, this.winternitzParameter, this.wotsPlusParams.getLen(), height);
    }
    
    private int determineMinK() {
        for (int i = 2; i <= this.height; ++i) {
            if ((this.height - i) % 2 == 0) {
                return i;
            }
        }
        throw new IllegalStateException("should never happen...");
    }
    
    public int getTreeDigestSize() {
        return this.treeDigestSize;
    }
    
    public ASN1ObjectIdentifier getTreeDigestOID() {
        return this.treeDigestOID;
    }
    
    public int getHeight() {
        return this.height;
    }
    
    String getTreeDigest() {
        return this.treeDigest;
    }
    
    int getLen() {
        return this.wotsPlusParams.getLen();
    }
    
    int getWinternitzParameter() {
        return this.winternitzParameter;
    }
    
    WOTSPlus getWOTSPlus() {
        return new WOTSPlus(this.wotsPlusParams);
    }
    
    XMSSOid getOid() {
        return this.oid;
    }
    
    int getK() {
        return this.k;
    }
    
    public static XMSSParameters lookupByOID(final int n) {
        return XMSSParameters.paramsLookupTable.get(Integers.valueOf(n));
    }
    
    static {
        final HashMap m = new HashMap();
        m.put(Integers.valueOf(1), new XMSSParameters(10, NISTObjectIdentifiers.id_sha256));
        m.put(Integers.valueOf(2), new XMSSParameters(16, NISTObjectIdentifiers.id_sha256));
        m.put(Integers.valueOf(3), new XMSSParameters(20, NISTObjectIdentifiers.id_sha256));
        m.put(Integers.valueOf(4), new XMSSParameters(10, NISTObjectIdentifiers.id_sha512));
        m.put(Integers.valueOf(5), new XMSSParameters(16, NISTObjectIdentifiers.id_sha512));
        m.put(Integers.valueOf(6), new XMSSParameters(20, NISTObjectIdentifiers.id_sha512));
        m.put(Integers.valueOf(7), new XMSSParameters(10, NISTObjectIdentifiers.id_shake128));
        m.put(Integers.valueOf(8), new XMSSParameters(16, NISTObjectIdentifiers.id_shake128));
        m.put(Integers.valueOf(9), new XMSSParameters(20, NISTObjectIdentifiers.id_shake128));
        m.put(Integers.valueOf(10), new XMSSParameters(10, NISTObjectIdentifiers.id_shake256));
        m.put(Integers.valueOf(11), new XMSSParameters(16, NISTObjectIdentifiers.id_shake256));
        m.put(Integers.valueOf(12), new XMSSParameters(20, NISTObjectIdentifiers.id_shake256));
        paramsLookupTable = Collections.unmodifiableMap((Map<?, ?>)m);
    }
}
