Browse Source

LibTLS: Treat a close_notify before agreeing on a cipher suite as a handshake failure

Some TLS implementations (namely, AWS CloudFront) do this instead of
sending handshake_failure for some reason.
Luke 4 years ago
parent
commit
63a94deb43
1 changed files with 6 additions and 0 deletions
  1. 6 0
      Libraries/LibTLS/Record.cpp

+ 6 - 0
Libraries/LibTLS/Record.cpp

@@ -315,6 +315,12 @@ ssize_t TLSv12::handle_message(const ByteBuffer& buffer)
                 res += 2;
                 res += 2;
                 alert(AlertLevel::Critical, AlertDescription::CloseNotify);
                 alert(AlertLevel::Critical, AlertDescription::CloseNotify);
                 m_context.connection_finished = true;
                 m_context.connection_finished = true;
+                if (!m_context.cipher_spec_set) {
+                    // AWS CloudFront hits this.
+                    dbg() << "Server sent a close notify and we haven't agreed on a cipher suite. Treating it as a handshake failure.";
+                    m_context.critical_error = (u8)AlertDescription::HandshakeFailure;
+                    try_disambiguate_error();
+                }
             }
             }
             m_context.error_code = (Error)code;
             m_context.error_code = (Error)code;
         }
         }