Lines Matching +full:no +full:- +full:unaligned +full:- +full:direct +full:- +full:access
1 /*-
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31 * SipHash is a family of PRFs SipHash-c-d where the integer parameters c and d
34 * function is called SipRound. Given a 128-bit key k and a (possibly empty)
35 * byte string m, SipHash-c-d returns a 64-bit value SipHash-c-d(k; m).
37 * Implemented from the paper "SipHash: a fast short-input PRF", 2012.09.18,
38 * by Jean-Philippe Aumasson and Daniel J. Bernstein,
58 ctx->v[0] = 0x736f6d6570736575ull;
59 ctx->v[1] = 0x646f72616e646f6dull;
60 ctx->v[2] = 0x6c7967656e657261ull;
61 ctx->v[3] = 0x7465646279746573ull;
62 ctx->buf.b64 = 0;
63 ctx->bytes = 0;
64 ctx->buflen = 0;
65 ctx->rounds_compr = rc;
66 ctx->rounds_final = rf;
67 ctx->initialized = 1;
75 KASSERT(ctx->v[0] == 0x736f6d6570736575ull &&
76 ctx->initialized == 1,
82 ctx->v[0] ^= k[0];
83 ctx->v[1] ^= k[1];
84 ctx->v[2] ^= k[0];
85 ctx->v[3] ^= k[1];
87 ctx->initialized = 2;
95 /* handle hashing 0 length buffer - needed for test vectors */
101 ctx->buf.b8[7] = (uint8_t)ctx->bytes;
105 x = MIN(len, sizeof(ctx->buf.b64) - ctx->buflen);
106 bcopy(*src, &ctx->buf.b8[ctx->buflen], x);
107 ctx->buflen += x;
111 if (ctx->buflen == 8 || final) {
112 ctx->v[3] ^= le64toh(ctx->buf.b64);
114 ctx->v[0] ^= le64toh(ctx->buf.b64);
115 ctx->buf.b64 = 0;
116 ctx->buflen = 0;
129 KASSERT(ctx->initialized == 2,
133 ctx->bytes += len;
140 if (ctx->buflen > 0 || len < 8)
141 len -= SipBuf(ctx, &s, len, 0);
148 /* Optimze for 64bit aligned/unaligned access. */
150 for (p = (const uint64_t *)s; len > 0; len--, p++) {
152 ctx->v[3] ^= m;
154 ctx->v[0] ^= m;
158 for (; len > 0; len--, s += 8) {
160 ctx->v[3] ^= m;
162 ctx->v[0] ^= m;
176 KASSERT(ctx->initialized == 2,
188 KASSERT(ctx->initialized == 2,
192 ctx->v[2] ^= 0xff;
194 r = (ctx->v[0] ^ ctx->v[1]) ^ (ctx->v[2] ^ ctx->v[3]);
212 #define SIP_ROTL(x, b) (uint64_t)(((x) << (b)) | ( (x) >> (64 - (b))))
220 rounds = ctx->rounds_compr;
222 rounds = ctx->rounds_final;
224 while (rounds--) {
225 ctx->v[0] += ctx->v[1];
226 ctx->v[2] += ctx->v[3];
227 ctx->v[1] = SIP_ROTL(ctx->v[1], 13);
228 ctx->v[3] = SIP_ROTL(ctx->v[3], 16);
230 ctx->v[1] ^= ctx->v[0];
231 ctx->v[3] ^= ctx->v[2];
232 ctx->v[0] = SIP_ROTL(ctx->v[0], 32);
234 ctx->v[2] += ctx->v[1];
235 ctx->v[0] += ctx->v[3];
236 ctx->v[1] = SIP_ROTL(ctx->v[1], 17);
237 ctx->v[3] = SIP_ROTL(ctx->v[3], 21);
239 ctx->v[1] ^= ctx->v[2];
240 ctx->v[3] ^= ctx->v[0];
241 ctx->v[2] = SIP_ROTL(ctx->v[2], 32);