#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; }