Skip to content

Commit a7b56ba

Browse files
committed
added test for use of context by reflection
1 parent 9b3216d commit a7b56ba

File tree

2 files changed

+63
-1
lines changed

2 files changed

+63
-1
lines changed

prov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/compositesignatures/SignatureSpi.java

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import org.bouncycastle.jcajce.spec.ContextParameterSpec;
3939
import org.bouncycastle.jcajce.util.BCJcaJceHelper;
4040
import org.bouncycastle.jcajce.util.JcaJceHelper;
41+
import org.bouncycastle.jcajce.util.SpecUtil;
4142
import org.bouncycastle.util.Arrays;
4243
import org.bouncycastle.util.Exceptions;
4344
import org.bouncycastle.util.Strings;
@@ -513,10 +514,48 @@ else if (algorithmParameterSpec instanceof CompositeSignatureSpec)
513514
{
514515
this.preHashDigest = this.baseDigest;
515516
}
516-
this.contextSpec = (ContextParameterSpec)compositeSignatureSpec.getSecondarySpec();
517+
AlgorithmParameterSpec secondarySpec = compositeSignatureSpec.getSecondarySpec();
518+
519+
if (secondarySpec == null || secondarySpec instanceof ContextParameterSpec)
520+
{
521+
this.contextSpec = (ContextParameterSpec)compositeSignatureSpec.getSecondarySpec();
522+
}
523+
else
524+
{
525+
byte[] context = SpecUtil.getContextFrom(secondarySpec);
526+
if (context != null)
527+
{
528+
contextSpec = new ContextParameterSpec(context);
529+
}
530+
else
531+
{
532+
throw new InvalidAlgorithmParameterException("unknown parameterSpec passed to composite signature");
533+
}
534+
}
517535
}
518536
else
519537
{
538+
byte[] context = SpecUtil.getContextFrom(algorithmParameterSpec);
539+
if (context != null)
540+
{
541+
contextSpec = new ContextParameterSpec(context);
542+
try
543+
{
544+
if (compositeKey instanceof PublicKey)
545+
{
546+
sigInitVerify();
547+
}
548+
else
549+
{
550+
sigInitSign();
551+
}
552+
}
553+
catch (InvalidKeyException e)
554+
{
555+
throw new InvalidAlgorithmParameterException("keys invalid on reset: " + e.getMessage(), e);
556+
}
557+
}
558+
520559
throw new InvalidAlgorithmParameterException("unknown parameterSpec passed to composite signature");
521560
}
522561
}

prov/src/test/java/org/bouncycastle/jcajce/provider/test/CompositeSignaturesTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.security.cert.X509Certificate;
1919
import java.security.interfaces.RSAPrivateKey;
2020
import java.security.interfaces.RSAPublicKey;
21+
import java.security.spec.AlgorithmParameterSpec;
2122
import java.security.spec.ECGenParameterSpec;
2223
import java.security.spec.PKCS8EncodedKeySpec;
2324
import java.security.spec.X509EncodedKeySpec;
@@ -623,6 +624,12 @@ private void doTestPrehash(String sigName, String digestName, ContextParameterSp
623624
signature.update(MessageDigest.getInstance(digestName, "BC").digest(msg));
624625
assertTrue(signature.verify(signatureValue));
625626

627+
// check reflection case
628+
signature.initVerify(keyPair.getPublic());
629+
signature.setParameter(new CompositeSignatureSpec(true, new MyContextSpec(contextSpec.getContext())));
630+
signature.update(MessageDigest.getInstance(digestName, "BC").digest(msg));
631+
assertTrue(signature.verify(signatureValue));
632+
626633
// full msg sign, verify hash
627634
signature = Signature.getInstance(sigName, "BC");
628635
signature.initSign(keyPair.getPrivate());
@@ -876,6 +883,22 @@ private static String extractString(String json, String key)
876883
return json.substring(start, end).replace("\\\"", "\"");
877884
}
878885

886+
public static class MyContextSpec
887+
implements AlgorithmParameterSpec
888+
{
889+
private final byte[] context;
890+
891+
MyContextSpec(byte[] context)
892+
{
893+
this.context = context;
894+
}
895+
896+
public byte[] getContext()
897+
{
898+
return context;
899+
}
900+
}
901+
879902
private static class ProxyHSMPrivateKey
880903
implements MLDSAPrivateKey
881904
{

0 commit comments

Comments
 (0)