struct evbuffer *socks5_mkpassword_plain(const char *login, const char *password) { size_t ulen = strlen(login); size_t plen = strlen(password); size_t length = 1 /* version */ + 1 + ulen + 1 + plen; uint8_t req[length]; req[0] = socks5_password_ver; // RFC 1929 says so req[1] = ulen; memcpy(&req[2], login, ulen); req[2+ulen] = plen; memcpy(&req[3+ulen], password, plen); return mkevbuffer(req, length); }
struct evbuffer *socks5_mkmethods_plain(int do_password) { assert(do_password == 0 || do_password == 1); int len = sizeof(socks5_method_req) + do_password; socks5_method_req *req = calloc(1, len); req->ver = socks5_ver; req->num_methods = 1 + do_password; req->methods[0] = socks5_auth_none; if (do_password) req->methods[1] = socks5_auth_password; struct evbuffer *ret = mkevbuffer(req, len); free(req); return ret; }
struct evbuffer *socks5_mkcommand_plain(int socks5_cmd, const struct sockaddr_in *destaddr) { struct { socks5_req head; socks5_addr_ipv4 ip; } PACKED req; assert(destaddr->sin_family == AF_INET); req.head.ver = socks5_ver; req.head.cmd = socks5_cmd; req.head.reserved = 0; req.head.addrtype = socks5_addrtype_ipv4; req.ip.addr = destaddr->sin_addr.s_addr; req.ip.port = destaddr->sin_port; return mkevbuffer(&req, sizeof(req)); }
static struct evbuffer *socks4_mkconnect(redsocks_client *client) { const redsocks_config *config = &client->instance->config; const char *username = config->login ? config->login : ""; int len = sizeof(socks4_req) + strlen(username); socks4_req *req = calloc(1, len); req->ver = socks4_ver; req->cmd = socks4_cmd_connect; req->port = client->destaddr.sin_port; req->addr = client->destaddr.sin_addr.s_addr; strcpy(req->login, username); struct evbuffer *ret = mkevbuffer(req, len); free(req); return ret; }