CVS freexp
CVS User mw
cvs-list at freexp.de
Son Nov 2 11:25:40 CET 2008
Update of /server/cvs/freexp
In directory m6s15:/tmp/cvs-serv8203
Modified Files:
Tag: Branch_3_40_Release
sha1.pas hash.pas std.inc md5.pas
Log Message:
MW: - neues Upstream-Release der Cryptolib
--- /server/cvs/freexp/sha1.pas 2007/07/22 14:22:00 1.1.2.5
+++ /server/cvs/freexp/sha1.pas 2008/11/02 10:25:40 1.1.2.6
@@ -1,4 +1,4 @@
-{ $Id: sha1.pas,v 1.1.2.5 2007/07/22 14:22:00 mw Exp $ }
+{ $Id: sha1.pas,v 1.1.2.6 2008/11/02 10:25:40 mw Exp $ }
unit SHA1;
{$I-}
{SHA1 - 160 bit Secure Hash Function}
@@ -70,12 +70,17 @@
3.17 30.06.07 we Use conditional define FPC_ProcVar
3.17fxp1 15.07.07 fxp sha1sum_file und sha1sum_str implementiert
+
+ 3.19 02.05.08 we Bit-API: SHA1FinalBits/Ex
+ 3.20 05.05.08 we THashDesc constant with HFinalBit field
+
+ 3.20fxp1 02.11.08 fxp Neues Upstream Release
**************************************************************************)
(*-------------------------------------------------------------------------
- (C) Copyright 2002-2007 Wolfgang Ehrhardt
- (C) Copyright 2007 FreeXP
+ (C) Copyright 2002-2008 Wolfgang Ehrhardt
+ (C) Copyright 2007-2008 FreeXP
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from
@@ -134,8 +139,16 @@
{-finalize SHA1 calculation, clear context}
{$ifdef DLL} stdcall; {$endif}
+procedure SHA1FinalBitsEx(var Context: THashContext; var Digest: THashDigest; BData: byte; bitlen: integer);
+ {-finalize SHA1 calculation with bitlen bits from BData (big-endian), clear context}
+ {$ifdef DLL} stdcall; {$endif}
+
+procedure SHA1FinalBits(var Context: THashContext; var Digest: TSHA1Digest; BData: byte; bitlen: integer);
+ {-finalize SHA1 calculation with bitlen bits from BData (big-endian), clear context}
+ {$ifdef DLL} stdcall; {$endif}
+
function SHA1SelfTest: boolean;
- {-self test for string from SHA1 document}
+ {-self test SHA1: compare with known value}
{$ifdef DLL} stdcall; {$endif}
procedure SHA1Full(var Digest: TSHA1Digest; Msg: pointer; Len: word);
@@ -174,74 +187,44 @@
TWorkBuf = array[0..79] of longint;
PByte = ^byte;
+{1.3.14.3.2.26}
+{iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) hashAlgorithmIdentifier(26)}
+const
+ SHA1_OID : TOID_Vec = (1,3,14,3,2,26,-1,-1,-1); {Len=6}
-function sha1sum_file(const source:string):sha1str;
-type sha1buf = array[1..$FFFF] of byte;
-var f : file;
- context : THashContext;
- digest : TSHA1Digest;
- StrDigest : sha1str;
- l : longint;
- n : word;
- w : byte;
- err : integer;
- sha1bufp : ^sha1buf;
-begin
- sha1sum_file:='';
- New(sha1bufp);
- SHA1Init(context);
- w:=FileMode;
- fm_ro;
- assign(f,source);
- reset(f,1);
- err:=IOResult;
- FileMode:=w;
- if err<>0 then begin
- Dispose(sha1bufp);
- exit;
- end;
- l:=FileSize(f);
- if IOResult<>0 then begin
- Dispose(sha1bufp);
- exit;
- end;
- while (err=0) and (l>0) do
- begin
- blockread(f,sha1bufp^,SizeOf(sha1buf),n);
- err:=IOResult;
- dec(l,n);
- SHA1Update(context,sha1bufp,n);
- end;
- close(f);
- if IOResult=0 then;
- if err<>0 then begin
- Dispose(sha1bufp);
- exit;
- end;
- SHA1Final(context,digest);
- Dispose(sha1bufp);
- StrDigest:='';
- for n:=0 to 19 do StrDigest:=StrDigest+hex(digest[n],2);
- sha1sum_file:=StrDigest;
-end;
-
-function sha1sum_str(const source:string):sha1str;
-var context : THashContext;
- digest : TSHA1Digest;
- sha1buf : array[1..255] of byte;
- StrDigest : sha1str;
- l : byte;
-begin
- sha1sum_str:='';
- SHA1Init(context);
- l:=length(source);
- move(source[1],sha1buf[1],l);
- SHA1Update(context, at sha1buf,l);
- SHA1Final(context,digest);
- StrDigest:='';
- for l:=0 to 19 do StrDigest:=StrDigest+hex(digest[l],2);
- sha1sum_str:=StrDigest;
-end;
+{$ifndef VER5X}
+const
+ SHA1_Desc: THashDesc = (
+ HSig : C_HashSig;
+ HDSize : sizeof(THashDesc);
+ HDVersion : C_HashVers;
+ HBlockLen : SHA1_BlockLen;
+ HDigestlen: sizeof(TSHA1Digest);
+ {$ifdef FPC_ProcVar}
+ HInit : @SHA1Init;
+ HFinal : @SHA1FinalEx;
+ HUpdateXL : @SHA1UpdateXL;
+ {$else}
+ HInit : SHA1Init;
+ HFinal : SHA1FinalEx;
+ HUpdateXL : SHA1UpdateXL;
+ {$endif}
+ HAlgNum : longint(_SHA1);
+ HName : 'SHA1';
+ HPtrOID : @SHA1_OID;
+ HLenOID : 6;
+ HFill : 0;
+ {$ifdef FPC_ProcVar}
+ HFinalBit : @SHA1FinalBitsEx;
+ {$else}
+ HFinalBit : SHA1FinalBitsEx;
+ {$endif}
+ HReserved : (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
+ );
+{$else}
+var
+ SHA1_Desc: THashDesc;
+{$endif}
{$ifdef BIT32}
@@ -671,6 +654,73 @@
{$endif BIT32}
+function sha1sum_file(const source:string):sha1str;
+type sha1buf = array[1..$FFFF] of byte;
+var f : file;
+ context : THashContext;
+ digest : TSHA1Digest;
+ StrDigest : sha1str;
+ l : longint;
+ n : word;
+ w : byte;
+ err : integer;
+ sha1bufp : ^sha1buf;
+begin
+ sha1sum_file:='';
+ New(sha1bufp);
+ SHA1Init(context);
+ w:=FileMode;
+ fm_ro;
+ assign(f,source);
+ reset(f,1);
+ err:=IOResult;
+ FileMode:=w;
+ if err<>0 then begin
+ Dispose(sha1bufp);
+ exit;
+ end;
+ l:=FileSize(f);
+ if IOResult<>0 then begin
+ Dispose(sha1bufp);
+ exit;
+ end;
+ while (err=0) and (l>0) do
+ begin
+ blockread(f,sha1bufp^,SizeOf(sha1buf),n);
+ err:=IOResult;
+ dec(l,n);
+ SHA1Update(context,sha1bufp,n);
+ end;
+ close(f);
+ if IOResult=0 then;
+ if err<>0 then begin
+ Dispose(sha1bufp);
+ exit;
+ end;
+ SHA1Final(context,digest);
+ Dispose(sha1bufp);
+ StrDigest:='';
+ for n:=0 to 19 do StrDigest:=StrDigest+hex(digest[n],2);
+ sha1sum_file:=StrDigest;
+end;
+
+function sha1sum_str(const source:string):sha1str;
+var context : THashContext;
+ digest : TSHA1Digest;
+ sha1buf : array[1..255] of byte;
+ StrDigest : sha1str;
+ l : byte;
+begin
+ sha1sum_str:='';
+ SHA1Init(context);
+ l:=length(source);
+ move(source[1],sha1buf[1],l);
+ SHA1Update(context, at sha1buf,l);
+ SHA1Final(context,digest);
+ StrDigest:='';
+ for l:=0 to 19 do StrDigest:=StrDigest+hex(digest[l],2);
+ sha1sum_str:=StrDigest;
+end;
{---------------------------------------------------------------------------}
@@ -730,14 +780,19 @@
{---------------------------------------------------------------------------}
-procedure SHA1FinalEx(var Context: THashContext; var Digest: THashDigest);
- {-finalize SHA1 calculation, clear context}
+procedure SHA1FinalBitsEx(var Context: THashContext; var Digest: THashDigest; BData: byte; bitlen: integer);
+ {-finalize SHA1 calculation with bitlen bits from BData (big-endian), clear context}
var
i: integer;
begin
{Message padding}
- {1. append bit '1' after msg}
- Context.Buffer[Context.Index]:= $80;
+ {append bits from BData and a single '1' bit}
+ if (bitlen>0) and (bitlen<=7) then begin
+ Context.Buffer[Context.Index]:= (BData and BitAPI_Mask[bitlen]) or BitAPI_PBit[bitlen];
+ UpdateLen(Context.MLen[1], Context.MLen[0], bitlen);
+ end
+ else Context.Buffer[Context.Index]:= $80;
+
for i:=Context.Index+1 to 63 do Context.Buffer[i] := 0;
{2. Compress if more than 448 bits, (no room for 64 bit length}
if Context.Index>= 56 then begin
@@ -758,59 +813,81 @@
{---------------------------------------------------------------------------}
+procedure SHA1FinalBits(var Context: THashContext; var Digest: TSHA1Digest; BData: byte; bitlen: integer);
+ {-finalize SHA1 calculation with bitlen bits from BData (big-endian), clear context}
+var
+ tmp: THashDigest;
+begin
+ SHA1FinalBitsEx(Context, tmp, BData, bitlen);
+ move(tmp, Digest, sizeof(Digest));
+end;
+
+
+{---------------------------------------------------------------------------}
+procedure SHA1FinalEx(var Context: THashContext; var Digest: THashDigest);
+ {-finalize SHA1 calculation, clear context}
+begin
+ SHA1FinalBitsEx(Context,Digest,0,0);
+end;
+
+
+{---------------------------------------------------------------------------}
procedure SHA1Final(var Context: THashContext; var Digest: TSHA1Digest);
{-finalize SHA1 calculation, clear context}
var
tmp: THashDigest;
begin
- SHA1FinalEx(Context, tmp);
+ SHA1FinalBitsEx(Context, tmp, 0, 0);
move(tmp, Digest, sizeof(Digest));
end;
{---------------------------------------------------------------------------}
function SHA1SelfTest: boolean;
- {-self test for string from SHA1 document}
+ {-self test SHA1: compare with known value}
const
s1: string[ 3] = 'abc';
s2: string[56] = 'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq';
D1: TSHA1Digest= ($a9,$99,$3e,$36,$47,$06,$81,$6a,$ba,$3e,$25,$71,$78,$50,$c2,$6c,$9c,$d0,$d8,$9d);
D2: TSHA1Digest= ($84,$98,$3E,$44,$1C,$3B,$D2,$6E,$BA,$AE,$4A,$A1,$F9,$51,$29,$E5,$E5,$46,$70,$F1);
-
+ D3: TSHA1Digest= ($bb,$6b,$3e,$18,$f0,$11,$5b,$57,$92,$52,$41,$67,$6f,$5b,$1a,$e8,$87,$47,$b0,$8a);
+ D4: TSHA1Digest= ($98,$23,$2a,$15,$34,$53,$14,$9a,$f8,$d5,$2a,$61,$50,$3a,$50,$74,$b8,$59,$70,$e8);
+var
+ Context: THashContext;
+ Digest : TSHA1Digest;
function SingleTest(s: string; TDig: TSHA1Digest): boolean;
{-do a single test, const not allowed for VER<7}
{ Two sub tests: 1. whole string, 2. one update per char}
var
- Context: THashContext;
- Digest: TSHA1Digest;
i: integer;
begin
+ SingleTest := false;
{1. Hash complete string}
SHA1Full(Digest, @s[1],length(s));
{Compare with known value}
- for i:=0 to sizeof(Digest)-1 do begin
- if Digest[i]<>TDig[i] then begin
- SingleTest := false;
- exit;
- end;
- end;
+ if not HashSameDigest(@SHA1_Desc, PHashDigest(@Digest), PHashDigest(@TDig)) then exit;
{2. one update call for all chars}
SHA1Init(Context);
for i:=1 to length(s) do SHA1Update(Context, at s[i],1);
SHA1Final(Context,Digest);
{Compare with known value}
- for i:=0 to sizeof(Digest)-1 do begin
- if Digest[i]<>TDig[i] then begin
- SingleTest := false;
- exit;
- end;
- end;
+ if not HashSameDigest(@SHA1_Desc, PHashDigest(@Digest), PHashDigest(@TDig)) then exit;
SingleTest := true;
end;
begin
- SHA1SelfTest := SingleTest(s1, D1) and SingleTest(s2, D2);
+ SHA1SelfTest := false;
+ {1 Zero bit from NESSIE test vectors}
+ SHA1Init(Context);
+ SHA1FinalBits(Context,Digest,0,1);
+ if not HashSameDigest(@SHA1_Desc, PHashDigest(@Digest), PHashDigest(@D3)) then exit;
+ {4 hightest bits of $50, D4 calculated with program shatest from RFC 4634}
+ SHA1Init(Context);
+ SHA1FinalBits(Context,Digest,$50,4);
+ if not HashSameDigest(@SHA1_Desc, PHashDigest(@Digest), PHashDigest(@D4)) then exit;
+ {strings from SHA1 document}
+ SHA1SelfTest := SingleTest(s1, D1) and SingleTest(s2, D2)
end;
@@ -834,39 +911,6 @@
end;
-{1.3.14.3.2.26}
-{iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) hashAlgorithmIdentifier(26)}
-const
- SHA1_OID : TOID_Vec = (1,3,14,3,2,26,-1,-1,-1); {Len=6}
-
-{$ifndef VER5X}
-const
- SHA1_Desc: THashDesc = (
- HSig : C_HashSig;
- HDSize : sizeof(THashDesc);
- HDVersion : C_HashVers;
- HBlockLen : SHA1_BlockLen;
- HDigestlen: sizeof(TSHA1Digest);
- {$ifdef FPC_ProcVar}
- HInit : @SHA1Init;
- HFinal : @SHA1FinalEx;
- HUpdateXL : @SHA1UpdateXL;
- {$else}
- HInit : SHA1Init;
- HFinal : SHA1FinalEx;
- HUpdateXL : SHA1UpdateXL;
- {$endif}
- HAlgNum : longint(_SHA1);
- HName : 'SHA1';
- HPtrOID : @SHA1_OID;
- HLenOID : 6;
- HReserved : (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
- );
-{$else}
-var
- SHA1_Desc: THashDesc;
-{$endif}
-
{---------------------------------------------------------------------------}
procedure SHA1File({$ifndef BIT16} const fname: shortstring; {$else} fname: string; {$endif}
var Digest: TSHA1Digest; var buf; bsize: word; var Err: word);
@@ -895,13 +939,17 @@
HName := 'SHA1';
HPtrOID := @SHA1_OID;
HLenOID := 6;
[15 lines skipped]
--- /server/cvs/freexp/hash.pas 2007/07/15 09:22:50 1.1.2.2
+++ /server/cvs/freexp/hash.pas 2008/11/02 10:25:40 1.1.2.3
@@ -1,4 +1,4 @@
-{ $Id: hash.pas,v 1.1.2.2 2007/07/15 09:22:50 mw Exp $ }
+{ $Id: hash.pas,v 1.1.2.3 2008/11/02 10:25:40 mw Exp $ }
unit Hash;
{General Hash Unit: This unit defines the common types, functions, and
@@ -39,10 +39,15 @@
0.20 18.02.07 we MD4, C_HashVers = $00010003
0.21 22.02.07 we POID_Vec=^TOID_Vec, typed HPtrOID
0.22 24.02.07 we added some checks for HSig=C_HashSig
+ 0.23 04.10.07 we THashContext.Index now longint
+ 0.24 02.05.08 we type PHashDigest, function HashSameDigest
+ 0.25 04.05.08 we BitAPI_Mask, BitAPI_PBit
+ 0.26 05.05.08 we Descriptor with HFinalBit, C_HashVers=$00010004
+ 0.27 20.05.08 we RMD160 as alias for RIPEMD160
**************************************************************************)
(*-------------------------------------------------------------------------
- (C) Copyright 2006-2007 Wolfgang Ehrhardt
+ (C) Copyright 2006-2008 Wolfgang Ehrhardt
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from
@@ -70,12 +75,15 @@
THashAlgorithm = (_MD4,_MD5,_RIPEMD160,_SHA1,_SHA224,_SHA256,_SHA384,_SHA512, _Whirlpool); {Supported hash algorithms}
const
+ _RMD160 = _RIPEMD160; {Alias}
+
+const
MaxBlockLen = 128; {Max. block length (buffer size), multiple of 4}
MaxDigestLen = 64; {Max. length of hash digest}
MaxStateLen = 16; {Max. size of internal state}
MaxOIDLen = 9; {Current max. OID length}
C_HashSig = $3D7A; {Signature for Hash descriptor}
- C_HashVers = $00010003; {Version of Hash definitions}
+ C_HashVers = $00010004; {Version of Hash definitions}
C_MinHash = _MD4; {Lowest hash in THashAlgorithm}
C_MaxHash = _Whirlpool; {Highest hash in THashAlgorithm}
@@ -83,6 +91,7 @@
THashState = packed array[0..MaxStateLen-1] of longint; {Internal state}
THashBuffer = packed array[0..MaxBlockLen-1] of byte; {hash buffer block}
THashDigest = packed array[0..MaxDigestLen-1] of byte; {hash digest}
+ PHashDigest = ^THashDigest; {pointer to hash digest}
THashBuf32 = packed array[0..MaxBlockLen div 4 -1] of longint; {type cast helper}
THashDig32 = packed array[0..MaxDigestLen div 4 -1] of longint; {type cast helper}
@@ -92,7 +101,7 @@
Hash : THashState; {Working hash}
MLen : packed array[0..3] of longint; {max 128 bit msg length}
Buffer: THashBuffer; {Block buffer}
- Index : integer; {Index in buffer}
+ Index : longint; {Index in buffer}
end;
type
@@ -111,12 +120,16 @@
{-initialize context}
{$ifdef DLL} stdcall; {$endif}
+ HashUpdateXLProc = procedure(var Context: THashContext; Msg: pointer; Len: longint);
+ {-update context with Msg data}
+ {$ifdef DLL} stdcall; {$endif}
+
HashFinalProc = procedure(var Context: THashContext; var Digest: THashDigest);
{-finalize calculation, clear context}
{$ifdef DLL} stdcall; {$endif}
- HashUpdateXLProc = procedure(var Context: THashContext; Msg: pointer; Len: longint);
- {-update context with Msg data}
+ HashFinalBitProc = procedure(var Context: THashContext; var Digest: THashDigest; BData: byte; bitlen: integer);
+ {-finalize calculation with bitlen bits from BData, clear context}
{$ifdef DLL} stdcall; {$endif}
type
@@ -139,10 +152,16 @@
HName : THashName; {Name of hash algo }
HPtrOID : POID_Vec; {Pointer to OID vec }
HLenOID : word; {Length of OID vec }
- HReserved : packed array[0..25] of byte;
+ HFill : word;
+ HFinalBit : HashFinalBitProc; {Bit-API Final proc }
+ HReserved : packed array[0..19] of byte;
end;
+const
+ BitAPI_Mask: array[0..7] of byte = ($00,$80,$C0,$E0,$F0,$F8,$FC,$FE);
+ BitAPI_PBit: array[0..7] of byte = ($80,$40,$20,$10,$08,$04,$02,$01);
+
procedure RegisterHash(AlgId: THashAlgorithm; PHash: PHashDesc);
{-Register algorithm with AlgID and Hash descriptor PHash^}
{$ifdef DLL} stdcall; {$endif}
@@ -155,7 +174,6 @@
{-Return PHashDesc of Algo with AlgoName, nil if not found/registered}
{$ifdef DLL} stdcall; {$endif}
-
procedure HashFile({$ifndef BIT16} const fname: shortstring; {$else} fname: string; {$endif}
PHash: PHashDesc; var Digest: THashDigest; var buf; bsize: word; var Err: word);
{-Calulate hash digest of file, buf: buffer with at least bsize bytes}
@@ -173,6 +191,9 @@
{-Calulate hash digest of Msg with init/update/final}
{$ifdef DLL} stdcall; {$endif}
+function HashSameDigest(PHash: PHashDesc; PD1, PD2: PHashDigest): boolean;
+ {-Return true if same digests, using HDigestlen of PHash}
+ {$ifdef DLL} stdcall; {$endif}
implementation
@@ -228,6 +249,8 @@
begin
AlgoName := StrUpcase(Algoname);
+ {Transform RMD160 alias to standard name}
+ if AlgoName='RMD160' then AlgoName:='RIPEMD160';
FindHash_by_Name := nil;
for algo := C_MinHash to C_MaxHash do begin
phash := PHashVec[algo];
@@ -276,6 +299,24 @@
end;
+{---------------------------------------------------------------------------}
+function HashSameDigest(PHash: PHashDesc; PD1, PD2: PHashDigest): boolean;
+ {-Return true if same digests, using HDigestlen of PHash}
+var
+ i: integer;
+begin
+ HashSameDigest := false;
+ if PHash<>nil then with PHash^ do begin
+ if (HSig=C_HashSig) and (HDigestlen>0) then begin
+ for i:=0 to pred(HDigestlen) do begin
+ if PD1^[i]<>PD2^[i] then exit;
+ end;
+ HashSameDigest := true;
+ end;
+ end;
+end;
+
+
{$i-} {Force I-}
{---------------------------------------------------------------------------}
procedure HashFile({$ifndef BIT16} const fname: shortstring; {$else} fname: string; {$endif}
@@ -333,7 +374,10 @@
end.
{
$Log: hash.pas,v $
- Revision 1.1.2.2 2007/07/15 09:22:50 mw
+ Revision 1.1.2.3 2008/11/02 10:25:40 mw
+ MW: - neues Upstream-Release der Cryptolib
+
+ Revision 1.1.2.2 2007-07-15 09:22:50 mw
MW: - Neues Upstream-Release der Cryptolib eingebaut.
- Wir verwenden jetzt auch noch SHA1 und benutzen daher jetzt
die extra Datei STD.INC (war bisher von uns in die MD5.PAS
--- /server/cvs/freexp/std.inc 2007/07/15 09:22:50 1.1.2.2
+++ /server/cvs/freexp/std.inc 2008/11/02 10:25:40 1.1.2.3
@@ -1,4 +1,4 @@
-{ $Id: std.inc,v 1.1.2.2 2007/07/15 09:22:50 mw Exp $ }
+{ $Id: std.inc,v 1.1.2.3 2008/11/02 10:25:40 mw Exp $ }
(*************************************************************************
DESCRIPTION : Standard definitions and options
@@ -38,11 +38,16 @@
1.28 28.11.06 we HAS_UNSAFE, $warn SYMBOL_../UNSAFE_.. OFF
1.29 25.05.07 we D11 aka Delphi 2007, FPC2.1.4
1.30 23.06.07 we FPC_ProcVar: Helper for procedure variables
+ 1.31 18.09.07 we HAS_INLINE for FPC VER2
+ 1.32 04.10.07 we FPC Intel ASMmode only if CPUI386 is defined
+ 1.33 22.11.07 we Record value of $X option, undef RESULT if $X-
+ 1.34 19.05.08 we HAS_UINT64
+ 1.35 21.06.08 we V7PLUS, HAS_UINT64 for FPC VER2_2
**************************************************************************)
(*-------------------------------------------------------------------------
- (C) Copyright 2002-2007 Wolfgang Ehrhardt
+ (C) Copyright 2002-2008 Wolfgang Ehrhardt
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from
@@ -67,30 +72,33 @@
{$define _STD_INC_} {include STD.INC only once}
-{.$undef BIT16} {16 Bit code, Pascal / D1}
-{.$undef BIT32} {32 Bit code}
-{.$undef DELPHI} {Delphi2+ and BCB++}
-{.$undef G_OPT} {G+ option support}
-{.$undef D4PLUS} {Delphi 4 and higher}
-{.$undef BASM16} {16 Bit BASM}
-{.$undef LoadArgs} {Register params}
-{.$undef WINCRT} {Use WinCRT for console}
-{.$undef RESULT} {Result pseudo variable}
-{.$undef StrictLong} {Warning for longint const with MS bit}
-{.$undef HAS_INT64} {int64 integer type available}
-{.$undef HAS_MSG} {Has message directive}
-{.$undef HAS_INLINE} {Has inline procs/funcs (D9)}
-{.$undef ABSTRACT} {Has abstract methods}
-{.$undef DEFAULT} {Support default parameters}
-{.$undef VER5X} {TP5 or TP55}
-{.$undef HAS_XTYPES} {Xtra types in system: pByte, pLongint etc}
-{.$undef HAS_UNSAFE} {UNSAFE warnings}
-{.$undef FPC_ProcVar} {FPC handling of @ and proc variables}
+{.$undef BIT16} {16 Bit code, Pascal / D1}
+{.$undef BIT32} {32 Bit code}
+{.$undef DELPHI} {Delphi2+ and BCB++}
+{.$undef G_OPT} {G+ option support}
+{.$undef D4PLUS} {Delphi 4 or higher}
+{.$undef BASM16} {16 Bit BASM}
+{.$undef LoadArgs} {Register params}
+{.$undef WINCRT} {Use WinCRT for console}
+{.$undef RESULT} {Result pseudo variable}
+{.$undef StrictLong} {Warning for longint const with MS bit}
+{.$undef HAS_INT64} { int64 integer type available}
+{.$undef HAS_UINT64} {uint64 integer type available}
+{.$undef HAS_MSG} {Has message directive}
+{.$undef HAS_INLINE} {Has inline procs/funcs (D9)}
+{.$undef ABSTRACT} {Has abstract methods}
+{.$undef DEFAULT} {Support default parameters}
+{.$undef VER5X} {TP5 or TP55}
+{.$undef HAS_XTYPES} {Xtra types in system: pByte, pLongint etc}
+{.$undef HAS_UNSAFE} {UNSAFE warnings}
+{.$undef APPCONS} {Needs "Apptype console" for console application}
+{.$undef FPC_ProcVar} {FPC handling of @ and proc variables}
{$define CONST} {const in proc declaration}
{$define Q_OPT} {Q- option support}
{$define X_OPT} {X+ option support}
{$define N_OPT} {N+ option support}
+{$define V7PLUS} {TP7 or higher}
{$ifdef VER10} {TPW 1.0??}
@@ -99,6 +107,7 @@
{$define WINCRT}
{$undef CONST}
{$undef Q_OPT}
+ {$undef V7PLUS}
{$endif}
{$ifdef VER15} {TPW 1.5}
@@ -108,6 +117,7 @@
{$define G_OPT}
{$undef CONST}
{$undef Q_OPT}
+ {$undef V7PLUS}
{$endif}
{$ifdef VER50 }
@@ -116,6 +126,7 @@
{$undef CONST}
{$undef Q_OPT}
{$undef X_OPT}
+ {$undef V7PLUS}
{$endif}
{$ifdef VER55 }
@@ -124,6 +135,7 @@
{$undef CONST}
{$undef Q_OPT}
{$undef X_OPT}
+ {$undef V7PLUS}
{$endif}
{$ifdef VER60 }
@@ -132,6 +144,7 @@
{$undef Q_OPT}
{$define G_OPT}
{$define BASM16}
+ {$undef V7PLUS}
{$endif}
{$ifdef VER70 }
@@ -190,6 +203,7 @@
{$define DELPHI} {D7}
{$define D4PLUS}
{$define HAS_UNSAFE}
+ {$define HAS_UINT64}
{$endif}
{$ifdef VER170}
@@ -197,13 +211,15 @@
{$define D4PLUS}
{$define HAS_INLINE}
{$define HAS_UNSAFE}
+ {$define HAS_UINT64}
{$endif}
{$ifdef VER180}
- {$define DELPHI} {D10}
+ {$define DELPHI} {D10, D11 ifdef VER185}
{$define D4PLUS}
{$define HAS_INLINE}
{$define HAS_UNSAFE}
+ {$define HAS_UINT64}
{$endif}
{$ifdef CONDITIONALEXPRESSIONS} {D6+}
@@ -251,6 +267,7 @@
{$define HAS_ASSERT}
{$define HAS_INT64}
{$define HAS_MSG}
+ {$define HAS_INLINE} {Remember to use -Si}
{$define StrictLong}
{$ifdef FPC_OBJFPC}
{$define DEFAULT}
@@ -258,6 +275,9 @@
{$ifdef FPC_DELPHI}
{$define DEFAULT}
{$endif}
+ {$ifdef VER2_2}
+ {$define HAS_UINT64}
+ {$endif}
{$endif}
{Note: Mode detection does not work for -Sxxx and version < 2.0.2}
{$ifdef FPC_OBJFPC}
@@ -317,7 +337,9 @@
{$endif}
{$ifdef FPC}
- {$ASMmode intel}
+ {$ifdef CPUI386}
+ {$ASMmode intel}
+ {$endif}
{$goto on}
{$endif}
@@ -332,6 +354,7 @@
{$endif}
{$ifdef Q_OPT}
+ {Most Crypto and CRC/Hash units need Q-, define Q+ locally if needed}
{$Q-}
{$endif}
@@ -359,6 +382,12 @@
{$ifopt Q+} {$define OverflowChecks_on} {$endif}
{$endif}
+{-- Note that X option is GLOBAL --}
+{$ifdef X_OPT}
+{$ifopt X+} {$define ExtendedSyntax_on} {$endif}
+{$ifopt X-} {$undef RESULT} {$endif}
+{$endif}
+
{$ifdef CONDITIONALEXPRESSIONS}
{$warn SYMBOL_PLATFORM OFF}
{$warn SYMBOL_DEPRECATED OFF}
@@ -382,10 +411,13 @@
{$endif}
{
$Log: std.inc,v $
- Revision 1.1.2.2 2007/07/15 09:22:50 mw
+ Revision 1.1.2.3 2008/11/02 10:25:40 mw
+ MW: - neues Upstream-Release der Cryptolib
+
+ Revision 1.1.2.2 2007-07-15 09:22:50 mw
MW: - Neues Upstream-Release der Cryptolib eingebaut.
- Wir verwenden jetzt auch noch SHA1 und benutzen daher jetzt
die extra Datei STD.INC (war bisher von uns in die MD5.PAS
eingebaut worden.
-}
\ No newline at end of file
+}
--- /server/cvs/freexp/md5.pas 2007/07/15 09:22:50 1.1.2.10
+++ /server/cvs/freexp/md5.pas 2008/11/02 10:25:40 1.1.2.11
@@ -1,4 +1,4 @@
-{ $Id: md5.pas,v 1.1.2.10 2007/07/15 09:22:50 mw Exp $ }
+{ $Id: md5.pas,v 1.1.2.11 2008/11/02 10:25:40 mw Exp $ }
unit MD5;
{$I-}
{MD5 - 128 bit Hash function}
@@ -63,11 +63,18 @@
3.12 30.06.07 we Use conditional define FPC_ProcVar
3.12fxp1 15.07.07 fxp Ported to new Upstream Release, with extra STD.INC
+
+ 3.13 04.10.07 we FPC: {$asmmode intel}
+ 3.14 02.05.08 we Bit-API: MD5FinalBits/Ex
+ 3.15 05.05.08 we THashDesc constant with HFinalBit field
+
+ 3.15fxp1 02.11.08 fxp Ported to new Upstream Release
+
**************************************************************************)
(*-------------------------------------------------------------------------
- (C) Copyright 2002-2007 Wolfgang Ehrhardt
- (C) Copyright 2006-2007 FreeXP
+ (C) Copyright 2002-2008 Wolfgang Ehrhardt
+ (C) Copyright 2006-2008 FreeXP
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from
@@ -122,6 +129,14 @@
{-finalize MD5 calculation, clear context}
{$ifdef DLL} stdcall; {$endif}
+procedure MD5FinalBitsEx(var Context: THashContext; var Digest: THashDigest; BData: byte; bitlen: integer);
+ {-finalize MD5 calculation with bitlen bits from BData (big-endian), clear context}
+ {$ifdef DLL} stdcall; {$endif}
+
+procedure MD5FinalBits(var Context: THashContext; var Digest: TMD5Digest; BData: byte; bitlen: integer);
+ {-finalize MD5 calculation with bitlen bits from BData (big-endian), clear context}
+ {$ifdef DLL} stdcall; {$endif}
+
function MD5SelfTest: boolean;
{-self test for string from MD5 document}
{$ifdef DLL} stdcall; {$endif}
@@ -144,6 +159,11 @@
implementation
+{$ifdef FPC}
+ {$asmmode intel}
+{$endif}
+
+
{$ifdef BIT16}
{$F-}
{$endif}
@@ -156,6 +176,46 @@
type
PByte = ^byte;
+{1.2.840.113549.2.5}
+{iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) md5(5)}
+const
+ MD5_OID : TOID_Vec = (1,2,840,113549,2,5,-1,-1,-1); {Len=6}
+
+
+{$ifndef VER5X}
+const
+ MD5_Desc: THashDesc = (
+ HSig : C_HashSig;
+ HDSize : sizeof(THashDesc);
+ HDVersion : C_HashVers;
+ HBlockLen : MD5_BlockLen;
+ HDigestlen: sizeof(TMD5Digest);
+ {$ifdef FPC_ProcVar}
+ HInit : @MD5Init;
+ HFinal : @MD5FinalEx;
+ HUpdateXL : @MD5UpdateXL;
+ {$else}
+ HInit : MD5Init;
+ HFinal : MD5FinalEx;
+ HUpdateXL : MD5UpdateXL;
+ {$endif}
+ HAlgNum : longint(_MD5);
+ HName : 'MD5';
+ HPtrOID : @MD5_OID;
+ HLenOID : 6;
+ HFill : 0;
+ {$ifdef FPC_ProcVar}
+ HFinalBit : @MD5FinalBitsEx;
+ {$else}
+ HFinalBit : MD5FinalBitsEx;
+ {$endif}
+ HReserved : (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
+ );
+{$else}
+var
+ MD5_Desc: THashDesc;
+{$endif}
+
{$ifdef StrictLong}
{$warnings off}
@@ -550,14 +610,19 @@
{---------------------------------------------------------------------------}
-procedure MD5FinalEx(var Context: THashContext; var Digest: THashDigest);
- {-finalize MD5 calculation, clear context}
+procedure MD5FinalBitsEx(var Context: THashContext; var Digest: THashDigest; BData: byte; bitlen: integer);
+ {-finalize MD5 calculation with bitlen bits from BData (big-endian), clear context}
var
i: integer;
begin
{Message padding}
- {1. append bit '1' after msg}
- Context.Buffer[Context.Index]:= $80;
+ {append bits from BData and a single '1' bit}
+ if (bitlen>0) and (bitlen<=7) then begin
+ Context.Buffer[Context.Index]:= (BData and BitAPI_Mask[bitlen]) or BitAPI_PBit[bitlen];
+ UpdateLen(Context.MLen[1], Context.MLen[0], bitlen);
+ end
+ else Context.Buffer[Context.Index]:= $80;
+
for i:=Context.Index+1 to 63 do Context.Buffer[i] := 0;
{2. Compress if more than 448 bits, (no room for 64 bit length}
if Context.Index>= 56 then begin
@@ -577,12 +642,30 @@
{---------------------------------------------------------------------------}
+procedure MD5FinalBits(var Context: THashContext; var Digest: TMD5Digest; BData: byte; bitlen: integer);
+ {-finalize MD5 calculation with bitlen bits from BData (big-endian), clear context}
+var
+ tmp: THashDigest;
+begin
+ MD5FinalBitsEx(Context, tmp, BData, bitlen);
+ move(tmp, Digest, sizeof(Digest));
+end;
+
+
+{---------------------------------------------------------------------------}
+procedure MD5FinalEx(var Context: THashContext; var Digest: THashDigest);
+ {-finalize MD5 calculation, clear context}
+begin
+ MD5FinalBitsEx(Context,Digest,0,0);
+end;
+
+{---------------------------------------------------------------------------}
procedure MD5Final(var Context: THashContext; var Digest: TMD5Digest);
{-finalize MD5 calculation, clear context}
var
tmp: THashDigest;
begin
- MD5FinalEx(Context, tmp);
+ MD5FinalBitsEx(Context, tmp, 0, 0);
move(tmp, Digest, sizeof(Digest));
end;
@@ -595,41 +678,39 @@
s2: string[62] = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
D1: TMD5Digest= ($90,$01,$50,$98,$3c,$d2,$4f,$b0,$d6,$96,$3f,$7d,$28,$e1,$7f,$72);
D2: TMD5Digest= ($d1,$74,$ab,$98,$d2,$77,$d9,$f5,$a5,$61,$1c,$2c,$9f,$41,$9d,$9f);
-
+ D3: TMD5Digest= ($1d,$a6,$35,$b1,$43,$0f,$17,$1c,$65,$72,$06,$fd,$69,$fe,$e0,$e8);
+var
+ Context: THashContext;
+ Digest : TMD5Digest;
function SingleTest(s: string; TDig: TMD5Digest): boolean;
{-do a single test, const not allowed for VER<7}
{ Two sub tests: 1. whole string, 2. one update per char}
var
- Context: THashContext;
- Digest : TMD5Digest;
i: integer;
begin
+ SingleTest := false;
{1. Hash complete string}
MD5Full(Digest, @s[1],length(s));
{Compare with known value}
- for i:=0 to sizeof(Digest)-1 do begin
- if Digest[i]<>TDig[i] then begin
- SingleTest := false;
- exit;
- end;
- end;
+ if not HashSameDigest(@MD5_Desc, PHashDigest(@Digest), PHashDigest(@TDig)) then exit;
{2. one update call for all chars}
MD5Init(Context);
for i:=1 to length(s) do MD5Update(Context, at s[i],1);
MD5Final(Context,Digest);
{Compare with known value}
- for i:=0 to sizeof(Digest)-1 do begin
- if Digest[i]<>TDig[i] then begin
- SingleTest := false;
- exit;
- end;
- end;
+ if not HashSameDigest(@MD5_Desc, PHashDigest(@Digest), PHashDigest(@TDig)) then exit;
SingleTest := true;
end;
begin
- MD5SelfTest := SingleTest(s1, D1) and SingleTest(s2, D2);
+ MD5SelfTest := false;
+ {1 Zero bit from NESSIE test vectors}
+ MD5Init(Context);
+ MD5FinalBits(Context,Digest,0,1);
+ if not HashSameDigest(@MD5_Desc, PHashDigest(@Digest), PHashDigest(@D3)) then exit;
+ {strings from MD5 document}
+ MD5SelfTest := SingleTest(s1, D1) and SingleTest(s2, D2)
end;
@@ -652,41 +733,6 @@
MD5FullXL(Digest, Msg, Len);
end;
-
-{1.2.840.113549.2.5}
-{iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) md5(5)}
-const
- MD5_OID : TOID_Vec = (1,2,840,113549,2,5,-1,-1,-1); {Len=6}
-
-
-{$ifndef VER5X}
-const
- MD5_Desc: THashDesc = (
- HSig : C_HashSig;
- HDSize : sizeof(THashDesc);
- HDVersion : C_HashVers;
- HBlockLen : MD5_BlockLen;
- HDigestlen: sizeof(TMD5Digest);
- {$ifdef FPC_ProcVar}
- HInit : @MD5Init;
- HFinal : @MD5FinalEx;
- HUpdateXL : @MD5UpdateXL;
- {$else}
- HInit : MD5Init;
- HFinal : MD5FinalEx;
- HUpdateXL : MD5UpdateXL;
- {$endif}
- HAlgNum : longint(_MD5);
- HName : 'MD5';
- HPtrOID : @MD5_OID;
- HLenOID : 6;
- HReserved : (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
- );
-{$else}
-var
- MD5_Desc: THashDesc;
-{$endif}
-
{---------------------------------------------------------------------------}
procedure MD5File({$ifndef BIT16} const fname: shortstring; {$else} fname: string; {$endif}
var Digest: TMD5Digest; var buf; bsize: word; var Err: word);
@@ -715,13 +761,17 @@
HName := 'MD5';
HPtrOID := @MD5_OID;
HLenOID := 6;
+ HFinalBit := MD5FinalBitsEx;
end;
{$endif}
RegisterHash(_MD5, @MD5_Desc);
end.
{
$Log: md5.pas,v $
- Revision 1.1.2.10 2007/07/15 09:22:50 mw
+ Revision 1.1.2.11 2008/11/02 10:25:40 mw
+ MW: - neues Upstream-Release der Cryptolib
+
+ Revision 1.1.2.10 2007-07-15 09:22:50 mw
MW: - Neues Upstream-Release der Cryptolib eingebaut.
- Wir verwenden jetzt auch noch SHA1 und benutzen daher jetzt
die extra Datei STD.INC (war bisher von uns in die MD5.PAS
Mehr Informationen über die CVS-List Mailingliste