LAMMP 4.1.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
siphash.c
浏览该文件的文档.
1/*
2 * LAMMP - Copyright (C) 2025-2026 HJimmyK(Jericho Knox)
3 * This file is part of lammp, under the GNU LGPL v2 license.
4 * See LICENSE in the project root for the full license text.
5 */
6
7#include "../../../include/lammp/secret.h"
8
9static inline uint64_t rotl64(uint64_t x, int b) {
10 b &= 63;
11 return (x << b) | (x >> (64 - b));
12}
13
15#define SIPROUND \
16 do { \
17 v0 += v1; \
18 v1 = rotl64(v1, 13); \
19 v1 ^= v0; \
20 v0 = rotl64(v0, 32); \
21 v2 += v3; \
22 v3 = rotl64(v3, 16); \
23 v3 ^= v2; \
24 v0 += v3; \
25 v3 = rotl64(v3, 21); \
26 v3 ^= v0; \
27 v2 += v1; \
28 v1 = rotl64(v1, 17); \
29 v1 ^= v2; \
30 v2 = rotl64(v2, 32); \
31 } while (0)
32
33 uint64_t k0;
34 uint64_t k1;
35 if (key == NULL) {
36 k0 = 0;
37 k1 = 0;
38 } else {
39 k0 = key[0];
40 k1 = key[1];
41 }
42
43 uint64_t v0 = 0x736f6d6570736575ULL ^ k0;
44 uint64_t v1 = 0x646f72616e646f6dULL ^ k1;
45 uint64_t v2 = 0x6c7967656e657261ULL ^ k0;
46 uint64_t v3 = 0x7465646279746573ULL ^ k1;
47
48 const uint64_t* data = (const uint64_t*)in;
49 const uint64_t* end = data + inlen;
50
51 const uint64_t* limit = data + (inlen & ~3ULL);
52
53 while (data < limit) {
54 uint64_t m0 = data[0];
55 uint64_t m1 = data[1];
56 uint64_t m2 = data[2];
57 uint64_t m3 = data[3];
58 data += 4;
59
60 v3 ^= m0;
63 v0 ^= m0;
64
65 v3 ^= m1;
68 v0 ^= m1;
69
70 v3 ^= m2;
73 v0 ^= m2;
74
75 v3 ^= m3;
78 v0 ^= m3;
79 }
80
81 while (data < end) {
82 uint64_t m = *data++;
83 v3 ^= m;
86 v0 ^= m;
87 }
88
89 uint64_t b = ((uint64_t)(inlen * LIMB_BYTES)) << 56;
90 v3 ^= b;
93 v0 ^= b;
94
95 v2 ^= 0xff;
100
101 return v0 ^ v1 ^ v2 ^ v3;
102}
uint64_t mp_size_t
Definition lmmp.h:212
const mp_limb_t * mp_srcptr
Definition lmmp.h:216
#define LIMB_BYTES
Definition mparam.h:85
#define v0
#define v1
#define v2
const uint64_t srckey128_t[2]
Definition secret.h:112
uint64_t lmmp_siphash24_(mp_srcptr in, mp_size_t inlen, srckey128_t key)
SipHash-2-4 函数(非标准处理任意字节流的 SipHash-2-4)
Definition siphash.c:14
static uint64_t rotl64(uint64_t x, int b)
Definition siphash.c:9
#define SIPROUND