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

io.github.mmm.crypto.asymmetric.key.generic.AsymmetricKeyPairFactoryEncoded Maven / Gradle / Ivy

package io.github.mmm.crypto.asymmetric.key.generic;

import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

import io.github.mmm.crypto.CryptoBinaryFormat;
import io.github.mmm.crypto.asymmetric.key.AbstractAsymmetricKeyPair;
import io.github.mmm.crypto.asymmetric.key.AbstractAsymmetricKeyPairFactory;
import io.github.mmm.crypto.asymmetric.key.AsymmetricKeyPair;
import io.github.mmm.crypto.asymmetric.key.AsymmetricKeyPairFactory;
import io.github.mmm.crypto.asymmetric.key.AsymmetricKeyPairFactorySimple;

/**
 * Implementation of {@link AsymmetricKeyPairFactory} for {@link CryptoBinaryFormat#FORMAT_ENCODED encoded format}
 * based on {@link PKCS8EncodedKeySpec} and {@link X509EncodedKeySpec}.
 *
 * @param  type of {@link PrivateKey}.
 * @param  type of {@link PublicKey}.
 * @param  type of {@link AsymmetricKeyPair}.
 * @since 1.0.0
 */
public class AsymmetricKeyPairFactoryEncoded>
    extends AbstractAsymmetricKeyPairFactory {

  private AsymmetricKeyPairFactorySimple keyPairCreator;

  /**
   * The constructor.
   *
   * @param keyFactory the {@link KeyFactory}.
   * @param keyPairCreator the {@link AsymmetricKeyPairFactorySimple}.
   */
  public AsymmetricKeyPairFactoryEncoded(KeyFactory keyFactory,
      AsymmetricKeyPairFactorySimple keyPairCreator) {

    super(keyFactory);
    this.keyPairCreator = keyPairCreator;
  }

  @Override
  public byte[] asData(PR privateKey) {

    return privateKey.getEncoded();
  }

  @Override
  public PR createPrivateKey(byte[] data) {

    return createPrivateKey(new PKCS8EncodedKeySpec(data));
  }

  @Override
  public byte[] asData(PU publicKey) {

    return publicKey.getEncoded();
  }

  @Override
  public PU createPublicKey(byte[] data) {

    return createPublicKey(new X509EncodedKeySpec(data));
  }

  @Override
  public byte[] asData(PAIR keyPair) {

    byte[] privateData = asData(keyPair.getPrivateKey());
    byte[] publicData = asData(keyPair.getPublicKey());
    byte[] data = new byte[privateData.length + publicData.length];
    System.arraycopy(privateData, 0, data, 0, privateData.length);
    System.arraycopy(publicData, 0, data, privateData.length, publicData.length);
    return data;
  }

  @Override
  public PAIR createKeyPair(PR privateKey, PU publicKey) {

    return this.keyPairCreator.createKeyPair(privateKey, publicKey);
  }

  @Override
  public PAIR createKeyPair(byte[] data) {

    // TODO
    int privateDataLength = data.length / 2;
    byte[] privateData = new byte[privateDataLength];
    byte[] publicData = new byte[data.length - privateDataLength];
    System.arraycopy(data, 0, privateData, 0, privateDataLength);
    System.arraycopy(data, privateDataLength, publicData, 0, publicData.length);
    PR privateKey = createPrivateKey(privateData);
    PU publicKey = createPublicKey(publicData);
    return createKeyPair(privateKey, publicKey);
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy