WebSocket Handshake Implementieren

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

FWeinb

ehemals "ich"

Betreff: WebSocket Handshake Implementieren

BeitragDi, Nov 23, 2010 16:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Bin jetzt seit einer Stunde damit beschäftigt den WebSocket Handshake zu Implementieren, doch leider ohne Erfolgt.

Ich habe hier ein die Dokumentation des Protokolls doch leider werde ich nicht schlau daraus.

Das Problem ist dieser Part der Erklärung:
Zitat:
The concatenation of the number obtained from processing the |Sec-
WebSocket-Key1| field, expressed as a big-endian 32 bit number, the
number obtained from processing the |Sec-WebSocket-Key2| field, again
expressed as a big-endian 32 bit number, and finally the eight bytes
at the end of the handshake, form a 128 bit string whose MD5 sum is
then used by the server to prove that it read the handshake.


Müssen Key1 und Key2 sowie die "eight byte" einfach aneinander gehangen werden und der MD5 Hash draus gemacht werden?
Kann scheinbar nicht sein, da ich genau das mache...

Gruß,
Ich

[Edit]
Habe gerade in einer PHP Implementation gesehen, dass der Handshake mit der Funktion pack('N', key1) usw. zusammengeführt wird.
Code: [AUSKLAPPEN]
     md5(
            pack('N', $this->keyToBytes($key1)) .
            pack('N', $this->keyToBytes($key2)) .
            $key3, true);

Doch leider weiß ich nicht, wie ich die Funktion in BlitzMax Umsetzen sollte.
Hier die Beschreibung bei php.net pack
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs

Lord Stweccys

BeitragFr, Dez 24, 2010 17:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Bitte tötet mich nicht, wei ich diesen alten Thread ausgrabe, aber ich glaube,
dass dieser Thread beantwortet werden muss (Nicht nur, weil ich mir dieselbe Frage stelle)

Zu dem Thema habe ich im Internet (nach langer Suche) diese Seite gefunden: http://stackoverflow.com/quest...ke-problem

Mit folgender Anleitung (zwar in Python, aber lässt sich relativ leicht in BlitzMax umsetzen, fürchte ich):

Code: [AUSKLAPPEN]
Lets start with key1, key2, and the 8 bytes at the end of the handshake

key1 = "18x 6]8vM;54 *(5:  {   U1]8  z [  8"
key2 = "1_ tx7X d  <  nw  334J702) 7]o}` 0"
end8 = "Tm[K T2u"
We make a number for each key by ignoring every character that is not a digit 0-9. In Python:

def numFromKey(key):
    return int(filter(lambda c: c in map(str,range(10)),key))
next we divide that number by the number of spaces in the original key string, so here is a is a function that counts the spaces in a string.

def spacesIn(key):
    return len(filter(lambda c: c==' ',key))
The two numbers resulting from the keys are:

pkey1 = numFromKey(key1)/spacesIn(key1)
pkey2 = numFromKey(key2)/spacesIn(key2)
Now we need to concatenate the bytes of pkey1, pkey2, and end8. The processed keys need to be represented as 32 bit Big-Endian numbers.

from struct import pack
catstring = pack('>L',pkey1) + pack('>L',pkey2) + end8
Then we take the md5 hash of those bytes to get the magic number that we tack on the end of the handshake

import md5
magic = md5.new(catstring).digest()
Thats how I think it works at least


(Md5 mit bLitzMax ist kein Problem, einfach bei google suchen, da wird man locker fündig)
 

FWeinb

ehemals "ich"

BeitragFr, Dez 24, 2010 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Durch die Hilfe von Lobby funktioniert es nun bei mir. Hier den umsetzung von packN:
BlitzMax: [AUSKLAPPEN]
Function packN:String(in:Int) 'Thank's to Lobby!
Local b:Byte Ptr = Varptr(in)
Local out:String
For Local i:Int = 0 Until 4
out = Chr(b[i]) + out
Next
Return out
End Function


und um aus einem MD5 String rawBinary (wird von der Spezifikation gefordert) zu machen gibt es noch diese Funktion:
BlitzMax: [AUSKLAPPEN]
Function toRawBinary:String(in:String)
Local out:String
For Local i:Int = 0 Until in.Length Step 2
out:+Chr(Int("$" + Chr(in[i])) * 16 + Int("$" + Chr(in[i + 1])))
Next
Return out
End Function


Wie gesagt, beide Funktionen sind von Lobby. Bin ihm auch sehr dankbar dafür. Brauchte das ganze für das hier:
https://www.blitzforum.de/foru...hp?t=36188
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs

Farbfinsternis

BeitragDo, März 03, 2011 19:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry dass ich diesen alten Thread nochmal heraus krame, aber kann mir jemand vielleicht erklären wie das mit dem Handshake exakt funktioniert? Ich verstehe da nur Bahnhof.

Ich weiß dass die beiden Keys Ziffern und Leerzeichen beinhalten. Die Ziffern aneinander gehangen ergeben einen Key und man muss sich die Anzahl der Leerzeichen merken ... durch irgendwelche Magie wird dann aus den beiden Keys und dem 8Bit String am Ende des HTTP Paketes ein Wert den man irgendwie so verzaubern muss dass er als Antwort für den Handshake genügt ...
Farbfinsternis.tv

Jolinah

BeitragDo, März 03, 2011 20:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Zahl von Key1 wird durch die Anzahl Leerschläge in Key1 dividiert. Das gleiche macht man auch bei Key2.

Diese beiden Zahlen (32-bit Integer) und die 8 Bytes die der Client gesendet hat hängt man zusammen (Byte-Array). Das sind dann total 16Bytes.

Edit: Dabei zu beachten ist auch noch, dass man die beiden Zahlen im Big-Endian-Format in das Byte-Array einfügen muss, also vermutlich die Byte-Reihenfolge der einzelnen Zahlen umkehren (hatte es in C# mit Hilfe von BitConverter gemacht).

Diese 16Bytes lässt man durch den MD5-Algorithmus und erhält 16 neue Bytes, welche man als Antwort (String) sendet.


Pseudocode:
Code: [AUSKLAPPEN]

byte[] clientBytes = LeseBytesVomClient();

ulong zahl1 = ExtrahiereZahl(Key1);  // ulong, da die zahlen recht gross sein können
ulong zahl2 = ExtrahiereZahl(Key2);
ulong spaces1 = AnzahlLeerschläge(Key1);
ulong spaces2 = AnzahlLeerschläge(Key2);

uint neueZahl1 = (uint)(zahl1 / spaces1);
uint neueZahl2 = (uint)(zahl2 / spaces2);

byte[] buffer = { die bytes von neueZahl1, neueZahl2, clientBytes };

buffer = MD5(buffer);

string antwort = (string)buffer;

Farbfinsternis

BeitragDo, März 03, 2011 21:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Jetzt ist es klar ... vielen Dank Jolinah!
Farbfinsternis.tv

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group