QUIC: fix decryption failure with larger PKN (draft -13)
authorPeter Wu <peter@lekensteyn.nl>
Mon, 17 Sep 2018 17:01:17 +0000 (19:01 +0200)
committerPeter Wu <peter@lekensteyn.nl>
Mon, 17 Sep 2018 17:54:22 +0000 (17:54 +0000)
The packet number prefix was missing.

Change-Id: Ia82e7d2131a364c8448084c77f638495da748213
Ping-Bug: 13881
Reviewed-on: https://code.wireshark.org/review/29704
Petri-Dish: Peter Wu <peter@lekensteyn.nl>
Reviewed-by: Peter Wu <peter@lekensteyn.nl>
Tested-by: Petri Dish Buildbot
epan/dissectors/packet-quic.c

index 4f17a119ba67178a4d225551861e3ef700c012f2..f73f5022c8526165fb6c5041312adacbd5d9022d 100644 (file)
@@ -520,6 +520,24 @@ quic_decrypt_packet_number(tvbuff_t *tvb, guint offset, quic_cipher *cipher,
     *pkn = g_htonl(pkt_pkn) >> (8 * (4 - pkn_len));
     return pkn_len;
 }
+
+static void
+quic_encode_packet_number(guint8 *output, guint32 pkn, guint pkn_len)
+{
+    switch (pkn_len) {
+    default:
+        output[0] = (guint8)pkn;
+        break;
+    case 2:
+        phton16(output, (guint16)pkn);
+        output[0] |= 0x80;
+        break;
+    case 4:
+        phton32(output, pkn);
+        output[0] |= 0xc0;
+        break;
+    }
+}
 #else /* !HAVE_LIBGCRYPT_AEAD */
 static inline guint
 quic_decrypt_packet_number(tvbuff_t *tvb _U_, guint offset _U_, quic_cipher *cipher _U_,
@@ -1277,9 +1295,7 @@ quic_decrypt_message(quic_cipher *cipher, tvbuff_t *head, guint header_length, g
     DISSECTOR_ASSERT(1 <= pkn_len && pkn_len <= 4);
     // copy header, but replace encrypted PKN by plaintext PKN.
     header = (guint8 *)tvb_memdup(wmem_packet_scope(), head, 0, header_length);
-    for (guint i = 0; i < pkn_len; i++) {
-        header[header_length - 1 - i] = (guint8)(packet_number >> (8 * i));
-    }
+    quic_encode_packet_number(header + header_length - pkn_len, (guint32)packet_number, pkn_len);
 
     /* Input is "header || ciphertext (buffer) || auth tag (16 bytes)" */
     buffer_length = tvb_captured_length_remaining(head, header_length + 16);