BSOne.SFC/Tocsg.Lib/VCL/EncLib/AES/t_aes_xl.pas

307 lines
8.1 KiB
Plaintext

{-Test prog for AES modes, ILen > $FFFF for 32 bit, we July 2010}
program T_AES_XL;
{$i STD.INC}
{$ifdef APPCONS}
{$apptype console}
{$endif}
{$ifndef FPC}
{$N+}
{$endif}
uses
{$ifdef WINCRT}
wincrt,
{$endif}
{$ifdef USEDLL}
{$ifdef VirtualPascal}
AES_Intv,
{$else}
AES_Intf,
{$endif}
{$else}
AES_Type, AES_CTR, AES_CFB, AES_CFB8, AES_OFB, AES_CBC, AES_ECB, AES_OMAC, AES_EAX,
{$endif}
BTypes, mem_util;
const
key128 : array[0..15] of byte = ($2b,$7e,$15,$16,$28,$ae,$d2,$a6,
$ab,$f7,$15,$88,$09,$cf,$4f,$3c);
IV : array[0..15] of byte = ($00,$01,$02,$03,$04,$05,$06,$07,
$08,$09,$0a,$0b,$0c,$0d,$0e,$0f);
CTR : array[0..15] of byte = ($f0,$f1,$f2,$f3,$f4,$f5,$f6,$f7,
$f8,$f9,$fa,$fb,$fc,$fd,$fe,$ff);
{$ifndef BIT16}
const BSIZE=400000;
{$else}
const BSIZE=10000;
{$endif}
const
BS1 = AESBLKSIZE*(BSIZE div (2*AESBLKSIZE));
type
TBuf = array[0..BSIZE-1] of byte;
var
pt, ct, dt: Tbuf;
var
Context: TAESContext;
{---------------------------------------------------------------------------}
function test(px,py: pointer): Str255;
begin
if compmemxl(px,py,sizeof(TBuf)) then test := 'OK' else test := 'Error';
end;
{---------------------------------------------------------------------------}
procedure TestCFB;
begin
fillchar(dt,sizeof(dt),0);
if AES_CFB_Init(key128, 8*sizeof(key128), TAESBlock(IV), context)<>0 then begin
writeln('*** Error CFB_Init');
exit;
end;
if AES_CFB_Encrypt(@pt, @ct, BS1, context)<>0 then begin
writeln('*** Error CFB_Encrypt 1');
exit;
end;
if AES_CFB_Encrypt(@pt[BS1], @ct[BS1], sizeof(TBuf)-BS1, context)<>0 then begin
writeln('*** Error CFB_Encrypt 2');
exit;
end;
if AES_CFB_Init(key128, 8*sizeof(key128), TAESBlock(IV), context)<>0 then begin
writeln('*** Error CFB_Init');
exit;
end;
if AES_CFB_Decrypt(@ct, @dt, sizeof(TBuf), context)<>0 then begin
writeln('*** Error CFB_Decrypt');
exit;
end;
writeln('CFB test: ', test(@pt,@dt));
end;
{---------------------------------------------------------------------------}
procedure TestCFB8;
begin
fillchar(dt,sizeof(dt),0);
if AES_CFB8_Init(key128, 8*sizeof(key128), TAESBlock(IV), context)<>0 then begin
writeln('*** Error CFB8_Init');
exit;
end;
if AES_CFB8_Encrypt(@pt, @ct, BS1, context)<>0 then begin
writeln('*** Error CFB8_Encrypt 1');
exit;
end;
if AES_CFB8_Encrypt(@pt[BS1], @ct[BS1], sizeof(TBuf)-BS1, context)<>0 then begin
writeln('*** Error CFB8_Encrypt 2');
exit;
end;
if AES_CFB8_Init(key128, 8*sizeof(key128), TAESBlock(IV), context)<>0 then begin
writeln('*** Error CFB8_Init');
exit;
end;
if AES_CFB8_Decrypt(@ct, @dt, sizeof(TBuf), context)<>0 then begin
writeln('*** Error CFB8_Decrypt');
exit;
end;
writeln('CFB8 test: ', test(@pt,@dt));
end;
{---------------------------------------------------------------------------}
procedure TestCBC;
begin
fillchar(dt,sizeof(dt),0);
if AES_CBC_Init_Encr(key128, 8*sizeof(key128), TAESBlock(IV), context)<>0 then begin
writeln('*** Error CBC_Init_Encr');
exit;
end;
if AES_CBC_Encrypt(@pt, @ct, BS1, context)<>0 then begin
writeln('*** Error CBC_Encrypt 1');
exit;
end;
if AES_CBC_Encrypt(@pt[BS1], @ct[BS1], sizeof(TBuf)-BS1, context)<>0 then begin
writeln('*** Error CBC_Encrypt 2');
exit;
end;
if AES_CBC_Init_Decr(key128, 8*sizeof(key128), TAESBlock(IV), context)<>0 then begin
writeln('*** Error CBC_Init_Decr');
exit;
end;
if AES_CBC_Decrypt(@ct, @dt, sizeof(TBuf), context)<>0 then begin
writeln('*** Error CBC_Decrypt');
exit;
end;
writeln('CBC test: ', test(@pt,@dt));
end;
{---------------------------------------------------------------------------}
procedure TestECB;
begin
fillchar(dt,sizeof(dt),0);
if AES_ECB_Init_Encr(key128, 8*sizeof(key128), context)<>0 then begin
writeln('*** Error ECB_Init_Encr');
exit;
end;
if AES_ECB_Encrypt(@pt, @ct, BS1, context)<>0 then begin
writeln('*** Error ECB_Encrypt 1');
exit;
end;
if AES_ECB_Encrypt(@pt[BS1], @ct[BS1], sizeof(TBuf)-BS1, context)<>0 then begin
writeln('*** Error ECB_Encrypt 2');
exit;
end;
if AES_ECB_Init_Decr(key128, 8*sizeof(key128), context)<>0 then begin
writeln('*** Error ECB_Init_Decr');
exit;
end;
if AES_ECB_Decrypt(@ct, @dt, sizeof(TBuf), context)<>0 then begin
writeln('*** Error ECB_Decrypt');
exit;
end;
writeln('ECB test: ', test(@pt,@dt));
end;
{---------------------------------------------------------------------------}
procedure TestCTR;
begin
fillchar(dt,sizeof(dt),0);
if AES_CTR_Init(key128, 8*sizeof(key128), TAESBlock(CTR), context)<>0 then begin
writeln('*** Error CTR_Init');
exit;
end;
if AES_CTR_Encrypt(@pt, @ct, BS1, context)<>0 then begin
writeln('*** Error CTR_Encrypt 1');
exit;
end;
if AES_CTR_Encrypt(@pt[BS1], @ct[BS1], sizeof(TBuf)-BS1, context)<>0 then begin
writeln('*** Error CTR_Encrypt 2');
exit;
end;
if AES_CTR_Init(key128, 8*sizeof(key128), TAESBlock(CTR), context)<>0 then begin
writeln('*** Error CTR_Init');
exit;
end;
if AES_CTR_Decrypt(@ct, @dt, sizeof(TBuf), context)<>0 then begin
writeln('*** Error CTR_Decrypt');
exit;
end;
writeln('CTR test: ', test(@pt,@dt));
end;
{---------------------------------------------------------------------------}
procedure TestOFB;
begin
fillchar(dt,sizeof(dt),0);
if AES_OFB_Init(key128, 8*sizeof(key128), TAESBlock(IV), context)<>0 then begin
writeln('*** Error OFB_Init');
exit;
end;
if AES_OFB_Encrypt(@pt, @ct, BS1, context)<>0 then begin
writeln('*** Error OFB_Encrypt 1');
exit;
end;
if AES_OFB_Encrypt(@pt[BS1], @ct[BS1], sizeof(TBuf)-BS1, context)<>0 then begin
writeln('*** Error OFB_Encrypt 2');
exit;
end;
if AES_OFB_Init(key128, 8*sizeof(key128), TAESBlock(IV), context)<>0 then begin
writeln('*** Error OFB_Init');
exit;
end;
if AES_OFB_Decrypt(@ct, @dt, sizeof(TBuf), context)<>0 then begin
writeln('*** Error OFB_Decrypt');
exit;
end;
writeln('OFB test: ', test(@pt,@dt));
end;
{---------------------------------------------------------------------------}
procedure TestEAX;
const
hex32: array[1..32] of byte = ($00,$01,$02,$03,$04,$05,$06,$07,
$08,$09,$0a,$0b,$0c,$0d,$0e,$0f,
$10,$11,$12,$13,$14,$15,$16,$17,
$18,$19,$1a,$1b,$1c,$1d,$1e,$1f);
var
ctx: TAES_EAXContext;
te,td: TAESBlock;
begin
fillchar(dt,sizeof(dt),0);
if AES_EAX_Init(key128, 128, hex32, sizeof(hex32), ctx) <>0 then begin
writeln('*** Error EAX_Init');
exit;
end;
if AES_EAX_Provide_Header(@hex32, sizeof(hex32),ctx) <>0 then begin
writeln('*** Error EAX_Provide_Header');
exit;
end;
if AES_EAX_Encrypt(@pt, @ct, BS1, ctx) <>0 then begin
writeln('*** Error EAX_Encrypt 1');
exit;
end;
if AES_EAX_Encrypt(@pt[BS1], @ct[BS1], sizeof(TBuf)-BS1, ctx) <>0 then begin
writeln('*** Error EAX_Encrypt 2');
exit;
end;
AES_EAX_Final(te, ctx);
if AES_EAX_Init(key128, 128, hex32, sizeof(hex32), ctx) <>0 then begin
writeln('*** Error EAX_Init');
exit;
end;
if AES_EAX_Provide_Header(@hex32, sizeof(hex32),ctx) <>0 then begin
writeln('*** Error EAX_Provide_Header');
exit;
end;
if AES_EAX_Decrypt(@ct, @dt, sizeof(TBuf), ctx) <>0 then begin
writeln('*** Error EAX_Encrypt');
exit;
end;
AES_EAX_Final(td, ctx);
if not compmemxl(@pt, @dt, sizeof(TBuf)) then begin
writeln('*** Dec EAX diff buf');
exit;
end;
if not compmem(@te, @td, sizeof(td)) then begin
writeln('*** Dec EAX diff tag');
exit;
end;
write('EAX test: OK');
end;
begin
{$ifdef USEDLL}
writeln('Test program for AES_DLL V',AES_DLL_Version,' (C) 2010 W.Ehrhardt');
{$else}
writeln('Test program for AES modes (C) 2010 W.Ehrhardt');
{$endif}
writeln('Test of encrypt/decrypt routines using single calls with ',BS1,'/',BSize, ' bytes.');
RandMemXL(@pt, sizeof(TBuf));
TestCBC;
TestCFB;
TestCFB8;
TestCTR;
TestECB;
TestOFB;
TestEAX;
writeln;
end.