diff options
author | EuAndreh <eu@euandre.org> | 2023-12-31 08:49:16 -0300 |
---|---|---|
committer | EuAndreh <eu@euandre.org> | 2025-06-04 20:11:50 -0300 |
commit | bf54d3bc7be151ee3de15e3cc9fabea68369008e (patch) | |
tree | 6ee57bf4e6d57f3aaba9155a3088323a446d5df8 /src/lib.c | |
parent | Add complete "Makefile" for standard packaging (diff) | |
download | siphash-bf54d3bc7be151ee3de15e3cc9fabea68369008e.tar.gz siphash-bf54d3bc7be151ee3de15e3cc9fabea68369008e.tar.xz |
- 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.
Diffstat (limited to '')
-rw-r--r-- | src/lib.c | 78 |
1 files changed, 78 insertions, 0 deletions
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 <s.h> + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#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; +} |