Ensure we unpad in constant time for read pipelining
authorMatt Caswell <matt@openssl.org>
Tue, 16 Aug 2016 13:07:29 +0000 (14:07 +0100)
committerMatt Caswell <matt@openssl.org>
Tue, 16 Aug 2016 15:53:17 +0000 (16:53 +0100)
The read pipelining code broke constant time unpadding. See GitHub
issue #1438

Reviewed-by: Rich Salz <rsalz@openssl.org>
ssl/record/ssl3_record.c

index 5f9ce7a0653e60314181d3c776fde5c4d2c19d80..f1d6f72d837da4e4495b6b743d969211960bc9c6 100644 (file)
@@ -831,9 +831,15 @@ int tls1_enc(SSL *s, SSL3_RECORD *recs, unsigned int n_recs, int send)
             int tmpret;
             for (ctr = 0; ctr < n_recs; ctr++) {
                 tmpret = tls1_cbc_remove_padding(s, &recs[ctr], bs, mac_size);
-                if (tmpret == -1)
-                    return -1;
-                ret &= tmpret;
+                /*
+                 * If tmpret == 0 then this means publicly invalid so we can
+                 * short circuit things here. Otherwise we must respect constant
+                 * time behaviour.
+                 */
+                if (tmpret == 0)
+                    return 0;
+                ret = constant_time_select_int(constant_time_eq_int(tmpret, 1),
+                                               ret, -1);
             }
         }
         if (pad && !send) {