diff --git a/Makefile b/Makefile index ddd89115b46c05395470f2725f58684fc1dfad2d..6179612ab06aaabcd414546c6858aa7ed24a204c 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,7 @@ $(eval $(call find_lib,libknot,2.1)) $(eval $(call find_lib,lmdb)) $(eval $(call find_lib,libzscanner,2.1)) $(eval $(call find_lib,libuv,1.0)) -$(eval $(call find_lib,libcrypto)) +$(eval $(call find_lib,nettle)) $(eval $(call find_alt,lua,luajit)) $(eval $(call find_lib,cmocka)) $(eval $(call find_bin,doxygen)) @@ -62,10 +62,10 @@ ifneq (,$(findstring luajit, $(lua_LIBS))) endif endif -BUILD_CFLAGS += $(libknot_CFLAGS) $(libuv_CFLAGS) $(libcrypto_CFLAGS) $(cmocka_CFLAGS) $(lua_CFLAGS) $(libdnssec_CFLAGS) $(libsystemd_CFLAGS) +BUILD_CFLAGS += $(libknot_CFLAGS) $(libuv_CFLAGS) $(nettle_CFLAGS) $(cmocka_CFLAGS) $(lua_CFLAGS) $(libdnssec_CFLAGS) $(libsystemd_CFLAGS) BUILD_CFLAGS += $(addprefix -I,$(wildcard contrib/ccan/*) contrib/murmurhash3) -ifeq ($(HAS_libcrypto),yes) +ifeq ($(HAS_nettle),yes) BUILD_CFLAGS += -DENABLE_COOKIES endif @@ -95,7 +95,7 @@ info: $(info [$(HAS_lua)] luajit (daemon)) $(info [$(HAS_libuv)] libuv (daemon)) $(info [$(HAS_gnutls)] libgnutls (daemon)) - $(info [$(HAS_libcrypto)] crypto (DNS cookies)) + $(info [$(HAS_nettle)] nettle (DNS cookies)) $(info ) $(info Optional) $(info --------) diff --git a/lib/cookies/alg_sha.c b/lib/cookies/alg_sha.c index c58073b76da74ba302fe309d357a1a2024df9e21..de4c01cbcb4cd40b067294faef219b07e791fa8c 100644 --- a/lib/cookies/alg_sha.c +++ b/lib/cookies/alg_sha.c @@ -14,12 +14,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include <arpa/inet.h> /* htonl(), ... */ #include <assert.h> +#include <nettle/hmac.h> #include <stdint.h> #include <stdlib.h> -#include <openssl/hmac.h> -#include <openssl/sha.h> #include <libknot/errcode.h> #include <libknot/rrtype/opt-cookie.h> @@ -38,7 +36,7 @@ static int cc_gen_hmac_sha256_64(const struct knot_cc_input *input, uint8_t *cc_out, uint16_t *cc_len) { - if (!input || !cc_out || !cc_len) { + if (!input || !cc_out || !cc_len || *cc_len < KNOT_OPT_COOKIE_CLNT) { return KNOT_EINVAL; } @@ -50,31 +48,14 @@ static int cc_gen_hmac_sha256_64(const struct knot_cc_input *input, const uint8_t *addr = NULL; int addr_len = 0; /* Address length. */ - uint8_t digest[SHA256_DIGEST_LENGTH]; - unsigned int digest_len = SHA256_DIGEST_LENGTH; - - /* text: (client IP | server IP) - * key: client secret */ - - HMAC_CTX ctx; - HMAC_CTX_init(&ctx); - - int ret = HMAC_Init_ex(&ctx, input->secret_data, input->secret_len, - EVP_sha256(), NULL); - if (ret != 1) { - ret = KNOT_EINVAL; - goto fail; - } + struct hmac_sha256_ctx ctx; + hmac_sha256_set_key(&ctx, input->secret_len, input->secret_data); if (input->clnt_sockaddr) { addr = (uint8_t *)kr_inaddr(input->clnt_sockaddr); addr_len = kr_inaddr_len(input->clnt_sockaddr); if (addr && addr_len > 0) { - ret = HMAC_Update(&ctx, addr, addr_len); - if (ret != 1) { - ret = KNOT_EINVAL; - goto fail; - } + hmac_sha256_update(&ctx, addr_len, addr); } } @@ -82,37 +63,22 @@ static int cc_gen_hmac_sha256_64(const struct knot_cc_input *input, addr = (uint8_t *)kr_inaddr(input->srvr_sockaddr); addr_len = kr_inaddr_len(input->srvr_sockaddr); if (addr && addr_len > 0) { - ret = HMAC_Update(&ctx, addr, addr_len); - if (ret != 1) { - ret = KNOT_EINVAL; - goto fail; - } + hmac_sha256_update(&ctx, addr_len, addr); } } - if (1 != HMAC_Final(&ctx, digest, &digest_len)) { - ret = KNOT_EINVAL; - goto fail; - } - - assert(KNOT_OPT_COOKIE_CLNT <= SHA256_DIGEST_LENGTH); - if (*cc_len < KNOT_OPT_COOKIE_CLNT) { - return KNOT_ESPACE; - } + assert(KNOT_OPT_COOKIE_CLNT <= SHA256_DIGEST_SIZE); *cc_len = KNOT_OPT_COOKIE_CLNT; - memcpy(cc_out, digest, *cc_len); - ret = KNOT_EOK; + hmac_sha256_digest(&ctx, *cc_len, cc_out); -fail: - HMAC_CTX_cleanup(&ctx); - return ret; + return KNOT_EOK; } #define SRVR_HMAC_SHA256_64_HASH_SIZE 8 /** - * @brief Compute server cookie using HMAC-SHA256-64). + * @brief Compute server cookie hash using HMAC-SHA256-64). * @note Server cookie = nonce | time | HMAC-SHA256-64( server secret, client cookie | nonce| time | client IP ) * @param input data to compute cookie from * @param hash_out hash cookie output buffer @@ -133,63 +99,32 @@ static int sc_gen_hmac_sha256_64(const struct knot_sc_input *input, } const uint8_t *addr = NULL; - size_t addr_len = 0; /* Address length. */ - - uint8_t digest[SHA256_DIGEST_LENGTH]; - unsigned int digest_len = SHA256_DIGEST_LENGTH; - - HMAC_CTX ctx; - HMAC_CTX_init(&ctx); + int addr_len = 0; /* Address length. */ - int ret = HMAC_Init_ex(&ctx, input->srvr_data->secret_data, - input->srvr_data->secret_len, - EVP_sha256(), NULL); - if (ret != 1) { - ret = KNOT_EINVAL; - goto fail; - } + struct hmac_sha256_ctx ctx; + hmac_sha256_set_key(&ctx, input->srvr_data->secret_len, + input->srvr_data->secret_data); - ret = HMAC_Update(&ctx, input->cc, input->cc_len); - if (ret != 1) { - ret = KNOT_EINVAL; - goto fail; - } + hmac_sha256_update(&ctx, input->cc_len, input->cc); if (input->nonce && input->nonce_len) { - ret = HMAC_Update(&ctx, (void *)input->nonce, input->nonce_len); - if (ret != 1) { - ret = KNOT_EINVAL; - goto fail; - } + hmac_sha256_update(&ctx, input->nonce_len, input->nonce); } if (input->srvr_data->clnt_sockaddr) { addr = (uint8_t *)kr_inaddr(input->srvr_data->clnt_sockaddr); addr_len = kr_inaddr_len(input->srvr_data->clnt_sockaddr); if (addr && addr_len > 0) { - ret = HMAC_Update(&ctx, addr, addr_len); - if (ret != 1) { - ret = KNOT_EINVAL; - goto fail; - } + hmac_sha256_update(&ctx, addr_len, addr); } } - if (1 != HMAC_Final(&ctx, digest, &digest_len)) { - ret = KNOT_EINVAL; - goto fail; - } - - assert(SRVR_HMAC_SHA256_64_HASH_SIZE <= SHA256_DIGEST_LENGTH); + assert(SRVR_HMAC_SHA256_64_HASH_SIZE < SHA256_DIGEST_SIZE); *hash_len = SRVR_HMAC_SHA256_64_HASH_SIZE; - memcpy(hash_out, digest, *hash_len); - - ret = KNOT_EOK; + hmac_sha256_digest(&ctx, *hash_len, hash_out); -fail: - HMAC_CTX_cleanup(&ctx); - return ret; + return KNOT_EOK; } const struct knot_cc_alg knot_cc_alg_hmac_sha256_64 = { KNOT_OPT_COOKIE_CLNT, cc_gen_hmac_sha256_64 }; diff --git a/lib/lib.mk b/lib/lib.mk index 4eccea64c80672c4f1176e9234fe58eb6793e10d..691164e4616a3771fe7ddfdf08da2ea7286d86c0 100644 --- a/lib/lib.mk +++ b/lib/lib.mk @@ -44,7 +44,7 @@ libkres_CFLAGS := -fvisibility=hidden -fPIC $(lmdb_CFLAGS) libkres_LIBS := $(contrib_TARGET) $(libknot_LIBS) $(libdnssec_LIBS) $(lmdb_LIBS) libkres_TARGET := -L$(abspath lib) -lkres -ifeq ($(HAS_libcrypto),yes) +ifeq ($(HAS_nettle),yes) libkres_SOURCES += \ lib/layer/cookiemonster.c \ lib/cookies/alg_containers.c \ @@ -62,7 +62,7 @@ libkres_HEADERS += \ lib/cookies/helper.h \ lib/cookies/nonce.h -libkres_LIBS += $(libcrypto_LIBS) +libkres_LIBS += $(nettle_LIBS) endif # Make library diff --git a/modules/modules.mk b/modules/modules.mk index a269c8a6edc6c5b77feb10e2fa7a2e76a7a07a78..1d3304fd866ce56e352e3e4727816c4830cbf47a 100644 --- a/modules/modules.mk +++ b/modules/modules.mk @@ -3,7 +3,7 @@ modules_TARGETS := hints \ stats # DNS cookies -ifeq ($(HAS_libcrypto),yes) +ifeq ($(HAS_nettle),yes) modules_TARGETS += cookiectl endif