@@ -57,6 +57,8 @@ public class JceKeyAgreeRecipientInfoGenerator
57
57
private PrivateKey senderPrivateKey ;
58
58
59
59
private EnvelopedDataHelper helper = new EnvelopedDataHelper (new DefaultJcaJceExtHelper ());
60
+ private EnvelopedDataHelper wrappingHelper = null ;
61
+
60
62
private SecureRandom random ;
61
63
private KeyPair ephemeralKP ;
62
64
private byte [] userKeyingMaterial ;
@@ -90,6 +92,20 @@ public JceKeyAgreeRecipientInfoGenerator setProvider(String providerName)
90
92
return this ;
91
93
}
92
94
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
+
93
109
public JceKeyAgreeRecipientInfoGenerator setSecureRandom (SecureRandom random )
94
110
{
95
111
this .random = random ;
@@ -203,16 +219,18 @@ else if (CMSUtils.isGOST(keyAgreementOID))
203
219
204
220
SecretKey keyEncryptionKey = keyAgreement .generateSecret (keyEncAlg .getId ());
205
221
222
+ EnvelopedDataHelper keyWrapHelper = (wrappingHelper != null ) ? wrappingHelper : helper ;
223
+
206
224
// Wrap the content encryption key with the agreement key
207
- Cipher keyEncryptionCipher = helper .createCipher (keyEncAlg );
225
+ Cipher keyEncryptionCipher = keyWrapHelper .createCipher (keyEncAlg );
208
226
ASN1OctetString encryptedKey ;
209
227
210
228
if (keyEncAlg .equals (CryptoProObjectIdentifiers .id_Gost28147_89_None_KeyWrap )
211
229
|| keyEncAlg .equals (CryptoProObjectIdentifiers .id_Gost28147_89_CryptoPro_KeyWrap ))
212
230
{
213
231
keyEncryptionCipher .init (Cipher .WRAP_MODE , keyEncryptionKey , new GOST28147WrapParameterSpec (CryptoProObjectIdentifiers .id_Gost28147_89_CryptoPro_A_ParamSet , userKeyingMaterial ));
214
232
215
- byte [] encKeyBytes = keyEncryptionCipher .wrap (helper .getJceKey (contentEncryptionKey ));
233
+ byte [] encKeyBytes = keyEncryptionCipher .wrap (keyWrapHelper .getJceKey (contentEncryptionKey ));
216
234
217
235
Gost2814789EncryptedKey encKey = new Gost2814789EncryptedKey (
218
236
Arrays .copyOfRange (encKeyBytes , 0 , encKeyBytes .length - 4 ),
@@ -224,7 +242,7 @@ else if (CMSUtils.isGOST(keyAgreementOID))
224
242
{
225
243
keyEncryptionCipher .init (Cipher .WRAP_MODE , keyEncryptionKey , random );
226
244
227
- byte [] encryptedKeyBytes = keyEncryptionCipher .wrap (helper .getJceKey (contentEncryptionKey ));
245
+ byte [] encryptedKeyBytes = keyEncryptionCipher .wrap (keyWrapHelper .getJceKey (contentEncryptionKey ));
228
246
229
247
encryptedKey = new DEROctetString (encryptedKeyBytes );
230
248
}
0 commit comments