14c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompackage org.bouncycastle.jcajce.provider.asymmetric.dh;
24c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
34c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.io.IOException;
44c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.AlgorithmParameterSpec;
54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.InvalidParameterSpecException;
64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport javax.crypto.spec.DHParameterSpec;
84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Encoding;
104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.pkcs.DHParameter;
114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompublic class AlgorithmParametersSpi
134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    extends java.security.AlgorithmParametersSpi
144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom{
154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    DHParameterSpec     currentSpec;
164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected boolean isASN1FormatString(String format)
184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return format == null || format.equals("ASN.1");
204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected AlgorithmParameterSpec engineGetParameterSpec(
234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        Class paramSpec)
244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws InvalidParameterSpecException
254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (paramSpec == null)
274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throw new NullPointerException("argument to getParameterSpec must not be null");
294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return localEngineGetParameterSpec(paramSpec);
324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        /**
384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom         * Return the PKCS#3 ASN.1 structure DHParameter.
394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom         * <p>
404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom         * <pre>
414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom         *  DHParameter ::= SEQUENCE {
424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom         *                   prime INTEGER, -- p
434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom         *                   base INTEGER, -- g
444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom         *                   privateValueLength INTEGER OPTIONAL}
454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom         * </pre>
464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom         */
474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        protected byte[] engineGetEncoded()
484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            DHParameter dhP = new DHParameter(currentSpec.getP(), currentSpec.getG(), currentSpec.getL());
504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            try
524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                return dhP.getEncoded(ASN1Encoding.DER);
544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            catch (IOException e)
564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                throw new RuntimeException("Error encoding DHParameters");
584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        protected byte[] engineGetEncoded(
624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            String format)
634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            if (isASN1FormatString(format))
654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                return engineGetEncoded();
674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return null;
704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        protected AlgorithmParameterSpec localEngineGetParameterSpec(
734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            Class paramSpec)
744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throws InvalidParameterSpecException
754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            if (paramSpec == DHParameterSpec.class)
774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                return currentSpec;
794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throw new InvalidParameterSpecException("unknown parameter spec passed to DH parameters object.");
824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        protected void engineInit(
854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            AlgorithmParameterSpec paramSpec)
864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throws InvalidParameterSpecException
874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            if (!(paramSpec instanceof DHParameterSpec))
894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                throw new InvalidParameterSpecException("DHParameterSpec required to initialise a Diffie-Hellman algorithm parameters object");
914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            this.currentSpec = (DHParameterSpec)paramSpec;
944c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
954c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
964c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        protected void engineInit(
974c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            byte[] params)
984c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throws IOException
994c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            try
1014c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
1024c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                DHParameter dhP = DHParameter.getInstance(params);
1034c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1044c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                if (dhP.getL() != null)
1054c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                {
1064c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                    currentSpec = new DHParameterSpec(dhP.getP(), dhP.getG(), dhP.getL().intValue());
1074c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                }
1084c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                else
1094c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                {
1104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                    currentSpec = new DHParameterSpec(dhP.getP(), dhP.getG());
1114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                }
1124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
1134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            catch (ClassCastException e)
1144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
1154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                throw new IOException("Not a valid DH Parameter encoding.");
1164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
1174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            catch (ArrayIndexOutOfBoundsException e)
1184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
1194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                throw new IOException("Not a valid DH Parameter encoding.");
1204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
1214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        protected void engineInit(
1244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            byte[] params,
1254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            String format)
1264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throws IOException
1274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            if (isASN1FormatString(format))
1294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
1304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                engineInit(params);
1314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
1324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            else
1334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
1344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                throw new IOException("Unknown parameter format " + format);
1354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
1364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        protected String engineToString()
1394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return "Diffie-Hellman Parameters";
1414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom}
143