[fpc-pascal] HMAC_SHA1 and FPC
David Butler
djbutler at gmail.com
Sun Mar 24 08:48:46 CET 2013
congrats on re-inventing the wheel. all those string
allocations/de-allocations could make it slow.
On Sun, Mar 24, 2013 at 6:12 AM, silvioprog <silvioprog at gmail.com> wrote:
> Eureka!
>
> After spending all day working on it, I finally did it! The pseudo steps
> are here:
> http://en.wikipedia.org/wiki/Hash-based_message_authentication_code
>
> And, this is the final code (please improves it please):
>
> uses
> SHA1;
>
> function SHA1Raw(const ABuffer; const ABufferLength: PtrUInt): string;
> var
> I: Byte;
> VBytes : TBytes;
> VDigest: TSHA1Digest;
> VContext: TSHA1Context;
> begin
> Result := '';
> SHA1Init(VContext);
> SHA1Update(VContext, ABuffer, ABufferLength);
> SHA1Final(VContext, VDigest);
> SetLength(VBytes, 20);
> Move(VDigest, VBytes[0], 20);
> for I := 0 to 19 do
> Result := Result + Char(VBytes[I]);
> end;
>
> function HMACSHA1(const AKey, AMessage: string): string;
> const
> BLOCK_SIZE = 64;
> var
> I: Byte;
> VKey: string;
> VLenght: PtrUInt;
> VOPadStr, VIPadStr: string;
> VOPad, VIPad: array[1..BLOCK_SIZE] of Byte;
> begin
> VLenght := Length(AKey);
> if VLenght > BLOCK_SIZE then
> begin
> SetLength(VKey, BLOCK_SIZE);
> FillChar(Pointer(VKey)^, BLOCK_SIZE, #0);
> VKey := SHA1Raw(Pointer(AKey)^, VLenght) + VKey;
> end
> else
> begin
> SetLength(VKey, BLOCK_SIZE - VLenght);
> FillChar(Pointer(VKey)^, BLOCK_SIZE - VLenght, #0);
> VKey := AKey + VKey;
> end;
> FillChar(VOPad, BLOCK_SIZE, $5c);
> FillChar(VIPad, BLOCK_SIZE, $36);
> for I := 1 to BLOCK_SIZE do
> begin
> VOPad[I] := VOPad[I] xor Byte(VKey[I]);
> VIPad[I] := VIPad[I] xor Byte(VKey[I]);
> end;
> SetLength(VOPadStr, BLOCK_SIZE);
> Move(VOPad, Pointer(VOPadStr)^, BLOCK_SIZE);
> SetLength(VIPadStr, BLOCK_SIZE);
> Move(VIPad, Pointer(VIPadStr)^, BLOCK_SIZE);
> VIPadStr := VIPadStr + AMessage;
> Result := SHA1Print(SHA1String(VOPadStr +
> SHA1Raw(Pointer(VIPadStr)^, Length(VIPadStr))));
> end;
>
> Usage:
>
> WriteLn(HMACSHA1('key', 'The quick brown fox jumped over the lazy dog.')).
>
> Result: 0b7252985d63555b31db4755f37efe218c509711 (same result in PHP, JS
> and Phyton! ;) )
>
> So, can you add this code (I'll make HMACMD5 too) in FCL hashes?
> (>fpc\VER\source\packages\hash\src)
>
> Thank you very much buddies! :)
>
> --
> Silvio Clécio
> My public projects - 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/20130324/00f2249d/attachment.html>
More information about the fpc-pascal
mailing list