Skip to content

Commit 2fff24c

Browse files
committed
added support for generation of OAEP encrypted enveloped data.
minor cleanups
1 parent a77de81 commit 2fff24c

File tree

10 files changed

+380
-119
lines changed

10 files changed

+380
-119
lines changed

core/src/main/java/org/bouncycastle/asn1/pkcs/RSAESOAEPparams.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,11 @@ public RSAESOAEPparams(
5757
this.maskGenAlgorithm = maskGenAlgorithm;
5858
this.pSourceAlgorithm = pSourceAlgorithm;
5959
}
60-
60+
61+
/**
62+
* @deprecated use getInstance()
63+
* @param seq
64+
*/
6165
public RSAESOAEPparams(
6266
ASN1Sequence seq)
6367
{

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.security.PublicKey;
55
import java.security.cert.CertificateEncodingException;
66
import java.security.cert.X509Certificate;
7+
import java.security.spec.AlgorithmParameterSpec;
78

89
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
910
import org.bouncycastle.asn1.cms.IssuerAndSerialNumber;
@@ -17,14 +18,25 @@ public class JceKeyTransRecipientInfoGenerator
1718
public JceKeyTransRecipientInfoGenerator(X509Certificate recipientCert)
1819
throws CertificateEncodingException
1920
{
20-
super(new IssuerAndSerialNumber(new JcaX509CertificateHolder(recipientCert).toASN1Structure()), new JceAsymmetricKeyWrapper(recipientCert.getPublicKey()));
21+
super(new IssuerAndSerialNumber(new JcaX509CertificateHolder(recipientCert).toASN1Structure()), new JceAsymmetricKeyWrapper(recipientCert));
2122
}
2223

2324
public JceKeyTransRecipientInfoGenerator(byte[] subjectKeyIdentifier, PublicKey publicKey)
2425
{
2526
super(subjectKeyIdentifier, new JceAsymmetricKeyWrapper(publicKey));
2627
}
2728

29+
public JceKeyTransRecipientInfoGenerator(X509Certificate recipientCert, AlgorithmParameterSpec parameterSpec)
30+
throws CertificateEncodingException
31+
{
32+
super(new IssuerAndSerialNumber(new JcaX509CertificateHolder(recipientCert).toASN1Structure()), new JceAsymmetricKeyWrapper(recipientCert, parameterSpec));
33+
}
34+
35+
public JceKeyTransRecipientInfoGenerator(byte[] subjectKeyIdentifier, PublicKey publicKey, AlgorithmParameterSpec parameterSpec)
36+
{
37+
super(subjectKeyIdentifier, new JceAsymmetricKeyWrapper(publicKey, parameterSpec));
38+
}
39+
2840
public JceKeyTransRecipientInfoGenerator setProvider(String providerName)
2941
{
3042
((JceAsymmetricKeyWrapper)this.wrapper).setProvider(providerName);

pkix/src/main/java/org/bouncycastle/operator/jcajce/JceAsymmetricKeyWrapper.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,25 @@
66
import java.security.PublicKey;
77
import java.security.SecureRandom;
88
import java.security.cert.X509Certificate;
9+
import java.security.spec.AlgorithmParameterSpec;
910
import java.util.HashMap;
1011
import java.util.Map;
1112

1213
import javax.crypto.Cipher;
14+
import javax.crypto.spec.OAEPParameterSpec;
15+
import javax.crypto.spec.PSource;
1316

1417
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
18+
import org.bouncycastle.asn1.DEROctetString;
19+
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
20+
import org.bouncycastle.asn1.pkcs.RSAESOAEPparams;
21+
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
1522
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
1623
import org.bouncycastle.jcajce.DefaultJcaJceHelper;
1724
import org.bouncycastle.jcajce.NamedJcaJceHelper;
1825
import org.bouncycastle.jcajce.ProviderJcaJceHelper;
1926
import org.bouncycastle.operator.AsymmetricKeyWrapper;
27+
import org.bouncycastle.operator.DefaultDigestAlgorithmIdentifierFinder;
2028
import org.bouncycastle.operator.GenericKey;
2129
import org.bouncycastle.operator.OperatorException;
2230

@@ -40,6 +48,18 @@ public JceAsymmetricKeyWrapper(X509Certificate certificate)
4048
this(certificate.getPublicKey());
4149
}
4250

51+
public JceAsymmetricKeyWrapper(PublicKey publicKey, AlgorithmParameterSpec algorithmParameterSpec)
52+
{
53+
super(getAlgID(SubjectPublicKeyInfo.getInstance(publicKey.getEncoded()), algorithmParameterSpec));
54+
55+
this.publicKey = publicKey;
56+
}
57+
58+
public JceAsymmetricKeyWrapper(X509Certificate certificate, AlgorithmParameterSpec algorithmParameterSpec)
59+
{
60+
this(certificate.getPublicKey(), algorithmParameterSpec);
61+
}
62+
4363
public JceAsymmetricKeyWrapper setProvider(Provider provider)
4464
{
4565
this.helper = new OperatorHelper(new ProviderJcaJceHelper(provider));
@@ -122,4 +142,29 @@ public byte[] generateWrappedKey(GenericKey encryptionKey)
122142

123143
return encryptedKeyBytes;
124144
}
145+
146+
private static AlgorithmIdentifier getAlgID(SubjectPublicKeyInfo pubKeyInfo, AlgorithmParameterSpec algorithmSpec)
147+
{
148+
if (PKCSObjectIdentifiers.rsaEncryption.equals(pubKeyInfo.getAlgorithm().getAlgorithm())
149+
|| PKCSObjectIdentifiers.id_RSAES_OAEP.equals(pubKeyInfo.getAlgorithm().getAlgorithm()))
150+
{
151+
if (algorithmSpec.equals(OAEPParameterSpec.DEFAULT))
152+
{
153+
return new AlgorithmIdentifier(PKCSObjectIdentifiers.id_RSAES_OAEP,
154+
new RSAESOAEPparams(RSAESOAEPparams.DEFAULT_HASH_ALGORITHM, RSAESOAEPparams.DEFAULT_MASK_GEN_FUNCTION, RSAESOAEPparams.DEFAULT_P_SOURCE_ALGORITHM));
155+
}
156+
else
157+
{
158+
OAEPParameterSpec oaepSpec = (OAEPParameterSpec)algorithmSpec;
159+
PSource pSource = oaepSpec.getPSource();
160+
161+
AlgorithmIdentifier hashAlgorithm = new DefaultDigestAlgorithmIdentifierFinder().find(oaepSpec.getDigestAlgorithm());
162+
return new AlgorithmIdentifier(PKCSObjectIdentifiers.id_RSAES_OAEP,
163+
new RSAESOAEPparams(hashAlgorithm, new AlgorithmIdentifier(PKCSObjectIdentifiers.id_mgf1, hashAlgorithm),
164+
new AlgorithmIdentifier(PKCSObjectIdentifiers.id_pSpecified, new DEROctetString(((PSource.PSpecified)pSource).getValue()))));
165+
}
166+
}
167+
168+
throw new IllegalArgumentException("unknown parameter spec passed.");
169+
}
125170
}

