17 st->r[0] = (
ReadLE32(&key[0])) & 0x3ffffff;
18 st->r[1] = (
ReadLE32(&key[3]) >> 2) & 0x3ffff03;
19 st->r[2] = (
ReadLE32(&key[6]) >> 4) & 0x3ffc0ff;
20 st->r[3] = (
ReadLE32(&key[9]) >> 6) & 0x3f03fff;
21 st->r[4] = (
ReadLE32(&key[12]) >> 8) & 0x00fffff;
41 size_t bytes)
noexcept {
42 const uint32_t hibit = (st->final) ? 0 : (1UL << 24);
43 uint32_t r0, r1, r2, r3, r4;
44 uint32_t s1, s2, s3, s4;
45 uint32_t h0, h1, h2, h3, h4;
46 uint64_t d0, d1, d2, d3, d4;
69 h1 += (
ReadLE32(m + 3) >> 2) & 0x3ffffff;
70 h2 += (
ReadLE32(m + 6) >> 4) & 0x3ffffff;
71 h3 += (
ReadLE32(m + 9) >> 6) & 0x3ffffff;
72 h4 += (
ReadLE32(m + 12) >> 8) | hibit;
75 d0 = ((uint64_t)h0 * r0) + ((uint64_t)h1 * s4) + ((uint64_t)h2 * s3) +
76 ((uint64_t)h3 * s2) + ((uint64_t)h4 * s1);
77 d1 = ((uint64_t)h0 * r1) + ((uint64_t)h1 * r0) + ((uint64_t)h2 * s4) +
78 ((uint64_t)h3 * s3) + ((uint64_t)h4 * s2);
79 d2 = ((uint64_t)h0 * r2) + ((uint64_t)h1 * r1) + ((uint64_t)h2 * r0) +
80 ((uint64_t)h3 * s4) + ((uint64_t)h4 * s3);
81 d3 = ((uint64_t)h0 * r3) + ((uint64_t)h1 * r2) + ((uint64_t)h2 * r1) +
82 ((uint64_t)h3 * r0) + ((uint64_t)h4 * s4);
83 d4 = ((uint64_t)h0 * r4) + ((uint64_t)h1 * r3) + ((uint64_t)h2 * r2) +
84 ((uint64_t)h3 * r1) + ((uint64_t)h4 * r0);
87 c = (uint32_t)(d0 >> 26);
88 h0 = (uint32_t)d0 & 0x3ffffff;
90 c = (uint32_t)(d1 >> 26);
91 h1 = (uint32_t)d1 & 0x3ffffff;
93 c = (uint32_t)(d2 >> 26);
94 h2 = (uint32_t)d2 & 0x3ffffff;
96 c = (uint32_t)(d3 >> 26);
97 h3 = (uint32_t)d3 & 0x3ffffff;
99 c = (uint32_t)(d4 >> 26);
100 h4 = (uint32_t)d4 & 0x3ffffff;
118 uint32_t h0, h1, h2, h3, h4, c;
119 uint32_t g0, g1, g2, g3, g4;
125 size_t i = st->leftover;
170 g4 = h4 + c - (1UL << 26);
173 mask = (g4 >> ((
sizeof(uint32_t) * 8) - 1)) - 1;
180 h0 = (h0 & mask) | g0;
181 h1 = (h1 & mask) | g1;
182 h2 = (h2 & mask) | g2;
183 h3 = (h3 & mask) | g3;
184 h4 = (h4 & mask) | g4;
187 h0 = ((h0) | (h1 << 26)) & 0xffffffff;
188 h1 = ((h1 >> 6) | (h2 << 20)) & 0xffffffff;
189 h2 = ((h2 >> 12) | (h3 << 14)) & 0xffffffff;
190 h3 = ((h3 >> 18) | (h4 << 8)) & 0xffffffff;
193 f = (uint64_t)h0 + st->pad[0];
195 f = (uint64_t)h1 + st->pad[1] + (f >> 32);
197 f = (uint64_t)h2 + st->pad[2] + (f >> 32);
199 f = (uint64_t)h3 + st->pad[3] + (f >> 32);
225 size_t bytes)
noexcept {
234 for (i = 0; i < want; i++) {
235 st->buffer[st->leftover + i] = m[i];
239 st->leftover += want;
257 for (i = 0; i < bytes; i++) {
258 st->buffer[st->leftover + i] = m[i];
260 st->leftover += bytes;
static void WriteLE32(uint8_t *ptr, uint32_t x)
static uint32_t ReadLE32(const uint8_t *ptr)
void poly1305_init(poly1305_context *st, const uint8_t key[32]) noexcept
void poly1305_finish(poly1305_context *st, uint8_t mac[16]) noexcept
static void poly1305_blocks(poly1305_context *st, const uint8_t *m, size_t bytes) noexcept
void poly1305_update(poly1305_context *st, const uint8_t *m, size_t bytes) noexcept
#define POLY1305_BLOCK_SIZE