1package org.bouncycastle.jcajce.provider.symmetric.util;
2
3import java.security.spec.InvalidKeySpecException;
4import java.security.spec.KeySpec;
5
6import javax.crypto.SecretKey;
7import javax.crypto.spec.PBEKeySpec;
8
9import org.bouncycastle.asn1.ASN1ObjectIdentifier;
10import org.bouncycastle.crypto.CipherParameters;
11
12public class PBESecretKeyFactory
13    extends BaseSecretKeyFactory
14    implements PBE
15{
16    private boolean forCipher;
17    private int scheme;
18    private int digest;
19    private int keySize;
20    private int ivSize;
21
22    public PBESecretKeyFactory(
23        String algorithm,
24        ASN1ObjectIdentifier oid,
25        boolean forCipher,
26        int scheme,
27        int digest,
28        int keySize,
29        int ivSize)
30    {
31        super(algorithm, oid);
32
33        this.forCipher = forCipher;
34        this.scheme = scheme;
35        this.digest = digest;
36        this.keySize = keySize;
37        this.ivSize = ivSize;
38    }
39
40    protected SecretKey engineGenerateSecret(
41        KeySpec keySpec)
42        throws InvalidKeySpecException
43    {
44        if (keySpec instanceof PBEKeySpec)
45        {
46            PBEKeySpec pbeSpec = (PBEKeySpec)keySpec;
47            CipherParameters param;
48
49            if (pbeSpec.getSalt() == null)
50            {
51                return new BCPBEKey(this.algName, this.algOid, scheme, digest, keySize, ivSize, pbeSpec, null);
52            }
53
54            if (forCipher)
55            {
56                param = PBE.Util.makePBEParameters(pbeSpec, scheme, digest, keySize, ivSize);
57            }
58            else
59            {
60                param = PBE.Util.makePBEMacParameters(pbeSpec, scheme, digest, keySize);
61            }
62
63            return new BCPBEKey(this.algName, this.algOid, scheme, digest, keySize, ivSize, pbeSpec, param);
64        }
65
66        throw new InvalidKeySpecException("Invalid KeySpec");
67    }
68}
69