aboutsummaryrefslogtreecommitdiff
path: root/halfsiphash.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 /halfsiphash.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 '')
-rw-r--r--halfsiphash.c166
1 files changed, 0 insertions, 166 deletions
diff --git a/halfsiphash.c b/halfsiphash.c
deleted file mode 100644
index 455c27c..0000000
--- a/halfsiphash.c
+++ /dev/null
@@ -1,166 +0,0 @@
-
-/*
- SipHash reference C implementation
-
- Copyright (c) 2016 Jean-Philippe Aumasson <jeanphilippe.aumasson@gmail.com>
-
- To the extent possible under law, the author(s) have dedicated all copyright
- and related and neighboring rights to this software to the public domain
- worldwide. This software is distributed without any warranty.
-
- You should have received a copy of the CC0 Public Domain Dedication along
- with
- this software. If not, see
- <http://creativecommons.org/publicdomain/zero/1.0/>.
- */
-#include "halfsiphash.h"
-#include <assert.h>
-#include <stddef.h>
-#include <stdint.h>
-
-/* default: SipHash-2-4 */
-#ifndef cROUNDS
-#define cROUNDS 2
-#endif
-#ifndef dROUNDS
-#define dROUNDS 4
-#endif
-
-#define ROTL(x, b) (uint32_t)(((x) << (b)) | ((x) >> (32 - (b))))
-
-#define U32TO8_LE(p, v) \
- (p)[0] = (uint8_t)((v)); \
- (p)[1] = (uint8_t)((v) >> 8); \
- (p)[2] = (uint8_t)((v) >> 16); \
- (p)[3] = (uint8_t)((v) >> 24);
-
-#define U8TO32_LE(p) \
- (((uint32_t)((p)[0])) | ((uint32_t)((p)[1]) << 8) | \
- ((uint32_t)((p)[2]) << 16) | ((uint32_t)((p)[3]) << 24))
-
-#define SIPROUND \
- do { \
- v0 += v1; \
- v1 = ROTL(v1, 5); \
- v1 ^= v0; \
- v0 = ROTL(v0, 16); \
- v2 += v3; \
- v3 = ROTL(v3, 8); \
- v3 ^= v2; \
- v0 += v3; \
- v3 = ROTL(v3, 7); \
- v3 ^= v0; \
- v2 += v1; \
- v1 = ROTL(v1, 13); \
- v1 ^= v2; \
- v2 = ROTL(v2, 16); \
- } while (0)
-
-
-#ifdef DEBUG_SIPHASH
-#include <stdio.h>
-
-#define TRACE \
- do { \
- printf("(%3zu) v0 %08" PRIx32 "\n", inlen, v0); \
- printf("(%3zu) v1 %08" PRIx32 "\n", inlen, v1); \
- printf("(%3zu) v2 %08" PRIx32 "\n", inlen, v2); \
- printf("(%3zu) v3 %08" PRIx32 "\n", inlen, v3); \
- } while (0)
-#else
-#define TRACE
-#endif
-
-/*
- Computes a SipHash value
- *in: pointer to input data (read-only)
- inlen: input data length in bytes (any size_t value)
- *k: pointer to the key data (read-only), must be 8 bytes
- *out: pointer to output data (write-only), outlen bytes must be allocated
- outlen: length of the output in bytes, must be 4 or 8
-*/
-int halfsiphash(const void *in, const size_t inlen, const void *k, uint8_t *out,
- const size_t outlen) {
-
- const unsigned char *ni = (const unsigned char *)in;
- const unsigned char *kk = (const unsigned char *)k;
-
- assert((outlen == 4) || (outlen == 8));
- uint32_t v0 = 0;
- uint32_t v1 = 0;
- uint32_t v2 = UINT32_C(0x6c796765);
- uint32_t v3 = UINT32_C(0x74656462);
- uint32_t k0 = U8TO32_LE(kk);
- uint32_t k1 = U8TO32_LE(kk + 4);
- uint32_t m;
- int i;
- const unsigned char *end = ni + inlen - (inlen % sizeof(uint32_t));
- const int left = inlen & 3;
- uint32_t b = ((uint32_t)inlen) << 24;
- v3 ^= k1;
- v2 ^= k0;
- v1 ^= k1;
- v0 ^= k0;
-
- if (outlen == 8)
- v1 ^= 0xee;
-
- for (; ni != end; ni += 4) {
- m = U8TO32_LE(ni);
- v3 ^= m;
-
- TRACE;
- for (i = 0; i < cROUNDS; ++i)
- SIPROUND;
-
- v0 ^= m;
- }
-
- switch (left) {
- case 3:
- b |= ((uint32_t)ni[2]) << 16;
- /* FALLTHRU */
- case 2:
- b |= ((uint32_t)ni[1]) << 8;
- /* FALLTHRU */
- case 1:
- b |= ((uint32_t)ni[0]);
- break;
- case 0:
- break;
- }
-
- v3 ^= b;
-
- TRACE;
- for (i = 0; i < cROUNDS; ++i)
- SIPROUND;
-
- v0 ^= b;
-
- if (outlen == 8)
- v2 ^= 0xee;
- else
- v2 ^= 0xff;
-
- TRACE;
- for (i = 0; i < dROUNDS; ++i)
- SIPROUND;
-
- b = v1 ^ v3;
- U32TO8_LE(out, b);
-
- if (outlen == 4)
- return 0;
-
- v1 ^= 0xdd;
-
- TRACE;
- for (i = 0; i < dROUNDS; ++i)
- SIPROUND;
-
- b = v1 ^ v3;
- U32TO8_LE(out + 4, b);
-
- return 0;
-}