0

I have a project to complete in Ruby involving TLS v.1.3. I want to optimize requests and thus use "early data". I'm using a package called tttls1.3 and the client works until I send early data to the server. What's even more wired is that a request with early data goes through and I get a response from the server but immediately after the reply (response message) an alert 20 (Bad Record MAC) is received. I went so far that I even go and recalculate the "client-finished" message which seemed suspicious but it looks correct.

What could be the problem? Is there a TCP or other issue I could check?

Here's an example:

require 'socket'
require 'tttls1.3'

settings2 = {
    alpn: ['http/1.1'],
    supported_groups: [TTTLS13::NamedGroup::SECP256R1],
    cipher_suites: [TTTLS13::CipherSuite::TLS_AES_256_GCM_SHA384],
    check_certificate_status: false,
}

settings1 = {
    alpn: ['http/1.1'],
    supported_groups: [TTTLS13::NamedGroup::SECP256R1],
    cipher_suites: [TTTLS13::CipherSuite::TLS_AES_256_GCM_SHA384],
    check_certificate_status: false,
    process_new_session_ticket: lambda do |nst, rms, cs|
        return if Time.now.to_i - nst.timestamp > nst.ticket_lifetime
        settings2[:ticket] = nst.ticket
        settings2[:resumption_master_secret] = rms
        settings2[:psk_cipher_suite] = cs
        settings2[:ticket_nonce] = nst.ticket_nonce
        settings2[:ticket_age_add] = nst.ticket_age_add
        settings2[:ticket_timestamp] = nst.timestamp
    end
}

# REQUEST

socket = TCPSocket.new("ssltest.louis.info", 443)
client = TTTLS13::Client.new(socket, "ssltest.louis.info", settings1)
client.connect 
client.write("GET / HTTP/1.1\r\n")
client.write("Host: ssltest.louis.info\r\n")
client.write("\r\n\r\n")
client.read
client.close
socket.close

sleep(1)

# RESUMPTION

socket = TCPSocket.new("ssltest.louis.info", 443)
client = TTTLS13::Client.new(socket, "ssltest.louis.info", settings2)
client.early_data("HEAD / HTTP/1.1\r\nHost: ssltest.louis.info\r\n\r\n\r\n")
client.connect 
p client.read
p client.read
p client.read
p client.read

Original issue: https://github.com/thekuwayama/tttls1.3/issues/48

Holger Just
  • 52,918
  • 14
  • 115
  • 123
xpepermint
  • 35,055
  • 30
  • 109
  • 163

1 Answers1

0

It turned out that the Connection: close header must be present in the request. It must be the remote server implementation specific.

xpepermint
  • 35,055
  • 30
  • 109
  • 163