BSOne.SFC/Tocsg.Module/Bs1Flt/MTPMon/dist/_madCodeHook/madRipeMD.pas

381 lines
23 KiB
Plaintext

unit madRipeMD;
// RipeMD-160 Secure Hash Function
// this code is based on Wolfgang Ehrhardt's hash units
// ( http://home.netsurf.de/wolfgang.ehrhardt )
// simplified and reformatted by madshi
// ---------------------------------------------------------------------------
// (C) Copyright 2006-2007 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
// the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software in
// a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source distribution.
// ---------------------------------------------------------------------------
interface
{$Q-}{$R-}
uses Windows;
// ---------------------------------------------------------------------------
type TDigest = packed array [0..19] of byte;
function InitHash : THandle;
procedure UpdateHash (hash: THandle; buf: pointer; len: integer);
function CloseHash (var hash: THandle) : TDigest;
function Hash (buf: pointer; len: integer) : TDigest; overload;
function Hash (buf: AnsiString ) : TDigest; overload;
// ---------------------------------------------------------------------------
implementation
uses madTypes;
// ---------------------------------------------------------------------------
type
THashState = packed array [0.. 15] of dword;
THashBuffer = packed array [0..127] of byte;
THashContext = packed record
state : THashState; // working hash
len : int64; // bit msg length
buf : THashBuffer; // block buffer
index : integer; // index in buffer
end;
// ---------------------------------------------------------------------------
function InitHash : THandle;
// initialize context
begin
result := LocalAlloc(LPTR, sizeOf(THashContext));
with THashContext(pointer(result)^) do begin
state[0] := $67452301;
state[1] := $efcdab89;
state[2] := $98badcfe;
state[3] := $10325476;
state[4] := $c3d2e1f0;
end;
end;
// ---------------------------------------------------------------------------
procedure CalculateHash(var data: THashState; const buf: THashBuffer);
// Actual hashing function
type
THashBuf32 = packed array [0..31] of dword;
const
k1 = $5a827999; // 2^30*2^(1/2)
k2 = $6ed9eba1; // 2^30*3^(1/2)
k3 = $8f1bbcdc; // 2^30*5^(1/2)
k4 = $a953fd4e; // 2^30*7^(1/2)
k5 = $50a28be6; // 2^30*2^(1/3)
k6 = $5c4dd124; // 2^30*3^(1/3)
k7 = $6d703ef3; // 2^30*5^(1/3)
k8 = $7a6d76e9; // 2^30*7^(1/3)
var
a, b, c, d, e, a1, b1, c1, d1, e1 : dword;
x : THashBuf32 absolute buf;
begin
// Assign old working hash to working variables
a := data[0];
b := data[1];
c := data[2];
d := data[3];
e := data[4];
inc(a, b xor c xor d + x[ 0]); a := a shl 11 or a shr (32 - 11) + e; c := c shl 10 or c shr 22;
inc(e, a xor b xor c + x[ 1]); e := e shl 14 or e shr (32 - 14) + d; b := b shl 10 or b shr 22;
inc(d, e xor a xor b + x[ 2]); d := d shl 15 or d shr (32 - 15) + c; a := a shl 10 or a shr 22;
inc(c, d xor e xor a + x[ 3]); c := c shl 12 or c shr (32 - 12) + b; e := e shl 10 or e shr 22;
inc(b, c xor d xor e + x[ 4]); b := b shl 5 or b shr (32 - 5) + a; d := d shl 10 or d shr 22;
inc(a, b xor c xor d + x[ 5]); a := a shl 8 or a shr (32 - 8) + e; c := c shl 10 or c shr 22;
inc(e, a xor b xor c + x[ 6]); e := e shl 7 or e shr (32 - 7) + d; b := b shl 10 or b shr 22;
inc(d, e xor a xor b + x[ 7]); d := d shl 9 or d shr (32 - 9) + c; a := a shl 10 or a shr 22;
inc(c, d xor e xor a + x[ 8]); c := c shl 11 or c shr (32 - 11) + b; e := e shl 10 or e shr 22;
inc(b, c xor d xor e + x[ 9]); b := b shl 13 or b shr (32 - 13) + a; d := d shl 10 or d shr 22;
inc(a, b xor c xor d + x[10]); a := a shl 14 or a shr (32 - 14) + e; c := c shl 10 or c shr 22;
inc(e, a xor b xor c + x[11]); e := e shl 15 or e shr (32 - 15) + d; b := b shl 10 or b shr 22;
inc(d, e xor a xor b + x[12]); d := d shl 6 or d shr (32 - 6) + c; a := a shl 10 or a shr 22;
inc(c, d xor e xor a + x[13]); c := c shl 7 or c shr (32 - 7) + b; e := e shl 10 or e shr 22;
inc(b, c xor d xor e + x[14]); b := b shl 9 or b shr (32 - 9) + a; d := d shl 10 or d shr 22;
inc(a, b xor c xor d + x[15]); a := a shl 8 or a shr (32 - 8) + e; c := c shl 10 or c shr 22;
inc(e, c xor (a and (b xor c)) + x[ 7] + k1); e := e shl 7 or e shr (32 - 7) + d; b := b shl 10 or b shr 22;
inc(d, b xor (e and (a xor b)) + x[ 4] + k1); d := d shl 6 or d shr (32 - 6) + c; a := a shl 10 or a shr 22;
inc(c, a xor (d and (e xor a)) + x[13] + k1); c := c shl 8 or c shr (32 - 8) + b; e := e shl 10 or e shr 22;
inc(b, e xor (c and (d xor e)) + x[ 1] + k1); b := b shl 13 or b shr (32 - 13) + a; d := d shl 10 or d shr 22;
inc(a, d xor (b and (c xor d)) + x[10] + k1); a := a shl 11 or a shr (32 - 11) + e; c := c shl 10 or c shr 22;
inc(e, c xor (a and (b xor c)) + x[ 6] + k1); e := e shl 9 or e shr (32 - 9) + d; b := b shl 10 or b shr 22;
inc(d, b xor (e and (a xor b)) + x[15] + k1); d := d shl 7 or d shr (32 - 7) + c; a := a shl 10 or a shr 22;
inc(c, a xor (d and (e xor a)) + x[ 3] + k1); c := c shl 15 or c shr (32 - 15) + b; e := e shl 10 or e shr 22;
inc(b, e xor (c and (d xor e)) + x[12] + k1); b := b shl 7 or b shr (32 - 7) + a; d := d shl 10 or d shr 22;
inc(a, d xor (b and (c xor d)) + x[ 0] + k1); a := a shl 12 or a shr (32 - 12) + e; c := c shl 10 or c shr 22;
inc(e, c xor (a and (b xor c)) + x[ 9] + k1); e := e shl 15 or e shr (32 - 15) + d; b := b shl 10 or b shr 22;
inc(d, b xor (e and (a xor b)) + x[ 5] + k1); d := d shl 9 or d shr (32 - 9) + c; a := a shl 10 or a shr 22;
inc(c, a xor (d and (e xor a)) + x[ 2] + k1); c := c shl 11 or c shr (32 - 11) + b; e := e shl 10 or e shr 22;
inc(b, e xor (c and (d xor e)) + x[14] + k1); b := b shl 7 or b shr (32 - 7) + a; d := d shl 10 or d shr 22;
inc(a, d xor (b and (c xor d)) + x[11] + k1); a := a shl 13 or a shr (32 - 13) + e; c := c shl 10 or c shr 22;
inc(e, c xor (a and (b xor c)) + x[ 8] + k1); e := e shl 12 or e shr (32 - 12) + d; b := b shl 10 or b shr 22;
inc(d, b xor (e or (not a)) + x[ 3] + k2); d := d shl 11 or d shr (32 - 11) + c; a := a shl 10 or a shr 22;
inc(c, a xor (d or (not e)) + x[10] + k2); c := c shl 13 or c shr (32 - 13) + b; e := e shl 10 or e shr 22;
inc(b, e xor (c or (not d)) + x[14] + k2); b := b shl 6 or b shr (32 - 6) + a; d := d shl 10 or d shr 22;
inc(a, d xor (b or (not c)) + x[ 4] + k2); a := a shl 7 or a shr (32 - 7) + e; c := c shl 10 or c shr 22;
inc(e, c xor (a or (not b)) + x[ 9] + k2); e := e shl 14 or e shr (32 - 14) + d; b := b shl 10 or b shr 22;
inc(d, b xor (e or (not a)) + x[15] + k2); d := d shl 9 or d shr (32 - 9) + c; a := a shl 10 or a shr 22;
inc(c, a xor (d or (not e)) + x[ 8] + k2); c := c shl 13 or c shr (32 - 13) + b; e := e shl 10 or e shr 22;
inc(b, e xor (c or (not d)) + x[ 1] + k2); b := b shl 15 or b shr (32 - 15) + a; d := d shl 10 or d shr 22;
inc(a, d xor (b or (not c)) + x[ 2] + k2); a := a shl 14 or a shr (32 - 14) + e; c := c shl 10 or c shr 22;
inc(e, c xor (a or (not b)) + x[ 7] + k2); e := e shl 8 or e shr (32 - 8) + d; b := b shl 10 or b shr 22;
inc(d, b xor (e or (not a)) + x[ 0] + k2); d := d shl 13 or d shr (32 - 13) + c; a := a shl 10 or a shr 22;
inc(c, a xor (d or (not e)) + x[ 6] + k2); c := c shl 6 or c shr (32 - 6) + b; e := e shl 10 or e shr 22;
inc(b, e xor (c or (not d)) + x[13] + k2); b := b shl 5 or b shr (32 - 5) + a; d := d shl 10 or d shr 22;
inc(a, d xor (b or (not c)) + x[11] + k2); a := a shl 12 or a shr (32 - 12) + e; c := c shl 10 or c shr 22;
inc(e, c xor (a or (not b)) + x[ 5] + k2); e := e shl 7 or e shr (32 - 7) + d; b := b shl 10 or b shr 22;
inc(d, b xor (e or (not a)) + x[12] + k2); d := d shl 5 or d shr (32 - 5) + c; a := a shl 10 or a shr 22;
inc(c, e xor (a and (d xor e)) + x[ 1] + k3); c := c shl 11 or c shr (32 - 11) + b; e := e shl 10 or e shr 22;
inc(b, d xor (e and (c xor d)) + x[ 9] + k3); b := b shl 12 or b shr (32 - 12) + a; d := d shl 10 or d shr 22;
inc(a, c xor (d and (b xor c)) + x[11] + k3); a := a shl 14 or a shr (32 - 14) + e; c := c shl 10 or c shr 22;
inc(e, b xor (c and (a xor b)) + x[10] + k3); e := e shl 15 or e shr (32 - 15) + d; b := b shl 10 or b shr 22;
inc(d, a xor (b and (e xor a)) + x[ 0] + k3); d := d shl 14 or d shr (32 - 14) + c; a := a shl 10 or a shr 22;
inc(c, e xor (a and (d xor e)) + x[ 8] + k3); c := c shl 15 or c shr (32 - 15) + b; e := e shl 10 or e shr 22;
inc(b, d xor (e and (c xor d)) + x[12] + k3); b := b shl 9 or b shr (32 - 9) + a; d := d shl 10 or d shr 22;
inc(a, c xor (d and (b xor c)) + x[ 4] + k3); a := a shl 8 or a shr (32 - 8) + e; c := c shl 10 or c shr 22;
inc(e, b xor (c and (a xor b)) + x[13] + k3); e := e shl 9 or e shr (32 - 9) + d; b := b shl 10 or b shr 22;
inc(d, a xor (b and (e xor a)) + x[ 3] + k3); d := d shl 14 or d shr (32 - 14) + c; a := a shl 10 or a shr 22;
inc(c, e xor (a and (d xor e)) + x[ 7] + k3); c := c shl 5 or c shr (32 - 5) + b; e := e shl 10 or e shr 22;
inc(b, d xor (e and (c xor d)) + x[15] + k3); b := b shl 6 or b shr (32 - 6) + a; d := d shl 10 or d shr 22;
inc(a, c xor (d and (b xor c)) + x[14] + k3); a := a shl 8 or a shr (32 - 8) + e; c := c shl 10 or c shr 22;
inc(e, b xor (c and (a xor b)) + x[ 5] + k3); e := e shl 6 or e shr (32 - 6) + d; b := b shl 10 or b shr 22;
inc(d, a xor (b and (e xor a)) + x[ 6] + k3); d := d shl 5 or d shr (32 - 5) + c; a := a shl 10 or a shr 22;
inc(c, e xor (a and (d xor e)) + x[ 2] + k3); c := c shl 12 or c shr (32 - 12) + b; e := e shl 10 or e shr 22;
inc(b, c xor (d or (not e)) + x[ 4] + k4); b := b shl 9 or b shr (32 - 9) + a; d := d shl 10 or d shr 22;
inc(a, b xor (c or (not d)) + x[ 0] + k4); a := a shl 15 or a shr (32 - 15) + e; c := c shl 10 or c shr 22;
inc(e, a xor (b or (not c)) + x[ 5] + k4); e := e shl 5 or e shr (32 - 5) + d; b := b shl 10 or b shr 22;
inc(d, e xor (a or (not b)) + x[ 9] + k4); d := d shl 11 or d shr (32 - 11) + c; a := a shl 10 or a shr 22;
inc(c, d xor (e or (not a)) + x[ 7] + k4); c := c shl 6 or c shr (32 - 6) + b; e := e shl 10 or e shr 22;
inc(b, c xor (d or (not e)) + x[12] + k4); b := b shl 8 or b shr (32 - 8) + a; d := d shl 10 or d shr 22;
inc(a, b xor (c or (not d)) + x[ 2] + k4); a := a shl 13 or a shr (32 - 13) + e; c := c shl 10 or c shr 22;
inc(e, a xor (b or (not c)) + x[10] + k4); e := e shl 12 or e shr (32 - 12) + d; b := b shl 10 or b shr 22;
inc(d, e xor (a or (not b)) + x[14] + k4); d := d shl 5 or d shr (32 - 5) + c; a := a shl 10 or a shr 22;
inc(c, d xor (e or (not a)) + x[ 1] + k4); c := c shl 12 or c shr (32 - 12) + b; e := e shl 10 or e shr 22;
inc(b, c xor (d or (not e)) + x[ 3] + k4); b := b shl 13 or b shr (32 - 13) + a; d := d shl 10 or d shr 22;
inc(a, b xor (c or (not d)) + x[ 8] + k4); a := a shl 14 or a shr (32 - 14) + e; c := c shl 10 or c shr 22;
inc(e, a xor (b or (not c)) + x[11] + k4); e := e shl 11 or e shr (32 - 11) + d; b := b shl 10 or b shr 22;
inc(d, e xor (a or (not b)) + x[ 6] + k4); d := d shl 8 or d shr (32 - 8) + c; a := a shl 10 or a shr 22;
inc(c, d xor (e or (not a)) + x[15] + k4); c := c shl 5 or c shr (32 - 5) + b; e := e shl 10 or e shr 22;
inc(b, c xor (d or (not e)) + x[13] + k4); b := b shl 6 or b shr (32 - 6) + a; d := d shl 10 or d shr 22;
// Save result of first part
a1 := a;
b1 := b;
c1 := c;
d1 := d;
e1 := e;
// Initialize for second part
a := data[0];
b := data[1];
c := data[2];
d := data[3];
e := data[4];
inc(a, b xor (c or (not d)) + x[ 5] + k5); a := a shl 8 or a shr (32 - 8) + e; c := c shl 10 or c shr 22;
inc(e, a xor (b or (not c)) + x[14] + k5); e := e shl 9 or e shr (32 - 9) + d; b := b shl 10 or b shr 22;
inc(d, e xor (a or (not b)) + x[ 7] + k5); d := d shl 9 or d shr (32 - 9) + c; a := a shl 10 or a shr 22;
inc(c, d xor (e or (not a)) + x[ 0] + k5); c := c shl 11 or c shr (32 - 11) + b; e := e shl 10 or e shr 22;
inc(b, c xor (d or (not e)) + x[ 9] + k5); b := b shl 13 or b shr (32 - 13) + a; d := d shl 10 or d shr 22;
inc(a, b xor (c or (not d)) + x[ 2] + k5); a := a shl 15 or a shr (32 - 15) + e; c := c shl 10 or c shr 22;
inc(e, a xor (b or (not c)) + x[11] + k5); e := e shl 15 or e shr (32 - 15) + d; b := b shl 10 or b shr 22;
inc(d, e xor (a or (not b)) + x[ 4] + k5); d := d shl 5 or d shr (32 - 5) + c; a := a shl 10 or a shr 22;
inc(c, d xor (e or (not a)) + x[13] + k5); c := c shl 7 or c shr (32 - 7) + b; e := e shl 10 or e shr 22;
inc(b, c xor (d or (not e)) + x[ 6] + k5); b := b shl 7 or b shr (32 - 7) + a; d := d shl 10 or d shr 22;
inc(a, b xor (c or (not d)) + x[15] + k5); a := a shl 8 or a shr (32 - 8) + e; c := c shl 10 or c shr 22;
inc(e, a xor (b or (not c)) + x[ 8] + k5); e := e shl 11 or e shr (32 - 11) + d; b := b shl 10 or b shr 22;
inc(d, e xor (a or (not b)) + x[ 1] + k5); d := d shl 14 or d shr (32 - 14) + c; a := a shl 10 or a shr 22;
inc(c, d xor (e or (not a)) + x[10] + k5); c := c shl 14 or c shr (32 - 14) + b; e := e shl 10 or e shr 22;
inc(b, c xor (d or (not e)) + x[ 3] + k5); b := b shl 12 or b shr (32 - 12) + a; d := d shl 10 or d shr 22;
inc(a, b xor (c or (not d)) + x[12] + k5); a := a shl 6 or a shr (32 - 6) + e; c := c shl 10 or c shr 22;
inc(e, b xor (c and (a xor b)) + x[ 6] + k6); e := e shl 9 or e shr (32 - 9) + d; b := b shl 10 or b shr 22;
inc(d, a xor (b and (e xor a)) + x[11] + k6); d := d shl 13 or d shr (32 - 13) + c; a := a shl 10 or a shr 22;
inc(c, e xor (a and (d xor e)) + x[ 3] + k6); c := c shl 15 or c shr (32 - 15) + b; e := e shl 10 or e shr 22;
inc(b, d xor (e and (c xor d)) + x[ 7] + k6); b := b shl 7 or b shr (32 - 7) + a; d := d shl 10 or d shr 22;
inc(a, c xor (d and (b xor c)) + x[ 0] + k6); a := a shl 12 or a shr (32 - 12) + e; c := c shl 10 or c shr 22;
inc(e, b xor (c and (a xor b)) + x[13] + k6); e := e shl 8 or e shr (32 - 8) + d; b := b shl 10 or b shr 22;
inc(d, a xor (b and (e xor a)) + x[ 5] + k6); d := d shl 9 or d shr (32 - 9) + c; a := a shl 10 or a shr 22;
inc(c, e xor (a and (d xor e)) + x[10] + k6); c := c shl 11 or c shr (32 - 11) + b; e := e shl 10 or e shr 22;
inc(b, d xor (e and (c xor d)) + x[14] + k6); b := b shl 7 or b shr (32 - 7) + a; d := d shl 10 or d shr 22;
inc(a, c xor (d and (b xor c)) + x[15] + k6); a := a shl 7 or a shr (32 - 7) + e; c := c shl 10 or c shr 22;
inc(e, b xor (c and (a xor b)) + x[ 8] + k6); e := e shl 12 or e shr (32 - 12) + d; b := b shl 10 or b shr 22;
inc(d, a xor (b and (e xor a)) + x[12] + k6); d := d shl 7 or d shr (32 - 7) + c; a := a shl 10 or a shr 22;
inc(c, e xor (a and (d xor e)) + x[ 4] + k6); c := c shl 6 or c shr (32 - 6) + b; e := e shl 10 or e shr 22;
inc(b, d xor (e and (c xor d)) + x[ 9] + k6); b := b shl 15 or b shr (32 - 15) + a; d := d shl 10 or d shr 22;
inc(a, c xor (d and (b xor c)) + x[ 1] + k6); a := a shl 13 or a shr (32 - 13) + e; c := c shl 10 or c shr 22;
inc(e, b xor (c and (a xor b)) + x[ 2] + k6); e := e shl 11 or e shr (32 - 11) + d; b := b shl 10 or b shr 22;
inc(d, b xor (e or (not a)) + x[15] + k7); d := d shl 9 or d shr (32 - 9) + c; a := a shl 10 or a shr 22;
inc(c, a xor (d or (not e)) + x[ 5] + k7); c := c shl 7 or c shr (32 - 7) + b; e := e shl 10 or e shr 22;
inc(b, e xor (c or (not d)) + x[ 1] + k7); b := b shl 15 or b shr (32 - 15) + a; d := d shl 10 or d shr 22;
inc(a, d xor (b or (not c)) + x[ 3] + k7); a := a shl 11 or a shr (32 - 11) + e; c := c shl 10 or c shr 22;
inc(e, c xor (a or (not b)) + x[ 7] + k7); e := e shl 8 or e shr (32 - 8) + d; b := b shl 10 or b shr 22;
inc(d, b xor (e or (not a)) + x[14] + k7); d := d shl 6 or d shr (32 - 6) + c; a := a shl 10 or a shr 22;
inc(c, a xor (d or (not e)) + x[ 6] + k7); c := c shl 6 or c shr (32 - 6) + b; e := e shl 10 or e shr 22;
inc(b, e xor (c or (not d)) + x[ 9] + k7); b := b shl 14 or b shr (32 - 14) + a; d := d shl 10 or d shr 22;
inc(a, d xor (b or (not c)) + x[11] + k7); a := a shl 12 or a shr (32 - 12) + e; c := c shl 10 or c shr 22;
inc(e, c xor (a or (not b)) + x[ 8] + k7); e := e shl 13 or e shr (32 - 13) + d; b := b shl 10 or b shr 22;
inc(d, b xor (e or (not a)) + x[12] + k7); d := d shl 5 or d shr (32 - 5) + c; a := a shl 10 or a shr 22;
inc(c, a xor (d or (not e)) + x[ 2] + k7); c := c shl 14 or c shr (32 - 14) + b; e := e shl 10 or e shr 22;
inc(b, e xor (c or (not d)) + x[10] + k7); b := b shl 13 or b shr (32 - 13) + a; d := d shl 10 or d shr 22;
inc(a, d xor (b or (not c)) + x[ 0] + k7); a := a shl 13 or a shr (32 - 13) + e; c := c shl 10 or c shr 22;
inc(e, c xor (a or (not b)) + x[ 4] + k7); e := e shl 7 or e shr (32 - 7) + d; b := b shl 10 or b shr 22;
inc(d, b xor (e or (not a)) + x[13] + k7); d := d shl 5 or d shr (32 - 5) + c; a := a shl 10 or a shr 22;
inc(c, a xor (d and (e xor a)) + x[ 8] + k8); c := c shl 15 or c shr (32 - 15) + b; e := e shl 10 or e shr 22;
inc(b, e xor (c and (d xor e)) + x[ 6] + k8); b := b shl 5 or b shr (32 - 5) + a; d := d shl 10 or d shr 22;
inc(a, d xor (b and (c xor d)) + x[ 4] + k8); a := a shl 8 or a shr (32 - 8) + e; c := c shl 10 or c shr 22;
inc(e, c xor (a and (b xor c)) + x[ 1] + k8); e := e shl 11 or e shr (32 - 11) + d; b := b shl 10 or b shr 22;
inc(d, b xor (e and (a xor b)) + x[ 3] + k8); d := d shl 14 or d shr (32 - 14) + c; a := a shl 10 or a shr 22;
inc(c, a xor (d and (e xor a)) + x[11] + k8); c := c shl 14 or c shr (32 - 14) + b; e := e shl 10 or e shr 22;
inc(b, e xor (c and (d xor e)) + x[15] + k8); b := b shl 6 or b shr (32 - 6) + a; d := d shl 10 or d shr 22;
inc(a, d xor (b and (c xor d)) + x[ 0] + k8); a := a shl 14 or a shr (32 - 14) + e; c := c shl 10 or c shr 22;
inc(e, c xor (a and (b xor c)) + x[ 5] + k8); e := e shl 6 or e shr (32 - 6) + d; b := b shl 10 or b shr 22;
inc(d, b xor (e and (a xor b)) + x[12] + k8); d := d shl 9 or d shr (32 - 9) + c; a := a shl 10 or a shr 22;
inc(c, a xor (d and (e xor a)) + x[ 2] + k8); c := c shl 12 or c shr (32 - 12) + b; e := e shl 10 or e shr 22;
inc(b, e xor (c and (d xor e)) + x[13] + k8); b := b shl 9 or b shr (32 - 9) + a; d := d shl 10 or d shr 22;
inc(a, d xor (b and (c xor d)) + x[ 9] + k8); a := a shl 12 or a shr (32 - 12) + e; c := c shl 10 or c shr 22;
inc(e, c xor (a and (b xor c)) + x[ 7] + k8); e := e shl 5 or e shr (32 - 5) + d; b := b shl 10 or b shr 22;
inc(d, b xor (e and (a xor b)) + x[10] + k8); d := d shl 15 or d shr (32 - 15) + c; a := a shl 10 or a shr 22;
inc(c, a xor (d and (e xor a)) + x[14] + k8); c := c shl 8 or c shr (32 - 8) + b; e := e shl 10 or e shr 22;
inc(b, c xor d xor e + x[12]); b := b shl 8 or b shr (32 - 8) + a; d := d shl 10 or d shr 22;
inc(a, b xor c xor d + x[15]); a := a shl 5 or a shr (32 - 5) + e; c := c shl 10 or c shr 22;
inc(e, a xor b xor c + x[10]); e := e shl 12 or e shr (32 - 12) + d; b := b shl 10 or b shr 22;
inc(d, e xor a xor b + x[ 4]); d := d shl 9 or d shr (32 - 9) + c; a := a shl 10 or a shr 22;
inc(c, d xor e xor a + x[ 1]); c := c shl 12 or c shr (32 - 12) + b; e := e shl 10 or e shr 22;
inc(b, c xor d xor e + x[ 5]); b := b shl 5 or b shr (32 - 5) + a; d := d shl 10 or d shr 22;
inc(a, b xor c xor d + x[ 8]); a := a shl 14 or a shr (32 - 14) + e; c := c shl 10 or c shr 22;
inc(e, a xor b xor c + x[ 7]); e := e shl 6 or e shr (32 - 6) + d; b := b shl 10 or b shr 22;
inc(d, e xor a xor b + x[ 6]); d := d shl 8 or d shr (32 - 8) + c; a := a shl 10 or a shr 22;
inc(c, d xor e xor a + x[ 2]); c := c shl 13 or c shr (32 - 13) + b; e := e shl 10 or e shr 22;
inc(b, c xor d xor e + x[13]); b := b shl 6 or b shr (32 - 6) + a; d := d shl 10 or d shr 22;
inc(a, b xor c xor d + x[14]); a := a shl 5 or a shr (32 - 5) + e; c := c shl 10 or c shr 22;
inc(e, a xor b xor c + x[ 0]); e := e shl 15 or e shr (32 - 15) + d; b := b shl 10 or b shr 22;
inc(d, e xor a xor b + x[ 3]); d := d shl 13 or d shr (32 - 13) + c; a := a shl 10 or a shr 22;
inc(c, d xor e xor a + x[ 9]); c := c shl 11 or c shr (32 - 11) + b; e := e shl 10 or e shr 22;
inc(b, c xor d xor e + x[11]); b := b shl 11 or b shr (32 - 11) + a; d := d shl 10 or d shr 22;
// Combine parts 1 and 2
d := data[1] + c1 + d;
data[1] := data[2] + d1 + e;
data[2] := data[3] + e1 + a;
data[3] := data[4] + a1 + b;
data[4] := data[0] + b1 + c;
data[0] := d;
end;
// ---------------------------------------------------------------------------
procedure UpdateHash(hash: THandle; buf: pointer; len: integer);
var context : ^THashContext;
begin
if hash <> 0 then begin
context := pointer(hash);
inc(context.len, int64(len) shl 3);
while len > 0 do begin
// fill block with msg data
context.buf[context.index] := byte(buf^);
buf := pointer(NativeUInt(buf) + 1);
inc(context.index);
dec(len);
if context.index = 64 then begin
// If 512 bit transferred, compress a block
context.index := 0;
CalculateHash(context.state, context.buf);
while len >= 64 do begin
move(buf^, context.buf, 64);
CalculateHash(context.state, context.buf);
buf := pointer(NativeUInt(buf) + 64);
dec(len, 64);
end;
end;
end;
end;
end;
// ---------------------------------------------------------------------------
function CloseHash(var hash: THandle) : TDigest;
// finalize hash calculation, clear context
var i1 : integer;
context : ^THashContext;
begin
if hash <> 0 then begin
context := pointer(hash);
// 1. append bit '1' after msg
context.buf[context.index] := $80;
for i1 := context.index + 1 to 63 do
context.buf[i1] := 0;
// 2. Compress if more than 448 bits (no room for 64 bit length)
if context.index >= 56 then begin
CalculateHash(context.state, context.buf);
ZeroMemory(@context.buf, 56);
end;
// Write 64 bit msg length into the last bits of the last block and do a final compress
int64(pointer(@context.buf[56])^) := context.len;
CalculateHash(context.state, context.buf);
// Transfer context.Hash to Digest
Move(context.state, result, sizeof(result));
// Clear context
LocalFree(HLOCAL(hash));
hash := 0;
end else
ZeroMemory(@result, sizeOf(result));
end;
// ---------------------------------------------------------------------------
function Hash(buf: pointer; len: integer) : TDigest;
var hash : THandle;
begin
hash := InitHash;
UpdateHash(hash, buf, len);
result := CloseHash(hash);
end;
function Hash(buf: AnsiString) : TDigest;
var hash : THandle;
begin
hash := InitHash;
UpdateHash(hash, PAnsiChar(buf), length(buf));
result := CloseHash(hash);
end;
// ---------------------------------------------------------------------------
end.