Skip to content

Commit 72c5f53

Browse files
committed
added short hand oid for SHA-256 HKDF to CMS algorithms
added SLH-DSA time stamp test. minor refactoring of NewEnvelopedDataTest.
1 parent 3ea208d commit 72c5f53

File tree

3 files changed

+134
-56
lines changed

3 files changed

+134
-56
lines changed

pkix/src/main/java/org/bouncycastle/cms/CMSAlgorithm.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.bouncycastle.asn1.rosstandart.RosstandartObjectIdentifiers;
1313
import org.bouncycastle.asn1.sec.SECObjectIdentifiers;
1414
import org.bouncycastle.asn1.teletrust.TeleTrusTObjectIdentifiers;
15+
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
1516
import org.bouncycastle.asn1.x9.X9ObjectIdentifiers;
1617

1718
public class CMSAlgorithm
@@ -105,5 +106,7 @@ public class CMSAlgorithm
105106

106107
public static final ASN1ObjectIdentifier SHAKE128_LEN = NISTObjectIdentifiers.id_shake128_len.intern();
107108
public static final ASN1ObjectIdentifier SHAKE256_LEN = NISTObjectIdentifiers.id_shake256_len.intern();
108-
public static final ASN1ObjectIdentifier ChaCha20Poly1305 = PKCSObjectIdentifiers.id_alg_AEADChaCha20Poly1305.intern();
109+
public static final ASN1ObjectIdentifier ChaCha20Poly1305 = PKCSObjectIdentifiers.id_alg_AEADChaCha20Poly1305.intern();
110+
111+
public static final AlgorithmIdentifier SHA256_HKDF = new AlgorithmIdentifier(PKCSObjectIdentifiers.id_alg_hkdf_with_sha256);
109112
}

pkix/src/test/java/org/bouncycastle/cms/test/NewEnvelopedDataTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -736,7 +736,7 @@ public void testMLKem512()
736736

737737
// note: use cert req ID as key ID, don't want to use issuer/serial in this case!
738738
edGen.addRecipientInfoGenerator(new JceKEMRecipientInfoGenerator(_reciMLKem512Cert, CMSAlgorithm.AES128_WRAP)
739-
.setKDF(new AlgorithmIdentifier(PKCSObjectIdentifiers.id_alg_hkdf_with_sha256)));
739+
.setKDF(CMSAlgorithm.SHA256_HKDF));
740740

741741
CMSEnvelopedData ed = edGen.generate(
742742
new CMSProcessableByteArray(data),
@@ -781,7 +781,7 @@ public void testMLKem768()
781781

782782
// note: use cert req ID as key ID, don't want to use issuer/serial in this case!
783783
edGen.addRecipientInfoGenerator(new JceKEMRecipientInfoGenerator(_reciMLKem768Cert, CMSAlgorithm.AES256_WRAP)
784-
.setKDF(new AlgorithmIdentifier(PKCSObjectIdentifiers.id_alg_hkdf_with_sha256)));
784+
.setKDF(CMSAlgorithm.SHA256_HKDF));
785785

786786
CMSEnvelopedData ed = edGen.generate(
787787
new CMSProcessableByteArray(data),

pkix/src/test/java/org/bouncycastle/tsp/test/PQCTSPTest.java

Lines changed: 128 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -195,78 +195,153 @@ public void testSPHINCSPlus()
195195
assertNotNull("no signingCertificate attribute found", table.get(PKCSObjectIdentifiers.id_aa_signingCertificate));
196196
}
197197

