obfuscated_test.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  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. func TestObfuscatedSessionTicket(t *testing.T) {
  35. var standardSessionTicketKey [32]byte
  36. rand.Read(standardSessionTicketKey[:])
  37. var obfuscatedSessionTicketSharedSecret [32]byte
  38. rand.Read(obfuscatedSessionTicketSharedSecret[:])
  39. // Note: SNI and certificate CN don't match
  40. clientConfig := &Config{
  41. ServerName: "www.example.com",
  42. ClientSessionCache: NewObfuscatedClientSessionCache(
  43. obfuscatedSessionTicketSharedSecret),
  44. }
  45. certificate, err := generateCertificate()
  46. if err != nil {
  47. t.Fatalf("generateCertificate failed: %s", err)
  48. }
  49. serverConfig := &Config{
  50. Certificates: []Certificate{*certificate},
  51. NextProtos: []string{"http/1.1"},
  52. MinVersion: VersionTLS10,
  53. SessionTicketKey: obfuscatedSessionTicketSharedSecret,
  54. }
  55. serverConfig.SetSessionTicketKeys([][32]byte{
  56. standardSessionTicketKey, obfuscatedSessionTicketSharedSecret})
  57. serverAddress := ":8443"
  58. testMessage := "test"
  59. result := make(chan error, 1)
  60. go func() {
  61. listener, err := Listen("tcp", serverAddress, serverConfig)
  62. var conn net.Conn
  63. if err == nil {
  64. conn, err = listener.Accept()
  65. }
  66. recv := make([]byte, len(testMessage))
  67. if err == nil {
  68. defer conn.Close()
  69. _, err = io.ReadFull(conn, recv)
  70. }
  71. if err == nil {
  72. if string(recv) != testMessage {
  73. err = errors.New("unexpected payload")
  74. }
  75. }
  76. // Sends nil on success
  77. select {
  78. case result <- err:
  79. default:
  80. }
  81. }()
  82. go func() {
  83. conn, err := Dial("tcp", serverAddress, clientConfig)
  84. if err == nil {
  85. defer conn.Close()
  86. _, err = conn.Write([]byte(testMessage))
  87. }
  88. if err != nil {
  89. select {
  90. case result <- err:
  91. default:
  92. }
  93. }
  94. }()
  95. err = <-result
  96. if err != nil {
  97. t.Fatalf("connect failed: %s", err)
  98. }
  99. }
  100. func generateCertificate() (*Certificate, error) {
  101. rsaKey, err := rsa.GenerateKey(rand.Reader, 2048)
  102. if err != nil {
  103. return nil, err
  104. }
  105. publicKeyBytes, err := x509.MarshalPKIXPublicKey(rsaKey.Public())
  106. if err != nil {
  107. return nil, err
  108. }
  109. subjectKeyID := sha1.Sum(publicKeyBytes)
  110. template := x509.Certificate{
  111. SerialNumber: big.NewInt(1),
  112. Subject: pkix.Name{CommonName: "www.example.org"},
  113. NotBefore: time.Now().Add(-1 * time.Hour).UTC(),
  114. NotAfter: time.Now().Add(time.Hour).UTC(),
  115. KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign,
  116. ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},
  117. BasicConstraintsValid: true,
  118. IsCA: true,
  119. SubjectKeyId: subjectKeyID[:],
  120. MaxPathLen: 1,
  121. Version: 2,
  122. }
  123. derCert, err := x509.CreateCertificate(
  124. rand.Reader,
  125. &template,
  126. &template,
  127. rsaKey.Public(),
  128. rsaKey)
  129. if err != nil {
  130. return nil, err
  131. }
  132. certificate := pem.EncodeToMemory(
  133. &pem.Block{
  134. Type: "CERTIFICATE",
  135. Bytes: derCert,
  136. },
  137. )
  138. privateKey := pem.EncodeToMemory(
  139. &pem.Block{
  140. Type: "RSA PRIVATE KEY",
  141. Bytes: x509.MarshalPKCS1PrivateKey(rsaKey),
  142. },
  143. )
  144. keyPair, err := X509KeyPair(certificate, privateKey)
  145. if err != nil {
  146. return nil, err
  147. }
  148. return &keyPair, nil
  149. }