@@ -57,6 +57,8 @@ public class JceKeyAgreeRecipientInfoGenerator
5757 private PrivateKey senderPrivateKey ;
5858
5959 private EnvelopedDataHelper helper = new EnvelopedDataHelper (new DefaultJcaJceExtHelper ());
60+ private EnvelopedDataHelper wrappingHelper = null ;
61+
6062 private SecureRandom random ;
6163 private KeyPair ephemeralKP ;
6264 private byte [] userKeyingMaterial ;
@@ -90,6 +92,20 @@ public JceKeyAgreeRecipientInfoGenerator setProvider(String providerName)
9092 return this ;
9193 }
9294
95+ public JceKeyAgreeRecipientInfoGenerator setKeyWrappingProvider (Provider provider )
96+ {
97+ this .wrappingHelper = new EnvelopedDataHelper (new ProviderJcaJceExtHelper (provider ));
98+
99+ return this ;
100+ }
101+
102+ public JceKeyAgreeRecipientInfoGenerator setKeyWrappingProvider (String providerName )
103+ {
104+ this .wrappingHelper = new EnvelopedDataHelper (new NamedJcaJceExtHelper (providerName ));
105+
106+ return this ;
107+ }
108+
93109 public JceKeyAgreeRecipientInfoGenerator setSecureRandom (SecureRandom random )
94110 {
95111 this .random = random ;
@@ -203,16 +219,18 @@ else if (CMSUtils.isGOST(keyAgreementOID))
203219
204220 SecretKey keyEncryptionKey = keyAgreement .generateSecret (keyEncAlg .getId ());
205221
222+ EnvelopedDataHelper keyWrapHelper = (wrappingHelper != null ) ? wrappingHelper : helper ;
223+
206224 // Wrap the content encryption key with the agreement key
207- Cipher keyEncryptionCipher = helper .createCipher (keyEncAlg );
225+ Cipher keyEncryptionCipher = keyWrapHelper .createCipher (keyEncAlg );
208226 ASN1OctetString encryptedKey ;
209227
210228 if (keyEncAlg .equals (CryptoProObjectIdentifiers .id_Gost28147_89_None_KeyWrap )
211229 || keyEncAlg .equals (CryptoProObjectIdentifiers .id_Gost28147_89_CryptoPro_KeyWrap ))
212230 {
213231 keyEncryptionCipher .init (Cipher .WRAP_MODE , keyEncryptionKey , new GOST28147WrapParameterSpec (CryptoProObjectIdentifiers .id_Gost28147_89_CryptoPro_A_ParamSet , userKeyingMaterial ));
214232
215- byte [] encKeyBytes = keyEncryptionCipher .wrap (helper .getJceKey (contentEncryptionKey ));
233+ byte [] encKeyBytes = keyEncryptionCipher .wrap (keyWrapHelper .getJceKey (contentEncryptionKey ));
216234
217235 Gost2814789EncryptedKey encKey = new Gost2814789EncryptedKey (
218236 Arrays .copyOfRange (encKeyBytes , 0 , encKeyBytes .length - 4 ),
@@ -224,7 +242,7 @@ else if (CMSUtils.isGOST(keyAgreementOID))
224242 {
225243 keyEncryptionCipher .init (Cipher .WRAP_MODE , keyEncryptionKey , random );
226244
227- byte [] encryptedKeyBytes = keyEncryptionCipher .wrap (helper .getJceKey (contentEncryptionKey ));
245+ byte [] encryptedKeyBytes = keyEncryptionCipher .wrap (keyWrapHelper .getJceKey (contentEncryptionKey ));
228246
229247 encryptedKey = new DEROctetString (encryptedKeyBytes );
230248 }
0 commit comments