static int nts_rotate = 604800; /* 1 week */
static char *nts_trusted_cert_file = NULL;
+/* Number of clock updates needed to enable certificate time checks */
+static int no_cert_time_check = 0;
+
/* Flag disabling use of system trusted certificates */
static int no_system_cert = 0;
parse_int(p, &min_samples);
} else if (!strcasecmp(command, "minsources")) {
parse_int(p, &min_sources);
+ } else if (!strcasecmp(command, "nocerttimecheck")) {
+ parse_int(p, &no_cert_time_check);
} else if (!strcasecmp(command, "noclientlog")) {
no_client_log = parse_null(p);
} else if (!strcasecmp(command, "nosystemcert")) {
{
return no_system_cert;
}
+
+/* ================================================== */
+
+int
+CNF_GetNoCertTimeCheck(void)
+{
+ return no_cert_time_check;
+}
#include "util.h"
#include <gnutls/gnutls.h>
+#include <gnutls/x509.h>
#define INVALID_SOCK_FD (-8)
static int credentials_counter = 0;
+static int clock_updates = 0;
+
/* ================================================== */
static void
unsigned char alpn_name[sizeof (NKE_ALPN_NAME)];
gnutls_session_t session;
gnutls_datum_t alpn;
+ unsigned int flags;
int r;
r = gnutls_init(&session, GNUTLS_NONBLOCK | (server_mode ? GNUTLS_SERVER : GNUTLS_CLIENT));
r = gnutls_server_name_set(session, GNUTLS_NAME_DNS, server_name, strlen(server_name));
if (r < 0)
goto error;
- gnutls_session_set_verify_cert(session, server_name, 0);
+
+ flags = 0;
+
+ if (clock_updates < CNF_GetNoCertTimeCheck()) {
+ flags |= GNUTLS_VERIFY_DISABLE_TIME_CHECKS | GNUTLS_VERIFY_DISABLE_TRUSTED_TIME_CHECKS;
+ DEBUG_LOG("Disabled time checks");
+ }
+
+ gnutls_session_set_verify_cert(session, server_name, flags);
}
r = gnutls_priority_set(session, priority);
/* ================================================== */
+static void
+handle_step(struct timespec *raw, struct timespec *cooked, double dfreq,
+ double doffset, LCL_ChangeType change_type, void *anything)
+{
+ if (change_type != LCL_ChangeUnknownStep && clock_updates < INT_MAX)
+ clock_updates++;
+}
+
+/* ================================================== */
+
static int gnutls_initialised = 0;
static void
gnutls_global_set_time_function(get_time);
gnutls_initialised = 1;
+
+ LCL_AddParameterChangeHandler(handle_step, NULL);
}
/* ================================================== */
{
assert(gnutls_initialised);
+ LCL_RemoveParameterChangeHandler(handle_step, NULL);
+
gnutls_priority_deinit(priority_cache);
gnutls_global_deinit();
gnutls_initialised = 0;
#ifdef FEAT_NTS
#include <nts_ke_client.c>
+#include <local.h>
static void
prepare_response(NKSN_Instance session, int valid)
for (i = 0; i < sizeof conf / sizeof conf[0]; i++)
CNF_ParseLine(NULL, i + 1, conf[i]);
+ LCL_Initialise();
NKC_Initialise();
SCK_GetLoopbackIPAddress(AF_INET, &addr.ip_addr);
NKC_DestroyInstance(inst);
NKC_Finalise();
+ LCL_Finalise();
CNF_Finalise();
}
#else