Tor 0.4.9.2-alpha-dev
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
siphash.c
1/* Copyright (c) 2020 tevador <tevador@gmail.com> */
2/* See LICENSE for licensing information */
3
4#include "siphash.h"
5#include "hashx_endian.h"
6#include "unreachable.h"
7
8uint64_t hashx_siphash13_ctr(uint64_t input, const siphash_state* keys) {
9 uint64_t v0 = keys->v0;
10 uint64_t v1 = keys->v1;
11 uint64_t v2 = keys->v2;
12 uint64_t v3 = keys->v3;
13
14 v3 ^= input;
15
16 SIPROUND(v0, v1, v2, v3);
17
18 v0 ^= input;
19 v2 ^= 0xff;
20
21 SIPROUND(v0, v1, v2, v3);
22 SIPROUND(v0, v1, v2, v3);
23 SIPROUND(v0, v1, v2, v3);
24
25 return (v0 ^ v1) ^ (v2 ^ v3);
26}
27
28void hashx_siphash24_ctr_state512(const siphash_state* keys, uint64_t input,
29 uint64_t state_out[8]) {
30
31 uint64_t v0 = keys->v0;
32 uint64_t v1 = keys->v1;
33 uint64_t v2 = keys->v2;
34 uint64_t v3 = keys->v3;
35
36 v1 ^= 0xee;
37 v3 ^= input;
38
39 SIPROUND(v0, v1, v2, v3);
40 SIPROUND(v0, v1, v2, v3);
41
42 v0 ^= input;
43 v2 ^= 0xee;
44
45 SIPROUND(v0, v1, v2, v3);
46 SIPROUND(v0, v1, v2, v3);
47 SIPROUND(v0, v1, v2, v3);
48 SIPROUND(v0, v1, v2, v3);
49
50 state_out[0] = v0;
51 state_out[1] = v1;
52 state_out[2] = v2;
53 state_out[3] = v3;
54
55 v1 ^= 0xdd;
56
57 SIPROUND(v0, v1, v2, v3);
58 SIPROUND(v0, v1, v2, v3);
59 SIPROUND(v0, v1, v2, v3);
60 SIPROUND(v0, v1, v2, v3);
61
62 state_out[4] = v0;
63 state_out[5] = v1;
64 state_out[6] = v2;
65 state_out[7] = v3;
66}