[fpc-pascal] HMAC_SHA1 and FPC

Tony Whyman tony.whyman at mccallumwhyman.com
Sat Mar 23 16:28:14 CET 2013


Silvio,

Just one extra point - the snippet I sent is example code. It is not
intended to be RFC compliant.

Regards

Tony Whyman
MWA

On 23/03/13 15:24, silvioprog wrote:
> 2013/3/23 Tony Whyman <tony.whyman at mccallumwhyman.com
> <mailto:tony.whyman at 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 <http://github.com/silvioprog>
>
>
> _______________________________________________
> fpc-pascal maillist  -  fpc-pascal at lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-pascal

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20130323/db5a7b4f/attachment.html>


More information about the fpc-pascal mailing list