]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Add reference SipHash 2-4 implementation
authorOndřej Surý <ondrej@sury.org>
Wed, 9 Jan 2019 13:34:36 +0000 (14:34 +0100)
committerOndřej Surý <ondrej@sury.org>
Mon, 20 May 2019 17:01:31 +0000 (19:01 +0200)
lib/isc/Makefile.in
lib/isc/include/isc/Makefile.in
lib/isc/include/isc/siphash.h [new file with mode: 0644]
lib/isc/siphash.c [new file with mode: 0644]
lib/isc/win32/libisc.def.in
lib/isc/win32/libisc.vcxproj.filters.in
lib/isc/win32/libisc.vcxproj.in
util/copyrights

index ed87279e7f321e3f87f60aec218d0673046dfd7c..971503c448c71a67d6a34dbf1b6fe5b831cb9d39 100644 (file)
@@ -53,7 +53,7 @@ OBJS =                pk11.@O@ pk11_result.@O@ \
                parseint.@O@ portset.@O@ quota.@O@ radix.@O@ random.@O@ \
                ratelimiter.@O@ region.@O@ regex.@O@ result.@O@ \
                rwlock.@O@ \
-               serial.@O@ sockaddr.@O@ stats.@O@ \
+               serial.@O@ siphash.@O@ sockaddr.@O@ stats.@O@ \
                string.@O@ symtab.@O@ task.@O@ taskpool.@O@ \
                tm.@O@ timer.@O@ version.@O@ \
                ${UNIXOBJS} ${THREADOBJS}
@@ -70,7 +70,7 @@ SRCS =                pk11.c pk11_result.c \
                netaddr.c netscope.c nonce.c openssl_shim.c pool.c \
                parseint.c portset.c quota.c radix.c random.c \
                ratelimiter.c region.c regex.c result.c rwlock.c \
-               serial.c sockaddr.c stats.c string.c \
+               serial.c siphash.c sockaddr.c stats.c string.c \
                symtab.c task.c taskpool.c timer.c \
                tm.c version.c
 
index 646179792df3de7727694b9e8557dfde7acbeb07..2e1cb4ab22b8c43eb45bc7e8a285c9df906c9f3a 100644 (file)
@@ -31,7 +31,7 @@ HEADERS =     aes.h app.h assertions.h atomic.h backtrace.h \
                pool.h portset.h print.h queue.h quota.h \
                radix.h random.h ratelimiter.h refcount.h regex.h \
                region.h resource.h result.h resultclass.h rwlock.h \
-               safe.h serial.h sockaddr.h socket.h \
+               safe.h serial.h siphash.h sockaddr.h socket.h \
                stats.h stdio.h strerr.h string.h symtab.h \
                task.h taskpool.h timer.h tm.h types.h util.h version.h \
                xml.h
