File: siphash.c

package info (click to toggle)
siphashc 1.2-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye, buster, sid
  • size: 108 kB
  • sloc: ansic: 209; python: 91; makefile: 2
file content (79 lines) | stat: -rw-r--r-- 1,898 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include "siphash.h"
#include "siphash_impl.h"


INLINE static uint64_t
U8TO64_LE(const unsigned char *p) {
    return *(const uint64_t *)p;
}

uint64_t
siphash(const unsigned char key[16], const unsigned char *m, size_t len) {
    uint64_t v0, v1, v2, v3;
    uint64_t mi, k0, k1;
    uint64_t last7;
    size_t i, blocks;

    k0 = U8TO64_LE(key + 0);
    k1 = U8TO64_LE(key + 8);
    v0 = k0 ^ 0x736f6d6570736575ull;
    v1 = k1 ^ 0x646f72616e646f6dull;
    v2 = k0 ^ 0x6c7967656e657261ull;
    v3 = k1 ^ 0x7465646279746573ull;

    last7 = (uint64_t)(len & 0xff) << 56;

#define sipcompress() \
    v0 += v1; v2 += v3; \
    v1 = ROTL64(v1,13); v3 = ROTL64(v3,16); \
    v1 ^= v0; v3 ^= v2; \
    v0 = ROTL64(v0,32); \
    v2 += v1; v0 += v3; \
    v1 = ROTL64(v1,17); v3 = ROTL64(v3,21); \
    v1 ^= v2; v3 ^= v0; \
    v2 = ROTL64(v2,32);

    for (i = 0, blocks = (len & ~7); i < blocks; i += 8) {
        mi = U8TO64_LE(m + i);
        v3 ^= mi;
        sipcompress()
        sipcompress()
        v0 ^= mi;
    }

    switch (len - blocks) {
        case 7:
            last7 |= (uint64_t)m[i + 6] << 48;
            FALLTHROUGH;
        case 6:
            last7 |= (uint64_t)m[i + 5] << 40;
            FALLTHROUGH;
        case 5:
            last7 |= (uint64_t)m[i + 4] << 32;
            FALLTHROUGH;
        case 4:
            last7 |= (uint64_t)m[i + 3] << 24;
            FALLTHROUGH;
        case 3:
            last7 |= (uint64_t)m[i + 2] << 16;
            FALLTHROUGH;
        case 2:
            last7 |= (uint64_t)m[i + 1] <<  8;
            FALLTHROUGH;
        case 1:
            last7 |= (uint64_t)m[i + 0]      ;
            FALLTHROUGH;
        case 0:
        default:;
    };
    v3 ^= last7;
    sipcompress()
    sipcompress()
    v0 ^= last7;
    v2 ^= 0xff;
    sipcompress()
    sipcompress()
    sipcompress()
    sipcompress()
    return v0 ^ v1 ^ v2 ^ v3;
}