7
7
import org .bouncycastle .crypto .DataLengthException ;
8
8
import org .bouncycastle .crypto .Signer ;
9
9
import org .bouncycastle .crypto .digests .SHAKEDigest ;
10
+ import org .bouncycastle .crypto .params .ParametersWithContext ;
10
11
import org .bouncycastle .crypto .params .ParametersWithRandom ;
11
12
12
13
public class MLDSASigner
13
14
implements Signer
14
15
{
16
+ private static final byte [] EMPTY_CONTEXT = new byte [0 ];
17
+
15
18
private MLDSAPrivateKeyParameters privKey ;
16
19
private MLDSAPublicKeyParameters pubKey ;
17
20
@@ -27,6 +30,23 @@ public MLDSASigner()
27
30
public void init (boolean forSigning , CipherParameters param )
28
31
{
29
32
boolean isPreHash ;
33
+ byte [] ctx ;
34
+
35
+ if (param instanceof ParametersWithContext )
36
+ {
37
+ ctx = ((ParametersWithContext )param ).getContext ();
38
+ param = ((ParametersWithContext )param ).getParameters ();
39
+
40
+ if (ctx .length > 255 )
41
+ {
42
+ throw new IllegalArgumentException ("context too long" );
43
+ }
44
+ }
45
+ else
46
+ {
47
+ ctx = EMPTY_CONTEXT ;
48
+ }
49
+
30
50
31
51
if (forSigning )
32
52
{
@@ -43,12 +63,6 @@ public void init(boolean forSigning, CipherParameters param)
43
63
44
64
engine = privKey .getParameters ().getEngine (this .random );
45
65
46
- byte [] ctx = privKey .getContext ();
47
- if (ctx .length > 255 )
48
- {
49
- throw new IllegalArgumentException ("context too long" );
50
- }
51
-
52
66
engine .initSign (privKey .tr , false , ctx );
53
67
54
68
msgDigest = engine .getShake256Digest ();
@@ -61,12 +75,6 @@ public void init(boolean forSigning, CipherParameters param)
61
75
62
76
engine = pubKey .getParameters ().getEngine (random );
63
77
64
- byte [] ctx = pubKey .getContext ();
65
- if (ctx .length > 255 )
66
- {
67
- throw new IllegalArgumentException ("context too long" );
68
- }
69
-
70
78
engine .initVerify (pubKey .rho , pubKey .t1 , false , ctx );
71
79
72
80
msgDigest = engine .getShake256Digest ();
@@ -111,21 +119,21 @@ public boolean verifySignature(byte[] signature)
111
119
boolean isTrue = engine .verifyInternal (signature , signature .length , msgDigest , pubKey .rho , pubKey .t1 );
112
120
113
121
reset ();
114
-
122
+
115
123
return isTrue ;
116
124
}
117
125
118
126
public void reset ()
119
127
{
120
128
msgDigest = engine .getShake256Digest ();
121
129
}
122
-
130
+
123
131
protected byte [] internalGenerateSignature (byte [] message , byte [] random )
124
132
{
125
133
MLDSAEngine engine = privKey .getParameters ().getEngine (this .random );
126
134
127
135
engine .initSign (privKey .tr , false , null );
128
-
136
+
129
137
return engine .signInternal (message , message .length , privKey .rho , privKey .k , privKey .t0 , privKey .s1 , privKey .s2 , random );
130
138
}
131
139
0 commit comments