diff --git a/lib/isc/include/isc/siphash.h b/lib/isc/include/isc/siphash.h
new file mode 100644 (file)
index 0000000..472e8f2
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * See the COPYRIGHT file distributed with this work for additional
+ * information regarding copyright ownership.
+ */
+
+
+/*! \file isc/siphash.h */
+
+#pragma once
+
+#include <isc/lang.h>
+#include <isc/platform.h>
+#include <isc/types.h>
+
+#define ISC_SIPHASH24_KEY_LENGTH 128 / 8
+#define ISC_SIPHASH24_TAG_LENGTH 64 / 8
+
+ISC_LANG_BEGINDECLS
+
+void
+isc_siphash24(const uint8_t *key,
+             const uint8_t *in, size_t inlen,
+             uint8_t *out);
+
+ISC_LANG_ENDDECLS
diff --git a/lib/isc/siphash.c b/lib/isc/siphash.c
new file mode 100644 (file)
index 0000000..c9f7393
--- /dev/null
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * See the COPYRIGHT file distributed with this work for additional
+ * information regarding copyright ownership.
+ */
+
+/*
+   siphash() function is SipHash reference C implementation
+
+   Copyright (c) 2012-2016 Jean-Philippe Aumasson <jeanphilippe.aumasson@gmail.com>
+   Copyright (c) 2012-2014 Daniel J. Bernstein <djb@cr.yp.to>
+
+   To the extent possible under law, the author(s) have dedicated all copyright
+   and related and neighboring rights to this software to the public domain
+   worldwide. This software is distributed without any warranty.
+
+   You should have received a copy of the CC0 Public Domain Dedication along
+   with this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
+ */
+
+/*! \file isc/siphash.c */
+
+#include <config.h>
+
+#include <inttypes.h>
+#include <unistd.h>
+#include <string.h>
+
+#include <openssl/opensslv.h>
+
+#include <isc/endian.h>
+#include <isc/util.h>
+#include <isc/siphash.h>
+
+#define ROTATE(x, b) (uint64_t)( ((x) << (b)) | ( (x) >> (64 - (b))) )
+
+#define HALF_ROUND(a, b, c, d, s, t)            \
+       a += b; c += d;                          \
+       b = ROTATE(b, s) ^ a;                    \
+       d = ROTATE(d, t) ^ c;                    \
+       a = ROTATE(a, 32);
+
+#define FULL_ROUND(v0, v1, v2, v3)                           \
+       HALF_ROUND(v0, v1, v2, v3, 13, 16);                   \
+       HALF_ROUND(v2, v1, v0, v3, 17, 21);
+
+#define DOUBLE_ROUND(v0, v1, v2, v3)           \
+       FULL_ROUND(v0, v1, v2, v3)                      \
+       FULL_ROUND(v0, v1, v2, v3)
+
+#define SIPROUND FULL_ROUND
+
+void
+isc_siphash24(const uint8_t *k, const uint8_t *in, size_t inlen, uint8_t *out)
+{
+       const uint64_t *key = (const uint64_t *)k;
+       uint64_t k0 = le64toh(key[0]);
+       uint64_t k1 = le64toh(key[1]);
+
+       uint64_t v0 = 0x736f6d6570736575ULL ^ k0;
+       uint64_t v1 = 0x646f72616e646f6dULL ^ k1;
+       uint64_t v2 = 0x6c7967656e657261ULL ^ k0;
+       uint64_t v3 = 0x7465646279746573ULL ^ k1;
+
+       size_t left = inlen;
+
+       uint64_t b = ((uint64_t)inlen) << 56;
+
+       const uint64_t *inbuf = (const uint64_t *)in;
+       while (left >= 8) {
+               uint64_t m = le64toh(*inbuf);
+
+               v3 ^= m;
+
+               SIPROUND(v0, v1, v2, v3);
+               SIPROUND(v0, v1, v2, v3);
+
+               v0 ^= m;
+
+               inbuf++; left -= 8;
+       }
+
+       const uint8_t *end = in + (inlen - left);
+
+       switch (left) {
+       case 7:
+               b |= ((uint64_t)end[6]) << 48;
+               /* FALLTHROUGH */
+       case 6:
+               b |= ((uint64_t)end[5]) << 40;
+               /* FALLTHROUGH */
+       case 5:
+               b |= ((uint64_t)end[4]) << 32;
+               /* FALLTHROUGH */
+       case 4:
+               b |= ((uint64_t)end[3]) << 24;
+               /* FALLTHROUGH */
+       case 3:
+               b |= ((uint64_t)end[2]) << 16;
+               /* FALLTHROUGH */
+       case 2:
+               b |= ((uint64_t)end[1]) << 8;
+               /* FALLTHROUGH */
+       case 1:
+               b |= ((uint64_t)end[0]);
+               /* FALLTHROUGH */
+       case 0:
+               break;
+       default:
+               INSIST(0);
+               ISC_UNREACHABLE();
+       }
+
+       v3 ^= b;
+
+       SIPROUND(v0, v1, v2, v3);
+       SIPROUND(v0, v1, v2, v3);
+
+       v0 ^= b;
+
+       v2 ^= 0xff;
+
+       SIPROUND(v0, v1, v2, v3);
+       SIPROUND(v0, v1, v2, v3);
+       SIPROUND(v0, v1, v2, v3);
+       SIPROUND(v0, v1, v2, v3);
+
+       b = v0 ^ v1 ^ v2 ^ v3;
+
+       uint64_t *outbuf = (uint64_t *)out;
+       *outbuf = htole64(b);
+}
index d00d32dd645de3e53aa753b7b2f24fad30d1c3b7..195a24c94cc0ebb87efdc193f91ec716852b9063 100644 (file)
@@ -499,6 +499,7 @@ isc_serial_gt
 isc_serial_le
 isc_serial_lt
 isc_serial_ne
+isc_siphash24
 isc_sockaddr_any
 isc_sockaddr_any6
 isc_sockaddr_anyofpf
index b58ff4f1a17a3dda20eb12326d9f8ff239ac1c70..c030e90c0bbcabfe018da64eeec91cc2f47e3238 100644 (file)
     <ClInclude Include="..\include\isc\serial.h">
       <Filter>Library Header Files</Filter>
     </ClInclude>
