You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

176 rivejä
6.7 KiB

  1. package main
  2. import (
  3. "crypto/tls"
  4. "encoding/hex"
  5. "fmt"
  6. "io"
  7. "log"
  8. "net/http"
  9. "os"
  10. "time"
  11. )
  12. var tlsVersionToName = map[uint16]string{
  13. tls.VersionTLS10: "1.0",
  14. tls.VersionTLS11: "1.1",
  15. tls.VersionTLS12: "1.2",
  16. tls.VersionTLS13: "1.3",
  17. tls.VersionTLS13Draft18: "1.3 (draft 18)",
  18. }
  19. func startServer(addr string, rsa, offer0RTT, accept0RTT bool) {
  20. cert, err := tls.X509KeyPair([]byte(ecdsaCert), []byte(ecdsaKey))
  21. if rsa {
  22. cert, err = tls.X509KeyPair([]byte(rsaCert), []byte(rsaKey))
  23. }
  24. if err != nil {
  25. log.Fatal(err)
  26. }
  27. var Max0RTTDataSize uint32
  28. if offer0RTT {
  29. Max0RTTDataSize = 100 * 1024
  30. }
  31. var keyLogWriter io.Writer
  32. if keyLogFile := os.Getenv("SSLKEYLOGFILE"); keyLogFile != "" {
  33. keyLogWriter, err = os.OpenFile(keyLogFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0600)
  34. if err != nil {
  35. log.Fatalf("Cannot open keylog file: %v", err)
  36. }
  37. log.Println("Enabled keylog")
  38. }
  39. s := &http.Server{
  40. Addr: addr,
  41. TLSConfig: &tls.Config{
  42. Certificates: []tls.Certificate{cert},
  43. Max0RTTDataSize: Max0RTTDataSize,
  44. Accept0RTTData: accept0RTT,
  45. KeyLogWriter: keyLogWriter,
  46. GetConfigForClient: func(*tls.ClientHelloInfo) (*tls.Config, error) {
  47. // If we send the first flight too fast, NSS sends empty early data.
  48. time.Sleep(500 * time.Millisecond)
  49. return nil, nil
  50. },
  51. MaxVersion: tls.VersionTLS13,
  52. },
  53. }
  54. log.Fatal(s.ListenAndServeTLS("", ""))
  55. }
  56. var confirmingAddr string
  57. func main() {
  58. http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
  59. tlsConn := r.Context().Value(http.TLSConnContextKey).(*tls.Conn)
  60. server := r.Context().Value(http.ServerContextKey).(*http.Server)
  61. with0RTT := ""
  62. if !tlsConn.ConnectionState().HandshakeConfirmed {
  63. with0RTT = " [0-RTT]"
  64. }
  65. if server.Addr == confirmingAddr || r.URL.Path == "/confirm" {
  66. if err := tlsConn.ConfirmHandshake(); err != nil {
  67. log.Fatal(err)
  68. }
  69. if with0RTT != "" {
  70. with0RTT = " [0-RTT confirmed]"
  71. }
  72. if !tlsConn.ConnectionState().HandshakeConfirmed {
  73. panic("HandshakeConfirmed false after ConfirmHandshake")
  74. }
  75. }
  76. resumed := ""
  77. if r.TLS.DidResume {
  78. resumed = " [resumed]"
  79. }
  80. http2 := ""
  81. if r.ProtoMajor == 2 {
  82. http2 = " [HTTP/2]"
  83. }
  84. fmt.Fprintf(w, "<!DOCTYPE html><p>Hello TLS %s%s%s%s _o/\n", tlsVersionToName[r.TLS.Version], resumed, with0RTT, http2)
  85. })
  86. http.HandleFunc("/ch", func(w http.ResponseWriter, r *http.Request) {
  87. w.Header().Set("Content-Type", "text/plain")
  88. fmt.Fprintf(w, "Client Hello packet (%d bytes):\n%s", len(r.TLS.ClientHello), hex.Dump(r.TLS.ClientHello))
  89. })
  90. switch len(os.Args) {
  91. case 2:
  92. startServer(os.Args[1], true, true, true)
  93. case 6:
  94. confirmingAddr = os.Args[5]
  95. go startServer(os.Args[1], false, false, false) // first port: ECDSA (and no 0-RTT)
  96. go startServer(os.Args[2], true, false, true) // second port: RSA (and accept 0-RTT but not offer it)
  97. go startServer(os.Args[3], false, true, false) // third port: offer and reject 0-RTT
  98. go startServer(os.Args[4], false, true, true) // fourth port: offer and accept 0-RTT
  99. startServer(os.Args[5], false, true, true) // fifth port: offer and accept 0-RTT but confirm
  100. }
  101. }
  102. const (
  103. rsaKey = `-----BEGIN RSA PRIVATE KEY-----
  104. MIIEpAIBAAKCAQEA1DHcIM3SThFqy8nAkPQFX0E7ph8jqh8EATXryjKHGuVjR3Xh
  105. OQ0BSPoJxyfdg/VEwevFrtmZAfz0WCbxvP2SVCmf7oobg4V2KPSo3nNt9vlBFUne
  106. RtIyHRQ8YRnGSWaRHzJbX6ffltnG2aD+8qUfk161rdZgxBA9G0Ga47IkwQhT2Hqu
  107. H3dW2Uu4W2WMyt6gX/tdyEAV57MOPcoceknr7Nb2kfiuDPR7h6wFrW3I6eoj8oX2
  108. SkIOuVNt1Z31BAUcPJDUjqopI0o9tolM/7X13M8dEY0OJQVr7FQYDF9JeSYeEMyb
  109. wizjBaHDm48mSghP1o5UssQBbNNC83btXCjiLQIDAQABAoIBACzvGgRAUYaCnbDl
  110. 2kdXxUN0luMIuQ6vXrO67WF17bI+XRWm2riwDlObzzJDON9Wsua1vLjYD1SickOw
  111. i4RP1grIfbuPt1/UhT8LAC+LFgA0rBmL+OvaWw5ZWKffQ2QLujN3AG5zKB/Tog43
  112. z4UmfldAuQxE11zta2M4M0qAUNQnQj1oiuI8RUdG0VvvLw8Htdi1ogH0CI5R669z
  113. NjHt+JV+2gzKx6EX0s8mQL3yXGkC2xXItRbFclyCMJEhPS7QbBu+tru35N6WpzAq
  114. BCl2Q7LQogvSA6MXuMOx6CyuExVfgmhbfeoheLE8gmXwl0Y37n/g6ZBZFAtpCjcs
  115. UckPv0ECgYEA1orl7RwgIsZljMap6vWtMGoRIHKmT91DGpMmkh4suZe+yAk85maU
  116. 49Vd+8ZfIN41AH37yrsGOcPHgz5o5QufELpoub6DCsQ7u9F1vQp55cp+qyBWzAgz
  117. b/xUuVnIyv3kLan3fpk7ZGCBXFBpLG0QXMFOHtda3Mlk5SmuoEYaYRkCgYEA/TLR
  118. u4neKqyqwsqMuRJGC1iKFVmfCjZeNMtPNbTWpdqez/vvT8APnEpIumUGt8YROLGZ
  119. 8biUr5/ViOkmaP3wmQbO9m2/cE01lMTYv75w1cw2KVQe6kAHJkOx+JEx9xg53RJ/
  120. QlFtG5MQUy2599Gxp8BMGaXLH5yo4qwvNvY6CDUCgYEArxr7AwX7rKZlZ/sV4HHY
  121. gzVu+R7aY0DibiRATO5X7rrNuhLgI+UCDNqvNLn6FqeGdvpcsmDneeozQwmDL77G
  122. ey7KHyBBcF4tquQQxtRwHX+i1yUz8p+W7AX1WLrRSezjeenJ2QhUE1849hGjZeE2
  123. g546lq2Kub2enfPhVWsiSLECgYEA72T5QCPeVuLioUH5Q5Kvf1K7W+xcnr9A2xHP
  124. Vqwgtre5qFQ/tFuXZuIlWXbjnyY6aiwhrZYjntm0f7pRgrt2nHj/fafOdVPK8Voc
  125. xU4+SSbHntPWVw0qtVcUEjzVzRauvwMaJ43tZ0DpEnwNdO5i1oTObwF+x+jLFWZP
  126. TdwIinECgYBzjZeCxxOMk5SlPpTsLUtgC+q3m1AavXhUVNEPP2gKMOIPTETPbhbG
  127. LBxB2vVbJiS3J7itQy8gceT89O0vSEZnaTPXiM/Ws1QbkBJ8yW7KI7X4WuzN4Imq
  128. /cLBRXLb8R328U27YyQFNGMjr2tX/+vx5FulJjSloWMRNuFWUngv7w==
  129. -----END RSA PRIVATE KEY-----`
  130. rsaCert = `-----BEGIN CERTIFICATE-----
  131. MIIC+jCCAeKgAwIBAgIRANBDimJ/ww2tz77qcYIhuZowDQYJKoZIhvcNAQELBQAw
  132. EjEQMA4GA1UEChMHQWNtZSBDbzAeFw0xNjA5MjQxNzI5MTlaFw0yNjA5MjIxNzI5
  133. MTlaMBIxEDAOBgNVBAoTB0FjbWUgQ28wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
  134. ggEKAoIBAQDUMdwgzdJOEWrLycCQ9AVfQTumHyOqHwQBNevKMoca5WNHdeE5DQFI
  135. +gnHJ92D9UTB68Wu2ZkB/PRYJvG8/ZJUKZ/uihuDhXYo9Kjec232+UEVSd5G0jId
  136. FDxhGcZJZpEfMltfp9+W2cbZoP7ypR+TXrWt1mDEED0bQZrjsiTBCFPYeq4fd1bZ
  137. S7hbZYzK3qBf+13IQBXnsw49yhx6Sevs1vaR+K4M9HuHrAWtbcjp6iPyhfZKQg65
  138. U23VnfUEBRw8kNSOqikjSj22iUz/tfXczx0RjQ4lBWvsVBgMX0l5Jh4QzJvCLOMF
  139. ocObjyZKCE/WjlSyxAFs00Lzdu1cKOItAgMBAAGjSzBJMA4GA1UdDwEB/wQEAwIF
  140. oDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMBQGA1UdEQQNMAuC
  141. CWxvY2FsaG9zdDANBgkqhkiG9w0BAQsFAAOCAQEAygPV4enmvwSuMd1JarxOXpOK
  142. Z4Nsk7EKlfCPgzxQUOkFdLIr5ZG1kUkQt/omzTmoIWjLAsoYzT0ZCPOrioczKsWj
  143. MceFUIkT0w+eIl+8DzauPy34o8rjcApglF165UG3iphlpI+jdPzv5TBarUAbwsFb
  144. ClMLEiNJQ0OMxAIaRtb2RehD4q3OWlpWf6joJ36PRBqL8T5+f2x6Tg3c64UR+QPX
  145. 98UcCQHHdEhm7y2z5Z2Wt0B48tZ+UAxDEoEwMghNyw7wUD79IRlXGYypBnXaMuLX
  146. 46aGxbsSQ7Rfg62Co3JG7vo+eJd0AoZHrtFUnfM8V70IFzMBZnSwRslHRJe56Q==
  147. -----END CERTIFICATE-----`
  148. ecdsaCert = `-----BEGIN CERTIFICATE-----
  149. MIIBbTCCAROgAwIBAgIQZCsHZcs5ZkzV+zC2E6j5RzAKBggqhkjOPQQDAjASMRAw
  150. DgYDVQQKEwdBY21lIENvMB4XDTE2MDkyNDE3NTE1OFoXDTI2MDkyMjE3NTE1OFow
  151. EjEQMA4GA1UEChMHQWNtZSBDbzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABDTO
  152. B3IyzjYfKCp2HWy+P3QHxhdBT4AUGYgwTiSEj5phumPIahFNcOSWptN0UzlZvJdN
  153. MMjVmrFYK/FjF4abkNKjSzBJMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggr
  154. BgEFBQcDATAMBgNVHRMBAf8EAjAAMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAKBggq
  155. hkjOPQQDAgNIADBFAiEAp9W157PM1IadPBc33Cbj7vaFvp+rXs/hSuMCzP8pgV8C
  156. IHCswo1qiC0ZjQmWsBlmz5Zbp9rOorIzBYmGRhRdNs3j
  157. -----END CERTIFICATE-----`
  158. ecdsaKey = `-----BEGIN EC PRIVATE KEY-----
  159. MHcCAQEEIFdhO7IW5UIwpB1e2Vunm9QyKvUHWcVwGfLjhpOajuR7oAoGCCqGSM49
  160. AwEHoUQDQgAENM4HcjLONh8oKnYdbL4/dAfGF0FPgBQZiDBOJISPmmG6Y8hqEU1w
  161. 5Jam03RTOVm8l00wyNWasVgr8WMXhpuQ0g==
  162. -----END EC PRIVATE KEY-----`
  163. )