PageRenderTime 50ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/third_party/gofrontend/libgo/go/net/smtp/smtp_test.go

http://github.com/axw/llgo
Go | 738 lines | 656 code | 68 blank | 14 comment | 164 complexity | 5513dac1021ddcb2baebaa1b8566d4f8 MD5 | raw file
Possible License(s): BSD-3-Clause, MIT
  1. // Copyright 2010 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 smtp
  5. import (
  6. "bufio"
  7. "bytes"
  8. "crypto/tls"
  9. "crypto/x509"
  10. "io"
  11. "net"
  12. "net/textproto"
  13. "strings"
  14. "testing"
  15. "time"
  16. )
  17. type authTest struct {
  18. auth Auth
  19. challenges []string
  20. name string
  21. responses []string
  22. }
  23. var authTests = []authTest{
  24. {PlainAuth("", "user", "pass", "testserver"), []string{}, "PLAIN", []string{"\x00user\x00pass"}},
  25. {PlainAuth("foo", "bar", "baz", "testserver"), []string{}, "PLAIN", []string{"foo\x00bar\x00baz"}},
  26. {CRAMMD5Auth("user", "pass"), []string{"<123456.1322876914@testserver>"}, "CRAM-MD5", []string{"", "user 287eb355114cf5c471c26a875f1ca4ae"}},
  27. }
  28. func TestAuth(t *testing.T) {
  29. testLoop:
  30. for i, test := range authTests {
  31. name, resp, err := test.auth.Start(&ServerInfo{"testserver", true, nil})
  32. if name != test.name {
  33. t.Errorf("#%d got name %s, expected %s", i, name, test.name)
  34. }
  35. if !bytes.Equal(resp, []byte(test.responses[0])) {
  36. t.Errorf("#%d got response %s, expected %s", i, resp, test.responses[0])
  37. }
  38. if err != nil {
  39. t.Errorf("#%d error: %s", i, err)
  40. }
  41. for j := range test.challenges {
  42. challenge := []byte(test.challenges[j])
  43. expected := []byte(test.responses[j+1])
  44. resp, err := test.auth.Next(challenge, true)
  45. if err != nil {
  46. t.Errorf("#%d error: %s", i, err)
  47. continue testLoop
  48. }
  49. if !bytes.Equal(resp, expected) {
  50. t.Errorf("#%d got %s, expected %s", i, resp, expected)
  51. continue testLoop
  52. }
  53. }
  54. }
  55. }
  56. func TestAuthPlain(t *testing.T) {
  57. auth := PlainAuth("foo", "bar", "baz", "servername")
  58. tests := []struct {
  59. server *ServerInfo
  60. err string
  61. }{
  62. {
  63. server: &ServerInfo{Name: "servername", TLS: true},
  64. },
  65. {
  66. // Okay; explicitly advertised by server.
  67. server: &ServerInfo{Name: "servername", Auth: []string{"PLAIN"}},
  68. },
  69. {
  70. server: &ServerInfo{Name: "servername", Auth: []string{"CRAM-MD5"}},
  71. err: "unencrypted connection",
  72. },
  73. {
  74. server: &ServerInfo{Name: "attacker", TLS: true},
  75. err: "wrong host name",
  76. },
  77. }
  78. for i, tt := range tests {
  79. _, _, err := auth.Start(tt.server)
  80. got := ""
  81. if err != nil {
  82. got = err.Error()
  83. }
  84. if got != tt.err {
  85. t.Errorf("%d. got error = %q; want %q", i, got, tt.err)
  86. }
  87. }
  88. }
  89. type faker struct {
  90. io.ReadWriter
  91. }
  92. func (f faker) Close() error { return nil }
  93. func (f faker) LocalAddr() net.Addr { return nil }
  94. func (f faker) RemoteAddr() net.Addr { return nil }
  95. func (f faker) SetDeadline(time.Time) error { return nil }
  96. func (f faker) SetReadDeadline(time.Time) error { return nil }
  97. func (f faker) SetWriteDeadline(time.Time) error { return nil }
  98. func TestBasic(t *testing.T) {
  99. server := strings.Join(strings.Split(basicServer, "\n"), "\r\n")
  100. client := strings.Join(strings.Split(basicClient, "\n"), "\r\n")
  101. var cmdbuf bytes.Buffer
  102. bcmdbuf := bufio.NewWriter(&cmdbuf)
  103. var fake faker
  104. fake.ReadWriter = bufio.NewReadWriter(bufio.NewReader(strings.NewReader(server)), bcmdbuf)
  105. c := &Client{Text: textproto.NewConn(fake), localName: "localhost"}
  106. if err := c.helo(); err != nil {
  107. t.Fatalf("HELO failed: %s", err)
  108. }
  109. if err := c.ehlo(); err == nil {
  110. t.Fatalf("Expected first EHLO to fail")
  111. }
  112. if err := c.ehlo(); err != nil {
  113. t.Fatalf("Second EHLO failed: %s", err)
  114. }
  115. c.didHello = true
  116. if ok, args := c.Extension("aUtH"); !ok || args != "LOGIN PLAIN" {
  117. t.Fatalf("Expected AUTH supported")
  118. }
  119. if ok, _ := c.Extension("DSN"); ok {
  120. t.Fatalf("Shouldn't support DSN")
  121. }
  122. if err := c.Mail("user@gmail.com"); err == nil {
  123. t.Fatalf("MAIL should require authentication")
  124. }
  125. if err := c.Verify("user1@gmail.com"); err == nil {
  126. t.Fatalf("First VRFY: expected no verification")
  127. }
  128. if err := c.Verify("user2@gmail.com"); err != nil {
  129. t.Fatalf("Second VRFY: expected verification, got %s", err)
  130. }
  131. // fake TLS so authentication won't complain
  132. c.tls = true
  133. c.serverName = "smtp.google.com"
  134. if err := c.Auth(PlainAuth("", "user", "pass", "smtp.google.com")); err != nil {
  135. t.Fatalf("AUTH failed: %s", err)
  136. }
  137. if err := c.Mail("user@gmail.com"); err != nil {
  138. t.Fatalf("MAIL failed: %s", err)
  139. }
  140. if err := c.Rcpt("golang-nuts@googlegroups.com"); err != nil {
  141. t.Fatalf("RCPT failed: %s", err)
  142. }
  143. msg := `From: user@gmail.com
  144. To: golang-nuts@googlegroups.com
  145. Subject: Hooray for Go
  146. Line 1
  147. .Leading dot line .
  148. Goodbye.`
  149. w, err := c.Data()
  150. if err != nil {
  151. t.Fatalf("DATA failed: %s", err)
  152. }
  153. if _, err := w.Write([]byte(msg)); err != nil {
  154. t.Fatalf("Data write failed: %s", err)
  155. }
  156. if err := w.Close(); err != nil {
  157. t.Fatalf("Bad data response: %s", err)
  158. }
  159. if err := c.Quit(); err != nil {
  160. t.Fatalf("QUIT failed: %s", err)
  161. }
  162. bcmdbuf.Flush()
  163. actualcmds := cmdbuf.String()
  164. if client != actualcmds {
  165. t.Fatalf("Got:\n%s\nExpected:\n%s", actualcmds, client)
  166. }
  167. }
  168. var basicServer = `250 mx.google.com at your service
  169. 502 Unrecognized command.
  170. 250-mx.google.com at your service
  171. 250-SIZE 35651584
  172. 250-AUTH LOGIN PLAIN
  173. 250 8BITMIME
  174. 530 Authentication required
  175. 252 Send some mail, I'll try my best
  176. 250 User is valid
  177. 235 Accepted
  178. 250 Sender OK
  179. 250 Receiver OK
  180. 354 Go ahead
  181. 250 Data OK
  182. 221 OK
  183. `
  184. var basicClient = `HELO localhost
  185. EHLO localhost
  186. EHLO localhost
  187. MAIL FROM:<user@gmail.com> BODY=8BITMIME
  188. VRFY user1@gmail.com
  189. VRFY user2@gmail.com
  190. AUTH PLAIN AHVzZXIAcGFzcw==
  191. MAIL FROM:<user@gmail.com> BODY=8BITMIME
  192. RCPT TO:<golang-nuts@googlegroups.com>
  193. DATA
  194. From: user@gmail.com
  195. To: golang-nuts@googlegroups.com
  196. Subject: Hooray for Go
  197. Line 1
  198. ..Leading dot line .
  199. Goodbye.
  200. .
  201. QUIT
  202. `
  203. func TestNewClient(t *testing.T) {
  204. server := strings.Join(strings.Split(newClientServer, "\n"), "\r\n")
  205. client := strings.Join(strings.Split(newClientClient, "\n"), "\r\n")
  206. var cmdbuf bytes.Buffer
  207. bcmdbuf := bufio.NewWriter(&cmdbuf)
  208. out := func() string {
  209. bcmdbuf.Flush()
  210. return cmdbuf.String()
  211. }
  212. var fake faker
  213. fake.ReadWriter = bufio.NewReadWriter(bufio.NewReader(strings.NewReader(server)), bcmdbuf)
  214. c, err := NewClient(fake, "fake.host")
  215. if err != nil {
  216. t.Fatalf("NewClient: %v\n(after %v)", err, out())
  217. }
  218. defer c.Close()
  219. if ok, args := c.Extension("aUtH"); !ok || args != "LOGIN PLAIN" {
  220. t.Fatalf("Expected AUTH supported")
  221. }
  222. if ok, _ := c.Extension("DSN"); ok {
  223. t.Fatalf("Shouldn't support DSN")
  224. }
  225. if err := c.Quit(); err != nil {
  226. t.Fatalf("QUIT failed: %s", err)
  227. }
  228. actualcmds := out()
  229. if client != actualcmds {
  230. t.Fatalf("Got:\n%s\nExpected:\n%s", actualcmds, client)
  231. }
  232. }
  233. var newClientServer = `220 hello world
  234. 250-mx.google.com at your service
  235. 250-SIZE 35651584
  236. 250-AUTH LOGIN PLAIN
  237. 250 8BITMIME
  238. 221 OK
  239. `
  240. var newClientClient = `EHLO localhost
  241. QUIT
  242. `
  243. func TestNewClient2(t *testing.T) {
  244. server := strings.Join(strings.Split(newClient2Server, "\n"), "\r\n")
  245. client := strings.Join(strings.Split(newClient2Client, "\n"), "\r\n")
  246. var cmdbuf bytes.Buffer
  247. bcmdbuf := bufio.NewWriter(&cmdbuf)
  248. var fake faker
  249. fake.ReadWriter = bufio.NewReadWriter(bufio.NewReader(strings.NewReader(server)), bcmdbuf)
  250. c, err := NewClient(fake, "fake.host")
  251. if err != nil {
  252. t.Fatalf("NewClient: %v", err)
  253. }
  254. defer c.Close()
  255. if ok, _ := c.Extension("DSN"); ok {
  256. t.Fatalf("Shouldn't support DSN")
  257. }
  258. if err := c.Quit(); err != nil {
  259. t.Fatalf("QUIT failed: %s", err)
  260. }
  261. bcmdbuf.Flush()
  262. actualcmds := cmdbuf.String()
  263. if client != actualcmds {
  264. t.Fatalf("Got:\n%s\nExpected:\n%s", actualcmds, client)
  265. }
  266. }
  267. var newClient2Server = `220 hello world
  268. 502 EH?
  269. 250-mx.google.com at your service
  270. 250-SIZE 35651584
  271. 250-AUTH LOGIN PLAIN
  272. 250 8BITMIME
  273. 221 OK
  274. `
  275. var newClient2Client = `EHLO localhost
  276. HELO localhost
  277. QUIT
  278. `
  279. func TestHello(t *testing.T) {
  280. if len(helloServer) != len(helloClient) {
  281. t.Fatalf("Hello server and client size mismatch")
  282. }
  283. for i := 0; i < len(helloServer); i++ {
  284. server := strings.Join(strings.Split(baseHelloServer+helloServer[i], "\n"), "\r\n")
  285. client := strings.Join(strings.Split(baseHelloClient+helloClient[i], "\n"), "\r\n")
  286. var cmdbuf bytes.Buffer
  287. bcmdbuf := bufio.NewWriter(&cmdbuf)
  288. var fake faker
  289. fake.ReadWriter = bufio.NewReadWriter(bufio.NewReader(strings.NewReader(server)), bcmdbuf)
  290. c, err := NewClient(fake, "fake.host")
  291. if err != nil {
  292. t.Fatalf("NewClient: %v", err)
  293. }
  294. defer c.Close()
  295. c.localName = "customhost"
  296. err = nil
  297. switch i {
  298. case 0:
  299. err = c.Hello("customhost")
  300. case 1:
  301. err = c.StartTLS(nil)
  302. if err.Error() == "502 Not implemented" {
  303. err = nil
  304. }
  305. case 2:
  306. err = c.Verify("test@example.com")
  307. case 3:
  308. c.tls = true
  309. c.serverName = "smtp.google.com"
  310. err = c.Auth(PlainAuth("", "user", "pass", "smtp.google.com"))
  311. case 4:
  312. err = c.Mail("test@example.com")
  313. case 5:
  314. ok, _ := c.Extension("feature")
  315. if ok {
  316. t.Errorf("Expected FEATURE not to be supported")
  317. }
  318. case 6:
  319. err = c.Reset()
  320. case 7:
  321. err = c.Quit()
  322. case 8:
  323. err = c.Verify("test@example.com")
  324. if err != nil {
  325. err = c.Hello("customhost")
  326. if err != nil {
  327. t.Errorf("Want error, got none")
  328. }
  329. }
  330. default:
  331. t.Fatalf("Unhandled command")
  332. }
  333. if err != nil {
  334. t.Errorf("Command %d failed: %v", i, err)
  335. }
  336. bcmdbuf.Flush()
  337. actualcmds := cmdbuf.String()
  338. if client != actualcmds {
  339. t.Errorf("Got:\n%s\nExpected:\n%s", actualcmds, client)
  340. }
  341. }
  342. }
  343. var baseHelloServer = `220 hello world
  344. 502 EH?
  345. 250-mx.google.com at your service
  346. 250 FEATURE
  347. `
  348. var helloServer = []string{
  349. "",
  350. "502 Not implemented\n",
  351. "250 User is valid\n",
  352. "235 Accepted\n",
  353. "250 Sender ok\n",
  354. "",
  355. "250 Reset ok\n",
  356. "221 Goodbye\n",
  357. "250 Sender ok\n",
  358. }
  359. var baseHelloClient = `EHLO customhost
  360. HELO customhost
  361. `
  362. var helloClient = []string{
  363. "",
  364. "STARTTLS\n",
  365. "VRFY test@example.com\n",
  366. "AUTH PLAIN AHVzZXIAcGFzcw==\n",
  367. "MAIL FROM:<test@example.com>\n",
  368. "",
  369. "RSET\n",
  370. "QUIT\n",
  371. "VRFY test@example.com\n",
  372. }
  373. func TestSendMail(t *testing.T) {
  374. server := strings.Join(strings.Split(sendMailServer, "\n"), "\r\n")
  375. client := strings.Join(strings.Split(sendMailClient, "\n"), "\r\n")
  376. var cmdbuf bytes.Buffer
  377. bcmdbuf := bufio.NewWriter(&cmdbuf)
  378. l, err := net.Listen("tcp", "127.0.0.1:0")
  379. if err != nil {
  380. t.Fatalf("Unable to to create listener: %v", err)
  381. }
  382. defer l.Close()
  383. // prevent data race on bcmdbuf
  384. var done = make(chan struct{})
  385. go func(data []string) {
  386. defer close(done)
  387. conn, err := l.Accept()
  388. if err != nil {
  389. t.Errorf("Accept error: %v", err)
  390. return
  391. }
  392. defer conn.Close()
  393. tc := textproto.NewConn(conn)
  394. for i := 0; i < len(data) && data[i] != ""; i++ {
  395. tc.PrintfLine(data[i])
  396. for len(data[i]) >= 4 && data[i][3] == '-' {
  397. i++
  398. tc.PrintfLine(data[i])
  399. }
  400. if data[i] == "221 Goodbye" {
  401. return
  402. }
  403. read := false
  404. for !read || data[i] == "354 Go ahead" {
  405. msg, err := tc.ReadLine()
  406. bcmdbuf.Write([]byte(msg + "\r\n"))
  407. read = true
  408. if err != nil {
  409. t.Errorf("Read error: %v", err)
  410. return
  411. }
  412. if data[i] == "354 Go ahead" && msg == "." {
  413. break
  414. }
  415. }
  416. }
  417. }(strings.Split(server, "\r\n"))
  418. err = SendMail(l.Addr().String(), nil, "test@example.com", []string{"other@example.com"}, []byte(strings.Replace(`From: test@example.com
  419. To: other@example.com
  420. Subject: SendMail test
  421. SendMail is working for me.
  422. `, "\n", "\r\n", -1)))
  423. if err != nil {
  424. t.Errorf("%v", err)
  425. }
  426. <-done
  427. bcmdbuf.Flush()
  428. actualcmds := cmdbuf.String()
  429. if client != actualcmds {
  430. t.Errorf("Got:\n%s\nExpected:\n%s", actualcmds, client)
  431. }
  432. }
  433. var sendMailServer = `220 hello world
  434. 502 EH?
  435. 250 mx.google.com at your service
  436. 250 Sender ok
  437. 250 Receiver ok
  438. 354 Go ahead
  439. 250 Data ok
  440. 221 Goodbye
  441. `
  442. var sendMailClient = `EHLO localhost
  443. HELO localhost
  444. MAIL FROM:<test@example.com>
  445. RCPT TO:<other@example.com>
  446. DATA
  447. From: test@example.com
  448. To: other@example.com
  449. Subject: SendMail test
  450. SendMail is working for me.
  451. .
  452. QUIT
  453. `
  454. func TestAuthFailed(t *testing.T) {
  455. server := strings.Join(strings.Split(authFailedServer, "\n"), "\r\n")
  456. client := strings.Join(strings.Split(authFailedClient, "\n"), "\r\n")
  457. var cmdbuf bytes.Buffer
  458. bcmdbuf := bufio.NewWriter(&cmdbuf)
  459. var fake faker
  460. fake.ReadWriter = bufio.NewReadWriter(bufio.NewReader(strings.NewReader(server)), bcmdbuf)
  461. c, err := NewClient(fake, "fake.host")
  462. if err != nil {
  463. t.Fatalf("NewClient: %v", err)
  464. }
  465. defer c.Close()
  466. c.tls = true
  467. c.serverName = "smtp.google.com"
  468. err = c.Auth(PlainAuth("", "user", "pass", "smtp.google.com"))
  469. if err == nil {
  470. t.Error("Auth: expected error; got none")
  471. } else if err.Error() != "535 Invalid credentials\nplease see www.example.com" {
  472. t.Errorf("Auth: got error: %v, want: %s", err, "535 Invalid credentials\nplease see www.example.com")
  473. }
  474. bcmdbuf.Flush()
  475. actualcmds := cmdbuf.String()
  476. if client != actualcmds {
  477. t.Errorf("Got:\n%s\nExpected:\n%s", actualcmds, client)
  478. }
  479. }
  480. var authFailedServer = `220 hello world
  481. 250-mx.google.com at your service
  482. 250 AUTH LOGIN PLAIN
  483. 535-Invalid credentials
  484. 535 please see www.example.com
  485. 221 Goodbye
  486. `
  487. var authFailedClient = `EHLO localhost
  488. AUTH PLAIN AHVzZXIAcGFzcw==
  489. *
  490. QUIT
  491. `
  492. func TestTLSClient(t *testing.T) {
  493. ln := newLocalListener(t)
  494. defer ln.Close()
  495. errc := make(chan error)
  496. go func() {
  497. errc <- sendMail(ln.Addr().String())
  498. }()
  499. conn, err := ln.Accept()
  500. if err != nil {
  501. t.Fatalf("failed to accept connection: %v", err)
  502. }
  503. defer conn.Close()
  504. if err := serverHandle(conn, t); err != nil {
  505. t.Fatalf("failed to handle connection: %v", err)
  506. }
  507. if err := <-errc; err != nil {
  508. t.Fatalf("client error: %v", err)
  509. }
  510. }
  511. func TestTLSConnState(t *testing.T) {
  512. ln := newLocalListener(t)
  513. defer ln.Close()
  514. clientDone := make(chan bool)
  515. serverDone := make(chan bool)
  516. go func() {
  517. defer close(serverDone)
  518. c, err := ln.Accept()
  519. if err != nil {
  520. t.Errorf("Server accept: %v", err)
  521. return
  522. }
  523. defer c.Close()
  524. if err := serverHandle(c, t); err != nil {
  525. t.Errorf("server error: %v", err)
  526. }
  527. }()
  528. go func() {
  529. defer close(clientDone)
  530. c, err := Dial(ln.Addr().String())
  531. if err != nil {
  532. t.Errorf("Client dial: %v", err)
  533. return
  534. }
  535. defer c.Quit()
  536. cfg := &tls.Config{ServerName: "example.com"}
  537. testHookStartTLS(cfg) // set the RootCAs
  538. if err := c.StartTLS(cfg); err != nil {
  539. t.Errorf("StartTLS: %v", err)
  540. return
  541. }
  542. cs, ok := c.TLSConnectionState()
  543. if !ok {
  544. t.Errorf("TLSConnectionState returned ok == false; want true")
  545. return
  546. }
  547. if cs.Version == 0 || !cs.HandshakeComplete {
  548. t.Errorf("ConnectionState = %#v; expect non-zero Version and HandshakeComplete", cs)
  549. }
  550. }()
  551. <-clientDone
  552. <-serverDone
  553. }
  554. func newLocalListener(t *testing.T) net.Listener {
  555. ln, err := net.Listen("tcp", "127.0.0.1:0")
  556. if err != nil {
  557. ln, err = net.Listen("tcp6", "[::1]:0")
  558. }
  559. if err != nil {
  560. t.Fatal(err)
  561. }
  562. return ln
  563. }
  564. type smtpSender struct {
  565. w io.Writer
  566. }
  567. func (s smtpSender) send(f string) {
  568. s.w.Write([]byte(f + "\r\n"))
  569. }
  570. // smtp server, finely tailored to deal with our own client only!
  571. func serverHandle(c net.Conn, t *testing.T) error {
  572. send := smtpSender{c}.send
  573. send("220 127.0.0.1 ESMTP service ready")
  574. s := bufio.NewScanner(c)
  575. for s.Scan() {
  576. switch s.Text() {
  577. case "EHLO localhost":
  578. send("250-127.0.0.1 ESMTP offers a warm hug of welcome")
  579. send("250-STARTTLS")
  580. send("250 Ok")
  581. case "STARTTLS":
  582. send("220 Go ahead")
  583. keypair, err := tls.X509KeyPair(localhostCert, localhostKey)
  584. if err != nil {
  585. return err
  586. }
  587. config := &tls.Config{Certificates: []tls.Certificate{keypair}}
  588. c = tls.Server(c, config)
  589. defer c.Close()
  590. return serverHandleTLS(c, t)
  591. default:
  592. t.Fatalf("unrecognized command: %q", s.Text())
  593. }
  594. }
  595. return s.Err()
  596. }
  597. func serverHandleTLS(c net.Conn, t *testing.T) error {
  598. send := smtpSender{c}.send
  599. s := bufio.NewScanner(c)
  600. for s.Scan() {
  601. switch s.Text() {
  602. case "EHLO localhost":
  603. send("250 Ok")
  604. case "MAIL FROM:<joe1@example.com>":
  605. send("250 Ok")
  606. case "RCPT TO:<joe2@example.com>":
  607. send("250 Ok")
  608. case "DATA":
  609. send("354 send the mail data, end with .")
  610. send("250 Ok")
  611. case "Subject: test":
  612. case "":
  613. case "howdy!":
  614. case ".":
  615. case "QUIT":
  616. send("221 127.0.0.1 Service closing transmission channel")
  617. return nil
  618. default:
  619. t.Fatalf("unrecognized command during TLS: %q", s.Text())
  620. }
  621. }
  622. return s.Err()
  623. }
  624. func init() {
  625. testRootCAs := x509.NewCertPool()
  626. testRootCAs.AppendCertsFromPEM(localhostCert)
  627. testHookStartTLS = func(config *tls.Config) {
  628. config.RootCAs = testRootCAs
  629. }
  630. }
  631. func sendMail(hostPort string) error {
  632. host, _, err := net.SplitHostPort(hostPort)
  633. if err != nil {
  634. return err
  635. }
  636. auth := PlainAuth("", "", "", host)
  637. from := "joe1@example.com"
  638. to := []string{"joe2@example.com"}
  639. return SendMail(hostPort, auth, from, to, []byte("Subject: test\n\nhowdy!"))
  640. }
  641. // (copied from net/http/httptest)
  642. // localhostCert is a PEM-encoded TLS cert with SAN IPs
  643. // "127.0.0.1" and "[::1]", expiring at the last second of 2049 (the end
  644. // of ASN.1 time).
  645. // generated from src/crypto/tls:
  646. // go run generate_cert.go --rsa-bits 512 --host 127.0.0.1,::1,example.com --ca --start-date "Jan 1 00:00:00 1970" --duration=1000000h
  647. var localhostCert = []byte(`-----BEGIN CERTIFICATE-----
  648. MIIBdzCCASOgAwIBAgIBADALBgkqhkiG9w0BAQUwEjEQMA4GA1UEChMHQWNtZSBD
  649. bzAeFw03MDAxMDEwMDAwMDBaFw00OTEyMzEyMzU5NTlaMBIxEDAOBgNVBAoTB0Fj
  650. bWUgQ28wWjALBgkqhkiG9w0BAQEDSwAwSAJBAN55NcYKZeInyTuhcCwFMhDHCmwa
  651. IUSdtXdcbItRB/yfXGBhiex00IaLXQnSU+QZPRZWYqeTEbFSgihqi1PUDy8CAwEA
  652. AaNoMGYwDgYDVR0PAQH/BAQDAgCkMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA8GA1Ud
  653. EwEB/wQFMAMBAf8wLgYDVR0RBCcwJYILZXhhbXBsZS5jb22HBH8AAAGHEAAAAAAA
  654. AAAAAAAAAAAAAAEwCwYJKoZIhvcNAQEFA0EAAoQn/ytgqpiLcZu9XKbCJsJcvkgk
  655. Se6AbGXgSlq+ZCEVo0qIwSgeBqmsJxUu7NCSOwVJLYNEBO2DtIxoYVk+MA==
  656. -----END CERTIFICATE-----`)
  657. // localhostKey is the private key for localhostCert.
  658. var localhostKey = []byte(`-----BEGIN RSA PRIVATE KEY-----
  659. MIIBPAIBAAJBAN55NcYKZeInyTuhcCwFMhDHCmwaIUSdtXdcbItRB/yfXGBhiex0
  660. 0IaLXQnSU+QZPRZWYqeTEbFSgihqi1PUDy8CAwEAAQJBAQdUx66rfh8sYsgfdcvV
  661. NoafYpnEcB5s4m/vSVe6SU7dCK6eYec9f9wpT353ljhDUHq3EbmE4foNzJngh35d
  662. AekCIQDhRQG5Li0Wj8TM4obOnnXUXf1jRv0UkzE9AHWLG5q3AwIhAPzSjpYUDjVW
  663. MCUXgckTpKCuGwbJk7424Nb8bLzf3kllAiA5mUBgjfr/WtFSJdWcPQ4Zt9KTMNKD
  664. EUO0ukpTwEIl6wIhAMbGqZK3zAAFdq8DD2jPx+UJXnh0rnOkZBzDtJ6/iN69AiEA
  665. 1Aq8MJgTaYsDQWyU/hDq5YkDJc9e9DSCvUIzqxQWMQE=
  666. -----END RSA PRIVATE KEY-----`)