9 #define POLY1305_NOINLINE __declspec(noinline) 10 #elif defined(__GNUC__) 11 #define POLY1305_NOINLINE __attribute__((noinline)) 13 #define POLY1305_NOINLINE 16 #define poly1305_block_size 16 30 static unsigned long U8TO32(
const unsigned char *p)
32 return (((
unsigned long)(p[0] & 0xff)) | ((
unsigned long)(p[1] & 0xff) << 8) |
33 ((
unsigned long)(p[2] & 0xff) << 16) | ((
unsigned long)(p[3] & 0xff) << 24));
37 static void U32TO8(
unsigned char *p,
unsigned long v)
40 p[1] = (v >> 8) & 0xff;
41 p[2] = (v >> 16) & 0xff;
42 p[3] = (v >> 24) & 0xff;
50 st->
r[0] = (
U8TO32(&key[0])) & 0x3ffffff;
51 st->
r[1] = (
U8TO32(&key[3]) >> 2) & 0x3ffff03;
52 st->
r[2] = (
U8TO32(&key[6]) >> 4) & 0x3ffc0ff;
53 st->
r[3] = (
U8TO32(&key[9]) >> 6) & 0x3f03fff;
54 st->
r[4] = (
U8TO32(&key[12]) >> 8) & 0x00fffff;
75 const unsigned long hibit = (st->
final) ? 0 : (1UL << 24);
76 unsigned long r0, r1, r2, r3, r4;
77 unsigned long s1, s2, s3, s4;
78 unsigned long h0, h1, h2, h3, h4;
79 unsigned long long d0, d1, d2, d3, d4;
102 h0 += (
U8TO32(m + 0)) & 0x3ffffff;
103 h1 += (
U8TO32(m + 3) >> 2) & 0x3ffffff;
104 h2 += (
U8TO32(m + 6) >> 4) & 0x3ffffff;
105 h3 += (
U8TO32(m + 9) >> 6) & 0x3ffffff;
106 h4 += (
U8TO32(m + 12) >> 8) | hibit;
109 d0 = ((
unsigned long long)h0 * r0) + ((
unsigned long long)h1 * s4) + ((
unsigned long long)h2 * s3) +
110 ((
unsigned long long)h3 * s2) + ((
unsigned long long)h4 * s1);
111 d1 = ((
unsigned long long)h0 * r1) + ((
unsigned long long)h1 * r0) + ((
unsigned long long)h2 * s4) +
112 ((
unsigned long long)h3 * s3) + ((
unsigned long long)h4 * s2);
113 d2 = ((
unsigned long long)h0 * r2) + ((
unsigned long long)h1 * r1) + ((
unsigned long long)h2 * r0) +
114 ((
unsigned long long)h3 * s4) + ((
unsigned long long)h4 * s3);
115 d3 = ((
unsigned long long)h0 * r3) + ((
unsigned long long)h1 * r2) + ((
unsigned long long)h2 * r1) +
116 ((
unsigned long long)h3 * r0) + ((
unsigned long long)h4 * s4);
117 d4 = ((
unsigned long long)h0 * r4) + ((
unsigned long long)h1 * r3) + ((
unsigned long long)h2 * r2) +
118 ((
unsigned long long)h3 * r1) + ((
unsigned long long)h4 * r0);
121 c = (
unsigned long)(d0 >> 26);
122 h0 = (
unsigned long)d0 & 0x3ffffff;
124 c = (
unsigned long)(d1 >> 26);
125 h1 = (
unsigned long)d1 & 0x3ffffff;
127 c = (
unsigned long)(d2 >> 26);
128 h2 = (
unsigned long)d2 & 0x3ffffff;
130 c = (
unsigned long)(d3 >> 26);
131 h3 = (
unsigned long)d3 & 0x3ffffff;
133 c = (
unsigned long)(d4 >> 26);
134 h4 = (
unsigned long)d4 & 0x3ffffff;
154 unsigned long h0, h1, h2, h3, h4, c;
155 unsigned long g0, g1, g2, g3, g4;
156 unsigned long long f;
208 g4 = h4 + c - (1UL << 26);
211 mask = (g4 >> ((
sizeof(
unsigned long) * 8) - 1)) - 1;
218 h0 = (h0 & mask) | g0;
219 h1 = (h1 & mask) | g1;
220 h2 = (h2 & mask) | g2;
221 h3 = (h3 & mask) | g3;
222 h4 = (h4 & mask) | g4;
225 h0 = ((h0) | (h1 << 26)) & 0xffffffff;
226 h1 = ((h1 >> 6) | (h2 << 20)) & 0xffffffff;
227 h2 = ((h2 >> 12) | (h3 << 14)) & 0xffffffff;
228 h3 = ((h3 >> 18) | (h4 << 8)) & 0xffffffff;
231 f = (
unsigned long long)h0 + st->
pad[0];
232 h0 = (
unsigned long)f;
233 f = (
unsigned long long)h1 + st->
pad[1] + (f >> 32);
234 h1 = (
unsigned long)f;
235 f = (
unsigned long long)h2 + st->
pad[2] + (f >> 32);
236 h2 = (
unsigned long)f;
237 f = (
unsigned long long)h3 + st->
pad[3] + (f >> 32);
238 h3 = (
unsigned long)f;
#define poly1305_block_size
Definition: sw_poly1305-donna-32.h:16
unsigned long r[5]
Definition: sw_poly1305-donna-32.h:21
unsigned long pad[4]
Definition: sw_poly1305-donna-32.h:23
static unsigned long U8TO32(const unsigned char *p)
Definition: sw_poly1305-donna-32.h:30
static void U32TO8(unsigned char *p, unsigned long v)
Definition: sw_poly1305-donna-32.h:37
unsigned char final
Definition: sw_poly1305-donna-32.h:26
unsigned char buffer[poly1305_block_size]
Definition: sw_poly1305-donna-32.h:25
POLY1305_NOINLINE void poly1305_finish(poly1305_context *ctx, unsigned char mac[16])
Definition: sw_poly1305-donna-32.h:151
void poly1305_init(poly1305_context *ctx, const unsigned char key[32])
Definition: sw_poly1305-donna-32.h:45
Definition: sw_poly1305-donna.h:10
static void poly1305_blocks(poly1305_state_internal_t *st, const unsigned char *m, size_t bytes)
Definition: sw_poly1305-donna-32.h:73
size_t leftover
Definition: sw_poly1305-donna-32.h:24
#define POLY1305_NOINLINE
Definition: sw_poly1305-donna-32.h:13
Definition: sw_poly1305-donna-32.h:19
unsigned long h[5]
Definition: sw_poly1305-donna-32.h:22