LAMMP 4.2.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
siphash.c
浏览该文件的文档.
1/**
2 * Copyright (C) 2026 HJimmyK(Jericho Knox)
3 *
4 * This file is part of LAMMP.
5 *
6 * LAMMP is free software: you can redistribute it and/or modify it under
7 * the terms of the GNU Lesser General Public License (LGPL) as published
8 * by the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed WITHOUT ANY WARRANTY.
12 *
13 * See <https://www.gnu.org/licenses/>.
14 */
15
16#include "../../../include/lammp/secret.h"
17
18static inline uint64_t rotl64(uint64_t x, int b) {
19 b &= 63;
20 return (x << b) | (x >> (64 - b));
21}
22
24#define SIPROUND \
25 do { \
26 v0 += v1; \
27 v1 = rotl64(v1, 13); \
28 v1 ^= v0; \
29 v0 = rotl64(v0, 32); \
30 v2 += v3; \
31 v3 = rotl64(v3, 16); \
32 v3 ^= v2; \
33 v0 += v3; \
34 v3 = rotl64(v3, 21); \
35 v3 ^= v0; \
36 v2 += v1; \
37 v1 = rotl64(v1, 17); \
38 v1 ^= v2; \
39 v2 = rotl64(v2, 32); \
40 } while (0)
41
42 uint64_t k0;
43 uint64_t k1;
44 if (key == NULL) {
45 k0 = 0;
46 k1 = 0;
47 } else {
48 k0 = key[0];
49 k1 = key[1];
50 }
51
52 uint64_t v0 = 0x736f6d6570736575ULL ^ k0;
53 uint64_t v1 = 0x646f72616e646f6dULL ^ k1;
54 uint64_t v2 = 0x6c7967656e657261ULL ^ k0;
55 uint64_t v3 = 0x7465646279746573ULL ^ k1;
56
57 const uint64_t* data = (const uint64_t*)in;
58 const uint64_t* end = data + inlen;
59
60 const uint64_t* limit = data + (inlen & ~3ULL);
61
62 while (data < limit) {
63 uint64_t m0 = data[0];
64 uint64_t m1 = data[1];
65 uint64_t m2 = data[2];
66 uint64_t m3 = data[3];
67 data += 4;
68
69 v3 ^= m0;
72 v0 ^= m0;
73
74 v3 ^= m1;
77 v0 ^= m1;
78
79 v3 ^= m2;
82 v0 ^= m2;
83
84 v3 ^= m3;
87 v0 ^= m3;
88 }
89
90 while (data < end) {
91 uint64_t m = *data++;
92 v3 ^= m;
95 v0 ^= m;
96 }
97
98 uint64_t b = ((uint64_t)(inlen * LIMB_BYTES)) << 56;
99 v3 ^= b;
100 SIPROUND;
101 SIPROUND;
102 v0 ^= b;
103
104 v2 ^= 0xff;
105 SIPROUND;
106 SIPROUND;
107 SIPROUND;
108 SIPROUND;
109
110 return v0 ^ v1 ^ v2 ^ v3;
111}
uint64_t mp_size_t
Definition lmmp.h:77
const mp_limb_t * mp_srcptr
Definition lmmp.h:81
#define LIMB_BYTES
Definition mparam.h:85
#define v0
#define v1
#define v2
#define n
const uint64_t srckey128_t[2]
Definition secret.h:35
uint64_t lmmp_siphash24_(mp_srcptr in, mp_size_t inlen, srckey128_t key)
SipHash-2-4 函数(非标准处理任意字节流的 SipHash-2-4)
Definition siphash.c:23
static uint64_t rotl64(uint64_t x, int b)
Copyright (C) 2026 HJimmyK(Jericho Knox)
Definition siphash.c:18
#define SIPROUND