/* DiffieHellman.java -- Diffie-Hellman key exchange.
   Copyright (C) 2006  Free Software Foundation, Inc.

This file is a part of GNU Classpath.

GNU Classpath 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.

GNU Classpath 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 GNU Classpath; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version.  */


package gnu.javax.net.ssl.provider;

import java.math.BigInteger;
import gnu.javax.crypto.key.dh.GnuDHPrivateKey;

/**
 * <p>Simple implementation of two-party Diffie-Hellman key agreement.</p>
 *
 * <p>The primes used in this class are from the following documents:</p>
 *
 * <ul>
 * <li>D. Harkins and D. Carrel, "The Internet Key Exchange (IKE)", <a
 * href="http://www.ietf.org/rfc/rfc2409.txt">RFC 2409</a>.</li>
 * <li>T. Kivinen and M. Kojo, "More Modular
 * Exponential (MODP) Diffie-Hellman groups for Internet Key Exchange
 * (IKE)", <a href="http://www.ietf.org/rfc/rfc3526.txt">RFC
 * 3526</a>.</li>
 * </li>
 *
 * <p>The generator for all these primes is 2.</p>
 */
final class DiffieHellman
{

  // Class method.
  // -------------------------------------------------------------------------

  /**
   * Get the system's Diffie-Hellman parameters, in which <i>g</i> is 2
   * and <i>p</i> is determined by the property
   * <code>"jessie.keypool.dh.group"</code>. The default value for <i>p</i>
   * is 18, corresponding to {@link #GROUP_18}.
   */
  static GnuDHPrivateKey getParams()
  {
    BigInteger p = DiffieHellman.GROUP_5;
    String group = Util.getSecurityProperty("jessie.key.dh.group");
    if (group != null)
      {
        group = group.trim();
        if (group.equals("1"))
          p = DiffieHellman.GROUP_1;
        else if (group.equals("2"))
          p = DiffieHellman.GROUP_2;
        else if (group.equals("5"))
          p = DiffieHellman.GROUP_5;
        else if (group.equals("14"))
          p = DiffieHellman.GROUP_14;
        else if (group.equals("15"))
          p = DiffieHellman.GROUP_15;
        else if (group.equals("16"))
          p = DiffieHellman.GROUP_16;
        else if (group.equals("17"))
          p = DiffieHellman.GROUP_17;
        else if (group.equals("18"))
          p = DiffieHellman.GROUP_18;
      }
    return new GnuDHPrivateKey(null, p, DH_G, null);
  }

  // Constants.
  // -------------------------------------------------------------------------

  /**
   * The generator for all Diffie Hellman groups below.
   */
  static final BigInteger DH_G = BigInteger.valueOf(2L);

  /**
   * p = 2^768 - 2 ^704 - 1 + 2^64 * { [2^638 pi] + 149686 }
   */
  static final BigInteger GROUP_1 = new BigInteger("00" +
    "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" +
    "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" +
    "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" +
    "E485B576625E7EC6F44C42E9A63A3620FFFFFFFFFFFFFFFF", 16);

  /**
   * p = 2^1024 - 2^960 - 1 + 2^64 * { [2^894 pi] + 129093 }
   */
  static final BigInteger GROUP_2 = new BigInteger("00" +
    "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" +
    "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" +
    "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" +
    "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" +
    "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381" +
    "FFFFFFFFFFFFFFFF", 16);

  /**
   * This prime p = 2^1536 - 2^1472 - 1 + 2^64 * { [2^1406 pi] + 741804 }.
   */
  static final BigInteger GROUP_5 = new BigInteger("00" +
    "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" +
    "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" +
    "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" +
    "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" +
    "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" +
    "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" +
    "83655D23DCA3AD961C62F356208552BB9ED529077096966D" +
    "670C354E4ABC9804F1746C08CA237327FFFFFFFFFFFFFFFF", 16);

  /**
   * p = 2^2048 - 2^1984 - 1 + 2^64 * { [2^1918 pi] + 124476 }.
   */
  static final BigInteger GROUP_14 = new BigInteger("00" +
    "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" +
    "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" +
    "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" +
    "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" +
    "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" +
    "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" +
    "83655D23DCA3AD961C62F356208552BB9ED529077096966D" +
    "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" +
    "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" +
    "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" +
    "15728E5A8AACAA68FFFFFFFFFFFFFFFF", 16);

  /**
   * p = 2^3072 - 2^3008 - 1 + 2^64 * { [2^2942 pi] + 1690314 }.
   */
  static final BigInteger GROUP_15 = new BigInteger("00" +
    "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" +
    "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" +
    "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" +
    "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" +
    "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" +
    "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" +
    "83655D23DCA3AD961C62F356208552BB9ED529077096966D" +
    "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" +
    "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" +
    "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" +
    "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64" +
    "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7" +
    "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B" +
    "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C" +
    "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31" +
    "43DB5BFCE0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF", 16);

  /**
   * p = 2^4096 - 2^4032 - 1 + 2^64 * { [2^3966 pi] + 240904 }.
   */
  static final BigInteger GROUP_16 = new BigInteger("00" +
    "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" +
    "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" +
    "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" +
    "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" +
    "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" +
    "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" +
    "83655D23DCA3AD961C62F356208552BB9ED529077096966D" +
    "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" +
    "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" +
    "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" +
    "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64" +
    "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7" +
    "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B" +
    "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C" +
    "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31" +
    "43DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7" +
    "88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA" +
    "2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6" +
    "287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED" +
    "1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9" +
    "93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199" +
    "FFFFFFFFFFFFFFFF", 16);

  static final BigInteger GROUP_17 = new BigInteger("00" +
    "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08" +
    "8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B" +
    "302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9" +
    "A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6" +
    "49286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8" +
    "FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D" +
    "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C" +
    "180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718" +
    "3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D" +
    "04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7D" +
    "B3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D226" +
    "1AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200C" +
    "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFC" +
    "E0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B26" +
    "99C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB" +
    "04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2" +
    "233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127" +
    "D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934028492" +
    "36C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BDF8FF9406" +
    "AD9E530EE5DB382F413001AEB06A53ED9027D831179727B0865A8918" +
    "DA3EDBEBCF9B14ED44CE6CBACED4BB1BDB7F1447E6CC254B33205151" +
    "2BD7AF426FB8F401378CD2BF5983CA01C64B92ECF032EA15D1721D03" +
    "F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E59E7C97F" +
    "BEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA" +
    "CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58B" +
    "B7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632" +
    "387FE8D76E3C0468043E8F663F4860EE12BF2D5B0B7474D6E694F91E" +
    "6DCC4024FFFFFFFFFFFFFFFF", 16);

  /**
   * p = 2^8192 - 2^8128 - 1 + 2^64 * { [2^8062 pi] + 4743158 }.
   *
   * <p>This value, while quite large, is estimated to provide the equivalent
   * cryptographic strength of a symmetric key between 190 and 320 bits.
   */
  static final BigInteger GROUP_18 = new BigInteger("00" +
    "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" +
    "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" +
    "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" +
    "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" +
    "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" +
    "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" +
    "83655D23DCA3AD961C62F356208552BB9ED529077096966D" +
    "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" +
    "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" +
    "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" +
    "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64" +
    "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7" +
    "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B" +
    "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C" +
    "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31" +
    "43DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7" +
    "88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA" +
    "2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6" +
    "287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED" +
    "1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9" +
    "93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934028492" +
    "36C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BD" +
    "F8FF9406AD9E530EE5DB382F413001AEB06A53ED9027D831" +
    "179727B0865A8918DA3EDBEBCF9B14ED44CE6CBACED4BB1B" +
    "DB7F1447E6CC254B332051512BD7AF426FB8F401378CD2BF" +
    "5983CA01C64B92ECF032EA15D1721D03F482D7CE6E74FEF6" +
    "D55E702F46980C82B5A84031900B1C9E59E7C97FBEC7E8F3" +
    "23A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA" +
    "CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE328" +
    "06A1D58BB7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55C" +
    "DA56C9EC2EF29632387FE8D76E3C0468043E8F663F4860EE" +
    "12BF2D5B0B7474D6E694F91E6DBE115974A3926F12FEE5E4" +
    "38777CB6A932DF8CD8BEC4D073B931BA3BC832B68D9DD300" +
    "741FA7BF8AFC47ED2576F6936BA424663AAB639C5AE4F568" +
    "3423B4742BF1C978238F16CBE39D652DE3FDB8BEFC848AD9" +
    "22222E04A4037C0713EB57A81A23F0C73473FC646CEA306B" +
    "4BCBC8862F8385DDFA9D4B7FA2C087E879683303ED5BDD3A" +
    "062B3CF5B3A278A66D2A13F83F44F82DDF310EE074AB6A36" +
    "4597E899A0255DC164F31CC50846851DF9AB48195DED7EA1" +
    "B1D510BD7EE74D73FAF36BC31ECFA268359046F4EB879F92" +
    "4009438B481C6CD7889A002ED5EE382BC9190DA6FC026E47" +
    "9558E4475677E9AA9E3050E2765694DFC81F56E880B96E71" +
    "60C980DD98EDD3DFFFFFFFFFFFFFFFFF", 16);

}
