1 {-Test prog for AES CTR Seek, (c) we July 2010}
2 
3 program T_AES_CS;
4 
5 {$i STD.INC}
6 
7 {$ifdef APPCONS}
8   {$apptype console}
9 {$endif}
10 
11 {$ifdef BIT16}
12 {$N+,F+}
13 {$endif}
14 
15 
16 uses
17   {$ifdef WINCRT}
18      wincrt,
19   {$endif}
20   HRTimer,
21   {$ifdef USEDLL}
22     {$ifdef VirtualPascal}
23       AES_Intv;
24     {$else}
25       AES_Intf;
26     {$endif}
27   {$else}
28     aes_type, aes_ctr;
29   {$endif}
30 
31 {USE_INT64: if Int64 and errout available}
32 
33 {$ifdef FPC}
34   {$ifdef FPC2Plus}
35     {$define USE_INT64}
36   {$endif}
37 {$endif}
38 {$ifdef CONDITIONALEXPRESSIONS}  {D6+}
39   {$define USE_INT64}
40 {$endif}
41 
42 
43 {---------------------------------------------------------------------------}
44 procedure My_IncMSBFull(var CTR: TAESBlock);
45 {$ifdef USEDLL} stdcall; {$endif}
46   {-Increment CTR[15]..CTR[0]}
47 var
48   j: integer;
49 begin
50   {This is the same as the standard pre-defined function, but it cannot be }
51   {recognized by its @address and therefore the seek loop will be performed}
52   for j:=15 downto 0 do begin
53     if CTR[j]=$FF then CTR[j] := 0
54     else begin
55       inc(CTR[j]);
56       exit;
57     end;
58   end;
59 end;
60 
61 
62 var
63   HR: THRTimer;
64 
65 var
66   ctx1, ctx2: TAESContext;
67   Err : integer;
68 
69 {$ifdef USE_INT64}
70 const
71   BSIZE=$8000;
72 {$else}
73 const
74   BSIZE=8192;
75 {$endif}
76 
77 var
78   pbuf, cbuf1, cbuf2: array[0..BSIZE-1] of byte;
79 
80 {---------------------------------------------------------------------------}
81 procedure CheckError;
82 begin
83   if Err<>0 then begin
84     writeln('Error ',Err);
85     halt;
86   end;
87 end;
88 
89 
90 {---------------------------------------------------------------------------}
91 procedure randomtest(userdef: boolean);
92 const
93   key128 : array[0..15] of byte = ($2b,$7e,$15,$16,$28,$ae,$d2,$a6,
94                                    $ab,$f7,$15,$88,$09,$cf,$4f,$3c);
95 
96   key192 : array[0..23] of byte = ($8e,$73,$b0,$f7,$da,$0e,$64,$52,
97                                    $c8,$10,$f3,$2b,$80,$90,$79,$e5,
98                                    $62,$f8,$ea,$d2,$52,$2c,$6b,$7b);
99 
100   key256 : array[0..31] of byte = ($60,$3d,$eb,$10,$15,$ca,$71,$be,
101                                    $2b,$73,$ae,$f0,$85,$7d,$77,$81,
102                                    $1f,$35,$2c,$07,$3b,$61,$08,$d7,
103                                    $2d,$98,$10,$a3,$09,$14,$df,$f4);
104 
105      CTR : TAESBlock =            ($f0,$f1,$f2,$f3,$f4,$f5,$f6,$f7,
106                                    $f8,$f9,$fa,$fb,$fc,$fd,$fe,$ff);
107 
108   plain  : array[0..63] of byte = ($6b,$c1,$be,$e2,$2e,$40,$9f,$96,
109                                    $e9,$3d,$7e,$11,$73,$93,$17,$2a,
110                                    $ae,$2d,$8a,$57,$1e,$03,$ac,$9c,
111                                    $9e,$b7,$6f,$ac,$45,$af,$8e,$51,
112                                    $30,$c8,$1c,$46,$a3,$5c,$e4,$11,
113                                    $e5,$fb,$c1,$19,$1a,$0a,$52,$ef,
114                                    $f6,$9f,$24,$45,$df,$4f,$9b,$17,
115                                    $ad,$2b,$41,$7b,$e6,$6c,$37,$10);
116 
117      ct1 : array[0..63] of byte = ($87,$4d,$61,$91,$b6,$20,$e3,$26,
118                                    $1b,$ef,$68,$64,$99,$0d,$b6,$ce,
119                                    $98,$06,$f6,$6b,$79,$70,$fd,$ff,
120                                    $86,$17,$18,$7b,$b9,$ff,$fd,$ff,
121                                    $5a,$e4,$df,$3e,$db,$d5,$d3,$5e,
122                                    $5b,$4f,$09,$02,$0d,$b0,$3e,$ab,
123                                    $1e,$03,$1d,$da,$2f,$be,$03,$d1,
124                                    $79,$21,$70,$a0,$f3,$00,$9c,$ee);
125 
126      ct2 : array[0..63] of byte = ($1a,$bc,$93,$24,$17,$52,$1c,$a2,
127                                    $4f,$2b,$04,$59,$fe,$7e,$6e,$0b,
128                                    $09,$03,$39,$ec,$0a,$a6,$fa,$ef,
129                                    $d5,$cc,$c2,$c6,$f4,$ce,$8e,$94,
130                                    $1e,$36,$b2,$6b,$d1,$eb,$c6,$70,
131                                    $d1,$bd,$1d,$66,$56,$20,$ab,$f7,
132                                    $4f,$78,$a7,$f6,$d2,$98,$09,$58,
133                                    $5a,$97,$da,$ec,$58,$c6,$b0,$50);
134 
135      ct3 : array[0..63] of byte = ($60,$1e,$c3,$13,$77,$57,$89,$a5,
136                                    $b7,$a7,$f5,$04,$bb,$f3,$d2,$28,
137                                    $f4,$43,$e3,$ca,$4d,$62,$b5,$9a,
138                                    $ca,$84,$e9,$90,$ca,$ca,$f5,$c5,
139                                    $2b,$09,$30,$da,$a2,$3d,$e9,$4c,
140                                    $e8,$70,$17,$ba,$2d,$84,$98,$8d,
141                                    $df,$c9,$c5,$8d,$b6,$7a,$ad,$a6,
142                                    $13,$c2,$dd,$08,$45,$79,$41,$a6);
143 
144 var
145   ct: array[0..255] of byte;
146   SO: integer;
147 begin
148 
149   writeln('NIST vector test: 128 bit key');
150   Err := AES_CTR_Init(key128, 128, CTR, ctx2);
151   CheckError;
152   if userdef then begin
153     Err := AES_SetIncProc({$ifdef FPC_ProcVar}@{$endif}My_IncMSBFull, ctx2);
154     CheckError;
155   end;
156   for SO:=0 to 63 do begin
157     write('.');
158     Err := AES_CTR_Seek(CTR, SO, 0, ctx2);
159     CheckError;
160     Err := AES_CTR_Encrypt(@plain[SO], @ct[SO], 1, ctx2);
161     if ct[SO]<>ct1[SO] then begin
162       writeln('Diff:  SO=',SO:2,'  ct1[SO]=',ct1[SO]:3,'  ct[SO]=',ct[SO]:3);
163     end;
164   end;
165   writeln(' done');
166 
167   writeln('NIST vector test: 192 bit key');
168   Err := AES_CTR_Init(key192, 192, CTR, ctx2);
169   CheckError;
170   for SO:=0 to 63 do begin
171     write('.');
172     {$ifdef USE_INT64}
173       Err := AES_CTR_Seek64(CTR, SO, ctx2);
174     {$else}
175       Err := AES_CTR_Seek(CTR, SO, 0, ctx2);
176     {$endif}
177     CheckError;
178     Err := AES_CTR_Encrypt(@plain[SO], @ct[SO], 1, ctx2);
179     if ct[SO]<>ct2[SO] then begin
180       writeln('Diff:  SO=',SO:2,'  ct2[SO]=',ct2[SO]:3,'  ct[SO]=',ct[SO]:3);
181     end;
182   end;
183   writeln(' done');
184 
185   writeln('NIST vector test: 256 bit key');
186   Err := AES_CTR_Init(key256, 256, CTR, ctx2);
187   CheckError;
188   for SO:=63 downto 0 do begin
189     write('.');
190     Err := AES_CTR_Seek(CTR, SO, 0, ctx2);
191     CheckError;
192     Err := AES_CTR_Encrypt(@plain[SO], @ct[SO], 1, ctx2);
193     if ct[SO]<>ct3[SO] then begin
194       writeln('Diff:  SO=',SO:2,'  ct3[SO]=',ct2[SO]:3,'  ct[SO]=',ct[SO]:3);
195     end;
196   end;
197   writeln(' done');
198 end;
199 
200 
201 {---------------------------------------------------------------------------}
202 procedure bigtest(n: integer);
203 const
204   key128 : array[0..15] of byte = ($2b,$7e,$15,$16,$28,$ae,$d2,$a6,
205                                    $ab,$f7,$15,$88,$09,$cf,$4f,$3c);
206      CTR : TAESBlock =            ($ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,
207                                    $ff,$ff,$ff,$ff,$fd,$fc,$fb,$fa);
208 
209 {$ifdef USE_INT64}
210 var
211   ofs: int64;
212 const
213   oma = int64($3FFFFFFF)*$100;  {avoid braindamaged D2 error}
214 {$else}
215 var
216   ofs: longint;
217 const
218   oma = $6FFFFFFF;
219 {$endif}
220 var
221   i: integer;
222 begin
223   for i:=0 to BSIZE-1 do pbuf[i] := random(256);
224   Err := AES_CTR_Init(key128, 128, CTR, ctx1);
225   CheckError;
226   case n of
227     1: begin
228          writeln('IncProc = AES_IncMSBFull,   max. offset = ',oma);
229          {$ifdef USE_INT64}
230            writeln(erroutput, 'IncProc = AES_IncMSBFull,   max. offset = ',oma);
231          {$endif}
232          {$ifdef FPC_ProcVar}
233            err := AES_SetIncProc(@AES_IncMSBFull, ctx1);
234          {$else}
235            err := AES_SetIncProc(AES_IncMSBFull, ctx1);
236          {$endif}
237        end;
238     2: begin
239          writeln('IncProc = AES_IncLSBFull,   max. offset = ',oma);
240          {$ifdef USE_INT64}
241            writeln(erroutput, 'IncProc = AES_IncLSBFull,   max. offset = ',oma);
242          {$endif}
243          {$ifdef FPC_ProcVar}
244            err := AES_SetIncProc(@AES_IncLSBFull, ctx1);
245          {$else}
246            err := AES_SetIncProc(AES_IncLSBFull, ctx1);
247          {$endif}
248        end;
249 
250     3: begin
251          writeln('IncProc = AES_IncMSBPart,   max. offset = ',oma);
252          {$ifdef USE_INT64}
253            writeln(erroutput, 'IncProc = AES_IncMSBPart,   max. offset = ',oma);
254          {$endif}
255          {$ifdef FPC_ProcVar}
256            err := AES_SetIncProc(@AES_IncMSBPart, ctx1);
257          {$else}
258            err := AES_SetIncProc(AES_IncMSBPart, ctx1);
259          {$endif}
260        end;
261 
262     4: begin
263          writeln('IncProc = AES_IncLSBPart,   max. offset = ',oma);
264          {$ifdef USE_INT64}
265            writeln(erroutput, 'IncProc = AES_IncLSBPart,   max. offset = ',oma);
266          {$endif}
267          {$ifdef FPC_ProcVar}
268            err := AES_SetIncProc(@AES_IncLSBPart, ctx1);
269          {$else}
270            err := AES_SetIncProc(AES_IncLSBPart, ctx1);
271          {$endif}
272        end;
273   end;
274 
275   CheckError;
276   ofs := 0;
277   ReStartTimer(HR);
278   repeat
279     for i:=1 to 99 do begin
280       Err := AES_CTR_Encrypt(@pbuf, @cbuf1, BSIZE, ctx1);
281       ofs := ofs + BSIZE;
282     end;
283     {$ifdef USE_INT64}
284       write(erroutput, 100.0*ofs/oma:1:3,'%'#13);
285     {$else}
286       write(100.0*ofs/oma:1:3,'%'#13);
287     {$endif}
288     Err := AES_CTR_Encrypt(@pbuf, @cbuf1, BSIZE, ctx1);
289     CheckError;
290     i := random(BSIZE);
291     Err := AES_CTR_Init(key128, 128, CTR, ctx2);
292     CheckError;
293     case n of
294       1: begin
295           (*
296            {$ifdef FPC_ProcVar}
297              err := AES_SetIncProc(@AES_IncMSBFull, ctx2);
298            {$else}
299              err := AES_SetIncProc(AES_IncMSBFull, ctx2);
300            {$endif}
301           *)
302          end;
303       2: begin
304            {$ifdef FPC_ProcVar}
305              err := AES_SetIncProc(@AES_IncLSBFull, ctx2);
306            {$else}
307              err := AES_SetIncProc(AES_IncLSBFull, ctx2);
308            {$endif}
309          end;
310 
311       3: begin
312            {$ifdef FPC_ProcVar}
313              err := AES_SetIncProc(@AES_IncMSBPart, ctx2);
314            {$else}
315              err := AES_SetIncProc(AES_IncMSBPart, ctx2);
316            {$endif}
317          end;
318 
319       4: begin
320            {$ifdef FPC_ProcVar}
321              err := AES_SetIncProc(@AES_IncLSBPart, ctx2);
322            {$else}
323              err := AES_SetIncProc(AES_IncLSBPart, ctx2);
324            {$endif}
325          end;
326       else begin
327              writeln('Invalid n');
328              halt;
329            end;
330     end;
331     CheckError;
332     {$ifdef USE_INT64}
333       Err := AES_CTR_Seek64(CTR, ofs+i, ctx2);
334     {$else}
335       Err := AES_CTR_Seek(CTR, ofs+i, 0, ctx2);
336     {$endif}
337     CheckError;
338     Err := AES_CTR_Encrypt(@pbuf[i], @cbuf2[i], 1, ctx2);
339     CheckError;
340     if cbuf1[i]<>cbuf2[i] then begin
341       writeln('Diff:  Offset=',ofs+i,'  cbuf1[]=',cbuf1[i]:3,'  cbuf2[]=',cbuf2[i]:3);
342       halt;
343     end;
344     ofs := ofs + BSIZE;
345   until ofs>oma;
346   writeln('Done - no differences.');
347   writeln('Time [s]: ', ReadSeconds(HR):1:3);
348 end;
349 
350 var
351   {$ifdef D12Plus}
352     s: string;
353   {$else}
354     s: string[10];
355   {$endif}
356 
357 begin
358   writeln('Test program "AES CTR Seek"    (C) 2010-2017  W.Ehrhardt');
359   {$ifdef USEDLL}
360     writeln('DLL Version: ',AES_DLL_Version);
361   {$endif}
362   writeln;
363   writeln('Test using standard AES_IncMSBFull');
364   randomtest(false);
365   writeln;
366   writeln('Test using user-defines My_IncMSBFull');
367   randomtest(true);
368   writeln;
369   StartTimer(HR);
370   s := paramstr(1);
371   if s='big' then begin
372     bigtest(1);
373     bigtest(2);
374     bigtest(3);
375     bigtest(4);
376   end;
377 end.
378