Petr Menšík 6e9104
From ae9c9ef5a5ba06cf57b5a87b5f2bbc71649ba41b Mon Sep 17 00:00:00 2001
Petr Menšík 6e9104
From: Evan Hunt <each@isc.org>
Petr Menšík 6e9104
Date: Tue, 12 Sep 2017 19:05:46 -0700
Petr Menšík 6e9104
Subject: [PATCH] rebased rt31459c
Petr Menšík 6e9104
Petr Menšík 6e9104
[rt31459d] update the newer tools
Petr Menšík 6e9104
Petr Menšík 6e9104
[rt31459d] setup entropy in dns_lib_init()
Petr Menšík 6e9104
Petr Menšík 6e9104
[rt31459d] silence compiler warning
Petr Menšík 6e9104
Petr Menšík 6e9104
DNS_OPENSSL_LIBS -> DST_OPENSSL_LIBS
Petr Menšík 6e9104
Petr Menšík 6e9104
Include new unit test
Petr Menšík 6e9104
---
Petr Menšík 6e9104
 bin/confgen/keygen.c                     |   7 +
Petr Menšík 6e9104
 bin/dnssec/dnssec-dsfromkey.c            |   8 +-
Petr Menšík 6e9104
 bin/dnssec/dnssec-importkey.c            |   8 +-
Petr Menšík 6e9104
 bin/dnssec/dnssec-revoke.c               |   8 +-
Petr Menšík 6e9104
 bin/dnssec/dnssec-settime.c              |   8 +-
Petr Menšík 6e9104
 bin/dnssec/dnssec-signzone.c             |  11 +-
Petr Menšík 6e9104
 bin/dnssec/dnssec-verify.c               |   8 +-
Petr Menšík 6e9104
 bin/dnssec/dnssectool.c                  |  11 +-
Petr Menšík 6e9104
 bin/named/server.c                       |   6 +
Petr Menšík 6e9104
 bin/nsupdate/nsupdate.c                  |  18 ++-
Petr Menšík 6e9104
 bin/tests/makejournal.c                  |   6 +-
Petr Menšík 6e9104
 bin/tests/system/pipelined/pipequeries.c |  20 ++-
Petr Menšík 6e9104
 bin/tests/system/pipelined/tests.sh      |   4 +-
Petr Menšík 6e9104
 bin/tests/system/rsabigexponent/bigkey.c |   4 +
Petr Menšík 6e9104
 bin/tests/system/tkey/keycreate.c        |  26 +++-
Petr Menšík 6e9104
 bin/tests/system/tkey/keydelete.c        |  26 +++-
Petr Menšík 6e9104
 bin/tests/system/tkey/tests.sh           |   8 +-
Petr Menšík 6e9104
 bin/tools/mdig.c                         |   3 +-
Petr Menšík 6e9104
 configure                                | 250 ++++++++++++++++++-------------
Petr Menšík 6e9104
 configure.in                             |  77 +++++++++-
Petr Menšík 6e9104
 lib/dns/dst_api.c                        |  21 ++-
Petr Menšík 6e9104
 lib/dns/include/dst/dst.h                |   8 +
Petr Menšík 6e9104
 lib/dns/lib.c                            |  17 ++-
Petr Menšík 6e9104
 lib/dns/openssl_link.c                   |  72 ++++++++-
Petr Menšík 6e9104
 lib/dns/pkcs11.c                         |  29 +++-
Petr Menšík 6e9104
 lib/dns/tests/Atffile                    |   1 +
Petr Menšík 6e9104
 lib/dns/tests/Kyuafile                   |   1 +
Petr Menšík 6e9104
 lib/dns/tests/Makefile.in                |   7 +
Petr Menšík 6e9104
 lib/dns/tests/dnstest.c                  |  14 +-
Petr Menšík 6e9104
 lib/dns/tests/dstrandom_test.c           | 105 +++++++++++++
Petr Menšík 6e9104
 lib/dns/win32/libdns.def.in              |   7 +
Petr Menšík 6e9104
 lib/isc/entropy.c                        |  24 +++
Petr Menšík 6e9104
 lib/isc/include/isc/entropy.h            |  12 ++
Petr Menšík 6e9104
 lib/isc/include/isc/platform.h.in        |   5 +
Petr Menšík 6e9104
 lib/isc/include/isc/types.h              |   2 +
Petr Menšík 6e9104
 lib/isc/pk11.c                           |  12 +-
Petr Menšík 6e9104
 lib/isc/win32/include/isc/platform.h.in  |   5 +
Petr Menšík 6e9104
 win32utils/Configure                     |  29 +++-
Petr Menšík 6e9104
 38 files changed, 704 insertions(+), 184 deletions(-)
Petr Menšík 6e9104
 create mode 100644 lib/dns/tests/dstrandom_test.c
Petr Menšík 6e9104
Petr Menšík 6e9104
diff --git a/bin/confgen/keygen.c b/bin/confgen/keygen.c
Petr Menšík 6e9104
index 11cc54d..fa439cc 100644
Petr Menšík 6e9104
--- a/bin/confgen/keygen.c
Petr Menšík 6e9104
+++ b/bin/confgen/keygen.c
Petr Menšík 6e9104
@@ -165,6 +165,13 @@ generate_key(isc_mem_t *mctx, const char *randomfile, dns_secalg_t alg,
Petr Menšík 6e9104
 		randomfile = NULL;
Petr Menšík 6e9104
 		open_keyboard = ISC_ENTROPY_KEYBOARDYES;
Petr Menšík 6e9104
 	}
