diff options
author | Willy Tarreau <w@1wt.eu> | 2021-08-11 13:54:52 +0200 |
---|---|---|
committer | Willy Tarreau <w@1wt.eu> | 2021-08-11 14:07:45 +0200 |
commit | 6807c7f6e14f79657a713e6a86513b8573ed5854 (patch) | |
tree | 4241e9365edc607da9579489122fd0bb991ff768 /admin | |
parent | 13f2e2ceebf7b97baf5e035f821470ec7a360980 (diff) | |
download | haproxy-6807c7f6e14f79657a713e6a86513b8573ed5854.tar.gz |
ADMIN: dyncookie: implement a simple dynamic cookie calculator
This utility can be useful to figure what cookie value a server will
have based on the secret, its IP and its port.
Diffstat (limited to 'admin')
-rw-r--r-- | admin/dyncookie/dyncookie.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/admin/dyncookie/dyncookie.c b/admin/dyncookie/dyncookie.c new file mode 100644 index 000000000..0c778eb7a --- /dev/null +++ b/admin/dyncookie/dyncookie.c @@ -0,0 +1,55 @@ +/* + * Dynamic server cookie calculator + * + * Copyright 2021 Willy Tarreau <w@1wt.eu> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + * + */ + +#include <stdio.h> +#include <stdlib.h> +#include <stdarg.h> +#include <arpa/inet.h> +#include <import/xxhash.h> + +__attribute__((noreturn)) void die(int code, const char *format, ...) +{ + va_list args; + + va_start(args, format); + vfprintf(stderr, format, args); + va_end(args); + exit(code); +} + +int main(int argc, char **argv) +{ + size_t key_len; + int addr_len; + char *buf; + int port; + + if (argc < 4) + die(1, "Usage: %s <key> <ip> <port>\n", argv[0]); + + key_len = strlen(argv[1]); + buf = realloc(strdup(argv[1]), key_len + 16 + 4); + if (!buf) + die(2, "Not enough memory\n"); + + if (inet_pton(AF_INET, argv[2], buf + key_len) > 0) + addr_len = 4; + else if (inet_pton(AF_INET6, argv[2], buf + key_len) > 0) + addr_len = 16; + else + die(3, "Cannot parse address <%s> as IPv4/IPv6\n", argv[2]); + + port = htonl(atoi(argv[3])); + memcpy(buf + key_len + addr_len, &port, 4); + printf("%016llx\n", (long long)XXH64(buf, key_len + addr_len + 4, 0)); + return 0; +} |