package com.wesabe.grendel.openpgp;

import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.RSAKeyGenParameterSpec;

import org.bouncycastle.bcpg.PublicKeyAlgorithmTags;

import com.wesabe.grendel.util.IntegerEquivalent;

/**
 * An asymmetric encryption or signing algorithm for OpenPGP messages.
 * 
 * @author coda
 * @see <a href="http://www.ietf.org/rfc/rfc4880.txt">Section 9.1, RFC 4880</a>
 */
public enum AsymmetricAlgorithm implements IntegerEquivalent {
	/**
	 * Elgamal (Encrypt-Only)
	 * 
	 * @see <a href="http://en.wikipedia.org/wiki/ElGamal_encryption">Wikipedia</a>
	 */
	ELGAMAL(	"ElGamal",		PublicKeyAlgorithmTags.ELGAMAL_ENCRYPT) {
		@Override
		public AlgorithmParameterSpec getAlgorithmParameterSpec() {
			return new PregeneratedDHParameterSpec();
		}},
	
	/**
	 * DSA (Digital Signature Algorithm)
	 * 
	 * @see <a href="http://en.wikipedia.org/wiki/Digital_Signature_Algorithm">Wikipedia</a>
	 */
	DSA(		"DSA",			PublicKeyAlgorithmTags.DSA) {
		@Override
		public AlgorithmParameterSpec getAlgorithmParameterSpec() {
			return new PregeneratedDSAParameterSpec();
		}},
	
	/**
	 * RSA (Encrypt or Sign)
	 * 
	 * @see <a href="http://en.wikipedia.org/wiki/RSA">Wikipedia</a>
	 */
	RSA(		"RSA",			PublicKeyAlgorithmTags.RSA_GENERAL) {
		@Override
		public AlgorithmParameterSpec getAlgorithmParameterSpec() {
			return new RSAKeyGenParameterSpec(2048, RSAKeyGenParameterSpec.F0);
		}},
	
	/**
	 * RSA Encrypt-Only
	 * 
	 * @deprecated Sign-only keys must be expressed with subpackets in v4 keys.
	 * @see <a href="http://www.ietf.org/rfc/rfc4880.txt">Section 13.5, RFC 4880</a>
	 */
	@Deprecated
	RSA_E(		"RSA(e)",		PublicKeyAlgorithmTags.RSA_ENCRYPT),
	
	/**
	 * RSA Sign-Only
	 * 
	 * @deprecated Sign-only keys must be expressed with subpackets in v4 keys.
	 * @see <a href="http://www.ietf.org/rfc/rfc4880.txt">Section 13.5, RFC 4880</a>
	 */
	@Deprecated
	RSA_S(		"RSA(s)",		PublicKeyAlgorithmTags.RSA_SIGN),
	
	/**
	 * Elliptic Curve
	 * 
	 * @deprecated Underspecified in RFC 4880.
	 * @see <a href="http://www.ietf.org/rfc/rfc4880.txt">Section 13.8, RFC 4880</a>
	 */
	@Deprecated
	EC(			"EC",			PublicKeyAlgorithmTags.EC),
	
	/**
	 * Elliptic Curve Digital Signature Algorithm.
	 * 
	 * @deprecated Underspecified in RFC 4880.
	 * @see <a href="http://www.ietf.org/rfc/rfc4880.txt">Section 13.8, RFC 4880</a>
	 */
	@Deprecated
	ECDSA(		"ECDSA",		PublicKeyAlgorithmTags.ECDSA),
	
	/**
	 * Elgamal (Encrypt or Sign)
	 * 
	 * @deprecated Prohibited by RFC 4880 due to vulnerabilities.
	 * @see <a href="http://www.ietf.org/rfc/rfc4880.txt">Section 13.8, RFC 4880</a>
	 * @see <a href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.45.3347">Generating ElGamal signatures without knowing the secret key; Daniel Bleichenbacher</a>
	 */
	@Deprecated
	ELGAMAL_G(	"ElGamal(g)",	PublicKeyAlgorithmTags.ELGAMAL_GENERAL),
	
	/**
	 * Diffie-Hellman (X9.42, as defined for IETF-S/MIME)
	 * 
	 * @deprecated Underspecified in RFC 4880.
	 * @see <a href="http://www.ietf.org/rfc/rfc4880.txt">Section 13.8, RFC 4880</a>
	 */
	@Deprecated
	DH(			"DH",			PublicKeyAlgorithmTags.DIFFIE_HELLMAN);

	/**
	 * The default asymmetric encryption algorithm, to be used when generating
	 * new subkeys.
	 */
	public static final AsymmetricAlgorithm ENCRYPTION_DEFAULT = RSA;
	
	/**
	 * The default digital signature algorithm, to be used when generating new
	 * master keys.
	 * 
	 */
	public static final AsymmetricAlgorithm SIGNING_DEFAULT = RSA;

	private final String name;
	private final int value;
	
	private AsymmetricAlgorithm(String name, int value) {
		this.name = name;
		this.value = value;
	}
	
	/**
	 * Returns the algorithm's standard name, which can be passed to
	 * {@link java.security.KeyPairGenerator}.
	 */
	public String getName() {
		return name;
	}

	/**
	 * Returns the {@link java.security.spec.AlgorithmParameterSpec} required to
	 * generate keys for this algorithm.
	 */
	public AlgorithmParameterSpec getAlgorithmParameterSpec() {
		throw new UnsupportedOperationException(this + " keys cannot be generated");
	}

	/**
	 * Returns the equivalent value of {@link PublicKeyAlgorithmTags}.
	 * 
	 */
	@Override
	public int toInteger() {
		return value;
	}
	
	@Override
	public String toString() {
		return name;
	}
}

@@ -1411,17 +1411,17 @@
 erSpec.F
-0
+4
 );%0A%09%09%7D%7D,

Use F4 exponent for RSA key generation.