xref: /dflybsd-src/sys/crypto/siphash/siphash.h (revision 03517d4e1314f46a8bc390aa6bcb929361ee0569)
1  /*-
2   * Copyright (c) 2013 Andre Oppermann <andre@FreeBSD.org>
3   * All rights reserved.
4   *
5   * Redistribution and use in source and binary forms, with or without
6   * modification, are permitted provided that the following conditions
7   * are met:
8   * 1. Redistributions of source code must retain the above copyright
9   *    notice, this list of conditions and the following disclaimer.
10   * 2. Redistributions in binary form must reproduce the above copyright
11   *    notice, this list of conditions and the following disclaimer in the
12   *    documentation and/or other materials provided with the distribution.
13   * 3. The name of the author may not be used to endorse or promote
14   *    products derived from this software without specific prior written
15   *    permission.
16   *
17   * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20   * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27   * SUCH DAMAGE.
28   */
29  
30  /*
31   * SipHash is a family of pseudorandom functions (a.k.a. keyed hash functions)
32   * optimized for speed on short messages returning a 64bit hash/digest value.
33   *
34   * The number of rounds is defined during the initialization:
35   *  SipHash24_Init() for the fast and resonable strong version
36   *  SipHash48_Init() for the strong version (half as fast)
37   *
38   * SIPHASH_CTX ctx;
39   * SipHash24_Init(&ctx);
40   * SipHash_SetKey(&ctx, "16bytes long key");
41   * SipHash_Update(&ctx, pointer_to_string, length_of_string);
42   * SipHash_Final(output, &ctx);
43   */
44  
45  #ifndef _SIPHASH_H_
46  #define _SIPHASH_H_
47  
48  #define SIPHASH_BLOCK_LENGTH	 8
49  #define SIPHASH_KEY_LENGTH	16
50  #define SIPHASH_DIGEST_LENGTH	 8
51  
52  typedef struct _SIPHASH_CTX {
53  	uint64_t	v[4];
54  	union {
55  		uint64_t	b64;
56  		uint8_t		b8[8];
57  	} buf;
58  	uint64_t	bytes;
59  	uint8_t		buflen;
60  	uint8_t		rounds_compr;
61  	uint8_t		rounds_final;
62  	uint8_t		initialized;
63  } SIPHASH_CTX;
64  
65  
66  #define SipHash24_Init(x)	SipHash_InitX((x), 2, 4)
67  #define SipHash48_Init(x)	SipHash_InitX((x), 4, 8)
68  void SipHash_InitX(SIPHASH_CTX *, int, int);
69  
70  void SipHash_SetKey(SIPHASH_CTX *,
71      const uint8_t[__min_size(SIPHASH_KEY_LENGTH)]);
72  void SipHash_Update(SIPHASH_CTX *, const void *, size_t);
73  void SipHash_Final(uint8_t[__min_size(SIPHASH_DIGEST_LENGTH)], SIPHASH_CTX *);
74  uint64_t SipHash_End(SIPHASH_CTX *);
75  
76  #define SipHash24(x, y, z, i)	SipHashX((x), 2, 4, (y), (z), (i));
77  #define SipHash48(x, y, z, i)	SipHashX((x), 4, 8, (y), (z), (i));
78  uint64_t SipHashX(SIPHASH_CTX *, int, int,
79      const uint8_t[__min_size(SIPHASH_KEY_LENGTH)], const void *, size_t);
80  
81  int SipHash24_TestVectors(void);
82  
83  #endif /* _SIPHASH_H_ */
84