blob: 55061a83802c8d8f6cfae64e4d00515cba64c927 [file] [log] [blame]
package org.bouncycastle.pqc.crypto.xmss;
import java.security.SecureRandom;
import org.bouncycastle.crypto.Digest;
/**
* XMSS Parameters.
*
*/
public final class XMSSParameters {
private final XMSSOid oid;
private final WOTSPlus wotsPlus;
private final SecureRandom prng;
private final int height;
private final int k;
/**
* XMSS Constructor...
*
* @param height
* Height of tree.
* @param digest
* Digest to use.
* @param prng
* Secure random to use.
*/
public XMSSParameters(int height, Digest digest, SecureRandom prng) {
super();
if (height < 2) {
throw new IllegalArgumentException("height must be >= 2");
}
if (digest == null) {
throw new NullPointerException("digest == null");
}
if (prng == null) {
throw new NullPointerException("prng == null");
}
wotsPlus = new WOTSPlus(new WOTSPlusParameters(digest));
this.prng = prng;
this.height = height;
this.k = determineMinK();
oid = DefaultXMSSOid.lookup(getDigest().getAlgorithmName(), getDigestSize(), getWinternitzParameter(),
wotsPlus.getParams().getLen(), height);
/*
* if (oid == null) { throw new InvalidParameterException(); }
*/
}
private int determineMinK() {
for (int k = 2; k <= height; k++) {
if ((height - k) % 2 == 0) {
return k;
}
}
throw new IllegalStateException("should never happen...");
}
protected Digest getDigest() {
return wotsPlus.getParams().getDigest();
}
protected SecureRandom getPRNG() {
return prng;
}
/**
* Getter digest size.
*
* @return Digest size.
*/
public int getDigestSize() {
return wotsPlus.getParams().getDigestSize();
}
/**
* Getter Winternitz parameter.
*
* @return Winternitz parameter.
*/
public int getWinternitzParameter() {
return wotsPlus.getParams().getWinternitzParameter();
}
/**
* Getter height.
*
* @return XMSS height.
*/
public int getHeight() {
return height;
}
protected WOTSPlus getWOTSPlus() {
return wotsPlus;
}
protected int getK() {
return k;
}
}