Alternative TLS implementation in Go
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

314 Zeilen
11 KiB

  1. package main
  2. import (
  3. "crypto/tls"
  4. "crypto/x509"
  5. "encoding/hex"
  6. "errors"
  7. "flag"
  8. "fmt"
  9. "io/ioutil"
  10. "log"
  11. "net/http"
  12. "os"
  13. "strings"
  14. "time"
  15. )
  16. type ZeroRTT_t int
  17. type PubKeyAlgo_t int
  18. // Bitset
  19. const (
  20. ZeroRTT_None ZeroRTT_t = 0
  21. ZeroRTT_Offer = 1 << 0
  22. ZeroRTT_Accept = 1 << 1
  23. )
  24. type server struct {
  25. Address string
  26. ZeroRTT ZeroRTT_t
  27. TLS tls.Config
  28. }
  29. var tlsVersionToName = map[uint16]string{
  30. tls.VersionTLS10: "1.0",
  31. tls.VersionTLS11: "1.1",
  32. tls.VersionTLS12: "1.2",
  33. tls.VersionTLS13: "1.3",
  34. }
  35. func NewServer() *server {
  36. s := new(server)
  37. s.ZeroRTT = ZeroRTT_None
  38. s.Address = "0.0.0.0:443"
  39. s.TLS = tls.Config{
  40. GetConfigForClient: func(*tls.ClientHelloInfo) (*tls.Config, error) {
  41. // If we send the first flight too fast, NSS sends empty early data.
  42. time.Sleep(500 * time.Millisecond)
  43. return nil, nil
  44. },
  45. MaxVersion: tls.VersionTLS13,
  46. ClientAuth: tls.NoClientCert,
  47. }
  48. return s
  49. }
  50. func enableQR(s *server, enableDefault bool) {
  51. var sidhCurves = []tls.CurveID{tls.HybridSidhP503Curve25519}
  52. if enableDefault {
  53. var defaultCurvePreferences = []tls.CurveID{tls.X25519, tls.CurveP256, tls.CurveP384, tls.CurveP521}
  54. s.TLS.CurvePreferences = append(s.TLS.CurvePreferences, defaultCurvePreferences...)
  55. }
  56. s.TLS.CurvePreferences = append(s.TLS.CurvePreferences, sidhCurves...)
  57. }
  58. func (s *server) start() {
  59. var err error
  60. if (s.ZeroRTT & ZeroRTT_Offer) == ZeroRTT_Offer {
  61. s.TLS.Max0RTTDataSize = 100 * 1024
  62. }
  63. if keyLogFile := os.Getenv("SSLKEYLOGFILE"); keyLogFile != "" {
  64. s.TLS.KeyLogWriter, err = os.OpenFile(keyLogFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0600)
  65. if err != nil {
  66. log.Fatalf("Cannot open keylog file: %v", err)
  67. }
  68. log.Println("Enabled keylog")
  69. }
  70. s.TLS.ClientCAs = x509.NewCertPool()
  71. s.TLS.ClientCAs.AppendCertsFromPEM([]byte(rsaCa_client))
  72. s.TLS.Accept0RTTData = ((s.ZeroRTT & ZeroRTT_Accept) == ZeroRTT_Accept)
  73. s.TLS.NextProtos = []string{"npn_proto"}
  74. httpServer := &http.Server{
  75. Addr: s.Address,
  76. TLSConfig: &s.TLS,
  77. }
  78. log.Fatal(httpServer.ListenAndServeTLS("", ""))
  79. }
  80. // setServerCertificateFromArgs sets server certificate from an argument provided by the caller. Possible values
  81. // for arg_cert:
  82. // * "rsa": sets hardcoded RSA keypair
  83. // * "ecdsa": sets hardcoded ECDSA keypair
  84. // * FILE1:FILE2: Uses private key from FILE1 and public key from FILE2. Both must be in PEM format. FILE2 can
  85. // be single certificate or certificate chain.
  86. // * nil: fallbacks to "rsa"
  87. //
  88. // Function generate a panic in case certificate can't be correctly set
  89. func (s *server) setServerCertificateFromArgs(arg_cert *string) {
  90. var certStr, keyStr []byte
  91. var cert tls.Certificate
  92. var err error
  93. if arg_cert == nil {
  94. // set rsa by default
  95. certStr, keyStr = []byte(rsaCert), []byte(rsaKey)
  96. } else {
  97. switch *arg_cert {
  98. case "rsa":
  99. certStr, keyStr = []byte(rsaCert), []byte(rsaKey)
  100. case "ecdsa":
  101. certStr, keyStr = []byte(ecdsaCert), []byte(ecdsaKey)
  102. default:
  103. files := strings.Split(*arg_cert, ":")
  104. if len(files) != 2 {
  105. err = errors.New("Wrong format provided after -cert.")
  106. goto err
  107. }
  108. keyStr, err = ioutil.ReadFile(files[0])
  109. if err != nil {
  110. goto err
  111. }
  112. certStr, err = ioutil.ReadFile(files[1])
  113. if err != nil {
  114. goto err
  115. }
  116. }
  117. }
  118. cert, err = tls.X509KeyPair(certStr, keyStr)
  119. if err != nil {
  120. goto err
  121. }
  122. s.TLS.Certificates = []tls.Certificate{cert}
  123. err:
  124. if err != nil {
  125. // Not possible to proceed really
  126. log.Fatal(err)
  127. panic(err)
  128. }
  129. }
  130. func main() {
  131. s := NewServer()
  132. arg_addr := flag.String("b", "0.0.0.0:443", "Address:port used for binding")
  133. arg_cert := flag.String("cert", "rsa", "Public algorithm to use:\nOptions [rsa, ecdsa, PrivateKeyFile:CertificateChainFile]")
  134. arg_zerortt := flag.String("rtt0", "n", `0-RTT, accepts following values [n: None, a: Accept, o: Offer, oa: Offer and Accept]`)
  135. arg_confirm := flag.Bool("rtt0ack", false, "0-RTT confirm")
  136. arg_clientauth := flag.Bool("cliauth", false, "Performs client authentication (RequireAndVerifyClientCert used)")
  137. arg_qr := flag.String("qr", "", "Enable quantum-resistant algorithms [c: Support classical and Quantum-Resistant, q: Enable Quantum-Resistant only]")
  138. flag.Parse()
  139. s.Address = *arg_addr
  140. s.setServerCertificateFromArgs(arg_cert)
  141. if *arg_zerortt == "a" {
  142. s.ZeroRTT = ZeroRTT_Accept
  143. } else if *arg_zerortt == "o" {
  144. s.ZeroRTT = ZeroRTT_Offer
  145. } else if *arg_zerortt == "oa" {
  146. s.ZeroRTT = ZeroRTT_Offer | ZeroRTT_Accept
  147. }
  148. if *arg_clientauth {
  149. s.TLS.ClientAuth = tls.RequireAndVerifyClientCert
  150. }
  151. if *arg_qr == "c" {
  152. enableQR(s, true)
  153. } else if *arg_qr == "q" {
  154. enableQR(s, false)
  155. }
  156. http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
  157. tlsConn := r.Context().Value(http.TLSConnContextKey).(*tls.Conn)
  158. with0RTT := ""
  159. if !tlsConn.ConnectionState().HandshakeConfirmed {
  160. with0RTT = " [0-RTT]"
  161. }
  162. if *arg_confirm || r.URL.Path == "/confirm" {
  163. if err := tlsConn.ConfirmHandshake(); err != nil {
  164. log.Fatal(err)
  165. }
  166. if with0RTT != "" {
  167. with0RTT = " [0-RTT confirmed]"
  168. }
  169. if !tlsConn.ConnectionState().HandshakeConfirmed {
  170. panic("HandshakeConfirmed false after ConfirmHandshake")
  171. }
  172. }
  173. resumed := ""
  174. if r.TLS.DidResume {
  175. resumed = " [resumed]"
  176. }
  177. http2 := ""
  178. if r.ProtoMajor == 2 {
  179. http2 = " [HTTP/2]"
  180. }
  181. fmt.Fprintf(w, "<!DOCTYPE html><p>Hello TLS %s%s%s%s _o/\n", tlsVersionToName[r.TLS.Version], resumed, with0RTT, http2)
  182. })
  183. http.HandleFunc("/ch", func(w http.ResponseWriter, r *http.Request) {
  184. w.Header().Set("Content-Type", "text/plain")
  185. fmt.Fprintf(w, "Client Hello packet (%d bytes):\n%s", len(r.TLS.ClientHello), hex.Dump(r.TLS.ClientHello))
  186. })
  187. s.start()
  188. }
  189. const (
  190. rsaKey = `-----BEGIN RSA PRIVATE KEY-----
  191. MIIEpAIBAAKCAQEA1DHcIM3SThFqy8nAkPQFX0E7ph8jqh8EATXryjKHGuVjR3Xh
  192. OQ0BSPoJxyfdg/VEwevFrtmZAfz0WCbxvP2SVCmf7oobg4V2KPSo3nNt9vlBFUne
  193. RtIyHRQ8YRnGSWaRHzJbX6ffltnG2aD+8qUfk161rdZgxBA9G0Ga47IkwQhT2Hqu
  194. H3dW2Uu4W2WMyt6gX/tdyEAV57MOPcoceknr7Nb2kfiuDPR7h6wFrW3I6eoj8oX2
  195. SkIOuVNt1Z31BAUcPJDUjqopI0o9tolM/7X13M8dEY0OJQVr7FQYDF9JeSYeEMyb
  196. wizjBaHDm48mSghP1o5UssQBbNNC83btXCjiLQIDAQABAoIBACzvGgRAUYaCnbDl
  197. 2kdXxUN0luMIuQ6vXrO67WF17bI+XRWm2riwDlObzzJDON9Wsua1vLjYD1SickOw
  198. i4RP1grIfbuPt1/UhT8LAC+LFgA0rBmL+OvaWw5ZWKffQ2QLujN3AG5zKB/Tog43
  199. z4UmfldAuQxE11zta2M4M0qAUNQnQj1oiuI8RUdG0VvvLw8Htdi1ogH0CI5R669z
  200. NjHt+JV+2gzKx6EX0s8mQL3yXGkC2xXItRbFclyCMJEhPS7QbBu+tru35N6WpzAq
  201. BCl2Q7LQogvSA6MXuMOx6CyuExVfgmhbfeoheLE8gmXwl0Y37n/g6ZBZFAtpCjcs
  202. UckPv0ECgYEA1orl7RwgIsZljMap6vWtMGoRIHKmT91DGpMmkh4suZe+yAk85maU
  203. 49Vd+8ZfIN41AH37yrsGOcPHgz5o5QufELpoub6DCsQ7u9F1vQp55cp+qyBWzAgz
  204. b/xUuVnIyv3kLan3fpk7ZGCBXFBpLG0QXMFOHtda3Mlk5SmuoEYaYRkCgYEA/TLR
  205. u4neKqyqwsqMuRJGC1iKFVmfCjZeNMtPNbTWpdqez/vvT8APnEpIumUGt8YROLGZ
  206. 8biUr5/ViOkmaP3wmQbO9m2/cE01lMTYv75w1cw2KVQe6kAHJkOx+JEx9xg53RJ/
  207. QlFtG5MQUy2599Gxp8BMGaXLH5yo4qwvNvY6CDUCgYEArxr7AwX7rKZlZ/sV4HHY
  208. gzVu+R7aY0DibiRATO5X7rrNuhLgI+UCDNqvNLn6FqeGdvpcsmDneeozQwmDL77G
  209. ey7KHyBBcF4tquQQxtRwHX+i1yUz8p+W7AX1WLrRSezjeenJ2QhUE1849hGjZeE2
  210. g546lq2Kub2enfPhVWsiSLECgYEA72T5QCPeVuLioUH5Q5Kvf1K7W+xcnr9A2xHP
  211. Vqwgtre5qFQ/tFuXZuIlWXbjnyY6aiwhrZYjntm0f7pRgrt2nHj/fafOdVPK8Voc
  212. xU4+SSbHntPWVw0qtVcUEjzVzRauvwMaJ43tZ0DpEnwNdO5i1oTObwF+x+jLFWZP
  213. TdwIinECgYBzjZeCxxOMk5SlPpTsLUtgC+q3m1AavXhUVNEPP2gKMOIPTETPbhbG
  214. LBxB2vVbJiS3J7itQy8gceT89O0vSEZnaTPXiM/Ws1QbkBJ8yW7KI7X4WuzN4Imq
  215. /cLBRXLb8R328U27YyQFNGMjr2tX/+vx5FulJjSloWMRNuFWUngv7w==
  216. -----END RSA PRIVATE KEY-----`
  217. rsaCert = `-----BEGIN CERTIFICATE-----
  218. MIIC+jCCAeKgAwIBAgIRANBDimJ/ww2tz77qcYIhuZowDQYJKoZIhvcNAQELBQAw
  219. EjEQMA4GA1UEChMHQWNtZSBDbzAeFw0xNjA5MjQxNzI5MTlaFw0yNjA5MjIxNzI5
  220. MTlaMBIxEDAOBgNVBAoTB0FjbWUgQ28wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
  221. ggEKAoIBAQDUMdwgzdJOEWrLycCQ9AVfQTumHyOqHwQBNevKMoca5WNHdeE5DQFI
  222. +gnHJ92D9UTB68Wu2ZkB/PRYJvG8/ZJUKZ/uihuDhXYo9Kjec232+UEVSd5G0jId
  223. FDxhGcZJZpEfMltfp9+W2cbZoP7ypR+TXrWt1mDEED0bQZrjsiTBCFPYeq4fd1bZ
  224. S7hbZYzK3qBf+13IQBXnsw49yhx6Sevs1vaR+K4M9HuHrAWtbcjp6iPyhfZKQg65
  225. U23VnfUEBRw8kNSOqikjSj22iUz/tfXczx0RjQ4lBWvsVBgMX0l5Jh4QzJvCLOMF
  226. ocObjyZKCE/WjlSyxAFs00Lzdu1cKOItAgMBAAGjSzBJMA4GA1UdDwEB/wQEAwIF
  227. oDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMBQGA1UdEQQNMAuC
  228. CWxvY2FsaG9zdDANBgkqhkiG9w0BAQsFAAOCAQEAygPV4enmvwSuMd1JarxOXpOK
  229. Z4Nsk7EKlfCPgzxQUOkFdLIr5ZG1kUkQt/omzTmoIWjLAsoYzT0ZCPOrioczKsWj
  230. MceFUIkT0w+eIl+8DzauPy34o8rjcApglF165UG3iphlpI+jdPzv5TBarUAbwsFb
  231. ClMLEiNJQ0OMxAIaRtb2RehD4q3OWlpWf6joJ36PRBqL8T5+f2x6Tg3c64UR+QPX
  232. 98UcCQHHdEhm7y2z5Z2Wt0B48tZ+UAxDEoEwMghNyw7wUD79IRlXGYypBnXaMuLX
  233. 46aGxbsSQ7Rfg62Co3JG7vo+eJd0AoZHrtFUnfM8V70IFzMBZnSwRslHRJe56Q==
  234. -----END CERTIFICATE-----`
  235. rsaCa_client = `-----BEGIN CERTIFICATE-----
  236. MIIFYDCCA0igAwIBAgIJAPpBgIvtQb1EMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
  237. BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
  238. aWRnaXRzIFB0eSBMdGQwHhcNMTgwMjEzMjAxNjA3WhcNMTkwMjEzMjAxNjA3WjBF
  239. MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50
  240. ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
  241. CgKCAgEAr4xgdmB4DaEh8zRFmg/1ZxYhQZMUP0iQX/Y8nDWxNlcd42p3TgpY1biz
  242. jrq58ln9Om4U/GAn2RmtBAynSBXIlR5oVa44JeMM8Ka8R/dMKyHpF0Nj2EJB9unb
  243. TC33PfzOlnKQxATwevnnhI6tGluWmwvxXUi7WnX0di+nQg9HrIVom3KrmRr2/41y
  244. g497ccYUuNnKE6sewGdGzw045oWZpMDA2Us+MFo1IywOurjaM9bueRhPTcIiQ8RE
  245. h7qb+FRwfxaj9ynZA2PCM7WMSSWCiZJV0uj/pshYF2lvtJcJef4dhwnsYBpc+mgx
  246. 2q9qcUBeo3ZHbi1/PRqjwSmcW3yY5cQRbpYp6xFmgmX3oHQkVXS0UlpNVZ+morcS
  247. HEpaK8b76fCFcL5yFsAJkPPfny1IKU+CfaVq60dM/mxbEW6J4mZT/uAiqrCilMC+
  248. FyiATCZur8Ks7p47eZy700DllLod7gWTiuZTgHeQFVoX+jxbCZKlFn5Xspu8ALoK
  249. Mla/q83mICRVy3+eMUsD7DNvoWYpCAYy/oMk0VWfrQ48JkCGbBW2PW/dU2nmqVhY
  250. /11rurkr+1TUvYodnajANtXvUjW1DPOLb4dES4Qc4b7Fw8eFXrARhl5mXiL5HFKR
  251. /VnRshiJ+QwTVkxl+KkZHEm/WS8QD+Zd8leAxh9MCoaU/XrBUBkCAwEAAaNTMFEw
  252. HQYDVR0OBBYEFKUinuD1xRvcNd2Wti/PnBJp7On1MB8GA1UdIwQYMBaAFKUinuD1
  253. xRvcNd2Wti/PnBJp7On1MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD
  254. ggIBAJdJrNBftqkTs2HyuJ3x5RIsTxYh85hJYwNOdFLyzVG6HER9jRCnvmNTjG0O
  255. I5wz5hQvDpwXs4BCCXHQZrTLAi3BEjq3AjrmR/XeGHulbWh3eh8LVu7MiLRgt+Ys
  256. GnL2IaERrbkje24nCCMNPbI3fGDQEhTIYmmX8RJp+5BOJgCycKk6pFgfrjJv2C+d
  257. 78pcjlYII6M4vPnr/a08M49Bq6b5ADvIfe5G2KrUvD/+vwoAwv6d/daymHCQ2rY5
  258. kmdVk9VUp3Q4uKoeej4ENJSAUNTV7oTu346oc7q9sJffB5OltqbrE7ichak7lL+v
  259. EjArZHElAhKNFXRZViCMvGDs+7JztqbsfT8Xb6Z27e+WyudB2bOUGm3hKuTIl06D
  260. bA7yUskwEhmkd1CJqO5RLEJjKitOqe6Ye0/GsmPQNDK8GvyXTyGQK5OqBuzEexF0
  261. mlPoIhpSVH3K9SkRTTHvvcbdYlaQLi6gKq2uhbk4PnS2nfBtXqYIy9mxcgBJzLiB
  262. /ydfLcf3GClwgvO1JHp6qAl4CO7oe8jqHpoGuznwi1aqkTyNkQWh0OXq3MS+dyqB
  263. 2yXFCFIeKCx18TE1OtuTD3ppBDjpyd0o/a6kYR3FDmdks/J33bGwLsLH3lbN6VjF
  264. PNfNkaE1tfkpSGYsuT1DPxX8aAT4JLUfZ1Si6iO+E0Sj9LXA
  265. -----END CERTIFICATE-----`
  266. ecdsaCert = `-----BEGIN CERTIFICATE-----
  267. MIIBbTCCAROgAwIBAgIQZCsHZcs5ZkzV+zC2E6j5RzAKBggqhkjOPQQDAjASMRAw
  268. DgYDVQQKEwdBY21lIENvMB4XDTE2MDkyNDE3NTE1OFoXDTI2MDkyMjE3NTE1OFow
  269. EjEQMA4GA1UEChMHQWNtZSBDbzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABDTO
  270. B3IyzjYfKCp2HWy+P3QHxhdBT4AUGYgwTiSEj5phumPIahFNcOSWptN0UzlZvJdN
  271. MMjVmrFYK/FjF4abkNKjSzBJMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggr
  272. BgEFBQcDATAMBgNVHRMBAf8EAjAAMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAKBggq
  273. hkjOPQQDAgNIADBFAiEAp9W157PM1IadPBc33Cbj7vaFvp+rXs/hSuMCzP8pgV8C
  274. IHCswo1qiC0ZjQmWsBlmz5Zbp9rOorIzBYmGRhRdNs3j
  275. -----END CERTIFICATE-----`
  276. ecdsaKey = `-----BEGIN EC PRIVATE KEY-----
  277. MHcCAQEEIFdhO7IW5UIwpB1e2Vunm9QyKvUHWcVwGfLjhpOajuR7oAoGCCqGSM49
  278. AwEHoUQDQgAENM4HcjLONh8oKnYdbL4/dAfGF0FPgBQZiDBOJISPmmG6Y8hqEU1w
  279. 5Jam03RTOVm8l00wyNWasVgr8WMXhpuQ0g==
  280. -----END EC PRIVATE KEY-----`
  281. )