Blob Blame History Raw
diff -up ntp-4.2.6p5/include/ntp.h.randomtx ntp-4.2.6p5/include/ntp.h
--- ntp-4.2.6p5/include/ntp.h.randomtx	2020-05-27 16:11:23.206229510 +0200
+++ ntp-4.2.6p5/include/ntp.h	2020-05-27 16:11:23.217229536 +0200
@@ -351,6 +351,7 @@ struct peer {
 	l_fp	dst;		/* destination timestamp */
 	l_fp	aorg;		/* origin timestamp */
 	l_fp	borg;		/* alternate origin timestamp */
+	l_fp	xorg;		/* hidden origin timestamp (client mode) */
 	double	offset;		/* peer clock offset */
 	double	delay;		/* peer roundtrip delay */
 	double	jitter;		/* peer jitter (squares) */
diff -up ntp-4.2.6p5/ntpd/ntp_proto.c.randomtx ntp-4.2.6p5/ntpd/ntp_proto.c
--- ntp-4.2.6p5/ntpd/ntp_proto.c.randomtx	2020-05-27 16:11:23.216229533 +0200
+++ ntp-4.2.6p5/ntpd/ntp_proto.c	2020-05-28 09:02:50.973320647 +0200
@@ -1563,14 +1563,14 @@ process_packet(
 	/*
 	 * Basic mode, otherwise known as the old fashioned way.
 	 *
-	 * t1 = p_org, t2 = p_rec, t3 = p_xmt, t4 = peer->dst
+	 * t1 = peer->xorg, t2 = p_rec, t3 = p_xmt, t4 = peer->dst
 	 */
 	} else {
 		ci = p_xmt;				/* t3 - t4 */
 		L_SUB(&ci, &peer->dst);
 		LFPTOD(&ci, t34);
 		ci = p_rec;				/* t2 - t1 */
-		L_SUB(&ci, &p_org);
+		L_SUB(&ci, &peer->xorg);
 		LFPTOD(&ci, t21);
 		p_del = fabs(t21 - t34);
 		p_offset = (t21 + t34) / 2.;
@@ -2942,6 +2942,16 @@ peer_xmit(
 	HTONL_FP(&peer->rec, &xpkt.org);
 	HTONL_FP(&peer->dst, &xpkt.rec);
 
+	/* Generate a random transmit timestamp in the client mode to
+	   make the server origin timestamp unpredictable */
+	if (peer->flip == 0 && peer->hmode == MODE_CLIENT) {
+		if (ntp_crypto_random_buf(&peer->aorg, sizeof (peer->aorg))) {
+			msyslog(LOG_ERR, "ntp_crypto_random_buf() failed.");
+			exit(1);
+		}
+		xpkt.precision = 32;
+	}
+
 	/*
 	 * If the received packet contains a MAC, the transmitted packet
 	 * is authenticated and contains a MAC. If not, the transmitted
@@ -2965,9 +2975,11 @@ peer_xmit(
 		 * Transmit a-priori timestamps
 		 */
 		get_systime(&xmt_tx);
+		peer->xorg = xmt_tx;
 		if (peer->flip == 0) {	/* basic mode */
-			peer->aorg = xmt_tx;
-			HTONL_FP(&xmt_tx, &xpkt.xmt);
+			if (peer->hmode != MODE_CLIENT)
+				peer->aorg = xmt_tx;
+			HTONL_FP(&peer->aorg, &xpkt.xmt);
 		} else {		/* interleaved modes */
 			if (peer->hmode == MODE_BROADCAST) { /* bcst */
 				HTONL_FP(&xmt_tx, &xpkt.xmt);
@@ -3266,9 +3278,11 @@ peer_xmit(
 	 * Transmit a-priori timestamps
 	 */
 	get_systime(&xmt_tx);
+	peer->xorg = xmt_tx;
 	if (peer->flip == 0) {		/* basic mode */
-		peer->aorg = xmt_tx;
-		HTONL_FP(&xmt_tx, &xpkt.xmt);
+		if (peer->hmode != MODE_CLIENT)
+			peer->aorg = xmt_tx;
+		HTONL_FP(&peer->aorg, &xpkt.xmt);
 	} else {			/* interleaved modes */
 		if (peer->hmode == MODE_BROADCAST) { /* bcst */
 			HTONL_FP(&xmt_tx, &xpkt.xmt);