obfuscated_test.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. /*
  2. * Copyright (c) 2016, Psiphon Inc.
  3. * All rights reserved.
  4. *
  5. * This program is free software: you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation, either version 3 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. *
  18. */
  19. package tls
  20. import (
  21. "crypto/rand"
  22. "crypto/rsa"
  23. "crypto/sha1"
  24. "crypto/x509"
  25. "crypto/x509/pkix"
  26. "encoding/pem"
  27. "errors"
  28. "io"
  29. "math/big"
  30. "net"
  31. "testing"
  32. "time"
  33. )
  34. // [Psiphon]
  35. // TestObfuscatedSessionTicket exercises the Obfuscated Session Tickets facility.
  36. func TestObfuscatedSessionTicket(t *testing.T) {
  37. var standardSessionTicketKey [32]byte
  38. rand.Read(standardSessionTicketKey[:])
  39. var obfuscatedSessionTicketSharedSecret [32]byte
  40. rand.Read(obfuscatedSessionTicketSharedSecret[:])
  41. // Note: SNI and certificate CN don't match
  42. clientConfig := &Config{
  43. ServerName: "www.example.com",
  44. ClientSessionCache: NewObfuscatedClientSessionCache(
  45. obfuscatedSessionTicketSharedSecret),
  46. }
  47. certificate, err := generateCertificate()
  48. if err != nil {
  49. t.Fatalf("generateCertificate failed: %s", err)
  50. }
  51. serverConfig := &Config{
  52. Certificates: []Certificate{*certificate},
  53. NextProtos: []string{"http/1.1"},
  54. MinVersion: VersionTLS10,
  55. SessionTicketKey: obfuscatedSessionTicketSharedSecret,
  56. }
  57. serverConfig.SetSessionTicketKeys([][32]byte{
  58. standardSessionTicketKey, obfuscatedSessionTicketSharedSecret})
  59. serverAddress := ":8443"
  60. testMessage := "test"
  61. result := make(chan error, 1)
  62. go func() {
  63. listener, err := Listen("tcp", serverAddress, serverConfig)
  64. var conn net.Conn
  65. if err == nil {
  66. conn, err = listener.Accept()
  67. }
  68. recv := make([]byte, len(testMessage))
  69. if err == nil {
  70. defer conn.Close()
  71. _, err = io.ReadFull(conn, recv)
  72. }
  73. if err == nil {
  74. if string(recv) != testMessage {
  75. err = errors.New("unexpected payload")
  76. }
  77. }
  78. // Sends nil on success
  79. select {
  80. case result <- err:
  81. default:
  82. }
  83. }()
  84. go func() {
  85. conn, err := Dial("tcp", serverAddress, clientConfig)
  86. if err == nil {
  87. defer conn.Close()
  88. _, err = conn.Write([]byte(testMessage))
  89. }
  90. if err != nil {
  91. select {
  92. case result <- err:
  93. default:
  94. }
  95. }
  96. }()
  97. err = <-result
  98. if err != nil {
  99. t.Fatalf("connect failed: %s", err)
  100. }
  101. }
  102. func generateCertificate() (*Certificate, error) {
  103. rsaKey, err := rsa.GenerateKey(rand.Reader, 2048)
  104. if err != nil {
  105. return nil, err
  106. }
  107. publicKeyBytes, err := x509.MarshalPKIXPublicKey(rsaKey.Public())
  108. if err != nil {
  109. return nil, err
  110. }
  111. subjectKeyID := sha1.Sum(publicKeyBytes)
  112. template := x509.Certificate{
  113. SerialNumber: big.NewInt(1),
  114. Subject: pkix.Name{CommonName: "www.example.org"},
  115. NotBefore: time.Now().Add(-1 * time.Hour).UTC(),
  116. NotAfter: time.Now().Add(time.Hour).UTC(),
  117. KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign,
  118. ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},
  119. BasicConstraintsValid: true,
  120. IsCA: true,
  121. SubjectKeyId: subjectKeyID[:],
  122. MaxPathLen: 1,
  123. Version: 2,
  124. }
  125. derCert, err := x509.CreateCertificate(
  126. rand.Reader,
  127. &template,
  128. &template,
  129. rsaKey.Public(),
  130. rsaKey)
  131. if err != nil {
  132. return nil, err
  133. }
  134. certificate := pem.EncodeToMemory(
  135. &pem.Block{
  136. Type: "CERTIFICATE",
  137. Bytes: derCert,
  138. },
  139. )
  140. privateKey := pem.EncodeToMemory(
  141. &pem.Block{
  142. Type: "RSA PRIVATE KEY",
  143. Bytes: x509.MarshalPKCS1PrivateKey(rsaKey),
  144. },
  145. )
  146. keyPair, err := X509KeyPair(certificate, privateKey)
  147. if err != nil {
  148. return nil, err
  149. }
  150. return &keyPair, nil
  151. }