Skip to content

Commit e473a06

Browse files
committed
added reflection based setting of signature context for ML-DSA and SLH-DSA.
1 parent a7b56ba commit e473a06

File tree

3 files changed

+65
-4
lines changed

3 files changed

+65
-4
lines changed

prov/src/main/java/org/bouncycastle/jcajce/provider/asymmetric/util/BaseDeterministicOrRandomSignature.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.bouncycastle.jcajce.spec.ContextParameterSpec;
1919
import org.bouncycastle.jcajce.util.BCJcaJceHelper;
2020
import org.bouncycastle.jcajce.util.JcaJceHelper;
21+
import org.bouncycastle.jcajce.util.SpecUtil;
2122
import org.bouncycastle.util.Exceptions;
2223

2324
public abstract class BaseDeterministicOrRandomSignature
@@ -123,7 +124,16 @@ protected void engineSetParameter(
123124
}
124125
else
125126
{
126-
throw new InvalidAlgorithmParameterException("unknown AlgorithmParameterSpec in signature");
127+
byte[] context = SpecUtil.getContextFrom(params);
128+
if (context != null)
129+
{
130+
this.paramSpec = new ContextParameterSpec(context);
131+
reInit();
132+
}
133+
else
134+
{
135+
throw new InvalidAlgorithmParameterException("unknown AlgorithmParameterSpec in signature");
136+
}
127137
}
128138
}
129139

prov/src/test/java/org/bouncycastle/pqc/jcajce/provider/test/MLDSATest.java

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.security.Security;
1616
import java.security.Signature;
1717
import java.security.SignatureException;
18+
import java.security.spec.AlgorithmParameterSpec;
1819
import java.security.spec.InvalidKeySpecException;
1920
import java.security.spec.PKCS8EncodedKeySpec;
2021
import java.security.spec.X509EncodedKeySpec;
@@ -707,6 +708,18 @@ public void testMLDSAKATSigWithContext()
707708

708709
assertTrue(sig.verify(s));
709710

711+
// check reflection based context.
712+
713+
sig = Signature.getInstance("ML-DSA", "BC");
714+
715+
sig.initVerify(kp.getPublic());
716+
717+
sig.setParameter(new MyContextParameterSpec(Strings.toByteArray("Hello, world!")));
718+
719+
sig.update(msg, 0, msg.length);
720+
721+
assertTrue(sig.verify(s));
722+
710723
// check randomisation
711724

712725
sig.initSign(kp.getPrivate(), new SecureRandom());
@@ -921,10 +934,19 @@ public void nextBytes(byte[] bytes)
921934
}
922935
}
923936

