socks5-addr-extract
Version:
Simple functions of extracting address from SOCKS5 RFC1928 request
65 lines (58 loc) • 2.06 kB
JavaScript
/**
* https://www.ietf.org/rfc/rfc1928.txt
* The SOCKS request is formed as follows:
+----+-----+-------+------+----------+----------+
|VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
+----+-----+-------+------+----------+----------+
| 1 | 1 | X'00' | 1 | Variable | 2 |
+----+-----+-------+------+----------+----------+
*
* AYTP:
* X'01' -- ipv4
* X'04' -- ipv6
* X'03' -- domain
*/
const ATYP_OFFSET = 4
const IPV4_TYP = 0x01
const DOMAIN_TYP = 0x03
const IPV6_TYP = 0x04
const IPV4_ADDR_LEN = 4;
const IPV6_ADDR_LEN = 16;
const Addr = function (address, port) {
this.address = address;
this.port = port;
}
const Extractor = function (eqFunc, getAddr) {
this.eqFunc = eqFunc;
this.getAddr = getAddr;
}
const atypFn = function (val) {
return function (buff) {
return buff[3] == val;
}
}
exports.ipv4Extractor = new Extractor(atypFn(IPV4_TYP), function (buffer) {
const ipv4String = new Array(4)
.fill(1)
.map(function (x, index) {
return buffer.readUInt8(ATYP_OFFSET + index);
})
.join(".")
return new Addr(ipv4String, buffer.readUInt16BE(ATYP_OFFSET + IPV4_ADDR_LEN))
})
exports.ipv6Extractor = new Extractor(atypFn(IPV6_TYP), function (buffer) {
const ipv6String = new Array(8)
.fill(1)
.map(function (x, index) {
const start = ATYP_OFFSET + index * 2
return buffer.toString("hex", start, start + 2)
})
.join(":")
return new Addr(ipv6String, buffer.readUInt16BE(ATYP_OFFSET + IPV6_ADDR_LEN));
})
exports.domainExtractor = new Extractor(atypFn(DOMAIN_TYP), function (buffer) {
const addrLen = buffer.readUInt8(ATYP_OFFSET)
const addrStart = ATYP_OFFSET + 1
const dstPortOffset = addrStart + addrLen
return new Addr(buffer.toString("utf8", addrStart, dstPortOffset), buffer.readUInt16BE(dstPortOffset))
})