2012-02-22 11 views
0

draft 00のように、draft 17とそれ以前のバリエーションの両方をサポートする小さなWebSocketサーバーアプリケーションを作成しています。私は最新のドラフトで何の問題もなかったが、ドラフト00のクライアントを幸せにすることはできない。私は公式の(古い)で提供される例を使用し、テストの目的のためにサーバーサイドのドラフト00からWebSocketsハンドシェイク応答

draft 00 docuemnt、7ページ:

Sec-WebSocket-Key1: 18x 6]8vM;54 *(5: { U1]8 z [ 8 
Sec-WebSocket-Key2: 1_ tx7X d < nw 334J702) 7]o}` 0 

Tm[K T2u 

数字を連結し、カウントスペースで割ることによって、キーを計算する場合、私は、次の2つの整数を取得:および(これらの2つの数字も文書に記載されています)。

  1. 文字列で結果を連結し、最後の8ビット(Tm[K T2u)を追加
  2. ビッグエンディアンに個別にそれらを変換します

    次に、には言います。

  3. 私は次のコードを生成しました。この知識で武装し

ステップ1で生成された文字列から128ビットのMD5サムを作成し、2:

#define BYTE 8 
#define WORD 16 

// Little Endian to Big Endian short 
#define LE_TO_BE_SHORT(SHORT)\ 
    (((SHORT >> BYTE) & 0x00FF) | ((SHORT << BYTE) & 0xFF00)) 

// Little Endian to Big Endian long 
#define LE_TO_BE_LONG(LONG)\ 
    (((LE_TO_BE_SHORT(LONG >> WORD)) | \ 
    ((LE_TO_BE_SHORT((LONG & 0xFFFF)) << WORD)))) 

uint num1 = LE_TO_BE_LONG(155712099); 
uint num2 = LE_TO_BE_LONG(173347027); 

QString cookie = QString::fromUtf8("Tm[K T2u"); 
QString c = QString::number(num1) + QString::number(num2) + cookie; 

QByteArray data = c.toUtf8(); 
qDebug() << QCryptographicHash::hash(data, QCryptographicHash::Md5); 

は、ここで私が得るものです:

←→»α√r¼??┐☺║Pa♠µ 

そして、ここで(ドラフト例に基づいて、再び)期待されているものです

fQJ,fN/4F4!~K~MH 

私は、wikipedia articleにエンディアン変換については何も言及していないことに気付きました。私は変換なしで上記のコードを試しましたが(Wikipediaの例とドラフトの例の両方)、期待される結果を再現することはできません。

誰でも問題は何かを指摘できますか?


EDIT:

私はthis documentは、プロトコルのより良い説明を持っていました。別のドラフト(76)ですが、ハンドシェイクの点では00に似ています。

答えて

2

最後に、私の同僚の新鮮な目の助けを借りて、私が間違っていたことを理解しました。基本的に、私は文字通り2つの整数を文字列に連結していました。代わりに、私はバイトを連結するために必要な:

uint num1 = LE_TO_BE_LONG(155712099); // macros definition can 
uint num2 = LE_TO_BE_LONG(173347027); // be found in the question 
QString cookie = QString::fromUtf8("Tm[K T2u"); 

QByteArray array; 

array = QByteArray((const char*)&num1, sizeof(int)); 
array += QByteArray((const char*)&num2, sizeof(int)); 
array += QByteArray(cookie.toStdString().data(), cookie.length()); 

qDebug() << QCryptographicHash::hash(array, QCryptographicHash::Md5); 

あなたはQtはクレート少し大きめの配列がゴミで埋めますので、サイズをとらないオーバーロードされたコンストラクタを使用していないことていることを確認します。少なくともそれは私の場合だった。

2

Hereは、websockifyのC実装の計算です。私はそれが参考としてそれを使用することができるかもしれないので、作品を知っています。

+0

+1ありがとうございました。私もあなたの答えとして答えを追加していました:) – unexplored

関連する問題