Petr Menšík 6e9104
+#ifdef ISC_PLATFORM_CRYPTORANDOM
Petr Menšík 6e9104
+	if (randomfile != NULL &&
Petr Menšík 6e9104
+	    strcmp(randomfile, ISC_PLATFORM_CRYPTORANDOM) == 0) {
Petr Menšík 6e9104
+		randomfile = NULL;
Petr Menšík 6e9104
+		isc_entropy_usehook(ectx, ISC_TRUE);
Petr Menšík 6e9104
+	}
Petr Menšík 6e9104
+#endif
Petr Menšík 6e9104
 	DO("start entropy source", isc_entropy_usebestsource(ectx,
Petr Menšík 6e9104
 							     &entropy_source,
Petr Menšík 6e9104
 							     randomfile,
Petr Menšík 6e9104
diff --git a/bin/dnssec/dnssec-dsfromkey.c b/bin/dnssec/dnssec-dsfromkey.c
Petr Menšík 6e9104
index 94a982c..897c497 100644
Petr Menšík 6e9104
--- a/bin/dnssec/dnssec-dsfromkey.c
Petr Menšík 6e9104
+++ b/bin/dnssec/dnssec-dsfromkey.c
Petr Menšík 6e9104
@@ -495,14 +495,14 @@ main(int argc, char **argv) {
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	if (ectx == NULL)
Petr Menšík 6e9104
 		setup_entropy(mctx, NULL, &ectx);
Petr Menšík 6e9104
-	result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
Petr Menšík 6e9104
-	if (result != ISC_R_SUCCESS)
Petr Menšík 6e9104
-		fatal("could not initialize hash");
Petr Menšík 6e9104
 	result = dst_lib_init(mctx, ectx,
Petr Menšík 6e9104
 			      ISC_ENTROPY_BLOCKING | ISC_ENTROPY_GOODONLY);
Petr Menšík 6e9104
 	if (result != ISC_R_SUCCESS)
Petr Menšík 6e9104
 		fatal("could not initialize dst: %s",
Petr Menšík 6e9104
 		      isc_result_totext(result));
Petr Menšík 6e9104
+	result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
Petr Menšík 6e9104
+	if (result != ISC_R_SUCCESS)
Petr Menšík 6e9104
+		fatal("could not initialize hash");
Petr Menšík 6e9104
 	isc_entropy_stopcallbacksources(ectx);
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	setup_logging(mctx, &log;;
Petr Menšík 6e9104
@@ -564,8 +564,8 @@ main(int argc, char **argv) {
Petr Menšík 6e9104
 	if (dns_rdataset_isassociated(&rdataset))
Petr Menšík 6e9104
 		dns_rdataset_disassociate(&rdataset);
Petr Menšík 6e9104
 	cleanup_logging(&log;;
Petr Menšík 6e9104
-	dst_lib_destroy();
Petr Menšík 6e9104
 	isc_hash_destroy();
Petr Menšík 6e9104
+	dst_lib_destroy();
Petr Menšík 6e9104
 	cleanup_entropy(&ectx);
Petr Menšík 6e9104
 	dns_name_destroy();
Petr Menšík 6e9104
 	if (verbose > 10)
Petr Menšík 6e9104
diff --git a/bin/dnssec/dnssec-importkey.c b/bin/dnssec/dnssec-importkey.c
Petr Menšík 6e9104
index 2edf614..840316c 100644
Petr Menšík 6e9104
--- a/bin/dnssec/dnssec-importkey.c
Petr Menšík 6e9104
+++ b/bin/dnssec/dnssec-importkey.c
Petr Menšík 6e9104
@@ -406,14 +406,14 @@ main(int argc, char **argv) {
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	if (ectx == NULL)
Petr Menšík 6e9104
 		setup_entropy(mctx, NULL, &ectx);
Petr Menšík 6e9104
-	result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
Petr Menšík 6e9104
-	if (result != ISC_R_SUCCESS)
Petr Menšík 6e9104
-		fatal("could not initialize hash");
Petr Menšík 6e9104
 	result = dst_lib_init(mctx, ectx,
Petr Menšík 6e9104
 			      ISC_ENTROPY_BLOCKING | ISC_ENTROPY_GOODONLY);
Petr Menšík 6e9104
 	if (result != ISC_R_SUCCESS)
Petr Menšík 6e9104
 		fatal("could not initialize dst: %s",
Petr Menšík 6e9104
 		      isc_result_totext(result));
Petr Menšík 6e9104
+	result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
Petr Menšík 6e9104
+	if (result != ISC_R_SUCCESS)
Petr Menšík 6e9104
+		fatal("could not initialize hash");
Petr Menšík 6e9104
 	isc_entropy_stopcallbacksources(ectx);
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	setup_logging(mctx, &log;;
Petr Menšík 6e9104
@@ -457,8 +457,8 @@ main(int argc, char **argv) {
Petr Menšík 6e9104
 	if (dns_rdataset_isassociated(&rdataset))
Petr Menšík 6e9104
 		dns_rdataset_disassociate(&rdataset);
Petr Menšík 6e9104
 	cleanup_logging(&log;;
Petr Menšík 6e9104
-	dst_lib_destroy();
Petr Menšík 6e9104
 	isc_hash_destroy();
Petr Menšík 6e9104
+	dst_lib_destroy();
Petr Menšík 6e9104
 	cleanup_entropy(&ectx);
Petr Menšík 6e9104
 	dns_name_destroy();
Petr Menšík 6e9104
 	if (verbose > 10)
Petr Menšík 6e9104
diff --git a/bin/dnssec/dnssec-revoke.c b/bin/dnssec/dnssec-revoke.c
Petr Menšík 6e9104
index 10fad0b..0b68e99 100644
Petr Menšík 6e9104
--- a/bin/dnssec/dnssec-revoke.c
Petr Menšík 6e9104
+++ b/bin/dnssec/dnssec-revoke.c
Petr Menšík 6e9104
@@ -182,14 +182,14 @@ main(int argc, char **argv) {
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	if (ectx == NULL)
Petr Menšík 6e9104
 		setup_entropy(mctx, NULL, &ectx);
Petr Menšík 6e9104
-	result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
Petr Menšík 6e9104
-	if (result != ISC_R_SUCCESS)
Petr Menšík 6e9104
-		fatal("Could not initialize hash");
Petr Menšík 6e9104
 	result = dst_lib_init2(mctx, ectx, engine,
Petr Menšík 6e9104
 			       ISC_ENTROPY_BLOCKING | ISC_ENTROPY_GOODONLY);
Petr Menšík 6e9104
 	if (result != ISC_R_SUCCESS)
Petr Menšík 6e9104
 		fatal("Could not initialize dst: %s",
Petr Menšík 6e9104
 		      isc_result_totext(result));
Petr Menšík 6e9104
+	result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
Petr Menšík 6e9104
+	if (result != ISC_R_SUCCESS)
Petr Menšík 6e9104
+		fatal("Could not initialize hash");
Petr Menšík 6e9104
 	isc_entropy_stopcallbacksources(ectx);
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	result = dst_key_fromnamedfile(filename, dir,
Petr Menšík 6e9104
@@ -271,8 +271,8 @@ main(int argc, char **argv) {
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 cleanup:
Petr Menšík 6e9104
 	dst_key_free(&key);
Petr Menšík 6e9104
-	dst_lib_destroy();
Petr Menšík 6e9104
 	isc_hash_destroy();
Petr Menšík 6e9104
+	dst_lib_destroy();
Petr Menšík 6e9104
 	cleanup_entropy(&ectx);
Petr Menšík 6e9104
 	if (verbose > 10)
Petr Menšík 6e9104
 		isc_mem_stats(mctx, stdout);
Petr Menšík 6e9104
diff --git a/bin/dnssec/dnssec-settime.c b/bin/dnssec/dnssec-settime.c
Petr Menšík 6e9104
index 360cdb9..b7bf171 100644
Petr Menšík 6e9104
--- a/bin/dnssec/dnssec-settime.c
Petr Menšík 6e9104
+++ b/bin/dnssec/dnssec-settime.c
Petr Menšík 6e9104
@@ -380,14 +380,14 @@ main(int argc, char **argv) {
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	if (ectx == NULL)
Petr Menšík 6e9104
 		setup_entropy(mctx, NULL, &ectx);
Petr Menšík 6e9104
-	result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
Petr Menšík 6e9104
-	if (result != ISC_R_SUCCESS)
Petr Menšík 6e9104
-		fatal("Could not initialize hash");
Petr Menšík 6e9104
 	result = dst_lib_init2(mctx, ectx, engine,
Petr Menšík 6e9104
 			       ISC_ENTROPY_BLOCKING | ISC_ENTROPY_GOODONLY);
Petr Menšík 6e9104
 	if (result != ISC_R_SUCCESS)
Petr Menšík 6e9104
 		fatal("Could not initialize dst: %s",
Petr Menšík 6e9104
 		      isc_result_totext(result));
Petr Menšík 6e9104
+	result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
Petr Menšík 6e9104
+	if (result != ISC_R_SUCCESS)
Petr Menšík 6e9104
+		fatal("Could not initialize hash");
Petr Menšík 6e9104
 	isc_entropy_stopcallbacksources(ectx);
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	if (predecessor != NULL) {
Petr Menšík 6e9104
@@ -672,8 +672,8 @@ main(int argc, char **argv) {
Petr Menšík 6e9104
 	if (prevkey != NULL)
Petr Menšík 6e9104
 		dst_key_free(&prevkey);
Petr Menšík 6e9104
 	dst_key_free(&key);
Petr Menšík 6e9104
-	dst_lib_destroy();
Petr Menšík 6e9104
 	isc_hash_destroy();
Petr Menšík 6e9104
+	dst_lib_destroy();
Petr Menšík 6e9104
 	cleanup_entropy(&ectx);
Petr Menšík 6e9104
 	if (verbose > 10)
Petr Menšík 6e9104
 		isc_mem_stats(mctx, stdout);
Petr Menšík 6e9104
diff --git a/bin/dnssec/dnssec-signzone.c b/bin/dnssec/dnssec-signzone.c
Petr Menšík 6e9104
index 1bea357..53be1f5 100644
Petr Menšík 6e9104
--- a/bin/dnssec/dnssec-signzone.c
Petr Menšík 6e9104
+++ b/bin/dnssec/dnssec-signzone.c
Petr Menšík 6e9104
@@ -3459,14 +3459,15 @@ main(int argc, char *argv[]) {
Petr Menšík 6e9104
 	if (!pseudorandom)
Petr Menšík 6e9104
 		eflags |= ISC_ENTROPY_GOODONLY;
Petr Menšík 6e9104
 
Petr Menšík 6e9104
-	result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
Petr Menšík 6e9104
-	if (result != ISC_R_SUCCESS)
Petr Menšík 6e9104
-		fatal("could not create hash context");
Petr Menšík 6e9104
-
Petr Menšík 6e9104
 	result = dst_lib_init2(mctx, ectx, engine, eflags);
Petr Menšík 6e9104
 	if (result != ISC_R_SUCCESS)
Petr Menšík 6e9104
 		fatal("could not initialize dst: %s",
Petr Menšík 6e9104
 		      isc_result_totext(result));
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+	result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
Petr Menšík 6e9104
+	if (result != ISC_R_SUCCESS)
Petr Menšík 6e9104
+		fatal("could not create hash context");
Petr Menšík 6e9104
+
Petr Menšík 6e9104
 	isc_stdtime_get(&now;;
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	if (startstr != NULL) {
Petr Menšík 6e9104
@@ -3878,8 +3879,8 @@ main(int argc, char *argv[]) {
Petr Menšík 6e9104
 	dns_master_styledestroy(&dsstyle, mctx);
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	cleanup_logging(&log;;
Petr Menšík 6e9104
-	dst_lib_destroy();
Petr Menšík 6e9104
 	isc_hash_destroy();
Petr Menšík 6e9104
+	dst_lib_destroy();
Petr Menšík 6e9104
 	cleanup_entropy(&ectx);
Petr Menšík 6e9104
 	dns_name_destroy();
Petr Menšík 6e9104
 	if (verbose > 10)
Petr Menšík 6e9104
diff --git a/bin/dnssec/dnssec-verify.c b/bin/dnssec/dnssec-verify.c
Petr Menšík 6e9104
index 792510a..dc32765 100644
Petr Menšík 6e9104
--- a/bin/dnssec/dnssec-verify.c
Petr Menšík 6e9104
+++ b/bin/dnssec/dnssec-verify.c
Petr Menšík 6e9104
@@ -280,15 +280,15 @@ main(int argc, char *argv[]) {
Petr Menšík 6e9104
 	if (ectx == NULL)
Petr Menšík 6e9104
 		setup_entropy(mctx, NULL, &ectx);
Petr Menšík 6e9104
 
Petr Menšík 6e9104
-	result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
Petr Menšík 6e9104
-	if (result != ISC_R_SUCCESS)
Petr Menšík 6e9104
-		fatal("could not create hash context");
Petr Menšík 6e9104
-
Petr Menšík 6e9104
 	result = dst_lib_init2(mctx, ectx, engine, ISC_ENTROPY_BLOCKING);
Petr Menšík 6e9104
 	if (result != ISC_R_SUCCESS)
Petr Menšík 6e9104
 		fatal("could not initialize dst: %s",
Petr Menšík 6e9104
 		      isc_result_totext(result));
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+	result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
Petr Menšík 6e9104
+	if (result != ISC_R_SUCCESS)
Petr Menšík 6e9104
+		fatal("could not create hash context");
Petr Menšík 6e9104
+
Petr Menšík 6e9104
 	isc_stdtime_get(&now;;
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	rdclass = strtoclass(classname);
Petr Menšík 6e9104
diff --git a/bin/dnssec/dnssectool.c b/bin/dnssec/dnssectool.c
Petr Menšík 6e9104
index dc32c90..4ea9eaf 100644
Petr Menšík 6e9104
--- a/bin/dnssec/dnssectool.c
Petr Menšík 6e9104
+++ b/bin/dnssec/dnssectool.c
Petr Menšík 6e9104
@@ -32,6 +32,7 @@
Petr Menšík 6e9104
 #include <isc/heap.h>
Petr Menšík 6e9104
 #include <isc/list.h>
Petr Menšík 6e9104
 #include <isc/mem.h>
Petr Menšík 6e9104
+#include <isc/platform.h>
Petr Menšík 6e9104
 #include <isc/print.h>
Petr Menšík 6e9104
 #include <isc/string.h>
Petr Menšík 6e9104
 #include <isc/time.h>
Petr Menšík 6e9104
@@ -233,7 +234,8 @@ setup_entropy(isc_mem_t *mctx, const char *randomfile, isc_entropy_t **ectx) {
Petr Menšík 6e9104
 	if (*ectx == NULL) {
Petr Menšík 6e9104
 		result = isc_entropy_create(mctx, ectx);
Petr Menšík 6e9104
 		if (result != ISC_R_SUCCESS)
Petr Menšík 6e9104
-			fatal("could not create entropy object");
Petr Menšík 6e9104
+			fatal("could not create entropy object: %s",
Petr Menšík 6e9104
+			      isc_result_totext(result));
Petr Menšík 6e9104
 		ISC_LIST_INIT(sources);
Petr Menšík 6e9104
 	}
Petr Menšík 6e9104
 
Petr Menšík 6e9104
@@ -242,6 +244,13 @@ setup_entropy(isc_mem_t *mctx, const char *randomfile, isc_entropy_t **ectx) {
Petr Menšík 6e9104
 		randomfile = NULL;
Petr Menšík 6e9104
 	}
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+#ifdef ISC_PLATFORM_CRYPTORANDOM
Petr Menšík 6e9104
+	if (randomfile != NULL &&
Petr Menšík 6e9104
+	    strcmp(randomfile, ISC_PLATFORM_CRYPTORANDOM) == 0) {
Petr Menšík 6e9104
+		randomfile = NULL;
Petr Menšík 6e9104
+		isc_entropy_usehook(*ectx, ISC_TRUE);
Petr Menšík 6e9104
+	}
Petr Menšík 6e9104
+#endif
Petr Menšík 6e9104
 	result = isc_entropy_usebestsource(*ectx, &source, randomfile,
Petr Menšík 6e9104
 					   usekeyboard);
Petr Menšík 6e9104
 
Petr Menšík 6e9104
diff --git a/bin/named/server.c b/bin/named/server.c
Petr Menšík 6e9104
index 59a8998..ee5186c 100644
Petr Menšík 6e9104
--- a/bin/named/server.c
Petr Menšík 6e9104
+++ b/bin/named/server.c
Petr Menšík 6e9104
@@ -34,6 +34,7 @@
Petr Menšík 6e9104
 #include <isc/lex.h>
Petr Menšík 6e9104
 #include <isc/meminfo.h>
Petr Menšík 6e9104
 #include <isc/parseint.h>
Petr Menšík 6e9104
+#include <isc/platform.h>
Petr Menšík 6e9104
 #include <isc/portset.h>
Petr Menšík 6e9104
 #include <isc/print.h>
Petr Menšík 6e9104
 #include <isc/random.h>
Petr Menšík 6e9104
@@ -8083,6 +8084,10 @@ load_configuration(const char *filename, ns_server_t *server,
Petr Menšík 6e9104
 				      "no source of entropy found");
Petr Menšík 6e9104
 		} else {
Petr Menšík 6e9104
 			const char *randomdev = cfg_obj_asstring(obj);
Petr Menšík 6e9104
+#ifdef ISC_PLATFORM_CRYPTORANDOM
Petr Menšík 6e9104
+			if (strcmp(randomdev, ISC_PLATFORM_CRYPTORANDOM) == 0)
Petr Menšík 6e9104
+				isc_entropy_usehook(ns_g_entropy, ISC_TRUE);
Petr Menšík 6e9104
+#else
Petr Menšík 6e9104
 			int level = ISC_LOG_ERROR;
Petr Menšík 6e9104
 			result = isc_entropy_createfilesource(ns_g_entropy,
Petr Menšík 6e9104
 							      randomdev);
Petr Menšík 6e9104
@@ -8117,6 +8122,7 @@ load_configuration(const char *filename, ns_server_t *server,
Petr Menšík 6e9104
 				}
Petr Menšík 6e9104
 				isc_entropy_detach(&ns_g_fallbackentropy);
Petr Menšík 6e9104
 			}
Petr Menšík 6e9104
+#endif
Petr Menšík 6e9104
 #endif
Petr Menšík 6e9104
 		}
Petr Menšík 6e9104
 	}
Petr Menšík 6e9104
diff --git a/bin/nsupdate/nsupdate.c b/bin/nsupdate/nsupdate.c
Petr Menšík 6e9104
index bb5d500..46c7acf 100644
Petr Menšík 6e9104
--- a/bin/nsupdate/nsupdate.c
Petr Menšík 6e9104
+++ b/bin/nsupdate/nsupdate.c
Petr Menšík 6e9104
@@ -33,6 +33,7 @@
Petr Menšík 6e9104
 #include <isc/mem.h>
Petr Menšík 6e9104
 #include <isc/parseint.h>
Petr Menšík 6e9104
 #include <isc/print.h>
Petr Menšík 6e9104
+#include <isc/platform.h>
Petr Menšík 6e9104
 #include <isc/random.h>
Petr Menšík 6e9104
 #include <isc/region.h>
Petr Menšík 6e9104
 #include <isc/sockaddr.h>
Petr Menšík 6e9104
@@ -269,7 +270,8 @@ setup_entropy(isc_mem_t *mctx, const char *randomfile, isc_entropy_t **ectx) {
Petr Menšík 6e9104
 	if (*ectx == NULL) {
Petr Menšík 6e9104
 		result = isc_entropy_create(mctx, ectx);
Petr Menšík 6e9104
 		if (result != ISC_R_SUCCESS)
Petr Menšík 6e9104
-			fatal("could not create entropy object");
Petr Menšík 6e9104
+			fatal("could not create entropy object: %s",
Petr Menšík 6e9104
+			      isc_result_totext(result));
Petr Menšík 6e9104
 		ISC_LIST_INIT(sources);
Petr Menšík 6e9104
 	}
Petr Menšík 6e9104
 
Petr Menšík 6e9104
@@ -278,6 +280,13 @@ setup_entropy(isc_mem_t *mctx, const char *randomfile, isc_entropy_t **ectx) {
Petr Menšík 6e9104
 		randomfile = NULL;
Petr Menšík 6e9104
 	}
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+#ifdef ISC_PLATFORM_CRYPTORANDOM
Petr Menšík 6e9104
+	if (randomfile != NULL &&
Petr Menšík 6e9104
+	    strcmp(randomfile, ISC_PLATFORM_CRYPTORANDOM) == 0) {
Petr Menšík 6e9104
+		randomfile = NULL;
Petr Menšík 6e9104
+		isc_entropy_usehook(*ectx, ISC_TRUE);
Petr Menšík 6e9104
+	}
Petr Menšík 6e9104
+#endif
Petr Menšík 6e9104
 	result = isc_entropy_usebestsource(*ectx, &source, randomfile,
Petr Menšík 6e9104
 					   usekeyboard);
Petr Menšík 6e9104
 
Petr Menšík 6e9104
@@ -948,11 +957,11 @@ setup_system(void) {
Petr Menšík 6e9104
 		}
Petr Menšík 6e9104
 	}
Petr Menšík 6e9104
 
Petr Menšík 6e9104
-	setup_entropy(gmctx, NULL, &entropy);
Petr Menšík 6e9104
+	if (entropy == NULL)
Petr Menšík 6e9104
+		setup_entropy(gmctx, NULL, &entropy);
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	result = isc_hash_create(gmctx, entropy, DNS_NAME_MAXWIRE);
Petr Menšík 6e9104
 	check_result(result, "isc_hash_create");
Petr Menšík 6e9104
-	isc_hash_init();
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	result = dns_dispatchmgr_create(gmctx, entropy, &dispatchmgr);
Petr Menšík 6e9104
 	check_result(result, "dns_dispatchmgr_create");
Petr Menšík 6e9104
@@ -976,6 +985,9 @@ setup_system(void) {
Petr Menšík 6e9104
 	check_result(result, "dst_lib_init");
Petr Menšík 6e9104
 	is_dst_up = ISC_TRUE;
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+	/* moved after dst_lib_init() */
Petr Menšík 6e9104
+	isc_hash_init();
Petr Menšík 6e9104
+
Petr Menšík 6e9104
 	attrmask = DNS_DISPATCHATTR_UDP | DNS_DISPATCHATTR_TCP;
Petr Menšík 6e9104
 	attrmask |= DNS_DISPATCHATTR_IPV4 | DNS_DISPATCHATTR_IPV6;
Petr Menšík 6e9104
 
Petr Menšík 6e9104
diff --git a/bin/tests/makejournal.c b/bin/tests/makejournal.c
Petr Menšík 6e9104
index fed59be..9f125da 100644
Petr Menšík 6e9104
--- a/bin/tests/makejournal.c
Petr Menšík 6e9104
+++ b/bin/tests/makejournal.c
Petr Menšík 6e9104
@@ -100,12 +100,12 @@ main(int argc, char **argv) {
Petr Menšík 6e9104
 	CHECK(isc_mem_create(0, 0, &mctx));
Petr Menšík 6e9104
 	CHECK(isc_entropy_create(mctx, &ectx));
Petr Menšík 6e9104
 
Petr Menšík 6e9104
-	CHECK(isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE));
Petr Menšík 6e9104
-	hash_active = ISC_TRUE;
Petr Menšík 6e9104
-
Petr Menšík 6e9104
 	CHECK(dst_lib_init(mctx, ectx, ISC_ENTROPY_BLOCKING));
Petr Menšík 6e9104
 	dst_active = ISC_TRUE;
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+	CHECK(isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE));
Petr Menšík 6e9104
+	hash_active = ISC_TRUE;
Petr Menšík 6e9104
+
Petr Menšík 6e9104
 	CHECK(isc_log_create(mctx, &lctx, &logconfig));
Petr Menšík 6e9104
 	isc_log_registercategories(lctx, categories);
Petr Menšík 6e9104
 	isc_log_setcontext(lctx);
Petr Menšík 6e9104
diff --git a/bin/tests/system/pipelined/pipequeries.c b/bin/tests/system/pipelined/pipequeries.c
Petr Menšík 6e9104
index 379b6a3..810d99e 100644
Petr Menšík 6e9104
--- a/bin/tests/system/pipelined/pipequeries.c
Petr Menšík 6e9104
+++ b/bin/tests/system/pipelined/pipequeries.c
Petr Menšík 6e9104
@@ -202,6 +202,7 @@ sendqueries(isc_task_t *task, isc_event_t *event) {
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 int
Petr Menšík 6e9104
 main(int argc, char *argv[]) {
Petr Menšík 6e9104
+	char *randomfile = NULL;
Petr Menšík 6e9104
 	isc_sockaddr_t bind_any;
Petr Menšík 6e9104
 	struct in_addr inaddr;
Petr Menšík 6e9104
 	isc_result_t result;
Petr Menšík 6e9104
@@ -222,7 +223,7 @@ main(int argc, char *argv[]) {
Petr Menšík 6e9104
 	UNUSED(argv);
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	isc_commandline_errprint = ISC_FALSE;
Petr Menšík 6e9104
-	while ((c = isc_commandline_parse(argc, argv, "p:")) != -1) {
Petr Menšík 6e9104
+	while ((c = isc_commandline_parse(argc, argv, "p:r:")) != -1) {
Petr Menšík 6e9104
 		switch (c) {
Petr Menšík 6e9104
 		case 'p':
Petr Menšík 6e9104
 			result = isc_parse_uint16(&port,
Petr Menšík 6e9104
@@ -233,6 +234,9 @@ main(int argc, char *argv[]) {
Petr Menšík 6e9104
 				exit(1);
Petr Menšík 6e9104
 			}
Petr Menšík 6e9104
 			break;
Petr Menšík 6e9104
+		case 'r':
Petr Menšík 6e9104
+			randomfile = isc_commandline_argument;
Petr Menšík 6e9104
+			break;
Petr Menšík 6e9104
 		case '?':
Petr Menšík 6e9104
 			fprintf(stderr, "%s: invalid argument '%c'",
Petr Menšík 6e9104
 				argv[0], c);
Petr Menšík 6e9104
@@ -274,10 +278,18 @@ main(int argc, char *argv[]) {
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	ectx = NULL;
Petr Menšík 6e9104
 	RUNCHECK(isc_entropy_create(mctx, &ectx));
Petr Menšík 6e9104
-	RUNCHECK(isc_entropy_createfilesource(ectx, "../random.data"));
Petr Menšík 6e9104
-	RUNCHECK(isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE));
Petr Menšík 6e9104
+#ifdef ISC_PLATFORM_CRYPTORANDOM
Petr Menšík 6e9104
+	if (randomfile != NULL &&
Petr Menšík 6e9104
+	    strcmp(randomfile, ISC_PLATFORM_CRYPTORANDOM) == 0) {
Petr Menšík 6e9104
+		randomfile = NULL;
Petr Menšík 6e9104
+		isc_entropy_usehook(ectx, ISC_TRUE);
Petr Menšík 6e9104
+	}
Petr Menšík 6e9104
+#endif
Petr Menšík 6e9104
+	if (randomfile != NULL)
Petr Menšík 6e9104
+		RUNCHECK(isc_entropy_createfilesource(ectx, randomfile));
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	RUNCHECK(dst_lib_init(mctx, ectx, ISC_ENTROPY_GOODONLY));
Petr Menšík 6e9104
+	RUNCHECK(isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE));
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	taskmgr = NULL;
Petr Menšík 6e9104
 	RUNCHECK(isc_taskmgr_create(mctx, 1, 0, &taskmgr));
Petr Menšík 6e9104
@@ -330,8 +342,8 @@ main(int argc, char *argv[]) {
Petr Menšík 6e9104
 	isc_task_detach(&task);
Petr Menšík 6e9104
 	isc_taskmgr_destroy(&taskmgr);
Petr Menšík 6e9104
 
Petr Menšík 6e9104
-	dst_lib_destroy();
Petr Menšík 6e9104
 	isc_hash_destroy();
Petr Menšík 6e9104
+	dst_lib_destroy();
Petr Menšík 6e9104
 	isc_entropy_detach(&ectx);
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	isc_log_destroy(&lctx);
Petr Menšík 6e9104
diff --git a/bin/tests/system/pipelined/tests.sh b/bin/tests/system/pipelined/tests.sh
Petr Menšík 6e9104
index a6720ce..9063b1f 100644
Petr Menšík 6e9104
--- a/bin/tests/system/pipelined/tests.sh
Petr Menšík 6e9104
+++ b/bin/tests/system/pipelined/tests.sh
Petr Menšík 6e9104
@@ -19,7 +19,7 @@ status=0
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 echo_i "check pipelined TCP queries"
Petr Menšík 6e9104
 ret=0
Petr Menšík 6e9104
-$PIPEQUERIES -p ${PORT} < input > raw || ret=1
Petr Menšík 6e9104
+$PIPEQUERIES -p ${PORT} -r $RANDFILE < input > raw || ret=1
Petr Menšík 6e9104
 awk '{ print $1 " " $5 }' < raw > output
Petr Menšík 6e9104
 sort < output > output-sorted
Petr Menšík 6e9104
 diff ref output-sorted || { ret=1 ; echo_i "diff sorted failed"; }
Petr Menšík 6e9104
@@ -43,7 +43,7 @@ status=`expr $status + $ret`
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 echo_i "check keep-response-order"
Petr Menšík 6e9104
 ret=0
Petr Menšík 6e9104
-$PIPEQUERIES -p ${PORT} ++ < inputb > rawb || ret=1
Petr Menšík 6e9104
+$PIPEQUERIES -p ${PORT} -r $RANDFILE ++ < inputb > rawb || ret=1
Petr Menšík 6e9104
 awk '{ print $1 " " $5 }' < rawb > outputb
Petr Menšík 6e9104
 diff refb outputb || ret=1
Petr Menšík 6e9104
 if [ $ret != 0 ]; then echo_i "failed"; fi
Petr Menšík 6e9104
diff --git a/bin/tests/system/rsabigexponent/bigkey.c b/bin/tests/system/rsabigexponent/bigkey.c
Petr Menšík 6e9104
index 4462f2e..f1230d8 100644
Petr Menšík 6e9104
--- a/bin/tests/system/rsabigexponent/bigkey.c
Petr Menšík 6e9104
+++ b/bin/tests/system/rsabigexponent/bigkey.c
Petr Menšík 6e9104
@@ -20,6 +20,7 @@
Petr Menšík 6e9104
 #include <isc/buffer.h>
Petr Menšík 6e9104
 #include <isc/entropy.h>
Petr Menšík 6e9104
 #include <isc/mem.h>
Petr Menšík 6e9104
+#include <isc/platform.h>
Petr Menšík 6e9104
 #include <isc/print.h>
Petr Menšík 6e9104
 #include <isc/region.h>
Petr Menšík 6e9104
 #include <isc/stdio.h>
Petr Menšík 6e9104
@@ -183,6 +184,9 @@ main(int argc, char **argv) {
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	CHECK(isc_mem_create(0, 0, &mctx), "isc_mem_create()");
Petr Menšík 6e9104
 	CHECK(isc_entropy_create(mctx, &ectx), "isc_entropy_create()");
Petr Menšík 6e9104
+#ifdef ISC_PLATFORM_CRYPTORANDOM
Petr Menšík 6e9104
+	isc_entropy_usehook(ectx, ISC_TRUE);
Petr Menšík 6e9104
+#endif
Petr Menšík 6e9104
 	CHECK(isc_entropy_usebestsource(ectx, &source,
Petr Menšík 6e9104
 					"../random.data",
Petr Menšík 6e9104
 					ISC_ENTROPY_KEYBOARDNO),
Petr Menšík 6e9104
diff --git a/bin/tests/system/tkey/keycreate.c b/bin/tests/system/tkey/keycreate.c
Petr Menšík 6e9104
index 489f439..4f2f5b4 100644
Petr Menšík 6e9104
--- a/bin/tests/system/tkey/keycreate.c
Petr Menšík 6e9104
+++ b/bin/tests/system/tkey/keycreate.c
Petr Menšík 6e9104
@@ -206,6 +206,7 @@ sendquery(isc_task_t *task, isc_event_t *event) {
Petr Menšík 6e9104
 int
Petr Menšík 6e9104
 main(int argc, char *argv[]) {
Petr Menšík 6e9104
 	char *ourkeyname;
Petr Menšík 6e9104
+	char *randomfile;
Petr Menšík 6e9104
 	isc_taskmgr_t *taskmgr;
Petr Menšík 6e9104
 	isc_timermgr_t *timermgr;
Petr Menšík 6e9104
 	isc_socketmgr_t *socketmgr;
Petr Menšík 6e9104
@@ -225,10 +226,21 @@ main(int argc, char *argv[]) {
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	RUNCHECK(isc_app_start());
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+	randomfile = NULL;
Petr Menšík 6e9104
+
Petr Menšík 6e9104
 	if (argc < 2) {
Petr Menšík 6e9104
 		fprintf(stderr, "I:no DH key provided\n");
Petr Menšík 6e9104
 		exit(-1);
Petr Menšík 6e9104
 	}
Petr Menšík 6e9104
+	if (strcmp(argv[1], "-r") == 0) {
Petr Menšík 6e9104
+		if (argc < 4) {
Petr Menšík 6e9104
+			fprintf(stderr, "I:no DH key provided\n");
Petr Menšík 6e9104
+			exit(-1);
Petr Menšík 6e9104
+		}
Petr Menšík 6e9104
+		randomfile = argv[2];
Petr Menšík 6e9104
+		argv += 2;
Petr Menšík 6e9104
+		argc -= 2;
Petr Menšík 6e9104
+	}
Petr Menšík 6e9104
 	ourkeyname = argv[1];
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	if (argc >= 3)
Petr Menšík 6e9104
@@ -242,14 +254,22 @@ main(int argc, char *argv[]) {
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	ectx = NULL;
Petr Menšík 6e9104
 	RUNCHECK(isc_entropy_create(mctx, &ectx));
Petr Menšík 6e9104
-	RUNCHECK(isc_entropy_createfilesource(ectx, "../random.data"));
Petr Menšík 6e9104
-	RUNCHECK(isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE));
Petr Menšík 6e9104
+#ifdef ISC_PLATFORM_CRYPTORANDOM
Petr Menšík 6e9104
+	if (randomfile != NULL &&
Petr Menšík 6e9104
+	    strcmp(randomfile, ISC_PLATFORM_CRYPTORANDOM) == 0) {
Petr Menšík 6e9104
+		randomfile = NULL;
Petr Menšík 6e9104
+		isc_entropy_usehook(ectx, ISC_TRUE);
Petr Menšík 6e9104
+	}
Petr Menšík 6e9104
+#endif
Petr Menšík 6e9104
+	if (randomfile != NULL)
Petr Menšík 6e9104
+		RUNCHECK(isc_entropy_createfilesource(ectx, randomfile));
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	log = NULL;
Petr Menšík 6e9104
 	logconfig = NULL;
Petr Menšík 6e9104
 	RUNCHECK(isc_log_create(mctx, &log, &logconfig));
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	RUNCHECK(dst_lib_init(mctx, ectx, ISC_ENTROPY_GOODONLY));
Petr Menšík 6e9104
+	RUNCHECK(isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE));
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	taskmgr = NULL;
Petr Menšík 6e9104
 	RUNCHECK(isc_taskmgr_create(mctx, 1, 0, &taskmgr));
Petr Menšík 6e9104
@@ -328,8 +348,8 @@ main(int argc, char *argv[]) {
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	isc_log_destroy(&log;;
Petr Menšík 6e9104
 
Petr Menšík 6e9104
-	dst_lib_destroy();
Petr Menšík 6e9104
 	isc_hash_destroy();
Petr Menšík 6e9104
+	dst_lib_destroy();
Petr Menšík 6e9104
 	isc_entropy_detach(&ectx);
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	isc_mem_destroy(&mctx);
Petr Menšík 6e9104
diff --git a/bin/tests/system/tkey/keydelete.c b/bin/tests/system/tkey/keydelete.c
Petr Menšík 6e9104
index 36ee6c7..0975bbe 100644
Petr Menšík 6e9104
--- a/bin/tests/system/tkey/keydelete.c
Petr Menšík 6e9104
+++ b/bin/tests/system/tkey/keydelete.c
Petr Menšík 6e9104
@@ -136,6 +136,7 @@ sendquery(isc_task_t *task, isc_event_t *event) {
Petr Menšík 6e9104
 int
Petr Menšík 6e9104
 main(int argc, char **argv) {
Petr Menšík 6e9104
 	char *keyname;
Petr Menšík 6e9104
+	char *randomfile;
Petr Menšík 6e9104
 	isc_taskmgr_t *taskmgr;
Petr Menšík 6e9104
 	isc_timermgr_t *timermgr;
Petr Menšík 6e9104
 	isc_socketmgr_t *socketmgr;
Petr Menšík 6e9104
@@ -156,10 +157,21 @@ main(int argc, char **argv) {
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	RUNCHECK(isc_app_start());
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+	randomfile = NULL;
Petr Menšík 6e9104
+
Petr Menšík 6e9104
 	if (argc < 2) {
Petr Menšík 6e9104
 		fprintf(stderr, "I:no key to delete\n");
Petr Menšík 6e9104
 		exit(-1);
Petr Menšík 6e9104
 	}
Petr Menšík 6e9104
+	if (strcmp(argv[1], "-r") == 0) {
Petr Menšík 6e9104
+		if (argc < 4) {
Petr Menšík 6e9104
+			fprintf(stderr, "I:no DH key provided\n");
Petr Menšík 6e9104
+			exit(-1);
Petr Menšík 6e9104
+		}
Petr Menšík 6e9104
+		randomfile = argv[2];
Petr Menšík 6e9104
+		argv += 2;
Petr Menšík 6e9104
+		argc -= 2;
Petr Menšík 6e9104
+	}
Petr Menšík 6e9104
 	keyname = argv[1];
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	dns_result_register();
Petr Menšík 6e9104
@@ -169,14 +181,22 @@ main(int argc, char **argv) {
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	ectx = NULL;
Petr Menšík 6e9104
 	RUNCHECK(isc_entropy_create(mctx, &ectx));
Petr Menšík 6e9104
-	RUNCHECK(isc_entropy_createfilesource(ectx, "../random.data"));
Petr Menšík 6e9104
-	RUNCHECK(isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE));
Petr Menšík 6e9104
+#ifdef ISC_PLATFORM_CRYPTORANDOM
Petr Menšík 6e9104
+	if (randomfile != NULL &&
Petr Menšík 6e9104
+	    strcmp(randomfile, ISC_PLATFORM_CRYPTORANDOM) == 0) {
Petr Menšík 6e9104
+		randomfile = NULL;
Petr Menšík 6e9104
+		isc_entropy_usehook(ectx, ISC_TRUE);
Petr Menšík 6e9104
+	}
Petr Menšík 6e9104
+#endif
Petr Menšík 6e9104
+	if (randomfile != NULL)
Petr Menšík 6e9104
+		RUNCHECK(isc_entropy_createfilesource(ectx, randomfile));
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	log = NULL;
Petr Menšík 6e9104
 	logconfig = NULL;
Petr Menšík 6e9104
 	RUNCHECK(isc_log_create(mctx, &log, &logconfig));
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	RUNCHECK(dst_lib_init(mctx, ectx, ISC_ENTROPY_GOODONLY));
Petr Menšík 6e9104
+	RUNCHECK(isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE));
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	taskmgr = NULL;
Petr Menšík 6e9104
 	RUNCHECK(isc_taskmgr_create(mctx, 1, 0, &taskmgr));
Petr Menšík 6e9104
@@ -265,8 +285,8 @@ main(int argc, char **argv) {
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	isc_log_destroy(&log;;
Petr Menšík 6e9104
 
Petr Menšík 6e9104
-	dst_lib_destroy();
Petr Menšík 6e9104
 	isc_hash_destroy();
Petr Menšík 6e9104
+	dst_lib_destroy();
Petr Menšík 6e9104
 	isc_entropy_detach(&ectx);
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	isc_mem_destroy(&mctx);
Petr Menšík 6e9104
diff --git a/bin/tests/system/tkey/tests.sh b/bin/tests/system/tkey/tests.sh
Petr Menšík 6e9104
index 9f90dd7..fad6c83 100644
Petr Menšík 6e9104
--- a/bin/tests/system/tkey/tests.sh
Petr Menšík 6e9104
+++ b/bin/tests/system/tkey/tests.sh
Petr Menšík 6e9104
@@ -33,7 +33,7 @@ for owner in . foo.example.
Petr Menšík 6e9104
 do
Petr Menšík 6e9104
 	echo "I:creating new key using owner name \"$owner\""
Petr Menšík 6e9104
 	ret=0
Petr Menšík 6e9104
-	keyname=`$KEYCREATE $dhkeyname $owner` || ret=1
Petr Menšík 6e9104
+	keyname=`$KEYCREATE -r $RANDFILE $dhkeyname $owner` || ret=1
Petr Menšík 6e9104
 	if [ $ret != 0 ]; then
Petr Menšík 6e9104
 		echo "I:failed"
Petr Menšík 6e9104
 		status=`expr $status + $ret`
Petr Menšík 6e9104
@@ -55,7 +55,7 @@ do
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	echo "I:deleting new key"
Petr Menšík 6e9104
 	ret=0
Petr Menšík 6e9104
-	$KEYDELETE $keyname || ret=1
Petr Menšík 6e9104
+	$KEYDELETE -r $RANDFILE $keyname || ret=1
Petr Menšík 6e9104
 	if [ $ret != 0 ]; then
Petr Menšík 6e9104
 		echo "I:failed"
Petr Menšík 6e9104
 	fi
Petr Menšík 6e9104
@@ -75,7 +75,7 @@ done
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 echo "I:creating new key using owner name bar.example."
Petr Menšík 6e9104
 ret=0
Petr Menšík 6e9104
-keyname=`$KEYCREATE $dhkeyname bar.example.` || ret=1
Petr Menšík 6e9104
+keyname=`$KEYCREATE -r $RANDFILE $dhkeyname bar.example.` || ret=1
Petr Menšík 6e9104
 if [ $ret != 0 ]; then
Petr Menšík 6e9104
         echo "I:failed"
Petr Menšík 6e9104
 	status=`expr $status + $ret`
Petr Menšík 6e9104
@@ -116,7 +116,7 @@ status=`expr $status + $ret`
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 echo "I:recreating the bar.example. key"
Petr Menšík 6e9104
 ret=0
Petr Menšík 6e9104
-keyname=`$KEYCREATE $dhkeyname bar.example.` || ret=1
Petr Menšík 6e9104
+keyname=`$KEYCREATE -r $RANDFILE $dhkeyname bar.example.` || ret=1
Petr Menšík 6e9104
 if [ $ret != 0 ]; then
Petr Menšík 6e9104
         echo "I:failed"
Petr Menšík 6e9104
 	status=`expr $status + $ret`
Petr Menšík 6e9104
diff --git a/bin/tools/mdig.c b/bin/tools/mdig.c
Petr Menšík 6e9104
index 1f5dd4c..4e3bfa5 100644
Petr Menšík 6e9104
--- a/bin/tools/mdig.c
Petr Menšík 6e9104
+++ b/bin/tools/mdig.c
Petr Menšík 6e9104
@@ -1933,12 +1933,11 @@ main(int argc, char *argv[]) {
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	ectx = NULL;
Petr Menšík 6e9104
 	RUNCHECK(isc_entropy_create(mctx, &ectx));
Petr Menšík 6e9104
+	RUNCHECK(dst_lib_init(mctx, ectx, ISC_ENTROPY_GOODONLY));
Petr Menšík 6e9104
 	RUNCHECK(isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE));
Petr Menšík 6e9104
 	RUNCHECK(isc_entropy_getdata(ectx, cookie_secret,
Petr Menšík 6e9104
 				     sizeof(cookie_secret), NULL, 0));
Petr Menšík 6e9104
 
Petr Menšík 6e9104
-	RUNCHECK(dst_lib_init(mctx, ectx, ISC_ENTROPY_GOODONLY));
Petr Menšík 6e9104
-
Petr Menšík 6e9104
 	ISC_LIST_INIT(queries);
Petr Menšík 6e9104
 	parse_args(ISC_FALSE, argc, argv);
Petr Menšík 6e9104
 	if (server == NULL)
Petr Menšík 6e9104
diff --git a/configure b/configure
Petr Menšík 6e9104
index c83773a..ac1ea3f 100755
Petr Menšík 6e9104
--- a/configure
Petr Menšík 6e9104
+++ b/configure
Petr Menšík 6e9104
@@ -640,6 +640,7 @@ ac_includes_default="\
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 ac_subst_vars='LTLIBOBJS
Petr Menšík 6e9104
 LIBOBJS
Petr Menšík 6e9104
+LIBDIR_SUFFIX
Petr Menšík 6e9104
 BUILD_LIBS
Petr Menšík 6e9104
 BUILD_LDFLAGS
Petr Menšík 6e9104
 BUILD_CPPFLAGS
Petr Menšík 6e9104
@@ -825,6 +826,7 @@ XMLSTATS
Petr Menšík 6e9104
 NZDTARGETS
Petr Menšík 6e9104
 NZDSRCS
Petr Menšík 6e9104
 NZD_TOOLS
Petr Menšík 6e9104
+ISC_PLATFORM_CRYPTORANDOM
Petr Menšík 6e9104
 PKCS11_TEST
Petr Menšík 6e9104
 PKCS11_ED25519
Petr Menšík 6e9104
 PKCS11_GOST
Petr Menšík 6e9104
@@ -1037,6 +1039,7 @@ with_eddsa
Petr Menšík 6e9104
 with_aes
Petr Menšík 6e9104
 enable_openssl_hash
Petr Menšík 6e9104
 with_cc_alg
Petr Menšík 6e9104
+enable_crypto_rand
Petr Menšík 6e9104
 with_lmdb
Petr Menšík 6e9104
 with_libxml2
Petr Menšík 6e9104
 with_libjson
Petr Menšík 6e9104
@@ -1730,6 +1733,7 @@ Optional Features:
Petr Menšík 6e9104
   --enable-threads        enable multithreading
Petr Menšík 6e9104
   --enable-native-pkcs11  use native PKCS11 for all crypto [default=no]
Petr Menšík 6e9104
   --enable-openssl-hash   use OpenSSL for hash functions [default=no]
Petr Menšík 6e9104
+  --enable-crypto-rand    use the crypto provider for random [default=yes]
Petr Menšík 6e9104
   --enable-largefile      64-bit file support
Petr Menšík 6e9104
   --enable-backtrace      log stack backtrace on abort [default=yes]
Petr Menšík 6e9104
   --enable-symtable       use internal symbol table for backtrace
Petr Menšík 6e9104
@@ -16486,6 +16490,7 @@ case "$use_openssl" in
Petr Menšík 6e9104
 $as_echo "disabled because of native PKCS11" >&6; }
Petr Menšík 6e9104
 		DST_OPENSSL_INC=""
Petr Menšík 6e9104
 		CRYPTO="-DPKCS11CRYPTO"
Petr Menšík 6e9104
+		CRYPTOLIB="pkcs11"
Petr Menšík 6e9104
 		OPENSSLECDSALINKOBJS=""
Petr Menšík 6e9104
 		OPENSSLECDSALINKSRCS=""
Petr Menšík 6e9104
 		OPENSSLEDDSALINKOBJS=""
Petr Menšík 6e9104
@@ -16500,6 +16505,7 @@ $as_echo "disabled because of native PKCS11" >&6; }
Petr Menšík 6e9104
 $as_echo "no" >&6; }
Petr Menšík 6e9104
 		DST_OPENSSL_INC=""
Petr Menšík 6e9104
 		CRYPTO=""
Petr Menšík 6e9104
+		CRYPTOLIB=""
Petr Menšík 6e9104
 		OPENSSLECDSALINKOBJS=""
Petr Menšík 6e9104
 		OPENSSLECDSALINKSRCS=""
Petr Menšík 6e9104
 		OPENSSLEDDSALINKOBJS=""
Petr Menšík 6e9104
@@ -16512,6 +16518,7 @@ $as_echo "no" >&6; }
Petr Menšík 6e9104
 	auto)
Petr Menšík 6e9104
 		DST_OPENSSL_INC=""
Petr Menšík 6e9104
 		CRYPTO=""
Petr Menšík 6e9104
+		CRYPTOLIB=""
Petr Menšík 6e9104
 		OPENSSLECDSALINKOBJS=""
Petr Menšík 6e9104
 		OPENSSLECDSALINKSRCS=""
Petr Menšík 6e9104
 		OPENSSLEDDSALINKOBJS=""
Petr Menšík 6e9104
@@ -16521,7 +16528,7 @@ $as_echo "no" >&6; }
Petr Menšík 6e9104
 		OPENSSLLINKOBJS=""
Petr Menšík 6e9104
 		OPENSSLLINKSRCS=""
Petr Menšík 6e9104
 		as_fn_error $? "OpenSSL was not found in any of $openssldirs; use --with-openssl=/path
Petr Menšík 6e9104
-If you don't want OpenSSL, use --without-openssl" "$LINENO" 5
Petr Menšík 6e9104
+If you do not want OpenSSL, use --without-openssl" "$LINENO" 5
Petr Menšík 6e9104
 		;;
Petr Menšík 6e9104
 	*)
Petr Menšík 6e9104
 		if test "yes" = "$want_native_pkcs11"
Petr Menšík 6e9104
@@ -16552,6 +16559,7 @@ $as_echo "not found" >&6; }
Petr Menšík 6e9104
 			as_fn_error $? "\"$use_openssl/include/openssl/opensslv.h\" not found" "$LINENO" 5
Petr Menšík 6e9104
 		fi
Petr Menšík 6e9104
 		CRYPTO='-DOPENSSL'
Petr Menšík 6e9104
+		CRYPTOLIB="openssl"
Petr Menšík 6e9104
 		if test "/usr" = "$use_openssl"
Petr Menšík 6e9104
 		then
Petr Menšík 6e9104
 			DST_OPENSSL_INC=""
Petr Menšík 6e9104
@@ -17213,8 +17221,6 @@ fi
Petr Menšík 6e9104
 # Use OpenSSL for hash functions
Petr Menšík 6e9104
 #
Petr Menšík 6e9104
 
Petr Menšík 6e9104
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for using OpenSSL for hash functions" >&5
Petr Menšík 6e9104
-$as_echo_n "checking for using OpenSSL for hash functions... " >&6; }
Petr Menšík 6e9104
 ISC_PLATFORM_OPENSSLHASH="#undef ISC_PLATFORM_OPENSSLHASH"
Petr Menšík 6e9104
 case $want_openssl_hash in
Petr Menšík 6e9104
 	yes)
Petr Menšík 6e9104
@@ -17583,6 +17589,86 @@ if test "rt" = "$have_clock_gt"; then
Petr Menšík 6e9104
 	LIBS="-lrt $LIBS"
Petr Menšík 6e9104
 fi
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+#
Petr Menšík 6e9104
+# Use the crypto provider (OpenSSL/PKCS#11) for random functions
Petr Menšík 6e9104
+#
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for using the crypto library (vs. builtin) for random functions" >&5
Petr Menšík 6e9104
+$as_echo_n "checking for using the crypto library (vs. builtin) for random functions... " >&6; }
Petr Menšík 6e9104
+# Check whether --enable-crypto-rand was given.
Petr Menšík 6e9104
+if test "${enable_crypto_rand+set}" = set; then :
Petr Menšík 6e9104
+  enableval=$enable_crypto_rand; want_crypto_rand="$enableval"
Petr Menšík 6e9104
+else
Petr Menšík 6e9104
+  want_crypto_rand="auto"
Petr Menšík 6e9104
+fi
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+if test "$want_crypto_rand" = "auto"
Petr Menšík 6e9104
+then
Petr Menšík 6e9104
+	case "$CRYPTOLIB" in
Petr Menšík 6e9104
+	"")
Petr Menšík 6e9104
+		want_crypto_rand="no"
Petr Menšík 6e9104
+		;;
Petr Menšík 6e9104
+	pkcs11)
Petr Menšík 6e9104
+		want_crypto_rand="yes"
Petr Menšík 6e9104
+		;;
Petr Menšík 6e9104
+	openssl)
Petr Menšík 6e9104
+		saved_cflags="$CFLAGS"
Petr Menšík 6e9104
+		saved_libs="$LIBS"
Petr Menšík 6e9104
+		CFLAGS="$CFLAGS $DST_OPENSSL_INC"
Petr Menšík 6e9104
+		LIBS="$LIBS $DST_OPENSSL_LIBS"
Petr Menšík 6e9104
+		if test "$cross_compiling" = yes; then :
Petr Menšík 6e9104
+  want_crypto_rand="yes"
Petr Menšík 6e9104
+else
Petr Menšík 6e9104
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
Petr Menšík 6e9104
+/* end confdefs.h.  */
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+#include <openssl/rand.h>
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+unsigned char buf[128];
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+int main()
Petr Menšík 6e9104
+{
Petr Menšík 6e9104
+	if (RAND_bytes(buf, 128) != 1)
Petr Menšík 6e9104
+		return (1);
Petr Menšík 6e9104
+	return (0);
Petr Menšík 6e9104
+}
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+_ACEOF
Petr Menšík 6e9104
+if ac_fn_c_try_run "$LINENO"; then :
Petr Menšík 6e9104
+  want_crypto_rand="yes"
Petr Menšík 6e9104
+else
Petr Menšík 6e9104
+  want_crypto_rand="no"
Petr Menšík 6e9104
+fi
Petr Menšík 6e9104
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
Petr Menšík 6e9104
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
Petr Menšík 6e9104
+fi
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+		CFLAGS="$saved_cflags"
Petr Menšík 6e9104
+		LIBS="$saved_libs"
Petr Menšík 6e9104
+		;;
Petr Menšík 6e9104
+	*)
Petr Menšík 6e9104
+		as_fn_error $? "Unknown crypto library define $CRYPTOLIB" "$LINENO" 5
Petr Menšík 6e9104
+		;;
Petr Menšík 6e9104
+	esac
Petr Menšík 6e9104
+fi
Petr Menšík 6e9104
+case $want_crypto_rand in
Petr Menšík 6e9104
+	yes)
Petr Menšík 6e9104
+		if test "$CRYPTOLIB" = ""
Petr Menšík 6e9104
+		then
Petr Menšík 6e9104
+			as_fn_error $? "No crypto library for random functions" "$LINENO" 5
Petr Menšík 6e9104
+		fi
Petr Menšík 6e9104
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: \"$CRYPTOLIB\"" >&5
Petr Menšík 6e9104
+$as_echo "\"$CRYPTOLIB\"" >&6; }
Petr Menšík 6e9104
+		ISC_PLATFORM_CRYPTORANDOM="#define ISC_PLATFORM_CRYPTORANDOM \"$CRYPTOLIB\""
Petr Menšík 6e9104
+		;;
Petr Menšík 6e9104
+	no)
Petr Menšík 6e9104
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
Petr Menšík 6e9104
+$as_echo "no" >&6; }
Petr Menšík 6e9104
+		ISC_PLATFORM_CRYPTORANDOM="#undef ISC_PLATFORM_CRYPTORANDOM"
Petr Menšík 6e9104
+		;;
Petr Menšík 6e9104
+esac
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+
Petr Menšík 6e9104
 #
Petr Menšík 6e9104
 # was --with-lmdb specified?
Petr Menšík 6e9104
 #
Petr Menšík 6e9104
@@ -19665,9 +19751,12 @@ _ACEOF
Petr Menšík 6e9104
 if ac_fn_c_try_compile "$LINENO"; then :
Petr Menšík 6e9104
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: size_t for buflen; int for flags" >&5
Petr Menšík 6e9104
 $as_echo "size_t for buflen; int for flags" >&6; }
Petr Menšík 6e9104
-	 $as_echo "#define IRS_GETNAMEINFO_SOCKLEN_T size_t" >>confdefs.h
Petr Menšík 6e9104
+	# Changed to solve multilib conflict on Fedora
Petr Menšík 6e9104
+	# AC_DEFINE(IRS_GETNAMEINFO_SOCKLEN_T, size_t)
Petr Menšík 6e9104
+	# AC_DEFINE(IRS_GETNAMEINFO_BUFLEN_T, size_t)
Petr Menšík 6e9104
+	 $as_echo "#define IRS_GETNAMEINFO_SOCKLEN_T socklen_t" >>confdefs.h
Petr Menšík 6e9104
 
Petr Menšík 6e9104
-	 $as_echo "#define IRS_GETNAMEINFO_BUFLEN_T size_t" >>confdefs.h
Petr Menšík 6e9104
+	 $as_echo "#define IRS_GETNAMEINFO_BUFLEN_T socklen_t" >>confdefs.h
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	 $as_echo "#define IRS_GETNAMEINFO_FLAGS_T int" >>confdefs.h
Petr Menšík 6e9104
 
Petr Menšík 6e9104
@@ -21032,12 +21121,7 @@ ISC_PLATFORM_USEGCCASM="#undef ISC_PLATFORM_USEGCCASM"
Petr Menšík 6e9104
 ISC_PLATFORM_USESTDASM="#undef ISC_PLATFORM_USESTDASM"
Petr Menšík 6e9104
 ISC_PLATFORM_USEMACASM="#undef ISC_PLATFORM_USEMACASM"
Petr Menšík 6e9104
 if test "yes" = "$use_atomic"; then
Petr Menšík 6e9104
-	have_atomic=yes		# set default
Petr Menšík 6e9104
-	case "$host" in
Petr Menšík 6e9104
-	i[3456]86-*)
Petr Menšík 6e9104
-		# XXX: some old x86 architectures actually do not support
Petr Menšík 6e9104
-		#      (some of) these operations.  Do we need stricter checks?
Petr Menšík 6e9104
-		# The cast to long int works around a bug in the HP C Compiler
Petr Menšík 6e9104
+	# The cast to long int works around a bug in the HP C Compiler
Petr Menšík 6e9104
 # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
Petr Menšík 6e9104
 # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
Petr Menšík 6e9104
 # This bug is HP SR number 8606223364.
Petr Menšík 6e9104
@@ -21070,6 +21154,11 @@ cat >>confdefs.h <<_ACEOF
Petr Menšík 6e9104
 _ACEOF
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+	have_atomic=yes		# set default
Petr Menšík 6e9104
+	case "$host" in
Petr Menšík 6e9104
+	i[3456]86-*)
Petr Menšík 6e9104
+		# XXX: some old x86 architectures actually do not support
Petr Menšík 6e9104
+		#      (some of) these operations.  Do we need stricter checks?
Petr Menšík 6e9104
 		if test $ac_cv_sizeof_void_p = 8; then
Petr Menšík 6e9104
 			arch=x86_64
Petr Menšík 6e9104
 			have_xaddq=yes
Petr Menšík 6e9104
@@ -21078,39 +21167,6 @@ _ACEOF
Petr Menšík 6e9104
 		fi
Petr Menšík 6e9104
 	;;
Petr Menšík 6e9104
 	x86_64-*|amd64-*)
Petr Menšík 6e9104
-		# The cast to long int works around a bug in the HP C Compiler
Petr Menšík 6e9104
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
Petr Menšík 6e9104
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
Petr Menšík 6e9104
-# This bug is HP SR number 8606223364.
Petr Menšík 6e9104
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
Petr Menšík 6e9104
-$as_echo_n "checking size of void *... " >&6; }
Petr Menšík 6e9104
-if ${ac_cv_sizeof_void_p+:} false; then :
Petr Menšík 6e9104
-  $as_echo_n "(cached) " >&6
Petr Menšík 6e9104
-else
Petr Menšík 6e9104
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p"        "$ac_includes_default"; then :
Petr Menšík 6e9104
-
Petr Menšík 6e9104
-else
Petr Menšík 6e9104
-  if test "$ac_cv_type_void_p" = yes; then
Petr Menšík 6e9104
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
Petr Menšík 6e9104
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
Petr Menšík 6e9104
-as_fn_error 77 "cannot compute sizeof (void *)
Petr Menšík 6e9104
-See \`config.log' for more details" "$LINENO" 5; }
Petr Menšík 6e9104
-   else
Petr Menšík 6e9104
-     ac_cv_sizeof_void_p=0
Petr Menšík 6e9104
-   fi
Petr Menšík 6e9104
-fi
Petr Menšík 6e9104
-
Petr Menšík 6e9104
-fi
Petr Menšík 6e9104
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5
Petr Menšík 6e9104
-$as_echo "$ac_cv_sizeof_void_p" >&6; }
Petr Menšík 6e9104
-
Petr Menšík 6e9104
-
Petr Menšík 6e9104
-
Petr Menšík 6e9104
-cat >>confdefs.h <<_ACEOF
Petr Menšík 6e9104
-#define SIZEOF_VOID_P $ac_cv_sizeof_void_p
Petr Menšík 6e9104
-_ACEOF
Petr Menšík 6e9104
-
Petr Menšík 6e9104
-
Petr Menšík 6e9104
 		if test $ac_cv_sizeof_void_p = 8; then
Petr Menšík 6e9104
 			arch=x86_64
Petr Menšík 6e9104
 			have_xaddq=yes
Petr Menšík 6e9104
@@ -21141,6 +21197,10 @@ $as_echo_n "checking architecture type for atomic operations... " >&6; }
Petr Menšík 6e9104
 $as_echo "$arch" >&6; }
Petr Menšík 6e9104
 fi
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+if test ! "$arch" = "x86_64" -a "$have_xaddq" = "yes"; then
Petr Menšík 6e9104
+	as_fn_error $? "XADDQ present but disabled by Fedora patch!" "$LINENO" 5
Petr Menšík 6e9104
+fi
Petr Menšík 6e9104
+
Petr Menšík 6e9104
 if test "yes" = "$have_atomic"; then
Petr Menšík 6e9104
 	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking compiler support for inline assembly code" >&5
Petr Menšík 6e9104
 $as_echo_n "checking compiler support for inline assembly code... " >&6; }
Petr Menšík 6e9104
@@ -23428,6 +23488,30 @@ CFLAGS="$CFLAGS $SO_CFLAGS"
Petr Menšík 6e9104
 #
Petr Menšík 6e9104
 dlzdir='${DLZ_DRIVER_DIR}'
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for target libdir" >&5
Petr Menšík 6e9104
+$as_echo_n "checking for target libdir... " >&6; }
Petr Menšík 6e9104
+if test "$cross_compiling" = yes; then :
Petr Menšík 6e9104
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
Petr Menšík 6e9104
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
Petr Menšík 6e9104
+as_fn_error $? "cannot run test program while cross compiling
Petr Menšík 6e9104
+See \`config.log' for more details" "$LINENO" 5; }
Petr Menšík 6e9104
+else
Petr Menšík 6e9104
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
Petr Menšík 6e9104
+/* end confdefs.h.  */
Petr Menšík 6e9104
+int main(void) {exit((sizeof(void *) == 8) ? 0 : 1);}
Petr Menšík 6e9104
+_ACEOF
Petr Menšík 6e9104
+if ac_fn_c_try_run "$LINENO"; then :
Petr Menšík 6e9104
+  target_lib=lib64
Petr Menšík 6e9104
+else
Petr Menšík 6e9104
+  target_lib=lib
Petr Menšík 6e9104
+fi
Petr Menšík 6e9104
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
Petr Menšík 6e9104
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
Petr Menšík 6e9104
+fi
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: \"$target_lib\"" >&5
Petr Menšík 6e9104
+$as_echo "\"$target_lib\"" >&6; }
Petr Menšík 6e9104
+
Petr Menšík 6e9104
 #
Petr Menšík 6e9104
 # Private autoconf macro to simplify configuring drivers:
Petr Menšík 6e9104
 #
Petr Menšík 6e9104
@@ -23758,11 +23842,11 @@ $as_echo "no" >&6; }
Petr Menšík 6e9104
 $as_echo "using mysql with libs ${mysql_lib} and includes ${mysql_include}" >&6; }
Petr Menšík 6e9104
 		;;
Petr Menšík 6e9104
 	*)
Petr Menšík 6e9104
-		if test -d "$use_dlz_mysql/lib/mysql"
Petr Menšík 6e9104
+		if test -d $use_dlz_mysql/${target_lib}/mysql
Petr Menšík 6e9104
 		then
Petr Menšík 6e9104
-			mysql_lib="$use_dlz_mysql/lib/mysql"
Petr Menšík 6e9104
+			mysql_lib=$use_dlz_mysql/${target_lib}/mysql
Petr Menšík 6e9104
 		else
Petr Menšík 6e9104
-			mysql_lib="$use_dlz_mysql/lib"
Petr Menšík 6e9104
+			mysql_lib=$use_dlz_mysql/${target_lib}
Petr Menšík 6e9104
 		fi
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	CONTRIB_DLZ="$CONTRIB_DLZ -DDLZ_MYSQL"
Petr Menšík 6e9104
@@ -23847,7 +23931,7 @@ $as_echo "" >&6; }
Petr Menšík 6e9104
 			# Check other locations for includes.
Petr Menšík 6e9104
 			# Order is important (sigh).
Petr Menšík 6e9104
 
Petr Menšík 6e9104
-			bdb_incdirs="/db53 /db51 /db48 /db47 /db46 /db45 /db44 /db43 /db42 /db41 /db4 /db"
Petr Menšík 6e9104
+			bdb_incdirs="/db53 /db51 /db48 /db47 /db46 /db45 /db44 /db43 /db42 /db41 /db4 /libdb /db"
Petr Menšík 6e9104
 			# include a blank element first
Petr Menšík 6e9104
 			for d in "" $bdb_incdirs
Petr Menšík 6e9104
 			do
Petr Menšík 6e9104
@@ -23872,57 +23956,9 @@ $as_echo "" >&6; }
Petr Menšík 6e9104
 			bdb_libnames="db53 db-5.3 db51 db-5.1 db48 db-4.8 db47 db-4.7 db46 db-4.6 db45 db-4.5 db44 db-4.4 db43 db-4.3 db42 db-4.2 db41 db-4.1 db"
Petr Menšík 6e9104
 			for d in $bdb_libnames
Petr Menšík 6e9104
 			do
Petr Menšík 6e9104
-				if test "$dd" = "/usr"
Petr Menšík 6e9104
+				if test -f "$dd/${target_lib}/lib${d}.so"
Petr Menšík 6e9104
 				then
Petr Menšík 6e9104
-					as_ac_Lib=`$as_echo "ac_cv_lib_$d''_db_create" | $as_tr_sh`
Petr Menšík 6e9104
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for db_create in -l$d" >&5
Petr Menšík 6e9104
-$as_echo_n "checking for db_create in -l$d... " >&6; }
Petr Menšík 6e9104
-if eval \${$as_ac_Lib+:} false; then :
Petr Menšík 6e9104
-  $as_echo_n "(cached) " >&6
Petr Menšík 6e9104
-else
Petr Menšík 6e9104
-  ac_check_lib_save_LIBS=$LIBS
Petr Menšík 6e9104
-LIBS="-l$d  $LIBS"
Petr Menšík 6e9104
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
Petr Menšík 6e9104
-/* end confdefs.h.  */
Petr Menšík 6e9104
-
Petr Menšík 6e9104
-/* Override any GCC internal prototype to avoid an error.
Petr Menšík 6e9104
-   Use char because int might match the return type of a GCC
Petr Menšík 6e9104
-   builtin and then its argument prototype would still apply.  */
Petr Menšík 6e9104
-#ifdef __cplusplus
Petr Menšík 6e9104
-extern "C"
Petr Menšík 6e9104
-#endif
Petr Menšík 6e9104
-char db_create ();
Petr Menšík 6e9104
-int
Petr Menšík 6e9104
-main ()
Petr Menšík 6e9104
-{
Petr Menšík 6e9104
-return db_create ();
Petr Menšík 6e9104
-  ;
Petr Menšík 6e9104
-  return 0;
Petr Menšík 6e9104
-}
Petr Menšík 6e9104
-_ACEOF
Petr Menšík 6e9104
-if ac_fn_c_try_link "$LINENO"; then :
Petr Menšík 6e9104
-  eval "$as_ac_Lib=yes"
Petr Menšík 6e9104
-else
Petr Menšík 6e9104
-  eval "$as_ac_Lib=no"
Petr Menšík 6e9104
-fi
Petr Menšík 6e9104
-rm -f core conftest.err conftest.$ac_objext \
Petr Menšík 6e9104
-    conftest$ac_exeext conftest.$ac_ext
Petr Menšík 6e9104
-LIBS=$ac_check_lib_save_LIBS
Petr Menšík 6e9104
-fi
Petr Menšík 6e9104
-eval ac_res=\$$as_ac_Lib
Petr Menšík 6e9104
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
Petr Menšík 6e9104
-$as_echo "$ac_res" >&6; }
Petr Menšík 6e9104
-if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
Petr Menšík 6e9104
-  dlz_bdb_libs="-l${d}"
Petr Menšík 6e9104
-fi
Petr Menšík 6e9104
-
Petr Menšík 6e9104
-					if test $dlz_bdb_libs != "yes"
Petr Menšík 6e9104
-					then
Petr Menšík 6e9104
-						break
Petr Menšík 6e9104
-					fi
Petr Menšík 6e9104
-				elif test -f "$dd/lib/lib${d}.so"
Petr Menšík 6e9104
-				then
Petr Menšík 6e9104
-					dlz_bdb_libs="-L${dd}/lib -l${d}"
Petr Menšík 6e9104
+					dlz_bdb_libs="-L${dd}/${target_lib}/libdb -l${d}"
Petr Menšík 6e9104
 					break
Petr Menšík 6e9104
 				fi
Petr Menšík 6e9104
 			done
Petr Menšík 6e9104
@@ -24081,10 +24117,10 @@ $as_echo "no" >&6; }
Petr Menšík 6e9104
 		DLZ_DRIVER_INCLUDES="$DLZ_DRIVER_INCLUDES -I$use_dlz_ldap/include"
Petr Menšík 6e9104
 		DLZ_DRIVER_LDAP_INCLUDES="-I$use_dlz_ldap/include"
Petr Menšík 6e9104
 	fi
Petr Menšík 6e9104
-	if test -n "-L$use_dlz_ldap/lib -lldap -llber"
Petr Menšík 6e9104
+	if test -n "-L$use_dlz_ldap/${target_lib} -lldap -llber"
Petr Menšík 6e9104
 	then
Petr Menšík 6e9104
-		DLZ_DRIVER_LIBS="$DLZ_DRIVER_LIBS -L$use_dlz_ldap/lib -lldap -llber"
Petr Menšík 6e9104
-		DLZ_DRIVER_LDAP_LIBS="-L$use_dlz_ldap/lib -lldap -llber"
Petr Menšík 6e9104
+		DLZ_DRIVER_LIBS="$DLZ_DRIVER_LIBS -L$use_dlz_ldap/${target_lib} -lldap -llber"
Petr Menšík 6e9104
+		DLZ_DRIVER_LDAP_LIBS="-L$use_dlz_ldap/${target_lib} -lldap -llber"
Petr Menšík 6e9104
 	fi
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 
Petr Menšík 6e9104
@@ -24170,11 +24206,11 @@ fi
Petr Menšík 6e9104
 		odbcdirs="/usr /usr/local /usr/pkg"
Petr Menšík 6e9104
 		for d in $odbcdirs
Petr Menšík 6e9104
 		do
Petr Menšík 6e9104
-			if test -f $d/include/sql.h -a -f $d/lib/libodbc.a
Petr Menšík 6e9104
+			if test -f $d/include/sql.h -a -f $d/${target_lib}/libodbc.a
Petr Menšík 6e9104
 			then
Petr Menšík 6e9104
 				use_dlz_odbc=$d
Petr Menšík 6e9104
 				dlz_odbc_include="-I$use_dlz_odbc/include"
Petr Menšík 6e9104
-				dlz_odbc_libs="-L$use_dlz_odbc/lib -lodbc"
Petr Menšík 6e9104
+				dlz_odbc_libs="-L$use_dlz_odbc/${target_lib} -lodbc"
Petr Menšík 6e9104
 				break
Petr Menšík 6e9104
 			fi
Petr Menšík 6e9104
 		done
Petr Menšík 6e9104
@@ -24449,6 +24485,8 @@ DNS_CRYPTO_LIBS="$NEWFLAGS"
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+
Petr Menšík 6e9104
 #
Petr Menšík 6e9104
 # Commands to run at the end of config.status.
Petr Menšík 6e9104
 # Don't just put these into configure, it won't work right if somebody
Petr Menšík 6e9104
@@ -26839,6 +26877,8 @@ report() {
Petr Menšík 6e9104
 	    echo "    IPv6 support (--enable-ipv6)"
Petr Menšík 6e9104
 	test "X$CRYPTO" = "X" -o "yes" = "$want_native_pkcs11" || \
Petr Menšík 6e9104
 		echo "    OpenSSL cryptography/DNSSEC (--with-openssl)"
Petr Menšík 6e9104
+        test "no" = "$want_crypto_rand" || \
Petr Menšík 6e9104
+                echo "    Crypto provider entropy source (--enable-crypto-rand)"
Petr Menšík 6e9104
 	test "X$PYTHON" = "X" || echo "    Python tools (--with-python)"
Petr Menšík 6e9104
 	test "X$XMLSTATS" = "X" || echo "    XML statistics (--with-libxml2)"
Petr Menšík 6e9104
 	test "X$JSONSTATS" = "X" || echo "    JSON statistics (--with-libjson)"
Petr Menšík 6e9104
@@ -26879,6 +26919,8 @@ report() {
Petr Menšík 6e9104
 	echo "    Very verbose query trace logging (--enable-querytrace)"
Petr Menšík 6e9104
     test "no" = "$atf" || echo "    Automated Testing Framework (--with-atf)"
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+    echo "    Cryptographic library for DNSSEC: $CRYPTOLIB"
Petr Menšík 6e9104
+
Petr Menšík 6e9104
     echo "    Dynamically loadable zone (DLZ) drivers:"
Petr Menšík 6e9104
     test "no" = "$use_dlz_bdb" || \
Petr Menšík 6e9104
 	echo "        Berkeley DB (--with-dlz-bdb)"
Petr Menšík 6e9104
@@ -26926,6 +26968,8 @@ report() {
Petr Menšík 6e9104
 	echo "    ECDSA algorithm support (--with-ecdsa)"
Petr Menšík 6e9104
     test "X$CRYPTO" = "X" -o "yes" = "$OPENSSL_ED25519" -o "yes" = "$PKCS11_ED25519" || \
Petr Menšík 6e9104
 	echo "    EDDSA algorithm support (--with-eddsa)"
Petr Menšík 6e9104
+    test "yes" = "$want_crypto_rand" || \
Petr Menšík 6e9104
+        echo "    Crypto provider entropy source (--enable-crypto-rand)"
Petr Menšík 6e9104
 
Petr Menšík 6e9104
     test "yes" = "$enable_seccomp" || \
Petr Menšík 6e9104
 	echo "    Use libseccomp system call filtering (--enable-seccomp)"
Petr Menšík 6e9104
diff --git a/configure.in b/configure.in
Petr Menšík 6e9104
index 9a1d16d..849fa94 100644
Petr Menšík 6e9104
--- a/configure.in
Petr Menšík 6e9104
+++ b/configure.in
Petr Menšík 6e9104
@@ -1597,6 +1597,7 @@ case "$use_openssl" in
Petr Menšík 6e9104
 		AC_MSG_RESULT(disabled because of native PKCS11)
Petr Menšík 6e9104
 		DST_OPENSSL_INC=""
Petr Menšík 6e9104
 		CRYPTO="-DPKCS11CRYPTO"
Petr Menšík 6e9104
+		CRYPTOLIB="pkcs11"
Petr Menšík 6e9104
 		OPENSSLECDSALINKOBJS=""
Petr Menšík 6e9104
 		OPENSSLECDSALINKSRCS=""
Petr Menšík 6e9104
 		OPENSSLEDDSALINKOBJS=""
Petr Menšík 6e9104
@@ -1610,6 +1611,7 @@ case "$use_openssl" in
Petr Menšík 6e9104
 		AC_MSG_RESULT(no)
Petr Menšík 6e9104
 		DST_OPENSSL_INC=""
Petr Menšík 6e9104
 		CRYPTO=""
Petr Menšík 6e9104
+		CRYPTOLIB=""
Petr Menšík 6e9104
 		OPENSSLECDSALINKOBJS=""
Petr Menšík 6e9104
 		OPENSSLECDSALINKSRCS=""
Petr Menšík 6e9104
 		OPENSSLEDDSALINKOBJS=""
Petr Menšík 6e9104
@@ -1622,6 +1624,7 @@ case "$use_openssl" in
Petr Menšík 6e9104
 	auto)
Petr Menšík 6e9104
 		DST_OPENSSL_INC=""
Petr Menšík 6e9104
 		CRYPTO=""
Petr Menšík 6e9104
+		CRYPTOLIB=""
Petr Menšík 6e9104
 		OPENSSLECDSALINKOBJS=""
Petr Menšík 6e9104
 		OPENSSLECDSALINKSRCS=""
Petr Menšík 6e9104
 		OPENSSLEDDSALINKOBJS=""
Petr Menšík 6e9104
@@ -1632,7 +1635,7 @@ case "$use_openssl" in
Petr Menšík 6e9104
 		OPENSSLLINKSRCS=""
Petr Menšík 6e9104
 		AC_MSG_ERROR(
Petr Menšík 6e9104
 [OpenSSL was not found in any of $openssldirs; use --with-openssl=/path
Petr Menšík 6e9104
-If you don't want OpenSSL, use --without-openssl])
Petr Menšík 6e9104
+If you do not want OpenSSL, use --without-openssl])
Petr Menšík 6e9104
 		;;
Petr Menšík 6e9104
 	*)
Petr Menšík 6e9104
 		if test "yes" = "$want_native_pkcs11"
Petr Menšík 6e9104
@@ -1662,6 +1665,7 @@ If you don't want OpenSSL, use --without-openssl])
Petr Menšík 6e9104
 			AC_MSG_ERROR(["$use_openssl/include/openssl/opensslv.h" not found])
Petr Menšík 6e9104
 		fi
Petr Menšík 6e9104
 		CRYPTO='-DOPENSSL'
Petr Menšík 6e9104
+		CRYPTOLIB="openssl"
Petr Menšík 6e9104
 		if test "/usr" = "$use_openssl"
Petr Menšík 6e9104
 		then
Petr Menšík 6e9104
 			DST_OPENSSL_INC=""
Petr Menšík 6e9104
@@ -2135,7 +2139,6 @@ fi
Petr Menšík 6e9104
 # Use OpenSSL for hash functions
Petr Menšík 6e9104
 #
Petr Menšík 6e9104
 
Petr Menšík 6e9104
-AC_MSG_CHECKING(for using OpenSSL for hash functions)
Petr Menšík 6e9104
 ISC_PLATFORM_OPENSSLHASH="#undef ISC_PLATFORM_OPENSSLHASH"
Petr Menšík 6e9104
 case $want_openssl_hash in
Petr Menšík 6e9104
 	yes)
Petr Menšík 6e9104
@@ -2402,6 +2405,67 @@ if test "rt" = "$have_clock_gt"; then
Petr Menšík 6e9104
 	LIBS="-lrt $LIBS"
Petr Menšík 6e9104
 fi
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+#
Petr Menšík 6e9104
+# Use the crypto provider (OpenSSL/PKCS#11) for random functions
Petr Menšík 6e9104
+#
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+AC_MSG_CHECKING(for using the crypto library (vs. builtin) for random functions)
Petr Menšík 6e9104
+AC_ARG_ENABLE(crypto-rand,
Petr Menšík 6e9104
+	[  --enable-crypto-rand    use the crypto provider for random [[default=yes]]],
Petr Menšík 6e9104
+	want_crypto_rand="$enableval", want_crypto_rand="auto")
Petr Menšík 6e9104
+if test "$want_crypto_rand" = "auto"
Petr Menšík 6e9104
+then
Petr Menšík 6e9104
+	case "$CRYPTOLIB" in
Petr Menšík 6e9104
+	"")
Petr Menšík 6e9104
+		want_crypto_rand="no"
Petr Menšík 6e9104
+		;;
Petr Menšík 6e9104
+	pkcs11)
Petr Menšík 6e9104
+		want_crypto_rand="yes"
Petr Menšík 6e9104
+		;;
Petr Menšík 6e9104
+	openssl)
Petr Menšík 6e9104
+		saved_cflags="$CFLAGS"
Petr Menšík 6e9104
+		saved_libs="$LIBS"
Petr Menšík 6e9104
+		CFLAGS="$CFLAGS $DST_OPENSSL_INC"
Petr Menšík 6e9104
+		LIBS="$LIBS $DST_OPENSSL_LIBS"
Petr Menšík 6e9104
+		AC_TRY_RUN([
Petr Menšík 6e9104
+#include <openssl/rand.h>
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+unsigned char buf[128];
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+int main()
Petr Menšík 6e9104
+{
Petr Menšík 6e9104
+	if (RAND_bytes(buf, 128) != 1)
Petr Menšík 6e9104
+		return (1);
Petr Menšík 6e9104
+	return (0);
Petr Menšík 6e9104
+}
Petr Menšík 6e9104
+],
Petr Menšík 6e9104
+		[want_crypto_rand="yes"],
Petr Menšík 6e9104
+		[want_crypto_rand="no"],
Petr Menšík 6e9104
+		[want_crypto_rand="yes"])
Petr Menšík 6e9104
+		CFLAGS="$saved_cflags"
Petr Menšík 6e9104
+		LIBS="$saved_libs"
Petr Menšík 6e9104
+		;;
Petr Menšík 6e9104
+	*)
Petr Menšík 6e9104
+		AC_MSG_ERROR([Unknown crypto library define $CRYPTOLIB])
Petr Menšík 6e9104
+		;;
Petr Menšík 6e9104
+	esac
Petr Menšík 6e9104
+fi
Petr Menšík 6e9104
+case $want_crypto_rand in
Petr Menšík 6e9104
+	yes)
Petr Menšík 6e9104
+		if test "$CRYPTOLIB" = ""
Petr Menšík 6e9104
+		then
Petr Menšík 6e9104
+			AC_MSG_ERROR([No crypto library for random functions])
Petr Menšík 6e9104
+		fi
Petr Menšík 6e9104
+		AC_MSG_RESULT(["$CRYPTOLIB"])
Petr Menšík 6e9104
+		ISC_PLATFORM_CRYPTORANDOM="#define ISC_PLATFORM_CRYPTORANDOM \"$CRYPTOLIB\""
Petr Menšík 6e9104
+		;;
Petr Menšík 6e9104
+	no)
Petr Menšík 6e9104
+		AC_MSG_RESULT(no)
Petr Menšík 6e9104
+		ISC_PLATFORM_CRYPTORANDOM="#undef ISC_PLATFORM_CRYPTORANDOM"
Petr Menšík 6e9104
+		;;
Petr Menšík 6e9104
+esac
Petr Menšík 6e9104
+AC_SUBST(ISC_PLATFORM_CRYPTORANDOM)
Petr Menšík 6e9104
+
Petr Menšík 6e9104
 #
Petr Menšík 6e9104
 # was --with-lmdb specified?
Petr Menšík 6e9104
 #
Petr Menšík 6e9104
@@ -4235,12 +4299,12 @@ ISC_PLATFORM_USEGCCASM="#undef ISC_PLATFORM_USEGCCASM"
Petr Menšík 6e9104
 ISC_PLATFORM_USESTDASM="#undef ISC_PLATFORM_USESTDASM"
Petr Menšík 6e9104
 ISC_PLATFORM_USEMACASM="#undef ISC_PLATFORM_USEMACASM"
Petr Menšík 6e9104
 if test "yes" = "$use_atomic"; then
Petr Menšík 6e9104
+	AC_CHECK_SIZEOF([void *])
Petr Menšík 6e9104
 	have_atomic=yes		# set default
Petr Menšík 6e9104
 	case "$host" in
Petr Menšík 6e9104
 	[i[3456]86-*])
Petr Menšík 6e9104
 		# XXX: some old x86 architectures actually do not support
Petr Menšík 6e9104
 		#      (some of) these operations.  Do we need stricter checks?
Petr Menšík 6e9104
-		AC_CHECK_SIZEOF([void *])
Petr Menšík 6e9104
 		if test $ac_cv_sizeof_void_p = 8; then
Petr Menšík 6e9104
 			arch=x86_64
Petr Menšík 6e9104
 			have_xaddq=yes
Petr Menšík 6e9104
@@ -4249,7 +4313,6 @@ if test "yes" = "$use_atomic"; then
Petr Menšík 6e9104
 		fi
Petr Menšík 6e9104
 	;;
Petr Menšík 6e9104
 	x86_64-*|amd64-*)
Petr Menšík 6e9104
-		AC_CHECK_SIZEOF([void *])
Petr Menšík 6e9104
 		if test $ac_cv_sizeof_void_p = 8; then
Petr Menšík 6e9104
 			arch=x86_64
Petr Menšík 6e9104
 			have_xaddq=yes
Petr Menšík 6e9104
@@ -5613,6 +5676,8 @@ report() {
Petr Menšík 6e9104
 	    echo "    IPv6 support (--enable-ipv6)"
Petr Menšík 6e9104
 	test "X$CRYPTO" = "X" -o "yes" = "$want_native_pkcs11" || \
Petr Menšík 6e9104
 		echo "    OpenSSL cryptography/DNSSEC (--with-openssl)"
Petr Menšík 6e9104
+        test "no" = "$want_crypto_rand" || \
Petr Menšík 6e9104
+                echo "    Crypto provider entropy source (--enable-crypto-rand)"
Petr Menšík 6e9104
 	test "X$PYTHON" = "X" || echo "    Python tools (--with-python)"
Petr Menšík 6e9104
 	test "X$XMLSTATS" = "X" || echo "    XML statistics (--with-libxml2)"
Petr Menšík 6e9104
 	test "X$JSONSTATS" = "X" || echo "    JSON statistics (--with-libjson)"
Petr Menšík 6e9104
@@ -5653,6 +5718,8 @@ report() {
Petr Menšík 6e9104
 	echo "    Very verbose query trace logging (--enable-querytrace)"
Petr Menšík 6e9104
     test "no" = "$atf" || echo "    Automated Testing Framework (--with-atf)"
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+    echo "    Cryptographic library for DNSSEC: $CRYPTOLIB"
Petr Menšík 6e9104
+
Petr Menšík 6e9104
     echo "    Dynamically loadable zone (DLZ) drivers:"
Petr Menšík 6e9104
     test "no" = "$use_dlz_bdb" || \
Petr Menšík 6e9104
 	echo "        Berkeley DB (--with-dlz-bdb)"
Petr Menšík 6e9104
@@ -5700,6 +5767,8 @@ report() {
Petr Menšík 6e9104
 	echo "    ECDSA algorithm support (--with-ecdsa)"
Petr Menšík 6e9104
     test "X$CRYPTO" = "X" -o "yes" = "$OPENSSL_ED25519" -o "yes" = "$PKCS11_ED25519" || \
Petr Menšík 6e9104
 	echo "    EDDSA algorithm support (--with-eddsa)"
Petr Menšík 6e9104
+    test "yes" = "$want_crypto_rand" || \
Petr Menšík 6e9104
+        echo "    Crypto provider entropy source (--enable-crypto-rand)"
Petr Menšík 6e9104
 
Petr Menšík 6e9104
     test "yes" = "$enable_seccomp" || \
Petr Menšík 6e9104
 	echo "    Use libseccomp system call filtering (--enable-seccomp)"
Petr Menšík 6e9104
diff --git a/lib/dns/dst_api.c b/lib/dns/dst_api.c
Petr Menšík 6e9104
index dbece0a..803e7b3 100644
Petr Menšík 6e9104
--- a/lib/dns/dst_api.c
Petr Menšík 6e9104
+++ b/lib/dns/dst_api.c
Petr Menšík 6e9104
@@ -274,6 +274,12 @@ dst_lib_init2(isc_mem_t *mctx, isc_entropy_t *ectx,
Petr Menšík 6e9104
 #ifdef GSSAPI
Petr Menšík 6e9104
 	RETERR(dst__gssapi_init(&dst_t_func[DST_ALG_GSSAPI]));
Petr Menšík 6e9104
 #endif
Petr Menšík 6e9104
+#if defined(OPENSSL) || defined(PKCS11CRYPTO)
Petr Menšík 6e9104
+#ifdef ISC_PLATFORM_CRYPTORANDOM
Petr Menšík 6e9104
+	if (dst_entropy_pool != NULL)
Petr Menšík 6e9104
+		isc_entropy_sethook(dst_random_getdata);
Petr Menšík 6e9104
+#endif
Petr Menšík 6e9104
+#endif /* defined(OPENSSL) || defined(PKCS11CRYPTO) */
Petr Menšík 6e9104
 	dst_initialized = ISC_TRUE;
Petr Menšík 6e9104
 	return (ISC_R_SUCCESS);
Petr Menšík 6e9104
 
Petr Menšík 6e9104
@@ -293,11 +299,19 @@ dst_lib_destroy(void) {
Petr Menšík 6e9104
 	for (i = 0; i < DST_MAX_ALGS; i++)
Petr Menšík 6e9104
 		if (dst_t_func[i] != NULL && dst_t_func[i]->cleanup != NULL)
Petr Menšík 6e9104
 			dst_t_func[i]->cleanup();
Petr Menšík 6e9104
+#if defined(OPENSSL) || defined(PKCS11CRYPTO)
Petr Menšík 6e9104
+#ifdef ISC_PLATFORM_CRYPTORANDOM
Petr Menšík 6e9104
+	if (dst_entropy_pool != NULL) {
Petr Menšík 6e9104
+		isc_entropy_usehook(dst_entropy_pool, ISC_FALSE);
Petr Menšík 6e9104
+		isc_entropy_sethook(NULL);
Petr Menšík 6e9104
+	}
Petr Menšík 6e9104
+#endif
Petr Menšík 6e9104
 #ifdef OPENSSL
Petr Menšík 6e9104
 	dst__openssl_destroy();
Petr Menšík 6e9104
 #elif PKCS11CRYPTO
Petr Menšík 6e9104
 	(void) dst__pkcs11_destroy();
Petr Menšík 6e9104
 #endif /* if OPENSSL, elif PKCS11CRYPTO */
Petr Menšík 6e9104
+#endif /* defined(OPENSSL) || defined(PKCS11CRYPTO) */
Petr Menšík 6e9104
 	if (dst__memory_pool != NULL)
Petr Menšík 6e9104
 		isc_mem_detach(&dst__memory_pool);
Petr Menšík 6e9104
 	if (dst_entropy_pool != NULL)
Petr Menšík 6e9104
@@ -2000,13 +2014,17 @@ dst__entropy_getdata(void *buf, unsigned int len, isc_boolean_t pseudo) {
Petr Menšík 6e9104
 		flags &= ~ISC_ENTROPY_GOODONLY;
Petr Menšík 6e9104
 	else
Petr Menšík 6e9104
 		flags |= ISC_ENTROPY_BLOCKING;
Petr Menšík 6e9104
+#ifdef ISC_PLATFORM_CRYPTORANDOM
Petr Menšík 6e9104
+	return (dst_random_getdata(buf, len, NULL, flags));
Petr Menšík 6e9104
+#else
Petr Menšík 6e9104
 	return (isc_entropy_getdata(dst_entropy_pool, buf, len, NULL, flags));
Petr Menšík 6e9104
+#endif
Petr Menšík 6e9104
 #endif /* PKCS11CRYPTO */
Petr Menšík 6e9104
 }
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 unsigned int
Petr Menšík 6e9104
 dst__entropy_status(void) {
Petr Menšík 6e9104
-#ifndef PKCS11CRYPTO
Petr Menšík 6e9104
+#if !defined(PKCS11CRYPTO) && !defined(ISC_PLATFORM_CRYPTORANDOM)
Petr Menšík 6e9104
 #ifdef GSSAPI
Petr Menšík 6e9104
 	unsigned int flags = dst_entropy_flags;
Petr Menšík 6e9104
 	isc_result_t ret;
Petr Menšík 6e9104
@@ -2029,6 +2047,7 @@ dst__entropy_status(void) {
Petr Menšík 6e9104
 #endif
Petr Menšík 6e9104
 	return (isc_entropy_status(dst_entropy_pool));
Petr Menšík 6e9104
 #else
Petr Menšík 6e9104
+	/* Doesn't matter as it is not used in this case. */
Petr Menšík 6e9104
 	return (0);
Petr Menšík 6e9104
 #endif
Petr Menšík 6e9104
 }
Petr Menšík 6e9104
diff --git a/lib/dns/include/dst/dst.h b/lib/dns/include/dst/dst.h
Petr Menšík 6e9104
index fcc7b47..d9b6ab6 100644
Petr Menšík 6e9104
--- a/lib/dns/include/dst/dst.h
Petr Menšík 6e9104
+++ b/lib/dns/include/dst/dst.h
Petr Menšík 6e9104
@@ -157,6 +157,14 @@ dst_lib_destroy(void);
Petr Menšík 6e9104
  * Releases all resources allocated by DST.
Petr Menšík 6e9104
  */
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+isc_result_t
Petr Menšík 6e9104
+dst_random_getdata(void *data, unsigned int length,
Petr Menšík 6e9104
+		   unsigned int *returned, unsigned int flags);
Petr Menšík 6e9104
+/*%<
Petr Menšík 6e9104
+ * \brief Return data from the crypto random generator.
Petr Menšík 6e9104
+ * Specialization of isc_entropy_getdata().
Petr Menšík 6e9104
+ */
Petr Menšík 6e9104
+
Petr Menšík 6e9104
 isc_boolean_t
Petr Menšík 6e9104
 dst_algorithm_supported(unsigned int alg);
Petr Menšík 6e9104
 /*%<
Petr Menšík 6e9104
diff --git a/lib/dns/lib.c b/lib/dns/lib.c
Petr Menšík 6e9104
index 53237d5..c6d83e9 100644
Petr Menšík 6e9104
--- a/lib/dns/lib.c
Petr Menšík 6e9104
+++ b/lib/dns/lib.c
Petr Menšík 6e9104
@@ -9,14 +9,13 @@
Petr Menšík 6e9104
  * information regarding copyright ownership.
Petr Menšík 6e9104
  */
Petr Menšík 6e9104
 
Petr Menšík 6e9104
-/* $Id: lib.c,v 1.19 2009/09/03 00:12:23 each Exp $ */
Petr Menšík 6e9104
-
Petr Menšík 6e9104
 /*! \file */
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 #include <config.h>
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 #include <stddef.h>
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+#include <isc/entropy.h>
Petr Menšík 6e9104
 #include <isc/hash.h>
Petr Menšík 6e9104
 #include <isc/mem.h>
Petr Menšík 6e9104
 #include <isc/msgcat.h>
Petr Menšík 6e9104
@@ -77,6 +76,7 @@ static unsigned int references = 0;
Petr Menšík 6e9104
 static void
Petr Menšík 6e9104
 initialize(void) {
Petr Menšík 6e9104
 	isc_result_t result;
Petr Menšík 6e9104
+	isc_entropy_t *ectx = NULL;
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	REQUIRE(initialize_done == ISC_FALSE);
Petr Menšík 6e9104
 
Petr Menšík 6e9104
@@ -87,11 +87,14 @@ initialize(void) {
Petr Menšík 6e9104
 	result = dns_ecdb_register(dns_g_mctx, &dbimp);
Petr Menšík 6e9104
 	if (result != ISC_R_SUCCESS)
Petr Menšík 6e9104
 		goto cleanup_mctx;
Petr Menšík 6e9104
-	result = isc_hash_create(dns_g_mctx, NULL, DNS_NAME_MAXWIRE);
Petr Menšík 6e9104
+	result = isc_entropy_create(dns_g_mctx, &ectx);
Petr Menšík 6e9104
 	if (result != ISC_R_SUCCESS)
Petr Menšík 6e9104
 		goto cleanup_db;
Petr Menšík 6e9104
+	result = isc_hash_create(dns_g_mctx, NULL, DNS_NAME_MAXWIRE);
Petr Menšík 6e9104
+	if (result != ISC_R_SUCCESS)
Petr Menšík 6e9104
+		goto cleanup_ectx;
Petr Menšík 6e9104
 
Petr Menšík 6e9104
-	result = dst_lib_init(dns_g_mctx, NULL, 0);
Petr Menšík 6e9104
+	result = dst_lib_init(dns_g_mctx, ectx, 0);
Petr Menšík 6e9104
 	if (result != ISC_R_SUCCESS)
Petr Menšík 6e9104
 		goto cleanup_hash;
Petr Menšík 6e9104
 
Petr Menšík 6e9104
@@ -99,11 +102,17 @@ initialize(void) {
Petr Menšík 6e9104
 	if (result != ISC_R_SUCCESS)
Petr Menšík 6e9104
 		goto cleanup_dst;
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+	isc_hash_init();
Petr Menšík 6e9104
+	isc_entropy_detach(&ectx);
Petr Menšík 6e9104
+
Petr Menšík 6e9104
 	initialize_done = ISC_TRUE;
Petr Menšík 6e9104
 	return;
Petr Menšík 6e9104
 
Petr Menšík 6e9104
   cleanup_dst:
Petr Menšík 6e9104
 	dst_lib_destroy();
Petr Menšík 6e9104
+  cleanup_ectx:
Petr Menšík 6e9104
+	if (ectx != NULL)
Petr Menšík 6e9104
+		isc_entropy_detach(&ectx);
Petr Menšík 6e9104
   cleanup_hash:
Petr Menšík 6e9104
 	isc_hash_destroy();
Petr Menšík 6e9104
   cleanup_db:
Petr Menšík 6e9104
diff --git a/lib/dns/openssl_link.c b/lib/dns/openssl_link.c
Petr Menšík 6e9104
index ec6dc7f..c1e1bde 100644
Petr Menšík 6e9104
--- a/lib/dns/openssl_link.c
Petr Menšík 6e9104
+++ b/lib/dns/openssl_link.c
Petr Menšík 6e9104
@@ -31,6 +31,7 @@
Petr Menšík 6e9104
 #include <isc/mem.h>
Petr Menšík 6e9104
 #include <isc/mutex.h>
Petr Menšík 6e9104
 #include <isc/mutexblock.h>
Petr Menšík 6e9104
+#include <isc/platform.h>
Petr Menšík 6e9104
 #include <isc/string.h>
Petr Menšík 6e9104
 #include <isc/thread.h>
Petr Menšík 6e9104
 #include <isc/util.h>
Petr Menšík 6e9104
@@ -46,8 +47,6 @@
Petr Menšík 6e9104
 #include <openssl/engine.h>
Petr Menšík 6e9104
 #endif
Petr Menšík 6e9104
 
Petr Menšík 6e9104
-static RAND_METHOD *rm = NULL;
Petr Menšík 6e9104
-
Petr Menšík 6e9104
 #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
Petr Menšík 6e9104
 static isc_mutex_t *locks = NULL;
Petr Menšík 6e9104
 static int nlocks;
Petr Menšík 6e9104
@@ -57,6 +56,9 @@ static int nlocks;
Petr Menšík 6e9104
 static ENGINE *e = NULL;
Petr Menšík 6e9104
 #endif
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+#ifndef ISC_PLATFORM_CRYPTORANDOM
Petr Menšík 6e9104
+static RAND_METHOD *rm = NULL;
Petr Menšík 6e9104
+
Petr Menšík 6e9104
 static int
Petr Menšík 6e9104
 entropy_get(unsigned char *buf, int num) {
Petr Menšík 6e9104
 	isc_result_t result;
Petr Menšík 6e9104
@@ -102,6 +104,7 @@ entropy_add(const void *buf, int num, double entropy) {
Petr Menšík 6e9104
 	return (1);
Petr Menšík 6e9104
 }
Petr Menšík 6e9104
 #endif
Petr Menšík 6e9104
+#endif /* !ISC_PLATFORM_CRYPTORANDOM */
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 #if OPENSSL_VERSION_NUMBER >= 0x10000000L && OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
Petr Menšík 6e9104
 static void
Petr Menšík 6e9104
@@ -190,7 +193,7 @@ _set_thread_id(CRYPTO_THREADID *id)
Petr Menšík 6e9104
 isc_result_t
Petr Menšík 6e9104
 dst__openssl_init(const char *engine) {
Petr Menšík 6e9104
 	isc_result_t result;
Petr Menšík 6e9104
-#if !defined(OPENSSL_NO_ENGINE)
Petr Menšík 6e9104
+#if !defined(OPENSSL_NO_ENGINE) && !defined(ISC_PLATFORM_CRYPTORANDOM)
Petr Menšík 6e9104
 	ENGINE *re;
Petr Menšík 6e9104
 #else
Petr Menšík 6e9104
 	UNUSED(engine);
Petr Menšík 6e9104
@@ -220,6 +223,7 @@ dst__openssl_init(const char *engine) {
Petr Menšík 6e9104
 	ERR_load_crypto_strings();
Petr Menšík 6e9104
 #endif
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+#ifndef ISC_PLATFORM_CRYPTORANDOM
Petr Menšík 6e9104
 	rm = mem_alloc(sizeof(RAND_METHOD) FILELINE);
Petr Menšík 6e9104
 	if (rm == NULL) {
Petr Menšík 6e9104
 		result = ISC_R_NOMEMORY;
Petr Menšík 6e9104
@@ -231,6 +235,7 @@ dst__openssl_init(const char *engine) {
Petr Menšík 6e9104
 	rm->add = entropy_add;
Petr Menšík 6e9104
 	rm->pseudorand = entropy_getpseudo;
Petr Menšík 6e9104
 	rm->status = entropy_status;
Petr Menšík 6e9104
+#endif
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 #if !defined(OPENSSL_NO_ENGINE)
Petr Menšík 6e9104
 #if !defined(CONF_MFLAGS_DEFAULT_SECTION)
Petr Menšík 6e9104
@@ -264,6 +269,7 @@ dst__openssl_init(const char *engine) {
Petr Menšík 6e9104
 		}
Petr Menšík 6e9104
 	}
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+#ifndef ISC_PLATFORM_CRYPTORANDOM
Petr Menšík 6e9104
 	re = ENGINE_get_default_RAND();
Petr Menšík 6e9104
 	if (re == NULL) {
Petr Menšík 6e9104
 		re = ENGINE_new();
Petr Menšík 6e9104
@@ -276,9 +282,21 @@ dst__openssl_init(const char *engine) {
Petr Menšík 6e9104
 		ENGINE_free(re);
Petr Menšík 6e9104
 	} else
Petr Menšík 6e9104
 		ENGINE_finish(re);
Petr Menšík 6e9104
+#endif
Petr Menšík 6e9104
 #else
Petr Menšík 6e9104
+#ifndef ISC_PLATFORM_CRYPTORANDOM
Petr Menšík 6e9104
 	RAND_set_rand_method(rm);
Petr Menšík 6e9104
+#endif
Petr Menšík 6e9104
 #endif /* !defined(OPENSSL_NO_ENGINE) */
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+	/* Protect ourselves against unseeded PRNG */
Petr Menšík 6e9104
+	if (RAND_status() != 1) {
Petr Menšík 6e9104
+		FATAL_ERROR(__FILE__, __LINE__,
Petr Menšík 6e9104
+			    "OpenSSL pseudorandom number generator "
Petr Menšík 6e9104
+			    "cannot be initialized (see the `PRNG not "
Petr Menšík 6e9104
+			    "seeded' message in the OpenSSL FAQ)");
Petr Menšík 6e9104
+	}
Petr Menšík 6e9104
+
Petr Menšík 6e9104
 	return (ISC_R_SUCCESS);
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 #if !defined(OPENSSL_NO_ENGINE)
Petr Menšík 6e9104
@@ -286,10 +304,14 @@ dst__openssl_init(const char *engine) {
Petr Menšík 6e9104
 	if (e != NULL)
Petr Menšík 6e9104
 		ENGINE_free(e);
Petr Menšík 6e9104
 	e = NULL;
Petr Menšík 6e9104
+#ifndef ISC_PLATFORM_CRYPTORANDOM
Petr Menšík 6e9104
 	mem_free(rm FILELINE);
Petr Menšík 6e9104
 	rm = NULL;
Petr Menšík 6e9104
 #endif
Petr Menšík 6e9104
+#endif
Petr Menšík 6e9104
+#ifndef ISC_PLATFORM_CRYPTORANDOM
Petr Menšík 6e9104
  cleanup_mutexinit:
Petr Menšík 6e9104
+#endif
Petr Menšík 6e9104
 #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
Petr Menšík 6e9104
 	CRYPTO_set_locking_callback(NULL);
Petr Menšík 6e9104
 	DESTROYMUTEXBLOCK(locks, nlocks);
Petr Menšík 6e9104
@@ -304,14 +326,17 @@ void
Petr Menšík 6e9104
 dst__openssl_destroy(void) {
Petr Menšík 6e9104
 #if !defined(LIBRESSL_VERSION_NUMBER) && (OPENSSL_VERSION_NUMBER >= 0x10100000L)
Petr Menšík 6e9104
 	OPENSSL_cleanup();
Petr Menšík 6e9104
+#ifndef ISC_PLATFORM_CRYPTORANDOM
Petr Menšík 6e9104
 	if (rm != NULL) {
Petr Menšík 6e9104
 		mem_free(rm FILELINE);
Petr Menšík 6e9104
 		rm = NULL;
Petr Menšík 6e9104
 	}
Petr Menšík 6e9104
+#endif
Petr Menšík 6e9104
 #else
Petr Menšík 6e9104
 	/*
Petr Menšík 6e9104
 	 * Sequence taken from apps_shutdown() in <apps/apps.h>.
Petr Menšík 6e9104
 	 */
Petr Menšík 6e9104
+#ifndef ISC_PLATFORM_CRYPTORANDOM
Petr Menšík 6e9104
 	if (rm != NULL) {
Petr Menšík 6e9104
 #if OPENSSL_VERSION_NUMBER >= 0x00907000L
Petr Menšík 6e9104
 		RAND_cleanup();
Petr Menšík 6e9104
@@ -319,6 +344,7 @@ dst__openssl_destroy(void) {
Petr Menšík 6e9104
 		mem_free(rm FILELINE);
Petr Menšík 6e9104
 		rm = NULL;
Petr Menšík 6e9104
 	}
Petr Menšík 6e9104
+#endif
Petr Menšík 6e9104
 #if (OPENSSL_VERSION_NUMBER >= 0x00907000L)
Petr Menšík 6e9104
 	CONF_modules_free();
Petr Menšík 6e9104
 #endif
Petr Menšík 6e9104
@@ -454,11 +480,45 @@ dst__openssl_getengine(const char *engine) {
Petr Menšík 6e9104
 }
Petr Menšík 6e9104
 #endif
Petr Menšík 6e9104
 
Petr Menšík 6e9104
-#else /* OPENSSL */
Petr Menšík 6e9104
+isc_result_t
Petr Menšík 6e9104
+dst_random_getdata(void *data, unsigned int length,
Petr Menšík 6e9104
+		   unsigned int *returned, unsigned int flags) {
Petr Menšík 6e9104
+#ifdef ISC_PLATFORM_CRYPTORANDOM
Petr Menšík 6e9104
+#ifndef DONT_REQUIRE_DST_LIB_INIT
Petr Menšík 6e9104
+	INSIST(dst__memory_pool != NULL);
Petr Menšík 6e9104
+#endif
Petr Menšík 6e9104
+	REQUIRE(data != NULL);
Petr Menšík 6e9104
+	REQUIRE(length > 0);
Petr Menšík 6e9104
 
Petr Menšík 6e9104
-#include <isc/util.h>
Petr Menšík 6e9104
+#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
Petr Menšík 6e9104
+	if ((flags & ISC_ENTROPY_GOODONLY) == 0) {
Petr Menšík 6e9104
+		if (RAND_pseudo_bytes((unsigned char *)data, (int)length) < 0)
Petr Menšík 6e9104
+			return (dst__openssl_toresult2("RAND_pseudo_bytes",
Petr Menšík 6e9104
+						       DST_R_OPENSSLFAILURE));
Petr Menšík 6e9104
+	} else {
Petr Menšík 6e9104
+		if (RAND_bytes((unsigned char *)data, (int)length) != 1)
Petr Menšík 6e9104
+			return (dst__openssl_toresult2("RAND_bytes",
Petr Menšík 6e9104
+						       DST_R_OPENSSLFAILURE));
Petr Menšík 6e9104
+	}
Petr Menšík 6e9104
+#else
Petr Menšík 6e9104
+	UNUSED(flags);
Petr Menšík 6e9104
 
Petr Menšík 6e9104
-EMPTY_TRANSLATION_UNIT
Petr Menšík 6e9104
+	if (RAND_bytes((unsigned char *)data, (int)length) != 1)
Petr Menšík 6e9104
+		return (dst__openssl_toresult2("RAND_bytes",
Petr Menšík 6e9104
+					       DST_R_OPENSSLFAILURE));
Petr Menšík 6e9104
+#endif
Petr Menšík 6e9104
+	if (returned != NULL)
Petr Menšík 6e9104
+		*returned = length;
Petr Menšík 6e9104
+	return (ISC_R_SUCCESS);
Petr Menšík 6e9104
+#else
Petr Menšík 6e9104
+	UNUSED(data);
Petr Menšík 6e9104
+	UNUSED(length);
Petr Menšík 6e9104
+	UNUSED(returned);
Petr Menšík 6e9104
+	UNUSED(flags);
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+	return (ISC_R_NOTIMPLEMENTED);
Petr Menšík 6e9104
+#endif
Petr Menšík 6e9104
+}
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 #endif /* OPENSSL */
Petr Menšík 6e9104
 /*! \file */
Petr Menšík 6e9104
diff --git a/lib/dns/pkcs11.c b/lib/dns/pkcs11.c
Petr Menšík 6e9104
index 5a2c502..8eaef53 100644
Petr Menšík 6e9104
--- a/lib/dns/pkcs11.c
Petr Menšík 6e9104
+++ b/lib/dns/pkcs11.c
Petr Menšík 6e9104
@@ -13,12 +13,15 @@
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 #include <config.h>
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+#include <isc/util.h>
Petr Menšík 6e9104
+
Petr Menšík 6e9104
 #include <dns/log.h>
Petr Menšík 6e9104
 #include <dns/result.h>
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 #include <pk11/pk11.h>
Petr Menšík 6e9104
 #include <pk11/internal.h>
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+#include "dst_internal.h"
Petr Menšík 6e9104
 #include "dst_pkcs11.h"
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 isc_result_t
Petr Menšík 6e9104
@@ -34,12 +37,32 @@ dst__pkcs11_toresult(const char *funcname, const char *file, int line,
Petr Menšík 6e9104
 	return (fallback);
Petr Menšík 6e9104
 }
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+isc_result_t
Petr Menšík 6e9104
+dst_random_getdata(void *data, unsigned int length,
Petr Menšík 6e9104
+		   unsigned int *returned, unsigned int flags) {
Petr Menšík 6e9104
+#ifdef ISC_PLATFORM_CRYPTORANDOM
Petr Menšík 6e9104
+	isc_result_t ret;
Petr Menšík 6e9104
 
Petr Menšík 6e9104
-#else /* PKCS11CRYPTO */
Petr Menšík 6e9104
+#ifndef DONT_REQUIRE_DST_LIB_INIT
Petr Menšík 6e9104
+	INSIST(dst__memory_pool != NULL);
Petr Menšík 6e9104
+#endif
Petr Menšík 6e9104
+	REQUIRE(data != NULL);
Petr Menšík 6e9104
+	REQUIRE(length > 0);
Petr Menšík 6e9104
+	UNUSED(flags);
Petr Menšík 6e9104
 
Petr Menšík 6e9104
-#include <isc/util.h>
Petr Menšík 6e9104
+	ret = pk11_rand_bytes(data, (int) length);
Petr Menšík 6e9104
+	if ((ret == ISC_R_SUCCESS) && (returned != NULL))
Petr Menšík 6e9104
+		*returned = length;
Petr Menšík 6e9104
+	return (ret);
Petr Menšík 6e9104
+#else
Petr Menšík 6e9104
+	UNUSED(data);
Petr Menšík 6e9104
+	UNUSED(length);
Petr Menšík 6e9104
+	UNUSED(returned);
Petr Menšík 6e9104
+	UNUSED(flags);
Petr Menšík 6e9104
 
Petr Menšík 6e9104
-EMPTY_TRANSLATION_UNIT
Petr Menšík 6e9104
+	return (ISC_R_NOTIMPLEMENTED);
Petr Menšík 6e9104
+#endif
Petr Menšík 6e9104
+}
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 #endif /* PKCS11CRYPTO */
Petr Menšík 6e9104
 /*! \file */
Petr Menšík 6e9104
diff --git a/lib/dns/tests/Atffile b/lib/dns/tests/Atffile
Petr Menšík 6e9104
index 953082d..603c4b5 100644
Petr Menšík 6e9104
--- a/lib/dns/tests/Atffile
Petr Menšík 6e9104
+++ b/lib/dns/tests/Atffile
Petr Menšík 6e9104
@@ -10,6 +10,7 @@ tp: dbversion_test
Petr Menšík 6e9104
 tp: dh_test
Petr Menšík 6e9104
 tp: dispatch_test
Petr Menšík 6e9104
 tp: dnstap_test
Petr Menšík 6e9104
+tp: dstrandom_test
Petr Menšík 6e9104
 tp: dst_test
Petr Menšík 6e9104
 tp: geoip_test
Petr Menšík 6e9104
 tp: gost_test
Petr Menšík 6e9104
diff --git a/lib/dns/tests/Kyuafile b/lib/dns/tests/Kyuafile
Petr Menšík 6e9104
index 0353a73..cb2324d 100644
Petr Menšík 6e9104
--- a/lib/dns/tests/Kyuafile
Petr Menšík 6e9104
+++ b/lib/dns/tests/Kyuafile
Petr Menšík 6e9104
@@ -10,6 +10,7 @@ atf_test_program{name='dh_test'}
Petr Menšík 6e9104
 atf_test_program{name='dispatch_test'}
Petr Menšík 6e9104
 atf_test_program{name='dnstap_test'}
Petr Menšík 6e9104
 atf_test_program{name='dst_test'}
Petr Menšík 6e9104
+atf_test_program{name='dstrandom_test'}
Petr Menšík 6e9104
 atf_test_program{name='geoip_test'}
Petr Menšík 6e9104
 atf_test_program{name='gost_test'}
Petr Menšík 6e9104
 atf_test_program{name='keytable_test'}
Petr Menšík 6e9104
diff --git a/lib/dns/tests/Makefile.in b/lib/dns/tests/Makefile.in
Petr Menšík 6e9104
index 58fa872..625e809 100644
Petr Menšík 6e9104
--- a/lib/dns/tests/Makefile.in
Petr Menšík 6e9104
+++ b/lib/dns/tests/Makefile.in
Petr Menšík 6e9104
@@ -40,6 +40,7 @@ SRCS =		acl_test.c \
Petr Menšík 6e9104
 		dnstap_test.c \
Petr Menšík 6e9104
 		dst_test.c \
Petr Menšík 6e9104
 		dnstest.c \
Petr Menšík 6e9104
+		dstrandom_test.c \
Petr Menšík 6e9104
 		geoip_test.c \
Petr Menšík 6e9104
 		gost_test.c \
Petr Menšík 6e9104
 		keytable_test.c \
Petr Menšík 6e9104
@@ -71,6 +72,7 @@ TARGETS =	acl_test@EXEEXT@ \
Petr Menšík 6e9104
 		dh_test@EXEEXT@ \
Petr Menšík 6e9104
 		dispatch_test@EXEEXT@ \
Petr Menšík 6e9104
 		dnstap_test@EXEEXT@ \
Petr Menšík 6e9104
+		dstrandom_test@EXEEXT@ \
Petr Menšík 6e9104
 		dst_test@EXEEXT@ \
Petr Menšík 6e9104
 		geoip_test@EXEEXT@ \
Petr Menšík 6e9104
 		gost_test@EXEEXT@ \
Petr Menšík 6e9104
@@ -255,6 +257,11 @@ tsig_test@EXEEXT@: tsig_test.@O@ dnstest.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS}
Petr Menšík 6e9104
 			tsig_test.@O@ dnstest.@O@ ${DNSLIBS} \
Petr Menšík 6e9104
 			${ISCLIBS} ${LIBS}
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+dstrandom_test@EXEEXT@: dstrandom_test.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS}
Petr Menšík 6e9104
+	${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
Petr Menšík 6e9104
+			dstrandom_test.@O@ ${DNSLIBS} \
Petr Menšík 6e9104
+			${ISCLIBS} ${ISCPK11LIBS} ${LIBS}
Petr Menšík 6e9104
+
Petr Menšík 6e9104
 unit::
Petr Menšík 6e9104
 	sh ${top_builddir}/unit/unittest.sh
Petr Menšík 6e9104
 
Petr Menšík 6e9104
diff --git a/lib/dns/tests/dnstest.c b/lib/dns/tests/dnstest.c
Petr Menšík 6e9104
index fb9ef53..344a7c2 100644
Petr Menšík 6e9104
--- a/lib/dns/tests/dnstest.c
Petr Menšík 6e9104
+++ b/lib/dns/tests/dnstest.c
Petr Menšík 6e9104
@@ -120,12 +120,12 @@ dns_test_begin(FILE *logfile, isc_boolean_t start_managers) {
Petr Menšík 6e9104
 	CHECK(isc_mem_create(0, 0, &mctx));
Petr Menšík 6e9104
 	CHECK(isc_entropy_create(mctx, &ectx));
Petr Menšík 6e9104
 
Petr Menšík 6e9104
-	CHECK(isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE));
Petr Menšík 6e9104
-	hash_active = ISC_TRUE;
Petr Menšík 6e9104
-
Petr Menšík 6e9104
 	CHECK(dst_lib_init(mctx, ectx, ISC_ENTROPY_BLOCKING));
Petr Menšík 6e9104
 	dst_active = ISC_TRUE;
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+	CHECK(isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE));
Petr Menšík 6e9104
+	hash_active = ISC_TRUE;
Petr Menšík 6e9104
+
Petr Menšík 6e9104
 	if (logfile != NULL) {
Petr Menšík 6e9104
 		isc_logdestination_t destination;
Petr Menšík 6e9104
 		isc_logconfig_t *logconfig = NULL;
Petr Menšík 6e9104
@@ -169,14 +169,14 @@ dns_test_begin(FILE *logfile, isc_boolean_t start_managers) {
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 void
Petr Menšík 6e9104
 dns_test_end(void) {
Petr Menšík 6e9104
-	if (dst_active) {
Petr Menšík 6e9104
-		dst_lib_destroy();
Petr Menšík 6e9104
-		dst_active = ISC_FALSE;
Petr Menšík 6e9104
-	}
Petr Menšík 6e9104
 	if (hash_active) {
Petr Menšík 6e9104
 		isc_hash_destroy();
Petr Menšík 6e9104
 		hash_active = ISC_FALSE;
Petr Menšík 6e9104
 	}
Petr Menšík 6e9104
+	if (dst_active) {
Petr Menšík 6e9104
+		dst_lib_destroy();
Petr Menšík 6e9104
+		dst_active = ISC_FALSE;
Petr Menšík 6e9104
+	}
Petr Menšík 6e9104
 	if (ectx != NULL)
Petr Menšík 6e9104
 		isc_entropy_detach(&ectx);
Petr Menšík 6e9104
 
Petr Menšík 6e9104
diff --git a/lib/dns/tests/dstrandom_test.c b/lib/dns/tests/dstrandom_test.c
Petr Menšík 6e9104
new file mode 100644
Petr Menšík 6e9104
index 0000000..d2c72e7
Petr Menšík 6e9104
--- /dev/null
Petr Menšík 6e9104
+++ b/lib/dns/tests/dstrandom_test.c
Petr Menšík 6e9104
@@ -0,0 +1,105 @@
Petr Menšík 6e9104
+/*
Petr Menšík 6e9104
+ * Copyright (C) 2014  Internet Systems Consortium, Inc. ("ISC")
Petr Menšík 6e9104
+ *
Petr Menšík 6e9104
+ * Permission to use, copy, modify, and/or distribute this software for any
Petr Menšík 6e9104
+ * purpose with or without fee is hereby granted, provided that the above
Petr Menšík 6e9104
+ * copyright notice and this permission notice appear in all copies.
Petr Menšík 6e9104
+ *
Petr Menšík 6e9104
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
Petr Menšík 6e9104
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
Petr Menšík 6e9104
+ * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
Petr Menšík 6e9104
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
Petr Menšík 6e9104
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
Petr Menšík 6e9104
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
Petr Menšík 6e9104
+ * PERFORMANCE OF THIS SOFTWARE.
Petr Menšík 6e9104
+ */
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+/* $Id$ */
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+/*! \file */
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+#include <config.h>
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+#include <atf-c.h>
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+#include <stdio.h>
Petr Menšík 6e9104
+#include <string.h>
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+#include <isc/entropy.h>
Petr Menšík 6e9104
+#include <isc/mem.h>
Petr Menšík 6e9104
+#include <isc/platform.h>
Petr Menšík 6e9104
+#include <isc/util.h>
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+#include <dst/dst.h>
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+isc_mem_t *mctx = NULL;
Petr Menšík 6e9104
+isc_entropy_t *ectx = NULL;
Petr Menšík 6e9104
+unsigned char buffer[128];
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+ATF_TC(isc_entropy_getdata);
Petr Menšík 6e9104
+ATF_TC_HEAD(isc_entropy_getdata, tc) {
Petr Menšík 6e9104
+	atf_tc_set_md_var(tc, "descr",
Petr Menšík 6e9104
+			  "isc_entropy_getdata() examples");
Petr Menšík 6e9104
+	atf_tc_set_md_var(tc, "X-randomfile",
Petr Menšík 6e9104
+			  "testdata/dstrandom/random.data");
Petr Menšík 6e9104
+}
Petr Menšík 6e9104
+ATF_TC_BODY(isc_entropy_getdata, tc) {
Petr Menšík 6e9104
+	isc_result_t result;
Petr Menšík 6e9104
+	unsigned int returned, status;
Petr Menšík 6e9104
+	int ret;
Petr Menšík 6e9104
+	const char *randomfile = atf_tc_get_md_var(tc, "X-randomfile");
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+	isc_mem_debugging |= ISC_MEM_DEBUGRECORD;
Petr Menšík 6e9104
+	result = isc_mem_create(0, 0, &mctx);
Petr Menšík 6e9104
+	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
Petr Menšík 6e9104
+	result = isc_entropy_create(mctx, &ectx);
Petr Menšík 6e9104
+	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
Petr Menšík 6e9104
+	result = dst_lib_init(mctx, ectx, 0);
Petr Menšík 6e9104
+	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+#ifdef ISC_PLATFORM_CRYPTORANDOM
Petr Menšík 6e9104
+	isc_entropy_usehook(ectx, ISC_TRUE);
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+	returned = 0;
Petr Menšík 6e9104
+	result = isc_entropy_getdata(ectx, buffer, sizeof(buffer),
Petr Menšík 6e9104
+				     &returned, 0);
Petr Menšík 6e9104
+	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
Petr Menšík 6e9104
+	ATF_REQUIRE(returned == sizeof(buffer));
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+	status = isc_entropy_status(ectx);
Petr Menšík 6e9104
+	ATF_REQUIRE_EQ(status, 0);
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+	isc_entropy_usehook(ectx, ISC_FALSE);
Petr Menšík 6e9104
+#endif
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+	ret = chdir(TESTS);
Petr Menšík 6e9104
+	ATF_REQUIRE_EQ(ret, 0);
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+	result = isc_entropy_createfilesource(ectx, randomfile);
Petr Menšík 6e9104
+	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+	returned = 0;
Petr Menšík 6e9104
+	result = isc_entropy_getdata(ectx, buffer, sizeof(buffer),
Petr Menšík 6e9104
+				     &returned, 0);
Petr Menšík 6e9104
+	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
Petr Menšík 6e9104
+	ATF_REQUIRE(returned == sizeof(buffer));
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+	status = isc_entropy_status(ectx);
Petr Menšík 6e9104
+	ATF_REQUIRE(status > 0);
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+	dst_lib_destroy();
Petr Menšík 6e9104
+	isc_entropy_detach(&ectx);
Petr Menšík 6e9104
+	ATF_REQUIRE(ectx == NULL);
Petr Menšík 6e9104
+	isc_mem_destroy(&mctx);
Petr Menšík 6e9104
+	ATF_REQUIRE(mctx == NULL);
Petr Menšík 6e9104
+}
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+/*
Petr Menšík 6e9104
+ * Main
Petr Menšík 6e9104
+ */
Petr Menšík 6e9104
+ATF_TP_ADD_TCS(tp) {
Petr Menšík 6e9104
+	ATF_TP_ADD_TC(tp, isc_entropy_getdata);
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+	return (atf_no_error());
Petr Menšík 6e9104
+}
Petr Menšík 6e9104
+
Petr Menšík 6e9104
diff --git a/lib/dns/win32/libdns.def.in b/lib/dns/win32/libdns.def.in
Petr Menšík 6e9104
index d48eeb2..213e9d9 100644
Petr Menšík 6e9104
--- a/lib/dns/win32/libdns.def.in
Petr Menšík 6e9104
+++ b/lib/dns/win32/libdns.def.in
Petr Menšík 6e9104
@@ -1480,6 +1480,13 @@ dst_lib_destroy
Petr Menšík 6e9104
 dst_lib_init
Petr Menšík 6e9104
 dst_lib_init2
Petr Menšík 6e9104
 dst_lib_initmsgcat
Petr Menšík 6e9104
+@IF PKCS11
Petr Menšík 6e9104
+dst_random_getdata
Petr Menšík 6e9104
+@ELSE PKCS11
Petr Menšík 6e9104
+@IF OPENSSL
Petr Menšík 6e9104
+dst_random_getdata
Petr Menšík 6e9104
+@END OPENSSL
Petr Menšík 6e9104
+@END PKCS11
Petr Menšík 6e9104
 dst_region_computeid
Petr Menšík 6e9104
 dst_region_computerid
Petr Menšík 6e9104
 dst_result_register
Petr Menšík 6e9104
diff --git a/lib/isc/entropy.c b/lib/isc/entropy.c
Petr Menšík 6e9104
index 232094a..a85650b 100644
Petr Menšík 6e9104
--- a/lib/isc/entropy.c
Petr Menšík 6e9104
+++ b/lib/isc/entropy.c
Petr Menšík 6e9104
@@ -103,11 +103,15 @@ struct isc_entropy {
Petr Menšík 6e9104
 	isc_uint32_t			initialized;
Petr Menšík 6e9104
 	isc_uint32_t			initcount;
Petr Menšík 6e9104
 	isc_entropypool_t		pool;
Petr Menšík 6e9104
+	isc_boolean_t			usehook;
Petr Menšík 6e9104
 	unsigned int			nsources;
Petr Menšík 6e9104
 	isc_entropysource_t	       *nextsource;
Petr Menšík 6e9104
 	ISC_LIST(isc_entropysource_t)	sources;
Petr Menšík 6e9104
 };
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+/*% Global Hook */
Petr Menšík 6e9104
+static isc_entropy_getdata_t hook;
Petr Menšík 6e9104
+
Petr Menšík 6e9104
 /*% Sample Queue */
Petr Menšík 6e9104
 typedef struct {
Petr Menšík 6e9104
 	isc_uint32_t	last_time;	/*%< last time recorded */
Petr Menšík 6e9104
@@ -556,6 +560,11 @@ isc_entropy_getdata(isc_entropy_t *ent, void *data, unsigned int length,
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	LOCK(&ent->lock);
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+	if (ent->usehook && (hook != NULL)) {
Petr Menšík 6e9104
+		UNLOCK(&ent->lock);
Petr Menšík 6e9104
+		return (hook(data, length, returned, flags));
Petr Menšík 6e9104
+	}
Petr Menšík 6e9104
+
Petr Menšík 6e9104
 	remain = length;
Petr Menšík 6e9104
 	buf = data;
Petr Menšík 6e9104
 	total = 0;
Petr Menšík 6e9104
@@ -707,6 +716,7 @@ isc_entropy_create(isc_mem_t *mctx, isc_entropy_t **entp) {
Petr Menšík 6e9104
 	ent->refcnt = 1;
Petr Menšík 6e9104
 	ent->initialized = 0;
Petr Menšík 6e9104
 	ent->initcount = 0;
Petr Menšík 6e9104
+	ent->usehook = ISC_FALSE;
Petr Menšík 6e9104
 	ent->magic = ENTROPY_MAGIC;
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 	isc_entropypool_init(&ent->pool);
Petr Menšík 6e9104
@@ -1286,3 +1296,17 @@ isc_entropy_usebestsource(isc_entropy_t *ectx, isc_entropysource_t **source,
Petr Menšík 6e9104
 	 */
Petr Menšík 6e9104
 	return (final_result);
Petr Menšík 6e9104
 }
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+void
Petr Menšík 6e9104
+isc_entropy_usehook(isc_entropy_t *ectx, isc_boolean_t onoff) {
Petr Menšík 6e9104
+	REQUIRE(VALID_ENTROPY(ectx));
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+	LOCK(&ectx->lock);
Petr Menšík 6e9104
+	ectx->usehook = onoff;
Petr Menšík 6e9104
+	UNLOCK(&ectx->lock);
Petr Menšík 6e9104
+}
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+void
Petr Menšík 6e9104
+isc_entropy_sethook(isc_entropy_getdata_t myhook) {
Petr Menšík 6e9104
+	hook = myhook;
Petr Menšík 6e9104
+}
Petr Menšík 6e9104
diff --git a/lib/isc/include/isc/entropy.h b/lib/isc/include/isc/entropy.h
Petr Menšík 6e9104
index d52c43e..d9deb8a 100644
Petr Menšík 6e9104
--- a/lib/isc/include/isc/entropy.h
Petr Menšík 6e9104
+++ b/lib/isc/include/isc/entropy.h
Petr Menšík 6e9104
@@ -303,6 +303,18 @@ isc_entropy_usebestsource(isc_entropy_t *ectx, isc_entropysource_t **source,
Petr Menšík 6e9104
  *	isc_entropy_createcallbacksource().
Petr Menšík 6e9104
  */
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+void
Petr Menšík 6e9104
+isc_entropy_usehook(isc_entropy_t *ectx, isc_boolean_t onoff);
Petr Menšík 6e9104
+/*!<
Petr Menšík 6e9104
+ * \brief Mark/unmark the given entropy structure as being hooked.
Petr Menšík 6e9104
+ */
Petr Menšík 6e9104
+
Petr Menšík 6e9104
+void
Petr Menšík 6e9104
+isc_entropy_sethook(isc_entropy_getdata_t myhook);
Petr Menšík 6e9104
+/*!<
Petr Menšík 6e9104
+ * \brief Set the getdata hook (e.g., for a crypto random generator).
Petr Menšík 6e9104
+ */
Petr Menšík 6e9104
+
Petr Menšík 6e9104
 ISC_LANG_ENDDECLS
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 #endif /* ISC_ENTROPY_H */
Petr Menšík 6e9104
diff --git a/lib/isc/include/isc/platform.h.in b/lib/isc/include/isc/platform.h.in
Petr Menšík 6e9104
index d7a5bec..0166b79 100644
Petr Menšík 6e9104
--- a/lib/isc/include/isc/platform.h.in
Petr Menšík 6e9104
+++ b/lib/isc/include/isc/platform.h.in
Petr Menšík 6e9104
@@ -344,6 +344,11 @@
Petr Menšík 6e9104
  */
Petr Menšík 6e9104
 @ISC_PLATFORM_HAVESTRINGSH@
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+/*
Petr Menšík 6e9104
+ * Define if the random functions are provided by crypto.
Petr Menšík 6e9104
+ */
Petr Menšík 6e9104
+@ISC_PLATFORM_CRYPTORANDOM@
Petr Menšík 6e9104
+
Petr Menšík 6e9104
 /*
Petr Menšík 6e9104
  * Define if the hash functions must be provided by OpenSSL.
Petr Menšík 6e9104
  */
Petr Menšík 6e9104
diff --git a/lib/isc/include/isc/types.h b/lib/isc/include/isc/types.h
Petr Menšík 6e9104
index f161faf..dec577e 100644
Petr Menšík 6e9104
--- a/lib/isc/include/isc/types.h
Petr Menšík 6e9104
+++ b/lib/isc/include/isc/types.h
Petr Menšík 6e9104
@@ -93,6 +93,8 @@ typedef struct isc_time			isc_time_t;		/*%< Time */
Petr Menšík 6e9104
 typedef struct isc_timer		isc_timer_t;		/*%< Timer */
Petr Menšík 6e9104
 typedef struct isc_timermgr		isc_timermgr_t;		/*%< Timer Manager */
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+typedef isc_result_t (*isc_entropy_getdata_t)(void *, unsigned int,
Petr Menšík 6e9104
+					      unsigned int *, unsigned int);
Petr Menšík 6e9104
 typedef void (*isc_taskaction_t)(isc_task_t *, isc_event_t *);
Petr Menšík 6e9104
 typedef int (*isc_sockfdwatch_t)(isc_task_t *, isc_socket_t *, void *, int);
Petr Menšík 6e9104
 
Petr Menšík 6e9104
diff --git a/lib/isc/pk11.c b/lib/isc/pk11.c
Petr Menšík 6e9104
index 48e1031..74566c9 100644
Petr Menšík 6e9104
--- a/lib/isc/pk11.c
Petr Menšík 6e9104
+++ b/lib/isc/pk11.c
Petr Menšík 6e9104
@@ -327,14 +327,16 @@ pk11_rand_seed_fromfile(const char *randomfile) {
Petr Menšík 6e9104
 	ret = isc_stdio_open(randomfile, "r", &stream);
Petr Menšík 6e9104
 	if (ret != ISC_R_SUCCESS)
Petr Menšík 6e9104
 		goto cleanup;
Petr Menšík 6e9104
-	ret = isc_stdio_read(seed, 1, SEEDSIZE, stream, &cc);
Petr Menšík 6e9104
-	if (ret!= ISC_R_SUCCESS)
Petr Menšík 6e9104
-		goto cleanup;
Petr Menšík 6e9104
+	while (ret == ISC_R_SUCCESS) {
Petr Menšík 6e9104
+		ret = isc_stdio_read(seed, 1, SEEDSIZE, stream, &cc);
Petr Menšík 6e9104
+		if ((ret != ISC_R_SUCCESS) && (ret != ISC_R_EOF))
Petr Menšík 6e9104
+			goto cleanup;
Petr Menšík 6e9104
+		(void) pkcs_C_SeedRandom(ctx.session, seed, (CK_ULONG) cc);
Petr Menšík 6e9104
+	} 
Petr Menšík 6e9104
 	ret = isc_stdio_close(stream);
Petr Menšík 6e9104
 	stream = NULL;
Petr Menšík 6e9104
-	if (ret!= ISC_R_SUCCESS)
Petr Menšík 6e9104
+	if (ret != ISC_R_SUCCESS)
Petr Menšík 6e9104
 		goto cleanup;
Petr Menšík 6e9104
-	(void) pkcs_C_SeedRandom(ctx.session, seed, (CK_ULONG) cc);
Petr Menšík 6e9104
 
Petr Menšík 6e9104
     cleanup:
Petr Menšík 6e9104
 	if (stream != NULL)
Petr Menšík 6e9104
diff --git a/lib/isc/win32/include/isc/platform.h.in b/lib/isc/win32/include/isc/platform.h.in
Petr Menšík 6e9104
index de6a434..2c32782 100644
Petr Menšík 6e9104
--- a/lib/isc/win32/include/isc/platform.h.in
Petr Menšík 6e9104
+++ b/lib/isc/win32/include/isc/platform.h.in
Petr Menšík 6e9104
@@ -74,6 +74,11 @@
Petr Menšík 6e9104
 #define ISC_PLATFORM_NORETURN_PRE __declspec(noreturn)
Petr Menšík 6e9104
 #define ISC_PLATFORM_NORETURN_POST
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+/*
Petr Menšík 6e9104
+ * Define if the random functions are provided by crypto.
Petr Menšík 6e9104
+ */
Petr Menšík 6e9104
+@ISC_PLATFORM_CRYPTORANDOM@
Petr Menšík 6e9104
+
Petr Menšík 6e9104
 /*
Petr Menšík 6e9104
  * Define if the hash functions must be provided by OpenSSL.
Petr Menšík 6e9104
  */
Petr Menšík 6e9104
diff --git a/win32utils/Configure b/win32utils/Configure
Petr Menšík 6e9104
index e9f4680..79bb178 100644
Petr Menšík 6e9104
--- a/win32utils/Configure
Petr Menšík 6e9104
+++ b/win32utils/Configure
Petr Menšík 6e9104
@@ -381,6 +381,7 @@ my @substdefh = ("AES_CC",
Petr Menšík 6e9104
 my %configdefp;
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 my @substdefp = ("ISC_PLATFORM_BUSYWAITNOP",
Petr Menšík 6e9104
+                 "ISC_PLATFORM_CRYPTORANDOM",
Petr Menšík 6e9104
                  "ISC_PLATFORM_HAVEATOMICSTORE",
Petr Menšík 6e9104
                  "ISC_PLATFORM_HAVEATOMICSTOREQ",
Petr Menšík 6e9104
                  "ISC_PLATFORM_HAVECMPXCHG",
Petr Menšík 6e9104
@@ -509,7 +510,8 @@ my @allcond = (@substcond, "NOTYET", "NOLONGER");
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 # enable-xxx/disable-xxx
Petr Menšík 6e9104
 
Petr Menšík 6e9104
-my @enablelist = ("developer",
Petr Menšík 6e9104
+my @enablelist = ("crypto-rand",
Petr Menšík 6e9104
+                  "developer",
Petr Menšík 6e9104
                   "fixed-rrset",
Petr Menšík 6e9104
                   "intrinsics",
Petr Menšík 6e9104
                   "isc-spnego",
Petr Menšík 6e9104
@@ -571,6 +573,7 @@ my @help = (
Petr Menšík 6e9104
 "\nOptional Features:\n",
Petr Menšík 6e9104
 "  enable-intrinsics     enable instrinsic/atomic functions [default=yes]\n",
Petr Menšík 6e9104
 "  enable-native-pkcs11  use native PKCS#11 for all crypto [default=no]\n",
Petr Menšík 6e9104
+"  enable-crypto-rand    use crypto provider for random [default=yes]\n",
Petr Menšík 6e9104
 "  enable-openssl-hash   use OpenSSL for hash functions [default=yes]\n",
Petr Menšík 6e9104
 "  enable-isc-spnego     use SPNEGO from lib/dns [default=yes]\n",
Petr Menšík 6e9104
 "  enable-filter-aaaa    enable filtering of AAAA records [default=yes]\n",
Petr Menšík 6e9104
@@ -614,7 +617,9 @@ my $want_clean = "no";
Petr Menšík 6e9104
 my $want_unknown = "no";
Petr Menšík 6e9104
 my $unknown_value;
Petr Menšík 6e9104
 my $enable_intrinsics = "yes";
Petr Menšík 6e9104
+my $cryptolib = "";
Petr Menšík 6e9104
 my $enable_native_pkcs11 = "no";
Petr Menšík 6e9104
+my $enable_crypto_rand = "yes";
Petr Menšík 6e9104
 my $enable_openssl_hash = "auto";
Petr Menšík 6e9104
 my $enable_filter_aaaa = "yes";
Petr Menšík 6e9104
 my $enable_isc_spnego = "yes";
Petr Menšík 6e9104
@@ -823,6 +828,10 @@ sub myenable {
Petr Menšík 6e9104
         if ($val =~ /^yes$/i) {
Petr Menšík 6e9104
             $enable_native_pkcs11 = "yes";
Petr Menšík 6e9104
         }
Petr Menšík 6e9104
+    } elsif ($key =~ /^crypto-rand$/i) {
Petr Menšík 6e9104
+        if ($val =~ /^no$/i) {
Petr Menšík 6e9104
+            $enable_crypto_rand = "no";
Petr Menšík 6e9104
+        }
Petr Menšík 6e9104
     } elsif ($key =~ /^openssl-hash$/i) {
Petr Menšík 6e9104
         if ($val =~ /^yes$/i) {
Petr Menšík 6e9104
             $enable_openssl_hash = "yes";
Petr Menšík 6e9104
@@ -1106,6 +1115,11 @@ if ($verbose) {
Petr Menšík 6e9104
     } else {
Petr Menšík 6e9104
         print "native-pkcs11: disabled\n";
Petr Menšík 6e9104
     }
Petr Menšík 6e9104
+    if ($enable_crypto_rand eq "yes") {
Petr Menšík 6e9104
+        print "crypto-rand: enabled\n";
Petr Menšík 6e9104
+    } else {
Petr Menšík 6e9104
+        print "crypto-rand: disabled\n";
Petr Menšík 6e9104
+    }
Petr Menšík 6e9104
     if ($enable_openssl_hash eq "yes") {
Petr Menšík 6e9104
         print "openssl-hash: enabled\n";
Petr Menšík 6e9104
     } else {
Petr Menšík 6e9104
@@ -1449,6 +1463,7 @@ if ($enable_intrinsics eq "yes") {
Petr Menšík 6e9104
 
Petr Menšík 6e9104
 # enable-native-pkcs11
Petr Menšík 6e9104
 if ($enable_native_pkcs11 eq "yes") {
Petr Menšík 6e9104
+    $cryptolib = "pkcs11";
Petr Menšík 6e9104
     if ($use_openssl eq "auto") {
Petr Menšík 6e9104
         $use_openssl = "no";
Petr Menšík 6e9104
     }
Petr Menšík 6e9104
@@ -1658,6 +1673,7 @@ if ($use_openssl eq "yes") {
Petr Menšík 6e9104
         $openssl_dll = File::Spec->catdir($openssl_path, "@dirlist[0]");
Petr Menšík 6e9104
     }   
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+    $cryptolib = "openssl";
Petr Menšík 6e9104
     $configcond{"OPENSSL"} = 1;
Petr Menšík 6e9104
     $configdefd{"CRYPTO"} = "OPENSSL";
Petr Menšík 6e9104
     $configvar{"OPENSSL_PATH"} = "$openssl_path";
Petr Menšík 6e9104
@@ -2209,6 +2225,15 @@ if ($cookie_algorithm eq "sha1") {
Petr Menšík 6e9104
     die "Unrecognized cookie algorithm: $cookie_algorithm\n";
Petr Menšík 6e9104
 }
Petr Menšík 6e9104
 
Petr Menšík 6e9104
+# enable-crypto-rand
Petr Menšík 6e9104
+if ($enable_crypto_rand eq "yes") {
Petr Menšík 6e9104
+    if (($use_openssl eq "no") && ($enable_native_pkcs11 eq "no")) {
Petr Menšík 6e9104
+        die "No crypto provider for random functions\n";
Petr Menšík 6e9104
+    }
Petr Menšík 6e9104
+    $configdefp{"ISC_PLATFORM_CRYPTORANDOM"} = "\"$cryptolib\"";
Petr Menšík 6e9104
+}
Petr Menšík 6e9104
+print "Cryptographic library for DNSSEC: $cryptolib";
Petr Menšík 6e9104
+
Petr Menšík 6e9104
 # enable-openssl-hash
Petr Menšík 6e9104
 if ($enable_openssl_hash eq "yes") {
Petr Menšík 6e9104
     if ($use_openssl eq "no") {
Petr Menšík 6e9104
@@ -3531,6 +3556,7 @@ exit 0;
Petr Menšík 6e9104
 #  --enable-developer partially supported
Petr Menšík 6e9104
 #  --enable-newstats (9.9/9.9sub only)
Petr Menšík 6e9104
 #  --enable-native-pkcs11 supported
Petr Menšík 6e9104
+#  --enable-crypto-rand supported
Petr Menšík 6e9104
 #  --enable-openssl-version-check included without a way to disable it
Petr Menšík 6e9104
 #  --enable-openssl-hash supported
Petr Menšík 6e9104
 #  --enable-threads included without a way to disable it
Petr Menšík 6e9104
@@ -3556,6 +3582,7 @@ exit 0;
Petr Menšík 6e9104
 #  --with-gost supported
Petr Menšík 6e9104
 #  --with-aes supported
Petr Menšík 6e9104
 #  --with-cc-alg supported
Petr Menšík 6e9104
+#  --with-randomdev not supported on WIN32 (makes no sense)
Petr Menšík 6e9104
 #  --with-geoip supported
Petr Menšík 6e9104
 #  --with-gssapi supported with MIT (K)erberos (f)or (W)indows
Petr Menšík 6e9104
 #  --with-lmdb no supported on WIN32 (port is not reliable)
Petr Menšík 6e9104
-- 
Petr Menšík 6e9104
2.14.4
Petr Menšík 6e9104