summaryrefslogtreecommitdiff
path: root/set4/task31.c
diff options
context:
space:
mode:
authorBenedict <benedict@0xb8000.de>2016-09-23 11:36:08 +0200
committerBenedict <benedict@0xb8000.de>2017-02-21 13:00:26 +0100
commit723222e769785563babdda5f78a0ce21a276cb9f (patch)
tree660d7312f7e85206daad7de6912ce63bee5f4b36 /set4/task31.c
parent111642369ba778d5b8d18f1a9d8acf379ab45c13 (diff)
completed set 4, task 31
Diffstat (limited to 'set4/task31.c')
-rw-r--r--set4/task31.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/set4/task31.c b/set4/task31.c
new file mode 100644
index 0000000..1c613dd
--- /dev/null
+++ b/set4/task31.c
@@ -0,0 +1,88 @@
+#include "../lib/lib.h"
+#include "../lib/lib2.h"
+#include "../lib/lib3.h"
+#include "../lib/lib4.h"
+#include <time.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <arpa/inet.h>
+#include <math.h>
+
+int get_max(long *numbers, int length)
+{
+ long max;
+ int ret;
+ int i;
+
+ for(i=0;i<length;i++) {
+ if(numbers[i] > max) {
+ max = numbers[i];
+ ret = i;
+ }
+ }
+
+ return ret;
+}
+
+int main(int argc, char **argv)
+{
+ int socket_fd;
+ struct sockaddr_in serv_addr;
+ char *server_addr = "127.0.0.1";
+ char *http_request_template = "GET /?file=neu&signature=%s HTTP/1.1\r\n\r\n";
+ // sha1 is 20 bytes, in hex 40
+ char *signature = malloc(40+1);
+ char *http_request = malloc(strlen(http_request_template) + 20);
+ memset(signature, '0', 40+1);
+ signature[40] = '\0';
+ struct timespec time;
+ int i, j;
+ char c;
+ long response_times[16];
+ char *response = malloc(2000);
+
+
+ for(i=0;i<40;i++) {
+ for(j=0;j<16;j++) {
+ // connect to localhost:80
+ socket_fd = socket(AF_INET, SOCK_STREAM, 0);
+
+ if (socket_fd == -1)
+ perror("Can not create socket");
+
+ serv_addr.sin_family = AF_INET;
+ serv_addr.sin_port = htons(8080);
+ serv_addr.sin_addr.s_addr = inet_addr(server_addr);
+
+ if(connect(socket_fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
+ perror("Can not connect");
+ }
+ // send http request
+ // brute force every byte of the signature
+ c = j > 9 ? 'a' + (j-10) : '0' + j;
+ signature[i] = c;
+ sprintf(http_request, http_request_template, signature);
+ //printf("request: %s\n", http_request);
+ clock_gettime(CLOCK_MONOTONIC, &time);
+ long start_time = (time.tv_sec * 1000000 + time.tv_nsec/1000);
+
+ write(socket_fd, http_request, strlen(http_request));
+
+
+ read(socket_fd, response, 2000);
+
+ clock_gettime(CLOCK_REALTIME, &time);
+
+ long stop_time = time.tv_sec * 1000000 + time.tv_nsec/1000;
+
+ memset(response, 0, 2000);
+ response_times[j] = (stop_time) - (start_time);
+
+ close(socket_fd);
+ }
+ // ok now choose the right one (the one where the latency is max
+ int index = get_max(response_times, 16);
+ signature[i] = index > 9 ? 'a' + (index-10) : '0' + index;
+ printf("signature so far: %s\n", signature);
+ }
+}