requesting descriptor keys from TOR authority server fails

Viewed 26

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);
}```
0 Answers
Related