924-
public static void main(String[] args)
925-
throws Exception
937+
public static class MyContextParameterSpec
938+
implements AlgorithmParameterSpec
926939
{
927-
byte[] enc = Hex.decode("30820A2604201BA29BED84A27773E818F0B3FDABB60D37AFAE2CF8CB14844130C2F3A003B1BA81820A004CE51DC37BB794EB06DB74F14F050585CD70139D8ECDB6F0D2277144662158D969E49D22ED3BAB11A549FEA12174B4C6C9652D70229C78D7D9737443CF7E6387D01D7390342777C200309C05303F388A2AE1ED0BA183A1EE6C0808DEE411DF19CA18CAEC042F9E90DA15F6606CA35E57B917297E7ACD2C981265E5A40ABA67D88B36202219712009461A328D90C66100882DA4480C6482604A80456320269AC82C23845060A084A0A0208CA46820115044942C5C20404A044EC4162900C911549488E22602CC8889134906210068C38650138968529091C83688634406A3A404922045D99620DC066903150810B490CBC44C09878894346C20102422336C004981418044A4A08C44860502100040A091043042548221090564D03890194060A0C05004A205A3262DD9866D09A349C9C641CBB6699A10311A884D88244A6232701C9688400820514226DAA468C4046424260209010AC24668C0348E1C9421DC088489029058065183260223B38D82B60C000704A328660096858AA4099BC409934429A4424C40424D63B490101565C0C468C8222E02888083460000282542A02460320CD4262CE2146889C0851B376013468A5C1609603862A3364C60A231CB2491D2186E091149401291882404013485C4A64864304600272A0AA3502131700243291B096810274124030EA0B60094000202B40812980C0C1528CC8804D0069099368493382922B58D54C0410CC58C133081C9204022C86864960102870088306EA3464C08A090003362D8008A5A9881840072E3A805C0188011329044206C93125081205081422D028789CB2650499849610840DA10020A19219AB4880844201AB7400A47880432729404602020202412065A264C1C39911825104AC6094C20668022262427041216100282100C3202E33650E448440C246DCAA2641C126904856D8A46905A868C12422EC1A44820349109152103428C53842D24136DE34880202368C828400C81040B826D124469C9260C24B090824204D2B46483B441E4C40D011429D0248249062D99828D992842A3184622044244464D118371C0100448C0648A101199066243B26CD3304AC810010AB4245AA84118B460D3340CC4840DC84048D9164D53B4206218698484445336401BA2840195208846428B2221C4B84811358A1A17005490711C411103A18D104828C4A20853140609B5910C129183B82C5C1424A4446D09B8051A3766D4820961A6201015862224605C1870203709AF99F0C00D4D82188D2DE0792B0010C0AE9CC07F6C172F8974187DD7A3ED3C904068E1806D73B53910EC410ECC02B1980DF524F78A0F4CD155D6595E9C27FA19D96DE7376B4894083FA8BCC1752ACF88075ADA57A9D6606FE887EE0D8BE481A754DC061FA3F7F9CC21501F4C6BB325D1890A5DA77BCF5C97B0BA9E7D2BD055665C4E2E15F50606FA649689E046C22063EB272AA351BDE346AD2424D7054F4E23CAD899E25FB5A5E9D1653ECFD50772092D2D25A4EB62B42CDAA23DE42C7B50D23F8BB429D8E8479779FCD4173B69C3B343A08874FBEAAF1D727D929CA4F8011CBA9DB33C1DA0E4BCFA8D1397DB74A5ADCFF0A2BAB74139B51E3F6BDA077579073E6050352FE7F85FC028EAA91FD1DA18D35BC9EE6B8148BEA2B22F17BF24DFC387C2E1591B2DAE0DE0DF9B36313360E14F926A31E19B0473C45DDE050C2A1CB394C8BD4E9403B065414EF8C01F42AD4C4FA69BD831376327947EC0F9D2E129EB3034CA5DF04260AD1B15C66123BC220BAF53DE2CA65E7A0E7CDFFF4EEFB3FC386FBD04BC06BDE385C79ABC81CE8A447A64CC916AA7FCC9471CA6710252A2220BD27A6D3413BD4AD36240C69FD95C9BA3249E3D03745289CE7C8AAB2168974BABA116F02F9AD5EB4210193C37E28D7E6925D64EC3C551F0398C75A3A34A4F07E5BB84E412CAD58EB1FC1D059D747E3177BC51E68A833358BB0254266F88F2A4DE4D6FE4285F213ED479ADB6E2AA320343B80051CA6D4929478812405ADD1F8054B56BCBE02E43D66CFEA6FE976E9FDBEC9EEB2A86D0111165DDA1E622E040F05D171822A74F5458B5925FB0AFF0D623A4666452DC2B11F8D14C477F676BCD1BED62FD1427A25CB743EAE47FB6AF0C51B2DDA77B5EB0EF001839384DA8D7390DF8654BA0C8EB94A92D20BE50500450E7A3D3B374AD02943F2D22046611F8C23B68B7679E9D81AC4B3A01261D85CAAD696EF65E39D2D0D7308ACFA954A8D89A6BE9EE3FBC313BE89035E4431212A7B0DCBADFBAEC294F7CECBDD4D59709276D2DDF4428D9D019F2814B60B9A388C47DD7E26A00131DC853148A79F02D395C33205C1CFBB688C1FEE9A8453B2B371B431E7DA86DB98A090AF0A6CBF131811BE86B2BAEF3C2D61E9EE1D628BAC2D9A4CF8ECD32CC8B926D01DBDFA10327375B9461827B52DAA483F918E5F30894BEBF73332E2169472E72B61A16E2F9A5876D429E5B5791F61ECDF2F73F69DD7609AD36C1CC0DF6C8A5744055E863F63F069CE304D1BCA0680DC64AD9B00ABC39662C74C59AA677F59A6B101C393B7EB7B427125AA1785ED2E4ADD2FA074599A954E1D1B8BE2D18A65A86BB1D2274C7B11FB2228A5C632B705B428ADBFCAE399C7748F08557F3AAA459010F803049B08D9832706C2E52BF88836C6BB31BCCB93C16E413294EE9BDFF5023A5DA482783C4134A5FB7AB93AD58B85A6105640671DC3B86066BF690B3F3730AB2A9D25437690E31AC3F1CC17437F9E641E3C4CA28A8D7C1FD6BD27E534CD31F25DC9E6105C86C3DA36379C7D84C51F116B975C3A4D4D3641671581CD654B1794087649AB9479D3DD80C147D169E34E6FD9A7478FC318FCD92435C874ABF0F1939C6795ED10B5659A271DE900D08E580F74D670557888CD790495442D129B4A41577801F456A7286A1B860849A45E0CD1882390C012E644ECCB9393E9863B55B470647456916D3EBE20DC16A90C09F2DDB0525A151661D04FA916F7AC66E78AB76CE15FF9E6EC14520CAFF8CF8BF81DFBBAC96E2D85ACDEF6950FFBEA257D6817151B5D5EF32329C016A00F75AE006261A6CF5DB50CA909554E48790C11FC4A3B7A07C8EC15439E59754AF8F513D1B9526670A18FCD89CA476DF41FA8D59F56988BF38A85E2996F1CAFBCF8D039E1ED9FE5C258B825953B4669FBCB652DB604A90E02B803B72DC414EDAF62B31C640126A90CD946DBAAE786637695A0BCE6007E671844A90BC24DD8EAA36364D739A350F7D442C6C1B06CD5CFEB2F2C997BDB599DFD4933FBC8C3DD70DE8F20D52479149D477E765358F64A403E6B7D42B8B302A404026AEA4EBCD9755EE1727977C0228505587F0104F9D57B52D87B3A894992CE3D9C12E1ED625132584F521C5076504AC979053E1DE85E1A2D0F78D70B4A4F680EEAD0876710289448DB78DBF3BC1CEE48033C58BEF2CB9348871A5BB6132BED61E30AE4A4E23B2A2A49C15438CE23697ABEE47F1FC482BB02F26512796F5D8A3BC407DFB5745734FC96ADDD8204B8B6BA0B48C62089FC8F9951782969B661F0B66BDEA3AFE0E40AA9B5C2E4DA8B42D56907EDA4AE42CFA2E38EFC961C4EAB9C0824B36A503E85A41C5");
940+
private final byte[] context;
941+
942+
MyContextParameterSpec(byte[] context)
943+
{
944+
this.context = context;
945+
}
928946

947+
public byte[] getContext()
948+
{
949+
return context;
950+
}
929951
}
930952
}

