Skip to content

Commit f4ba48a

Browse files
committed
added support for independent provider key wrapping after agreement step
1 parent 4ae51a9 commit f4ba48a

File tree

1 file changed

+21
-3
lines changed

1 file changed

+21
-3
lines changed

pkix/src/main/java/org/bouncycastle/cms/jcajce/JceKeyAgreeRecipientInfoGenerator.java

+21-3
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)