/* See LICENSE for licensing and NOTICE for copyright. */ package org.ldaptive.io; import java.io.ByteArrayInputStream; import java.security.cert.Certificate; import java.security.cert.CertificateEncodingException; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import org.ldaptive.LdapUtils; /** * Decodes and encodes a certificate for use in an ldap attribute value. * * @author Middleware Services */ public class CertificateValueTranscoder implements ValueTranscoder<Certificate> { /** PEM cert header. */ private static final String BEGIN_CERT = "-----BEGIN CERTIFICATE-----" + System.getProperty("line.separator"); /** PEM cert footer. */ private static final String END_CERT = System.getProperty("line.separator") + "-----END CERTIFICATE-----"; @Override public Certificate decodeStringValue(final String value) { return decodeBinaryValue(LdapUtils.utf8Encode(value)); } @Override public Certificate decodeBinaryValue(final byte[] value) { try { final CertificateFactory cf = CertificateFactory.getInstance("X.509"); return cf.generateCertificate(new ByteArrayInputStream(value)); } catch (CertificateException e) { throw new IllegalArgumentException("Attribute value could not be decoded as a certificate", e); } } @Override public String encodeStringValue(final Certificate value) { final StringBuilder sb = new StringBuilder(); sb.append(BEGIN_CERT); sb.append(LdapUtils.base64Encode(encodeBinaryValue(value))); sb.append(END_CERT); return sb.toString(); } @Override public byte[] encodeBinaryValue(final Certificate value) { try { return value.getEncoded(); } catch (CertificateEncodingException e) { throw new IllegalArgumentException("Certificate could not be encoded", e); } } @Override public Class<Certificate> getType() { return Certificate.class; } }