package org.bouncycastle.crypto.params;
import org.bouncycastle.crypto.DerivationParameters;
import org.bouncycastle.util.Arrays;
/**
* Parameter class for the HKDFBytesGenerator class.
*/
public class HKDFParameters
implements DerivationParameters
{
private final byte[] ikm;
private final boolean skipExpand;
private final byte[] salt;
private final byte[] info;
private HKDFParameters(final byte[] ikm, final boolean skip,
final byte[] salt, final byte[] info)
{
if (ikm == null)
{
throw new IllegalArgumentException(
"IKM (input keying material) should not be null");
}
this.ikm = Arrays.clone(ikm);
this.skipExpand = skip;
if (salt == null || salt.length == 0)
{
this.salt = null;
}
else
{
this.salt = Arrays.clone(salt);
}
if (info == null)
{
this.info = new byte[0];
}
else
{
this.info = Arrays.clone(info);
}
}
/**
* Generates parameters for HKDF, specifying both the optional salt and
* optional info. Step 1: Extract won't be skipped.
*
* @param ikm the input keying material or seed
* @param salt the salt to use, may be null for a salt for hashLen zeros
* @param info the info to use, may be null for an info field of zero bytes
*/
public HKDFParameters(final byte[] ikm, final byte[] salt, final byte[] info)
{
this(ikm, false, salt, info);
}
/**
* Factory method that makes the HKDF skip the extract part of the key
* derivation function.
*
* @param ikm the input keying material or seed, directly used for step 2:
* Expand
* @param info the info to use, may be null for an info field of zero bytes
* @return HKDFParameters that makes the implementation skip step 1
*/
public static HKDFParameters skipExtractParameters(final byte[] ikm,
final byte[] info)
{
return new HKDFParameters(ikm, true, null, info);
}
public static HKDFParameters defaultParameters(final byte[] ikm)
{
return new HKDFParameters(ikm, false, null, null);
}
/**
* Returns the input keying material or seed.
*
* @return the keying material
*/
public byte[] getIKM()
{
return Arrays.clone(ikm);
}
/**
* Returns if step 1: extract has to be skipped or not
*
* @return true for skipping, false for no skipping of step 1
*/
public boolean skipExtract()
{
return skipExpand;
}
/**
* Returns the salt, or null if the salt should be generated as a byte array
* of HashLen zeros.
*
* @return the salt, or null
*/
public byte[] getSalt()
{
return Arrays.clone(salt);
}
/**
* Returns the info field, which may be empty (null is converted to empty).
*
* @return the info field, never null
*/
public byte[] getInfo()
{
return Arrays.clone(info);
}
}