2013/3/23 Tony Whyman <tony.why...@mccallumwhyman.com> > Silvio, > > I had the same requirement for an HMAC and used the DCP library: > > http://wiki.freepascal.org/DCPcrypt > > I then used the following code snippet to generate the HMAC > > Regards > > Tony Whyman > MWA > > unit hmac; > > {$mode objfpc}{$H+} > > interface > > uses > Classes, SysUtils; > > procedure MakeHMAC(text: string; var seed: LongInt; var hash: string); > function ValidateHMAC(text: string; seed: LongInt; hmac: string): boolean; > > implementation > > uses DCPsha1; > > function GenerateHash(seed: longint; data: string):string; > var b1, b2, b3, b4: byte; > q: integer; > sha1: TDCP_sha1; > buffer: PChar; > memsize: integer; > len: integer; > begin > len := Length(data); > b1 := seed mod 256; > q := seed div 256; > b2 := q mod 256; > q := q div 256; > b3 := q mod 256; > b4 := q div 256; > > sha1 := TDCP_sha1.Create(nil); > try > sha1.Init; > memsize := len + 4; > buffer := SysGetMem(memsize); > try > Move(b1,buffer^,1); > Move(b2,(buffer+1)^,1); > Move(b3,(buffer+2)^,1); > Move(b4,(buffer+3)^,1); > Move(data[1],(buffer+4)^,len); > SHA1.Update(buffer^,len+4); > setlength(Result,20); > SHA1.Final(Result[1]); > finally > SysFreeMem(buffer); > end; > finally > sha1.free; > end; > end; > > procedure MakeHMAC(text: string; var seed: LongInt; > var hash: string); > begin > Randomize; > seed := Round(Random(MaxLongInt)); > hash := GenerateHash(seed,text); > hash := GenerateHash(seed,hash); > end; > > function ValidateHMAC(text: string; seed: LongInt; hmac: string): boolean; > var hash1, hash2: string; > begin > hash1 := GenerateHash(seed,text); > hash2 := GenerateHash(seed,hash1); > Result := CompareMem(@(hmac[1]),@(hash2[1]),20) > end; > > end. >
Very nice. I will analyze this routine and see if I can remove the dependence of DCP library. Thank you! -- Silvio Clécio My public projects - github.com/silvioprog
_______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal