xref: /dflybsd-src/sys/crypto/siphash/siphash.h (revision 025d8334fb47165aa3d4743834a65c45cdacd947)
1010ff285SAaron LI /*-
2010ff285SAaron LI  * Copyright (c) 2013 Andre Oppermann <andre@FreeBSD.org>
3010ff285SAaron LI  * All rights reserved.
4010ff285SAaron LI  *
5010ff285SAaron LI  * Redistribution and use in source and binary forms, with or without
6010ff285SAaron LI  * modification, are permitted provided that the following conditions
7010ff285SAaron LI  * are met:
8010ff285SAaron LI  * 1. Redistributions of source code must retain the above copyright
9010ff285SAaron LI  *    notice, this list of conditions and the following disclaimer.
10010ff285SAaron LI  * 2. Redistributions in binary form must reproduce the above copyright
11010ff285SAaron LI  *    notice, this list of conditions and the following disclaimer in the
12010ff285SAaron LI  *    documentation and/or other materials provided with the distribution.
13010ff285SAaron LI  * 3. The name of the author may not be used to endorse or promote
14010ff285SAaron LI  *    products derived from this software without specific prior written
15010ff285SAaron LI  *    permission.
16010ff285SAaron LI  *
17010ff285SAaron LI  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18010ff285SAaron LI  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19010ff285SAaron LI  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20010ff285SAaron LI  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21010ff285SAaron LI  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22010ff285SAaron LI  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23010ff285SAaron LI  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24010ff285SAaron LI  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25010ff285SAaron LI  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26010ff285SAaron LI  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27010ff285SAaron LI  * SUCH DAMAGE.
28010ff285SAaron LI  */
29010ff285SAaron LI 
30010ff285SAaron LI /*
31010ff285SAaron LI  * SipHash is a family of pseudorandom functions (a.k.a. keyed hash functions)
32010ff285SAaron LI  * optimized for speed on short messages returning a 64bit hash/digest value.
33010ff285SAaron LI  *
34010ff285SAaron LI  * The number of rounds is defined during the initialization:
35010ff285SAaron LI  *  SipHash24_Init() for the fast and resonable strong version
36010ff285SAaron LI  *  SipHash48_Init() for the strong version (half as fast)
37010ff285SAaron LI  *
38*025d8334SAaron LI  * SIPHASH_CTX ctx;
39010ff285SAaron LI  * SipHash24_Init(&ctx);
40010ff285SAaron LI  * SipHash_SetKey(&ctx, "16bytes long key");
41010ff285SAaron LI  * SipHash_Update(&ctx, pointer_to_string, length_of_string);
42010ff285SAaron LI  * SipHash_Final(output, &ctx);
43010ff285SAaron LI  */
44010ff285SAaron LI 
45010ff285SAaron LI #ifndef _SIPHASH_H_
46010ff285SAaron LI #define _SIPHASH_H_
47010ff285SAaron LI 
48010ff285SAaron LI #define SIPHASH_BLOCK_LENGTH	 8
49010ff285SAaron LI #define SIPHASH_KEY_LENGTH	16
50010ff285SAaron LI #define SIPHASH_DIGEST_LENGTH	 8
51010ff285SAaron LI 
52010ff285SAaron LI typedef struct _SIPHASH_CTX {
53010ff285SAaron LI 	uint64_t	v[4];
54010ff285SAaron LI 	union {
55010ff285SAaron LI 		uint64_t	b64;
56010ff285SAaron LI 		uint8_t		b8[8];
57010ff285SAaron LI 	} buf;
58010ff285SAaron LI 	uint64_t	bytes;
59010ff285SAaron LI 	uint8_t		buflen;
60010ff285SAaron LI 	uint8_t		rounds_compr;
61010ff285SAaron LI 	uint8_t		rounds_final;
62010ff285SAaron LI 	uint8_t		initialized;
63010ff285SAaron LI } SIPHASH_CTX;
64010ff285SAaron LI 
65010ff285SAaron LI 
66010ff285SAaron LI #define SipHash24_Init(x)	SipHash_InitX((x), 2, 4)
67010ff285SAaron LI #define SipHash48_Init(x)	SipHash_InitX((x), 4, 8)
68010ff285SAaron LI void SipHash_InitX(SIPHASH_CTX *, int, int);
69*025d8334SAaron LI 
70010ff285SAaron LI void SipHash_SetKey(SIPHASH_CTX *,
71010ff285SAaron LI     const uint8_t[__min_size(SIPHASH_KEY_LENGTH)]);
72010ff285SAaron LI void SipHash_Update(SIPHASH_CTX *, const void *, size_t);
73010ff285SAaron LI void SipHash_Final(uint8_t[__min_size(SIPHASH_DIGEST_LENGTH)], SIPHASH_CTX *);
74010ff285SAaron LI uint64_t SipHash_End(SIPHASH_CTX *);
75010ff285SAaron LI 
76010ff285SAaron LI #define SipHash24(x, y, z, i)	SipHashX((x), 2, 4, (y), (z), (i));
77010ff285SAaron LI #define SipHash48(x, y, z, i)	SipHashX((x), 4, 8, (y), (z), (i));
78010ff285SAaron LI uint64_t SipHashX(SIPHASH_CTX *, int, int,
79010ff285SAaron LI     const uint8_t[__min_size(SIPHASH_KEY_LENGTH)], const void *, size_t);
80010ff285SAaron LI 
81010ff285SAaron LI int SipHash24_TestVectors(void);
82010ff285SAaron LI 
83010ff285SAaron LI #endif /* _SIPHASH_H_ */
84