blob: e4c9c977e44b234cdf6152b6a319e97301d4d428 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.osgi.service.security;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.cert.Certificate;
import org.eclipse.osgi.internal.signedcontent.TrustEngineListener;
/**
* A <code>TrustEngine</code> is used to establish the authenticity of a
* {@link Certificate} chain.
* <p>
* Clients may implement this interface.
* </p>
* @since 3.4
*/
public abstract class TrustEngine {
/**
* Returns the certificate trust anchor contained in the specified chain which
* was used to establish the authenticity of the chain. If no
* trust anchor is found in the chain then <code>null</code> is returned.
* @param chain - a complete or incomplete certificate chain, implementations *MAY* complete chains
* @return - the certificate trust anchor used to establish authenticity
* @throws IOException if there is a problem connecting to the backing store
*/
public abstract Certificate findTrustAnchor(Certificate[] chain) throws IOException;
/**
* Add a trust anchor point to this trust engine. A trust anchor implies that a certificate,
* and any of its children, is to be considered trusted. If <code>null</code> is used
* as the alias then an alias will be generated based on the trust anchor certificate.
* @param anchor - the certificate to add as an anchor point
* @param alias - a unique and human-readable 'friendly name' which can be used to reference the certificate.
* A <code>null</code> value may be used.
* @return the alias used to store the entry
* @throws IOException if there is a problem connecting to the backing store
* @throws GeneralSecurityException if there is a certificate problem
* @throws IllegalArgumentException if the alias or anchor already exist in this trust engine
*/
public String addTrustAnchor(Certificate anchor, String alias) throws IOException, GeneralSecurityException {
String storedAlias = doAddTrustAnchor(anchor, alias);
TrustEngineListener listener = TrustEngineListener.getInstance();
if (listener != null)
listener.addedTrustAnchor(anchor);
return storedAlias;
}
/**
* Add a trust anchor point to this trust engine. A trust anchor implies that a certificate,
* and any of its children, is to be considered trusted. If <code>null</code> is used
* as the alias then an alias will be generated based on the trust anchor certificate.
* @param anchor - the certificate to add as an anchor point
* @param alias - a unique and human-readable 'friendly name' which can be used to reference the certificate.
* A <code>null</code> value may be used.
* @return the alias used to store the entry
* @throws IOException if there is a problem connecting to the backing store
* @throws GeneralSecurityException if there is a certificate problem
* @throws IllegalArgumentException if the alias or anchor already exist in this trust engine
*/
protected abstract String doAddTrustAnchor(Certificate anchor, String alias) throws IOException, GeneralSecurityException;
/**
* Remove a trust anchor point from the engine, based on the certificate itself.
* @param anchor - the certificate to be removed
* @throws IOException if there is a problem connecting to the backing store
* @throws GeneralSecurityException if there is a certificate problem
*/
public final void removeTrustAnchor(Certificate anchor) throws IOException, GeneralSecurityException {
doRemoveTrustAnchor(anchor);
TrustEngineListener listener = TrustEngineListener.getInstance();
if (listener != null)
listener.removedTrustAnchor(anchor);
}
/**
* Remove a trust anchor point from the engine, based on the certificate itself.
* @param anchor - the certificate to be removed
* @throws IOException if there is a problem connecting to the backing store
* @throws GeneralSecurityException if there is a certificate problem
*/
protected abstract void doRemoveTrustAnchor(Certificate anchor) throws IOException, GeneralSecurityException;
/**
* Remove a trust anchor point from the engine, based on the human readable "friendly name"
* @param alias - the name of the trust anchor
* @throws IOException if there is a problem connecting to the backing store
* @throws GeneralSecurityException if there is a certificate problem
*/
public void removeTrustAnchor(String alias) throws IOException, GeneralSecurityException {
Certificate existing = getTrustAnchor(alias);
doRemoveTrustAnchor(alias);
if (existing != null) {
TrustEngineListener listener = TrustEngineListener.getInstance();
if (listener != null)
listener.removedTrustAnchor(existing);
}
}
/**
* Remove a trust anchor point from the engine, based on the human readable "friendly name"
* @param alias - the name of the trust anchor
* @throws IOException if there is a problem connecting to the backing store
* @throws GeneralSecurityException if there is a certificate problem
*/
protected abstract void doRemoveTrustAnchor(String alias) throws IOException, GeneralSecurityException;
/**
* Return the certificate associated with the unique "friendly name" in the engine.
* @param alias - the friendly name
* @return the associated trust anchor
* @throws IOException if there is a problem connecting to the backing store
* @throws GeneralSecurityException if there is a certificate problem
*/
public abstract Certificate getTrustAnchor(String alias) throws IOException, GeneralSecurityException;
/**
* Return the list of friendly name aliases for the TrustAnchors installed in the engine.
* @return string[] - the list of friendly name aliases
* @throws IOException if there is a problem connecting to the backing store
* @throws GeneralSecurityException if there is a certificate problem
*/
public abstract String[] getAliases() throws IOException, GeneralSecurityException;
/**
* Return a value indicate whether this trust engine is read-only.
*
* @return true if this trust engine is read-only false otherwise.
*/
public abstract boolean isReadOnly();
/**
* Return a representation string of this trust engine
*
* @return a string
*/
public abstract String getName();
}