# Class KDFSpi

java.lang.Object
javax.crypto.KDFSpi

public abstract class KDFSpi extends Object
`KDFSpi` is a preview API of the Java platform.
Programs can only use `KDFSpi` when preview features are enabled.
Preview features may be removed in a future release, or upgraded to permanent features of the Java platform.
This class defines the Service Provider Interface (SPI) for the Key Derivation Function (`KDF`PREVIEW) class.

All the abstract methods in this class must be implemented by each cryptographic service provider who wishes to supply the implementation of a particular key derivation function algorithm.

Implementations must provide a public constructor which accepts a `KDFParameters` object if they depend on the default implementation of `Provider.Service.newInstance` to construct `KDFSpi` instances. The constructor must call `super(params)` passing the parameters supplied. The constructor must also throw an `InvalidAlgorithmParameterException` if the supplied parameters are inappropriate. If a `KDF` object is instantiated with one of the `getInstance` methods that contains a `KDFParameters` parameter, the user-provided `KDFParameters` object will be passed to the constructor of the `KDFSpi` implementation. Otherwise, if it is instantiated with one of the `getInstance` methods without a `KDFParameters` parameter, a `null` value will be passed to the constructor.

Implementations which do not support `KDFParameters` must require `null` to be passed, otherwise an `InvalidAlgorithmParameterException` will be thrown. On the other hand, implementations which require `KDFParameters` should throw an `InvalidAlgorithmParameterException` upon receiving a `null` value if default parameters cannot be generated or upon receiving `KDFParameters` which are not supported by the implementation.

To aid the caller, implementations may return parameters with additional default values or supply random values as used by the underlying `KDF` algorithm. See `engineGetParameters()` for more details.

Since:
  24
See Also:
  - `KDF`PREVIEW
  - `KDFParameters`PREVIEW
  - `KDF.getParameters()`PREVIEW
  - `SecretKey`

- ## Constructor Summary

  Constructors
  Modifier
  Constructor
  Description
  `protected`
  `KDFSpi(KDFParametersPREVIEW kdfParameters)`
  The sole constructor.

- ## Method Summary

  Modifier and Type
  Method
  Description
  `protected abstract byte[]`
  `engineDeriveData(AlgorithmParameterSpec derivationSpec)`
  Derives a key, returns raw data as a byte array.
  `protected abstract SecretKey`
  `engineDeriveKey(String alg, AlgorithmParameterSpec derivationSpec)`
  Derives a key, returned as a `SecretKey` object.
  `protected abstract KDFParametersPREVIEW`
  `engineGetParameters()`
  Returns the `KDFParameters` used with this `KDF` object.

  ### Methods declared in class java.lang.Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- ## Constructor Details

  - ### KDFSpi

    protected KDFSpi(KDFParametersPREVIEW kdfParameters) throws InvalidAlgorithmParameterException
    The sole constructor.

    A `KDFParameters` object may be specified for KDF algorithms that support initialization parameters.

    Parameters:
      `kdfParameters` - the initialization parameters for the `KDF` algorithm (may be `null`)
    Throws:
      `InvalidAlgorithmParameterException` - if the initialization parameters are inappropriate for this `KDFSpi`
    See Also:
      - `KDF.getParameters()`PREVIEW

- ## Method Details

  - ### engineGetParameters

    protected abstract KDFParametersPREVIEW engineGetParameters()
    Returns the `KDFParameters` used with this `KDF` object.

    The returned parameters may be the same that were used to initialize this `KDF` object, or may contain additional default or random parameter values used by the underlying KDF algorithm. If the required parameters were not supplied and can be generated by the `KDF` object, the generated parameters are returned; otherwise `null` is returned.

    Returns:
      the parameters used with this `KDF` object, or `null`

  - ### engineDeriveKey

    protected abstract SecretKey engineDeriveKey(String alg, AlgorithmParameterSpec derivationSpec) throws InvalidAlgorithmParameterException, NoSuchAlgorithmException
    Derives a key, returned as a `SecretKey` object.
    Implementation Note:
      If the resultant key is extractable, then its `getEncoded` value should have the same content as the result of `deriveData`.
    Parameters:
      `alg` - the algorithm of the resultant `SecretKey` object
      `derivationSpec` - derivation parameters
    Returns:
      the derived key.
    Throws:
      `InvalidAlgorithmParameterException` - if the information contained within the `derivationSpec` is invalid or if the combination of `alg` and the `derivationSpec` results in something invalid
      `NoSuchAlgorithmException` - if `alg` is empty or invalid
      `NullPointerException` - if `alg` or `derivationSpec` is null

  - ### engineDeriveData

    protected abstract byte[] engineDeriveData(AlgorithmParameterSpec derivationSpec) throws InvalidAlgorithmParameterException
    Derives a key, returns raw data as a byte array.
    Parameters:
      `derivationSpec` - derivation parameters
    Returns:
      the derived key in its raw bytes.
    Throws:
      `InvalidAlgorithmParameterException` - if the information contained within the `derivationSpec` is invalid
      `UnsupportedOperationException` - if the derived keying material is not extractable
      `NullPointerException` - if `derivationSpec` is null