以下是noVNC代码的摘录,
if (this._sock.rQwait("auth challenge", 16)) { return false; }
// TODO(directxman12): make genDES not require an Array
var challenge = Array.prototype.slice.call(this._sock.rQshiftBytes(16));
Util.Warn("Challenge " + challenge);
var response = RFB.genDES(this._rfb_password, challenge);
Util.Warn("Response " + response);
this._sock.send(response);
Util.Warn("Response " + response);
this._updateState("SecurityResult");
return true;
我的理解是客户端要求服务器用代码发送质询
this._sock.rQwait("auth challenge", 16)
然后,服务器正在发送客户端在代码
中收到的质询this._sock.rQshiftBytes(16)
然后使用RFB.genDES对密码进行DES加密,并通过套接字发送响应。
然而,在服务器端,这是一个XVP代理程序,代码看起来像
unsigned int major, minor, type, res, challenge[4], response[16];
...
case XVP_STATE_CHALLENGE_AUTH:
srandom((unsigned int)(time(NULL) ^ 0xdf214a30));
for (i = 0; i < 4; i++) {
challenge[i] = (random() ^ 0x51a488ce);
}
if (!xvp_write_all(client_sock, challenge, sizeof(challenge)))
return 1;
xvp_proxy_state = XVP_STATE_RESPONSE_AUTH;
xvp_proxy_writing = false;
break;
case XVP_STATE_RESPONSE_AUTH:
if (!xvp_read_all(client_sock, response, 16))
return 1;
authok = (vm == xvp_multiplex_vm || wrongvm) ? false :
xvp_password_vnc_ok(vm->password, client_ip,
(char *)challenge, (char *)response);
xvp_proxy_state = XVP_STATE_CONFIRM_AUTH;
xvp_proxy_writing = true;
break;
挑战数组只有4个字节,正在使用代码
发送!xvp_write_all(client_sock, challenge, sizeof(challenge))
但是,我的以下代码中的javascript日志显示了16个数字的数组。
Util.Warn("Challenge " + challenge);
e.g。挑战100,139,246,69,3,120,162,81,179,57,13,48,56,106,4,19
我的问题是java脚本是否真的使用this._sock.rQshiftBytes(16)从套接字读取16个字节,服务器在同一个套接字上只发送4个字节?