I am trying to request the descriptor keys from a TOR authority server, but the response I get is not the response ("??aX?>x??ɮS?Ҡ etc.") I expect. If I use safari or program it in python I get the right response, so I don't know what's wrong. The weird thing is that if I request the consensus, I get a normal response.
#include <stdlib.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <unistd.h>
#include <poll.h>
#include <fcntl.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <sys/time.h>
int tcp_get(char *ip, int sock,
char *path, int path_length)
{
int length, rc;
char *request;
length = 25 + strlen(ip) + path_length;
request = malloc(length);
memset(request, 0, length);
snprintf(request, length,
"GET %s HTTP/1.0\r\nHost: %s\r\n\r\n",
path, ip);
rc = send(sock, request, length, 0);
free(request);
return rc;
}
int tcp_connection(char *ip, int port)
{
int flags, rc, sock;
struct sockaddr_in address;
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock == -1) return -1;
memset(&address, 0, sizeof(address));
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr(ip);
address.sin_port = htons(port);
connect(sock, (struct sockaddr *)&address, sizeof(address));
return sock;
}
int main()
{
int identity_fingerprint_length, path_length, rc, sock;
char *path;
char buffer[4096];
char identity_fingerprint[] = "6134F5B66F27BDDBC2BF80D4F2C575D6238E5E34";
identity_fingerprint_length = 40;
path_length = 17 + identity_fingerprint_length;
path = malloc(path_length);
memcpy(path, "/tor/server/fp/", 15);
memcpy(path + 15, identity_fingerprint, identity_fingerprint_length);
memcpy(path + 15 + identity_fingerprint_length, ".z", 2);
sock = tcp_connection("131.188.40.189", 443);
tcp_get("131.188.40.189", sock, path, path_length);
memset(buffer, 0, 4096);
rc = read(sock, buffer, 4096);
printf("%s\n", buffer);
free(path);
}```