14c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompackage org.bouncycastle.jcajce.provider.asymmetric.rsa;
24c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
34c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.io.IOException;
44c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.AlgorithmParameterSpec;
54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.InvalidParameterSpecException;
64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.MGF1ParameterSpec;
74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.PSSParameterSpec;
84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport javax.crypto.spec.OAEPParameterSpec;
104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport javax.crypto.spec.PSource;
114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Encoding;
134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Integer;
144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1OctetString;
154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.DERNull;
164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.DEROctetString;
174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.pkcs.RSAESOAEPparams;
194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.pkcs.RSASSAPSSparams;
204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.x509.AlgorithmIdentifier;
214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.jcajce.provider.util.DigestFactory;
224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompublic abstract class AlgorithmParametersSpi
244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    extends java.security.AlgorithmParametersSpi
254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom{
264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected boolean isASN1FormatString(String format)
274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return format == null || format.equals("ASN.1");
294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected AlgorithmParameterSpec engineGetParameterSpec(
324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        Class paramSpec)
334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws InvalidParameterSpecException
344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (paramSpec == null)
364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throw new NullPointerException("argument to getParameterSpec must not be null");
384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return localEngineGetParameterSpec(paramSpec);
414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected abstract AlgorithmParameterSpec localEngineGetParameterSpec(Class paramSpec)
444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws InvalidParameterSpecException;
454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public static class OAEP
474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        extends AlgorithmParametersSpi
484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        OAEPParameterSpec currentSpec;
504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        /**
524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom         * Return the PKCS#1 ASN.1 structure RSAES-OAEP-params.
534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom         */
544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        protected byte[] engineGetEncoded()
554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            AlgorithmIdentifier hashAlgorithm = new AlgorithmIdentifier(
574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                                                            DigestFactory.getOID(currentSpec.getDigestAlgorithm()),
584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                                                            DERNull.INSTANCE);
594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            MGF1ParameterSpec mgfSpec = (MGF1ParameterSpec)currentSpec.getMGFParameters();
604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            AlgorithmIdentifier maskGenAlgorithm = new AlgorithmIdentifier(
614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                                                            PKCSObjectIdentifiers.id_mgf1,
624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                                                            new AlgorithmIdentifier(DigestFactory.getOID(mgfSpec.getDigestAlgorithm()), DERNull.INSTANCE));
634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            PSource.PSpecified      pSource = (PSource.PSpecified)currentSpec.getPSource();
644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            AlgorithmIdentifier pSourceAlgorithm = new AlgorithmIdentifier(
654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                                                            PKCSObjectIdentifiers.id_pSpecified, new DEROctetString(pSource.getValue()));
664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            RSAESOAEPparams oaepP = new RSAESOAEPparams(hashAlgorithm, maskGenAlgorithm, pSourceAlgorithm);
674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            try
694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                return oaepP.getEncoded(ASN1Encoding.DER);
714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            catch (IOException e)
734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                throw new RuntimeException("Error encoding OAEPParameters");
754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        protected byte[] engineGetEncoded(
794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            String format)
804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            if (isASN1FormatString(format) || format.equalsIgnoreCase("X.509"))
824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                return engineGetEncoded();
844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return null;
874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        protected AlgorithmParameterSpec localEngineGetParameterSpec(
904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            Class paramSpec)
914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throws InvalidParameterSpecException
924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            if (paramSpec == OAEPParameterSpec.class && currentSpec != null)
944c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
954c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                return currentSpec;
964c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
974c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
984c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throw new InvalidParameterSpecException("unknown parameter spec passed to OAEP parameters object.");
994c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1014c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        protected void engineInit(
1024c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            AlgorithmParameterSpec paramSpec)
1034c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throws InvalidParameterSpecException
1044c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1054c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            if (!(paramSpec instanceof OAEPParameterSpec))
1064c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
1074c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                throw new InvalidParameterSpecException("OAEPParameterSpec required to initialise an OAEP algorithm parameters object");
1084c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
1094c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            this.currentSpec = (OAEPParameterSpec)paramSpec;
1114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        protected void engineInit(
1144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            byte[] params)
1154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throws IOException
1164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            try
1184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
1194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                RSAESOAEPparams oaepP = RSAESOAEPparams.getInstance(params);
1204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                currentSpec = new OAEPParameterSpec(
1224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                                       oaepP.getHashAlgorithm().getAlgorithm().getId(),
1234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                                       oaepP.getMaskGenAlgorithm().getAlgorithm().getId(),
1244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                                       new MGF1ParameterSpec(AlgorithmIdentifier.getInstance(oaepP.getMaskGenAlgorithm().getParameters()).getAlgorithm().getId()),
1254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                                       new PSource.PSpecified(ASN1OctetString.getInstance(oaepP.getPSourceAlgorithm().getParameters()).getOctets()));
1264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
1274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            catch (ClassCastException e)
1284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
1294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                throw new IOException("Not a valid OAEP Parameter encoding.");
1304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
1314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            catch (ArrayIndexOutOfBoundsException e)
1324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
1334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                throw new IOException("Not a valid OAEP Parameter encoding.");
1344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
1354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        protected void engineInit(
1384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            byte[] params,
1394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            String format)
1404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throws IOException
1414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            if (format.equalsIgnoreCase("X.509")
1434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                    || format.equalsIgnoreCase("ASN.1"))
1444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
1454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                engineInit(params);
1464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
1474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            else
1484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
1494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                throw new IOException("Unknown parameter format " + format);
1504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
1514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        protected String engineToString()
1544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return "OAEP Parameters";
1564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public static class PSS
1604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        extends AlgorithmParametersSpi
1614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        PSSParameterSpec currentSpec;
1634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        /**
1654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom         * Return the PKCS#1 ASN.1 structure RSASSA-PSS-params.
1664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom         */
1674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        protected byte[] engineGetEncoded()
1684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throws IOException
1694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            PSSParameterSpec pssSpec = currentSpec;
1714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            AlgorithmIdentifier hashAlgorithm = new AlgorithmIdentifier(
1724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                                                DigestFactory.getOID(pssSpec.getDigestAlgorithm()),
1734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                                                DERNull.INSTANCE);
1744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            MGF1ParameterSpec mgfSpec = (MGF1ParameterSpec)pssSpec.getMGFParameters();
1754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            AlgorithmIdentifier maskGenAlgorithm = new AlgorithmIdentifier(
1764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                                                PKCSObjectIdentifiers.id_mgf1,
1774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                                                new AlgorithmIdentifier(DigestFactory.getOID(mgfSpec.getDigestAlgorithm()), DERNull.INSTANCE));
1784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            RSASSAPSSparams pssP = new RSASSAPSSparams(hashAlgorithm, maskGenAlgorithm, new ASN1Integer(pssSpec.getSaltLength()), new ASN1Integer(pssSpec.getTrailerField()));
1794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return pssP.getEncoded("DER");
1814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        protected byte[] engineGetEncoded(
1844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            String format)
1854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throws IOException
1864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            if (format.equalsIgnoreCase("X.509")
1884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                    || format.equalsIgnoreCase("ASN.1"))
1894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
1904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                return engineGetEncoded();
1914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
1924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return null;
1944c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1954c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1964c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        protected AlgorithmParameterSpec localEngineGetParameterSpec(
1974c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            Class paramSpec)
1984c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throws InvalidParameterSpecException
1994c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
2004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            if (paramSpec == PSSParameterSpec.class && currentSpec != null)
2014c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
2024c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                return currentSpec;
2034c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
2044c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
2054c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throw new InvalidParameterSpecException("unknown parameter spec passed to PSS parameters object.");
2064c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
2074c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
2084c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        protected void engineInit(
2094c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            AlgorithmParameterSpec paramSpec)
2104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throws InvalidParameterSpecException
2114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
2124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            if (!(paramSpec instanceof PSSParameterSpec))
2134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
2144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                throw new InvalidParameterSpecException("PSSParameterSpec required to initialise an PSS algorithm parameters object");
2154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
2164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
2174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            this.currentSpec = (PSSParameterSpec)paramSpec;
2184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
2194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
2204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        protected void engineInit(
2214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            byte[] params)
2224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throws IOException
2234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
2244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            try
2254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
2264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                RSASSAPSSparams pssP = RSASSAPSSparams.getInstance(params);
2274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
2284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                currentSpec = new PSSParameterSpec(
2294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                                       pssP.getHashAlgorithm().getAlgorithm().getId(),
2304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                                       pssP.getMaskGenAlgorithm().getAlgorithm().getId(),
2314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                                       new MGF1ParameterSpec(AlgorithmIdentifier.getInstance(pssP.getMaskGenAlgorithm().getParameters()).getAlgorithm().getId()),
2324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                                       pssP.getSaltLength().intValue(),
2334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                                       pssP.getTrailerField().intValue());
2344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
2354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            catch (ClassCastException e)
2364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
2374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                throw new IOException("Not a valid PSS Parameter encoding.");
2384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
2394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            catch (ArrayIndexOutOfBoundsException e)
2404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
2414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                throw new IOException("Not a valid PSS Parameter encoding.");
2424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
2434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
2444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
2454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        protected void engineInit(
2464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            byte[] params,
2474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            String format)
2484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throws IOException
2494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
2504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            if (isASN1FormatString(format) || format.equalsIgnoreCase("X.509"))
2514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
2524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                engineInit(params);
2534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
2544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            else
2554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
2564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                throw new IOException("Unknown parameter format " + format);
2574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
2584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
2594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
2604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        protected String engineToString()
2614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
2624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return "PSS Parameters";
2634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
2644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
2654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom}
266