198-
public void testMLDSA()
199-
throws Exception
198+
public void testSLHDSA()
199+
throws Exception
200+
{
201+
//
202+
// set up the keys
203+
//
204+
PrivateKey privKey;
205+
PublicKey pubKey;
206+
207+
try
200208
{
201-
//
202-
// set up the keys
203-
//
204-
PrivateKey privKey;
205-
PublicKey pubKey;
209+
KeyPairGenerator g = KeyPairGenerator.getInstance("SLH-DSA", BC);
206210

207-
try
208-
{
209-
KeyPairGenerator g = KeyPairGenerator.getInstance("ML-DSA", BC);
211+
KeyPair p = g.generateKeyPair();
210212

211-
KeyPair p = g.generateKeyPair();
213+
privKey = p.getPrivate();
214+
pubKey = p.getPublic();
215+
}
216+
catch (Exception e)
217+
{
218+
fail("error setting up keys - " + e);
219+
return;
220+
}
212221

213-
privKey = p.getPrivate();
214-
pubKey = p.getPublic();
215-
}
216-
catch (Exception e)
217-
{
218-
fail("error setting up keys - " + e);
219-
return;
220-
}
222+
//
223+
// extensions
224+
//
221225

222-
//
223-
// extensions
224-
//
226+
//
227+
// create the certificate - version 1
228+
//
225229

226-
//
227-
// create the certificate - version 1
228-
//
230+
ContentSigner sigGen = new JcaContentSignerBuilder("SLH-DSA")
231+
.setProvider(BC).build(privKey);
232+
JcaX509v3CertificateBuilder certGen = new JcaX509v3CertificateBuilder(
233+
new X500Name("CN=Test"),
234+
BigInteger.valueOf(1),
235+
new Date(System.currentTimeMillis() - 50000),
236+
new Date(System.currentTimeMillis() + 50000),
237+
new X500Name("CN=Test"),
238+
pubKey);
229239

230-
ContentSigner sigGen = new JcaContentSignerBuilder("ML-DSA")
231-
.setProvider(BC).build(privKey);
232-
JcaX509v3CertificateBuilder certGen = new JcaX509v3CertificateBuilder(
233-
new X500Name("CN=Test"),
234-
BigInteger.valueOf(1),
235-
new Date(System.currentTimeMillis() - 50000),
236-
new Date(System.currentTimeMillis() + 50000),
237-
new X500Name("CN=Test"),
238-
pubKey);
240+
certGen.addExtension(Extension.extendedKeyUsage, true, new ExtendedKeyUsage(KeyPurposeId.id_kp_timeStamping));
239241

240-
certGen.addExtension(Extension.extendedKeyUsage, true, new ExtendedKeyUsage(KeyPurposeId.id_kp_timeStamping));
242+
X509Certificate cert = new JcaX509CertificateConverter()
243+
.setProvider("BC").getCertificate(certGen.build(sigGen));
241244

242-
X509Certificate cert = new JcaX509CertificateConverter()
243-
.setProvider("BC").getCertificate(certGen.build(sigGen));
245+
ContentSigner signer = new JcaContentSignerBuilder("SLH-DSA").setProvider(BC).build(privKey);
244246

245-
ContentSigner signer = new JcaContentSignerBuilder("ML-DSA").setProvider(BC).build(privKey);
247+
TimeStampTokenGenerator tsTokenGen = new TimeStampTokenGenerator(
248+
new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().build())
249+
.setContentDigest(new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha512))
250+
.build(signer, cert), new SHA1DigestCalculator(), new ASN1ObjectIdentifier("1.2"));
246251

247-
TimeStampTokenGenerator tsTokenGen = new TimeStampTokenGenerator(
248-
new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().build())
249-
.setContentDigest(new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha512))
250-
.build(signer, cert), new SHA1DigestCalculator(), new ASN1ObjectIdentifier("1.2"));
252+
// tsTokenGen.addCertificates(certs);
251253

252-
// tsTokenGen.addCertificates(certs);
254+
TimeStampRequestGenerator reqGen = new TimeStampRequestGenerator();
255+
TimeStampRequest request = reqGen.generate(TSPAlgorithms.SHA3_256, new byte[32], BigInteger.valueOf(100));
253256

254-
TimeStampRequestGenerator reqGen = new TimeStampRequestGenerator();
255-
TimeStampRequest request = reqGen.generate(TSPAlgorithms.SHA3_256, new byte[32], BigInteger.valueOf(100));
257+
TimeStampResponseGenerator tsRespGen = new TimeStampResponseGenerator(tsTokenGen, TSPAlgorithms.ALLOWED);
258+
259+
TimeStampResponse tsResp = tsRespGen.generate(request, new BigInteger("23"), new Date());
256260

257-
TimeStampResponseGenerator tsRespGen = new TimeStampResponseGenerator(tsTokenGen, TSPAlgorithms.ALLOWED);
261+
tsResp = new TimeStampResponse(tsResp.getEncoded());
258262

