44import java .security .SecureRandom ;
55
66import org .bouncycastle .asn1 .ASN1Encoding ;
7- import org .bouncycastle .asn1 .ASN1ObjectIdentifier ;
87import org .bouncycastle .crypto .CipherParameters ;
98import org .bouncycastle .crypto .CryptoException ;
109import org .bouncycastle .crypto .DataLengthException ;
1110import org .bouncycastle .crypto .Digest ;
1211import org .bouncycastle .crypto .Signer ;
13- import org .bouncycastle .crypto .digests .SHA512Digest ;
14- import org .bouncycastle .crypto .digests .SHAKEDigest ;
1512import org .bouncycastle .crypto .params .ParametersWithContext ;
1613import org .bouncycastle .crypto .params .ParametersWithRandom ;
1714import org .bouncycastle .pqc .crypto .DigestUtils ;
@@ -27,7 +24,6 @@ public class HashMLDSASigner
2724
2825 private MLDSAEngine engine ;
2926 private Digest digest ;
30- private byte [] digestOIDEncoding ;
3127
3228 public HashMLDSASigner ()
3329 {
@@ -67,37 +63,28 @@ public void init(boolean forSigning, CipherParameters param)
6763
6864 parameters = privKey .getParameters ();
6965 engine = parameters .getEngine (random );
70-
7166 engine .initSign (privKey .tr , true , ctx );
7267 }
7368 else
7469 {
7570 pubKey = (MLDSAPublicKeyParameters )param ;
7671 privKey = null ;
7772 random = null ;
78-
7973 parameters = pubKey .getParameters ();
8074 engine = parameters .getEngine (null );
81-
8275 engine .initVerify (pubKey .rho , pubKey .t1 , true , ctx );
8376 }
84-
85- initDigest (parameters );
86- }
87-
88- private void initDigest (MLDSAParameters parameters )
89- {
90- digest = createDigest (parameters );
91-
92- ASN1ObjectIdentifier oid = DigestUtils .getDigestOid (digest .getAlgorithmName ());
77+ digest = engine .shake256Digest ;
78+ byte [] digestOIDEncoding ;
9379 try
9480 {
95- digestOIDEncoding = oid .getEncoded (ASN1Encoding .DER );
81+ digestOIDEncoding = DigestUtils . getDigestOid ( digest . getAlgorithmName ()) .getEncoded (ASN1Encoding .DER );
9682 }
9783 catch (IOException e )
9884 {
9985 throw new IllegalStateException ("oid encoding failed: " + e .getMessage ());
10086 }
87+ digest .update (digestOIDEncoding , 0 , digestOIDEncoding .length );
10188 }
10289
10390 public void update (byte b )
@@ -110,25 +97,22 @@ public void update(byte[] in, int off, int len)
11097 digest .update (in , off , len );
11198 }
11299
113- public byte [] generateSignature () throws CryptoException , DataLengthException
100+ public byte [] generateSignature ()
101+ throws CryptoException , DataLengthException
114102 {
115- SHAKEDigest msgDigest = finishPreHash ();
116-
117103 byte [] rnd = new byte [MLDSAEngine .RndBytes ];
118104 if (random != null )
119105 {
120106 random .nextBytes (rnd );
121107 }
122- byte [] mu = engine .generateMu (msgDigest );
123-
124- return engine .generateSignature (mu , msgDigest , privKey .rho , privKey .k , privKey .t0 , privKey .s1 , privKey .s2 , rnd );
108+ byte [] mu = engine .generateMu (engine .shake256Digest );
109+ return engine .generateSignature (mu , engine .getShake256Digest (), privKey .rho , privKey .k , privKey .t0 , privKey .s1 , privKey .s2 , rnd );
125110 }
126111
127112 public boolean verifySignature (byte [] signature )
128113 {
129- SHAKEDigest msgDigest = finishPreHash ();
130-
131- return engine .verifyInternal (signature , signature .length , msgDigest , pubKey .rho , pubKey .t1 );
114+ byte [] mu = engine .generateMu (engine .shake256Digest );
115+ return engine .verifyInternalMuSignature (mu , signature , signature .length , engine .getShake256Digest (), pubKey .rho , pubKey .t1 );
132116 }
133117
134118 /**
@@ -139,20 +123,8 @@ public void reset()
139123 digest .reset ();
140124 }
141125
142- private SHAKEDigest finishPreHash ()
143- {
144- byte [] hash = new byte [digest .getDigestSize ()];
145- digest .doFinal (hash , 0 );
146-
147- SHAKEDigest msgDigest = engine .getShake256Digest ();
148- // TODO It should be possible to include digestOIDEncoding in the memo'ed digest
149- msgDigest .update (digestOIDEncoding , 0 , digestOIDEncoding .length );
150- msgDigest .update (hash , 0 , hash .length );
151- return msgDigest ;
152- }
153-
154126// TODO: these are probably no longer correct and also need to be marked as protected
155- // protected byte[] internalGenerateSignature(byte[] message, byte[] random)
127+ // protected byte[] internalGenerateSignature(byte[] message, SecureRandom random)
156128// {
157129// MLDSAEngine engine = privKey.getParameters().getEngine(random);
158130//
@@ -166,15 +138,19 @@ private SHAKEDigest finishPreHash()
166138// return engine.verifyInternal(signature, signature.length, message, message.length, pubKey.rho, pubKey.t1);
167139// }
168140
169- private static Digest createDigest (MLDSAParameters parameters )
170- {
171- switch (parameters .getType ())
172- {
173- case MLDSAParameters .TYPE_PURE :
174- case MLDSAParameters .TYPE_SHA2_512 :
175- return new SHA512Digest ();
176- default :
177- throw new IllegalArgumentException ("unknown parameters type" );
178- }
179- }
141+ // private static Digest createDigest(MLDSAParameters parameters)
142+ // {
143+ //TODO: MLDSA44 may use SHA2-256, SHA3-256, SHAKE128
144+ // MLDSA65 may use SHA3-384, SHA2-512
145+ // MLDSA44/65/87 may use SHA2-512, SHA3-512, SHAKE256
146+
147+ // switch (parameters.getType())
148+ // {
149+ // case MLDSAParameters.TYPE_PURE:
150+ // case MLDSAParameters.TYPE_SHA2_512:
151+ // return new SHAKEDigest(256);
152+ // default:
153+ // throw new IllegalArgumentException("unknown parameters type");
154+ // }
155+ // }
180156}
0 commit comments