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
1 comment
Tobias Edl
29.06.2011 at 01:16 (UTC 2)
Aha…..