Skip to content
Snippets Groups Projects
Commit 89c17002 authored by deuce's avatar deuce
Browse files

Add TLS support to binkp.

The *first* packet from the answering side *must* be an M_NUL "OPT TLS".
If this is the case, the originating size responds with an M_NUL "OPT TLS".
After this, the answering system performs a server TLS handshake, and the
originating system performs a client TLS handshake.

OPT CRYPT is not used in this case (ie: not crypt over TLS)
parent 6beb72d5
Branches
Tags
No related merge requests found
...@@ -90,6 +90,8 @@ function BinkP(name_ver, inbound, rx_callback, tx_callback) ...@@ -90,6 +90,8 @@ function BinkP(name_ver, inbound, rx_callback, tx_callback)
this.want_callback = this.default_want; this.want_callback = this.default_want;
this.wont_crypt = false; this.wont_crypt = false;
this.will_crypt = false; this.will_crypt = false;
this.will_tls = false;
this.cant_tls = false;
this.in_keys = undefined; this.in_keys = undefined;
this.out_keys = undefined; this.out_keys = undefined;
this.capabilities = '115200,TCP,BINKP'; this.capabilities = '115200,TCP,BINKP';
...@@ -417,6 +419,10 @@ BinkP.prototype.connect = function(addr, password, auth_cb, port, inet_host) ...@@ -417,6 +419,10 @@ BinkP.prototype.connect = function(addr, password, auth_cb, port, inet_host)
this.wont_crypt = true; this.wont_crypt = true;
this.require_crypt = false; this.require_crypt = false;
} }
/* Check if the first remote comand is an M_NUL "OPT TLS" */
pkt = this.recvFrame(this.timeout);
if (pkt === undefined)
return false;
this.sendCmd(this.command.M_NUL, "SYS "+this.system_name); this.sendCmd(this.command.M_NUL, "SYS "+this.system_name);
this.sendCmd(this.command.M_NUL, "ZYZ "+this.system_operator); this.sendCmd(this.command.M_NUL, "ZYZ "+this.system_operator);
this.sendCmd(this.command.M_NUL, "LOC "+this.system_location); this.sendCmd(this.command.M_NUL, "LOC "+this.system_location);
...@@ -535,6 +541,10 @@ BinkP.prototype.accept = function(sock, auth_cb) ...@@ -535,6 +541,10 @@ BinkP.prototype.accept = function(sock, auth_cb)
this.cram = {algo:'MD5', challenge:challenge.replace(/[0-9a-fA-F]{2}/g, hex2ascii)}; this.cram = {algo:'MD5', challenge:challenge.replace(/[0-9a-fA-F]{2}/g, hex2ascii)};
this.authenticated = undefined; this.authenticated = undefined;
this.sendCmd(this.command.M_NUL, "OPT TLS");
pkt = this.recvFrame(this.timeout);
if (pkt === undefined)
return false;
this.sendCmd(this.command.M_NUL, "OPT CRAM-MD5-"+challenge+(this.wont_crypt?"":" CRYPT")); this.sendCmd(this.command.M_NUL, "OPT CRAM-MD5-"+challenge+(this.wont_crypt?"":" CRYPT"));
this.sendCmd(this.command.M_NUL, "SYS "+this.system_name); this.sendCmd(this.command.M_NUL, "SYS "+this.system_name);
this.sendCmd(this.command.M_NUL, "ZYZ "+this.system_operator); this.sendCmd(this.command.M_NUL, "ZYZ "+this.system_operator);
...@@ -922,6 +932,7 @@ BinkP.prototype.recvFrame = function(timeout) ...@@ -922,6 +932,7 @@ BinkP.prototype.recvFrame = function(timeout)
var avail; var avail;
var nullpos; var nullpos;
var buf; var buf;
var oldctls = this.cant_tls;
// Avoid warning from syncjslint by putting this in a closure. // Avoid warning from syncjslint by putting this in a closure.
function hex2ascii(hex) function hex2ascii(hex)
...@@ -1028,6 +1039,7 @@ BinkP.prototype.recvFrame = function(timeout) ...@@ -1028,6 +1039,7 @@ BinkP.prototype.recvFrame = function(timeout)
if (ret.data.length < ret.length) if (ret.data.length < ret.length)
this.partialFrame = ret; this.partialFrame = ret;
else { else {
this.cant_tls = true;
this.partialFrame = undefined; this.partialFrame = undefined;
if (ret.is_cmd) { if (ret.is_cmd) {
ret.command = ret.data.charCodeAt(0); ret.command = ret.data.charCodeAt(0);
...@@ -1107,6 +1119,22 @@ BinkP.prototype.recvFrame = function(timeout) ...@@ -1107,6 +1119,22 @@ BinkP.prototype.recvFrame = function(timeout)
log(LOG_INFO, "Will encrypt session."); log(LOG_INFO, "Will encrypt session.");
} }
break; break;
case 'TLS':
if (oldctls == false) {
if (this.outgoing) {
this.sendCmd(this.command.M_NUL, "OPT TLS");
this.sock.ssl_session = 1;
}
else
this.sock.ssl_server = 1;
this.will_tls = true;
this.wont_crypt = true;
this.require_crypt = false;
}
else {
this.sendCmd(this.command.M_ERR, "TLS must be negotiated before any other traffic");
return undefined;
}
} }
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment