14c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompackage org.bouncycastle.jcajce.provider.symmetric.util;
24c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
34c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.InvalidKeySpecException;
44c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.KeySpec;
54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport javax.crypto.SecretKey;
74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport javax.crypto.spec.PBEKeySpec;
84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.DERObjectIdentifier;
104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.crypto.CipherParameters;
114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompublic class PBESecretKeyFactory
134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    extends BaseSecretKeyFactory
144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    implements PBE
154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom{
164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private boolean forCipher;
174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private int scheme;
184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private int digest;
194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private int keySize;
204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private int ivSize;
214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public PBESecretKeyFactory(
234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        String algorithm,
244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        DERObjectIdentifier oid,
254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        boolean forCipher,
264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        int scheme,
274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        int digest,
284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        int keySize,
294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        int ivSize)
304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        super(algorithm, oid);
324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.forCipher = forCipher;
344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.scheme = scheme;
354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.digest = digest;
364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.keySize = keySize;
374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.ivSize = ivSize;
384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected SecretKey engineGenerateSecret(
414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        KeySpec keySpec)
424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws InvalidKeySpecException
434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (keySpec instanceof PBEKeySpec)
454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            PBEKeySpec pbeSpec = (PBEKeySpec)keySpec;
474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            CipherParameters param;
484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            if (pbeSpec.getSalt() == null)
504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                return new BCPBEKey(this.algName, this.algOid, scheme, digest, keySize, ivSize, pbeSpec, null);
524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            if (forCipher)
554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                param = PBE.Util.makePBEParameters(pbeSpec, scheme, digest, keySize, ivSize);
574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            else
594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                param = PBE.Util.makePBEMacParameters(pbeSpec, scheme, digest, keySize);
614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return new BCPBEKey(this.algName, this.algOid, scheme, digest, keySize, ivSize, pbeSpec, param);
644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throw new InvalidKeySpecException("Invalid KeySpec");
674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom}
69