/* * * Copyright (c) 2013 - 2017 Lijun Liao * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License version 3 * as published by the Free Software Foundation with the addition of the * following permission added to Section 15 as permitted in Section 7(a): * * FOR ANY PART OF THE COVERED WORK IN WHICH THE COPYRIGHT IS OWNED BY * THE AUTHOR LIJUN LIAO. LIJUN LIAO DISCLAIMS THE WARRANTY OF NON INFRINGEMENT * OF THIRD PARTY RIGHTS. * * 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU Affero General Public License. * * You can be released from the requirements of the license by purchasing * a commercial license. Buying such a license is mandatory as soon as you * develop commercial activities involving the XiPKI software without * disclosing the source code of your own applications. * * For more information, please contact Lijun Liao at this * address: lijun.liao@gmail.com */ package org.xipki.commons.security.util; import java.math.BigInteger; import java.security.SecureRandom; import java.security.spec.DSAParameterSpec; import java.util.HashMap; import java.util.Map; import org.bouncycastle.crypto.digests.SHA512Digest; import org.bouncycastle.crypto.generators.DSAParametersGenerator; import org.bouncycastle.crypto.params.DSAParameterGenerationParameters; import org.bouncycastle.crypto.params.DSAParameters; /** * Cache for DSA parameter specs. * * @author Lijun Liao * @since 2.0.0 */ // CHECKSTYLE:SKIP public final class DSAParameterCache { private static final Map<String, DSAParameterSpec> cache = new HashMap<>(); static { // plen: 1024, qlen: 160 String strP = "CC7602EFB290B0DFC3548EA0560CB9AF4485A55B1A6D2EE21CFF9F8C26EF0A9C" + "9D989BD14B144B372F38583C5F29C79C9BCE73E21E4A30DD21DF211252C16B87" + "FFB39CC0380358543C601F615464BFD8A72023F3F1B1AE44057E609EBB5AA6A0" + "9BA6BD06873833F8872D3478AF83B6BAFB77979ADDF66D4B3737A063CA69438B"; String strQ = "9180AC2B78B185AEB5C71BA1B4EB116193453B61"; String strG = "1E3A7166465E5441104CE79B435157199292441D69BE085D15829640D5D4F6B2" + "43B5C7515D887D775994817A10548BFA773303E41128D9E3398BB95E2ADB8296" + "4C49669DCCEFC9A3C9FA4BD55541F416F2262BF4B4A5EC41A46BEE887BDF96A9" + "718AED50A94C5758C29E5E2C7BBE3D108C65EA5A7D9FF6F8EDC1183D965F86D9"; addDSAParamSpec(1024, 160, strP, strQ, strG); // plen: 2048, qlen: 224 strP = "EDA919C7B9A1891ED5F1649E552D804AC9821F32C7F9E73086437516CE89831D" + "52BAD8F73D60388C3F87641F66A9DABDDAA0D78F73A0627A98947C2472F1F0DD" + "9D1BF5249C1C334B9DA30D5DE1C8957131D00E4DC82A0D00E4C54DA3DD9A611D" + "63D5D94BCE34FCDDD749329E46C31A4C62FF1BD5B85948BEB42D864B817509CC" + "471ADBB6BD3FEF1F26CED8A919A0992ACD5E3A870A1575D4AF173E8C09E6DF1C" + "6F1FF19B28FECF2B08D6E59595F92A8B3B77F82F2BD03D2ABB11049007CDA2CD" + "B55B6C29C550D8EBE34852A828D05EEEF3E04777FE38307E874B800BF3DF92DE" + "F1012615E9834075F447294EBBEE5DFA16A51AA61368C49B85FD7F37138184CD"; strQ = "D1A1DDDE587A95BE124F57D5A974A282E3E432632E3A0B55AE5AEE19"; strG = "421A0F322C89EB745339B6165AE0C9FC1138317EC3AAF9A630E1C147CA043365" + "6D3C4890DCD64A2B77ED7A59FF0055F03AEDB14AD54E456BC89CAB317B405E2E" + "E0E1384FBC5F43A83C6B5DB1131181A57034BD4020E17A5D3DFF52A0C7C47A19" + "746483AC56F7CD9ADEBD3E4DD28FDD9F1763F9B8875E175AC4C3429B25F08E74" + "1ABBBA7007F9D187900B9EF3E38C5429F906F8C927A828A31168CDA4B388EED4" + "E963D41FE01DF6E67826A48D6711B5A302205EE3905B5C9E8DB3CC0E063007D2" + "847C7B20FE2A602D5D63AA8FEAC6E09E23C017BE150724FCECE1369421610635" + "CA5C04DE00677A6176058C83FC0D7B951CD722E5ED77562AF2209A25DC8B5108"; addDSAParamSpec(2048, 224, strP, strQ, strG); // plen: 2048, qlen: 256 strP = "E13AC60336C29FAF1B48393D80C74B781E15E23E3F59F0827190FF016720A8E0" + "DAC2D4FF699EBA2196E1B9815ECAE0506441A4BC4DA97E97F2723A808EF6B634" + "3968906137B04B23F6540FC4B9D7C0A46635B6D52AEDD08347370B9BE43A7222" + "807655CB5ED480F4C66128357D0E0A2C62785DC38160645661FA569ADCE46D3B" + "3BFAB114613436242855F5717143D51FB365972F6B8695C2186CBAD1E8C5B4D3" + "1AD70876EBDD1C2191C5FB6C4804E0D38CBAA054FC7AFD25E0F2735F726D8A31" + "DE97431BFB6CF1AD563811830131E7D5E5117D92389406EF436A8077E69B8795" + "18436E33A9F221AB3A331680D0345B316F5BEBDA8FBF70612BEC734272E760BF"; strQ = "9CF2A23A8F95FEFB0CA67212991AC172FDD3F4D70401B684C3E4223D46D090E5"; strG = "1CBEF6EEB9E73C5997BF64CA8BCC33CDC6AFC5601B86FDE1B0AC4C34066DFBF9" + "9B80CCE264C909B32CF88CE09CB73476C0A6E701092E09C93507FE3EBD425B75" + "8AE3C5E3FDC1076AF237C5EF40A790CF6555EB3408BCEF212AC5A1C125A7183D" + "24935554C0D258BF1F6A5A6D05C0879DB92D32A0BCA3A85D42F9B436AE97E62E" + "0E30E53B8690D8585493D291969791EA0F3B062645440587C031CD2880481E0B" + "E3253A28EFFF3ACEB338A2FE4DB8F652E0FDA277268B73D5E532CF9E4E2A1CAB" + "738920F760012DD9389F35E0AA7C8528CE173934529397DABDFAA1E77AF83FAD" + "629AC102596885A06B5C670FFA838D37EB55FE7179A88F6FF927B37E0F827726"; addDSAParamSpec(2048, 256, strP, strQ, strG); // plen: 3072, qlen: 256 strP = "E1CD75FD92FF448A6AEFDF36FA26BC3D933E258B4887BD7217006CE79844E569" + "E82A44A496D3102F8AFC75CF9012A759DDBBEFB59579D78F1C3ECECDDE0130D1" + "5C965C5B291FFE5ED33924A6D601C69FE2C6FEC8F5C34D9D4C3164F9F975CFCE" + "1EDD0D957B9448DC66B4248E646901BFF9EF2C5031A0E8D38B3644D69619795B" + "D059A3E9EECAA6FA33449F3579BCEEC6F703F179A77503928A4864419A4DA8D2" + "99954EF5C38A08CF237522D125821D76A744FD75B1D14043F17AEADEE638F3D8" + "6A2F5CC0C214E14C0D4B041B27B6C5CC3FF1EF6C0DAB9FA76EAD3D35F7443142" + "967B3FD37F22635B793BAA41014022477CFC83E9947EF7C8BA6C2F7443C401BA" + "E5604BF7516F23925C45ABBFCF772096808FF471D63CF877F620DC9EAFA24077" + "C27DFCC5E4EF638D92943007A07CFFF9498227766927462F3D4FCCBF94816236" + "6D34B643556776218E333FBD45742DD866D3CC6EF12661D50AD28A7B2465B2CB" + "F2714251C0D8383544286E606CB2463DD15CFFD94E546CCBC40552035E32ECEB"; strQ = "9E716023B076F10F716F4006F8470C90B0273B67BBA2E96ADE8BF51A70990B39"; strG = "735B04ACFA7A2B30207ABAA0770728A6D9F530674BAE28E0EA373972D2F451FD" + "0E64F4AB0EA381590CF48049C20A4658A32FA1824098AF7AEE202A3F26862A82" + "DAF93B70D26650C4831FCF27E7CD43E9EF9166AAB100291CC59088EC61524D79" + "37209713385024EA5CE3832D48EA76F965BE55EA54C944CE24485918FFE17672" + "E35187EA03F7B0E1B5423A1E6EF1313AA24CCBDDFDAD45747E9A0459A5B80930" + "AC413DFA9E88B0812EAC0C6BEFA86254F7951ADC7B921CF65E8746E1CD849D09" + "1422A13D90EC5F7C05B1402DD20557177C9CFCE85586B10E162748DBD12B28EA" + "CE56A6AAC8AF69BA9EB721E1871B2993FD627C4FE73B38BD346A988F5245084E" + "D13999B3B5AB2F3C93A8CE119222321F97F0D0453A08F42D564BF68F49C56D6A" + "41795EC4D2E332B2D78226AC048C9C669280D1CD6492E38EC7C9DB67BA0329B6" + "C055BEDBD520BD925BB658E42E1E6B70C814126178AAA18FCE4B17FBC68A30EC" + "839D14887F921D296C2BE5AD27FB57DEB6688E2B3416D7FCB896814C63DED966"; addDSAParamSpec(3072, 256, strP, strQ, strG); } private DSAParameterCache() { } // CHECKSTYLE:SKIP private static void addDSAParamSpec(final int plen, final int qlen, final String strP, final String strQ, final String strG) { DSAParameterSpec spec = new DSAParameterSpec(new BigInteger(strP, 16), new BigInteger(strQ, 16), new BigInteger(strG, 16)); cache.put(plen + "-" + qlen, spec); } // CHECKSTYLE:SKIP public static DSAParameterSpec getDSAParameterSpec(int plength, int qlength, SecureRandom random) { DSAParameterSpec spec = cache.get(plength + "-" + qlength); if (spec != null) { return new DSAParameterSpec(spec.getP(), spec.getQ(), spec.getG()); } return getNewDSAParameterSpec(plength, qlength, random); } // CHECKSTYLE:SKIP public static DSAParameterSpec getNewDSAParameterSpec(final int plength, final int qlength, final SecureRandom random) { final int certainty = 80; SecureRandom tmpRandom = (random == null) ? new SecureRandom() : random; DSAParametersGenerator paramGen = new DSAParametersGenerator(new SHA512Digest()); DSAParameterGenerationParameters genParams = new DSAParameterGenerationParameters( plength, qlength, certainty, tmpRandom); paramGen.init(genParams); DSAParameters dsaParams = paramGen.generateParameters(); return new DSAParameterSpec(dsaParams.getP(), dsaParams.getQ(), dsaParams.getG()); } }