1 {AES 'Monte Carlo Self Tests' from rijndael-vals.zip,  we 06.2006}
2 
3 program T_MCST;
4 
5 {$i STD.INC}
6 
7 {$ifdef APPCONS}
8   {$apptype console}
9 {$endif}
10 
11 {$ifndef FPC}
12   {$N+}
13 {$endif}
14 
15 {$r+}
16 uses
17   {$ifdef WINCRT}
18      wincrt,
19   {$endif}
20   BTypes,aes_type,aes_base,aes_cbc,aes_ecb,mem_util;
21 
22 const
23   IMAX = 399;
24   JMAX = 9999;
25 
26 {---------------------------------------------------------------------------}
27 procedure ECBEncr;
28   {-Reproduce ecb_e_m.txt}
29 
30   procedure TestBits(kbits: word; ts: BString);
31     {-generate part for keysize kbits}
32   var
33     i,j,Err: Integer;
34     PT, CT: TAESBlock;
35     Key: array[0..31] of byte;
36     ctx: TAESContext;
37   begin
38     write(kbits, ' bits ');
39     fillchar(Key, sizeof(Key), 0);
40     fillchar(PT, sizeof(PT), 0);
41     CT := PT;
42     for i:=0 to IMAX do begin
43       if i and 7 = 0 then write('.');
44       Err := AES_ECB_Init_Encr(Key, kbits, ctx);
45       if Err<>0 then begin
46         writeln('AES_ECB_Init_Encr error: ', Err);
47         halt;
48       end;
49       for j:=0 to JMAX do begin
50         PT := CT;
51         Err := AES_ECB_Encrypt(@CT, @CT, 16, ctx);
52         if Err<>0 then begin
53           writeln('AES_ECB_Encrypt error: ', Err);
54           halt;
55         end;
56       end;
57       case kbits of
58         128: for j:=0 to 15 do Key[j] := Key[j] xor CT[j];
59         192: begin
60                for j:=0 to  7 do Key[j]   := Key[j]   xor PT[8+j];
61                for j:=0 to 15 do Key[j+8] := Key[j+8] xor CT[j];
62              end;
63         256: begin
64                for j:=0 to 15 do Key[j]    := Key[j]    xor PT[j];
65                for j:=0 to 15 do Key[j+16] := Key[j+16] xor CT[j];
66              end;
67       end;
68     end;
69     writeln(' ', ts=HexStr(@CT,16));
70   end;
71 
72 const
73   CT128='A04377ABE259B0D0B5BA2D40A501971B';
74   CT192='4E46F8C5092B29E29A971A0CD1F610FB';
75   CT256='1F6763DF807A7E70960D4CD3118E601A';
76 begin
77   writeln('ecb_e_m');
78   TestBits(128, CT128);
79   TestBits(192, CT192);
80   TestBits(256, CT256);
81 end;
82 
83 {---------------------------------------------------------------------------}
84 procedure ECBDecr;
85   {-Reproduce ecb_d_m.txt}
86 
87   procedure TestBits(kbits: word; ts: BString);
88     {-generate part for keysize kbits}
89   var
90     i,j,Err: Integer;
91     PT, CT: TAESBlock;
92     Key: array[0..31] of byte;
93     ctx: TAESContext;
94   begin
95     write(kbits, ' bits ');
96     fillchar(Key, sizeof(Key), 0);
97     fillchar(PT, sizeof(PT), 0);
98     CT := PT;
99     for i:=0 to IMAX do begin
100       if i and 7 = 0 then write('.');
101       Err := AES_ECB_Init_Decr(Key, kbits, ctx);
102       if Err<>0 then begin
103         writeln('AES_ECB_Init_Decr error: ', Err);
104         halt;
105       end;
106       for j:=0 to JMAX do begin
107         PT := CT;
108         Err := AES_ECB_Decrypt(@CT, @CT, 16, ctx);
109         if Err<>0 then begin
110           writeln('AES_ECB_Decrypt error: ', Err);
111           halt;
112         end;
113       end;
114       case kbits of
115         128: for j:=0 to 15 do Key[j] := Key[j] xor CT[j];
116         192: begin
117                for j:=0 to  7 do Key[j]   := Key[j]   xor PT[8+j];
118                for j:=0 to 15 do Key[j+8] := Key[j+8] xor CT[j];
119              end;
120         256: begin
121                for j:=0 to 15 do Key[j]    := Key[j]    xor PT[j];
122                for j:=0 to 15 do Key[j+16] := Key[j+16] xor CT[j];
123              end;
124       end;
125     end;
126     writeln(' ', ts=HexStr(@CT,16));
127   end;
128 
129 const
130   PT128='F5BF8B37136F2E1F6BEC6F572021E3BA';
131   PT192='F1A81B68F6E5A6271A8CB24E7D9491EF';
132   PT256='4DE0C6DF7CB1697284604D60271BC59A';
133 begin
134   writeln('ecb_d_m');
135   TestBits(128, PT128);
136   TestBits(192, PT192);
137   TestBits(256, PT256);
138 end;
139 
140 
141 {---------------------------------------------------------------------------}
142 procedure CBCEncr;
143   {-Reproduce cbc_e_m.txt}
144 
145   procedure TestBits(kbits: word; ts: BString);
146     {-generate part for keysize kbits}
147   var
148     i,j,Err: Integer;
149     IV, PT, CT: TAESBlock;
150     Key: array[0..31] of byte;
151     ctx: TAESContext;
152   begin
153     write(kbits, ' bits ');
154     fillchar(Key, sizeof(Key), 0);
155     fillchar(PT, sizeof(PT), 0);
156     fillchar(IV, sizeof(IV), 0);
157     CT := PT;
158     for i:=0 to IMAX do begin
159       if i and 7 = 0 then write('.');
160       Err := AES_CBC_Init_Encr(Key, kbits, IV, ctx);
161       if Err<>0 then begin
162         writeln('AES_CBC_Init_Encr error: ', Err);
163         halt;
164       end;
165       for j:=0 to JMAX do begin
166         CT := PT;
167         PT := ctx.IV;
168         Err := AES_CBC_Encrypt(@CT, @CT, 16, ctx);
169         if Err<>0 then begin
170           writeln('AES_CBC_Encrypt error: ', Err);
171           halt;
172         end;
173       end;
174       IV := CT;
175       case kbits of
176         128: for j:=0 to 15 do Key[j] := Key[j] xor CT[j];
177         192: begin
178                for j:=0 to  7 do Key[j]   := Key[j]   xor PT[8+j];
179                for j:=0 to 15 do Key[j+8] := Key[j+8] xor CT[j];
180              end;
181         256: begin
182                for j:=0 to 15 do Key[j]    := Key[j]    xor PT[j];
183                for j:=0 to 15 do Key[j+16] := Key[j+16] xor CT[j];
184              end;
185       end;
186     end;
187     writeln(' ',ts=HexStr(@CT,16));
188   end;
189 
190 const
191   CT128='2F844CBF78EBA70DA7A49601388F1AB6';
192   CT192='BA50C94440C04A8C0899D42658E25437';
193   CT256='C0FEFFF07506A0B4CD7B8B0CF25D3664';
194 begin
195   writeln('cbc_e_m');
196   TestBits(128, CT128);
197   TestBits(192, CT192);
198   TestBits(256, CT256);
199 end;
200 
201 
202 {---------------------------------------------------------------------------}
203 procedure CBCDecr;
204   {-Reproduce cbc_d_m.txt}
205 
206   procedure TestBits(kbits: word; ts: BString);
207     {-generate part for keysize kbits}
208   var
209     i,j,Err: Integer;
210     IV, PT, CT: TAESBlock;
211     Key: array[0..31] of byte;
212     ctx: TAESContext;
213   begin
214     write(kbits, ' bits ');
215     fillchar(Key, sizeof(Key), 0);
216     fillchar(PT, sizeof(PT), 0);
217     fillchar(IV, sizeof(IV), 0);
218     for i:=0 to IMAX do begin
219       if i and 7 = 0 then write('.');
220       CT := PT;
221       Err := AES_CBC_Init_Decr(Key, kbits, IV, ctx);
222       if Err<>0 then begin
223         writeln('AES_CBC_Init_Decr error: ', Err);
224         halt;
225       end;
226       PT := CT;
227       for j:=0 to JMAX do begin
228         CT := PT;
229         Err := AES_CBC_Decrypt(@PT, @PT, 16, ctx);
230         if Err<>0 then begin
231           writeln('AES_CBC_Decrypt error: ', Err);
232           halt;
233         end;
234       end;
235       IV := ctx.IV;
236       case kbits of
237         128: for j:=0 to 15 do Key[j] := Key[j] xor PT[j];
238         192: begin
239                for j:=0 to  7 do Key[j]   := Key[j]   xor CT[8+j];
240                for j:=0 to 15 do Key[j+8] := Key[j+8] xor PT[j];
241              end;
242         256: begin
243                for j:=0 to 15 do Key[j]    := Key[j]    xor CT[j];
244                for j:=0 to 15 do Key[j+16] := Key[j+16] xor PT[j];
245              end;
246       end;
247     end;
248     writeln(' ',ts=HexStr(@PT,16));
249   end;
250 
251 const
252   PT128='9B8FB71E035CEFF9CBFA1346E5ACEFE0';
253   PT192='6342BFDDD2F6610350458B6695463484';
254   PT256='CD6429CF3F81F8B4F82BC627A8283096';
255 begin
256   writeln('cbc_d_m');
257   TestBits(128, PT128);
258   TestBits(192, PT192);
259   TestBits(256, PT256);
260 end;
261 
262 
263 begin
264   writeln('T_MCST - AES Monte Carlo Self Tests     (c) 2006 W.Ehrhardt');
265   HexUpper := true;
266   ECBEncr;
267   ECBDecr;
268   CBCEncr;
269   CBCDecr;
270 end.
271 
272