server_tls_test.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package quic
  2. import (
  3. "bytes"
  4. "net"
  5. "github.com/bifurcation/mint"
  6. "github.com/lucas-clemente/quic-go/internal/handshake"
  7. "github.com/lucas-clemente/quic-go/internal/protocol"
  8. "github.com/lucas-clemente/quic-go/internal/testdata"
  9. "github.com/lucas-clemente/quic-go/internal/utils"
  10. "github.com/lucas-clemente/quic-go/internal/wire"
  11. . "github.com/onsi/ginkgo"
  12. . "github.com/onsi/gomega"
  13. )
  14. var _ = Describe("Stateless TLS handling", func() {
  15. var (
  16. conn *mockPacketConn
  17. server *serverTLS
  18. sessionChan <-chan tlsSession
  19. )
  20. BeforeEach(func() {
  21. conn = newMockPacketConn()
  22. config := &Config{
  23. Versions: []protocol.VersionNumber{protocol.VersionTLS},
  24. }
  25. var err error
  26. server, sessionChan, err = newServerTLS(conn, config, nil, testdata.GetTLSConfig(), utils.DefaultLogger)
  27. Expect(err).ToNot(HaveOccurred())
  28. })
  29. parseHeader := func(data []byte) *wire.Header {
  30. b := bytes.NewReader(data)
  31. iHdr, err := wire.ParseInvariantHeader(b, 0)
  32. Expect(err).ToNot(HaveOccurred())
  33. hdr, err := iHdr.Parse(b, protocol.PerspectiveServer, protocol.VersionTLS)
  34. Expect(err).ToNot(HaveOccurred())
  35. return hdr
  36. }
  37. It("drops too small packets", func() {
  38. server.HandleInitial(&receivedPacket{
  39. header: &wire.Header{},
  40. data: bytes.Repeat([]byte{0}, protocol.MinInitialPacketSize-1), // the packet is now 1 byte too small
  41. })
  42. Expect(conn.dataWritten.Len()).To(BeZero())
  43. })
  44. It("drops packets with a too short connection ID", func() {
  45. hdr := &wire.Header{
  46. SrcConnectionID: protocol.ConnectionID{1, 2, 3, 4, 5, 6, 7, 8},
  47. DestConnectionID: protocol.ConnectionID{1, 2, 3, 4},
  48. PacketNumberLen: protocol.PacketNumberLen1,
  49. }
  50. server.HandleInitial(&receivedPacket{
  51. header: hdr,
  52. data: bytes.Repeat([]byte{0}, protocol.MinInitialPacketSize),
  53. })
  54. Expect(conn.dataWritten.Len()).To(BeZero())
  55. })
  56. It("replies with a Retry packet, if a Cookie is required", func() {
  57. server.config.AcceptCookie = func(_ net.Addr, _ *handshake.Cookie) bool { return false }
  58. hdr := &wire.Header{
  59. Type: protocol.PacketTypeInitial,
  60. SrcConnectionID: protocol.ConnectionID{5, 4, 3, 2, 1},
  61. DestConnectionID: protocol.ConnectionID{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
  62. Version: protocol.VersionTLS,
  63. }
  64. server.HandleInitial(&receivedPacket{
  65. remoteAddr: &net.UDPAddr{},
  66. header: hdr,
  67. data: bytes.Repeat([]byte{0}, protocol.MinInitialPacketSize),
  68. })
  69. Expect(conn.dataWritten.Len()).ToNot(BeZero())
  70. replyHdr := parseHeader(conn.dataWritten.Bytes())
  71. Expect(replyHdr.Type).To(Equal(protocol.PacketTypeRetry))
  72. Expect(replyHdr.SrcConnectionID).ToNot(Equal(hdr.DestConnectionID))
  73. Expect(replyHdr.SrcConnectionID.Len()).To(BeNumerically(">=", protocol.MinConnectionIDLenInitial))
  74. Expect(replyHdr.DestConnectionID).To(Equal(hdr.SrcConnectionID))
  75. Expect(replyHdr.OrigDestConnectionID).To(Equal(hdr.DestConnectionID))
  76. Expect(replyHdr.Token).ToNot(BeEmpty())
  77. Expect(sessionChan).ToNot(Receive())
  78. })
  79. It("creates a session, if no Cookie is required", func() {
  80. server.config.AcceptCookie = func(_ net.Addr, _ *handshake.Cookie) bool { return true }
  81. hdr := &wire.Header{
  82. Type: protocol.PacketTypeInitial,
  83. SrcConnectionID: protocol.ConnectionID{5, 4, 3, 2, 1},
  84. DestConnectionID: protocol.ConnectionID{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
  85. Version: protocol.VersionTLS,
  86. }
  87. p := &receivedPacket{
  88. header: hdr,
  89. data: bytes.Repeat([]byte{0}, protocol.MinInitialPacketSize),
  90. }
  91. run := make(chan struct{})
  92. server.newSession = func(connection, sessionRunner, protocol.ConnectionID, protocol.ConnectionID, protocol.ConnectionID, protocol.PacketNumber, *Config, *mint.Config, *handshake.TransportParameters, utils.Logger, protocol.VersionNumber) (quicSession, error) {
  93. sess := NewMockQuicSession(mockCtrl)
  94. sess.EXPECT().handlePacket(p)
  95. sess.EXPECT().run().Do(func() { close(run) })
  96. return sess, nil
  97. }
  98. done := make(chan struct{})
  99. go func() {
  100. defer GinkgoRecover()
  101. server.HandleInitial(p)
  102. // the Handshake packet is written by the session
  103. Expect(conn.dataWritten.Len()).To(BeZero())
  104. close(done)
  105. }()
  106. var tlsSess tlsSession
  107. Eventually(sessionChan).Should(Receive(&tlsSess))
  108. // make sure we're using a server-generated connection ID
  109. Expect(tlsSess.connID).ToNot(Equal(hdr.SrcConnectionID))
  110. Expect(tlsSess.connID).ToNot(Equal(hdr.DestConnectionID))
  111. Eventually(run).Should(BeClosed())
  112. Eventually(done).Should(BeClosed())
  113. })
  114. })