package org.bouncycastle.operator.bc; import java.security.SecureRandom; import org.bouncycastle.asn1.x509.AlgorithmIdentifier; import org.bouncycastle.crypto.InvalidCipherTextException; import org.bouncycastle.crypto.Wrapper; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.operator.GenericKey; import org.bouncycastle.operator.OperatorException; import org.bouncycastle.operator.SymmetricKeyUnwrapper; public class BcSymmetricKeyUnwrapper extends SymmetricKeyUnwrapper { private SecureRandom random; private Wrapper wrapper; private KeyParameter wrappingKey; public BcSymmetricKeyUnwrapper(AlgorithmIdentifier wrappingAlgorithm, Wrapper wrapper, KeyParameter wrappingKey) { super(wrappingAlgorithm); this.wrapper = wrapper; this.wrappingKey = wrappingKey; } public BcSymmetricKeyUnwrapper setSecureRandom(SecureRandom random) { this.random = random; return this; } public GenericKey generateUnwrappedKey(AlgorithmIdentifier encryptedKeyAlgorithm, byte[] encryptedKey) throws OperatorException { wrapper.init(false, wrappingKey); try { return new GenericKey(encryptedKeyAlgorithm, wrapper.unwrap(encryptedKey, 0, encryptedKey.length)); } catch (InvalidCipherTextException e) { throw new OperatorException("unable to unwrap key: " + e.getMessage(), e); } } }