github.com/daeuniverse/quic-go@v0.0.0-20240413031024-943f218e0810/fuzzing/handshake/cmd/corpus.go (about)

     1  package main
     2  
     3  import (
     4  	"crypto/tls"
     5  	"log"
     6  	"net"
     7  
     8  	fuzzhandshake "github.com/daeuniverse/quic-go/fuzzing/handshake"
     9  	"github.com/daeuniverse/quic-go/fuzzing/internal/helper"
    10  	"github.com/daeuniverse/quic-go/internal/handshake"
    11  	"github.com/daeuniverse/quic-go/internal/protocol"
    12  	"github.com/daeuniverse/quic-go/internal/testdata"
    13  	"github.com/daeuniverse/quic-go/internal/utils"
    14  	"github.com/daeuniverse/quic-go/internal/wire"
    15  )
    16  
    17  const alpn = "fuzz"
    18  
    19  func main() {
    20  	client := handshake.NewCryptoSetupClient(
    21  		protocol.ConnectionID{},
    22  		&wire.TransportParameters{ActiveConnectionIDLimit: 2},
    23  		&tls.Config{
    24  			MinVersion:         tls.VersionTLS13,
    25  			ServerName:         "localhost",
    26  			NextProtos:         []string{alpn},
    27  			RootCAs:            testdata.GetRootCA(),
    28  			ClientSessionCache: tls.NewLRUClientSessionCache(1),
    29  		},
    30  		false,
    31  		utils.NewRTTStats(),
    32  		nil,
    33  		utils.DefaultLogger.WithPrefix("client"),
    34  		protocol.Version1,
    35  	)
    36  
    37  	config := testdata.GetTLSConfig()
    38  	config.NextProtos = []string{alpn}
    39  	server := handshake.NewCryptoSetupServer(
    40  		protocol.ConnectionID{},
    41  		&net.UDPAddr{IP: net.IPv6loopback, Port: 1234},
    42  		&net.UDPAddr{IP: net.IPv6loopback, Port: 4321},
    43  		&wire.TransportParameters{ActiveConnectionIDLimit: 2},
    44  		config,
    45  		false,
    46  		utils.NewRTTStats(),
    47  		nil,
    48  		utils.DefaultLogger.WithPrefix("server"),
    49  		protocol.Version1,
    50  	)
    51  
    52  	if err := client.StartHandshake(); err != nil {
    53  		log.Fatal(err)
    54  	}
    55  
    56  	if err := server.StartHandshake(); err != nil {
    57  		log.Fatal(err)
    58  	}
    59  
    60  	var clientHandshakeComplete, serverHandshakeComplete bool
    61  	var messages [][]byte
    62  	for {
    63  	clientLoop:
    64  		for {
    65  			ev := client.NextEvent()
    66  			//nolint:exhaustive // only need to process a few events
    67  			switch ev.Kind {
    68  			case handshake.EventNoEvent:
    69  				break clientLoop
    70  			case handshake.EventWriteInitialData:
    71  				messages = append(messages, ev.Data)
    72  				if err := server.HandleMessage(ev.Data, protocol.EncryptionInitial); err != nil {
    73  					log.Fatal(err)
    74  				}
    75  			case handshake.EventWriteHandshakeData:
    76  				messages = append(messages, ev.Data)
    77  				if err := server.HandleMessage(ev.Data, protocol.EncryptionHandshake); err != nil {
    78  					log.Fatal(err)
    79  				}
    80  			case handshake.EventHandshakeComplete:
    81  				clientHandshakeComplete = true
    82  			}
    83  		}
    84  
    85  	serverLoop:
    86  		for {
    87  			ev := server.NextEvent()
    88  			//nolint:exhaustive // only need to process a few events
    89  			switch ev.Kind {
    90  			case handshake.EventNoEvent:
    91  				break serverLoop
    92  			case handshake.EventWriteInitialData:
    93  				messages = append(messages, ev.Data)
    94  				if err := client.HandleMessage(ev.Data, protocol.EncryptionInitial); err != nil {
    95  					log.Fatal(err)
    96  				}
    97  			case handshake.EventWriteHandshakeData:
    98  				messages = append(messages, ev.Data)
    99  				if err := client.HandleMessage(ev.Data, protocol.EncryptionHandshake); err != nil {
   100  					log.Fatal(err)
   101  				}
   102  			case handshake.EventHandshakeComplete:
   103  				serverHandshakeComplete = true
   104  			}
   105  		}
   106  
   107  		if serverHandshakeComplete && clientHandshakeComplete {
   108  			break
   109  		}
   110  	}
   111  
   112  	ticket, err := server.GetSessionTicket()
   113  	if err != nil {
   114  		log.Fatal(err)
   115  	}
   116  	if ticket == nil {
   117  		log.Fatal("expected a session ticket")
   118  	}
   119  	messages = append(messages, ticket)
   120  
   121  	for _, m := range messages {
   122  		if err := helper.WriteCorpusFileWithPrefix("corpus", m, fuzzhandshake.PrefixLen); err != nil {
   123  			log.Fatal(err)
   124  		}
   125  	}
   126  }