Alternative TLS implementation in Go
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

337 lignes
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. }