/*
 * Created on 17-Jun-2004
 * Created by Paul Gardner
 * Copyright (C) 2004, 2005, 2006 Aelitis, All Rights Reserved.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 * 
 * AELITIS, SAS au capital de 46,603.30 euros
 * 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
 *
 */

package org.gudy.azureus2.plugins.utils.security;

/**
 * @author parg
 *
 */

import java.net.Authenticator;
import java.net.URL;
import java.security.KeyStore;
import java.security.cert.Certificate;

import javax.net.ssl.SSLSocketFactory;

import org.gudy.azureus2.plugins.messaging.generic.GenericMessageConnection;

public interface 
SESecurityManager 
{
	public static final int	BLOCK_ENCRYPTION_NONE		= 1;
	public static final int	BLOCK_ENCRYPTION_AES		= 2;
	
		// runs the given task with the supplied Authenticator. Note that the 
		// scope of the authenticator is "vm-wide" so that if by chance another
		// thread attempts to perform an operation that requires authentication
		// which the supplied one is in force, the request will be directed to the
		// authenticator
	
	public void
	runWithAuthenticator(
		Authenticator	authenticator,
		Runnable		task );
	
	public void
	addPasswordListener(
		PasswordListener	listener );
		
	public void
	removePasswordListener(
		PasswordListener	listener );
	
	public void
	addCertificateListener(
		CertificateListener	listener );
		
	public void
	removeCertificateListener(
		CertificateListener	listener );

		/**
		 * returns the SHA1 hash of the input data
		 * @param data_in
		 * @return
		 */
	
	public byte[]
	calculateSHA1(
		byte[]		data_in );
	
		/**
		 * Installs the SSL certificate necessary to support the connection 
		 * @param url
		 */
	
	public SSLSocketFactory
	installServerCertificate(
		URL		url );
	
	public KeyStore
	getKeyStore()
	
		throws Exception;
	
	public KeyStore
	getTrustStore()
	
		throws Exception;
	
		/**
		 * creates and installs a certificate capable of supporting SSL of type MD5withRSA
		 * @param alias		alias - e.g. "mycert"
		 * @param cert_dn	dn for the cert  e.g. "CN=fred,OU=wap,O=wip,L=here,ST=there,C=GB"
		 * @param strength	keyt strength - e.g. 1024
		 * @return
		 * @throws Exception
		 */
	
	public Certificate
	createSelfSignedCertificate(
		String		alias,
		String		cert_dn,
		int			strength )
	
		throws Exception;
	
		/**
		 * Gets this azureus instance's unique random identity
		 * @return
		 */
	
	public byte[]
	getIdentity();
	
		/**
		 * Gets the public key for this az instance of the supplied key type
		 * @param key_type	see KEY_TYPE_x constants in SEPublicKey
		 * @param reason_resource a message text resource giving the reason for the key being required
		 * @return
		 */
	
	public SEPublicKey
	getPublicKey(
		int		key_type,
		String	reason_resource )
	
		throws Exception;
	
	public SEPublicKey
	decodePublicKey(
		byte[]	encoded )
	
		throws Exception;
	
		/**
		 * Returns a proxy generic STS connection for incoming connection requests
		 * @param connection
		 * @param my_public_key
		 * @param key_locator
		 * @return
		 * @throws Exception
		 */
	
	public GenericMessageConnection
	getSTSConnection(
		GenericMessageConnection	connection,
		SEPublicKey					my_public_key,
		SEPublicKeyLocator			key_locator,
		String						reason_resource,
		int							block_encryption )
	
		throws Exception;
}
