aboutsummaryrefslogtreecommitdiff
path: root/src/lib.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lib.c78
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;
+}