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.

337 Zeilen
12 KiB

  1. // Copyright 2018 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package tls
  5. import (
  6. "crypto"
  7. "crypto/x509"
  8. "encoding/asn1"
  9. "encoding/pem"
  10. "fmt"
  11. "testing"
  12. "time"
  13. )
  14. // These test keys were generated with the following program, available in the
  15. // crypto/tls directory:
  16. //
  17. // go run generate_cert.go -ecdsa-curve P256 -host 127.0.0.1 -dc
  18. //
  19. // To get a certificate without the DelegationUsage extension, remove the `-dc`
  20. // parameter.
  21. var delegatorCertPEM = `-----BEGIN CERTIFICATE-----
  22. MIIBdzCCAR2gAwIBAgIQLVIvEpo0/0TzRja4ImvB1TAKBggqhkjOPQQDAjASMRAw
  23. DgYDVQQKEwdBY21lIENvMB4XDTE4MDcwMzE2NTE1M1oXDTE5MDcwMzE2NTE1M1ow
  24. EjEQMA4GA1UEChMHQWNtZSBDbzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOhB
  25. U6adaAgliLaFc1PAo9HBO4Wish1G4df3IK5EXLy+ooYfmkfzT1FxqbNLZufNYzve
  26. 25fmpal/1VJAjpVyKq2jVTBTMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggr
  27. BgEFBQcDATAMBgNVHRMBAf8EAjAAMA8GA1UdEQQIMAaHBH8AAAEwDQYJKwYBBAGC
  28. 2kssBAAwCgYIKoZIzj0EAwIDSAAwRQIhAPNwRk6cygm6zO5rjOzohKYWS+1KuWCM
  29. OetDIvU4mdyoAiAGN97y3GJccYn9ZOJS4UOqhr9oO8PuZMLgdq4OrMRiiA==
  30. -----END CERTIFICATE-----
  31. `
  32. var delegatorKeyPEM = `-----BEGIN EC PRIVATE KEY-----
  33. MHcCAQEEIJDVlo+sJolMcNjMkfCGDUjMJcE4UgclcXGCrOtbJAi2oAoGCCqGSM49
  34. AwEHoUQDQgAE6EFTpp1oCCWItoVzU8Cj0cE7haKyHUbh1/cgrkRcvL6ihh+aR/NP
  35. UXGps0tm581jO97bl+alqX/VUkCOlXIqrQ==
  36. -----END EC PRIVATE KEY-----
  37. `
  38. var nonDelegatorCertPEM = `-----BEGIN CERTIFICATE-----
  39. MIIBaTCCAQ6gAwIBAgIQSUo+9uaip3qCW+1EPeHZgDAKBggqhkjOPQQDAjASMRAw
  40. DgYDVQQKEwdBY21lIENvMB4XDTE4MDYxMjIzNDAyNloXDTE5MDYxMjIzNDAyNlow
  41. EjEQMA4GA1UEChMHQWNtZSBDbzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABLf7
  42. fiznPVdc3V5mM3ymswU2/IoJaq/deA6dgdj50ozdYyRiAPjxzcz9zRsZw1apTF/h
  43. yNfiLhV4EE1VrwXcT5OjRjBEMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggr
  44. BgEFBQcDATAMBgNVHRMBAf8EAjAAMA8GA1UdEQQIMAaHBH8AAAEwCgYIKoZIzj0E
  45. AwIDSQAwRgIhANXG0zmrVtQBK0TNZZoEGMOtSwxmiZzXNe+IjdpxO3TiAiEA5VYx
  46. 0CWJq5zqpVXbJMeKVMASo2nrXZoA6NhJvFQ97hw=
  47. -----END CERTIFICATE-----
  48. `
  49. var nonDelegatorKeyPEM = `-----BEGIN EC PRIVATE KEY-----
  50. MHcCAQEEIMw9DiOfGI1E/XZrrW2huZSjYi0EKwvVjAe+dYtyFsSloAoGCCqGSM49
  51. AwEHoUQDQgAEt/t+LOc9V1zdXmYzfKazBTb8iglqr914Dp2B2PnSjN1jJGIA+PHN
  52. zP3NGxnDVqlMX+HI1+IuFXgQTVWvBdxPkw==
  53. -----END EC PRIVATE KEY-----
  54. `
  55. var dcTestDCsPEM = `-----BEGIN DC TEST DATA-----
  56. MIIGQzCCAToTBXRsczEyAgIDAwICBAMEga0ACUp3AFswWTATBgcqhkjOPQIBBggq
  57. hkjOPQMBBwNCAAQ9z9RDrMvyRzPOkw9SK2S/O5DiwfRNjAwYcq7e/sKdN0ZcSP1K
  58. se/+ZDXfruwyviuq+h5oSzWPoejHHx7jnwBTBAMASDBGAiEAtYH/x0Ue2B2a34WG
  59. Oj9wVPJeyYBXxIbUrCdqfoQzq2oCIQCJYtwRE9UJvAQKve4ulJOr+zGjN8jG4tdg
  60. 9YSb/yOQgQR5MHcCAQEEIOBCmSaGwzZtXOJRCbA03GgxegoSV5GasVjJlttpUAPh
  61. oAoGCCqGSM49AwEHoUQDQgAEPc/UQ6zL8kczzpMPUitkvzuQ4sH0TYwMGHKu3v7C
  62. nTdGXEj9SrHv/mQ1367sMr4rqvoeaEs1j6Hoxx8e458AUzCCATgTBXRsczEzAgJ/
  63. FwICBAMEgasACUp3AFswWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARcqxvo0JO1
  64. yiXoBhV/T2hmkUhwMnP5XtTJCGGfI0ILShmTeuTcScmiTuzo3qA/HVmr2sdnfBvx
  65. zhQOYXrsfTNxBAMARjBEAiB8xrQk3DRFkACXMLZTJ1jAml/2zj/Vqc4cav0xi9zk
  66. dQIgDSrNtkK1akKGeNt7Iquv0lLZgyLp1i+rwQwOTdbw6ScEeTB3AgEBBCC7JqZM
  67. yIFzXdTmuYIUqOGQ602V4VtQttg/Oh2NuSCteKAKBggqhkjOPQMBB6FEA0IABFyr
  68. G+jQk7XKJegGFX9PaGaRSHAyc/le1MkIYZ8jQgtKGZN65NxJyaJO7OjeoD8dWava
  69. x2d8G/HOFA5heux9M3EwggE9EwdpbnZhbGlkAgMA/wACAgQDBIGtAAlKdwBbMFkw
  70. EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEdlKK5Dv35nOxaTS0LGqBnQstHSqVFIoZ
  71. FsHGdXuR2N4pAoMkUF0w94+BZ/KHm1Djv/ugELm0aMHp8SBbJV3JVQQDAEgwRgIh
  72. AL/gfo5JGFV/pNZe4ktc2yO41a4ipFvb8WIv8qn29gjoAiEAw1DB1EelNEfjl+fp
  73. CDMT+mdFKRDMnXTRrM2K8gI1QsEEeTB3AgEBBCCdu3sMkUAsbHAcYOZ9wJnQujWr
  74. 5UqPQotIys9hqJ3PTaAKBggqhkjOPQMBB6FEA0IABHZSiuQ79+ZzsWk0tCxqgZ0L
  75. LR0qlRSKGRbBxnV7kdjeKQKDJFBdMPePgWfyh5tQ47/7oBC5tGjB6fEgWyVdyVUw
  76. ggFAEwttYWxmb3JtZWQxMgICAwMCAgQDBIGtAAlKdwBbMFkwEwYHKoZIzj0CAQYI
  77. KoZIzj0DAQcDQgAEn8Rr7eedTHuGJjv7mglv7nJrV7KMDE2A33v8EAMGU+AvRq2m
  78. XNIoc+a6JxpYetjTnT3s8TW4qWXq9dJzw3VAVgQDAEgwRgIhAKEVbifQNllzjTwX
  79. s5CUsN42Eo8R8WTiFNSbhJmqDKsCAiEA4cqhQA2Cop2WtuOAG3aMnO9MKAPxLeUc
  80. fEmnM658P3kEeTB3AgEBBCAR4EtE/WbJIc6id2bLOR4xgis7mzOWJdiRAiGKNshB
  81. iKAKBggqhkjOPQMBB6FEA0IABF/2VNK9W/QsMdiBn3qdG19trNMAFvVM0JbeBHin
  82. gl/7WVXGBk0WzgvmA0qSH4Bc7d8z8n3JKdmByYPgpxTjbFUwggFAEwttYWxmb3Jt
  83. ZWQxMwICAwQCAgQDBIGtAAlKdwBbMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
  84. FGWBYWhjdr9al2imEFlGx+r0tQdcEqL/Qtf7imo/z5fr2z+tG3TawC0QeHU6uyRX
  85. 8zPvZGJ/Xps5q3RBI0tVggQDAEgwRgIhAMv30xlPKpajZuahNRHx3AlGtM9mNt5K
  86. WbWvhqDXhlVgAiEAxqI0K57Y9p9lLC8cSoy2arppjPMWKkVA4G2ck2n4NwUEeTB3
  87. AgEBBCCaruxlln2bwAX0EGy4oge0EpSDObt8Z+pNqx1nxDYyYKAKBggqhkjOPQMB
  88. B6FEA0IABBYfBBlgDC3TLkbJJTTJaZMXiXvDkUiWMeYFpcbAHdvMI8zoS6b++Zgc
  89. HJbn52hmB027JEIMPWsxKxPkr7udk7Q=
  90. -----END DC TEST DATA-----
  91. `
  92. type dcTestDC struct {
  93. Name string
  94. Version int
  95. Scheme int
  96. DC []byte
  97. PrivateKey []byte
  98. }
  99. var dcTestDCs []dcTestDC
  100. var dcTestConfig *Config
  101. var dcTestDelegationCert Certificate
  102. var dcTestCert Certificate
  103. var dcTestNow time.Time
  104. func init() {
  105. // Parse the PEM-encoded DER block containing the test DCs.
  106. block, _ := pem.Decode([]byte(dcTestDCsPEM))
  107. if block == nil {
  108. panic("failed to decode DC tests PEM block")
  109. }
  110. // Parse the DER-encoded test DCs.
  111. _, err := asn1.Unmarshal(block.Bytes, &dcTestDCs)
  112. if err != nil {
  113. panic("failed to unmarshal DC test ASN.1 data")
  114. }
  115. // Use a static time for testing. This is the point at which the test DCs
  116. // were generated.
  117. dcTestNow = time.Date(2018, 07, 03, 18, 0, 0, 234234, time.UTC)
  118. // The base configuration for the client and server.
  119. dcTestConfig = &Config{
  120. Time: func() time.Time {
  121. return dcTestNow
  122. },
  123. Rand: zeroSource{},
  124. Certificates: nil,
  125. MinVersion: VersionTLS10,
  126. MaxVersion: VersionTLS13Draft22,
  127. CipherSuites: allCipherSuites(),
  128. }
  129. // The delegation certificate.
  130. dcTestDelegationCert, err = X509KeyPair([]byte(delegatorCertPEM), []byte(delegatorKeyPEM))
  131. if err != nil {
  132. panic(err)
  133. }
  134. dcTestDelegationCert.Leaf, err = x509.ParseCertificate(dcTestDelegationCert.Certificate[0])
  135. if err != nil {
  136. panic(err)
  137. }
  138. // A certificate without the the DelegationUsage extension for X.509.
  139. dcTestCert, err = X509KeyPair([]byte(nonDelegatorCertPEM), []byte(nonDelegatorKeyPEM))
  140. if err != nil {
  141. panic(err)
  142. }
  143. dcTestCert.Leaf, err = x509.ParseCertificate(dcTestCert.Certificate[0])
  144. if err != nil {
  145. panic(err)
  146. }
  147. // Make these roots of these certificates the client's trusted CAs.
  148. dcTestConfig.RootCAs = x509.NewCertPool()
  149. raw := dcTestDelegationCert.Certificate[len(dcTestDelegationCert.Certificate)-1]
  150. root, err := x509.ParseCertificate(raw)
  151. if err != nil {
  152. panic(err)
  153. }
  154. dcTestConfig.RootCAs.AddCert(root)
  155. raw = dcTestCert.Certificate[len(dcTestCert.Certificate)-1]
  156. root, err = x509.ParseCertificate(raw)
  157. if err != nil {
  158. panic(err)
  159. }
  160. dcTestConfig.RootCAs.AddCert(root)
  161. }
  162. // Tests the handshake and one round of application data. Returns true if the
  163. // connection used a DC.
  164. func testConnWithDC(t *testing.T, clientMsg, serverMsg string, clientConfig, serverConfig *Config) (bool, error) {
  165. ln := newLocalListener(t)
  166. defer ln.Close()
  167. // Listen for and serve a single client connection.
  168. srvCh := make(chan *Conn, 1)
  169. var serr error
  170. go func() {
  171. sconn, err := ln.Accept()
  172. if err != nil {
  173. serr = err
  174. srvCh <- nil
  175. return
  176. }
  177. srv := Server(sconn, serverConfig)
  178. if err := srv.Handshake(); err != nil {
  179. serr = fmt.Errorf("handshake: %v", err)
  180. srvCh <- nil
  181. return
  182. }
  183. srvCh <- srv
  184. }()
  185. // Dial the server.
  186. cli, err := Dial("tcp", ln.Addr().String(), clientConfig)
  187. if err != nil {
  188. return false, err
  189. }
  190. defer cli.Close()
  191. srv := <-srvCh
  192. if srv == nil {
  193. return false, serr
  194. }
  195. bufLen := len(clientMsg)
  196. if len(serverMsg) > len(clientMsg) {
  197. bufLen = len(serverMsg)
  198. }
  199. buf := make([]byte, bufLen)
  200. // Client sends a message to the server, which is read by the server.
  201. cli.Write([]byte(clientMsg))
  202. n, err := srv.Read(buf)
  203. if n != len(clientMsg) || string(buf[:n]) != clientMsg {
  204. return false, fmt.Errorf("Server read = %d, buf= %q; want %d, %s", n, buf, len(clientMsg), clientMsg)
  205. }
  206. // Server reads a message from the client, which is read by the client.
  207. srv.Write([]byte(serverMsg))
  208. n, err = cli.Read(buf)
  209. if n != len(serverMsg) || err != nil || string(buf[:n]) != serverMsg {
  210. return false, fmt.Errorf("Client read = %d, %v, data %q; want %d, nil, %s", n, err, buf, len(serverMsg), serverMsg)
  211. }
  212. // Return true if the client's conn.dc structure was instantiated.
  213. return (cli.verifiedDc != nil), nil
  214. }
  215. // Checks that the client suppports a version >= 1.2 and accepts delegated
  216. // credentials. If so, it returns the delegation certificate; otherwise it
  217. // returns a plain certificate.
  218. func testServerGetCertificate(ch *ClientHelloInfo) (*Certificate, error) {
  219. versOk := false
  220. for _, vers := range ch.SupportedVersions {
  221. versOk = versOk || (vers >= uint16(VersionTLS12))
  222. }
  223. if versOk && ch.AcceptsDelegatedCredential {
  224. return &dcTestDelegationCert, nil
  225. }
  226. return &dcTestCert, nil
  227. }
  228. // Various test cases for handshakes involving DCs.
  229. var dcTests = []struct {
  230. clientDC bool
  231. serverDC bool
  232. clientSkipVerify bool
  233. clientMaxVers uint16
  234. serverMaxVers uint16
  235. nowOffset time.Duration
  236. dcTestName string
  237. expectSuccess bool
  238. expectDC bool
  239. name string
  240. }{
  241. {true, true, false, VersionTLS12, VersionTLS12, 0, "tls12", true, true, "tls12"},
  242. {true, true, false, VersionTLS13, VersionTLS13, 0, "tls13", true, true, "tls13"},
  243. {true, true, false, VersionTLS12, VersionTLS12, 0, "malformed12", false, false, "tls12, malformed dc"},
  244. {true, true, false, VersionTLS13, VersionTLS13, 0, "malformed13", false, false, "tls13, malformed dc"},
  245. {true, true, true, VersionTLS12, VersionTLS12, 0, "invalid", true, true, "tls12, invalid dc, skip verify"},
  246. {true, true, true, VersionTLS13, VersionTLS13, 0, "invalid", true, true, "tls13, invalid dc, skip verify"},
  247. {false, true, false, VersionTLS12, VersionTLS12, 0, "tls12", true, false, "client no dc"},
  248. {true, false, false, VersionTLS12, VersionTLS12, 0, "tls12", true, false, "server no dc"},
  249. {true, true, false, VersionTLS11, VersionTLS12, 0, "tls12", true, false, "client old"},
  250. {true, true, false, VersionTLS12, VersionTLS11, 0, "tls12", true, false, "server old"},
  251. {true, true, false, VersionTLS13, VersionTLS13, dcMaxTTL, "tls13", false, false, "expired dc"},
  252. }
  253. // Tests the handshake with the delegated credential extension for each test
  254. // case in dcTests.
  255. func TestDCHandshake(t *testing.T) {
  256. serverMsg := "hello"
  257. clientMsg := "world"
  258. clientConfig := dcTestConfig.Clone()
  259. serverConfig := dcTestConfig.Clone()
  260. serverConfig.GetCertificate = testServerGetCertificate
  261. for i, test := range dcTests {
  262. clientConfig.MaxVersion = test.clientMaxVers
  263. serverConfig.MaxVersion = test.serverMaxVers
  264. clientConfig.InsecureSkipVerify = test.clientSkipVerify
  265. clientConfig.AcceptDelegatedCredential = test.clientDC
  266. clientConfig.Time = func() time.Time {
  267. return dcTestNow.Add(time.Duration(test.nowOffset))
  268. }
  269. if test.serverDC {
  270. serverConfig.GetDelegatedCredential = func(
  271. ch *ClientHelloInfo, vers uint16) (*DelegatedCredential, crypto.PrivateKey, error) {
  272. for _, t := range dcTestDCs {
  273. if t.Name == test.dcTestName {
  274. dc, err := UnmarshalDelegatedCredential(t.DC)
  275. if err != nil {
  276. return nil, nil, err
  277. }
  278. sk, err := x509.ParseECPrivateKey(t.PrivateKey)
  279. if err != nil {
  280. return nil, nil, err
  281. }
  282. return dc, sk, nil
  283. }
  284. }
  285. return nil, nil, fmt.Errorf("Test DC with name '%s' not found", test.dcTestName)
  286. }
  287. } else {
  288. serverConfig.GetDelegatedCredential = nil
  289. }
  290. usedDC, err := testConnWithDC(t, clientMsg, serverMsg, clientConfig, serverConfig)
  291. if err != nil && test.expectSuccess {
  292. t.Errorf("test #%d (%s) fails: %s", i+1, test.name, err)
  293. } else if err == nil && !test.expectSuccess {
  294. t.Errorf("test #%d (%s) succeeds; expected failure", i+1, test.name)
  295. }
  296. if usedDC != test.expectDC {
  297. t.Errorf("test #%d (%s) usedDC = %v; expected %v", i+1, test.name, usedDC, test.expectDC)
  298. }
  299. }
  300. }