116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giropackage org.bouncycastle.jcajce.provider.symmetric.util;
216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.lang.reflect.Constructor;
416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.security.InvalidKeyException;
516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.security.spec.InvalidKeySpecException;
616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.security.spec.KeySpec;
716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport javax.crypto.SecretKey;
916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport javax.crypto.SecretKeyFactorySpi;
1016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport javax.crypto.spec.SecretKeySpec;
1116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
1216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1ObjectIdentifier;
1316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
1416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giropublic class BaseSecretKeyFactory
1516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    extends SecretKeyFactorySpi
1616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    implements PBE
1716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro{
1816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    protected String                algName;
1916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    protected ASN1ObjectIdentifier   algOid;
2016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
2116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    protected BaseSecretKeyFactory(
2216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        String algName,
2316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        ASN1ObjectIdentifier algOid)
2416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
2516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this.algName = algName;
2616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this.algOid = algOid;
2716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
2816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
2916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    protected SecretKey engineGenerateSecret(
3016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        KeySpec keySpec)
3116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    throws InvalidKeySpecException
3216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
3316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (keySpec instanceof SecretKeySpec)
3416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
354caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro            return new SecretKeySpec(((SecretKeySpec)keySpec).getEncoded(), algName);
3616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
3716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
3816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        throw new InvalidKeySpecException("Invalid KeySpec");
3916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
4016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
4116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    protected KeySpec engineGetKeySpec(
4216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        SecretKey key,
4316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        Class keySpec)
4416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    throws InvalidKeySpecException
4516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
4616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (keySpec == null)
4716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
4816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            throw new InvalidKeySpecException("keySpec parameter is null");
4916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
5016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (key == null)
5116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
5216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            throw new InvalidKeySpecException("key parameter is null");
5316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
5416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
5516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (SecretKeySpec.class.isAssignableFrom(keySpec))
5616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
5716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return new SecretKeySpec(key.getEncoded(), algName);
5816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
5916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
6016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        try
6116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
6216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            Class[] parameters = { byte[].class };
6316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
6416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            Constructor c = keySpec.getConstructor(parameters);
6516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            Object[]    p = new Object[1];
6616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
6716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            p[0] = key.getEncoded();
6816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
6916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return (KeySpec)c.newInstance(p);
7016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
7116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        catch (Exception e)
7216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
7316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            throw new InvalidKeySpecException(e.toString());
7416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
7516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
7616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
7716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    protected SecretKey engineTranslateKey(
7816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        SecretKey key)
7916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    throws InvalidKeyException
8016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
8116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (key == null)
8216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
8316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            throw new InvalidKeyException("key parameter is null");
8416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
8516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
8616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (!key.getAlgorithm().equalsIgnoreCase(algName))
8716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
8816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            throw new InvalidKeyException("Key not of type " + algName + ".");
8916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
9016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
9116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return new SecretKeySpec(key.getEncoded(), algName);
9216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
9316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro}
94