/* See LICENSE for licensing and NOTICE for copyright. */ package org.cryptacular.adapter; import java.io.IOException; import java.security.Key; import org.bouncycastle.crypto.params.AsymmetricKeyParameter; import org.bouncycastle.crypto.util.PrivateKeyInfoFactory; import org.bouncycastle.crypto.util.SubjectPublicKeyInfoFactory; import org.cryptacular.EncodingException; /** * JCE/JDK key base class that wraps a BC native private key. * * @param <T> Asymmetric key parameters type wrapped by this class. * * @author Middleware Services */ public abstract class AbstractWrappedKey<T extends AsymmetricKeyParameter> implements Key { /** PKCS#8 format identifier used with private keys. */ public static final String PKCS8_FORMAT = "PKCS#8"; /** X.509 format identifier used with private keys. */ public static final String X509_FORMAT = "X.509"; /** Wrapped key. */ protected final T delegate; /** * Creates a new instance that wraps the given BC key. * * @param wrappedKey BC key to wrap. */ public AbstractWrappedKey(final T wrappedKey) { if (wrappedKey == null) { throw new IllegalArgumentException("Wrapped key cannot be null."); } delegate = wrappedKey; } /** @return {@value #PKCS8_FORMAT} in the case of a private key, otherwise {@link #X509_FORMAT}. */ @Override public String getFormat() { if (delegate.isPrivate()) { return PKCS8_FORMAT; } return X509_FORMAT; } /** * @return Encoded PrivateKeyInfo structure in the case of a private key, otherwise an encoded SubjectPublicKeyInfo * structure. */ @Override public byte[] getEncoded() { try { if (delegate.isPrivate()) { return PrivateKeyInfoFactory.createPrivateKeyInfo(delegate).getEncoded(); } return SubjectPublicKeyInfoFactory.createSubjectPublicKeyInfo(delegate).getEncoded(); } catch (IOException e) { throw new EncodingException("Key encoding error", e); } } }