tls_test.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464
  1. // Copyright 2012 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. "bytes"
  7. "errors"
  8. "fmt"
  9. "io"
  10. "net"
  11. "strings"
  12. "testing"
  13. "time"
  14. )
  15. var rsaCertPEM = `-----BEGIN CERTIFICATE-----
  16. MIIB0zCCAX2gAwIBAgIJAI/M7BYjwB+uMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV
  17. BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
  18. aWRnaXRzIFB0eSBMdGQwHhcNMTIwOTEyMjE1MjAyWhcNMTUwOTEyMjE1MjAyWjBF
  19. MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50
  20. ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANLJ
  21. hPHhITqQbPklG3ibCVxwGMRfp/v4XqhfdQHdcVfHap6NQ5Wok/4xIA+ui35/MmNa
  22. rtNuC+BdZ1tMuVCPFZcCAwEAAaNQME4wHQYDVR0OBBYEFJvKs8RfJaXTH08W+SGv
  23. zQyKn0H8MB8GA1UdIwQYMBaAFJvKs8RfJaXTH08W+SGvzQyKn0H8MAwGA1UdEwQF
  24. MAMBAf8wDQYJKoZIhvcNAQEFBQADQQBJlffJHybjDGxRMqaRmDhX0+6v02TUKZsW
  25. r5QuVbpQhH6u+0UgcW0jp9QwpxoPTLTWGXEWBBBurxFwiCBhkQ+V
  26. -----END CERTIFICATE-----
  27. `
  28. var rsaKeyPEM = `-----BEGIN RSA PRIVATE KEY-----
  29. MIIBOwIBAAJBANLJhPHhITqQbPklG3ibCVxwGMRfp/v4XqhfdQHdcVfHap6NQ5Wo
  30. k/4xIA+ui35/MmNartNuC+BdZ1tMuVCPFZcCAwEAAQJAEJ2N+zsR0Xn8/Q6twa4G
  31. 6OB1M1WO+k+ztnX/1SvNeWu8D6GImtupLTYgjZcHufykj09jiHmjHx8u8ZZB/o1N
  32. MQIhAPW+eyZo7ay3lMz1V01WVjNKK9QSn1MJlb06h/LuYv9FAiEA25WPedKgVyCW
  33. SmUwbPw8fnTcpqDWE3yTO3vKcebqMSsCIBF3UmVue8YU3jybC3NxuXq3wNm34R8T
  34. xVLHwDXh/6NJAiEAl2oHGGLz64BuAfjKrqwz7qMYr9HCLIe/YsoWq/olzScCIQDi
  35. D2lWusoe2/nEqfDVVWGWlyJ7yOmqaVm/iNUN9B2N2g==
  36. -----END RSA PRIVATE KEY-----
  37. `
  38. // keyPEM is the same as rsaKeyPEM, but declares itself as just
  39. // "PRIVATE KEY", not "RSA PRIVATE KEY". https://golang.org/issue/4477
  40. var keyPEM = `-----BEGIN PRIVATE KEY-----
  41. MIIBOwIBAAJBANLJhPHhITqQbPklG3ibCVxwGMRfp/v4XqhfdQHdcVfHap6NQ5Wo
  42. k/4xIA+ui35/MmNartNuC+BdZ1tMuVCPFZcCAwEAAQJAEJ2N+zsR0Xn8/Q6twa4G
  43. 6OB1M1WO+k+ztnX/1SvNeWu8D6GImtupLTYgjZcHufykj09jiHmjHx8u8ZZB/o1N
  44. MQIhAPW+eyZo7ay3lMz1V01WVjNKK9QSn1MJlb06h/LuYv9FAiEA25WPedKgVyCW
  45. SmUwbPw8fnTcpqDWE3yTO3vKcebqMSsCIBF3UmVue8YU3jybC3NxuXq3wNm34R8T
  46. xVLHwDXh/6NJAiEAl2oHGGLz64BuAfjKrqwz7qMYr9HCLIe/YsoWq/olzScCIQDi
  47. D2lWusoe2/nEqfDVVWGWlyJ7yOmqaVm/iNUN9B2N2g==
  48. -----END PRIVATE KEY-----
  49. `
  50. var ecdsaCertPEM = `-----BEGIN CERTIFICATE-----
  51. MIIB/jCCAWICCQDscdUxw16XFDAJBgcqhkjOPQQBMEUxCzAJBgNVBAYTAkFVMRMw
  52. EQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0
  53. eSBMdGQwHhcNMTIxMTE0MTI0MDQ4WhcNMTUxMTE0MTI0MDQ4WjBFMQswCQYDVQQG
  54. EwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lk
  55. Z2l0cyBQdHkgTHRkMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBY9+my9OoeSUR
  56. lDQdV/x8LsOuLilthhiS1Tz4aGDHIPwC1mlvnf7fg5lecYpMCrLLhauAc1UJXcgl
  57. 01xoLuzgtAEAgv2P/jgytzRSpUYvgLBt1UA0leLYBy6mQQbrNEuqT3INapKIcUv8
  58. XxYP0xMEUksLPq6Ca+CRSqTtrd/23uTnapkwCQYHKoZIzj0EAQOBigAwgYYCQXJo
  59. A7Sl2nLVf+4Iu/tAX/IF4MavARKC4PPHK3zfuGfPR3oCCcsAoz3kAzOeijvd0iXb
  60. H5jBImIxPL4WxQNiBTexAkF8D1EtpYuWdlVQ80/h/f4pBcGiXPqX5h2PQSQY7hP1
  61. +jwM1FGS4fREIOvlBYr/SzzQRtwrvrzGYxDEDbsC0ZGRnA==
  62. -----END CERTIFICATE-----
  63. `
  64. var ecdsaKeyPEM = `-----BEGIN EC PARAMETERS-----
  65. BgUrgQQAIw==
  66. -----END EC PARAMETERS-----
  67. -----BEGIN EC PRIVATE KEY-----
  68. MIHcAgEBBEIBrsoKp0oqcv6/JovJJDoDVSGWdirrkgCWxrprGlzB9o0X8fV675X0
  69. NwuBenXFfeZvVcwluO7/Q9wkYoPd/t3jGImgBwYFK4EEACOhgYkDgYYABAFj36bL
  70. 06h5JRGUNB1X/Hwuw64uKW2GGJLVPPhoYMcg/ALWaW+d/t+DmV5xikwKssuFq4Bz
  71. VQldyCXTXGgu7OC0AQCC/Y/+ODK3NFKlRi+AsG3VQDSV4tgHLqZBBus0S6pPcg1q
  72. kohxS/xfFg/TEwRSSws+roJr4JFKpO2t3/be5OdqmQ==
  73. -----END EC PRIVATE KEY-----
  74. `
  75. var keyPairTests = []struct {
  76. algo string
  77. cert string
  78. key string
  79. }{
  80. {"ECDSA", ecdsaCertPEM, ecdsaKeyPEM},
  81. {"RSA", rsaCertPEM, rsaKeyPEM},
  82. {"RSA-untyped", rsaCertPEM, keyPEM}, // golang.org/issue/4477
  83. }
  84. func TestX509KeyPair(t *testing.T) {
  85. var pem []byte
  86. for _, test := range keyPairTests {
  87. pem = []byte(test.cert + test.key)
  88. if _, err := X509KeyPair(pem, pem); err != nil {
  89. t.Errorf("Failed to load %s cert followed by %s key: %s", test.algo, test.algo, err)
  90. }
  91. pem = []byte(test.key + test.cert)
  92. if _, err := X509KeyPair(pem, pem); err != nil {
  93. t.Errorf("Failed to load %s key followed by %s cert: %s", test.algo, test.algo, err)
  94. }
  95. }
  96. }
  97. func TestX509KeyPairErrors(t *testing.T) {
  98. _, err := X509KeyPair([]byte(rsaKeyPEM), []byte(rsaCertPEM))
  99. if err == nil {
  100. t.Fatalf("X509KeyPair didn't return an error when arguments were switched")
  101. }
  102. if subStr := "been switched"; !strings.Contains(err.Error(), subStr) {
  103. t.Fatalf("Expected %q in the error when switching arguments to X509KeyPair, but the error was %q", subStr, err)
  104. }
  105. _, err = X509KeyPair([]byte(rsaCertPEM), []byte(rsaCertPEM))
  106. if err == nil {
  107. t.Fatalf("X509KeyPair didn't return an error when both arguments were certificates")
  108. }
  109. if subStr := "certificate"; !strings.Contains(err.Error(), subStr) {
  110. t.Fatalf("Expected %q in the error when both arguments to X509KeyPair were certificates, but the error was %q", subStr, err)
  111. }
  112. const nonsensePEM = `
  113. -----BEGIN NONSENSE-----
  114. Zm9vZm9vZm9v
  115. -----END NONSENSE-----
  116. `
  117. _, err = X509KeyPair([]byte(nonsensePEM), []byte(nonsensePEM))
  118. if err == nil {
  119. t.Fatalf("X509KeyPair didn't return an error when both arguments were nonsense")
  120. }
  121. if subStr := "NONSENSE"; !strings.Contains(err.Error(), subStr) {
  122. t.Fatalf("Expected %q in the error when both arguments to X509KeyPair were nonsense, but the error was %q", subStr, err)
  123. }
  124. }
  125. func TestX509MixedKeyPair(t *testing.T) {
  126. if _, err := X509KeyPair([]byte(rsaCertPEM), []byte(ecdsaKeyPEM)); err == nil {
  127. t.Error("Load of RSA certificate succeeded with ECDSA private key")
  128. }
  129. if _, err := X509KeyPair([]byte(ecdsaCertPEM), []byte(rsaKeyPEM)); err == nil {
  130. t.Error("Load of ECDSA certificate succeeded with RSA private key")
  131. }
  132. }
  133. func newLocalListener(t *testing.T) net.Listener {
  134. ln, err := net.Listen("tcp", "127.0.0.1:0")
  135. if err != nil {
  136. ln, err = net.Listen("tcp6", "[::1]:0")
  137. }
  138. if err != nil {
  139. t.Fatal(err)
  140. }
  141. return ln
  142. }
  143. func TestDialTimeout(t *testing.T) {
  144. if testing.Short() {
  145. t.Skip("skipping in short mode")
  146. }
  147. listener := newLocalListener(t)
  148. addr := listener.Addr().String()
  149. defer listener.Close()
  150. complete := make(chan bool)
  151. defer close(complete)
  152. go func() {
  153. conn, err := listener.Accept()
  154. if err != nil {
  155. t.Error(err)
  156. return
  157. }
  158. <-complete
  159. conn.Close()
  160. }()
  161. dialer := &net.Dialer{
  162. Timeout: 10 * time.Millisecond,
  163. }
  164. var err error
  165. if _, err = DialWithDialer(dialer, "tcp", addr, nil); err == nil {
  166. t.Fatal("DialWithTimeout completed successfully")
  167. }
  168. if !strings.Contains(err.Error(), "timed out") {
  169. t.Errorf("resulting error not a timeout: %s", err)
  170. }
  171. }
  172. // tests that Conn.Read returns (non-zero, io.EOF) instead of
  173. // (non-zero, nil) when a Close (alertCloseNotify) is sitting right
  174. // behind the application data in the buffer.
  175. func TestConnReadNonzeroAndEOF(t *testing.T) {
  176. // This test is racy: it assumes that after a write to a
  177. // localhost TCP connection, the peer TCP connection can
  178. // immediately read it. Because it's racy, we skip this test
  179. // in short mode, and then retry it several times with an
  180. // increasing sleep in between our final write (via srv.Close
  181. // below) and the following read.
  182. if testing.Short() {
  183. t.Skip("skipping in short mode")
  184. }
  185. var err error
  186. for delay := time.Millisecond; delay <= 64*time.Millisecond; delay *= 2 {
  187. if err = testConnReadNonzeroAndEOF(t, delay); err == nil {
  188. return
  189. }
  190. }
  191. t.Error(err)
  192. }
  193. func testConnReadNonzeroAndEOF(t *testing.T, delay time.Duration) error {
  194. ln := newLocalListener(t)
  195. defer ln.Close()
  196. srvCh := make(chan *Conn, 1)
  197. var serr error
  198. go func() {
  199. sconn, err := ln.Accept()
  200. if err != nil {
  201. serr = err
  202. srvCh <- nil
  203. return
  204. }
  205. serverConfig := *testConfig
  206. srv := Server(sconn, &serverConfig)
  207. if err := srv.Handshake(); err != nil {
  208. serr = fmt.Errorf("handshake: %v", err)
  209. srvCh <- nil
  210. return
  211. }
  212. srvCh <- srv
  213. }()
  214. clientConfig := *testConfig
  215. conn, err := Dial("tcp", ln.Addr().String(), &clientConfig)
  216. if err != nil {
  217. t.Fatal(err)
  218. }
  219. defer conn.Close()
  220. srv := <-srvCh
  221. if srv == nil {
  222. return serr
  223. }
  224. buf := make([]byte, 6)
  225. srv.Write([]byte("foobar"))
  226. n, err := conn.Read(buf)
  227. if n != 6 || err != nil || string(buf) != "foobar" {
  228. return fmt.Errorf("Read = %d, %v, data %q; want 6, nil, foobar", n, err, buf)
  229. }
  230. srv.Write([]byte("abcdef"))
  231. srv.Close()
  232. time.Sleep(delay)
  233. n, err = conn.Read(buf)
  234. if n != 6 || string(buf) != "abcdef" {
  235. return fmt.Errorf("Read = %d, buf= %q; want 6, abcdef", n, buf)
  236. }
  237. if err != io.EOF {
  238. return fmt.Errorf("Second Read error = %v; want io.EOF", err)
  239. }
  240. return nil
  241. }
  242. func TestTLSUniqueMatches(t *testing.T) {
  243. ln := newLocalListener(t)
  244. defer ln.Close()
  245. serverTLSUniques := make(chan []byte)
  246. go func() {
  247. for i := 0; i < 2; i++ {
  248. sconn, err := ln.Accept()
  249. if err != nil {
  250. t.Fatal(err)
  251. }
  252. serverConfig := *testConfig
  253. srv := Server(sconn, &serverConfig)
  254. if err := srv.Handshake(); err != nil {
  255. t.Fatal(err)
  256. }
  257. serverTLSUniques <- srv.ConnectionState().TLSUnique
  258. }
  259. }()
  260. clientConfig := *testConfig
  261. clientConfig.ClientSessionCache = NewLRUClientSessionCache(1)
  262. conn, err := Dial("tcp", ln.Addr().String(), &clientConfig)
  263. if err != nil {
  264. t.Fatal(err)
  265. }
  266. if !bytes.Equal(conn.ConnectionState().TLSUnique, <-serverTLSUniques) {
  267. t.Error("client and server channel bindings differ")
  268. }
  269. conn.Close()
  270. conn, err = Dial("tcp", ln.Addr().String(), &clientConfig)
  271. if err != nil {
  272. t.Fatal(err)
  273. }
  274. defer conn.Close()
  275. if !conn.ConnectionState().DidResume {
  276. t.Error("second session did not use resumption")
  277. }
  278. if !bytes.Equal(conn.ConnectionState().TLSUnique, <-serverTLSUniques) {
  279. t.Error("client and server channel bindings differ when session resumption is used")
  280. }
  281. }
  282. func TestVerifyHostname(t *testing.T) {
  283. c, err := Dial("tcp", "www.google.com:https", nil)
  284. if err != nil {
  285. t.Fatal(err)
  286. }
  287. if err := c.VerifyHostname("www.google.com"); err != nil {
  288. t.Fatalf("verify www.google.com: %v", err)
  289. }
  290. if err := c.VerifyHostname("www.yahoo.com"); err == nil {
  291. t.Fatalf("verify www.yahoo.com succeeded")
  292. }
  293. c, err = Dial("tcp", "www.google.com:https", &Config{InsecureSkipVerify: true})
  294. if err != nil {
  295. t.Fatal(err)
  296. }
  297. if err := c.VerifyHostname("www.google.com"); err == nil {
  298. t.Fatalf("verify www.google.com succeeded with InsecureSkipVerify=true")
  299. }
  300. if err := c.VerifyHostname("www.yahoo.com"); err == nil {
  301. t.Fatalf("verify www.google.com succeeded with InsecureSkipVerify=true")
  302. }
  303. }
  304. func TestVerifyHostnameResumed(t *testing.T) {
  305. config := &Config{
  306. ClientSessionCache: NewLRUClientSessionCache(32),
  307. }
  308. for i := 0; i < 2; i++ {
  309. c, err := Dial("tcp", "www.google.com:https", config)
  310. if err != nil {
  311. t.Fatalf("Dial #%d: %v", i, err)
  312. }
  313. cs := c.ConnectionState()
  314. if i > 0 && !cs.DidResume {
  315. t.Fatalf("Subsequent connection unexpectedly didn't resume")
  316. }
  317. if cs.VerifiedChains == nil {
  318. t.Fatalf("Dial #%d: cs.VerifiedChains == nil", i)
  319. }
  320. if err := c.VerifyHostname("www.google.com"); err != nil {
  321. t.Fatalf("verify www.google.com #%d: %v", i, err)
  322. }
  323. c.Close()
  324. }
  325. }
  326. func TestConnCloseBreakingWrite(t *testing.T) {
  327. ln := newLocalListener(t)
  328. defer ln.Close()
  329. srvCh := make(chan *Conn, 1)
  330. var serr error
  331. var sconn net.Conn
  332. go func() {
  333. var err error
  334. sconn, err = ln.Accept()
  335. if err != nil {
  336. serr = err
  337. srvCh <- nil
  338. return
  339. }
  340. serverConfig := *testConfig
  341. srv := Server(sconn, &serverConfig)
  342. if err := srv.Handshake(); err != nil {
  343. serr = fmt.Errorf("handshake: %v", err)
  344. srvCh <- nil
  345. return
  346. }
  347. srvCh <- srv
  348. }()
  349. cconn, err := net.Dial("tcp", ln.Addr().String())
  350. if err != nil {
  351. t.Fatal(err)
  352. }
  353. defer cconn.Close()
  354. conn := &changeImplConn{
  355. Conn: cconn,
  356. }
  357. clientConfig := *testConfig
  358. tconn := Client(conn, &clientConfig)
  359. if err := tconn.Handshake(); err != nil {
  360. t.Fatal(err)
  361. }
  362. srv := <-srvCh
  363. if srv == nil {
  364. t.Fatal(serr)
  365. }
  366. defer sconn.Close()
  367. connClosed := make(chan struct{})
  368. conn.closeFunc = func() error {
  369. close(connClosed)
  370. return nil
  371. }
  372. inWrite := make(chan bool, 1)
  373. var errConnClosed = errors.New("conn closed for test")
  374. conn.writeFunc = func(p []byte) (n int, err error) {
  375. inWrite <- true
  376. <-connClosed
  377. return 0, errConnClosed
  378. }
  379. closeReturned := make(chan bool, 1)
  380. go func() {
  381. <-inWrite
  382. tconn.Close() // test that this doesn't block forever.
  383. closeReturned <- true
  384. }()
  385. _, err = tconn.Write([]byte("foo"))
  386. if err != errConnClosed {
  387. t.Errorf("Write error = %v; want errConnClosed", err)
  388. }
  389. <-closeReturned
  390. if err := tconn.Close(); err != errClosed {
  391. t.Errorf("Close error = %v; want errClosed", err)
  392. }
  393. }
  394. // changeImplConn is a net.Conn which can change its Write and Close
  395. // methods.
  396. type changeImplConn struct {
  397. net.Conn
  398. writeFunc func([]byte) (int, error)
  399. closeFunc func() error
  400. }
  401. func (w *changeImplConn) Write(p []byte) (n int, err error) {
  402. if w.writeFunc != nil {
  403. return w.writeFunc(p)
  404. }
  405. return w.Conn.Write(p)
  406. }
  407. func (w *changeImplConn) Close() error {
  408. if w.closeFunc != nil {
  409. return w.closeFunc()
  410. }
  411. return w.Conn.Close()
  412. }