You've already forked lazarus-ccr
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8907 8e941d3f-bd1b-0410-a28a-d453659cc2b4
398 lines
11 KiB
PHP
398 lines
11 KiB
PHP
|
|
(*************************************************************************
|
|
Include file for AES_DECR.PAS - AES_Decrypt for BASM16/Compressed table
|
|
|
|
Version Date Author Modification
|
|
------- -------- ------- ------------------------------------------
|
|
0.10 09.07.06 W.Ehrhardt Initial version for compressed table
|
|
0.11 10.07.06 we Removed bx in TCd[bx+si+?]
|
|
0.12 13.07.06 we Uses TCd box byte instead of InvSBox
|
|
**************************************************************************)
|
|
|
|
(**** (C) Copyright 2002-2006 Wolfgang Ehrhardt -- see copying_we.txt ****)
|
|
|
|
|
|
{16 bit BASM used for TP6, BP7, Delphi1}
|
|
|
|
{---------------------------------------------------------------------------}
|
|
procedure AES_Decrypt(var ctx: TAESContext; {$ifdef CONST} const {$else} var {$endif} BI: TAESBlock; var BO: TAESBlock);
|
|
{-encrypt one block, not checked: key must be encryption key}
|
|
var
|
|
s,t: TAESBlock;
|
|
r: integer;
|
|
pK: pointer;
|
|
begin
|
|
r := ctx.Rounds-1;
|
|
pK := @ctx.RK[ctx.Rounds];
|
|
asm
|
|
{AES_XorBlock(BI, ctx.RK[ctx.Rounds], s);}
|
|
|
|
db $66; pusha
|
|
|
|
les si,[BI]
|
|
db $66; mov ax,es:[si]
|
|
db $66; mov bx,es:[si+4]
|
|
db $66; mov cx,es:[si+8]
|
|
db $66; mov dx,es:[si+12]
|
|
|
|
les di,[pK]
|
|
db $66; xor ax,es:[di]
|
|
db $66; xor bx,es:[di+4]
|
|
db $66; xor cx,es:[di+8]
|
|
db $66; xor dx,es:[di+12]
|
|
|
|
db $66; mov word ptr [s],ax
|
|
db $66; mov word ptr [s+4],bx
|
|
db $66; mov word ptr [s+8],cx
|
|
db $66; mov word ptr [s+12],dx
|
|
|
|
|
|
sub di,16 {di -> ctx.RK[r]}
|
|
mov cx,[r]
|
|
|
|
|
|
{ *Note* in the following round loop }
|
|
{ op eax, mem[8*ebx] is calculated as }
|
|
{ lea esi, [edx+8*ebx] $66,$67,$8D,$34,$DA }
|
|
{ op eax, mem[esi] }
|
|
|
|
db $66; sub bx,bx {clear ebx}
|
|
db $66; sub dx,dx {clear edx}
|
|
|
|
@@1:
|
|
|
|
|
|
{TWA4(t)[3] := Td0[s[3*4+0]] xor Td1[s[2*4+1]] xor Td2[s[1*4+2]] xor Td3[s[0*4+3]] xor TWA4(ctx.RK[r])[3];}
|
|
mov bl,byte ptr s[3*4+0]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; mov ax,word ptr TCd[si+3]
|
|
|
|
mov bl,byte ptr s[2*4+1]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; xor ax,word ptr TCd[si+2]
|
|
|
|
mov bl,byte ptr s[1*4+2]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; xor ax,word ptr TCd[si+1]
|
|
|
|
mov bl,byte ptr s[0*4+3]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; xor ax,word ptr TCd[si]
|
|
|
|
db $66; xor ax,es:[di+12]
|
|
db $66; mov word ptr t[12],ax
|
|
|
|
{TWA4(t)[2] := Td0[s[2*4+0]] xor Td1[s[1*4+1]] xor Td2[s[0*4+2]] xor Td3[s[3*4+3]] xor TWA4(ctx.RK[r])[2];}
|
|
mov bl,byte ptr s[2*4+0]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; mov ax,word ptr TCd[si+3]
|
|
|
|
mov bl,byte ptr s[1*4+1]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; xor ax,word ptr TCd[si+2]
|
|
|
|
mov bl,byte ptr s[0*4+2]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; xor ax,word ptr TCd[si+1]
|
|
|
|
mov bl,byte ptr s[3*4+3]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; xor ax,word ptr TCd[si]
|
|
|
|
db $66; xor ax,es:[di+8]
|
|
db $66; mov word ptr t[8],ax
|
|
|
|
|
|
{TWA4(t)[1] := Td0[s[1*4+0]] xor Td1[s[0*4+1]] xor Td2[s[3*4+2]] xor Td3[s[2*4+3]] xor TWA4(ctx.RK[r])[1];}
|
|
mov bl,byte ptr s[1*4+0]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; mov ax,word ptr TCd[si+3]
|
|
|
|
mov bl,byte ptr s[0*4+1]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; xor ax,word ptr TCd[si+2]
|
|
|
|
mov bl,byte ptr s[3*4+2]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; xor ax,word ptr TCd[si+1]
|
|
|
|
mov bl,byte ptr s[2*4+3]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; xor ax,word ptr TCd[si]
|
|
|
|
db $66; xor ax,es:[di+4]
|
|
db $66; mov word ptr t[4],ax
|
|
|
|
|
|
{TWA4(t)[0] := Td0[s[0*4+0]] xor Td1[s[3*4+1]] xor Td2[s[2*4+2]] xor Td3[s[1*4+3]] xor TWA4(ctx.RK[r])[0];}
|
|
mov bl,byte ptr s[0*4+0]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; mov ax,word ptr TCd[si+3]
|
|
|
|
mov bl,byte ptr s[3*4+1]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; xor ax,word ptr TCd[si+2]
|
|
|
|
mov bl,byte ptr s[2*4+2]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; xor ax,word ptr TCd[si+1]
|
|
|
|
mov bl,byte ptr s[1*4+3]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; xor ax,word ptr TCd[si]
|
|
|
|
db $66; xor ax,es:[di]
|
|
db $66; mov word ptr t[0],ax
|
|
|
|
{ dec(r); if r<1 then break;}
|
|
sub cx,1
|
|
jle @@2
|
|
|
|
{TWA4(s)[3] := Td0[t[3*4+0]] xor Td1[t[2*4+1]] xor Td2[t[1*4+2]] xor Td3[t[0*4+3]] xor TWA4(ctx.RK[r])[3];}
|
|
mov bl,byte ptr t[3*4+0]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; mov ax,word ptr TCd[si+3]
|
|
|
|
mov bl,byte ptr t[2*4+1]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; xor ax,word ptr TCd[si+2]
|
|
|
|
mov bl,byte ptr t[1*4+2]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; xor ax,word ptr TCd[si+1]
|
|
|
|
mov bl,byte ptr t[0*4+3]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; xor ax,word ptr TCd[si]
|
|
|
|
db $66; xor ax,es:[di-4]
|
|
db $66; mov word ptr s[12],ax
|
|
|
|
{TWA4(s)[2] := Td0[t[2*4+0]] xor Td1[t[1*4+1]] xor Td2[t[0*4+2]] xor Td3[t[3*4+3]] xor TWA4(ctx.RK[r])[2];}
|
|
mov bl,byte ptr t[2*4+0]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; mov ax,word ptr TCd[si+3]
|
|
|
|
mov bl,byte ptr t[1*4+1]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; xor ax,word ptr TCd[si+2]
|
|
|
|
mov bl,byte ptr t[0*4+2]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; xor ax,word ptr TCd[si+1]
|
|
|
|
mov bl,byte ptr t[3*4+3]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; xor ax,word ptr TCd[si]
|
|
|
|
db $66; xor ax,es:[di-8]
|
|
db $66; mov word ptr s[8],ax
|
|
|
|
{TWA4(s)[1] := Td0[t[1*4+0]] xor Td1[t[0*4+1]] xor Td2[t[3*4+2]] xor Td3[t[2*4+3]] xor TWA4(ctx.RK[r])[1];}
|
|
mov bl,byte ptr t[1*4+0]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; mov ax,word ptr TCd[si+3]
|
|
|
|
mov bl,byte ptr t[0*4+1]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; xor ax,word ptr TCd[si+2]
|
|
|
|
mov bl,byte ptr t[3*4+2]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; xor ax,word ptr TCd[si+1]
|
|
|
|
mov bl,byte ptr t[2*4+3]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; xor ax,word ptr TCd[si]
|
|
|
|
db $66; xor ax,es:[di-12]
|
|
db $66; mov word ptr s[4],ax
|
|
|
|
{TWA4(s)[0] := Td0[t[0*4+0]] xor Td1[t[3*4+1]] xor Td2[t[2*4+2]] xor Td3[t[1*4+3]] xor TWA4(ctx.RK[r])[0];}
|
|
mov bl,byte ptr t[0*4+0]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; mov ax,word ptr TCd[si+3]
|
|
|
|
mov bl,byte ptr t[3*4+1]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; xor ax,word ptr TCd[si+2]
|
|
|
|
mov bl,byte ptr t[2*4+2]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; xor ax,word ptr TCd[si+1]
|
|
|
|
mov bl,byte ptr t[1*4+3]
|
|
db $66,$67,$8D,$34,$DA;
|
|
db $66; xor ax,word ptr TCd[si]
|
|
|
|
db $66; xor ax,es:[di-16]
|
|
db $66; mov word ptr s[0],ax
|
|
|
|
|
|
sub di,32
|
|
dec cx
|
|
jmp @@1
|
|
|
|
@@2: sub di,16 {di -> ctx.RK[0]}
|
|
sub bx,bx
|
|
|
|
mov bl, byte ptr t[0*4+0]
|
|
sub bh,bh
|
|
shl bx,3
|
|
mov al, byte ptr Tcd[bx+7]
|
|
mov byte ptr s[0],al
|
|
|
|
mov bl, byte ptr t[3*4+1]
|
|
sub bh,bh
|
|
shl bx,3
|
|
mov al, byte ptr Tcd[bx+7]
|
|
mov byte ptr s[1],al
|
|
|
|
mov bl, byte ptr t[2*4+2]
|
|
sub bh,bh
|
|
shl bx,3
|
|
mov al, byte ptr Tcd[bx+7]
|
|
mov byte ptr s[2],al
|
|
|
|
mov bl, byte ptr t[1*4+3]
|
|
sub bh,bh
|
|
shl bx,3
|
|
mov al, byte ptr Tcd[bx+7]
|
|
mov byte ptr s[3],al
|
|
|
|
mov bl, byte ptr t[1*4+0]
|
|
sub bh,bh
|
|
shl bx,3
|
|
mov al, byte ptr Tcd[bx+7]
|
|
mov byte ptr s[4],al
|
|
|
|
mov bl, byte ptr t[0*4+1]
|
|
sub bh,bh
|
|
shl bx,3
|
|
mov al, byte ptr Tcd[bx+7]
|
|
mov byte ptr s[5],al
|
|
|
|
mov bl, byte ptr t[3*4+2]
|
|
sub bh,bh
|
|
shl bx,3
|
|
mov al, byte ptr Tcd[bx+7]
|
|
mov byte ptr s[6],al
|
|
|
|
mov bl, byte ptr t[2*4+3]
|
|
sub bh,bh
|
|
shl bx,3
|
|
mov al, byte ptr Tcd[bx+7]
|
|
mov byte ptr s[7],al
|
|
|
|
mov bl, byte ptr t[2*4+0]
|
|
sub bh,bh
|
|
shl bx,3
|
|
mov al, byte ptr Tcd[bx+7]
|
|
mov byte ptr s[8],al
|
|
|
|
mov bl, byte ptr t[1*4+1]
|
|
sub bh,bh
|
|
shl bx,3
|
|
mov al, byte ptr Tcd[bx+7]
|
|
mov byte ptr s[9],al
|
|
|
|
mov bl, byte ptr t[0*4+2]
|
|
sub bh,bh
|
|
shl bx,3
|
|
mov al, byte ptr Tcd[bx+7]
|
|
mov byte ptr s[10],al
|
|
|
|
mov bl, byte ptr t[3*4+3]
|
|
sub bh,bh
|
|
shl bx,3
|
|
mov al, byte ptr Tcd[bx+7]
|
|
mov byte ptr s[11],al
|
|
|
|
mov bl, byte ptr t[3*4+0]
|
|
sub bh,bh
|
|
shl bx,3
|
|
mov al, byte ptr Tcd[bx+7]
|
|
mov byte ptr s[12],al
|
|
|
|
mov bl, byte ptr t[2*4+1]
|
|
sub bh,bh
|
|
shl bx,3
|
|
mov al, byte ptr Tcd[bx+7]
|
|
mov byte ptr s[13],al
|
|
|
|
mov bl, byte ptr t[1*4+2]
|
|
sub bh,bh
|
|
shl bx,3
|
|
mov al, byte ptr Tcd[bx+7]
|
|
mov byte ptr s[14],al
|
|
|
|
mov bl, byte ptr t[0*4+3]
|
|
sub bh,bh
|
|
shl bx,3
|
|
mov al, byte ptr Tcd[bx+7]
|
|
mov byte ptr s[15],al
|
|
|
|
{AES_XorBlock(s, ctx.RK[0], BO);}
|
|
db $66; mov ax,word ptr [s]
|
|
db $66; mov bx,word ptr [s+4]
|
|
db $66; mov cx,word ptr [s+8]
|
|
db $66; mov dx,word ptr [s+12]
|
|
db $66; xor ax,es:[di]
|
|
db $66; xor bx,es:[di+4]
|
|
db $66; xor cx,es:[di+8]
|
|
db $66; xor dx,es:[di+12]
|
|
les si,[BO]
|
|
db $66; mov es:[si],ax
|
|
db $66; mov es:[si+4],bx
|
|
db $66; mov es:[si+8],cx
|
|
db $66; mov es:[si+12],dx
|
|
|
|
db $66; popa
|
|
|
|
end;
|
|
end;
|
|
|
|
|
|
{---------------------------------------------------------------------------}
|
|
procedure MakeDecrKey(var ctx: TAESContext);
|
|
{-Calculate decryption key from encryption key}
|
|
var
|
|
n: integer;
|
|
p: PLong;
|
|
begin
|
|
p := Plong(@ctx.RK[1]);
|
|
n := 4*(ctx.Rounds-1);
|
|
{BASM version of 16 bit code, no need for local x/t}
|
|
{implicit endian conversion compared with [2]}
|
|
asm
|
|
les si,[p]
|
|
mov cx,[n]
|
|
@@1: mov dx,es:[si]
|
|
sub bh,bh
|
|
mov bl,dl
|
|
mov bl,byte ptr SBox[bx]
|
|
shl bx,3
|
|
db $66; mov ax,word ptr TCd[bx+3]
|
|
sub bh,bh
|
|
mov bl,dh
|
|
mov bl,byte ptr SBox[bx]
|
|
shl bx,3
|
|
db $66; xor ax,word ptr TCd[bx+2]
|
|
mov dx,es:[si+2]
|
|
sub bh,bh
|
|
mov bl,dl
|
|
mov bl,byte ptr SBox[bx]
|
|
shl bx,3
|
|
db $66; xor ax,word ptr TCd[bx+1]
|
|
sub bh,bh
|
|
mov bl,dh
|
|
mov bl,byte ptr SBox[bx]
|
|
shl bx,3
|
|
db $66; xor ax,word ptr TCd[bx]
|
|
db $66; mov es:[si],ax
|
|
add si,4
|
|
dec cx
|
|
jnz @@1
|
|
end;
|
|
end;
|