/*
 * Copyright (c) 2011-2012 ICM Uniwersytet Warszawski All rights reserved.
 * See LICENCE file for licensing information.
 * 
 * Parts of this class are derived from the glite.security.util-java module, 
 * copyrighted as follows:
 *
 * Copyright (c) Members of the EGEE Collaboration. 2004. See
 * http://www.eu-egee.org/partners/ for details on the copyright holders.
 */
package eu.emi.security.authn.x509.proxy;

import java.security.PublicKey;
import java.security.cert.X509Certificate;

/**
 * Holds parameters which are used to create a proxy certificate using 
 * only a certificate chain.
 * 
 * @see ProxyGenerator
 * @author J. Hahkala
 * @author K. Benedyczak
 */
public class ProxyCertificateOptions extends BaseProxyCertificateOptions
{
	public static final int DEFAULT_KEY_LENGTH = 1024;
	public static final int DEFAULT_LONG_KEY_LENGTH = 2048;
	public static final int LONG_PROXY = 10*24*3600;
	
	private Integer keyLength;
	private PublicKey publicKey = null;
	
	/**
	 * Create a new proxy cert based on the parent cert chain.
	 * Useful when locally creating a proxy from existing cert chain.
	 * @param parentCertChain parent certificate chain
	 */
	public ProxyCertificateOptions(X509Certificate[] parentCertChain)
	{
		super(parentCertChain);
	}

	/**
	 * Sets the length of the keys to be generated, only used if the keys
	 * are not set separately. If this method is not used, the default is
	 * 1024 bits.
	 * @param length to be set
	 */
	public void setKeyLength(int length)
	{
		this.keyLength = length;
	}
	
	/**
	 * Gets the length of the keys to be generated. By default it returns value of DEFAULT_KEY_LENGTH,
	 * or, if proxy liftime exceeds LONG_PROXY, DEFAULT_LONG_KEY_LENGTH. 
	 *  
	 * @return the currently set key length
	 */
	public int getKeyLength()
	{
		if (keyLength == null) 
		{
			int lifetime = getLifetime();
			if (lifetime >= LONG_PROXY)
				return DEFAULT_LONG_KEY_LENGTH;
			else
				return DEFAULT_KEY_LENGTH;
		}
		return keyLength;
	}
	
	/**
	 * Manually sets public key which shall be included in the generated proxy
	 * 
	 * @param pubKey the public key to set
	 */
	public void setPublicKey(PublicKey pubKey)
	{
		this.publicKey = pubKey;
	}

	/**
	 * Returns the manually set public key for the proxy.
	 * @return the public key
	 */
	public PublicKey getPublicKey()
	{
		return publicKey;
	}	
}
