307 lines
8.1 KiB
Plaintext
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.
|