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