package org.bouncycastle.pqc.crypto.gmss;

import org.bouncycastle.util.Arrays;

This class provides a specification for the GMSS parameters that are used by the GMSSKeyPairGenerator and GMSSSignature classes.
See Also:
  • GMSSKeyPairGenerator
/** * This class provides a specification for the GMSS parameters that are used by * the GMSSKeyPairGenerator and GMSSSignature classes. * * @see org.bouncycastle.pqc.crypto.gmss.GMSSKeyPairGenerator */
public class GMSSParameters {
The number of authentication tree layers.
/** * The number of authentication tree layers. */
private int numOfLayers;
The height of the authentication trees of each layer.
/** * The height of the authentication trees of each layer. */
private int[] heightOfTrees;
The Winternitz Parameter 'w' of each layer.
/** * The Winternitz Parameter 'w' of each layer. */
private int[] winternitzParameter;
The parameter K needed for the authentication path computation
/** * The parameter K needed for the authentication path computation */
private int[] K;
The constructor for the parameters of the GMSSKeyPairGenerator.
Params:
  • layers – the number of authentication tree layers
  • heightOfTrees – the height of the authentication trees
  • winternitzParameter – the Winternitz Parameter 'w' of each layer
  • K – parameter for authpath computation
/** * The constructor for the parameters of the GMSSKeyPairGenerator. * * @param layers the number of authentication tree layers * @param heightOfTrees the height of the authentication trees * @param winternitzParameter the Winternitz Parameter 'w' of each layer * @param K parameter for authpath computation */
public GMSSParameters(int layers, int[] heightOfTrees, int[] winternitzParameter, int[] K) throws IllegalArgumentException { init(layers, heightOfTrees, winternitzParameter, K); } private void init(int layers, int[] heightOfTrees, int[] winternitzParameter, int[] K) throws IllegalArgumentException { boolean valid = true; String errMsg = ""; this.numOfLayers = layers; if ((numOfLayers != winternitzParameter.length) || (numOfLayers != heightOfTrees.length) || (numOfLayers != K.length)) { valid = false; errMsg = "Unexpected parameterset format"; } for (int i = 0; i < numOfLayers; i++) { if ((K[i] < 2) || ((heightOfTrees[i] - K[i]) % 2 != 0)) { valid = false; errMsg = "Wrong parameter K (K >= 2 and H-K even required)!"; } if ((heightOfTrees[i] < 4) || (winternitzParameter[i] < 2)) { valid = false; errMsg = "Wrong parameter H or w (H > 3 and w > 1 required)!"; } } if (valid) { this.heightOfTrees = Arrays.clone(heightOfTrees); this.winternitzParameter = Arrays.clone(winternitzParameter); this.K = Arrays.clone(K); } else { throw new IllegalArgumentException(errMsg); } } public GMSSParameters(int keySize) throws IllegalArgumentException { if (keySize <= 10) { // create 2^10 keys int[] defh = {10}; int[] defw = {3}; int[] defk = {2}; this.init(defh.length, defh, defw, defk); } else if (keySize <= 20) { // create 2^20 keys int[] defh = {10, 10}; int[] defw = {5, 4}; int[] defk = {2, 2}; this.init(defh.length, defh, defw, defk); } else { // create 2^40 keys, keygen lasts around 80 seconds int[] defh = {10, 10, 10, 10}; int[] defw = {9, 9, 9, 3}; int[] defk = {2, 2, 2, 2}; this.init(defh.length, defh, defw, defk); } }
Returns the number of levels of the authentication trees.
Returns:The number of levels of the authentication trees.
/** * Returns the number of levels of the authentication trees. * * @return The number of levels of the authentication trees. */
public int getNumOfLayers() { return numOfLayers; }
Returns the array of height (for each layer) of the authentication trees
Returns:The array of height (for each layer) of the authentication trees
/** * Returns the array of height (for each layer) of the authentication trees * * @return The array of height (for each layer) of the authentication trees */
public int[] getHeightOfTrees() { return Arrays.clone(heightOfTrees); }
Returns the array of WinternitzParameter (for each layer) of the authentication trees
Returns:The array of WinternitzParameter (for each layer) of the authentication trees
/** * Returns the array of WinternitzParameter (for each layer) of the * authentication trees * * @return The array of WinternitzParameter (for each layer) of the * authentication trees */
public int[] getWinternitzParameter() { return Arrays.clone(winternitzParameter); }
Returns the parameter K needed for authentication path computation
Returns:The parameter K needed for authentication path computation
/** * Returns the parameter K needed for authentication path computation * * @return The parameter K needed for authentication path computation */
public int[] getK() { return Arrays.clone(K); } }