From bf54d3bc7be151ee3de15e3cc9fabea68369008e Mon Sep 17 00:00:00 2001 From: EuAndreh Date: Sun, 31 Dec 2023 08:49:16 -0300 Subject: Rewrite code, but keeping the exact same semantic and behaviour - assert that the generated `siphash.o` code is identical to the original code, available at `tests/assert-identical.sh`; - remove unneeded `#define`s; - rewrite code with the correct indentation, spacing and formatting; - use C99 constructs over C89 (for loop variable declarations inside the parentheses); - fix the public API. --- src/lib.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 src/lib.c (limited to 'src/lib.c') diff --git a/src/lib.c b/src/lib.c new file mode 100644 index 0000000..935ee26 --- /dev/null +++ b/src/lib.c @@ -0,0 +1,78 @@ +#include + +#include +#include +#include + +#include "impl.h" + +#include "lib.h" + + + +static int +usage(FILE *restrict stream, const char *const argv0) { + return fprintf(stream, "Usage: %s KEY DATA\n", argv0) < 0; +} + +void +siphash( + const u8 key[SIPHASH_KEY_LENGTH], + const size_t inlen, + const void *const restrict in, + u8 out[SIPHASH_OUTPUT_LENGTH] +) { + siphash_impl(in, inlen, key, out, SIPHASH_OUTPUT_LENGTH); +} + +int +siphash_main(int argc, char *argv[]) { + int rc = EXIT_USAGE; + + if (argc != 3) { + if (usage(stderr, argv[0])) { + rc = EXIT_FAILURE; + perror("usage()"); + goto out; + } + goto out; + } + + const char *const key = argv[1]; + const char *const data = argv[2]; + const size_t keylen = strlen(key); + const size_t datalen = strlen(data); + if (keylen < SIPHASH_KEY_LENGTH) { + if (fprintf( + stderr, + "KEY (%lu) is smaller than SIPHASH_KEY_LENGTH (%d).\n", + keylen, + SIPHASH_KEY_LENGTH + ) < 0) { + rc = EXIT_FAILURE; + perror("fprintf()"); + goto out; + } + goto out; + } + + u8 out[SIPHASH_OUTPUT_LENGTH]; + siphash((u8 *)key, datalen, data, out); + for (int i = 0; i < SIPHASH_OUTPUT_LENGTH; i++) { + const u8 c = out[i]; + if (printf("%x", c) < 0) { + rc = EXIT_FAILURE; + perror("printf()"); + goto out; + } + } + if (printf("\n") < 0) { + rc = EXIT_FAILURE; + perror("printf()"); + goto out; + } + + rc = EXIT_SUCCESS; +out: + return rc; +} -- cgit v1.2.3