1
- using System . Collections . Generic ;
1
+ using System ;
2
+ using System . Collections . Generic ;
2
3
using System . IO ;
3
4
4
5
using NUnit . Framework ;
@@ -79,20 +80,32 @@ public class SlhDsaTest
79
80
private static readonly IEnumerable < string > ContextSlowFiles = ContextSlowFileParameters . Keys ;
80
81
81
82
private static readonly Dictionary < string , SlhDsaParameters > Parameters =
82
- new Dictionary < string , SlhDsaParameters > ( )
83
+ new Dictionary < string , SlhDsaParameters > ( StringComparer . OrdinalIgnoreCase )
83
84
{
84
- { "SLH-DSA-SHA2-128f" , SlhDsaParameters . slh_dsa_sha2_128f } ,
85
- { "SLH-DSA-SHA2-128s" , SlhDsaParameters . slh_dsa_sha2_128s } ,
86
- { "SLH-DSA-SHA2-192f" , SlhDsaParameters . slh_dsa_sha2_192f } ,
87
- { "SLH-DSA-SHA2-192s" , SlhDsaParameters . slh_dsa_sha2_192s } ,
88
- { "SLH-DSA-SHA2-256f" , SlhDsaParameters . slh_dsa_sha2_256f } ,
89
- { "SLH-DSA-SHA2-256s" , SlhDsaParameters . slh_dsa_sha2_256s } ,
90
- { "SLH-DSA-SHAKE-128f" , SlhDsaParameters . slh_dsa_shake_128f } ,
91
- { "SLH-DSA-SHAKE-128s" , SlhDsaParameters . slh_dsa_shake_128s } ,
92
- { "SLH-DSA-SHAKE-192f" , SlhDsaParameters . slh_dsa_shake_192f } ,
93
- { "SLH-DSA-SHAKE-192s" , SlhDsaParameters . slh_dsa_shake_192s } ,
94
- { "SLH-DSA-SHAKE-256s" , SlhDsaParameters . slh_dsa_shake_256s } ,
95
- { "SLH-DSA-SHAKE-256f" , SlhDsaParameters . slh_dsa_shake_256f } ,
85
+ { "SLH-DSA-SHA2-128F" , SlhDsaParameters . slh_dsa_sha2_128f } ,
86
+ { "SLH-DSA-SHA2-128F-WITH-SHA256" , SlhDsaParameters . slh_dsa_sha2_128f_with_sha256 } ,
87
+ { "SLH-DSA-SHA2-128S" , SlhDsaParameters . slh_dsa_sha2_128s } ,
88
+ { "SLH-DSA-SHA2-128S-WITH-SHA256" , SlhDsaParameters . slh_dsa_sha2_128s_with_sha256 } ,
89
+ { "SLH-DSA-SHA2-192F" , SlhDsaParameters . slh_dsa_sha2_192f } ,
90
+ { "SLH-DSA-SHA2-192F-WITH-SHA512" , SlhDsaParameters . slh_dsa_sha2_192f_with_sha512 } ,
91
+ { "SLH-DSA-SHA2-192S" , SlhDsaParameters . slh_dsa_sha2_192s } ,
92
+ { "SLH-DSA-SHA2-192S-WITH-SHA512" , SlhDsaParameters . slh_dsa_sha2_192s_with_sha512 } ,
93
+ { "SLH-DSA-SHA2-256F" , SlhDsaParameters . slh_dsa_sha2_256f } ,
94
+ { "SLH-DSA-SHA2-256F-WITH-SHA512" , SlhDsaParameters . slh_dsa_sha2_256f_with_sha512 } ,
95
+ { "SLH-DSA-SHA2-256S" , SlhDsaParameters . slh_dsa_sha2_256s } ,
96
+ { "SLH-DSA-SHA2-256S-WITH-SHA512" , SlhDsaParameters . slh_dsa_sha2_256s_with_sha512 } ,
97
+ { "SLH-DSA-SHAKE-128F" , SlhDsaParameters . slh_dsa_shake_128f } ,
98
+ { "SLH-DSA-SHAKE-128F-WITH-SHAKE128" , SlhDsaParameters . slh_dsa_shake_128f_with_shake128 } ,
99
+ { "SLH-DSA-SHAKE-128S" , SlhDsaParameters . slh_dsa_shake_128s } ,
100
+ { "SLH-DSA-SHAKE-128S-WITH-SHAKE128" , SlhDsaParameters . slh_dsa_shake_128s_with_shake128 } ,
101
+ { "SLH-DSA-SHAKE-192F" , SlhDsaParameters . slh_dsa_shake_192f } ,
102
+ { "SLH-DSA-SHAKE-192F-WITH-SHAKE256" , SlhDsaParameters . slh_dsa_shake_192f_with_shake256 } ,
103
+ { "SLH-DSA-SHAKE-192S" , SlhDsaParameters . slh_dsa_shake_192s } ,
104
+ { "SLH-DSA-SHAKE-192S-WITH-SHAKE256" , SlhDsaParameters . slh_dsa_shake_192s_with_shake256 } ,
105
+ { "SLH-DSA-SHAKE-256F" , SlhDsaParameters . slh_dsa_shake_256f } ,
106
+ { "SLH-DSA-SHAKE-256F-WITH-SHAKE256" , SlhDsaParameters . slh_dsa_shake_256f_with_shake256 } ,
107
+ { "SLH-DSA-SHAKE-256S" , SlhDsaParameters . slh_dsa_shake_256s } ,
108
+ { "SLH-DSA-SHAKE-256S-WITH-SHAKE256" , SlhDsaParameters . slh_dsa_shake_256s_with_shake256 } ,
96
109
} ;
97
110
98
111
private static readonly IEnumerable < SlhDsaParameters > ParametersValues = Parameters . Values ;
@@ -136,7 +149,7 @@ public void Consistency(SlhDsaParameters parameters)
136
149
{
137
150
var kp = kpg . GenerateKeyPair ( ) ;
138
151
139
- var signer = new SlhDsaSigner ( parameters , deterministic : false ) ;
152
+ var signer = CreateSigner ( parameters , deterministic : false ) ;
140
153
141
154
{
142
155
int msgLen = random . Next ( msg . Length + 1 ) ;
@@ -158,15 +171,15 @@ public void Consistency(SlhDsaParameters parameters)
158
171
}
159
172
160
173
[ TestCaseSource ( nameof ( ContextFastFiles ) ) ]
161
- [ Parallelizable ]
174
+ [ Parallelizable ( ParallelScope . All ) ]
162
175
public void ContextFast ( string fileName )
163
176
{
164
177
RunTestVectors ( "pqc/crypto/slhdsa" , fileName , sampleOnly : true ,
165
178
( name , data ) => ImplContext ( name , data , ContextFastFileParameters [ name ] ) ) ;
166
179
}
167
180
168
181
[ TestCaseSource ( nameof ( ContextSlowFiles ) ) , Explicit ]
169
- [ Parallelizable ]
182
+ [ Parallelizable ( ParallelScope . All ) ]
170
183
public void ContextSlow ( string fileName )
171
184
{
172
185
RunTestVectors ( "pqc/crypto/slhdsa" , fileName , sampleOnly : true ,
@@ -221,6 +234,14 @@ public void KeyGenAcvp(string fileName)
221
234
// (name, data) => ImplSigVer(name, data, AcvpFileParameters[name]));
222
235
//}
223
236
237
+ private static ISigner CreateSigner ( SlhDsaParameters parameters , bool deterministic )
238
+ {
239
+ if ( parameters . IsPreHash )
240
+ return new HashSlhDsaSigner ( parameters , deterministic ) ;
241
+
242
+ return new SlhDsaSigner ( parameters , deterministic ) ;
243
+ }
244
+
224
245
private static void ImplContext ( string name , Dictionary < string , string > data , SlhDsaParameters parameters )
225
246
{
226
247
string count = data [ "count" ] ;
@@ -259,15 +280,7 @@ private static void ImplContext(string name, Dictionary<string, string> data, Sl
259
280
Assert . True ( Arrays . AreEqual ( sk , privateKeyRT . GetEncoded ( ) ) , $ "{ name } { count } : secret key (round-trip)") ;
260
281
261
282
// Note that this is not a deterministic signature test, since we are given "optrand"
262
- ISigner sig ;
263
- if ( parameters . IsPreHash )
264
- {
265
- sig = new HashSlhDsaSigner ( parameters , deterministic : false ) ;
266
- }
267
- else
268
- {
269
- sig = new SlhDsaSigner ( parameters , deterministic : false ) ;
270
- }
283
+ var signer = CreateSigner ( parameters , deterministic : false ) ;
271
284
272
285
// The current test data is a bit weird and uses internal signing when no explicit context provided.
273
286
if ( context == null )
@@ -280,17 +293,17 @@ private static void ImplContext(string name, Dictionary<string, string> data, Sl
280
293
}
281
294
else
282
295
{
283
- sig . Init ( forSigning : true ,
296
+ signer . Init ( forSigning : true ,
284
297
ParameterUtilities . WithContext (
285
298
ParameterUtilities . WithRandom ( privateKey , FixedSecureRandom . From ( optrand ) ) ,
286
299
context ) ) ;
287
- sig . BlockUpdate ( msg , 0 , msg . Length ) ;
288
- byte [ ] generated = sig . GenerateSignature ( ) ;
300
+ signer . BlockUpdate ( msg , 0 , msg . Length ) ;
301
+ byte [ ] generated = signer . GenerateSignature ( ) ;
289
302
Assert . True ( Arrays . AreEqual ( sm , generated ) , $ "{ name } { count } : GenerateSignature") ;
290
303
291
- sig . Init ( forSigning : false , ParameterUtilities . WithContext ( publicKey , context ) ) ;
292
- sig . BlockUpdate ( msg , 0 , msg . Length ) ;
293
- bool shouldVerify = sig . VerifySignature ( sm ) ;
304
+ signer . Init ( forSigning : false , ParameterUtilities . WithContext ( publicKey , context ) ) ;
305
+ signer . BlockUpdate ( msg , 0 , msg . Length ) ;
306
+ bool shouldVerify = signer . VerifySignature ( sm ) ;
294
307
Assert . True ( shouldVerify , $ "{ name } { count } : VerifySignature") ;
295
308
}
296
309
}
0 commit comments