aboutsummaryrefslogtreecommitdiff
path: root/src/lib.c
diff options
context:
space:
mode:
authorEuAndreh <eu@euandre.org>2023-12-31 08:49:16 -0300
committerEuAndreh <eu@euandre.org>2025-06-04 20:11:50 -0300
commitbf54d3bc7be151ee3de15e3cc9fabea68369008e (patch)
tree6ee57bf4e6d57f3aaba9155a3088323a446d5df8 /src/lib.c
parentAdd complete "Makefile" for standard packaging (diff)
downloadsiphash-bf54d3bc7be151ee3de15e3cc9fabea68369008e.tar.gz
siphash-bf54d3bc7be151ee3de15e3cc9fabea68369008e.tar.xz
Rewrite code, but keeping the exact same semantic and behaviourHEADmain
- 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 'src/lib.c')
-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;
+}