]> git.ipfire.org Git - thirdparty/chrony.git/commitdiff
ntp: truncate MACs in NTPv4 packets
authorMiroslav Lichvar <mlichvar@redhat.com>
Tue, 29 Nov 2016 11:59:57 +0000 (12:59 +0100)
committerMiroslav Lichvar <mlichvar@redhat.com>
Fri, 2 Dec 2016 13:53:03 +0000 (14:53 +0100)
When sending an NTPv4 packet, truncate long MAC to 192 bits to follow
RFC 7822.

ntp_core.c

index 6a5701cca57e53e5054fa570e4fa2b54fe78c546..01c103f6687c241fd35f68702d0636005bb09034 100644 (file)
@@ -849,7 +849,7 @@ transmit_packet(NTP_Mode my_mode, /* The mode this machine wants to be */
                 )
 {
   NTP_Packet message;
-  int auth_len, length, ret, precision;
+  int auth_len, mac_len, length, ret, precision;
   struct timespec local_receive, local_transmit;
   NTP_int64 ts_fuzz;
 
@@ -979,8 +979,16 @@ transmit_packet(NTP_Mode my_mode, /* The mode this machine wants to be */
         DEBUG_LOG(LOGF_NtpCore, "Could not generate auth data with key %"PRIu32, key_id);
         return 0;
       }
+
       message.auth_keyid = htonl(key_id);
-      length += sizeof (message.auth_keyid) + auth_len;
+      mac_len = sizeof (message.auth_keyid) + auth_len;
+
+      /* Truncate MACs in NTPv4 packets to allow deterministic parsing
+         of extension fields (RFC 7822) */
+      if (version == 4 && mac_len > NTP_MAX_V4_MAC_LENGTH)
+        mac_len = NTP_MAX_V4_MAC_LENGTH;
+
+      length += mac_len;
     } else if (auth_mode == AUTH_MSSNTP) {
       /* MS-SNTP packets are signed (asynchronously) by ntp_signd */
       return NSD_SignAndSendPacket(key_id, &message, where_to, from, length);