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

958 lines
45 KiB
Plaintext

{-Test prog for AES_GCM, we 09.2010}
program T_AESGCM;
{$i STD.INC}
{$ifdef APPCONS}
{$apptype console}
{$endif}
{$ifdef BIT16}
{$N+}
{$endif}
uses
{$ifdef WINCRT}
wincrt,
{$endif}
BTypes,
{$ifdef USEDLL}
{$ifdef VirtualPascal}
AES_Intv,
{$else}
AES_Intf,
{$endif}
{$else}
AES_Type, AES_Base, AES_GCM,
{$endif}
Mem_Util;
var
tag : TAESBlock;
ctx : TAES_GCMContext;
err : integer;
pt : array[0..511] of byte;
ct : array[0..511] of byte;
fail: longint;
const
print: boolean = false;
{---------------------------------------------------------------------------}
procedure single_test( ptag: pointer; tLen: word; {Tag: address / length (0..16)}
{$ifdef CONST}const{$else}var{$endif} Key; KBits: word; {key and bitlength of key}
pIV: pointer; IV_len: word; {IV: address / length}
pAAD: pointer; aLen: word; {AAD: address / length}
ctp: pointer; cLen: longint; {ciphertext: address / length}
ptp: pointer; tn: integer); {plaintext: address}
var
lf: integer;
sn: string[10];
begin
str(tn:3,sn);
sn := 'TV '+sn+': ';
lf := 0;
{-------------------------------------------------------------------------}
fillchar(pt,sizeof(pt),0);
fillchar(ct,sizeof(ct),0);
err := AES_GCM_Dec_Veri(ptag,tLen,Key,KBits,pIV,IV_Len,pAAD,aLen,ctp,cLen,@pt,ctx);
if err<>0 then begin
inc(lf);
writeln(sn,'AES_GCM_Dec_Veri error: ',err);
end
else begin
if not compmem(@pt, ptp, cLen) then begin
writeln(sn,'AES_GCM_Dec_Veri - plaintext does not match');
inc(lf);
end;
end;
{-------------------------------------------------------------------------}
fillchar(pt,sizeof(pt),0);
fillchar(ct,sizeof(ct),0);
err := AES_GCM_Enc_Auth(tag,Key,KBits,pIV,IV_Len,pAAD,aLen,ptp,cLen,@ct,ctx);
if err<>0 then begin
inc(lf);
writeln(sn,'AES_GCM_Enc_Auth error: ',err);
end
else begin
if not compmem(@tag, ptag, tLen) then begin
writeln(sn,'AES_GCM_Enc_Auth - Tag does not match');
inc(lf);
end;
if not compmem(@ct, ctp, cLen) then begin
writeln(sn,'AES_GCM_Enc_Auth - Ciphertext does not match');
inc(lf);
end;
end;
{-------------------------------------------------------------------------}
fillchar(pt,sizeof(pt),0);
fillchar(ct,sizeof(ct),0);
err := AES_GCM_Init(Key, KBits, ctx);
if err<>0 then writeln(sn,'Enc - AES_GCM_Init error: ',err);
if err=0 then begin
err := AES_GCM_Reset_IV(pIV, IV_Len, ctx);
if err<>0 then writeln(sn,'Enc - AES_GCM_Reset_IV error: ',err);
end;
if err=0 then begin
err := AES_GCM_Add_AAD(pAAD, aLen, ctx);
if err<>0 then writeln(sn,'Enc - AES_GCM_Add_AAD error: ',err);
end;
if err=0 then begin
err := AES_GCM_Encrypt(ptp, @ct, cLen, ctx);
if err<>0 then writeln(sn,'Enc - AES_GCM_Encrypt error: ',err);
end;
if err=0 then begin
err := AES_GCM_Final(tag, ctx);
if err<>0 then writeln(sn,'Enc - AES_GCM_Final error: ',err);
end;
if err=0 then begin
if not compmem(@tag, ptag, tLen) then begin
writeln(sn,'Enc - Tag does not match');
inc(lf);
end;
if not compmem(@ct, ctp, cLen) then begin
writeln(sn,'Enc - Ciphertext does not match');
inc(lf);
end;
end
else inc(lf);
{-------------------------------------------------------------------------}
fillchar(pt,sizeof(pt),0);
fillchar(ct,sizeof(ct),0);
err := AES_GCM_Init(Key, KBits, ctx);
if err<>0 then writeln(sn,'Dec - AES_GCM_Init error: ',err);
if err=0 then begin
err := AES_GCM_Reset_IV(pIV, IV_Len, ctx);
if err<>0 then writeln(sn,'Dec - AES_GCM_Reset_IV error: ',err);
end;
if err=0 then begin
err := AES_GCM_Add_AAD(pAAD, aLen, ctx);
if err<>0 then writeln(sn,'Dec - AES_GCM_Add_AAD error: ',err);
end;
if err=0 then begin
err := AES_GCM_Decrypt(ctp, @pt, cLen, ctx);
if err<>0 then writeln(sn,'Dec - AES_GCM_Encrypt error: ',err);
end;
if err=0 then begin
err := AES_GCM_Final(tag, ctx);
if err<>0 then writeln(sn,'Dec - AES_GCM_Final error: ',err);
end;
if err=0 then begin
if not compmem(@tag, ptag, tLen) then begin
writeln(sn,'Dec - Tag does not match');
inc(lf);
end;
if not compmem(@pt, ptp, cLen) then begin
writeln(sn,'Dec - Plaintext does not match');
inc(lf);
end;
end
else inc(lf);
if lf<>0 then inc(fail);
end;
{---------------------------------------------------------------------------}
procedure testspec;
const
K01: array[0..15] of byte = ($00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00);
I01: array[0..11] of byte = ($00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00);
T01: array[0..15] of byte = ($58,$e2,$fc,$ce,$fa,$7e,$30,$61,
$36,$7f,$1d,$57,$a4,$e7,$45,$5a);
K02: array[0..15] of byte = ($00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00);
P02: array[0..15] of byte = ($00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00);
I02: array[0..11] of byte = ($00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00);
C02: array[0..15] of byte = ($03,$88,$da,$ce,$60,$b6,$a3,$92,
$f3,$28,$c2,$b9,$71,$b2,$fe,$78);
T02: array[0..15] of byte = ($ab,$6e,$47,$d4,$2c,$ec,$13,$bd,
$f5,$3a,$67,$b2,$12,$57,$bd,$df);
K03: array[0..15] of byte = ($fe,$ff,$e9,$92,$86,$65,$73,$1c,
$6d,$6a,$8f,$94,$67,$30,$83,$08);
P03: array[0..63] of byte = ($d9,$31,$32,$25,$f8,$84,$06,$e5,
$a5,$59,$09,$c5,$af,$f5,$26,$9a,
$86,$a7,$a9,$53,$15,$34,$f7,$da,
$2e,$4c,$30,$3d,$8a,$31,$8a,$72,
$1c,$3c,$0c,$95,$95,$68,$09,$53,
$2f,$cf,$0e,$24,$49,$a6,$b5,$25,
$b1,$6a,$ed,$f5,$aa,$0d,$e6,$57,
$ba,$63,$7b,$39,$1a,$af,$d2,$55);
I03: array[0..11] of byte = ($ca,$fe,$ba,$be,$fa,$ce,$db,$ad,
$de,$ca,$f8,$88);
C03: array[0..63] of byte = ($42,$83,$1e,$c2,$21,$77,$74,$24,
$4b,$72,$21,$b7,$84,$d0,$d4,$9c,
$e3,$aa,$21,$2f,$2c,$02,$a4,$e0,
$35,$c1,$7e,$23,$29,$ac,$a1,$2e,
$21,$d5,$14,$b2,$54,$66,$93,$1c,
$7d,$8f,$6a,$5a,$ac,$84,$aa,$05,
$1b,$a3,$0b,$39,$6a,$0a,$ac,$97,
$3d,$58,$e0,$91,$47,$3f,$59,$85);
T03: array[0..15] of byte = ($4d,$5c,$2a,$f3,$27,$cd,$64,$a6,
$2c,$f3,$5a,$bd,$2b,$a6,$fa,$b4);
K04: array[0..15] of byte = ($fe,$ff,$e9,$92,$86,$65,$73,$1c,
$6d,$6a,$8f,$94,$67,$30,$83,$08);
P04: array[0..59] of byte = ($d9,$31,$32,$25,$f8,$84,$06,$e5,
$a5,$59,$09,$c5,$af,$f5,$26,$9a,
$86,$a7,$a9,$53,$15,$34,$f7,$da,
$2e,$4c,$30,$3d,$8a,$31,$8a,$72,
$1c,$3c,$0c,$95,$95,$68,$09,$53,
$2f,$cf,$0e,$24,$49,$a6,$b5,$25,
$b1,$6a,$ed,$f5,$aa,$0d,$e6,$57,
$ba,$63,$7b,$39);
A04: array[0..19] of byte = ($fe,$ed,$fa,$ce,$de,$ad,$be,$ef,
$fe,$ed,$fa,$ce,$de,$ad,$be,$ef,
$ab,$ad,$da,$d2);
I04: array[0..11] of byte = ($ca,$fe,$ba,$be,$fa,$ce,$db,$ad,
$de,$ca,$f8,$88);
C04: array[0..59] of byte = ($42,$83,$1e,$c2,$21,$77,$74,$24,
$4b,$72,$21,$b7,$84,$d0,$d4,$9c,
$e3,$aa,$21,$2f,$2c,$02,$a4,$e0,
$35,$c1,$7e,$23,$29,$ac,$a1,$2e,
$21,$d5,$14,$b2,$54,$66,$93,$1c,
$7d,$8f,$6a,$5a,$ac,$84,$aa,$05,
$1b,$a3,$0b,$39,$6a,$0a,$ac,$97,
$3d,$58,$e0,$91);
T04: array[0..15] of byte = ($5b,$c9,$4f,$bc,$32,$21,$a5,$db,
$94,$fa,$e9,$5a,$e7,$12,$1a,$47);
K05: array[0..15] of byte = ($fe,$ff,$e9,$92,$86,$65,$73,$1c,
$6d,$6a,$8f,$94,$67,$30,$83,$08);
P05: array[0..59] of byte = ($d9,$31,$32,$25,$f8,$84,$06,$e5,
$a5,$59,$09,$c5,$af,$f5,$26,$9a,
$86,$a7,$a9,$53,$15,$34,$f7,$da,
$2e,$4c,$30,$3d,$8a,$31,$8a,$72,
$1c,$3c,$0c,$95,$95,$68,$09,$53,
$2f,$cf,$0e,$24,$49,$a6,$b5,$25,
$b1,$6a,$ed,$f5,$aa,$0d,$e6,$57,
$ba,$63,$7b,$39);
A05: array[0..19] of byte = ($fe,$ed,$fa,$ce,$de,$ad,$be,$ef,
$fe,$ed,$fa,$ce,$de,$ad,$be,$ef,
$ab,$ad,$da,$d2);
I05: array[0..07] of byte = ($ca,$fe,$ba,$be,$fa,$ce,$db,$ad);
C05: array[0..59] of byte = ($61,$35,$3b,$4c,$28,$06,$93,$4a,
$77,$7f,$f5,$1f,$a2,$2a,$47,$55,
$69,$9b,$2a,$71,$4f,$cd,$c6,$f8,
$37,$66,$e5,$f9,$7b,$6c,$74,$23,
$73,$80,$69,$00,$e4,$9f,$24,$b2,
$2b,$09,$75,$44,$d4,$89,$6b,$42,
$49,$89,$b5,$e1,$eb,$ac,$0f,$07,
$c2,$3f,$45,$98);
T05: array[0..15] of byte = ($36,$12,$d2,$e7,$9e,$3b,$07,$85,
$56,$1b,$e1,$4a,$ac,$a2,$fc,$cb);
K06: array[0..15] of byte = ($fe,$ff,$e9,$92,$86,$65,$73,$1c,
$6d,$6a,$8f,$94,$67,$30,$83,$08);
P06: array[0..59] of byte = ($d9,$31,$32,$25,$f8,$84,$06,$e5,
$a5,$59,$09,$c5,$af,$f5,$26,$9a,
$86,$a7,$a9,$53,$15,$34,$f7,$da,
$2e,$4c,$30,$3d,$8a,$31,$8a,$72,
$1c,$3c,$0c,$95,$95,$68,$09,$53,
$2f,$cf,$0e,$24,$49,$a6,$b5,$25,
$b1,$6a,$ed,$f5,$aa,$0d,$e6,$57,
$ba,$63,$7b,$39);
A06: array[0..19] of byte = ($fe,$ed,$fa,$ce,$de,$ad,$be,$ef,
$fe,$ed,$fa,$ce,$de,$ad,$be,$ef,
$ab,$ad,$da,$d2);
I06: array[0..59] of byte = ($93,$13,$22,$5d,$f8,$84,$06,$e5,
$55,$90,$9c,$5a,$ff,$52,$69,$aa,
$6a,$7a,$95,$38,$53,$4f,$7d,$a1,
$e4,$c3,$03,$d2,$a3,$18,$a7,$28,
$c3,$c0,$c9,$51,$56,$80,$95,$39,
$fc,$f0,$e2,$42,$9a,$6b,$52,$54,
$16,$ae,$db,$f5,$a0,$de,$6a,$57,
$a6,$37,$b3,$9b);
C06: array[0..59] of byte = ($8c,$e2,$49,$98,$62,$56,$15,$b6,
$03,$a0,$33,$ac,$a1,$3f,$b8,$94,
$be,$91,$12,$a5,$c3,$a2,$11,$a8,
$ba,$26,$2a,$3c,$ca,$7e,$2c,$a7,
$01,$e4,$a9,$a4,$fb,$a4,$3c,$90,
$cc,$dc,$b2,$81,$d4,$8c,$7c,$6f,
$d6,$28,$75,$d2,$ac,$a4,$17,$03,
$4c,$34,$ae,$e5);
T06: array[0..15] of byte = ($61,$9c,$c5,$ae,$ff,$fe,$0b,$fa,
$46,$2a,$f4,$3c,$16,$99,$d0,$50);
K07: array[0..23] of byte = ($00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00);
I07: array[0..11] of byte = ($00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00);
T07: array[0..15] of byte = ($cd,$33,$b2,$8a,$c7,$73,$f7,$4b,
$a0,$0e,$d1,$f3,$12,$57,$24,$35);
K08: array[0..23] of byte = ($00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00);
P08: array[0..15] of byte = ($00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00);
I08: array[0..11] of byte = ($00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00);
C08: array[0..15] of byte = ($98,$e7,$24,$7c,$07,$f0,$fe,$41,
$1c,$26,$7e,$43,$84,$b0,$f6,$00);
T08: array[0..15] of byte = ($2f,$f5,$8d,$80,$03,$39,$27,$ab,
$8e,$f4,$d4,$58,$75,$14,$f0,$fb);
K09: array[0..23] of byte = ($fe,$ff,$e9,$92,$86,$65,$73,$1c,
$6d,$6a,$8f,$94,$67,$30,$83,$08,
$fe,$ff,$e9,$92,$86,$65,$73,$1c);
P09: array[0..63] of byte = ($d9,$31,$32,$25,$f8,$84,$06,$e5,
$a5,$59,$09,$c5,$af,$f5,$26,$9a,
$86,$a7,$a9,$53,$15,$34,$f7,$da,
$2e,$4c,$30,$3d,$8a,$31,$8a,$72,
$1c,$3c,$0c,$95,$95,$68,$09,$53,
$2f,$cf,$0e,$24,$49,$a6,$b5,$25,
$b1,$6a,$ed,$f5,$aa,$0d,$e6,$57,
$ba,$63,$7b,$39,$1a,$af,$d2,$55);
I09: array[0..11] of byte = ($ca,$fe,$ba,$be,$fa,$ce,$db,$ad,
$de,$ca,$f8,$88);
C09: array[0..63] of byte = ($39,$80,$ca,$0b,$3c,$00,$e8,$41,
$eb,$06,$fa,$c4,$87,$2a,$27,$57,
$85,$9e,$1c,$ea,$a6,$ef,$d9,$84,
$62,$85,$93,$b4,$0c,$a1,$e1,$9c,
$7d,$77,$3d,$00,$c1,$44,$c5,$25,
$ac,$61,$9d,$18,$c8,$4a,$3f,$47,
$18,$e2,$44,$8b,$2f,$e3,$24,$d9,
$cc,$da,$27,$10,$ac,$ad,$e2,$56);
T09: array[0..15] of byte = ($99,$24,$a7,$c8,$58,$73,$36,$bf,
$b1,$18,$02,$4d,$b8,$67,$4a,$14);
K10: array[0..23] of byte = ($fe,$ff,$e9,$92,$86,$65,$73,$1c,
$6d,$6a,$8f,$94,$67,$30,$83,$08,
$fe,$ff,$e9,$92,$86,$65,$73,$1c);
P10: array[0..59] of byte = ($d9,$31,$32,$25,$f8,$84,$06,$e5,
$a5,$59,$09,$c5,$af,$f5,$26,$9a,
$86,$a7,$a9,$53,$15,$34,$f7,$da,
$2e,$4c,$30,$3d,$8a,$31,$8a,$72,
$1c,$3c,$0c,$95,$95,$68,$09,$53,
$2f,$cf,$0e,$24,$49,$a6,$b5,$25,
$b1,$6a,$ed,$f5,$aa,$0d,$e6,$57,
$ba,$63,$7b,$39);
A10: array[0..19] of byte = ($fe,$ed,$fa,$ce,$de,$ad,$be,$ef,
$fe,$ed,$fa,$ce,$de,$ad,$be,$ef,
$ab,$ad,$da,$d2);
I10: array[0..11] of byte = ($ca,$fe,$ba,$be,$fa,$ce,$db,$ad,
$de,$ca,$f8,$88);
C10: array[0..59] of byte = ($39,$80,$ca,$0b,$3c,$00,$e8,$41,
$eb,$06,$fa,$c4,$87,$2a,$27,$57,
$85,$9e,$1c,$ea,$a6,$ef,$d9,$84,
$62,$85,$93,$b4,$0c,$a1,$e1,$9c,
$7d,$77,$3d,$00,$c1,$44,$c5,$25,
$ac,$61,$9d,$18,$c8,$4a,$3f,$47,
$18,$e2,$44,$8b,$2f,$e3,$24,$d9,
$cc,$da,$27,$10);
T10: array[0..15] of byte = ($25,$19,$49,$8e,$80,$f1,$47,$8f,
$37,$ba,$55,$bd,$6d,$27,$61,$8c);
K11: array[0..23] of byte = ($fe,$ff,$e9,$92,$86,$65,$73,$1c,
$6d,$6a,$8f,$94,$67,$30,$83,$08,
$fe,$ff,$e9,$92,$86,$65,$73,$1c);
P11: array[0..59] of byte = ($d9,$31,$32,$25,$f8,$84,$06,$e5,
$a5,$59,$09,$c5,$af,$f5,$26,$9a,
$86,$a7,$a9,$53,$15,$34,$f7,$da,
$2e,$4c,$30,$3d,$8a,$31,$8a,$72,
$1c,$3c,$0c,$95,$95,$68,$09,$53,
$2f,$cf,$0e,$24,$49,$a6,$b5,$25,
$b1,$6a,$ed,$f5,$aa,$0d,$e6,$57,
$ba,$63,$7b,$39);
A11: array[0..19] of byte = ($fe,$ed,$fa,$ce,$de,$ad,$be,$ef,
$fe,$ed,$fa,$ce,$de,$ad,$be,$ef,
$ab,$ad,$da,$d2);
I11: array[0.. 7] of byte = ($ca,$fe,$ba,$be,$fa,$ce,$db,$ad);
C11: array[0..59] of byte = ($0f,$10,$f5,$99,$ae,$14,$a1,$54,
$ed,$24,$b3,$6e,$25,$32,$4d,$b8,
$c5,$66,$63,$2e,$f2,$bb,$b3,$4f,
$83,$47,$28,$0f,$c4,$50,$70,$57,
$fd,$dc,$29,$df,$9a,$47,$1f,$75,
$c6,$65,$41,$d4,$d4,$da,$d1,$c9,
$e9,$3a,$19,$a5,$8e,$8b,$47,$3f,
$a0,$f0,$62,$f7);
T11: array[0..15] of byte = ($65,$dc,$c5,$7f,$cf,$62,$3a,$24,
$09,$4f,$cc,$a4,$0d,$35,$33,$f8);
K12: array[0..23] of byte = ($fe,$ff,$e9,$92,$86,$65,$73,$1c,
$6d,$6a,$8f,$94,$67,$30,$83,$08,
$fe,$ff,$e9,$92,$86,$65,$73,$1c);
P12: array[0..59] of byte = ($d9,$31,$32,$25,$f8,$84,$06,$e5,
$a5,$59,$09,$c5,$af,$f5,$26,$9a,
$86,$a7,$a9,$53,$15,$34,$f7,$da,
$2e,$4c,$30,$3d,$8a,$31,$8a,$72,
$1c,$3c,$0c,$95,$95,$68,$09,$53,
$2f,$cf,$0e,$24,$49,$a6,$b5,$25,
$b1,$6a,$ed,$f5,$aa,$0d,$e6,$57,
$ba,$63,$7b,$39);
A12: array[0..19] of byte = ($fe,$ed,$fa,$ce,$de,$ad,$be,$ef,
$fe,$ed,$fa,$ce,$de,$ad,$be,$ef,
$ab,$ad,$da,$d2);
I12: array[0..59] of byte = ($93,$13,$22,$5d,$f8,$84,$06,$e5,
$55,$90,$9c,$5a,$ff,$52,$69,$aa,
$6a,$7a,$95,$38,$53,$4f,$7d,$a1,
$e4,$c3,$03,$d2,$a3,$18,$a7,$28,
$c3,$c0,$c9,$51,$56,$80,$95,$39,
$fc,$f0,$e2,$42,$9a,$6b,$52,$54,
$16,$ae,$db,$f5,$a0,$de,$6a,$57,
$a6,$37,$b3,$9b);
C12: array[0..59] of byte = ($d2,$7e,$88,$68,$1c,$e3,$24,$3c,
$48,$30,$16,$5a,$8f,$dc,$f9,$ff,
$1d,$e9,$a1,$d8,$e6,$b4,$47,$ef,
$6e,$f7,$b7,$98,$28,$66,$6e,$45,
$81,$e7,$90,$12,$af,$34,$dd,$d9,
$e2,$f0,$37,$58,$9b,$29,$2d,$b3,
$e6,$7c,$03,$67,$45,$fa,$22,$e7,
$e9,$b7,$37,$3b);
T12: array[0..15] of byte = ($dc,$f5,$66,$ff,$29,$1c,$25,$bb,
$b8,$56,$8f,$c3,$d3,$76,$a6,$d9);
K13: array[0..31] of byte = ($00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00);
I13: array[0..11] of byte = ($00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00);
T13: array[0..15] of byte = ($53,$0f,$8a,$fb,$c7,$45,$36,$b9,
$a9,$63,$b4,$f1,$c4,$cb,$73,$8b);
K14: array[0..31] of byte = ($00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00);
P14: array[0..15] of byte = ($00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00);
I14: array[0..11] of byte = ($00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00);
C14: array[0..15] of byte = ($ce,$a7,$40,$3d,$4d,$60,$6b,$6e,
$07,$4e,$c5,$d3,$ba,$f3,$9d,$18);
T14: array[0..15] of byte = ($d0,$d1,$c8,$a7,$99,$99,$6b,$f0,
$26,$5b,$98,$b5,$d4,$8a,$b9,$19);
K15: array[0..31] of byte = ($fe,$ff,$e9,$92,$86,$65,$73,$1c,
$6d,$6a,$8f,$94,$67,$30,$83,$08,
$fe,$ff,$e9,$92,$86,$65,$73,$1c,
$6d,$6a,$8f,$94,$67,$30,$83,$08);
P15: array[0..63] of byte = ($d9,$31,$32,$25,$f8,$84,$06,$e5,
$a5,$59,$09,$c5,$af,$f5,$26,$9a,
$86,$a7,$a9,$53,$15,$34,$f7,$da,
$2e,$4c,$30,$3d,$8a,$31,$8a,$72,
$1c,$3c,$0c,$95,$95,$68,$09,$53,
$2f,$cf,$0e,$24,$49,$a6,$b5,$25,
$b1,$6a,$ed,$f5,$aa,$0d,$e6,$57,
$ba,$63,$7b,$39,$1a,$af,$d2,$55);
I15: array[0..11] of byte = ($ca,$fe,$ba,$be,$fa,$ce,$db,$ad,
$de,$ca,$f8,$88);
C15: array[0..63] of byte = ($52,$2d,$c1,$f0,$99,$56,$7d,$07,
$f4,$7f,$37,$a3,$2a,$84,$42,$7d,
$64,$3a,$8c,$dc,$bf,$e5,$c0,$c9,
$75,$98,$a2,$bd,$25,$55,$d1,$aa,
$8c,$b0,$8e,$48,$59,$0d,$bb,$3d,
$a7,$b0,$8b,$10,$56,$82,$88,$38,
$c5,$f6,$1e,$63,$93,$ba,$7a,$0a,
$bc,$c9,$f6,$62,$89,$80,$15,$ad);
T15: array[0..15] of byte = ($b0,$94,$da,$c5,$d9,$34,$71,$bd,
$ec,$1a,$50,$22,$70,$e3,$cc,$6c);
K16: array[0..31] of byte = ($fe,$ff,$e9,$92,$86,$65,$73,$1c,
$6d,$6a,$8f,$94,$67,$30,$83,$08,
$fe,$ff,$e9,$92,$86,$65,$73,$1c,
$6d,$6a,$8f,$94,$67,$30,$83,$08);
P16: array[0..59] of byte = ($d9,$31,$32,$25,$f8,$84,$06,$e5,
$a5,$59,$09,$c5,$af,$f5,$26,$9a,
$86,$a7,$a9,$53,$15,$34,$f7,$da,
$2e,$4c,$30,$3d,$8a,$31,$8a,$72,
$1c,$3c,$0c,$95,$95,$68,$09,$53,
$2f,$cf,$0e,$24,$49,$a6,$b5,$25,
$b1,$6a,$ed,$f5,$aa,$0d,$e6,$57,
$ba,$63,$7b,$39);
A16: array[0..19] of byte = ($fe,$ed,$fa,$ce,$de,$ad,$be,$ef,
$fe,$ed,$fa,$ce,$de,$ad,$be,$ef,
$ab,$ad,$da,$d2);
I16: array[0..11] of byte = ($ca,$fe,$ba,$be,$fa,$ce,$db,$ad,
$de,$ca,$f8,$88);
C16: array[0..59] of byte = ($52,$2d,$c1,$f0,$99,$56,$7d,$07,
$f4,$7f,$37,$a3,$2a,$84,$42,$7d,
$64,$3a,$8c,$dc,$bf,$e5,$c0,$c9,
$75,$98,$a2,$bd,$25,$55,$d1,$aa,
$8c,$b0,$8e,$48,$59,$0d,$bb,$3d,
$a7,$b0,$8b,$10,$56,$82,$88,$38,
$c5,$f6,$1e,$63,$93,$ba,$7a,$0a,
$bc,$c9,$f6,$62);
T16: array[0..15] of byte = ($76,$fc,$6e,$ce,$0f,$4e,$17,$68,
$cd,$df,$88,$53,$bb,$2d,$55,$1b);
K17: array[0..31] of byte = ($fe,$ff,$e9,$92,$86,$65,$73,$1c,
$6d,$6a,$8f,$94,$67,$30,$83,$08,
$fe,$ff,$e9,$92,$86,$65,$73,$1c,
$6d,$6a,$8f,$94,$67,$30,$83,$08);
P17: array[0..59] of byte = ($d9,$31,$32,$25,$f8,$84,$06,$e5,
$a5,$59,$09,$c5,$af,$f5,$26,$9a,
$86,$a7,$a9,$53,$15,$34,$f7,$da,
$2e,$4c,$30,$3d,$8a,$31,$8a,$72,
$1c,$3c,$0c,$95,$95,$68,$09,$53,
$2f,$cf,$0e,$24,$49,$a6,$b5,$25,
$b1,$6a,$ed,$f5,$aa,$0d,$e6,$57,
$ba,$63,$7b,$39);
A17: array[0..19] of byte = ($fe,$ed,$fa,$ce,$de,$ad,$be,$ef,
$fe,$ed,$fa,$ce,$de,$ad,$be,$ef,
$ab,$ad,$da,$d2);
I17: array[0.. 7] of byte = ($ca,$fe,$ba,$be,$fa,$ce,$db,$ad);
C17: array[0..59] of byte = ($c3,$76,$2d,$f1,$ca,$78,$7d,$32,
$ae,$47,$c1,$3b,$f1,$98,$44,$cb,
$af,$1a,$e1,$4d,$0b,$97,$6a,$fa,
$c5,$2f,$f7,$d7,$9b,$ba,$9d,$e0,
$fe,$b5,$82,$d3,$39,$34,$a4,$f0,
$95,$4c,$c2,$36,$3b,$c7,$3f,$78,
$62,$ac,$43,$0e,$64,$ab,$e4,$99,
$f4,$7c,$9b,$1f);
T17: array[0..15] of byte = ($3a,$33,$7d,$bf,$46,$a7,$92,$c4,
$5e,$45,$49,$13,$fe,$2e,$a8,$f2);
K18: array[0..31] of byte = ($fe,$ff,$e9,$92,$86,$65,$73,$1c,
$6d,$6a,$8f,$94,$67,$30,$83,$08,
$fe,$ff,$e9,$92,$86,$65,$73,$1c,
$6d,$6a,$8f,$94,$67,$30,$83,$08);
P18: array[0..59] of byte = ($d9,$31,$32,$25,$f8,$84,$06,$e5,
$a5,$59,$09,$c5,$af,$f5,$26,$9a,
$86,$a7,$a9,$53,$15,$34,$f7,$da,
$2e,$4c,$30,$3d,$8a,$31,$8a,$72,
$1c,$3c,$0c,$95,$95,$68,$09,$53,
$2f,$cf,$0e,$24,$49,$a6,$b5,$25,
$b1,$6a,$ed,$f5,$aa,$0d,$e6,$57,
$ba,$63,$7b,$39);
A18: array[0..19] of byte = ($fe,$ed,$fa,$ce,$de,$ad,$be,$ef,
$fe,$ed,$fa,$ce,$de,$ad,$be,$ef,
$ab,$ad,$da,$d2);
I18: array[0..59] of byte = ($93,$13,$22,$5d,$f8,$84,$06,$e5,
$55,$90,$9c,$5a,$ff,$52,$69,$aa,
$6a,$7a,$95,$38,$53,$4f,$7d,$a1,
$e4,$c3,$03,$d2,$a3,$18,$a7,$28,
$c3,$c0,$c9,$51,$56,$80,$95,$39,
$fc,$f0,$e2,$42,$9a,$6b,$52,$54,
$16,$ae,$db,$f5,$a0,$de,$6a,$57,
$a6,$37,$b3,$9b);
C18: array[0..59] of byte = ($5a,$8d,$ef,$2f,$0c,$9e,$53,$f1,
$f7,$5d,$78,$53,$65,$9e,$2a,$20,
$ee,$b2,$b2,$2a,$af,$de,$64,$19,
$a0,$58,$ab,$4f,$6f,$74,$6b,$f4,
$0f,$c0,$c3,$b7,$80,$f2,$44,$45,
$2d,$a3,$eb,$f1,$c5,$d8,$2c,$de,
$a2,$41,$89,$97,$20,$0e,$f8,$2e,
$44,$ae,$7e,$3f);
T18: array[0..15] of byte = ($a4,$4a,$82,$66,$ee,$1c,$8e,$b0,
$c8,$b5,$d4,$cf,$5a,$e9,$f1,$9a);
begin
fail := 0;
writeln('Test cases AES_GCM from GCM Spec');
single_test(@T01,16,K01,8*sizeof(K01),@I01,sizeof(I01),nil,0,nil,0,nil,01);
single_test(@T02,16,K02,8*sizeof(K02),@I02,sizeof(I02),nil,0,@C02,sizeof(C02),@P02,02);
single_test(@T03,16,K03,8*sizeof(K03),@I03,sizeof(I03),nil,0,@C03,sizeof(C03),@P03,03);
single_test(@T04,16,K04,8*sizeof(K04),@I04,sizeof(I04),@A04,sizeof(A04),@C04,sizeof(C04),@P04,04);
single_test(@T05,16,K05,8*sizeof(K05),@I05,sizeof(I05),@A05,sizeof(A05),@C05,sizeof(C05),@P05,05);
single_test(@T06,16,K06,8*sizeof(K06),@I06,sizeof(I06),@A06,sizeof(A06),@C06,sizeof(C06),@P06,06);
single_test(@T07,16,K07,8*sizeof(K07),@I07,sizeof(I07),nil,0,nil,0,nil,07);
single_test(@T08,16,K08,8*sizeof(K08),@I08,sizeof(I08),nil,0,@C08,sizeof(C08),@P08,08);
single_test(@T09,16,K09,8*sizeof(K09),@I09,sizeof(I09),nil,0,@C09,sizeof(C09),@P09,09);
single_test(@T10,16,K10,8*sizeof(K10),@I10,sizeof(I10),@A10,sizeof(A10),@C10,sizeof(C10),@P10,10);
single_test(@T11,16,K11,8*sizeof(K11),@I11,sizeof(I11),@A11,sizeof(A11),@C11,sizeof(C11),@P11,11);
single_test(@T12,16,K12,8*sizeof(K12),@I12,sizeof(I12),@A12,sizeof(A12),@C12,sizeof(C12),@P12,12);
single_test(@T13,16,K13,8*sizeof(K13),@I13,sizeof(I13),nil,0,nil,0,nil,13);
single_test(@T14,16,K14,8*sizeof(K14),@I14,sizeof(I14),nil,0,@C14,sizeof(C14),@P14,14);
single_test(@T15,16,K15,8*sizeof(K15),@I15,sizeof(I15),nil,0,@C15,sizeof(C15),@P15,15);
single_test(@T16,16,K16,8*sizeof(K16),@I16,sizeof(I16),@A16,sizeof(A16),@C16,sizeof(C16),@P16,16);
single_test(@T17,16,K17,8*sizeof(K17),@I17,sizeof(I17),@A17,sizeof(A17),@C17,sizeof(C17),@P17,17);
single_test(@T18,16,K18,8*sizeof(K18),@I18,sizeof(I18),@A18,sizeof(A18),@C18,sizeof(C18),@P18,18);
if fail=0 then writeln('All tests passed.')
else writeln('*** Number of failed tests: ', fail);
end;
{---------------------------------------------------------------------------}
procedure tsd_test;
{-Reproduce AES part of Tom St Denis' GCM_TV.TXT, LTC V1.18}
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);
buf32: array[0..31] of byte = ($92,$4e,$17,$8a,$17,$fa,$1c,$a0,
$e7,$48,$6f,$04,$04,$12,$3b,$91,
$db,$f7,$97,$bb,$9d,$bd,$e9,$b1,
$d4,$8d,$5c,$7f,$53,$16,$59,$12);
tag32: array[0..15] of byte = ($10,$f9,$72,$b6,$f9,$e0,$a3,$c1,
$cf,$9c,$cf,$56,$54,$3d,$ca,$79);
var
err,n: integer;
ctx: TAES_GCMContext;
key, tag: TAESBlock;
buf: array[0..63] of byte;
begin
{Note: Contrary to what Tom writes in GCM_TV.TXT the length of nonce=IV is}
{NOT fixed=13, but varies the same way as the header and plaintext length!}
writeln('Test AES part of Tom St Denis'' GCM_TV.TXT (LTC V1.18)');
{Uppercase from HexStr}
HexUpper := true;
{Initial key from hex32}
move(hex32, key, sizeof(key));
for n:=1 to 32 do begin
err := AES_GCM_Init(key, 128, ctx);
if err=0 then err := AES_GCM_Reset_IV(@hex32, n, ctx);
if err=0 then err := AES_GCM_Add_AAD(@hex32,n,ctx);
if err=0 then err := AES_GCM_Encrypt(@hex32, @buf, n, ctx);
if err=0 then err := AES_GCM_Final(tag, ctx);
if err=0 then begin
if print then writeln(n:3,': ', HexStr(@buf,n), ', ', HexStr(@tag,16));
{key for step n>1 is the tag of the previous step repeated}
key := tag;
end
else begin
writeln('Error ',err);
exit;
end;
end;
{compare final values}
writeln('buf32 compares: ', compmem(@buf32, @buf, sizeof(buf32)):5);
writeln('tag32 compares: ', compmem(@tag32, @tag, sizeof(tag32)):5);
end;
{---------------------------------------------------------------------------}
procedure test_glad2;
const
K01: array[0..31] of byte = ($00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00);
I01: array[0..11] of byte = ($00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00);
P01: array[0..15] of byte = ($00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00);
C01: array[0..15] of byte = ($ce,$a7,$40,$3d,$4d,$60,$6b,$6e,
$07,$4e,$c5,$d3,$ba,$f3,$9d,$18);
T01: array[0..15] of byte = ($d0,$d1,$c8,$a7,$99,$99,$6b,$f0,
$26,$5b,$98,$b5,$d4,$8a,$b9,$19);
K02: array[0..31] of byte = ($00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00);
I02: array[0..11] of byte = ($00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00);
H02: array[0..15] of byte = ($00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00);
T02: array[0..15] of byte = ($2d,$45,$55,$2d,$85,$75,$92,$2b,
$3c,$a3,$cc,$53,$84,$42,$fa,$26);
K03: array[0..31] of byte = ($00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00);
I03: array[0..11] of byte = ($00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00);
H03: array[0..15] of byte = ($00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00);
P03: array[0..15] of byte = ($00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00);
C03: array[0..15] of byte = ($ce,$a7,$40,$3d,$4d,$60,$6b,$6e,
$07,$4e,$c5,$d3,$ba,$f3,$9d,$18);
T03: array[0..15] of byte = ($ae,$9b,$17,$71,$db,$a9,$cf,$62,
$b3,$9b,$e0,$17,$94,$03,$30,$b4);
K04: array[0..31] of byte = ($fb,$76,$15,$b2,$3d,$80,$89,$1d,
$d4,$70,$98,$0b,$c7,$95,$84,$c8,
$b2,$fb,$64,$ce,$60,$97,$8f,$4d,
$17,$fc,$e4,$5a,$49,$e8,$30,$b7);
I04: array[0..11] of byte = ($db,$d1,$a3,$63,$60,$24,$b7,$b4,
$02,$da,$7d,$6f);
P04: array[0..15] of byte = ($a8,$45,$34,$8e,$c8,$c5,$b5,$f1,
$26,$f5,$0e,$76,$fe,$fd,$1b,$1e);
C04: array[0..15] of byte = ($5d,$f5,$d1,$fa,$bc,$bb,$dd,$05,
$15,$38,$25,$24,$44,$17,$87,$04);
T04: array[0..15] of byte = ($4c,$43,$cc,$e5,$a5,$74,$d8,$a8,
$8b,$43,$d4,$35,$3b,$d6,$0f,$9f);
K05: array[0..31] of byte = ($40,$41,$42,$43,$44,$45,$46,$47,
$48,$49,$4a,$4b,$4c,$4d,$4e,$4f,
$50,$51,$52,$53,$54,$55,$56,$57,
$58,$59,$5a,$5b,$5c,$5d,$5e,$5f);
I05: array[0..11] of byte = ($10,$11,$12,$13,$14,$15,$16,$17,
$18,$19,$1a,$1b);
H05: array[0..19] of byte = ($00,$01,$02,$03,$04,$05,$06,$07,
$08,$09,$0a,$0b,$0c,$0d,$0e,$0f,
$10,$11,$12,$13);
P05: array[0..23] of byte = ($20,$21,$22,$23,$24,$25,$26,$27,
$28,$29,$2a,$2b,$2c,$2d,$2e,$2f,
$30,$31,$32,$33,$34,$35,$36,$37);
C05: array[0..23] of byte = ($59,$1b,$1f,$f2,$72,$b4,$32,$04,
$86,$8f,$fc,$7b,$c7,$d5,$21,$99,
$35,$26,$b6,$fa,$32,$24,$7c,$3c);
T05: array[0..15] of byte = ($7d,$e1,$2a,$56,$70,$e5,$70,$d8,
$ca,$e6,$24,$a1,$6d,$f0,$9c,$08);
K07: array[0..31] of byte = ($40,$41,$42,$43,$44,$45,$46,$47,
$48,$49,$4a,$4b,$4c,$4d,$4e,$4f,
$50,$51,$52,$53,$54,$55,$56,$57,
$58,$59,$5a,$5b,$5c,$5d,$5e,$5f);
I07: array[0..11] of byte = ($10,$11,$12,$13,$14,$15,$16,$17,
$18,$19,$1a,$1b);
H07: array[0..31] of byte = ($20,$21,$22,$23,$24,$25,$26,$27,
$28,$29,$2a,$2b,$2c,$2d,$2e,$2f,
$30,$31,$32,$33,$34,$35,$36,$37,
$38,$39,$3a,$3b,$3c,$3d,$3e,$3f);
P07: array[0..255] 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,
$20,$21,$22,$23,$24,$25,$26,$27,
$28,$29,$2a,$2b,$2c,$2d,$2e,$2f,
$30,$31,$32,$33,$34,$35,$36,$37,
$38,$39,$3a,$3b,$3c,$3d,$3e,$3f,
$40,$41,$42,$43,$44,$45,$46,$47,
$48,$49,$4a,$4b,$4c,$4d,$4e,$4f,
$50,$51,$52,$53,$54,$55,$56,$57,
$58,$59,$5a,$5b,$5c,$5d,$5e,$5f,
$60,$61,$62,$63,$64,$65,$66,$67,
$68,$69,$6a,$6b,$6c,$6d,$6e,$6f,
$70,$71,$72,$73,$74,$75,$76,$77,
$78,$79,$7a,$7b,$7c,$7d,$7e,$7f,
$80,$81,$82,$83,$84,$85,$86,$87,
$88,$89,$8a,$8b,$8c,$8d,$8e,$8f,
$90,$91,$92,$93,$94,$95,$96,$97,
$98,$99,$9a,$9b,$9c,$9d,$9e,$9f,
$a0,$a1,$a2,$a3,$a4,$a5,$a6,$a7,
$a8,$a9,$aa,$ab,$ac,$ad,$ae,$af,
$b0,$b1,$b2,$b3,$b4,$b5,$b6,$b7,
$b8,$b9,$ba,$bb,$bc,$bd,$be,$bf,
$c0,$c1,$c2,$c3,$c4,$c5,$c6,$c7,
$c8,$c9,$ca,$cb,$cc,$cd,$ce,$cf,
$d0,$d1,$d2,$d3,$d4,$d5,$d6,$d7,
$d8,$d9,$da,$db,$dc,$dd,$de,$df,
$e0,$e1,$e2,$e3,$e4,$e5,$e6,$e7,
$e8,$e9,$ea,$eb,$ec,$ed,$ee,$ef,
$f0,$f1,$f2,$f3,$f4,$f5,$f6,$f7,
$f8,$f9,$fa,$fb,$fc,$fd,$fe,$ff);
C07: array[0..255] of byte =($79,$3b,$3f,$d2,$52,$94,$12,$24,
$a6,$af,$dc,$5b,$e7,$f5,$01,$b9,
$15,$06,$96,$da,$12,$04,$5c,$1c,
$60,$77,$d3,$ca,$c7,$74,$ac,$cf,
$c3,$d5,$30,$d8,$48,$d6,$65,$d8,
$1a,$49,$cb,$b5,$00,$b8,$8b,$bb,
$62,$4a,$e6,$1d,$16,$67,$22,$9c,
$30,$2d,$c6,$ff,$0b,$b4,$d7,$0b,
$db,$bc,$85,$66,$d6,$f5,$b1,$58,
$da,$99,$a2,$ff,$2e,$01,$dd,$a6,
$29,$b8,$9c,$34,$ad,$1e,$5f,$eb,
$a7,$0e,$7a,$ae,$43,$28,$28,$9c,
$36,$29,$b0,$58,$83,$50,$58,$1c,
$a8,$b9,$7c,$cf,$12,$58,$fa,$3b,
$be,$2c,$50,$26,$04,$7b,$a7,$26,
$48,$96,$9c,$ff,$8b,$a1,$0a,$e3,
$0e,$05,$93,$5d,$f0,$c6,$93,$74,
$18,$92,$b7,$6f,$af,$67,$13,$3a,
$bd,$2c,$f2,$03,$11,$21,$bd,$8b,
$b3,$81,$27,$a4,$d2,$ee,$de,$ea,
$13,$27,$64,$94,$f4,$02,$cd,$7c,
$10,$7f,$b3,$ec,$3b,$24,$78,$48,
$34,$33,$8e,$55,$43,$62,$87,$09,
$2a,$c4,$a2,$6f,$5e,$a7,$ea,$4a,
$d6,$8d,$73,$15,$16,$39,$b0,$5b,
$24,$e6,$8b,$98,$16,$d1,$39,$83,
$76,$d8,$e4,$13,$85,$94,$75,$8d,
$b9,$ad,$3b,$40,$92,$59,$b2,$6d,
$cf,$c0,$6e,$72,$2b,$e9,$87,$b3,
$76,$7f,$70,$a7,$b8,$56,$b7,$74,
$b1,$ba,$26,$85,$b3,$68,$09,$14,
$29,$fc,$cb,$8d,$cd,$de,$09,$e4);
T07: array[0..15] of byte = ($87,$ec,$83,$7a,$bf,$53,$28,$55,
$b2,$ce,$a1,$69,$d6,$94,$3f,$cd);
K08: array[0..31] of byte = ($fb,$76,$15,$b2,$3d,$80,$89,$1d,
$d4,$70,$98,$0b,$c7,$95,$84,$c8,
$b2,$fb,$64,$ce,$60,$97,$87,$8d,
$17,$fc,$e4,$5a,$49,$e8,$30,$b7);
I08: array[0..11] of byte = ($db,$d1,$a3,$63,$60,$24,$b7,$b4,
$02,$da,$7d,$6f);
H08: array[0.. 0] of byte = ($36);
P08: array[0.. 0] of byte = ($a9);
C08: array[0.. 0] of byte = ($0a);
T08: array[0..15] of byte = ($be,$98,$7d,$00,$9a,$4b,$34,$9a,
$a8,$0c,$b9,$c4,$eb,$c1,$e9,$f4);
K09: array[0..31] of byte = ($f8,$d4,$76,$cf,$d6,$46,$ea,$6c,
$23,$84,$cb,$1c,$27,$d6,$19,$5d,
$fe,$f1,$a9,$f3,$7b,$9c,$8d,$21,
$a7,$9c,$21,$f8,$cb,$90,$d2,$89);
I09: array[0..11] of byte = ($db,$d1,$a3,$63,$60,$24,$b7,$b4,
$02,$da,$7d,$6f);
H09: array[0..19] of byte = ($7b,$d8,$59,$a2,$47,$96,$1a,$21,
$82,$3b,$38,$0e,$9f,$e8,$b6,$50,
$82,$ba,$61,$d3);
P09: array[0..19] of byte = ($90,$ae,$61,$cf,$7b,$ae,$bd,$4c,
$ad,$e4,$94,$c5,$4a,$29,$ae,$70,
$26,$9a,$ec,$71);
C09: array[0..19] of byte = ($ce,$20,$27,$b4,$7a,$84,$32,$52,
$01,$34,$65,$83,$4d,$75,$fd,$0f,
$07,$29,$75,$2e);
T09: array[0..15] of byte = ($ac,$d8,$83,$38,$37,$ab,$0e,$de,
$84,$f4,$74,$8d,$a8,$89,$9c,$15);
K10: array[0..31] of byte = ($db,$bc,$85,$66,$d6,$f5,$b1,$58,
$da,$99,$a2,$ff,$2e,$01,$dd,$a6,
$29,$b8,$9c,$34,$ad,$1e,$5f,$eb,
$a7,$0e,$7a,$ae,$43,$28,$28,$9c);
I10: array[0..15] of byte = ($cf,$c0,$6e,$72,$2b,$e9,$87,$b3,
$76,$7f,$70,$a7,$b8,$56,$b7,$74);
P10: array[0..15] of byte = ($ce,$20,$27,$b4,$7a,$84,$32,$52,
$01,$34,$65,$83,$4d,$75,$fd,$0f);
C10: array[0..15] of byte = ($dc,$03,$e5,$24,$83,$0d,$30,$f8,
$8e,$19,$7f,$3a,$ca,$ce,$66,$ef);
T10: array[0..15] of byte = ($99,$84,$ef,$f6,$90,$57,$55,$d1,
$83,$6f,$2d,$b0,$40,$89,$63,$4c);
K11: array[0..31] of byte = ($0e,$05,$93,$5d,$f0,$c6,$93,$74,
$18,$92,$b7,$6f,$af,$67,$13,$3a,
$bd,$2c,$f2,$03,$11,$21,$bd,$8b,
$b3,$81,$27,$a4,$d2,$ee,$de,$ea);
I11: array[0..16] of byte = ($74,$b1,$ba,$26,$85,$b3,$68,$09,
$14,$29,$fc,$cb,$8d,$cd,$de,$09,
$e4);
H11: array[0..19] of byte = ($7b,$d8,$59,$a2,$47,$96,$1a,$21,
$82,$3b,$38,$0e,$9f,$e8,$b6,$50,
$82,$ba,$61,$d3);
P11: array[0..19] of byte = ($90,$ae,$61,$cf,$7b,$ae,$bd,$4c,
$ad,$e4,$94,$c5,$4a,$29,$ae,$70,
$26,$9a,$ec,$71);
C11: array[0..19] of byte = ($6b,$e6,$5e,$56,$06,$6c,$40,$56,
$73,$8c,$03,$fe,$23,$20,$97,$4b,
$a3,$f6,$5e,$09);
T11: array[0..15] of byte = ($61,$08,$dc,$41,$7b,$f3,$2f,$7f,
$b7,$55,$4a,$e5,$2f,$08,$8f,$87);
begin
fail := 0;
writeln('Test cases AES_GCM from Brian Gladman/IEEE P1619.1');
single_test(@T01,16,K01,8*sizeof(K01),@I01,sizeof(I01),nil ,0 ,@C01,sizeof(C01),@P01,01);
single_test(@T02,16,K02,8*sizeof(K02),@I02,sizeof(I02),@H02,sizeof(H02),nil ,0 ,nil ,02);
single_test(@T03,16,K03,8*sizeof(K03),@I03,sizeof(I03),@H03,sizeof(H03),@C03,sizeof(C03),@P03,03);
single_test(@T04,16,K04,8*sizeof(K04),@I04,sizeof(I04),nil ,0 ,@C04,sizeof(C04),@P04,04);
single_test(@T05,16,K05,8*sizeof(K05),@I05,sizeof(I05),@H05,sizeof(H05),@C05,sizeof(C05),@P05,05);
single_test(@T07,16,K07,8*sizeof(K07),@I07,sizeof(I07),@H07,sizeof(H07),@C07,sizeof(C07),@P07,07);
single_test(@T08,16,K08,8*sizeof(K08),@I08,sizeof(I08),@H08,sizeof(H08),@C08,sizeof(C08),@P08,08);
single_test(@T09,16,K09,8*sizeof(K09),@I09,sizeof(I09),@H09,sizeof(H09),@C09,sizeof(C09),@P09,09);
single_test(@T10,16,K10,8*sizeof(K10),@I10,sizeof(I10),nil ,0 ,@C10,sizeof(C10),@P10,10);
single_test(@T11,16,K11,8*sizeof(K11),@I11,sizeof(I11),@H11,sizeof(H11),@C11,sizeof(C11),@P11,11);
if fail=0 then writeln('All tests passed.')
else writeln('*** Number of failed tests: ', fail);
end;
begin
write('Test program for AES-GCM functions');
{$ifdef USEDLL}
write(' [AES_DLL V',AES_DLL_Version,']');
{$endif}
writeln(' (C) 2010 W.Ehrhardt');
writeln;
testspec;
writeln;
test_glad2;
writeln;
tsd_test;
end.