3
3
using System . IO ;
4
4
5
5
using NUnit . Framework ;
6
+
6
7
using Org . BouncyCastle . Crypto . Digests ;
7
8
using Org . BouncyCastle . Crypto . Engines ;
8
9
using Org . BouncyCastle . Crypto . Parameters ;
@@ -21,15 +22,15 @@ public class AsconTest
21
22
[ Test ]
22
23
public override void PerformTest ( )
23
24
{
24
- testVectorsHash ( AsconDigest . AsconParameters . AsconHashA , "asconhasha" ) ;
25
- testVectorsHash ( AsconDigest . AsconParameters . AsconHash , "asconhash" ) ;
26
- testVectorsHash ( AsconDigest . AsconParameters . AsconXof , "asconxof" ) ;
27
- testVectorsHash ( AsconDigest . AsconParameters . AsconXofA , "asconxofa" ) ;
25
+ ImplTestVectorsHash ( AsconDigest . AsconParameters . AsconHashA , "asconhasha" ) ;
26
+ ImplTestVectorsHash ( AsconDigest . AsconParameters . AsconHash , "asconhash" ) ;
27
+ ImplTestVectorsHash ( AsconDigest . AsconParameters . AsconXof , "asconxof" ) ;
28
+ ImplTestVectorsHash ( AsconDigest . AsconParameters . AsconXofA , "asconxofa" ) ;
28
29
29
- testExceptions ( new AsconDigest ( AsconDigest . AsconParameters . AsconHashA ) , 32 ) ;
30
- testExceptions ( new AsconDigest ( AsconDigest . AsconParameters . AsconHash ) , 32 ) ;
31
- testExceptions ( new AsconDigest ( AsconDigest . AsconParameters . AsconXof ) , 32 ) ;
32
- testExceptions ( new AsconDigest ( AsconDigest . AsconParameters . AsconXofA ) , 32 ) ;
30
+ ImplTestExceptions ( new AsconDigest ( AsconDigest . AsconParameters . AsconHashA ) , 32 ) ;
31
+ ImplTestExceptions ( new AsconDigest ( AsconDigest . AsconParameters . AsconHash ) , 32 ) ;
32
+ ImplTestExceptions ( new AsconDigest ( AsconDigest . AsconParameters . AsconXof ) , 32 ) ;
33
+ ImplTestExceptions ( new AsconDigest ( AsconDigest . AsconParameters . AsconXofA ) , 32 ) ;
33
34
34
35
AsconEngine asconEngine = new AsconEngine ( AsconEngine . AsconParameters . ascon80pq ) ;
35
36
ImplTestExceptions ( asconEngine ) ;
@@ -51,7 +52,7 @@ public override void PerformTest()
51
52
private void ImplTestVectors ( AsconEngine . AsconParameters asconParameters , string filename )
52
53
{
53
54
Random random = new Random ( ) ;
54
- AsconEngine Ascon = new AsconEngine ( asconParameters ) ;
55
+ AsconEngine asconEngine = new AsconEngine ( asconParameters ) ;
55
56
var buf = new Dictionary < string , string > ( ) ;
56
57
//TestSampler sampler = new TestSampler();
57
58
using ( var src = new StreamReader ( SimpleTest . GetTestDataAsStream ( "crypto.ascon.LWC_AEAD_KAT_" + filename + ".txt" ) ) )
@@ -70,32 +71,32 @@ private void ImplTestVectors(AsconEngine.AsconParameters asconParameters, string
70
71
byte [ ] ct = Hex . Decode ( map [ "CT" ] ) ;
71
72
map . Clear ( ) ;
72
73
73
- var param = new ParametersWithIV ( new KeyParameter ( key ) , nonce ) ;
74
+ var parameters = new ParametersWithIV ( new KeyParameter ( key ) , nonce ) ;
74
75
75
76
// Encrypt
76
77
{
77
- Ascon . Init ( true , param ) ;
78
+ asconEngine . Init ( true , parameters ) ;
78
79
79
- var rv = new byte [ Ascon . GetOutputSize ( pt . Length ) ] ;
80
+ var rv = new byte [ asconEngine . GetOutputSize ( pt . Length ) ] ;
80
81
random . NextBytes ( rv ) ; // should overwrite any existing data
81
82
82
- Ascon . ProcessAadBytes ( ad , 0 , ad . Length ) ;
83
- int len = Ascon . ProcessBytes ( pt , 0 , pt . Length , rv , 0 ) ;
84
- len += Ascon . DoFinal ( rv , len ) ;
83
+ asconEngine . ProcessAadBytes ( ad , 0 , ad . Length ) ;
84
+ int len = asconEngine . ProcessBytes ( pt , 0 , pt . Length , rv , 0 ) ;
85
+ len += asconEngine . DoFinal ( rv , len ) ;
85
86
86
87
Assert . True ( Arrays . AreEqual ( rv , 0 , len , ct , 0 , ct . Length ) ) ;
87
88
}
88
89
89
90
// Decrypt
90
91
{
91
- Ascon . Init ( false , param ) ;
92
+ asconEngine . Init ( false , parameters ) ;
92
93
93
- var rv = new byte [ Ascon . GetOutputSize ( ct . Length ) ] ;
94
+ var rv = new byte [ asconEngine . GetOutputSize ( ct . Length ) ] ;
94
95
random . NextBytes ( rv ) ; // should overwrite any existing data
95
96
96
- Ascon . ProcessAadBytes ( ad , 0 , ad . Length ) ;
97
- int len = Ascon . ProcessBytes ( ct , 0 , ct . Length , rv , 0 ) ;
98
- len += Ascon . DoFinal ( rv , len ) ;
97
+ asconEngine . ProcessAadBytes ( ad , 0 , ad . Length ) ;
98
+ int len = asconEngine . ProcessBytes ( ct , 0 , ct . Length , rv , 0 ) ;
99
+ len += asconEngine . DoFinal ( rv , len ) ;
99
100
100
101
Assert . True ( Arrays . AreEqual ( rv , 0 , len , pt , 0 , pt . Length ) ) ;
101
102
}
@@ -118,15 +119,15 @@ private void ImplTestVectors(AsconEngine.AsconParameters asconParameters, string
118
119
private void ImplTestExceptions ( AsconEngine asconEngine )
119
120
{
120
121
int keySize = asconEngine . GetKeyBytesSize ( ) , ivSize = asconEngine . GetIVBytesSize ( ) ;
122
+ int offset ;
121
123
byte [ ] k = new byte [ keySize ] ;
122
124
byte [ ] iv = new byte [ ivSize ] ;
123
- byte [ ] m = new byte [ 0 ] ;
124
- byte [ ] c1 = new byte [ asconEngine . GetOutputSize ( m . Length ) ] ;
125
+ byte [ ] m = Array . Empty < byte > ( ) ;
125
126
var param = new ParametersWithIV ( new KeyParameter ( k ) , iv ) ;
126
127
try
127
128
{
128
- asconEngine . ProcessBytes ( m , 0 , m . Length , c1 , 0 ) ;
129
- Assert . Fail ( asconEngine . AlgorithmName + " need to be initialed before ProcessBytes" ) ;
129
+ asconEngine . ProcessBytes ( m , 0 , m . Length , null , 0 ) ;
130
+ Assert . Fail ( asconEngine . AlgorithmName + " need to be initialized before ProcessBytes" ) ;
130
131
}
131
132
catch ( ArgumentException )
132
133
{
@@ -135,8 +136,8 @@ private void ImplTestExceptions(AsconEngine asconEngine)
135
136
136
137
try
137
138
{
138
- asconEngine . ProcessByte ( ( byte ) 0 , c1 , 0 ) ;
139
- Assert . Fail ( asconEngine . AlgorithmName + " need to be initialed before ProcessByte" ) ;
139
+ asconEngine . ProcessByte ( ( byte ) 0 , null , 0 ) ;
140
+ Assert . Fail ( asconEngine . AlgorithmName + " need to be initialized before ProcessByte" ) ;
140
141
}
141
142
catch ( ArgumentException )
142
143
{
@@ -146,7 +147,7 @@ private void ImplTestExceptions(AsconEngine asconEngine)
146
147
try
147
148
{
148
149
asconEngine . Reset ( ) ;
149
- Assert . Fail ( asconEngine . AlgorithmName + " need to be initialed before reset" ) ;
150
+ Assert . Fail ( asconEngine . AlgorithmName + " need to be initialized before reset" ) ;
150
151
}
151
152
catch ( ArgumentException )
152
153
{
@@ -155,8 +156,8 @@ private void ImplTestExceptions(AsconEngine asconEngine)
155
156
156
157
try
157
158
{
158
- asconEngine . DoFinal ( c1 , m . Length ) ;
159
- Assert . Fail ( asconEngine . AlgorithmName + " need to be initialed before dofinal " ) ;
159
+ asconEngine . DoFinal ( null , m . Length ) ;
160
+ Assert . Fail ( asconEngine . AlgorithmName + " need to be initialized before Dofinal " ) ;
160
161
}
161
162
catch ( ArgumentException )
162
163
{
@@ -201,6 +202,7 @@ private void ImplTestExceptions(AsconEngine asconEngine)
201
202
}
202
203
203
204
asconEngine . Init ( true , param ) ;
205
+ byte [ ] c1 = new byte [ asconEngine . GetOutputSize ( m . Length ) ] ;
204
206
try
205
207
{
206
208
asconEngine . DoFinal ( c1 , m . Length ) ;
@@ -267,7 +269,9 @@ private void ImplTestExceptions(AsconEngine asconEngine)
267
269
}
268
270
try
269
271
{
270
- asconEngine . ProcessBytes ( new byte [ 16 ] , 0 , 16 , new byte [ 16 ] , 8 ) ;
272
+ int inputSize = rand . Next ( 32 , 64 ) ;
273
+ int outputSize = asconEngine . GetUpdateOutputSize ( inputSize ) ;
274
+ asconEngine . ProcessBytes ( new byte [ inputSize ] , 0 , inputSize , new byte [ outputSize ] , 1 ) ;
271
275
Assert . Fail ( "output for ProcessBytes is too short" ) ;
272
276
}
273
277
catch ( OutputLengthException )
@@ -307,7 +311,7 @@ private void ImplTestExceptions(AsconEngine asconEngine)
307
311
byte [ ] m4 = new byte [ m2 . Length ] ;
308
312
asconEngine . Reset ( ) ;
309
313
asconEngine . ProcessAadBytes ( aad2 , 0 , aad2 . Length ) ;
310
- int offset = asconEngine . ProcessBytes ( m2 , 0 , m2 . Length , c2 , 0 ) ;
314
+ offset = asconEngine . ProcessBytes ( m2 , 0 , m2 . Length , c2 , 0 ) ;
311
315
asconEngine . DoFinal ( c2 , offset ) ;
312
316
asconEngine . Reset ( ) ;
313
317
asconEngine . ProcessAadBytes ( aad3 , 1 , aad2 . Length ) ;
@@ -344,26 +348,27 @@ private void ImplTestExceptions(AsconEngine asconEngine)
344
348
}
345
349
c2 [ c2 . Length - 1 ] ^= 1 ;
346
350
347
- byte [ ] m7 = new byte [ 32 + rand . Next ( 16 ) ] ;
351
+ byte [ ] m7 = new byte [ 32 + rand . Next ( 32 ) ] ;
348
352
rand . NextBytes ( m7 ) ;
349
353
354
+ asconEngine . Init ( true , param ) ;
350
355
byte [ ] c7 = new byte [ asconEngine . GetOutputSize ( m7 . Length ) ] ;
351
356
byte [ ] c8 = new byte [ c7 . Length ] ;
352
357
byte [ ] c9 = new byte [ c7 . Length ] ;
353
- asconEngine . Init ( true , param ) ;
354
358
asconEngine . ProcessAadBytes ( aad2 , 0 , aad2 . Length ) ;
355
359
offset = asconEngine . ProcessBytes ( m7 , 0 , m7 . Length , c7 , 0 ) ;
356
360
asconEngine . DoFinal ( c7 , offset ) ;
357
361
asconEngine . Reset ( ) ;
358
362
asconEngine . ProcessAadBytes ( aad2 , 0 , aad2 . Length ) ;
359
- offset = asconEngine . ProcessBytes ( m7 , 0 , m7 . Length , c8 , 0 ) ;
363
+ offset = asconEngine . ProcessBytes ( m7 , 0 , m7 . Length / 2 , c8 , 0 ) ;
364
+ offset += asconEngine . ProcessBytes ( m7 , m7 . Length / 2 , m7 . Length - m7 . Length / 2 , c8 , offset ) ;
360
365
offset += asconEngine . DoFinal ( c8 , offset ) ;
361
366
asconEngine . Reset ( ) ;
362
367
int split = rand . Next ( 1 , m7 . Length ) ;
363
368
asconEngine . ProcessAadBytes ( aad2 , 0 , aad2 . Length ) ;
364
369
offset = asconEngine . ProcessBytes ( m7 , 0 , split , c9 , 0 ) ;
365
370
offset += asconEngine . ProcessBytes ( m7 , split , m7 . Length - split , c9 , offset ) ;
366
- asconEngine . DoFinal ( c9 , offset ) ;
371
+ offset += asconEngine . DoFinal ( c9 , offset ) ;
367
372
if ( ! Arrays . AreEqual ( c7 , c8 ) || ! Arrays . AreEqual ( c7 , c9 ) )
368
373
{
369
374
Assert . Fail ( "Splitting input of plaintext should output the same ciphertext" ) ;
@@ -410,11 +415,19 @@ private void ImplTestParameters(AsconEngine asconEngine, int keySize, int ivSize
410
415
"key bytes of " + asconEngine . AlgorithmName + " is not correct" ) ;
411
416
Assert . AreEqual ( ivSize , asconEngine . GetIVBytesSize ( ) ,
412
417
"iv bytes of " + asconEngine . AlgorithmName + " is not correct" ) ;
418
+
419
+ var parameters = new ParametersWithIV ( new KeyParameter ( new byte [ keySize ] ) , new byte [ ivSize ] ) ;
420
+
421
+ asconEngine . Init ( true , parameters ) ;
413
422
Assert . AreEqual ( macSize , asconEngine . GetOutputSize ( 0 ) ,
414
- "mac bytes of " + asconEngine . AlgorithmName + " is not correct" ) ;
423
+ "GetOutputSize of " + asconEngine . AlgorithmName + " is incorrect for encryption" ) ;
424
+
425
+ asconEngine . Init ( false , parameters ) ;
426
+ Assert . AreEqual ( 0 , asconEngine . GetOutputSize ( macSize ) ,
427
+ "GetOutputSize of " + asconEngine . AlgorithmName + " is incorrect for decryption" ) ;
415
428
}
416
429
417
- private void testVectorsHash ( AsconDigest . AsconParameters AsconParameters , String filename )
430
+ private void ImplTestVectorsHash ( AsconDigest . AsconParameters AsconParameters , String filename )
418
431
{
419
432
AsconDigest Ascon = new AsconDigest ( AsconParameters ) ;
420
433
var buf = new Dictionary < string , string > ( ) ;
@@ -455,7 +468,7 @@ private void testVectorsHash(AsconDigest.AsconParameters AsconParameters, String
455
468
}
456
469
}
457
470
458
- private void testExceptions ( IDigest digest , int digestsize )
471
+ private void ImplTestExceptions ( IDigest digest , int digestsize )
459
472
{
460
473
if ( digest . GetDigestSize ( ) != digestsize )
461
474
{
0 commit comments