1 {-Test prog for SHA3/SHAKE, WE Aug.2015}
2 
3 program t_sha3_1;
4 
5 {Test SHA3-225/256/384/512 and SHAKE128/256. Uses NIST test vectors}
6 {from http://csrc.nist.gov/groups/ST/toolkit/examples.html and from}
7 {KeccakCodePackage ... KeccakSpongeIntermediateValues_SHA3-xxx.txt }
8 
9 {$i std.inc}
10 
11 {$ifdef APPCONS}
12   {$apptype console}
13 {$endif}
14 
15 
16 uses
17   {$ifdef WINCRT} WinCRT, {$endif}
18   BTypes, Mem_Util, Hash, SHA3;
19 
20 
21 
22 var
23   err:   integer;
24   state: TSHA3State;
25   buf:   array[0..511] of byte;
26 
27 const    {NIST message with 1600, 1605, 1630 bits, $23 is LSB for length 1630}
28   M160x: array[0..203] of byte = ($a3,$a3,$a3,$a3,$a3,$a3,$a3,$a3,
29                                   $a3,$a3,$a3,$a3,$a3,$a3,$a3,$a3,
30                                   $a3,$a3,$a3,$a3,$a3,$a3,$a3,$a3,
31                                   $a3,$a3,$a3,$a3,$a3,$a3,$a3,$a3,
32                                   $a3,$a3,$a3,$a3,$a3,$a3,$a3,$a3,
33                                   $a3,$a3,$a3,$a3,$a3,$a3,$a3,$a3,
34                                   $a3,$a3,$a3,$a3,$a3,$a3,$a3,$a3,
35                                   $a3,$a3,$a3,$a3,$a3,$a3,$a3,$a3,
36                                   $a3,$a3,$a3,$a3,$a3,$a3,$a3,$a3,
37                                   $a3,$a3,$a3,$a3,$a3,$a3,$a3,$a3,
38                                   $a3,$a3,$a3,$a3,$a3,$a3,$a3,$a3,
39                                   $a3,$a3,$a3,$a3,$a3,$a3,$a3,$a3,
40                                   $a3,$a3,$a3,$a3,$a3,$a3,$a3,$a3,
41                                   $a3,$a3,$a3,$a3,$a3,$a3,$a3,$a3,
42                                   $a3,$a3,$a3,$a3,$a3,$a3,$a3,$a3,
43                                   $a3,$a3,$a3,$a3,$a3,$a3,$a3,$a3,
44                                   $a3,$a3,$a3,$a3,$a3,$a3,$a3,$a3,
45                                   $a3,$a3,$a3,$a3,$a3,$a3,$a3,$a3,
46                                   $a3,$a3,$a3,$a3,$a3,$a3,$a3,$a3,
47                                   $a3,$a3,$a3,$a3,$a3,$a3,$a3,$a3,
48                                   $a3,$a3,$a3,$a3,$a3,$a3,$a3,$a3,
49                                   $a3,$a3,$a3,$a3,$a3,$a3,$a3,$a3,
50                                   $a3,$a3,$a3,$a3,$a3,$a3,$a3,$a3,
51                                   $a3,$a3,$a3,$a3,$a3,$a3,$a3,$a3,
52                                   $a3,$a3,$a3,$a3,$a3,$a3,$a3,$a3,
53                                   $a3,$a3,$a3,$23);
54 
55 
56 
57 (* NIST's obscure bit message encoding
58    -----------------------------------
59 
60 Length 5
61 Msg bits:   '11001'
62             Reverse
63 11001    -> 00010011 -> $13
64 Msg bytes:  ($13)
65 
66 NOTE: For SHA3_FinalBit which uses MSB format this message with 5 bits is
67 11001    -> 11001000 -> $C8
68 
69 
70 Length 30
71 Msg bits:   '110010100001101011011110100110'
72 Split   :   '11001010 00011010 11011110 100110'
73             Reverse
74 11001010 -> 01010011 -> $53
75 00011010 -> 01011000 -> $58
76 11011110 -> 01111011 -> $7B
77 100110   -> 00011001 -> $19
78 Msg bytes:  ($53,$58,$7B,$19);
79 *)
80 
81 
82 {---------------------------------------------------------------------------}
83 procedure test_sha3_224;
84 const
85   {l1 = 0;}
86   dig1: TSHA3_224Digest     = ($6B,$4E,$03,$42,$36,$67,$DB,$B7,$3B,$6E,
87                                $15,$45,$4F,$0E,$B1,$AB,$D4,$59,$7F,$9A,
88                                $1B,$07,$8E,$3F,$5B,$5A,$6B,$C7);
89   {l2 = 5;}
90   msg2: array[0..0] of byte = ($13);
91   dig2: TSHA3_224Digest     = ($FF,$BA,$D5,$DA,$96,$BA,$D7,$17,$89,$33,
92                                $02,$06,$DC,$67,$68,$EC,$AE,$B1,$B3,$2D,
93                                $CA,$6B,$33,$01,$48,$96,$74,$AB);
94   {l3 = 30;}
95   msg3: array[0..3] of byte = ($53,$58,$7B,$19);
96   dig3: TSHA3_224Digest     = ($D6,$66,$A5,$14,$CC,$9D,$BA,$25,$AC,$1B,
97                                $A6,$9E,$D3,$93,$04,$60,$DE,$AA,$C9,$85,
98                                $1B,$5F,$0B,$AA,$B0,$07,$DF,$3B);
99   {l4 = 1600}
100   dx00: TSHA3_224Digest     = ($93,$76,$81,$6a,$ba,$50,$3f,$72,
101                                $f9,$6c,$e7,$eb,$65,$ac,$09,$5d,
102                                $ee,$e3,$be,$4b,$f9,$bb,$c2,$a1,
103                                $cb,$7e,$11,$e0);
104   {l5 = 1605}
105   dx05 : TSHA3_224Digest    = ($22,$d2,$f7,$bb,$0b,$17,$3f,$d8,
106                                $c1,$96,$86,$f9,$17,$31,$66,$e3,
107                                $ee,$62,$73,$80,$47,$d7,$ea,$dd,
108                                $69,$ef,$b2,$28);
109   {l6 = 1630}
110   dx30 : TSHA3_224Digest    = ($4e,$90,$7b,$b1,$05,$78,$61,$f2,
111                                $00,$a5,$99,$e9,$d4,$f8,$5b,$02,
112                                $d8,$84,$53,$bf,$5b,$8a,$ce,$9a,
113                                $c5,$89,$13,$4c);
114 begin
115   writeln('** Test SHA3-224 **');
116   write('Test 1,       bit length  0: ');
117   err := SHA3_Init(state,__SHA3_224);
118   if err=0 then err := SHA3_FinalHash(state,@buf);
119   if err=0 then writeln(compmem(@dig1, @buf, sizeof(dig1)))
120   else writeln('Err: ', err);
121 
122   write('Test 2a (LSB), bit length 5: ');
123   err := SHA3_Init(state,__SHA3_224);
124   if err=0 then err := SHA3_FinalBit_LSB(state, msg2[0], 5,  @buf, 224);
125   if err=0 then writeln(compmem(@dig2, @buf, sizeof(dig2)))
126   else writeln('Err: ', err);
127 
128   write('Test 2b (MSB), bit length 5: ');
129   err := SHA3_Init(state,__SHA3_224);
130   if err=0 then err := SHA3_FinalBit(state, $C8, 5,  @buf, 224);
131   if err=0 then writeln(compmem(@dig2, @buf, sizeof(dig2)))
132   else writeln('Err: ', err);
133 
134   write('Test 3,       bit length 30: ');
135   err := SHA3_Init(state,__SHA3_224);
136   if err=0 then err := SHA3_Update(state, @msg3, 3);
137   if err=0 then err := SHA3_FinalBit_LSB(state, msg3[3], 6,  @buf, 224);
138   if err=0 then writeln(compmem(@dig3, @buf, sizeof(dig3)))
139   else writeln('Err: ', err);
140 
141   write('Test 4,     bit length 1600: ');
142   err := SHA3_Init(state,__SHA3_224);
143   if err=0 then err := SHA3_Update(state, @M160x, 200);
144   if err=0 then err := SHA3_FinalHash(state, @buf);
145   if err=0 then writeln(compmem(@dx00, @buf, sizeof(dx00)))
146   else writeln('Err: ', err);
147 
148   write('Test 5,     bit length 1605: ');
149   err := SHA3_Init(state,__SHA3_224);
150   if err=0 then err := SHA3_Update(state, @M160x, 200);
151   if err=0 then err := SHA3_FinalBit_LSB(state, $03, 5,  @buf, 224);
152   if err=0 then writeln(compmem(@dx05, @buf, sizeof(dx05)))
153   else writeln('Err: ', err);
154 
155   write('Test 6,     bit length 1630: ');
156   err := SHA3_Init(state,__SHA3_224);
157   if err=0 then err := SHA3_Update(state, @M160x, 1630 div 8);
158   if err=0 then err := SHA3_FinalBit_LSB(state, M160x[203], 1630 mod 8,  @buf, 224);
159   if err=0 then writeln(compmem(@dx30, @buf, sizeof(dx30)))
160   else writeln('Err: ', err);
161 
162 end;
163 
164 
165 {---------------------------------------------------------------------------}
166 procedure test_sha3_256;
167 const
168   {l1 = 0;}
169   dig1: TSHA3_256Digest     = ($A7,$FF,$C6,$F8,$BF,$1E,$D7,$66,
170                                $51,$C1,$47,$56,$A0,$61,$D6,$62,
171                                $F5,$80,$FF,$4D,$E4,$3B,$49,$FA,
172                                $82,$D8,$0A,$4B,$80,$F8,$43,$4A);
173   {l2 = 5;}
174   msg2: array[0..0] of byte = ($13);
175   dig2: TSHA3_256Digest     = ($7B,$00,$47,$CF,$5A,$45,$68,$82,
176                                $36,$3C,$BF,$0F,$B0,$53,$22,$CF,
177                                $65,$F4,$B7,$05,$9A,$46,$36,$5E,
178                                $83,$01,$32,$E3,$B5,$D9,$57,$AF);
179   {l3 = 30;}
180   msg3: array[0..3] of byte = ($53,$58,$7B,$19);
181   dig3: TSHA3_256Digest     = ($C8,$24,$2F,$EF,$40,$9E,$5A,$E9,
182                                $D1,$F1,$C8,$57,$AE,$4D,$C6,$24,
183                                $B9,$2B,$19,$80,$9F,$62,$AA,$8C,
184                                $07,$41,$1C,$54,$A0,$78,$B1,$D0);
185   {l4 = 1600}
186   dx00: TSHA3_256Digest     = ($79,$f3,$8a,$de,$c5,$c2,$03,$07,
187                                $a9,$8e,$f7,$6e,$83,$24,$af,$bf,
188                                $d4,$6c,$fd,$81,$b2,$2e,$39,$73,
189                                $c6,$5f,$a1,$bd,$9d,$e3,$17,$87);
190   {l5 = 1605}
191   dx05: TSHA3_256Digest     = ($81,$ee,$76,$9b,$ed,$09,$50,$86,
192                                $2b,$1d,$dd,$ed,$2e,$84,$aa,$a6,
193                                $ab,$7b,$fd,$d3,$ce,$aa,$47,$1b,
194                                $e3,$11,$63,$d4,$03,$36,$36,$3c);
195   {l6 = 1630}
196   dx30: TSHA3_256Digest     = ($52,$86,$0a,$a3,$01,$21,$4c,$61,
197                                $0d,$92,$2a,$6b,$6c,$ab,$98,$1c,
198                                $cd,$06,$01,$2e,$54,$ef,$68,$9d,
199                                $74,$40,$21,$e7,$38,$b9,$ed,$20);
200 begin
201   writeln('** Test SHA3-256 **');
202   write('Test 1,       bit length  0: ');
203   err := SHA3_Init(state,__SHA3_256);
204   if err=0 then err := SHA3_FinalHash(state,@buf);
205   if err=0 then writeln(compmem(@dig1, @buf, sizeof(dig1)))
206   else writeln('Err: ', err);
207 
208   write('Test 2a (LSB), bit length 5: ');
209   err := SHA3_Init(state,__SHA3_256);
210   if err=0 then err := SHA3_FinalBit_LSB(state, msg2[0], 5,  @buf, 256);
211   if err=0 then writeln(compmem(@dig2, @buf, sizeof(dig2)))
212   else writeln('Err: ', err);
213 
214   write('Test 2a (MSB), bit length 5: ');
215   err := SHA3_Init(state,__SHA3_256);
216   if err=0 then err := SHA3_FinalBit(state, $C8, 5,  @buf, 256);
217   if err=0 then writeln(compmem(@dig2, @buf, sizeof(dig2)))
218   else writeln('Err: ', err);
219 
220   write('Test 3,       bit length 30: ');
221   err := SHA3_Init(state,__SHA3_256);
222   if err=0 then err := SHA3_Update(state, @msg3, 3);
223   if err=0 then err := SHA3_FinalBit_LSB(state, msg3[3], 6,  @buf, 256);
224   if err=0 then writeln(compmem(@dig3, @buf, sizeof(dig3)))
225   else writeln('Err: ', err);
226 
227   write('Test 4,     bit length 1600: ');
228   err := SHA3_Init(state,__SHA3_256);
229   if err=0 then err := SHA3_Update(state, @M160x, 200);
230   if err=0 then err := SHA3_FinalHash(state, @buf);
231   if err=0 then writeln(compmem(@dx00, @buf, sizeof(dx00)))
232   else writeln('Err: ', err);
233 
234   write('Test 5,     bit length 1605: ');
235   err := SHA3_Init(state,__SHA3_256);
236   if err=0 then err := SHA3_Update(state, @M160x, 200);
237   if err=0 then err := SHA3_FinalBit_LSB(state, $03, 5,  @buf, 256);
238   if err=0 then writeln(compmem(@dx05, @buf, sizeof(dx05)))
239   else writeln('Err: ', err);
240 
241   write('Test 6,     bit length 1630: ');
242   err := SHA3_Init(state,__SHA3_256);
243   if err=0 then err := SHA3_Update(state, @M160x, 1630 div 8);
244   if err=0 then err := SHA3_FinalBit_LSB(state, M160x[203], 1630 mod 8,  @buf, 256);
245   if err=0 then writeln(compmem(@dx30, @buf, sizeof(dx30)))
246   else writeln('Err: ', err);
247 end;
248 
249 
250 {---------------------------------------------------------------------------}
251 procedure test_sha3_384;
252 const
253   {l1 = 0;}
254   dig1: TSHA3_384Digest     = ($0C,$63,$A7,$5B,$84,$5E,$4F,$7D,
255                                $01,$10,$7D,$85,$2E,$4C,$24,$85,
256                                $C5,$1A,$50,$AA,$AA,$94,$FC,$61,
257                                $99,$5E,$71,$BB,$EE,$98,$3A,$2A,
258                                $C3,$71,$38,$31,$26,$4A,$DB,$47,
259                                $FB,$6B,$D1,$E0,$58,$D5,$F0,$04);
260   {l2 = 5;}
261   msg2: array[0..0] of byte = ($13);
262   dig2: TSHA3_384Digest     = ($73,$7C,$9B,$49,$18,$85,$E9,$BF,
263                                $74,$28,$E7,$92,$74,$1A,$7B,$F8,
264                                $DC,$A9,$65,$34,$71,$C3,$E1,$48,
265                                $47,$3F,$2C,$23,$6B,$6A,$0A,$64,
266                                $55,$EB,$1D,$CE,$9F,$77,$9B,$4B,
267                                $6B,$23,$7F,$EF,$17,$1B,$1C,$64);
268   {l3 = 30;}
269   msg3: array[0..3] of byte = ($53,$58,$7B,$19);
270   dig3: TSHA3_384Digest     = ($95,$5B,$4D,$D1,$BE,$03,$26,$1B,
271                                $D7,$6F,$80,$7A,$7E,$FD,$43,$24,
272                                $35,$C4,$17,$36,$28,$11,$B8,$A5,
273                                $0C,$56,$4E,$7E,$E9,$58,$5E,$1A,
274                                $C7,$62,$6D,$DE,$2F,$DC,$03,$0F,
275                                $87,$61,$96,$EA,$26,$7F,$08,$C3);
276   {l4 = 1600}
277   dx00: TSHA3_384Digest     = ($18,$81,$de,$2c,$a7,$e4,$1e,$f9,
278                                $5d,$c4,$73,$2b,$8f,$5f,$00,$2b,
279                                $18,$9c,$c1,$e4,$2b,$74,$16,$8e,
280                                $d1,$73,$26,$49,$ce,$1d,$bc,$dd,
281                                $76,$19,$7a,$31,$fd,$55,$ee,$98,
282                                $9f,$2d,$70,$50,$dd,$47,$3e,$8f);
283   {l5 = 1605}
284   dx05: TSHA3_384Digest     = ($a3,$1f,$db,$d8,$d5,$76,$55,$1c,
285                                $21,$fb,$11,$91,$b5,$4b,$da,$65,
286                                $b6,$c5,$fe,$97,$f0,$f4,$a6,$91,
287                                $03,$42,$4b,$43,$f7,$fd,$b8,$35,
288                                $97,$9f,$db,$ea,$e8,$b3,$fe,$16,
289                                $cb,$82,$e5,$87,$38,$1e,$b6,$24);
290   {l6 = 1630}
291   dx30: TSHA3_384Digest     = ($34,$85,$d3,$b2,$80,$bd,$38,$4c,
292                                $f4,$a7,$77,$84,$4e,$94,$67,$81,
293                                $73,$05,$5d,$1c,$bc,$40,$c7,$c2,
294                                $c3,$83,$3d,$9e,$f1,$23,$45,$17,
295                                $2d,$6f,$cd,$31,$92,$3b,$b8,$79,
296                                $5a,$c8,$18,$47,$d3,$d8,$85,$5c);
297 begin
298   writeln('** Test SHA3-384 **');
299   write('Test 1,       bit length  0: ');
300   err := SHA3_Init(state,__SHA3_384);
301   if err=0 then err := SHA3_FinalHash(state,@buf);
302   if err=0 then writeln(compmem(@dig1, @buf, sizeof(dig1)))
303   else writeln('Err: ', err);
304 
305   write('Test 2a (LSB), bit length 5: ');
306   err := SHA3_Init(state,__SHA3_384);
307   if err=0 then err := SHA3_FinalBit_LSB(state, msg2[0], 5,  @buf, 384);
308   if err=0 then writeln(compmem(@dig2, @buf, sizeof(dig2)))
309   else writeln('Err: ', err);
310 
311   write('Test 2b (MSB), bit length 5: ');
312   err := SHA3_Init(state,__SHA3_384);
313   if err=0 then err := SHA3_FinalBit(state, $C8, 5,  @buf, 384);
314   if err=0 then writeln(compmem(@dig2, @buf, sizeof(dig2)))
315   else writeln('Err: ', err);
316 
317   write('Test 3,       bit length 30: ');
318   err := SHA3_Init(state,__SHA3_384);
319   if err=0 then err := SHA3_Update(state, @msg3, 3);
320   if err=0 then err := SHA3_FinalBit_LSB(state, msg3[3], 6,  @buf, 384);
321   if err=0 then writeln(compmem(@dig3, @buf, sizeof(dig3)))
322   else writeln('Err: ', err);
323 
324   write('Test 4,     bit length 1600: ');
325   err := SHA3_Init(state,__SHA3_384);
326   if err=0 then err := SHA3_Update(state, @M160x, 200);
327   if err=0 then err := SHA3_FinalHash(state, @buf);
328   if err=0 then writeln(compmem(@dx00, @buf, sizeof(dx00)))
329   else writeln('Err: ', err);
330 
331   write('Test 5,     bit length 1605: ');
332   err := SHA3_Init(state,__SHA3_384);
333   if err=0 then err := SHA3_Update(state, @M160x, 200);
334   if err=0 then err := SHA3_FinalBit_LSB(state, $03, 5,  @buf, 384);
335   if err=0 then writeln(compmem(@dx05, @buf, sizeof(dx05)))
336   else writeln('Err: ', err);
337 
338   write('Test 6,     bit length 1630: ');
339   err := SHA3_Init(state,__SHA3_384);
340   if err=0 then err := SHA3_Update(state, @M160x, 1630 div 8);
341   if err=0 then err := SHA3_FinalBit_LSB(state, M160x[203], 1630 mod 8,  @buf, 384);
342   if err=0 then writeln(compmem(@dx30, @buf, sizeof(dx30)))
343   else writeln('Err: ', err);
344 end;
345 
346 
347 {---------------------------------------------------------------------------}
348 procedure test_sha3_512;
349 const
350   {l1 = 0;}
351   dig1: TSHA3_512Digest     = ($A6,$9F,$73,$CC,$A2,$3A,$9A,$C5,
352                                $C8,$B5,$67,$DC,$18,$5A,$75,$6E,
353                                $97,$C9,$82,$16,$4F,$E2,$58,$59,
354                                $E0,$D1,$DC,$C1,$47,$5C,$80,$A6,
355                                $15,$B2,$12,$3A,$F1,$F5,$F9,$4C,
356                                $11,$E3,$E9,$40,$2C,$3A,$C5,$58,
357                                $F5,$00,$19,$9D,$95,$B6,$D3,$E3,
358                                $01,$75,$85,$86,$28,$1D,$CD,$26);
359   {l2 = 5;}
360   msg2: array[0..0] of byte = ($13);
361   dig2: TSHA3_512Digest     = ($A1,$3E,$01,$49,$41,$14,$C0,$98,
362                                $00,$62,$2A,$70,$28,$8C,$43,$21,
363                                $21,$CE,$70,$03,$9D,$75,$3C,$AD,
364                                $D2,$E0,$06,$E4,$D9,$61,$CB,$27,
365                                $54,$4C,$14,$81,$E5,$81,$4B,$DC,
366                                $EB,$53,$BE,$67,$33,$D5,$E0,$99,
367                                $79,$5E,$5E,$81,$91,$8A,$DD,$B0,
368                                $58,$E2,$2A,$9F,$24,$88,$3F,$37);
369   {l3 = 30;}
370   msg3: array[0..3] of byte = ($53,$58,$7B,$19);
371   dig3: TSHA3_512Digest     = ($98,$34,$C0,$5A,$11,$E1,$C5,$D3,
372                                $DA,$9C,$74,$0E,$1C,$10,$6D,$9E,
373                                $59,$0A,$0E,$53,$0B,$6F,$6A,$AA,
374                                $78,$30,$52,$5D,$07,$5C,$A5,$DB,
375                                $1B,$D8,$A6,$AA,$98,$1A,$28,$61,
376                                $3A,$C3,$34,$93,$4A,$01,$82,$3C,
377                                $D4,$5F,$45,$E4,$9B,$6D,$7E,$69,
378                                $17,$F2,$F1,$67,$78,$06,$7B,$AB);
379   {l4 = 1600}
380   dx00: TSHA3_512Digest     = ($e7,$6d,$fa,$d2,$20,$84,$a8,$b1,
381                                $46,$7f,$cf,$2f,$fa,$58,$36,$1b,
382                                $ec,$76,$28,$ed,$f5,$f3,$fd,$c0,
383                                $e4,$80,$5d,$c4,$8c,$ae,$ec,$a8,
384                                $1b,$7c,$13,$c3,$0a,$df,$52,$a3,
385                                $65,$95,$84,$73,$9a,$2d,$f4,$6b,
386                                $e5,$89,$c5,$1c,$a1,$a4,$a8,$41,
387                                $6d,$f6,$54,$5a,$1c,$e8,$ba,$00);
388   {l5 = 1605}
389   dx05: TSHA3_512Digest     = ($fc,$4a,$16,$7c,$cb,$31,$a9,$37,
390                                $d6,$98,$fd,$e8,$2b,$04,$34,$8c,
391                                $95,$39,$b2,$8f,$0c,$9d,$3b,$45,
392                                $05,$70,$9c,$03,$81,$23,$50,$e4,
393                                $99,$0e,$96,$22,$97,$4f,$6e,$57,
394                                $5c,$47,$86,$1c,$0d,$2e,$63,$8c,
395                                $cf,$c2,$02,$3c,$36,$5b,$b6,$0a,
396                                $93,$f5,$28,$55,$06,$98,$78,$6b);
397   {l6 = 1630}
398   dx30: TSHA3_512Digest     = ($cf,$9a,$30,$ac,$1f,$1f,$6a,$c0,
399                                $91,$6f,$9f,$ef,$19,$19,$c5,$95,
400                                $de,$be,$2e,$e8,$0c,$85,$42,$12,
401                                $10,$fd,$f0,$5f,$1c,$6a,$f7,$3a,
402                                $a9,$ca,$c8,$81,$d0,$f9,$1d,$b6,
403                                $d0,$34,$a2,$bb,$ad,$c1,$cf,$7f,
404                                $bc,$b2,$ec,$fa,$9d,$19,$1d,$3a,
405                                $50,$16,$fb,$3f,$ad,$87,$09,$c9);
406 begin
407   writeln('** Test SHA3-512 **');
408   write('Test 1,       bit length  0: ');
409   err := SHA3_Init(state,__SHA3_512);
410   if err=0 then err := SHA3_FinalHash(state,@buf);
411   if err=0 then writeln(compmem(@dig1, @buf, sizeof(dig1)))
412   else writeln('Err: ', err);
413 
414   write('Test 2a (LSB), bit length 5: ');
415   err := SHA3_Init(state,__SHA3_512);
416   if err=0 then err := SHA3_FinalBit_LSB(state, msg2[0], 5,  @buf, 512);
417   if err=0 then writeln(compmem(@dig2, @buf, sizeof(dig2)))
418   else writeln('Err: ', err);
419 
420   write('Test 2b (MSB), bit length 5: ');
421   err := SHA3_Init(state,__SHA3_512);
422   if err=0 then err := SHA3_FinalBit(state, $C8, 5,  @buf, 512);
423   if err=0 then writeln(compmem(@dig2, @buf, sizeof(dig2)))
424   else writeln('Err: ', err);
425 
426   write('Test 3,       bit length 30: ');
427   err := SHA3_Init(state,__SHA3_512);
428   if err=0 then err := SHA3_Update(state, @msg3, 3);
429   if err=0 then err := SHA3_FinalBit_LSB(state, msg3[3], 6,  @buf, 512);
430   if err=0 then writeln(compmem(@dig3, @buf, sizeof(dig3)))
431   else writeln('Err: ', err);
432 
433   write('Test 4,     bit length 1600: ');
434   err := SHA3_Init(state,__SHA3_512);
435   if err=0 then err := SHA3_Update(state, @M160x, 200);
436   if err=0 then err := SHA3_FinalHash(state, @buf);
437   if err=0 then writeln(compmem(@dx00, @buf, sizeof(dx00)))
438   else writeln('Err: ', err);
439 
440   write('Test 5,     bit length 1605: ');
441   err := SHA3_Init(state,__SHA3_512);
442   if err=0 then err := SHA3_Update(state, @M160x, 200);
443   if err=0 then err := SHA3_FinalBit_LSB(state, $03, 5,  @buf, 512);
444   if err=0 then writeln(compmem(@dx05, @buf, sizeof(dx05)))
445   else writeln('Err: ', err);
446 
447   write('Test 6,     bit length 1630: ');
448   err := SHA3_Init(state,__SHA3_512);
449   if err=0 then err := SHA3_Update(state, @M160x, 1630 div 8);
450   if err=0 then err := SHA3_FinalBit_LSB(state, M160x[203], 1630 mod 8,  @buf, 512);
451   if err=0 then writeln(compmem(@dx30, @buf, sizeof(dx30)))
452   else writeln('Err: ', err);
453 end;
454 
455 
456 {---------------------------------------------------------------------------}
457 procedure test_sha3_shake128;
458 const
459   {l1 = 0;}
460   msg1: array[0..0] of byte = (0);
461   dig1: array[0..511] of byte = (
462           $7F,$9C,$2B,$A4,$E8,$8F,$82,$7D,$61,$60,$45,$50,$76,$05,$85,$3E,
463           $D7,$3B,$80,$93,$F6,$EF,$BC,$88,$EB,$1A,$6E,$AC,$FA,$66,$EF,$26,
464           $3C,$B1,$EE,$A9,$88,$00,$4B,$93,$10,$3C,$FB,$0A,$EE,$FD,$2A,$68,
465           $6E,$01,$FA,$4A,$58,$E8,$A3,$63,$9C,$A8,$A1,$E3,$F9,$AE,$57,$E2,
466           $35,$B8,$CC,$87,$3C,$23,$DC,$62,$B8,$D2,$60,$16,$9A,$FA,$2F,$75,
467           $AB,$91,$6A,$58,$D9,$74,$91,$88,$35,$D2,$5E,$6A,$43,$50,$85,$B2,
468           $BA,$DF,$D6,$DF,$AA,$C3,$59,$A5,$EF,$BB,$7B,$CC,$4B,$59,$D5,$38,
469           $DF,$9A,$04,$30,$2E,$10,$C8,$BC,$1C,$BF,$1A,$0B,$3A,$51,$20,$EA,
470           $17,$CD,$A7,$CF,$AD,$76,$5F,$56,$23,$47,$4D,$36,$8C,$CC,$A8,$AF,
471           $00,$07,$CD,$9F,$5E,$4C,$84,$9F,$16,$7A,$58,$0B,$14,$AA,$BD,$EF,
472           $AE,$E7,$EE,$F4,$7C,$B0,$FC,$A9,$76,$7B,$E1,$FD,$A6,$94,$19,$DF,
473           $B9,$27,$E9,$DF,$07,$34,$8B,$19,$66,$91,$AB,$AE,$B5,$80,$B3,$2D,
474           $EF,$58,$53,$8B,$8D,$23,$F8,$77,$32,$EA,$63,$B0,$2B,$4F,$A0,$F4,
475           $87,$33,$60,$E2,$84,$19,$28,$CD,$60,$DD,$4C,$EE,$8C,$C0,$D4,$C9,
476           $22,$A9,$61,$88,$D0,$32,$67,$5C,$8A,$C8,$50,$93,$3C,$7A,$FF,$15,
477           $33,$B9,$4C,$83,$4A,$DB,$B6,$9C,$61,$15,$BA,$D4,$69,$2D,$86,$19,
478           $F9,$0B,$0C,$DF,$8A,$7B,$9C,$26,$40,$29,$AC,$18,$5B,$70,$B8,$3F,
479           $28,$01,$F2,$F4,$B3,$F7,$0C,$59,$3E,$A3,$AE,$EB,$61,$3A,$7F,$1B,
480           $1D,$E3,$3F,$D7,$50,$81,$F5,$92,$30,$5F,$2E,$45,$26,$ED,$C0,$96,
481           $31,$B1,$09,$58,$F4,$64,$D8,$89,$F3,$1B,$A0,$10,$25,$0F,$DA,$7F,
482           $13,$68,$EC,$29,$67,$FC,$84,$EF,$2A,$E9,$AF,$F2,$68,$E0,$B1,$70,
483           $0A,$FF,$C6,$82,$0B,$52,$3A,$3D,$91,$71,$35,$F2,$DF,$F2,$EE,$06,
484           $BF,$E7,$2B,$31,$24,$72,$1D,$4A,$26,$C0,$4E,$53,$A7,$5E,$30,$E7,
485           $3A,$7A,$9C,$4A,$95,$D9,$1C,$55,$D4,$95,$E9,$F5,$1D,$D0,$B5,$E9,
486           $D8,$3C,$6D,$5E,$8C,$E8,$03,$AA,$62,$B8,$D6,$54,$DB,$53,$D0,$9B,
487           $8D,$CF,$F2,$73,$CD,$FE,$B5,$73,$FA,$D8,$BC,$D4,$55,$78,$BE,$C2,
488           $E7,$70,$D0,$1E,$FD,$E8,$6E,$72,$1A,$3F,$7C,$6C,$CE,$27,$5D,$AB,
489           $E6,$E2,$14,$3F,$1A,$F1,$8D,$A7,$EF,$DD,$C4,$C7,$B7,$0B,$5E,$34,
490           $5D,$B9,$3C,$C9,$36,$BE,$A3,$23,$49,$1C,$CB,$38,$A3,$88,$F5,$46,
491           $A9,$FF,$00,$DD,$4E,$13,$00,$B9,$B2,$15,$3D,$20,$41,$D2,$05,$B4,
492           $43,$E4,$1B,$45,$A6,$53,$F2,$A5,$C4,$49,$2C,$1A,$DD,$54,$45,$12,
493           $DD,$A2,$52,$98,$33,$46,$2B,$71,$A4,$1A,$45,$BE,$97,$29,$0B,$6F);
494   {l2 = 5;}
495   msg2: array[0..0] of byte = ($13);
496   dig2: array[0..511] of byte = (
497           $2E,$0A,$BF,$BA,$83,$E6,$72,$0B,$FB,$C2,$25,$FF,$6B,$7A,$B9,$FF,
498           $CE,$58,$BA,$02,$7E,$E3,$D8,$98,$76,$4F,$EF,$28,$7D,$DE,$CC,$CA,
499           $3E,$6E,$59,$98,$41,$1E,$7D,$DB,$32,$F6,$75,$38,$F5,$00,$B1,$8C,
500           $8C,$97,$C4,$52,$C3,$70,$EA,$2C,$F0,$AF,$CA,$3E,$05,$DE,$7E,$4D,
501           $E2,$7F,$A4,$41,$A9,$CB,$34,$FD,$17,$C9,$78,$B4,$2D,$5B,$7E,$7F,
502           $9A,$B1,$8F,$FE,$FF,$C3,$C5,$AC,$2F,$3A,$45,$5E,$EB,$FD,$C7,$6C,
503           $EA,$EB,$0A,$2C,$CA,$22,$EE,$F6,$E6,$37,$F4,$CA,$BE,$5C,$51,$DE,
504           $D2,$E3,$FA,$D8,$B9,$52,$70,$A3,$21,$84,$56,$64,$F1,$07,$D1,$64,
505           $96,$BB,$7A,$BF,$BE,$75,$04,$B6,$ED,$E2,$E8,$9E,$4B,$99,$6F,$B5,
506           $8E,$FD,$C4,$18,$1F,$91,$63,$38,$1C,$BE,$7B,$C0,$06,$A7,$A2,$05,
507           $98,$9C,$52,$6C,$D1,$BD,$68,$98,$36,$93,$B4,$BD,$C5,$37,$28,$B2,
508           $41,$C1,$CF,$F4,$2B,$B6,$11,$50,$2C,$35,$20,$5C,$AB,$B2,$88,$75,
509           $56,$55,$D6,$20,$C6,$79,$94,$F0,$64,$51,$18,$7F,$6F,$D1,$7E,$04,
510           $66,$82,$BA,$12,$86,$06,$3F,$F8,$8F,$E2,$50,$8D,$1F,$CA,$F9,$03,
511           $5A,$12,$31,$AD,$41,$50,$A9,$C9,$B2,$4C,$9B,$2D,$66,$B2,$AD,$1B,
512           $DE,$0B,$D0,$BB,$CB,$8B,$E0,$5B,$83,$52,$29,$EF,$79,$19,$73,$73,
513           $23,$42,$44,$01,$E1,$D8,$37,$B6,$6E,$B4,$E6,$30,$FF,$1D,$E7,$0C,
514           $B3,$17,$C2,$BA,$CB,$08,$00,$1D,$34,$77,$B7,$A7,$0A,$57,$6D,$20,
515           $86,$90,$33,$58,$9D,$85,$A0,$1D,$DB,$2B,$66,$46,$C0,$43,$B5,$9F,
516           $C0,$11,$31,$1D,$A6,$66,$FA,$5A,$D1,$D6,$38,$7F,$A9,$BC,$40,$15,
517           $A3,$8A,$51,$D1,$DA,$1E,$A6,$1D,$64,$8D,$C8,$E3,$9A,$88,$B9,$D6,
518           $22,$BD,$E2,$07,$FD,$AB,$C6,$F2,$82,$7A,$88,$0C,$33,$0B,$BF,$6D,
519           $F7,$33,$77,$4B,$65,$3E,$57,$30,$5D,$78,$DC,$E1,$12,$F1,$0A,$2C,
520           $71,$F4,$CD,$AD,$92,$ED,$11,$3E,$1C,$EA,$63,$B9,$19,$25,$ED,$28,
521           $19,$1E,$6D,$BB,$B5,$AA,$5A,$2A,$FD,$A5,$1F,$C0,$5A,$3A,$F5,$25,
522           $8B,$87,$66,$52,$43,$55,$0F,$28,$94,$8A,$E2,$B8,$BE,$B6,$BC,$9C,
523           $77,$0B,$35,$F0,$67,$EA,$A6,$41,$EF,$E6,$5B,$1A,$44,$90,$9D,$1B,
524           $14,$9F,$97,$EE,$A6,$01,$39,$1C,$60,$9E,$C8,$1D,$19,$30,$F5,$7C,
525           $18,$A4,$E0,$FA,$B4,$91,$D1,$CA,$DF,$D5,$04,$83,$44,$9E,$DC,$0F,
526           $07,$FF,$B2,$4D,$2C,$6F,$9A,$9A,$3B,$FF,$39,$AE,$3D,$57,$F5,$60,
527           $65,$4D,$7D,$75,$C9,$08,$AB,$E6,$25,$64,$75,$3E,$AC,$39,$D7,$50,
528           $3D,$A6,$D3,$7C,$2E,$32,$E1,$AF,$3B,$8A,$EC,$8A,$E3,$06,$9C,$D9);
529   {l3 = 30;}
530   msg3: array[0..3] of byte = ($53,$58,$7B,$19);
531   dig3: array[0..511] of byte = (
532           $6D,$5D,$39,$C5,$5F,$3C,$CA,$56,$7F,$EA,$F4,$22,$DC,$64,$BA,$17,
533           $40,$1D,$07,$75,$6D,$78,$B0,$FA,$3D,$54,$6D,$66,$AF,$C2,$76,$71,
534           $E0,$01,$06,$85,$FC,$69,$A7,$EC,$3C,$53,$67,$B8,$FA,$5F,$DA,$39,
535           $D5,$7C,$E5,$3F,$15,$3F,$A4,$03,$1D,$27,$72,$06,$77,$0A,$EC,$6B,
536           $2D,$DF,$16,$AE,$FA,$B6,$69,$11,$0D,$6E,$4A,$29,$6A,$14,$FB,$14,
537           $86,$B0,$84,$6B,$69,$05,$43,$E4,$05,$7F,$7F,$42,$AA,$8C,$0E,$6A,
538           $5A,$56,$B6,$0B,$68,$8D,$55,$A1,$96,$DF,$6F,$39,$76,$E3,$06,$88,
539           $CB,$B6,$AF,$D4,$85,$25,$D7,$64,$90,$35,$7F,$3F,$D8,$97,$BA,$FC,
540           $87,$36,$D9,$07,$B9,$BA,$C8,$16,$59,$1F,$C2,$4E,$79,$36,$0B,$E3,
541           $A7,$FF,$A6,$29,$82,$C4,$5A,$BB,$0E,$58,$4C,$07,$EC,$93,$A1,$95,
542           $30,$50,$9D,$9F,$81,$62,$15,$D7,$27,$7B,$B9,$99,$43,$7C,$82,$14,
543           $50,$F0,$75,$92,$81,$CD,$8E,$16,$A3,$48,$3E,$3C,$C7,$52,$09,$1B,
544           $7A,$AE,$92,$90,$9D,$2F,$50,$1E,$F7,$DC,$E9,$89,$75,$98,$91,$B3,
545           $37,$7C,$EA,$B4,$93,$FF,$E4,$96,$01,$0A,$0C,$7E,$51,$95,$99,$94,
546           $F5,$6F,$56,$5E,$63,$3A,$F6,$09,$3A,$C6,$E1,$E0,$F0,$04,$88,$71,
547           $EC,$47,$78,$F4,$8E,$F8,$BD,$5B,$CB,$80,$EA,$7D,$F9,$FF,$47,$11,
548           $C8,$1E,$24,$C0,$22,$1C,$2A,$D9,$74,$4F,$BA,$79,$35,$EA,$EC,$A1,
549           $14,$22,$4F,$D1,$08,$EF,$C5,$AC,$74,$C6,$62,$52,$08,$92,$75,$B4,
550           $27,$76,$73,$70,$8C,$4A,$F9,$2F,$88,$13,$B1,$93,$59,$9F,$D6,$4B,
551           $D7,$48,$4F,$2E,$5E,$C3,$69,$E3,$64,$64,$99,$76,$8E,$58,$1D,$D0,
552           $53,$AA,$48,$14,$D8,$BF,$1A,$CF,$F5,$FD,$77,$45,$19,$A7,$49,$BE,
553           $66,$75,$47,$41,$EB,$C5,$36,$22,$12,$A9,$FE,$A8,$A8,$14,$E9,$E0,
554           $10,$BC,$27,$20,$B3,$B7,$D9,$4F,$AB,$74,$BC,$7F,$92,$3E,$10,$72,
555           $B8,$A5,$DD,$DD,$A8,$3B,$A0,$15,$7D,$8C,$BA,$55,$C1,$92,$DF,$69,
556           $65,$CB,$7D,$BA,$46,$A3,$34,$0D,$F8,$C3,$FA,$89,$C7,$C4,$DB,$53,
557           $9D,$38,$DC,$40,$6F,$1D,$2C,$F5,$4E,$59,$05,$58,$0B,$44,$04,$BF,
558           $D7,$B3,$71,$95,$61,$C5,$A5,$9D,$5D,$FD,$B1,$BF,$93,$DF,$13,$82,
559           $52,$25,$ED,$CC,$E0,$FA,$7D,$87,$EF,$CD,$23,$9F,$EB,$49,$FC,$9E,
560           $2D,$E9,$D8,$28,$FE,$EB,$1F,$2C,$F5,$79,$B9,$5D,$D0,$50,$AB,$2C,
561           $A4,$71,$05,$A8,$D3,$0F,$3F,$D2,$A1,$15,$4C,$15,$F8,$7F,$B3,$7B,
562           $2C,$71,$56,$BD,$7F,$3C,$F2,$B7,$45,$C9,$12,$A4,$0B,$C1,$B5,$59,
563           $B6,$56,$E3,$E9,$03,$CC,$57,$33,$E8,$6B,$A1,$5D,$FE,$F7,$06,$78);
564 begin
565   writeln('** Test SHAKE-128 / 4096 **');
566   write('Test 1, bit length  0: ');
567   err := SHA3_Init(state,__SHAKE_128);
568   if err=0 then err := SHA3_FinalBit_LSB(state, msg1[0], 0,  @buf, 4096);
569   if err=0 then writeln(compmem(@dig1, @buf, sizeof(dig1)))
570   else writeln('Err: ', err);
571 
572   write('Test 2, bit length  5: ');
573   err := SHA3_Init(state,__SHAKE_128);
574   if err=0 then err := SHA3_FinalBit_LSB(state, msg2[0], 5,  @buf, 4096);
575   if err=0 then writeln(compmem(@dig2, @buf, sizeof(dig2)))
576   else writeln('Err: ', err);
577 
578   write('Test 3, bit length 30: ');
579   err := SHA3_Init(state,__SHAKE_128);
580   if err=0 then err := SHA3_Update(state, @msg3, 3);
581   if err=0 then err := SHA3_FinalBit_LSB(state, msg3[3], 6,  @buf, 4096);
582   if err=0 then writeln(compmem(@dig3, @buf, sizeof(dig3)))
583   else writeln('Err: ', err);
584 end;
585 
586 
587 {---------------------------------------------------------------------------}
588 procedure test_sha3_shake256;
589 const
590   {l1 = 0;}
591   msg1: array[0..0] of byte  = (0);
592   dig1: array[0..511] of byte = (
593           $46,$B9,$DD,$2B,$0B,$A8,$8D,$13,$23,$3B,$3F,$EB,$74,$3E,$EB,$24,
594           $3F,$CD,$52,$EA,$62,$B8,$1B,$82,$B5,$0C,$27,$64,$6E,$D5,$76,$2F,
595           $D7,$5D,$C4,$DD,$D8,$C0,$F2,$00,$CB,$05,$01,$9D,$67,$B5,$92,$F6,
596           $FC,$82,$1C,$49,$47,$9A,$B4,$86,$40,$29,$2E,$AC,$B3,$B7,$C4,$BE,
597           $14,$1E,$96,$61,$6F,$B1,$39,$57,$69,$2C,$C7,$ED,$D0,$B4,$5A,$E3,
598           $DC,$07,$22,$3C,$8E,$92,$93,$7B,$EF,$84,$BC,$0E,$AB,$86,$28,$53,
599           $34,$9E,$C7,$55,$46,$F5,$8F,$B7,$C2,$77,$5C,$38,$46,$2C,$50,$10,
600           $D8,$46,$C1,$85,$C1,$51,$11,$E5,$95,$52,$2A,$6B,$CD,$16,$CF,$86,
601           $F3,$D1,$22,$10,$9E,$3B,$1F,$DD,$94,$3B,$6A,$EC,$46,$8A,$2D,$62,
602           $1A,$7C,$06,$C6,$A9,$57,$C6,$2B,$54,$DA,$FC,$3B,$E8,$75,$67,$D6,
603           $77,$23,$13,$95,$F6,$14,$72,$93,$B6,$8C,$EA,$B7,$A9,$E0,$C5,$8D,
604           $86,$4E,$8E,$FD,$E4,$E1,$B9,$A4,$6C,$BE,$85,$47,$13,$67,$2F,$5C,
605           $AA,$AE,$31,$4E,$D9,$08,$3D,$AB,$4B,$09,$9F,$8E,$30,$0F,$01,$B8,
606           $65,$0F,$1F,$4B,$1D,$8F,$CF,$3F,$3C,$B5,$3F,$B8,$E9,$EB,$2E,$A2,
607           $03,$BD,$C9,$70,$F5,$0A,$E5,$54,$28,$A9,$1F,$7F,$53,$AC,$26,$6B,
608           $28,$41,$9C,$37,$78,$A1,$5F,$D2,$48,$D3,$39,$ED,$E7,$85,$FB,$7F,
609           $5A,$1A,$AA,$96,$D3,$13,$EA,$CC,$89,$09,$36,$C1,$73,$CD,$CD,$0F,
610           $AB,$88,$2C,$45,$75,$5F,$EB,$3A,$ED,$96,$D4,$77,$FF,$96,$39,$0B,
611           $F9,$A6,$6D,$13,$68,$B2,$08,$E2,$1F,$7C,$10,$D0,$4A,$3D,$BD,$4E,
612           $36,$06,$33,$E5,$DB,$4B,$60,$26,$01,$C1,$4C,$EA,$73,$7D,$B3,$DC,
613           $F7,$22,$63,$2C,$C7,$78,$51,$CB,$DD,$E2,$AA,$F0,$A3,$3A,$07,$B3,
614           $73,$44,$5D,$F4,$90,$CC,$8F,$C1,$E4,$16,$0F,$F1,$18,$37,$8F,$11,
615           $F0,$47,$7D,$E0,$55,$A8,$1A,$9E,$DA,$57,$A4,$A2,$CF,$B0,$C8,$39,
616           $29,$D3,$10,$91,$2F,$72,$9E,$C6,$CF,$A3,$6C,$6A,$C6,$A7,$58,$37,
617           $14,$30,$45,$D7,$91,$CC,$85,$EF,$F5,$B2,$19,$32,$F2,$38,$61,$BC,
618           $F2,$3A,$52,$B5,$DA,$67,$EA,$F7,$BA,$AE,$0F,$5F,$B1,$36,$9D,$B7,
619           $8F,$3A,$C4,$5F,$8C,$4A,$C5,$67,$1D,$85,$73,$5C,$DD,$DB,$09,$D2,
620           $B1,$E3,$4A,$1F,$C0,$66,$FF,$4A,$16,$2C,$B2,$63,$D6,$54,$12,$74,
621           $AE,$2F,$CC,$86,$5F,$61,$8A,$BE,$27,$C1,$24,$CD,$8B,$07,$4C,$CD,
622           $51,$63,$01,$B9,$18,$75,$82,$4D,$09,$95,$8F,$34,$1E,$F2,$74,$BD,
623           $AB,$0B,$AE,$31,$63,$39,$89,$43,$04,$E3,$58,$77,$B0,$C2,$8A,$9B,
624           $1F,$D1,$66,$C7,$96,$B9,$CC,$25,$8A,$06,$4A,$8F,$57,$E2,$7F,$2A);
625 
626   {l2 = 5;}
627   msg2: array[0..0] of byte = ($13);
628   dig2: array[0..511] of byte = (
629           $48,$A5,$C1,$1A,$BA,$EE,$FF,$09,$2F,$36,$46,$EF,$0D,$6B,$3D,$3F,
630           $F7,$6C,$2F,$55,$F9,$C7,$32,$AC,$64,$70,$C0,$37,$64,$00,$82,$12,
631           $E2,$1B,$14,$67,$77,$8B,$18,$19,$89,$F8,$88,$58,$21,$1B,$45,$DF,
632           $87,$99,$CF,$96,$1F,$80,$0D,$FA,$C9,$9E,$64,$40,$39,$E2,$97,$9A,
633           $40,$16,$F5,$45,$6F,$F4,$21,$C5,$B3,$85,$DA,$2B,$85,$5D,$A7,$E3,
634           $1C,$8C,$2E,$8E,$4B,$A4,$1E,$B4,$09,$5C,$B9,$99,$D9,$75,$9C,$B4,
635           $03,$58,$DA,$85,$62,$A2,$E6,$13,$49,$E0,$5A,$2E,$13,$F1,$B7,$4E,
636           $C9,$E6,$9F,$5B,$42,$6D,$C7,$41,$38,$FF,$CD,$C5,$71,$C3,$2B,$39,
637           $B9,$F5,$55,$63,$E1,$A9,$9D,$C4,$22,$C3,$06,$02,$6D,$6A,$0F,$9D,
638           $E8,$51,$62,$B3,$86,$79,$4C,$A0,$68,$8B,$76,$4B,$3D,$32,$20,$0C,
639           $C4,$59,$74,$97,$32,$A0,$F3,$A3,$41,$C0,$EF,$C9,$6A,$22,$C6,$3B,
640           $AD,$7D,$96,$CC,$9B,$A4,$76,$8C,$6F,$CF,$A1,$F2,$00,$10,$7C,$F9,
641           $FA,$E5,$C0,$D7,$54,$95,$8C,$5A,$75,$6B,$37,$6A,$3B,$E6,$9F,$88,
642           $07,$4F,$20,$0E,$9E,$95,$A8,$CA,$5B,$CF,$96,$99,$98,$DB,$1D,$C3,
643           $7D,$0D,$3D,$91,$6F,$6C,$AA,$B3,$F0,$37,$82,$C9,$C4,$4A,$2E,$14,
644           $E8,$07,$86,$BE,$CE,$45,$87,$B9,$EF,$82,$CB,$F4,$54,$E0,$E3,$4B,
645           $D1,$75,$AE,$57,$D3,$6A,$F4,$E7,$26,$B2,$21,$33,$2C,$ED,$36,$C8,
646           $CE,$2E,$06,$20,$3C,$65,$6A,$E8,$DA,$03,$7D,$08,$E7,$16,$0B,$48,
647           $0C,$1A,$85,$16,$BF,$06,$DD,$97,$BF,$4A,$A4,$C0,$24,$93,$10,$DC,
648           $0B,$06,$5D,$C6,$39,$57,$63,$55,$38,$4D,$16,$5C,$6A,$50,$9B,$12,
649           $F7,$BB,$D1,$E1,$5B,$22,$BC,$E0,$2F,$A0,$48,$DD,$FA,$AC,$F7,$41,
650           $5F,$49,$B6,$32,$4C,$1D,$06,$7B,$52,$64,$E1,$12,$5F,$7F,$75,$42,
651           $7F,$31,$2B,$D9,$34,$6E,$B4,$E4,$00,$B1,$F7,$CB,$31,$28,$8C,$9E,
652           $3F,$73,$5E,$CA,$9C,$ED,$0D,$B8,$88,$E2,$E2,$F4,$02,$24,$3B,$D6,
653           $46,$18,$A2,$3E,$10,$F9,$C2,$29,$39,$74,$40,$54,$2D,$0A,$B1,$B2,
654           $E1,$0D,$AC,$C5,$C9,$5E,$59,$7F,$2C,$7E,$A3,$84,$38,$10,$5F,$97,
655           $80,$3D,$BB,$03,$FC,$C0,$FD,$41,$6B,$09,$05,$A4,$1D,$18,$4D,$EB,
656           $23,$89,$05,$77,$58,$91,$F9,$35,$01,$FB,$41,$76,$A3,$BD,$6C,$46,
657           $44,$61,$D3,$6E,$E8,$B0,$08,$AA,$BD,$9E,$26,$A3,$40,$55,$E8,$0C,
658           $8C,$81,$3E,$EB,$A0,$7F,$72,$8A,$B3,$2B,$15,$60,$5A,$D1,$61,$A0,
659           $66,$9F,$6F,$CE,$5C,$55,$09,$FB,$B6,$AF,$D2,$4A,$EA,$CC,$5F,$A4,
660           $A5,$15,$23,$E6,$B1,$73,$24,$6E,$D4,$BF,$A5,$21,$D7,$4F,$C6,$BB);
661   {l3 = 30;}
662   msg3: array[0..3] of byte  = ($53,$58,$7B,$19);
663   dig3: array[0..511] of byte = (
664           $46,$5D,$08,$1D,$FF,$87,$5E,$39,$62,$00,$E4,$48,$1A,$3E,$9D,$CD,
665           $88,$D0,$79,$AA,$6D,$66,$22,$6C,$B6,$BA,$45,$41,$07,$CB,$81,$A7,
666           $84,$1A,$B0,$29,$60,$DE,$27,$9C,$CB,$E3,$4B,$42,$C3,$65,$85,$AD,
667           $86,$96,$4D,$B0,$DB,$52,$B6,$E7,$B4,$36,$9E,$CE,$8F,$72,$48,$58,
668           $9B,$A7,$8A,$B1,$82,$8F,$FC,$33,$5C,$B1,$23,$97,$11,$9B,$FD,$2B,
669           $87,$EB,$78,$98,$AE,$B9,$56,$B6,$F2,$3D,$DF,$0B,$D4,$00,$43,$86,
670           $A8,$E5,$26,$55,$4E,$F4,$E4,$83,$FA,$CE,$E3,$0D,$D3,$2E,$20,$4F,
671           $FF,$8C,$36,$BB,$D6,$02,$A5,$76,$D1,$39,$08,$9C,$75,$A8,$05,$02,
672           $66,$FC,$BF,$72,$1E,$44,$43,$DE,$46,$45,$83,$29,$22,$EB,$8A,$AE,
673           $39,$D1,$F5,$72,$84,$53,$64,$81,$7B,$00,$33,$54,$38,$99,$94,$00,
674           $23,$F2,$E9,$65,$A6,$0A,$80,$EB,$22,$1E,$B1,$9D,$C5,$7B,$12,$12,
675           $91,$56,$4C,$6F,$69,$35,$83,$B3,$AC,$7C,$6F,$27,$2F,$4F,$67,$A1,
676           $9A,$76,$78,$D4,$23,$4B,$0B,$F4,$A2,$EB,$C0,$8A,$A2,$35,$B9,$78,
677           $8D,$B7,$87,$16,$1F,$66,$17,$02,$28,$65,$C0,$EF,$9A,$A5,$33,$80,
678           $2D,$13,$6C,$DB,$C7,$AE,$BA,$53,$2A,$CF,$1B,$E1,$83,$B0,$29,$5A,
679           $B0,$E3,$3A,$2E,$F6,$9B,$E3,$56,$DA,$AF,$30,$96,$87,$15,$3E,$2F,
680           $99,$A1,$24,$36,$09,$D6,$03,$12,$6A,$8C,$82,$3E,$88,$43,$E4,$59,
681           $BF,$C7,$2B,$30,$69,$1C,$DC,$C3,$DD,$B2,$7C,$F0,$28,$AF,$D5,$1E,
682           $44,$37,$EE,$3B,$71,$C0,$C1,$EC,$87,$A9,$34,$36,$F0,$C2,$47,$B7,
683           $E8,$C5,$0C,$E9,$68,$25,$C9,$70,$29,$99,$7A,$74,$C3,$18,$AF,$AC,
684           $AA,$18,$A0,$18,$0B,$C7,$F2,$F0,$F1,$C5,$E7,$EF,$1A,$2D,$18,$3A,
685           $C7,$EE,$7E,$49,$15,$C3,$B6,$8C,$30,$97,$8A,$B6,$C4,$28,$19,$34,
686           $41,$DF,$47,$05,$B7,$22,$CE,$25,$A0,$8A,$1F,$AD,$CA,$0E,$EF,$1F,
687           $AF,$E8,$3A,$DF,$13,$02,$1D,$52,$0D,$E5,$C8,$27,$FF,$9A,$97,$B7,
688           $55,$46,$19,$3A,$9B,$92,$3F,$05,$90,$38,$5D,$C4,$BF,$F7,$C4,$9D,
689           $49,$15,$B5,$A3,$65,$DB,$4C,$84,$DD,$CB,$18,$5D,$E8,$F9,$EE,$B3,
690           $34,$96,$5A,$42,$F1,$38,$1C,$8B,$AD,$C2,$2B,$A1,$F8,$EE,$4C,$0E,
691           $4D,$AA,$F7,$A8,$8E,$7F,$42,$DD,$B8,$14,$8F,$3B,$F8,$D3,$B8,$D7,
692           $4F,$09,$81,$55,$A3,$7C,$B4,$CB,$27,$87,$6B,$85,$DA,$60,$2E,$5C,
693           $78,$9C,$10,$E0,$3B,$E7,$34,$07,$BA,$B8,$C4,$92,$13,$F8,$C7,$4E,
694           $12,$66,$CE,$9B,$11,$28,$6E,$67,$4C,$A9,$C1,$0C,$9C,$99,$55,$04,
695           $9A,$66,$E9,$05,$1D,$9A,$2B,$1F,$C9,$AF,$E2,$67,$98,$E9,$CE,$C6);
696 begin
697   writeln('** Test SHAKE-256 / 4096 **');
698   write('Test 1, bit length  0: ');
699   err := SHA3_Init(state,__SHAKE_256);
700   if err=0 then err := SHA3_FinalBit_LSB(state, msg1[0], 0,  @buf, 4096);
701   if err=0 then writeln(compmem(@dig1, @buf, sizeof(dig1)))
702   else writeln('Err: ', err);
703 
704   write('Test 2, bit length  5: ');
705   err := SHA3_Init(state,__SHAKE_256);
706   if err=0 then err := SHA3_FinalBit_LSB(state, msg2[0], 5,  @buf, 4096);
707   if err=0 then writeln(compmem(@dig2, @buf, sizeof(dig2)))
708   else writeln('Err: ', err);
709 
710   write('Test 3, bit length 30: ');
711   err := SHA3_Init(state,__SHAKE_256);
712   if err=0 then err := SHA3_Update(state, @msg3, 3);
713   if err=0 then err := SHA3_FinalBit_LSB(state, msg3[3], 6,  @buf, 4096);
714   if err=0 then writeln(compmem(@dig3, @buf, sizeof(dig3)))
715   else writeln('Err: ', err);
716 end;
717 
718 begin
719   writeln('Test SHA3 / SHAKE for NIST test vectors   (c) 2014-2015 W. Ehrhardt');
720   writeln('See http://csrc.nist.gov/groups/ST/toolkit/examples.html');
721   writeln('-------------------------------------------------------------------');
722   test_sha3_224;
723   writeln;
724   test_sha3_256;
725   writeln;
726   test_sha3_384;
727   writeln;
728   test_sha3_512;
729   writeln;
730   test_sha3_shake128;
731   writeln;
732   test_sha3_shake256;
733 end.
734 
735