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