2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-31 22:45:39 +00:00

Add OpenSSL based isc_siphash24() implementation

This commits adds an OpenSSL based isc_siphash24() implementation, which is
preferred when available.

The siphash_test has been modified to test both implementation with a trick that
renames the isc_siphash24() to openssl_ or native_ prefixed name and includes
the ../siphash.c two times (when the OpenSSL implementation is available).
This commit is contained in:
Ondřej Surý
2019-08-29 13:59:52 +02:00
parent 9b6c6f57d8
commit 30b716d220

View File

@@ -17,6 +17,57 @@
#include <isc/util.h>
#include <isc/siphash.h>
#if HAVE_OPENSSL_SIPHASH
#include <openssl/evp.h>
void
isc_siphash24(const uint8_t *k,
const uint8_t *in, const size_t inlen,
uint8_t *out)
{
REQUIRE(k != NULL);
REQUIRE(out != NULL);
size_t outlen = 8;
EVP_PKEY_CTX *pctx = NULL;
EVP_MD_CTX *mctx = EVP_MD_CTX_new();
EVP_PKEY *key = EVP_PKEY_new_raw_private_key(EVP_PKEY_SIPHASH, NULL,
k, 16);
RUNTIME_CHECK(mctx != NULL);
RUNTIME_CHECK(key != NULL);
RUNTIME_CHECK(EVP_DigestSignInit(mctx, &pctx, NULL, NULL, key) == 1);
RUNTIME_CHECK(EVP_PKEY_CTX_ctrl(pctx, EVP_PKEY_SIPHASH,
EVP_PKEY_OP_SIGNCTX,
EVP_PKEY_CTRL_SET_DIGEST_SIZE, outlen,
NULL) == 1);
RUNTIME_CHECK(EVP_DigestSignUpdate(mctx, in, inlen) == 1);
RUNTIME_CHECK(EVP_DigestSignFinal(mctx, out, &outlen) == 1);
ENSURE(outlen == 8);
EVP_PKEY_free(key);
EVP_MD_CTX_free(mctx);
}
#else /* HAVE_OPENSSL_SIPHASH */
/*
* The fallback implementation is based on SipHash reference C implementation by
*
* 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/>.
*/
#define cROUNDS 2
#define dROUNDS 4
/*
* The implementation is based on SipHash reference C implementation by
*
@@ -147,3 +198,4 @@ isc_siphash24(const uint8_t *k,
U64TO8_LE(out, b);
}
#endif /* HAVE_OPENSSL_SIPHASH */