259-
TimeStampResponse tsResp = tsRespGen.generate(request, new BigInteger("23"), new Date());
263+
TimeStampToken tsToken = tsResp.getTimeStampToken();
260264

261-
tsResp = new TimeStampResponse(tsResp.getEncoded());
265+
tsToken.validate(new JcaSignerInfoVerifierBuilder(new JcaDigestCalculatorProviderBuilder().build())
266+
.setProvider(BC).build(cert));
262267

263-
TimeStampToken tsToken = tsResp.getTimeStampToken();
268+
AttributeTable table = tsToken.getSignedAttributes();
264269

265-
tsToken.validate(new JcaSignerInfoVerifierBuilder(new JcaDigestCalculatorProviderBuilder().build())
266-
.setProvider(BC).build(cert));
270+
assertNotNull("no signingCertificate attribute found", table.get(PKCSObjectIdentifiers.id_aa_signingCertificate));
271+
}
267272

268-
AttributeTable table = tsToken.getSignedAttributes();
273+
public void testMLDSA()
274+
throws Exception
275+
{
276+
//
277+
// set up the keys
278+
//
279+
PrivateKey privKey;
280+
PublicKey pubKey;
269281

270-
assertNotNull("no signingCertificate attribute found", table.get(PKCSObjectIdentifiers.id_aa_signingCertificate));
282+
try
283+
{
284+
KeyPairGenerator g = KeyPairGenerator.getInstance("ML-DSA", BC);
285+
286+
KeyPair p = g.generateKeyPair();
287+
288+
privKey = p.getPrivate();
289+
pubKey = p.getPublic();
271290
}
291+
catch (Exception e)
292+
{
293+
fail("error setting up keys - " + e);
294+
return;
295+
}
296+
297+
//
298+
// extensions
299+
//
300+
301+
//
302+
// create the certificate - version 1
303+
//
304+
305+
ContentSigner sigGen = new JcaContentSignerBuilder("SLH-DSA")
306+
.setProvider(BC).build(privKey);
307+
JcaX509v3CertificateBuilder certGen = new JcaX509v3CertificateBuilder(
308+
new X500Name("CN=Test"),
309+
BigInteger.valueOf(1),
310+
new Date(System.currentTimeMillis() - 50000),
311+
new Date(System.currentTimeMillis() + 50000),
312+
new X500Name("CN=Test"),
313+
pubKey);
314+
315+
certGen.addExtension(Extension.extendedKeyUsage, true, new ExtendedKeyUsage(KeyPurposeId.id_kp_timeStamping));
316+
317+
X509Certificate cert = new JcaX509CertificateConverter()
318+
.setProvider("BC").getCertificate(certGen.build(sigGen));
319+
320+
ContentSigner signer = new JcaContentSignerBuilder("ML-DSA").setProvider(BC).build(privKey);
321+
322+
TimeStampTokenGenerator tsTokenGen = new TimeStampTokenGenerator(
323+
new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().build())
324+
.setContentDigest(new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha512))
325+
.build(signer, cert), new SHA1DigestCalculator(), new ASN1ObjectIdentifier("1.2"));
326+
327+
// tsTokenGen.addCertificates(certs);
328+
329+
TimeStampRequestGenerator reqGen = new TimeStampRequestGenerator();
330+
TimeStampRequest request = reqGen.generate(TSPAlgorithms.SHA3_256, new byte[32], BigInteger.valueOf(100));
331+
332+
TimeStampResponseGenerator tsRespGen = new TimeStampResponseGenerator(tsTokenGen, TSPAlgorithms.ALLOWED);
333+
334+
TimeStampResponse tsResp = tsRespGen.generate(request, new BigInteger("23"), new Date());
335+
336+
tsResp = new TimeStampResponse(tsResp.getEncoded());
337+
338+
TimeStampToken tsToken = tsResp.getTimeStampToken();
339+
340+
tsToken.validate(new JcaSignerInfoVerifierBuilder(new JcaDigestCalculatorProviderBuilder().build())
341+
.setProvider(BC).build(cert));
342+
343+
AttributeTable table = tsToken.getSignedAttributes();
344+
345+
assertNotNull("no signingCertificate attribute found", table.get(PKCSObjectIdentifiers.id_aa_signingCertificate));
346+
}
272347
}

0 commit comments

Comments
 (0)