From 81aac5259f47923a50aad574e72a3cdaab37c589 Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Mon, 11 Feb 2019 09:53:00 +0100 Subject: [PATCH] Generate a pub file --- src/donar-proxy.c | 2 +- src/tor_ctl.c | 19 +++++----- src/tor_os.c | 95 ++++++++++++++++++++++++++++++++++------------- src/tor_os.h | 16 +++++--- 4 files changed, 91 insertions(+), 41 deletions(-) diff --git a/src/donar-proxy.c b/src/donar-proxy.c index 7ff25cb..b5a5e14 100644 --- a/src/donar-proxy.c +++ b/src/donar-proxy.c @@ -16,7 +16,7 @@ int main(int argc, char** argv) { int sock; struct tor_os_str tos; - tor_os_create (&tos, "onion_services.txt", 10); + tor_os_create (&tos, "onion_services.pub", "onion_services.txt", 10); tor_os_read (&tos); int ports[10] = { 7500, 7501, 7502, 7503, 7504, 7505, 7506, 7507, 7508, 7509}; diff --git a/src/tor_ctl.c b/src/tor_ctl.c index d0fdda6..75c3546 100644 --- a/src/tor_ctl.c +++ b/src/tor_ctl.c @@ -32,19 +32,20 @@ int tor_ctl_connect(struct tor_ctl* ctx, char* addr, char* service) { int tor_ctl_add_onion(struct tor_ctl* ctx, struct tor_os_str* tos, int* port) { int err = 0; - char buffer[1024] = {0}; + char buffer1[1024] = {0}; + char buffer2[1024] = {0}; int to_create = tos->size - tos->filled; /* Add onion services loaded from file */ for (int i = 0; i < tos->filled; i++) { - fprintf(ctx->wsock, "add_onion %s Port=%d\n", tos->list[i], port[i]); + fprintf(ctx->wsock, "add_onion %s Port=%d\n", tos->keys[i].priv, port[i]); fscanf(ctx->rsock, "%d", &err); if (err != 250) { printf("err: %d\n", err); return -1; } - fscanf(ctx->rsock, "-ServiceID=%s", buffer); - printf("Added onion service %s from file\n", buffer); + fscanf(ctx->rsock, "-ServiceID=%s", buffer1); + printf("Added onion service %s.onion from file\n", buffer1); fscanf(ctx->rsock, "250 OK"); } @@ -55,13 +56,13 @@ int tor_ctl_add_onion(struct tor_ctl* ctx, struct tor_os_str* tos, int* port) { fscanf(ctx->rsock, "%d", &err); if (err != 250) return -2; - err = fscanf(ctx->rsock, "-ServiceID=%s\n", buffer); + err = fscanf(ctx->rsock, "-ServiceID=%s\n", buffer1); if (err <= 0) return -3; - printf("Created onion service %s\n", buffer); - err = fscanf(ctx->rsock, "250-PrivateKey=%s\n", buffer); + printf("Created onion service %s.onion\n", buffer1); + err = fscanf(ctx->rsock, "250-PrivateKey=%s\n", buffer2); if (err <= 0) return -4; - printf("Onion service private key: %s\n", buffer); - if (tor_os_append(tos, buffer) != 0) return -5; + //printf("Onion service private key: %s\n", buffer); + if (tor_os_append(tos, buffer1, buffer2) != 0) return -5; err = fscanf(ctx->rsock, "250 OK"); if (err < 0) return -6; } diff --git a/src/tor_os.c b/src/tor_os.c index effcef6..a782f10 100644 --- a/src/tor_os.c +++ b/src/tor_os.c @@ -1,15 +1,21 @@ #include "tor_os.h" -void tor_os_create(struct tor_os_str* os, char* file, size_t size) { +void tor_os_create(struct tor_os_str* os, char* pub_file, char* priv_file, size_t size) { os->size = size; os->filled = 0; - os->file = malloc(sizeof(char) * (strlen(file) + 1)); - if (os->file == NULL) goto mem_error; - strcpy(os->file, file); + if (priv_file != NULL) { + os->priv_file = malloc(sizeof(char) * (strlen(priv_file) + 1)); + if (os->priv_file == NULL) goto mem_error; + strcpy(os->priv_file, priv_file); + } - os->list = malloc(size * sizeof(char*)); - if (os->list == NULL) goto mem_error; + os->pub_file = malloc(sizeof(char) * (strlen(pub_file) + 1)); + if (os->pub_file == NULL) goto mem_error; + strcpy(os->pub_file, pub_file); + + os->keys = malloc(size * sizeof(struct keypair)); + if (os->keys == NULL) goto mem_error; return; mem_error: @@ -17,33 +23,47 @@ mem_error: exit(EXIT_FAILURE); } -char** tor_os_append_cursor(struct tor_os_str* os) { +struct keypair* tor_os_append_cursor(struct tor_os_str* os) { if (os->filled == os->size) { return NULL; } - char** cur = os->list + os->filled; + struct keypair* cur = os->keys + os->filled; os->filled++; - *cur = NULL; + cur->priv = NULL; + cur->pub = NULL; return cur; } void tor_os_read (struct tor_os_str* os) { FILE* fd = NULL; - fd = fopen(os->file, "r"); + + if (os->priv_file != NULL) { + fd = fopen(os->priv_file, "r"); + } else { + fd = fopen(os->pub_file, "r"); + } + if (fd == NULL) { return; } size_t len = 0; size_t str_len = 0; int n = 0; + char* last_key = NULL; while (1) { - char** dst = tor_os_append_cursor(os); + struct keypair* dst = tor_os_append_cursor(os); if (dst == NULL) break; - if (getline(dst,&len,fd) == -1) break; - str_len = strlen(*dst); + if (os->priv_file != NULL) { + if (fscanf(fd, "%ms %ms", &(dst->pub), &(dst->priv)) == -1) break; + last_key = dst->priv; + } else { + if (fscanf(fd, "%ms", &(dst->pub)) == -1) break; + last_key = dst->pub; + } + str_len = strlen(last_key); if (str_len < 1) break; - if ((*dst)[str_len - 1] == '\n') { - (*dst)[str_len - 1] = '\0'; + if (last_key[str_len - 1] == '\n') { + last_key[str_len - 1] = '\0'; } } fclose(fd); @@ -51,32 +71,55 @@ void tor_os_read (struct tor_os_str* os) { void tor_os_free(struct tor_os_str* os) { for (int i = 0; i < os->filled; i++) { - free(os->list[i]); + free(os->keys[i].pub); + if (os->priv_file != NULL) free(os->keys[i].priv); } - free(os->list); - free(os->file); + free(os->keys); + if (os->priv_file != NULL) free(os->priv_file); + free(os->pub_file); } void tor_os_persist(struct tor_os_str* os) { FILE* fd = NULL; - fd = fopen(os->file, "w"); + + fd = fopen(os->pub_file, "w"); if (fd == NULL) { - fprintf(stderr, "unable to open file for writing\n"); + fprintf(stderr, "unable to open pub file %s for writing\n", os->pub_file); exit(EXIT_FAILURE); } for (int i = 0; i < os->filled; i++) { - fprintf(fd, "%s\n", os->list[i]); + fprintf(fd, "%s\n", os->keys[i].pub); + } + + fclose(fd); + + if (os->priv_file == NULL) return; + fd = fopen(os->priv_file, "w"); + if (fd == NULL) { + fprintf(stderr, "unable to open priv file %s for writing\n", os->priv_file); + exit(EXIT_FAILURE); + } + + for (int i = 0; i < os->filled; i++) { + fprintf(fd, "%s %s\n", os->keys[i].pub, os->keys[i].priv); } fclose(fd); } -int tor_os_append(struct tor_os_str* os, char* entry) { - char** target = tor_os_append_cursor (os); +int tor_os_append(struct tor_os_str* os, char* pub, char* priv) { + struct keypair* target = tor_os_append_cursor (os); if (target == NULL) return -1; - *target = malloc(sizeof(char) * (strlen(entry) + 1)); - if (*target == NULL) return -1; - strcpy (*target, entry); + + target->pub = malloc(sizeof(char) * (strlen(pub) + 1)); + if (target->pub == NULL) return -1; + strcpy (target->pub, pub); + + if (os->priv_file == NULL) return 0; + target->priv = malloc(sizeof(char) * (strlen(priv) + 1)); + if (target->priv == NULL) return -1; + strcpy (target->priv, priv); + return 0; } diff --git a/src/tor_os.h b/src/tor_os.h index 9400143..2b97eb0 100644 --- a/src/tor_os.h +++ b/src/tor_os.h @@ -5,16 +5,22 @@ #include #include +struct keypair { + char* priv; + char* pub; +}; + struct tor_os_str { size_t filled; size_t size; - char* file; - char** list; + char* pub_file; + char* priv_file; + struct keypair *keys; }; -void tor_os_create(struct tor_os_str* os, char* file, size_t size); -char** tor_os_append_cursor(struct tor_os_str* os); -int tor_os_append(struct tor_os_str* os, char* entry); +void tor_os_create(struct tor_os_str* os, char* pub_file, char* priv_file, size_t size); +struct keypair* tor_os_append_cursor(struct tor_os_str* os); +int tor_os_append(struct tor_os_str* os, char* pub, char* priv); void tor_os_read (struct tor_os_str* os); void tor_os_persist(struct tor_os_str* os); void tor_os_free(struct tor_os_str* os);