prov/src/test/java/org/bouncycastle/pqc/jcajce/provider/test/SLHDSATest.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.security.SecureRandom;
1212
import java.security.Security;
1313
import java.security.Signature;
14+
import java.security.spec.AlgorithmParameterSpec;
1415
import java.security.spec.InvalidKeySpecException;
1516
import java.security.spec.PKCS8EncodedKeySpec;
1617
import java.security.spec.X509EncodedKeySpec;
@@ -458,6 +459,18 @@ public void testSphincsRandomSigSHA2WithContext()
458459
ContextParameterSpec vspec = vp.getParameterSpec(ContextParameterSpec.class);
459460

460461
assertTrue(Arrays.areEqual(Strings.toByteArray("Hello, world!"), vspec.getContext()));
462+
463+
// check reflection based context.
464+
465+
sig = Signature.getInstance("SLH-DSA", "BC");
466+
467+
sig.initVerify(kp.getPublic());
468+
469+
sig.setParameter(new MyContextParameterSpec(Strings.toByteArray("Hello, world!")));
470+
471+
sig.update(msg, 0, msg.length);
472+
473+
assertTrue(sig.verify(s));
461474
}
462475

463476
public void testSLHDSARandomSigSHA2()
@@ -658,5 +671,21 @@ public void nextBytes(byte[] bytes)
658671
}
659672
}
660673
}
674+
675+
public static class MyContextParameterSpec
676+
implements AlgorithmParameterSpec
677+
{
678+
private final byte[] context;
679+
680+
MyContextParameterSpec(byte[] context)
681+
{
682+
this.context = context;
683+
}
684+
685+
public byte[] getContext()
686+
{
687+
return context;
688+
}
689+
}
661690
}
662691

0 commit comments

Comments
 (0)