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

139 lines
4.7 KiB
Plaintext

{-Test program for CMAC, (c) we 07.2006, essentially OMAC1 part of T_OMAC}
program T_CMAC;
{$i STD.INC}
{$ifdef APPCONS}
{$apptype console}
{$endif}
{$ifdef J_OPT}
{$J+}
{$endif}
uses
{$ifdef WINCRT}
wincrt,
{$endif}
{$ifdef USEDLL}
{$ifdef VirtualPascal}
AES_Intv,
{$else}
AES_Intf,
{$endif}
{$else}
AES_Type, AES_CMAC,
{$endif}
Mem_Util;
(*
Keys, msg, and tag data taken from:
http://www.nuee.nagoya-u.ac.jp/labs/tiwata/omac/tv/omac1-tv.txt and
http://csrc.nist.gov/publications/nistpubs/800-38B/SP_800-38B.pdf
*)
const
key128 : array[0..15] of byte = ($2b,$7e,$15,$16,$28,$ae,$d2,$a6,
$ab,$f7,$15,$88,$09,$cf,$4f,$3c);
key192 : array[0..23] of byte = ($8e,$73,$b0,$f7,$da,$0e,$64,$52,
$c8,$10,$f3,$2b,$80,$90,$79,$e5,
$62,$f8,$ea,$d2,$52,$2c,$6b,$7b);
key256 : array[0..31] of byte = ($60,$3d,$eb,$10,$15,$ca,$71,$be,
$2b,$73,$ae,$f0,$85,$7d,$77,$81,
$1f,$35,$2c,$07,$3b,$61,$08,$d7,
$2d,$98,$10,$a3,$09,$14,$df,$f4);
const
msg : array[0..63] of byte = ($6b,$c1,$be,$e2,$2e,$40,$9f,$96,
$e9,$3d,$7e,$11,$73,$93,$17,$2a,
$ae,$2d,$8a,$57,$1e,$03,$ac,$9c,
$9e,$b7,$6f,$ac,$45,$af,$8e,$51,
$30,$c8,$1c,$46,$a3,$5c,$e4,$11,
$e5,$fb,$c1,$19,$1a,$0a,$52,$ef,
$f6,$9f,$24,$45,$df,$4f,$9b,$17,
$ad,$2b,$41,$7b,$e6,$6c,$37,$10);
const
tag00: TAESBlock = ($bb,$1d,$69,$29,$e9,$59,$37,$28,$7f,$a3,$7d,$12,$9b,$75,$67,$46);
tag01: TAESBlock = ($07,$0a,$16,$b4,$6b,$4d,$41,$44,$f7,$9b,$dd,$9d,$d0,$4a,$28,$7c);
tag02: TAESBlock = ($df,$a6,$67,$47,$de,$9a,$e6,$30,$30,$ca,$32,$61,$14,$97,$c8,$27);
tag03: TAESBlock = ($51,$f0,$be,$bf,$7e,$3b,$9d,$92,$fc,$49,$74,$17,$79,$36,$3c,$fe);
tag10: TAESBlock = ($d1,$7d,$df,$46,$ad,$aa,$cd,$e5,$31,$ca,$c4,$83,$de,$7a,$93,$67);
tag11: TAESBlock = ($9e,$99,$a7,$bf,$31,$e7,$10,$90,$06,$62,$f6,$5e,$61,$7c,$51,$84);
tag12: TAESBlock = ($8a,$1d,$e5,$be,$2e,$b3,$1a,$ad,$08,$9a,$82,$e6,$ee,$90,$8b,$0e);
tag13: TAESBlock = ($a1,$d5,$df,$0e,$ed,$79,$0f,$79,$4d,$77,$58,$96,$59,$f3,$9a,$11);
tag20: TAESBlock = ($02,$89,$62,$f6,$1b,$7b,$f8,$9e,$fc,$6b,$55,$1f,$46,$67,$d9,$83);
tag21: TAESBlock = ($28,$a7,$02,$3f,$45,$2e,$8f,$82,$bd,$4b,$f2,$8d,$8c,$37,$c3,$5c);
tag22: TAESBlock = ($aa,$f3,$d8,$f1,$de,$56,$40,$c2,$32,$f5,$b1,$69,$b9,$c9,$11,$e6);
tag23: TAESBlock = ($e1,$99,$21,$90,$54,$9f,$6e,$d5,$69,$6a,$2c,$05,$6c,$31,$54,$10);
var
ctx: TAESContext;
tag: TAESBlock;
{---------------------------------------------------------------------------}
procedure Test(var key; KL,ML: word; var st: TAESBlock; Hdr: string);
{-Test one CMAC example with key and message lenght ML, st: known tag }
{ tags are calculated two times: 1. single call of AES_CMAC_Update with}
{ complete msg, 2. AES_CMAC_Update for each byte of msg }
const
Res: array[boolean] of string[5] = ('Error', 'OK');
var
i: word;
begin
write(hdr);
if AES_CMAC_Init(key, KL, ctx)<>0 then begin
writeln('AES_CMAC_Init Error');
halt;
end;
if AES_CMAC_Update(@msg, ML, ctx)<>0 then begin
writeln('AES_CMAC_Update');
halt;
end;
AES_CMAC_Final(tag, ctx);
write(Res[CompMem(@tag, @st, sizeof(tag))]:8);
if AES_CMAC_Init(key, KL, ctx)<>0 then begin
writeln('AES_CMAC_Init Error');
halt;
end;
for i:=1 to ML do begin
if AES_CMAC_Update(@msg[i-1], 1, ctx)<>0 then begin
writeln('AES_CMAC_Update');
halt;
end;
end;
AES_CMAC_Final(tag, ctx);
writeln(Res[CompMem(@tag, @st, sizeof(tag))]:8);
end;
begin
writeln('Test program AES CMAC mode (C) 2004-2006 W.Ehrhardt');
{$ifdef USEDLL}
writeln('DLL Version: ',AES_DLL_Version);
{$endif}
writeln('KL/ML: Key/Message length in bits/bytes');
writeln('Single/Multi: process message with one/multiple call(s)');
writeln(' KL/ML Single Multi');
Test(key128, 128, 0, tag00, ' 128/00');
Test(key128, 128, 16, tag01, ' 128/16');
Test(key128, 128, 40, tag02, ' 128/40');
Test(key128, 128, 64, tag03, ' 128/64');
Test(key192, 192, 0, tag10, ' 192/00');
Test(key192, 192, 16, tag11, ' 192/16');
Test(key192, 192, 40, tag12, ' 192/40');
Test(key192, 192, 64, tag13, ' 192/64');
Test(key256, 256, 0, tag20, ' 256/00');
Test(key256, 256, 16, tag21, ' 256/16');
Test(key256, 256, 40, tag22, ' 256/40');
Test(key256, 256, 64, tag23, ' 256/64');
end.