pkix/src/test/java/org/bouncycastle/cert/test/PKCS10Test.java

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import java.security.Signature;
1212
import java.security.spec.RSAPrivateCrtKeySpec;
1313
import java.security.spec.RSAPublicKeySpec;
14-
import java.util.Vector;
1514

1615
import javax.security.auth.x500.X500Principal;
1716

@@ -24,11 +23,11 @@
2423
import org.bouncycastle.asn1.x500.X500NameBuilder;
2524
import org.bouncycastle.asn1.x500.style.BCStyle;
2625
import org.bouncycastle.asn1.x509.BasicConstraints;
26+
import org.bouncycastle.asn1.x509.Extension;
27+
import org.bouncycastle.asn1.x509.Extensions;
2728
import org.bouncycastle.asn1.x509.KeyUsage;
28-
import org.bouncycastle.asn1.x509.SubjectKeyIdentifier;
29-
import org.bouncycastle.asn1.x509.X509Extension;
30-
import org.bouncycastle.asn1.x509.X509Extensions;
3129
import org.bouncycastle.asn1.x9.X9ObjectIdentifiers;
30+
import org.bouncycastle.cert.jcajce.JcaX509ExtensionUtils;
3231
import org.bouncycastle.jce.ECGOST3410NamedCurveTable;
3332
import org.bouncycastle.jce.ECNamedCurveTable;
3433
import org.bouncycastle.jce.interfaces.ECPointEncoder;
@@ -50,7 +49,6 @@
5049
import org.bouncycastle.util.encoders.Base64;
5150
import org.bouncycastle.util.encoders.Hex;
5251
import org.bouncycastle.util.test.SimpleTest;
53-
import org.bouncycastle.x509.extension.SubjectKeyIdentifierStructure;
5452

