blob: d4e21621d9ba95db341fe3e20f0822d520a96e5e [file] [log] [blame]
package org.bouncycastle.operator.jcajce;
import java.io.IOException;
import java.security.AlgorithmParameters;
import java.security.InvalidAlgorithmParameterException;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.MGF1ParameterSpec;
import javax.crypto.spec.OAEPParameterSpec;
import javax.crypto.spec.PSource;
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.asn1.DEROctetString;
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
import org.bouncycastle.asn1.pkcs.RSAESOAEPparams;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import org.bouncycastle.operator.DefaultDigestAlgorithmIdentifierFinder;
public class JcaAlgorithmParametersConverter
{
public JcaAlgorithmParametersConverter()
{
}
public AlgorithmIdentifier getAlgorithmIdentifier(ASN1ObjectIdentifier algId, AlgorithmParameters parameters)
throws InvalidAlgorithmParameterException
{
try
{
ASN1Encodable params = ASN1Primitive.fromByteArray(parameters.getEncoded());
return new AlgorithmIdentifier(algId, params);
}
catch (IOException e)
{
throw new InvalidAlgorithmParameterException("unable to encode parameters object: " + e.getMessage());
}
}
public AlgorithmIdentifier getAlgorithmIdentifier(ASN1ObjectIdentifier algorithm, AlgorithmParameterSpec algorithmSpec)
throws InvalidAlgorithmParameterException
{
if (algorithmSpec instanceof OAEPParameterSpec)
{
if (algorithmSpec.equals(OAEPParameterSpec.DEFAULT))
{
return new AlgorithmIdentifier(algorithm,
new RSAESOAEPparams(RSAESOAEPparams.DEFAULT_HASH_ALGORITHM, RSAESOAEPparams.DEFAULT_MASK_GEN_FUNCTION, RSAESOAEPparams.DEFAULT_P_SOURCE_ALGORITHM));
}
else
{
OAEPParameterSpec oaepSpec = (OAEPParameterSpec)algorithmSpec;
PSource pSource = oaepSpec.getPSource();
if (!oaepSpec.getMGFAlgorithm().equals(OAEPParameterSpec.DEFAULT.getMGFAlgorithm()))
{
throw new InvalidAlgorithmParameterException("only " + OAEPParameterSpec.DEFAULT.getMGFAlgorithm() + " mask generator supported.");
}
AlgorithmIdentifier hashAlgorithm = new DefaultDigestAlgorithmIdentifierFinder().find(oaepSpec.getDigestAlgorithm());
AlgorithmIdentifier mgf1HashAlgorithm = new DefaultDigestAlgorithmIdentifierFinder().find((((MGF1ParameterSpec)oaepSpec.getMGFParameters()).getDigestAlgorithm()));
return new AlgorithmIdentifier(algorithm,
new RSAESOAEPparams(hashAlgorithm, new AlgorithmIdentifier(PKCSObjectIdentifiers.id_mgf1, mgf1HashAlgorithm),
new AlgorithmIdentifier(PKCSObjectIdentifiers.id_pSpecified, new DEROctetString(((PSource.PSpecified)pSource).getValue()))));
}
}
throw new InvalidAlgorithmParameterException("unknown parameter spec passed.");
}
}