«

»

Print this Post

HMAC_SHA1 in Purebasic

Der OAuth Mechanismus von Twitter benötigt zur Authentifizierung den Hash-based Message Authentication Code oder auch kurz HMAC auf Basis von SHA1. Leider gibt es in Purebasic dazu keine Funktion, so dass ich ihn selbst implementieren musste. Glücklicherweise gibt es bereits eine Funktion, die einen SHA1 Fingerprint erzeugt. Und hätte ich von Anfang an den SHA1 Fingerprint in zwei Byte Schritten eingelesen und in den Speicher geschrieben, wäre mir viel Frust erspart geblieben.

Bei der Implementierung bin ich nach der RFC2104 vorgegangen.

Procedure.s hmac_sha1(key.s, message.s)
  ;http://tools.ietf.org/html/rfc2104
  Protected blocksize.l = 64
  Protected hashlen.l = 20
  Protected *ipad = AllocateMemory(blocksize+Len(message))
  Protected *opad = AllocateMemory(blocksize+hashlen)
  Protected buffer.s = ""

  FillMemory(*ipad, blocksize, $36)
  FillMemory(*opad, blocksize, $5c)

  If(Len(key)>blocksize)
    key = SHA1Fingerprint(@key, StringByteLength(key))
  EndIf

  buffer = LSet(key, blocksize, Chr(0))

  For i = 0 To blocksize -1
    PokeB(*ipad+i, PeekC(@buffer + i) ! PeekC(*ipad + i))
    PokeB(*opad+i, PeekC(@buffer + i) ! PeekC(*opad + i))
  Next

  PokeS(*ipad+blocksize, message)
  buffer = SHA1Fingerprint(*ipad, blocksize+Len(message))

  For i = 0 To hashlen-1
    PokeB(*opad+blocksize+i, Val("$"+PeekS(@buffer+(i*2), 2)))
  Next

  buffer = SHA1Fingerprint(*opad, blocksize+hashlen)

  FreeMemory(*ipad)
  FreeMemory(*opad)
  ProcedureReturn buffer
EndProcedure

Permanent link to this article: http://www.mad79.de/archives/204

1 comment

  1. Tobias Edl

    Aha…..

Leave a Reply

Your email address will not be published.


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Switch to mobile version