5553
/**
5654
**/
@@ -463,28 +461,23 @@ private void nullPointerTest()
463461
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA", "BC");
464462
keyGen.initialize(1024, new SecureRandom());
465463
KeyPair pair = keyGen.generateKeyPair();
464+
JcaX509ExtensionUtils extUtils = new JcaX509ExtensionUtils();
466465

467-
Vector oids = new Vector();
468-
Vector values = new Vector();
469-
oids.add(X509Extension.basicConstraints);
470-
values.add(new X509Extension(true, new DEROctetString(new BasicConstraints(true))));
471-
oids.add(X509Extension.keyUsage);
472-
values.add(new X509Extension(true, new DEROctetString(
473-
new KeyUsage(KeyUsage.keyCertSign | KeyUsage.cRLSign))));
474-
SubjectKeyIdentifier subjectKeyIdentifier = new SubjectKeyIdentifierStructure(pair.getPublic());
475-
X509Extension ski = new X509Extension(false, new DEROctetString(subjectKeyIdentifier));
476-
oids.add(X509Extension.subjectKeyIdentifier);
477-
values.add(ski);
466+
Extension[] ext = new Extension[] {
467+
new Extension(Extension.basicConstraints, true, new DEROctetString(new BasicConstraints(true))),
468+
new Extension(Extension.keyUsage, true, new DEROctetString(new KeyUsage(KeyUsage.keyCertSign | KeyUsage.cRLSign))),
469+
new Extension(Extension.subjectKeyIdentifier, false, new DEROctetString(extUtils.createSubjectKeyIdentifier(pair.getPublic())))
470+
};
478471

479472
PKCS10CertificationRequest p1 = new JcaPKCS10CertificationRequestBuilder(
480473
new X500Name("cn=csr"),
481474
pair.getPublic())
482-
.addAttribute(PKCSObjectIdentifiers.pkcs_9_at_extensionRequest, new X509Extensions(oids, values))
475+
.addAttribute(PKCSObjectIdentifiers.pkcs_9_at_extensionRequest, new Extensions(ext))
483476
.build(new JcaContentSignerBuilder("SHA1withRSA").setProvider(BC).build(pair.getPrivate()));
484477
PKCS10CertificationRequest p2 = new JcaPKCS10CertificationRequestBuilder(
485478
new X500Name("cn=csr"),
486479
pair.getPublic())
487-
.addAttribute(PKCSObjectIdentifiers.pkcs_9_at_extensionRequest, new X509Extensions(oids, values))
480+
.addAttribute(PKCSObjectIdentifiers.pkcs_9_at_extensionRequest, new Extensions(ext))
488481
.build(new JcaContentSignerBuilder("SHA1withRSA").setProvider(BC).build(pair.getPrivate()));
489482

490483
if (!p1.equals(p2))

0 commit comments

Comments
 (0)