diff options
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; +} |