UNPKG

socks5-addr-extract

Version:

Simple functions of extracting address from SOCKS5 RFC1928 request

65 lines (58 loc) 2.06 kB
/** * 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)) })