All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.github.mmm.crypto.symmetric.key.SymmetricKeyCreatorImpl Maven / Gradle / Ivy

package io.github.mmm.crypto.symmetric.key;

import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;

import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.SecretKeySpec;

import io.github.mmm.crypto.algorithm.AbstractCryptoAlgorithmWithProvider;

/**
 * Implementation of {@link SymmetricKeyCreator}.
 *
 * @param  type of {@link SecretKey}.
 * @since 1.0.0
 */
public class SymmetricKeyCreatorImpl extends AbstractCryptoAlgorithmWithProvider
    implements SymmetricKeyCreator {

  private final SymmetricKeyConfig config;

  private SecretKeyFactory keyFactory;

  /**
   * The constructor.
   *
   * @param config the {@link SymmetricKeyConfig}.
   */
  public SymmetricKeyCreatorImpl(SymmetricKeyConfig config) {

    super(config.getProvider());
    this.config = config;
  }

  @Override
  public String getAlgorithm() {

    return this.config.getAlgorithm();
  }

  @Override
  public int getKeyLength() {

    return this.config.getKeyLength();
  }

  @Override
  public int getKeyLength(K key) {

    return this.config.getKeyLength(key, getKeyFactory());
  }

  @SuppressWarnings("unchecked")
  @Override
  public K createKey(String password) {

    try {
      KeySpec keySpec = this.config.getKeySpecFactory().createKeySpec(password);
      SecretKey secretKey = getKeyFactory().generateSecret(keySpec);
      return (K) secretKey;
    } catch (Exception e) {
      throw new IllegalStateException("Failed to create key pair for algorithm '" + getAlgorithm() + "'.", e);
    }
  }

  @SuppressWarnings("unchecked")
  @Override
  public K createKey(byte[] key) {

    try {
      SecretKey secretKey = getKeyFactory().generateSecret(new SecretKeySpec(key, getAlgorithm()));
      return (K) secretKey;
    } catch (InvalidKeySpecException e) {
      throw new IllegalStateException(e);
    }
  }

  @Override
  public byte[] asData(K key) {

    return key.getEncoded();
  }

  private SecretKeyFactory getKeyFactory() {

    if (this.keyFactory == null) {
      this.keyFactory = this.provider.createSecretKeyFactory(getAlgorithm());
    }
    return this.keyFactory;
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy