/** * Copyright 2003-2016 SSHTOOLS Limited. All Rights Reserved. * * For product documentation visit https://www.sshtools.com/ * * This file is part of J2SSH Maverick. * * J2SSH Maverick is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * J2SSH Maverick 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 J2SSH Maverick. If not, see <http://www.gnu.org/licenses/>. */ package com.sshtools.ssh.components; import java.math.BigInteger; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import com.sshtools.util.UnsignedInteger32; public class DiffieHellmanGroups { public static final BigInteger group1 = new BigInteger( "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" + "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" + "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" + "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" + "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381" + "FFFFFFFFFFFFFFFF", 16); public static final BigInteger group5 = new BigInteger("FFFFFFFF" + "FFFFFFFF" + "C90FDAA2" + "2168C234" + "C4C6628B" + "80DC1CD1" + "29024E08" + "8A67CC74" + "020BBEA6" + "3B139B22" + "514A0879" + "8E3404DD" + "EF9519B3" + "CD3A431B" + "302B0A6D" + "F25F1437" + "4FE1356D" + "6D51C245" + "E485B576" + "625E7EC6" + "F44C42E9" + "A637ED6B" + "0BFF5CB6" + "F406B7ED" + "EE386BFB" + "5A899FA5" + "AE9F2411" + "7C4B1FE6" + "49286651" + "ECE45B3D" + "C2007CB8" + "A163BF05" + "98DA4836" + "1C55D39A" + "69163FA8" + "FD24CF5F" + "83655D23" + "DCA3AD96" + "1C62F356" + "208552BB" + "9ED52907" + "7096966D" + "670C354E" + "4ABC9804" + "F1746C08" + "CA237327" + "FFFFFFFF" + "FFFFFFFF", 16); public static final BigInteger group14 = new BigInteger("FFFFFFFF" + "FFFFFFFF" + "C90FDAA2" + "2168C234" + "C4C6628B" + "80DC1CD1" + "29024E08" + "8A67CC74" + "020BBEA6" + "3B139B22" + "514A0879" + "8E3404DD" + "EF9519B3" + "CD3A431B" + "302B0A6D" + "F25F1437" + "4FE1356D" + "6D51C245" + "E485B576" + "625E7EC6" + "F44C42E9" + "A637ED6B" + "0BFF5CB6" + "F406B7ED" + "EE386BFB" + "5A899FA5" + "AE9F2411" + "7C4B1FE6" + "49286651" + "ECE45B3D" + "C2007CB8" + "A163BF05" + "98DA4836" + "1C55D39A" + "69163FA8" + "FD24CF5F" + "83655D23" + "DCA3AD96" + "1C62F356" + "208552BB" + "9ED52907" + "7096966D" + "670C354E" + "4ABC9804" + "F1746C08" + "CA18217C" + "32905E46" + "2E36CE3B" + "E39E772C" + "180E8603" + "9B2783A2" + "EC07A28F" + "B5C55DF0" + "6F4C52C9" + "DE2BCBF6" + "95581718" + "3995497C" + "EA956AE5" + "15D22618" + "98FA0510" + "15728E5A" + "8AACAA68" + "FFFFFFFF" + "FFFFFFFF", 16); public static final BigInteger group15 = new BigInteger("FFFFFFFF" + "FFFFFFFF" + "C90FDAA2" + "2168C234" + "C4C6628B" + "80DC1CD1" + "29024E08" + "8A67CC74" + "020BBEA6" + "3B139B22" + "514A0879" + "8E3404DD" + "EF9519B3" + "CD3A431B" + "302B0A6D" + "F25F1437" + "4FE1356D" + "6D51C245" + "E485B576" + "625E7EC6" + "F44C42E9" + "A637ED6B" + "0BFF5CB6" + "F406B7ED" + "EE386BFB" + "5A899FA5" + "AE9F2411" + "7C4B1FE6" + "49286651" + "ECE45B3D" + "C2007CB8" + "A163BF05" + "98DA4836" + "1C55D39A" + "69163FA8" + "FD24CF5F" + "83655D23" + "DCA3AD96" + "1C62F356" + "208552BB" + "9ED52907" + "7096966D" + "670C354E" + "4ABC9804" + "F1746C08" + "CA18217C" + "32905E46" + "2E36CE3B" + "E39E772C" + "180E8603" + "9B2783A2" + "EC07A28F" + "B5C55DF0" + "6F4C52C9" + "DE2BCBF6" + "95581718" + "3995497C" + "EA956AE5" + "15D22618" + "98FA0510" + "15728E5A" + "8AAAC42D" + "AD33170D" + "04507A33" + "A85521AB" + "DF1CBA64" + "ECFB8504" + "58DBEF0A" + "8AEA7157" + "5D060C7D" + "B3970F85" + "A6E1E4C7" + "ABF5AE8C" + "DB0933D7" + "1E8C94E0" + "4A25619D" + "CEE3D226" + "1AD2EE6B" + "F12FFA06" + "D98A0864" + "D8760273" + "3EC86A64" + "521F2B18" + "177B200C" + "BBE11757" + "7A615D6C" + "770988C0" + "BAD946E2" + "08E24FA0" + "74E5AB31" + "43DB5BFC" + "E0FD108E" + "4B82D120" + "A93AD2CA" + "FFFFFFFF" + "FFFFFFFF", 16); public static final BigInteger group16 = new BigInteger("FFFFFFFF" + "FFFFFFFF" + "C90FDAA2" + "2168C234" + "C4C6628B" + "80DC1CD1" + "29024E08" + "8A67CC74" + "020BBEA6" + "3B139B22" + "514A0879" + "8E3404DD" + "EF9519B3" + "CD3A431B" + "302B0A6D" + "F25F1437" + "4FE1356D" + "6D51C245" + "E485B576" + "625E7EC6" + "F44C42E9" + "A637ED6B" + "0BFF5CB6" + "F406B7ED" + "EE386BFB" + "5A899FA5" + "AE9F2411" + "7C4B1FE6" + "49286651" + "ECE45B3D" + "C2007CB8" + "A163BF05" + "98DA4836" + "1C55D39A" + "69163FA8" + "FD24CF5F" + "83655D23" + "DCA3AD96" + "1C62F356" + "208552BB" + "9ED52907" + "7096966D" + "670C354E" + "4ABC9804" + "F1746C08" + "CA18217C" + "32905E46" + "2E36CE3B" + "E39E772C" + "180E8603" + "9B2783A2" + "EC07A28F" + "B5C55DF0" + "6F4C52C9" + "DE2BCBF6" + "95581718" + "3995497C" + "EA956AE5" + "15D22618" + "98FA0510" + "15728E5A" + "8AAAC42D" + "AD33170D" + "04507A33" + "A85521AB" + "DF1CBA64" + "ECFB8504" + "58DBEF0A" + "8AEA7157" + "5D060C7D" + "B3970F85" + "A6E1E4C7" + "ABF5AE8C" + "DB0933D7" + "1E8C94E0" + "4A25619D" + "CEE3D226" + "1AD2EE6B" + "F12FFA06" + "D98A0864" + "D8760273" + "3EC86A64" + "521F2B18" + "177B200C" + "BBE11757" + "7A615D6C" + "770988C0" + "BAD946E2" + "08E24FA0" + "74E5AB31" + "43DB5BFC" + "E0FD108E" + "4B82D120" + "A9210801" + "1A723C12" + "A787E6D7" + "88719A10" + "BDBA5B26" + "99C32718" + "6AF4E23C" + "1A946834" + "B6150BDA" + "2583E9CA" + "2AD44CE8" + "DBBBC2DB" + "04DE8EF9" + "2E8EFC14" + "1FBECAA6" + "287C5947" + "4E6BC05D" + "99B2964F" + "A090C3A2" + "233BA186" + "515BE7ED" + "1F612970" + "CEE2D7AF" + "B81BDD76" + "2170481C" + "D0069127" + "D5B05AA9" + "93B4EA98" + "8D8FDDC1" + "86FFB7DC" + "90A6C08F" + "4DF435C9" + "34063199", 16); public static final BigInteger group17 = new BigInteger("FFFFFFFF" + "FFFFFFFF" + "C90FDAA2" + "2168C234" + "C4C6628B" + "80DC1CD1" + "29024E08" + "8A67CC74" + "020BBEA6" + "3B139B22" + "514A0879" + "8E3404DD" + "EF9519B3" + "CD3A431B" + "302B0A6D" + "F25F1437" + "4FE1356D" + "6D51C245" + "E485B576" + "625E7EC6" + "F44C42E9" + "A637ED6B" + "0BFF5CB6" + "F406B7ED" + "EE386BFB" + "5A899FA5" + "AE9F2411" + "7C4B1FE6" + "49286651" + "ECE45B3D" + "C2007CB8" + "A163BF05" + "98DA4836" + "1C55D39A" + "69163FA8" + "FD24CF5F" + "83655D23" + "DCA3AD96" + "1C62F356" + "208552BB" + "9ED52907" + "7096966D" + "670C354E" + "4ABC9804" + "F1746C08" + "CA18217C" + "32905E46" + "2E36CE3B" + "E39E772C" + "180E8603" + "9B2783A2" + "EC07A28F" + "B5C55DF0" + "6F4C52C9" + "DE2BCBF6" + "95581718" + "3995497C" + "EA956AE5" + "15D22618" + "98FA0510" + "15728E5A" + "8AAAC42D" + "AD33170D" + "04507A33" + "A85521AB" + "DF1CBA64" + "ECFB8504" + "58DBEF0A" + "8AEA7157" + "5D060C7D" + "B3970F85" + "A6E1E4C7" + "ABF5AE8C" + "DB0933D7" + "1E8C94E0" + "4A25619D" + "CEE3D226" + "1AD2EE6B" + "F12FFA06" + "D98A0864" + "D8760273" + "3EC86A64" + "521F2B18" + "177B200C" + "BBE11757" + "7A615D6C" + "770988C0" + "BAD946E2" + "08E24FA0" + "74E5AB31" + "43DB5BFC" + "E0FD108E" + "4B82D120" + "A9210801" + "1A723C12" + "A787E6D7" + "88719A10" + "BDBA5B26" + "99C32718" + "6AF4E23C" + "1A946834" + "B6150BDA" + "2583E9CA" + "2AD44CE8" + "DBBBC2DB" + "04DE8EF9" + "2E8EFC14" + "1FBECAA6" + "287C5947" + "4E6BC05D" + "99B2964F" + "A090C3A2" + "233BA186" + "515BE7ED" + "1F612970" + "CEE2D7AF" + "B81BDD76" + "2170481C" + "D0069127" + "D5B05AA9" + "93B4EA98" + "8D8FDDC1" + "86FFB7DC" + "90A6C08F" + "4DF435C9" + "34028492" + "36C3FAB4" + "D27C7026" + "C1D4DCB2" + "602646DE" + "C9751E76" + "3DBA37BD" + "F8FF9406" + "AD9E530E" + "E5DB382F" + "413001AE" + "B06A53ED" + "9027D831" + "179727B0" + "865A8918" + "DA3EDBEB" + "CF9B14ED" + "44CE6CBA" + "CED4BB1B" + "DB7F1447" + "E6CC254B" + "33205151" + "2BD7AF42" + "6FB8F401" + "378CD2BF" + "5983CA01" + "C64B92EC" + "F032EA15" + "D1721D03" + "F482D7CE" + "6E74FEF6" + "D55E702F" + "46980C82" + "B5A84031" + "900B1C9E" + "59E7C97F" + "BEC7E8F3" + "23A97A7E" + "36CC88BE" + "0F1D45B7" + "FF585AC5" + "4BD407B2" + "2B4154AA" + "CC8F6D7E" + "BF48E1D8" + "14CC5ED2" + "0F8037E0" + "A79715EE" + "F29BE328" + "06A1D58B" + "B7C5DA76" + "F550AA3D" + "8A1FBFF0" + "EB19CCB1" + "A313D55C" + "DA56C9EC" + "2EF29632" + "387FE8D7" + "6E3C0468" + "043E8F66" + "3F4860EE" + "12BF2D5B" + "0B7474D6" + "E694F91E" + "6DCC4024" + "FFFFFFFF" + "FFFFFFFF", 16); public static final BigInteger group18 = new BigInteger("FFFFFFFF" + "FFFFFFFF" + "C90FDAA2" + "2168C234" + "C4C6628B" + "80DC1CD1" + "29024E08" + "8A67CC74" + "020BBEA6" + "3B139B22" + "514A0879" + "8E3404DD" + "EF9519B3" + "CD3A431B" + "302B0A6D" + "F25F1437" + "4FE1356D" + "6D51C245" + "E485B576" + "625E7EC6" + "F44C42E9" + "A637ED6B" + "0BFF5CB6" + "F406B7ED" + "EE386BFB" + "5A899FA5" + "AE9F2411" + "7C4B1FE6" + "49286651" + "ECE45B3D" + "C2007CB8" + "A163BF05" + "98DA4836" + "1C55D39A" + "69163FA8" + "FD24CF5F" + "83655D23" + "DCA3AD96" + "1C62F356" + "208552BB" + "9ED52907" + "7096966D" + "670C354E" + "4ABC9804" + "F1746C08" + "CA18217C" + "32905E46" + "2E36CE3B" + "E39E772C" + "180E8603" + "9B2783A2" + "EC07A28F" + "B5C55DF0" + "6F4C52C9" + "DE2BCBF6" + "95581718" + "3995497C" + "EA956AE5" + "15D22618" + "98FA0510" + "15728E5A" + "8AAAC42D" + "AD33170D" + "04507A33" + "A85521AB" + "DF1CBA64" + "ECFB8504" + "58DBEF0A" + "8AEA7157" + "5D060C7D" + "B3970F85" + "A6E1E4C7" + "ABF5AE8C" + "DB0933D7" + "1E8C94E0" + "4A25619D" + "CEE3D226" + "1AD2EE6B" + "F12FFA06" + "D98A0864" + "D8760273" + "3EC86A64" + "521F2B18" + "177B200C" + "BBE11757" + "7A615D6C" + "770988C0" + "BAD946E2" + "08E24FA0" + "74E5AB31" + "43DB5BFC" + "E0FD108E" + "4B82D120" + "A9210801" + "1A723C12" + "A787E6D7" + "88719A10" + "BDBA5B26" + "99C32718" + "6AF4E23C" + "1A946834" + "B6150BDA" + "2583E9CA" + "2AD44CE8" + "DBBBC2DB" + "04DE8EF9" + "2E8EFC14" + "1FBECAA6" + "287C5947" + "4E6BC05D" + "99B2964F" + "A090C3A2" + "233BA186" + "515BE7ED" + "1F612970" + "CEE2D7AF" + "B81BDD76" + "2170481C" + "D0069127" + "D5B05AA9" + "93B4EA98" + "8D8FDDC1" + "86FFB7DC" + "90A6C08F" + "4DF435C9" + "34028492" + "36C3FAB4" + "D27C7026" + "C1D4DCB2" + "602646DE" + "C9751E76" + "3DBA37BD" + "F8FF9406" + "AD9E530E" + "E5DB382F" + "413001AE" + "B06A53ED" + "9027D831" + "179727B0" + "865A8918" + "DA3EDBEB" + "CF9B14ED" + "44CE6CBA" + "CED4BB1B" + "DB7F1447" + "E6CC254B" + "33205151" + "2BD7AF42" + "6FB8F401" + "378CD2BF" + "5983CA01" + "C64B92EC" + "F032EA15" + "D1721D03" + "F482D7CE" + "6E74FEF6" + "D55E702F" + "46980C82" + "B5A84031" + "900B1C9E" + "59E7C97F" + "BEC7E8F3" + "23A97A7E" + "36CC88BE" + "0F1D45B7" + "FF585AC5" + "4BD407B2" + "2B4154AA" + "CC8F6D7E" + "BF48E1D8" + "14CC5ED2" + "0F8037E0" + "A79715EE" + "F29BE328" + "06A1D58B" + "B7C5DA76" + "F550AA3D" + "8A1FBFF0" + "EB19CCB1" + "A313D55C" + "DA56C9EC" + "2EF29632" + "387FE8D7" + "6E3C0468" + "043E8F66" + "3F4860EE" + "12BF2D5B" + "0B7474D6" + "E694F91E" + "6DBE1159" + "74A3926F" + "12FEE5E4" + "38777CB6" + "A932DF8C" + "D8BEC4D0" + "73B931BA" + "3BC832B6" + "8D9DD300" + "741FA7BF" + "8AFC47ED" + "2576F693" + "6BA42466" + "3AAB639C" + "5AE4F568" + "3423B474" + "2BF1C978" + "238F16CB" + "E39D652D" + "E3FDB8BE" + "FC848AD9" + "22222E04" + "A4037C07" + "13EB57A8" + "1A23F0C7" + "3473FC64" + "6CEA306B" + "4BCBC886" + "2F8385DD" + "FA9D4B7F" + "A2C087E8" + "79683303" + "ED5BDD3A" + "062B3CF5" + "B3A278A6" + "6D2A13F8" + "3F44F82D" + "DF310EE0" + "74AB6A36" + "4597E899" + "A0255DC1" + "64F31CC5" + "0846851D" + "F9AB4819" + "5DED7EA1" + "B1D510BD" + "7EE74D73" + "FAF36BC3" + "1ECFA268" + "359046F4" + "EB879F92" + "4009438B" + "481C6CD7" + "889A002E" + "D5EE382B" + "C9190DA6" + "FC026E47" + "9558E447" + "5677E9AA" + "9E3050E2" + "765694DF" + "C81F56E8" + "80B96E71" + "60C980DD" + "98EDD3DF" + "FFFFFFFF" + "FFFFFFFF", 16); static List<BigInteger> safePrimes = new ArrayList<BigInteger>(); static { safePrimes.add(group1); safePrimes.add(group5); safePrimes.add(group14); safePrimes.add(group15); safePrimes.add(group16); safePrimes.add(group17); safePrimes.add(group18); } /** * get the biggest safe prime from the list that is <= maximumSize * * @param maximumSize * @return BigInteger */ public static BigInteger getSafePrime(UnsignedInteger32 maximumSize) { BigInteger prime = group1; for(Iterator<BigInteger> it = safePrimes.iterator(); it.hasNext(); ) { BigInteger p = it.next(); int len = p.bitLength(); if(len > maximumSize.intValue()) { break; } prime = p; } return prime; } }