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