浏览代码

LibTLS: Implement build_alert()

AnotherTest 5 年之前
父节点
当前提交
0da07c284e
共有 2 个文件被更改,包括 19 次插入6 次删除
  1. 8 2
      Libraries/LibTLS/ClientHandshake.cpp
  2. 11 4
      Libraries/LibTLS/Handshake.cpp

+ 8 - 2
Libraries/LibTLS/ClientHandshake.cpp

@@ -279,8 +279,11 @@ void TLSv12::build_random(PacketBuilder& builder)
 ssize_t TLSv12::handle_payload(const ByteBuffer& vbuffer)
 {
     if (m_context.connection_status == ConnectionStatus::Established) {
-        auto packet = build_alert(false, (u8)AlertDescription::NoRenegotiation);
-        write_packet(packet);
+        dbg() << "Renegotiation attempt ignored";
+        // FIXME: We should properly say "NoRenegotiation", but that causes a handshake failure
+        //        so we just roll with it and pretend that we _did_ renegotiate
+        //        This will cause issues when we decide to have long-lasting connections, but
+        //        we do not have those at the moment :^)
         return 1;
     }
     auto buffer = vbuffer;
@@ -530,6 +533,9 @@ ssize_t TLSv12::handle_payload(const ByteBuffer& vbuffer)
                 write_packet(packet);
                 break;
             }
+            case Error::NeedMoreData:
+                // Ignore this, as it's not an "error"
+                break;
             default:
                 dbg() << "Unknown TLS::Error with value " << payload_res;
                 ASSERT_NOT_REACHED();

+ 11 - 4
Libraries/LibTLS/Handshake.cpp

@@ -129,10 +129,17 @@ ByteBuffer TLSv12::build_hello()
 
 ByteBuffer TLSv12::build_alert(bool critical, u8 code)
 {
-    dbg() << "FIXME: build_alert";
-    (void)critical;
-    (void)code;
-    return {};
+    PacketBuilder builder(MessageType::Alert, (u16)m_context.version);
+    builder.append((u8)(critical ? AlertLevel::Critical : AlertLevel::Warning));
+    builder.append(code);
+
+    if (critical)
+        m_context.critical_error = code;
+
+    auto packet = builder.build();
+    update_packet(packet);
+
+    return packet;
 }
 
 ByteBuffer TLSv12::build_finished()