org.cesecore.util.CertificateSerializableWrapper Maven / Gradle / Ivy
/*************************************************************************
* *
* CESeCore: CE Security Core *
* *
* This software is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public *
* License as published by the Free Software Foundation; either *
* version 2.1 of the License, or any later version. *
* *
* See terms of license at gnu.org. *
* *
*************************************************************************/
package org.cesecore.util;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.security.cert.Certificate;
import java.security.cert.CertificateEncodingException;
import java.security.cert.CertificateParsingException;
import org.cesecore.certificates.certificate.CertificateWrapper;
/**
* Wrapper class for transmitting certificates over remote EJB. This wrapper is needed
* because Java will always deserialize Certificate objects using the first security provider
* configured on the system. That does not work with Certificates that use other signature
* algorithms than the ones that are built into Java.
*
* This class encodes and decodes the Certificate objects lazily only when serializing or
* deserializing. So it should have a minimal performance impact.
*
* This implementation shouldn't be used directly, and is package-internal.
* You can create an instance of this class through {@link org.cesecore.util.EJBTools}.
*
* @version $Id: CertificateSerializableWrapper.java 23173 2016-04-12 14:54:52Z samuellb $
*/
final class CertificateSerializableWrapper implements CertificateWrapper, Serializable {
private static final long serialVersionUID = 1L;
private byte[] certificateBytes;
private transient Certificate certificate = null;
/**
* Constructor is internal. Please use {@link org.cesecore.util.EJBTools#wrap(Certificate)} to create a wrapper.
* @param certificate Certificate, non-null.
*/
CertificateSerializableWrapper(final Certificate certificate) {
if (certificate == null) {
throw new IllegalStateException("Can't wrap null certificate");
}
this.certificate = certificate;
this.certificateBytes = null;
}
@Override
public Certificate getCertificate() {
if (certificate == null && certificateBytes != null) {
// Lazy restore in case of deserialization
try {
certificate = CertTools.getCertfromByteArray(certificateBytes, Certificate.class);
} catch (CertificateParsingException e) {
throw new IllegalStateException(e);
}
}
return certificate;
}
private void writeObject(ObjectOutputStream stream) throws IOException {
// Lazy encode before serialization
if (certificateBytes == null) {
try {
certificateBytes = certificate.getEncoded();
} catch (CertificateEncodingException e) {
throw new IllegalStateException(e);
}
}
stream.defaultWriteObject();
}
}