+    <ClInclude Include="..\include\isc\siphash.h">
+      <Filter>Library Header Files</Filter>
+    </ClInclude>
     <ClInclude Include="..\include\isc\sockaddr.h">
       <Filter>Library Header Files</Filter>
     </ClInclude>
     <ClCompile Include="..\serial.c">
       <Filter>Library Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="..\siphash.c">
+      <Filter>Library Source Files</Filter>
+    </ClCompile>
     <ClCompile Include="..\sockaddr.c">
       <Filter>Library Source Files</Filter>
     </ClCompile>
index 6d6820e7f79031a21f772aa3fd374d591cc06aa3..b6dd68d65c697343ea9b30e3709d8678ad10361c 100644 (file)
@@ -357,6 +357,7 @@ copy InstallFiles ..\Build\Release\
     <ClInclude Include="..\include\isc\rwlock.h" />
     <ClInclude Include="..\include\isc\safe.h" />
     <ClInclude Include="..\include\isc\serial.h" />
+    <ClInclude Include="..\include\isc\siphash.h" />
     <ClInclude Include="..\include\isc\sockaddr.h" />
     <ClInclude Include="..\include\isc\socket.h" />
     <ClInclude Include="..\include\isc\stats.h" />
@@ -459,6 +460,7 @@ copy InstallFiles ..\Build\Release\
     <ClCompile Include="..\result.c" />
     <ClCompile Include="..\rwlock.c" />
     <ClCompile Include="..\serial.c" />
+    <ClCompile Include="..\siphash.c" />
     <ClCompile Include="..\sockaddr.c" />
     <ClCompile Include="..\stats.c" />
     <ClCompile Include="..\string.c" />
index bfebfcfde014c26907fd6ba1e06893ecca70a0f8..cb50c675954e7efa23daa684007d0ac96c8d7155 100644 (file)
 ./lib/isc/include/isc/counter.h                        C       2014,2016,2018,2019
 ./lib/isc/include/isc/crc64.h                  C       2013,2016,2018,2019
 ./lib/isc/include/isc/deprecated.h             C       2017,2018,2019
+./lib/isc/include/isc/endian.h                 C       2019
 ./lib/isc/include/isc/errno.h                  C       2016,2018,2019
 ./lib/isc/include/isc/error.h                  C       1998,1999,2000,2001,2004,2005,2006,2007,2009,2016,2017,2018,2019
 ./lib/isc/include/isc/event.h                  C       1998,1999,2000,2001,2002,2004,2005,2006,2007,2014,2016,2017,2018,2019
 ./lib/isc/include/isc/rwlock.h                 C       1998,1999,2000,2001,2003,2004,2005,2006,2007,2016,2017,2018,2019
 ./lib/isc/include/isc/safe.h                   C       2013,2015,2016,2017,2018,2019
 ./lib/isc/include/isc/serial.h                 C       1999,2000,2001,2004,2005,2006,2007,2009,2016,2018,2019
+./lib/isc/include/isc/siphash.h                        C       2019
 ./lib/isc/include/isc/sockaddr.h               C       1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2009,2012,2015,2016,2018,2019
 ./lib/isc/include/isc/socket.h                 C       1998,1999,2000,2001,2002,2004,2005,2006,2007,2008,2009,2011,2012,2013,2014,2016,2018,2019
 ./lib/isc/include/isc/stats.h                  C       2009,2012,2016,2018,2019
 ./lib/isc/result.c                             C       1998,1999,2000,2001,2003,2004,2005,2007,2008,2012,2014,2015,2016,2017,2018,2019
 ./lib/isc/rwlock.c                             C       1998,1999,2000,2001,2003,2004,2005,2007,2009,2011,2012,2015,2016,2017,2018,2019
 ./lib/isc/serial.c                             C       1999,2000,2001,2004,2005,2007,2016,2018,2019
+./lib/isc/siphash.c                            C       2019
 ./lib/isc/sockaddr.c                           C       1999,2000,2001,2002,2003,2004,2005,2006,2007,2010,2011,2012,2014,2015,2016,2017,2018,2019
 ./lib/isc/stats.c                              C       2009,2012,2013,2014,2015,2016,2017,2018,2019
 ./lib/isc/string.c                             C       1999,2000,2001,2003,2004,2005,2006,2007,2011,2012,2014,2015,2016,2018,2019