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