{***************************************************************
*
* Unit Name: Steak
* Purpose : Declaration and implementation of Steak PCFB Cipher
* Author : Henrick Hellström
* History : Original version, 2000 dec 11
* Modification in TSteakCipher.SetUp, 2001 feb 19
*
****************************************************************}
{$Q-,R-}
{*******************************************************}
{ }
{ StreamSec Security Library for Borland Delphi }
{ Steak Cipher Unit }
{ }
{ Copyright (C) 2000 StreamSec Handelsbolag }
{ }
{*******************************************************}
unit Steak;
interface
uses
SecUtils, CombUtils;
const
Bit32: array[0..31] of LongWord =
($00000001,$00000002,$00000004,$00000008,
$00000010,$00000020,$00000040,$00000080,
$00000100,$00000200,$00000400,$00000800,
$00001000,$00002000,$00004000,$00008000,
$00010000,$00020000,$00040000,$00080000,
$00100000,$00200000,$00400000,$00800000,
$01000000,$02000000,$04000000,$08000000,
$10000000,$20000000,$40000000,$80000000);
PermKeySize = 837;
resourcestring
S_ERR_TOO_SMALL_KEY = 'The key is too small.';
type
PSteakBox = ^TSteakBox;
TSteakBox = array [0..3,0..255] of LongWord;
TSteakCipher = class(TCipher)
private
function GetBox: TSteakBox;
protected
FData: Pointer;
FBox: PSteakBox;
FVector: Pointer;
FVectorSize: Integer;
procedure CleanUp; override;
function GetVector: string; override;
procedure SetVector(const Value: string); override;
procedure SetUpDist(var Buf; Count: Integer; out TempBox: TSteakBox); virtual;
procedure SetUpPermDist(var Buf; Count: Integer; const TempBox: TSteakBox); virtual;
procedure SetUpVector(var Buf; Count: Integer; VectorSize: Integer); virtual;
public
procedure Decrypt(var Buf; Count: Integer); override;
procedure Encrypt(var Buf; Count: Integer); override;
procedure SetUp(const AKey; Count, VectorSize: Integer); override;
property Box: TSteakBox read GetBox;
property Data: Pointer read FData;
end;
TDefaultSteak = class(TSteakCipher)
public
procedure SetUp(const AKey; Count, VectorSize: Integer); override;
end;
const
Steak_Data: TSteakBox =
(($00000000,$8080F8C4,$88084AB1,$0888B275,$31CA8808,$B14A70CC,$B9C2C2B9,$39423A7D,
$51B2C040,$D1323884,$D9BA8AF1,$593A7235,$60784848,$E0F8B08C,$E87002F9,$68F0FA3D,
$813D8145,$01BD7981,$0935CBF4,$89B53330,$B0F7094D,$3077F189,$38FF43FC,$B87FBB38,
$D08F4105,$500FB9C1,$58870BB4,$D807F370,$E145C90D,$61C531C9,$694D83BC,$E9CD7B78,
$90631021,$10E3E8E5,$186B5A90,$98EBA254,$A1A99829,$212960ED,$29A1D298,$A9212A5C,
$C1D1D061,$415128A5,$49D99AD0,$C9596214,$F01B5869,$709BA0AD,$781312D8,$F893EA1C,
$115E9164,$91DE69A0,$9956DBD5,$19D62311,$2094196C,$A014E1A8,$A89C53DD,$281CAB19,
$40EC5124,$C06CA9E0,$C8E41B95,$4864E351,$7126D92C,$F1A621E8,$F92E939D,$79AE6B59,
$024B2682,$82CBDE46,$8A436C33,$0AC394F7,$3381AE8A,$B301564E,$BB89E43B,$3B091CFF,
$53F9E6C2,$D3791E06,$DBF1AC73,$5B7154B7,$62336ECA,$E2B3960E,$EA3B247B,$6ABBDCBF,
$8376A7C7,$03F65F03,$0B7EED76,$8BFE15B2,$B2BC2FCF,$323CD70B,$3AB4657E,$BA349DBA,
$D2C46787,$52449F43,$5ACC2D36,$DA4CD5F2,$E30EEF8F,$638E174B,$6B06A53E,$EB865DFA,
$922836A3,$12A8CE67,$1A207C12,$9AA084D6,$A3E2BEAB,$2362466F,$2BEAF41A,$AB6A0CDE,
$C39AF6E3,$431A0E27,$4B92BC52,$CB124496,$F2507EEB,$72D0862F,$7A58345A,$FAD8CC9E,
$1315B7E6,$93954F22,$9B1DFD57,$1B9D0593,$22DF3FEE,$A25FC72A,$AAD7755F,$2A578D9B,
$42A777A6,$C2278F62,$CAAF3D17,$4A2FC5D3,$736DFFAE,$F3ED076A,$FB65B51F,$7BE54DDB,
$0422CD04,$84A235C0,$8C2A87B5,$0CAA7F71,$35E8450C,$B568BDC8,$BDE00FBD,$3D60F779,
$55900D44,$D510F580,$DD9847F5,$5D18BF31,$645A854C,$E4DA7D88,$EC52CFFD,$6CD23739,
$851F4C41,$059FB485,$0D1706F0,$8D97FE34,$B4D5C449,$34553C8D,$3CDD8EF8,$BC5D763C,
$D4AD8C01,$542D74C5,$5CA5C6B0,$DC253E74,$E5670409,$65E7FCCD,$6D6F4EB8,$EDEFB67C,
$9441DD25,$14C125E1,$1C499794,$9CC96F50,$A58B552D,$250BADE9,$2D831F9C,$AD03E758,
$C5F31D65,$4573E5A1,$4DFB57D4,$CD7BAF10,$F439956D,$74B96DA9,$7C31DFDC,$FCB12718,
$157C5C60,$95FCA4A4,$9D7416D1,$1DF4EE15,$24B6D468,$A4362CAC,$ACBE9ED9,$2C3E661D,
$44CE9C20,$C44E64E4,$CCC6D691,$4C462E55,$75041428,$F584ECEC,$FD0C5E99,$7D8CA65D,
$0669EB86,$86E91342,$8E61A137,$0EE159F3,$37A3638E,$B7239B4A,$BFAB293F,$3F2BD1FB,
$57DB2BC6,$D75BD302,$DFD36177,$5F5399B3,$6611A3CE,$E6915B0A,$EE19E97F,$6E9911BB,
$87546AC3,$07D49207,$0F5C2072,$8FDCD8B6,$B69EE2CB,$361E1A0F,$3E96A87A,$BE1650BE,
$D6E6AA83,$56665247,$5EEEE032,$DE6E18F6,$E72C228B,$67ACDA4F,$6F24683A,$EFA490FE,
$960AFBA7,$168A0363,$1E02B116,$9E8249D2,$A7C073AF,$27408B6B,$2FC8391E,$AF48C1DA,
$C7B83BE7,$4738C323,$4FB07156,$CF308992,$F672B3EF,$76F24B2B,$7E7AF95E,$FEFA019A,
$17377AE2,$97B78226,$9F3F3053,$1FBFC897,$26FDF2EA,$A67D0A2E,$AEF5B85B,$2E75409F,
$4685BAA2,$C6054266,$CE8DF013,$4E0D08D7,$774F32AA,$F7CFCA6E,$FF47781B,$7FC780DF),
($00000000,$810145BD,$02023FFB,$83037A46,$C4F88080,$45F9C53D,$C6FABF7B,$47FBFAC6,
$42FF0404,$C3FE41B9,$40FD3BFF,$C1FC7E42,$86078484,$0706C139,$8405BB7F,$0504FEC2,
$2072A043,$A173E5FE,$22709FB8,$A371DA05,$E48A20C3,$658B657E,$E6881F38,$67895A85,
$628DA447,$E38CE1FA,$608F9BBC,$E18EDE01,$A67524C7,$2774617A,$A4771B3C,$25765E81,
$C051C032,$4150858F,$C253FFC9,$4352BA74,$04A940B2,$85A8050F,$06AB7F49,$87AA3AF4,
$82AEC436,$03AF818B,$80ACFBCD,$01ADBE70,$465644B6,$C757010B,$44547B4D,$C5553EF0,
$E0236071,$612225CC,$E2215F8A,$63201A37,$24DBE0F1,$A5DAA54C,$26D9DF0A,$A7D89AB7,
$A2DC6475,$23DD21C8,$A0DE5B8E,$21DF1E33,$6624E4F5,$E725A148,$6426DB0E,$E5279EB3,
$08452E88,$89446B35,$0A471173,$8B4654CE,$CCBDAE08,$4DBCEBB5,$CEBF91F3,$4FBED44E,
$4ABA2A8C,$CBBB6F31,$48B81577,$C9B950CA,$8E42AA0C,$0F43EFB1,$8C4095F7,$0D41D04A,
$28378ECB,$A936CB76,$2A35B130,$AB34F48D,$ECCF0E4B,$6DCE4BF6,$EECD31B0,$6FCC740D,
$6AC88ACF,$EBC9CF72,$68CAB534,$E9CBF089,$AE300A4F,$2F314FF2,$AC3235B4,$2D337009,
$C814EEBA,$4915AB07,$CA16D141,$4B1794FC,$0CEC6E3A,$8DED2B87,$0EEE51C1,$8FEF147C,
$8AEBEABE,$0BEAAF03,$88E9D545,$09E890F8,$4E136A3E,$CF122F83,$4C1155C5,$CD101078,
$E8664EF9,$69670B44,$EA647102,$6B6534BF,$2C9ECE79,$AD9F8BC4,$2E9CF182,$AF9DB43F,
$AA994AFD,$2B980F40,$A89B7506,$299A30BB,$6E61CA7D,$EF608FC0,$6C63F586,$ED62B03B,
$103EDD10,$913F98AD,$123CE2EB,$933DA756,$D4C65D90,$55C7182D,$D6C4626B,$57C527D6,
$52C1D914,$D3C09CA9,$50C3E6EF,$D1C2A352,$96395994,$17381C29,$943B666F,$153A23D2,
$304C7D53,$B14D38EE,$324E42A8,$B34F0715,$F4B4FDD3,$75B5B86E,$F6B6C228,$77B78795,
$72B37957,$F3B23CEA,$70B146AC,$F1B00311,$B64BF9D7,$374ABC6A,$B449C62C,$35488391,
$D06F1D22,$516E589F,$D26D22D9,$536C6764,$14979DA2,$9596D81F,$1695A259,$9794E7E4,
$92901926,$13915C9B,$909226DD,$11936360,$566899A6,$D769DC1B,$546AA65D,$D56BE3E0,
$F01DBD61,$711CF8DC,$F21F829A,$731EC727,$34E53DE1,$B5E4785C,$36E7021A,$B7E647A7,
$B2E2B965,$33E3FCD8,$B0E0869E,$31E1C323,$761A39E5,$F71B7C58,$7418061E,$F51943A3,
$187BF398,$997AB625,$1A79CC63,$9B7889DE,$DC837318,$5D8236A5,$DE814CE3,$5F80095E,
$5A84F79C,$DB85B221,$5886C867,$D9878DDA,$9E7C771C,$1F7D32A1,$9C7E48E7,$1D7F0D5A,
$380953DB,$B9081666,$3A0B6C20,$BB0A299D,$FCF1D35B,$7DF096E6,$FEF3ECA0,$7FF2A91D,
$7AF657DF,$FBF71262,$78F46824,$F9F52D99,$BE0ED75F,$3F0F92E2,$BC0CE8A4,$3D0DAD19,
$D82A33AA,$592B7617,$DA280C51,$5B2949EC,$1CD2B32A,$9DD3F697,$1ED08CD1,$9FD1C96C,
$9AD537AE,$1BD47213,$98D70855,$19D64DE8,$5E2DB72E,$DF2CF293,$5C2F88D5,$DD2ECD68,
$F85893E9,$7959D654,$FA5AAC12,$7B5BE9AF,$3CA01369,$BDA156D4,$3EA22C92,$BFA3692F,
$BAA797ED,$3BA6D250,$B8A5A816,$39A4EDAB,$7E5F176D,$FF5E52D0,$7C5D2896,$FD5C6D2B),
($00000000,$84047F42,$C04032D1,$44444D93,$3DC58101,$B9C1FE43,$FD85B3D0,$7981CC92,
$63219010,$E725EF52,$A361A2C1,$2765DD83,$5EE41111,$DAE06E53,$9EA423C0,$1AA05C82,
$827B023F,$067F7D7D,$423B30EE,$C63F4FAC,$BFBE833E,$3BBAFC7C,$7FFEB1EF,$FBFACEAD,
$E15A922F,$655EED6D,$211AA0FE,$A51EDFBC,$DC9F132E,$589B6C6C,$1CDF21FF,$98DB5EBD,
$8831884A,$0C35F708,$4871BA9B,$CC75C5D9,$B5F4094B,$31F07609,$75B43B9A,$F1B044D8,
$EB10185A,$6F146718,$2B502A8B,$AF5455C9,$D6D5995B,$52D1E619,$1695AB8A,$9291D4C8,
$0A4A8A75,$8E4EF537,$CA0AB8A4,$4E0EC7E6,$378F0B74,$B38B7436,$F7CF39A5,$73CB46E7,
$696B1A65,$ED6F6527,$A92B28B4,$2D2F57F6,$54AE9B64,$D0AAE426,$94EEA9B5,$10EAD6F7,
$80C8A480,$04CCDBC2,$40889651,$C48CE913,$BD0D2581,$39095AC3,$7D4D1750,$F9496812,
$E3E93490,$67ED4BD2,$23A90641,$A7AD7903,$DE2CB591,$5A28CAD3,$1E6C8740,$9A68F802,
$02B3A6BF,$86B7D9FD,$C2F3946E,$46F7EB2C,$3F7627BE,$BB7258FC,$FF36156F,$7B326A2D,
$619236AF,$E59649ED,$A1D2047E,$25D67B3C,$5C57B7AE,$D853C8EC,$9C17857F,$1813FA3D,
$08F92CCA,$8CFD5388,$C8B91E1B,$4CBD6159,$353CADCB,$B138D289,$F57C9F1A,$7178E058,
$6BD8BCDA,$EFDCC398,$AB988E0B,$2F9CF149,$561D3DDB,$D2194299,$965D0F0A,$12597048,
$8A822EF5,$0E8651B7,$4AC21C24,$CEC66366,$B747AFF4,$3343D0B6,$77079D25,$F303E267,
$E9A3BEE5,$6DA7C1A7,$29E38C34,$ADE7F376,$D4663FE4,$506240A6,$14260D35,$90227277,
$207D0EA0,$A47971E2,$E03D3C71,$64394333,$1DB88FA1,$99BCF0E3,$DDF8BD70,$59FCC232,
$435C9EB0,$C758E1F2,$831CAC61,$0718D323,$7E991FB1,$FA9D60F3,$BED92D60,$3ADD5222,
$A2060C9F,$260273DD,$62463E4E,$E642410C,$9FC38D9E,$1BC7F2DC,$5F83BF4F,$DB87C00D,
$C1279C8F,$4523E3CD,$0167AE5E,$8563D11C,$FCE21D8E,$78E662CC,$3CA22F5F,$B8A6501D,
$A84C86EA,$2C48F9A8,$680CB43B,$EC08CB79,$958907EB,$118D78A9,$55C9353A,$D1CD4A78,
$CB6D16FA,$4F6969B8,$0B2D242B,$8F295B69,$F6A897FB,$72ACE8B9,$36E8A52A,$B2ECDA68,
$2A3784D5,$AE33FB97,$EA77B604,$6E73C946,$17F205D4,$93F67A96,$D7B23705,$53B64847,
$491614C5,$CD126B87,$89562614,$0D525956,$74D395C4,$F0D7EA86,$B493A715,$3097D857,
$A0B5AA20,$24B1D562,$60F598F1,$E4F1E7B3,$9D702B21,$19745463,$5D3019F0,$D93466B2,
$C3943A30,$47904572,$03D408E1,$87D077A3,$FE51BB31,$7A55C473,$3E1189E0,$BA15F6A2,
$22CEA81F,$A6CAD75D,$E28E9ACE,$668AE58C,$1F0B291E,$9B0F565C,$DF4B1BCF,$5B4F648D,
$41EF380F,$C5EB474D,$81AF0ADE,$05AB759C,$7C2AB90E,$F82EC64C,$BC6A8BDF,$386EF49D,
$2884226A,$AC805D28,$E8C410BB,$6CC06FF9,$1541A36B,$9145DC29,$D50191BA,$5105EEF8,
$4BA5B27A,$CFA1CD38,$8BE580AB,$0FE1FFE9,$7660337B,$F2644C39,$B62001AA,$32247EE8,
$AAFF2055,$2EFB5F17,$6ABF1284,$EEBB6DC6,$973AA154,$133EDE16,$577A9385,$D37EECC7,
$C9DEB045,$4DDACF07,$099E8294,$8D9AFDD6,$F41B3144,$701F4E06,$345B0395,$B05F7CD7),
($00000000,$101021E3,$A0204372,$B0306291,$7B3F8202,$6B2FA3E1,$DB1FC170,$CB0FE093,
$72C32020,$62D301C3,$D2E36352,$C2F342B1,$09FCA222,$19EC83C1,$A9DCE150,$B9CCC0B3,
$80C480F8,$90D4A11B,$20E4C38A,$30F4E269,$FBFB02FA,$EBEB2319,$5BDB4188,$4BCB606B,
$F207A0D8,$E217813B,$5227E3AA,$4237C249,$893822DA,$99280339,$291861A8,$3908404B,
$0442847F,$1452A59C,$A462C70D,$B472E6EE,$7F7D067D,$6F6D279E,$DF5D450F,$CF4D64EC,
$7681A45F,$669185BC,$D6A1E72D,$C6B1C6CE,$0DBE265D,$1DAE07BE,$AD9E652F,$BD8E44CC,
$84860487,$94962564,$24A647F5,$34B66616,$FFB98685,$EFA9A766,$5F99C5F7,$4F89E414,
$F64524A7,$E6550544,$566567D5,$46754636,$8D7AA6A5,$9D6A8746,$2D5AE5D7,$3D4AC434,
$0125C901,$1135E8E2,$A1058A73,$B115AB90,$7A1A4B03,$6A0A6AE0,$DA3A0871,$CA2A2992,
$73E6E921,$63F6C8C2,$D3C6AA53,$C3D68BB0,$08D96B23,$18C94AC0,$A8F92851,$B8E909B2,
$81E149F9,$91F1681A,$21C10A8B,$31D12B68,$FADECBFB,$EACEEA18,$5AFE8889,$4AEEA96A,
$F32269D9,$E332483A,$53022AAB,$43120B48,$881DEBDB,$980DCA38,$283DA8A9,$382D894A,
$05674D7E,$15776C9D,$A5470E0C,$B5572FEF,$7E58CF7C,$6E48EE9F,$DE788C0E,$CE68ADED,
$77A46D5E,$67B44CBD,$D7842E2C,$C7940FCF,$0C9BEF5C,$1C8BCEBF,$ACBBAC2E,$BCAB8DCD,
$85A3CD86,$95B3EC65,$25838EF4,$3593AF17,$FE9C4F84,$EE8C6E67,$5EBC0CF6,$4EAC2D15,
$F760EDA6,$E770CC45,$5740AED4,$47508F37,$8C5F6FA4,$9C4F4E47,$2C7F2CD6,$3C6F0D35,
$404E9D40,$505EBCA3,$E06EDE32,$F07EFFD1,$3B711F42,$2B613EA1,$9B515C30,$8B417DD3,
$328DBD60,$229D9C83,$92ADFE12,$82BDDFF1,$49B23F62,$59A21E81,$E9927C10,$F9825DF3,
$C08A1DB8,$D09A3C5B,$60AA5ECA,$70BA7F29,$BBB59FBA,$ABA5BE59,$1B95DCC8,$0B85FD2B,
$B2493D98,$A2591C7B,$12697EEA,$02795F09,$C976BF9A,$D9669E79,$6956FCE8,$7946DD0B,
$440C193F,$541C38DC,$E42C5A4D,$F43C7BAE,$3F339B3D,$2F23BADE,$9F13D84F,$8F03F9AC,
$36CF391F,$26DF18FC,$96EF7A6D,$86FF5B8E,$4DF0BB1D,$5DE09AFE,$EDD0F86F,$FDC0D98C,
$C4C899C7,$D4D8B824,$64E8DAB5,$74F8FB56,$BFF71BC5,$AFE73A26,$1FD758B7,$0FC77954,
$B60BB9E7,$A61B9804,$162BFA95,$063BDB76,$CD343BE5,$DD241A06,$6D147897,$7D045974,
$416B5441,$517B75A2,$E14B1733,$F15B36D0,$3A54D643,$2A44F7A0,$9A749531,$8A64B4D2,
$33A87461,$23B85582,$93883713,$839816F0,$4897F663,$5887D780,$E8B7B511,$F8A794F2,
$C1AFD4B9,$D1BFF55A,$618F97CB,$719FB628,$BA9056BB,$AA807758,$1AB015C9,$0AA0342A,
$B36CF499,$A37CD57A,$134CB7EB,$035C9608,$C853769B,$D8435778,$687335E9,$7863140A,
$4529D03E,$5539F1DD,$E509934C,$F519B2AF,$3E16523C,$2E0673DF,$9E36114E,$8E2630AD,
$37EAF01E,$27FAD1FD,$97CAB36C,$87DA928F,$4CD5721C,$5CC553FF,$ECF5316E,$FCE5108D,
$C5ED50C6,$D5FD7125,$65CD13B4,$75DD3257,$BED2D2C4,$AEC2F327,$1EF291B6,$0EE2B055,
$B72E70E6,$A73E5105,$170E3394,$071E1277,$CC11F2E4,$DC01D307,$6C31B196,$7C219075));
implementation
uses
SysUtils, Classes;
{ TDefaultSteak }
procedure TDefaultSteak.SetUp(const AKey; Count, VectorSize: Integer);
var
I, J, K: Integer;
So,De: ^Byte;
begin
CleanUp;
GetMem(FData,16 + 4096 + VectorSize * 8);
FBox := Ptr(LongInt(FData) + 12);
FVector := Ptr(LongInt(FData) + $1010);
FVectorSize := VectorSize;
Move(FVectorSize,Ptr(LongInt(FVector) - 4)^,4);
FBox^ := Steak_Data;
So := @AKey;
De := Ptr(LongInt(FVector) + VectorSize*8);
FillChar(FVector^,VectorSize*8,$AA);
K := Count;
for I := 0 to VectorSize - 1 do begin
Dec(LongInt(De),4);
for J := 0 to 3 do begin
Dec(LongInt(De));
if K > 0 then De^ := So^
else if K = 0 then De^ := Count and $FF
else if K = -1 then De^ := (Count shr 8) and $FF
else if K = -2 then De^ := (Count shr 16) and $FF
else if K = -3 then De^ := (Count shr 24) and $FF
else De^ := 0;
Dec(K);
Inc(LongInt(So));
end;
end;
end;
{ TSteakCipher }
procedure TSteakCipher.CleanUp;
begin
if FData = nil then Exit;
ProtectClear(FData^,16 + SizeOf(TSteakBox) + FVectorSize * 8);
FreeMem(FData);
FData := nil;
FBox := nil;
FVector := nil;
end;
procedure _Decrypt(var Arg; var Buf; Count: LongInt);
{ Arg[0]: reserved
Arg[1]: reserved
Arg[2]: reserved for Count
Arg[3..1026]: SteakBox
Arg[1027]: VectorSize
Arg[1028..] Vector,A}
asm
push EBX
push EDI
push ESI
push EBP
mov EBP,EAX // Arg
mov EDI,EDX // Buf
mov [EBP + $08],ECX // Count
// VectorSize
mov ECX,[EBP + $100C]
@@BufLoop:
// V
lea ESI,[EBP + ECX*8 + $1010]
// PV
mov EAX,[EBP + $1010]
dec ECX
jz @@LastRound
@@Loop: // ProcessVector
sub ESI,$08
mov byte [EBP],AL
add EAX,[ESI + $04]
movzx EDX,AL
mov EBX,[EBP + EDX*4 + $0C]
mov DL,AH
xor EBX,[EBP + EDX*4 + $040C]
shr EAX,$10
mov DL,AL
xor EBX,[EBP + EDX*4 + $080C]
mov DL,AH
xor EBX,[EBP + EDX*4 + $0C0C]
add EBX,[ESI]
mov EAX,EBX
rol EAX,4
mov BL,byte [EBP]
ror EBX,$08
mov [ESI],EBX
loop @@Loop
@@LastRound:
// Last round is special:
sub ESI,$08
mov byte [EBP],AL
add EAX,[ESI + $04]
movzx EDX,AL
mov EBX,[EBP + EDX*4 + $0C]
mov DL,AH
xor EBX,[EBP + EDX*4 + $040C]
shr EAX,$10
mov DL,AL
xor EBX,[EBP + EDX*4 + $080C]
mov DL,AH
xor EBX,[EBP + EDX*4 + $0C0C]
// Vector^[VSize-1] := P^
mov DL,[EDI]
mov ECX,[EBP + $100C]
mov [EBP + ECX*8 + $100B],DL
// P^ := P^ xor ProcessVector
xor DL,BL
mov [EDI],DL
// Finish last round:
add EBX,[ESI]
mov BL,byte [EBP]
ror EBX,$08
mov [ESI],EBX
inc EDI
dec dword [EBP + $08]
jnz @@BufLoop
@@Exit:
pop EBP
pop ESI
pop EDI
pop EBX
end;
procedure TSteakCipher.Decrypt(var Buf; Count: Integer);
begin
if Count = 0 then Exit;
_Decrypt(FData^,Buf,Count);
end;
procedure _Encrypt(var Arg; var Buf; Count: LongInt);
{ Arg[0]: reserved
Arg[1]: reserved
Arg[2]: reserved for Count
Arg[3..1026]: SteakBox
Arg[1027]: VectorSize
Arg[1028..] Vector,A}
asm
push EBX
push EDI
push ESI
push EBP
mov EBP,EAX // Arg
mov EDI,EDX // Buf
mov [EBP + $08],ECX // Count
// VectorSize
mov ECX,[EBP + $100C]
@@BufLoop:
// V
lea ESI,[EBP + ECX*8 + $1010]
// PV
mov EAX,[EBP + $1010]
dec ECX
jz @@LastRound
@@Loop: // ProcessVector
sub ESI,$08
mov byte [EBP],AL
add EAX,[ESI + $04]
movzx EDX,AL
mov EBX,[EBP + EDX*4 + $0C]
mov DL,AH
xor EBX,[EBP + EDX*4 + $040C]
shr EAX,$10
mov DL,AL
xor EBX,[EBP + EDX*4 + $080C]
mov DL,AH
xor EBX,[EBP + EDX*4 + $0C0C]
add EBX,[ESI]
mov EAX,EBX
rol EAX,4
mov BL,byte [EBP]
ror EBX,$08
mov [ESI],EBX
loop @@Loop
@@LastRound:
// Last round is special:
sub ESI,$08
mov byte [EBP],AL
add EAX,[ESI + $04]
movzx EDX,AL
mov EBX,[EBP + EDX*4 + $0C]
mov DL,AH
xor EBX,[EBP + EDX*4 + $040C]
shr EAX,$10
mov DL,AL
xor EBX,[EBP + EDX*4 + $080C]
mov DL,AH
xor EBX,[EBP + EDX*4 + $0C0C]
// P^ := P^ xor ProcessVector
mov DL,byte [EDI]
xor DL,BL
mov byte [EDI],DL
// Feedback: V^[VSize-1] := P^
mov ECX,[EBP + $100C]
mov byte [EBP + ECX*8 + $100B],DL
// Finish last round, complete V for output:
add EBX,[ESI]
mov BL,byte [EBP]
ror EBX,$08
mov [ESI],EBX
inc EDI
dec dword [EBP + $08]
jnz @@BufLoop
@@Exit:
pop EBP
pop ESI
pop EDI
pop EBX
end;
procedure TSteakCipher.Encrypt(var Buf; Count: Integer);
begin
if Count = 0 then Exit;
_Encrypt(FData^,Buf,Count);
end;
function TSteakCipher.GetBox: TSteakBox;
begin
Result := FBox^;
end;
function TSteakCipher.GetVector: string;
var
I: Integer;
begin
SetLength(Result,FVectorSize * 4);
for I := 0 to FVectorSize - 1 do
Move(Ptr(LongInt(FVector) + I*8)^,Result[1 + I*4],4);
end;
procedure TSteakCipher.SetUp(const AKey; Count, VectorSize: Integer);
var
Data: Pointer;
TempBox: TSteakBox;
KeySize: Integer;
DefSteak: TDefaultSteak;
WKey: string;
begin
if VectorSize <= 0 then VectorSize := Count div 8;
if VectorSize < 1 then VectorSize := 1;
CleanUp;
GetMem(FData,16 + 4096 + VectorSize * 8);
FBox := Ptr(LongInt(FData) + 12);
FVector := Ptr(LongInt(FData) + $1010);
KeySize := PermKeySize + VectorSize * 8;
GetMem(Data,KeySize);
try
FillChar(Data^,KeySize,0);
if Count < KeySize then begin
Move(AKey,Data^,Count)
if Count < KeySize - 4 then
Move(Count,Ptr(LongInt(Data) + Count)^,4)
else
Move(Count,Ptr(LongInt(Data) + Count)^,KeySize - Count)
end else
Move(AKey,Data^,KeySize);
try
WKey := StringOfChar(#$AA,((KeySize shr 2) + 1) * 4);
DefSteak := TDefaultSteak.Create(WKey[1],Length(WKey),(KeySize shr 2) + 1);
try
// Note: The actual cipher text is used.
DefSteak.Encrypt(Data^,KeySize);
// Set up temporary box:
SetUpDist(Data^,KeySize,TempBox);
// Permute values:
SetUpPermDist(Data^,KeySize,TempBox);
// Set up whitening vectors:
WKey := StringOfChar(#$AA,VectorSize * 8);
DefSteak.SetUp(WKey[1],Length(WKey),VectorSize * 2);
// Note: The actual cipher text is used.
DefSteak.Encrypt(Data^,VectorSize * 8);
SetUpVector(Data^,KeySize,VectorSize);
finally
DefSteak.Free;
end;
// Clean up:
finally
ProtectClear(TempBox,SizeOf(TempBox));
ProtectClear(Data^,KeySize);
end;
finally
FreeMem(Data);
end;
end;
procedure TSteakCipher.SetUpDist(var Buf; Count: Integer;
out TempBox: TSteakBox);
begin
TempBox := Steak_Data;
end;
procedure TSteakCipher.SetUpPermDist(var Buf; Count: Integer;
const TempBox: TSteakBox);
var
Perm: TPermutation;
I, J: Integer;
begin
// Permute values:
for I := 0 to 3 do begin
// Do the permutation:
Perm := TPermutation.Create(Buf,Count,256);
try
for J := 0 to 255 do
FBox[I,J] := TempBox[I,Perm.Map[J]];
finally
Perm.Free;
end;
end;
end;
procedure TSteakCipher.SetUpVector(var Buf; Count, VectorSize: Integer);
var
K: Integer;
begin
// Set up whitening vectors:
K := VectorSize * 8;
FVectorSize := VectorSize;
Move(FVectorSize,Ptr(LongInt(FVector) - 4)^,4);
Move(Buf,FVector^,K);
end;
procedure TSteakCipher.SetVector(const Value: string);
var
I: Integer;
begin
if Length(Value) < FVectorSize * 4 then
raise Exception.Create(S_ERR_TOO_SMALL_KEY);
for I := 0 to FVectorSize - 1 do
Move(Value[1 + I * 4],Ptr(LongInt(FVector) + I * 8)^,4);
end;
end.