Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 
 
 

222 linhas
4.9 KiB

  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 main
  5. import (
  6. "bytes"
  7. "crypto/aes"
  8. "crypto/cipher"
  9. "crypto/hmac"
  10. "crypto/sha256"
  11. "crypto/subtle"
  12. "errors"
  13. "io"
  14. )
  15. // sessionState contains the information that is serialized into a session
  16. // ticket in order to later resume a connection.
  17. type sessionState struct {
  18. vers uint16
  19. cipherSuite uint16
  20. masterSecret []byte
  21. handshakeHash []byte
  22. certificates [][]byte
  23. extendedMasterSecret bool
  24. }
  25. func (s *sessionState) equal(i interface{}) bool {
  26. s1, ok := i.(*sessionState)
  27. if !ok {
  28. return false
  29. }
  30. if s.vers != s1.vers ||
  31. s.cipherSuite != s1.cipherSuite ||
  32. !bytes.Equal(s.masterSecret, s1.masterSecret) ||
  33. !bytes.Equal(s.handshakeHash, s1.handshakeHash) ||
  34. s.extendedMasterSecret != s1.extendedMasterSecret {
  35. return false
  36. }
  37. if len(s.certificates) != len(s1.certificates) {
  38. return false
  39. }
  40. for i := range s.certificates {
  41. if !bytes.Equal(s.certificates[i], s1.certificates[i]) {
  42. return false
  43. }
  44. }
  45. return true
  46. }
  47. func (s *sessionState) marshal() []byte {
  48. length := 2 + 2 + 2 + len(s.masterSecret) + 2 + len(s.handshakeHash) + 2
  49. for _, cert := range s.certificates {
  50. length += 4 + len(cert)
  51. }
  52. length++
  53. ret := make([]byte, length)
  54. x := ret
  55. x[0] = byte(s.vers >> 8)
  56. x[1] = byte(s.vers)
  57. x[2] = byte(s.cipherSuite >> 8)
  58. x[3] = byte(s.cipherSuite)
  59. x[4] = byte(len(s.masterSecret) >> 8)
  60. x[5] = byte(len(s.masterSecret))
  61. x = x[6:]
  62. copy(x, s.masterSecret)
  63. x = x[len(s.masterSecret):]
  64. x[0] = byte(len(s.handshakeHash) >> 8)
  65. x[1] = byte(len(s.handshakeHash))
  66. x = x[2:]
  67. copy(x, s.handshakeHash)
  68. x = x[len(s.handshakeHash):]
  69. x[0] = byte(len(s.certificates) >> 8)
  70. x[1] = byte(len(s.certificates))
  71. x = x[2:]
  72. for _, cert := range s.certificates {
  73. x[0] = byte(len(cert) >> 24)
  74. x[1] = byte(len(cert) >> 16)
  75. x[2] = byte(len(cert) >> 8)
  76. x[3] = byte(len(cert))
  77. copy(x[4:], cert)
  78. x = x[4+len(cert):]
  79. }
  80. if s.extendedMasterSecret {
  81. x[0] = 1
  82. }
  83. x = x[1:]
  84. return ret
  85. }
  86. func (s *sessionState) unmarshal(data []byte) bool {
  87. if len(data) < 8 {
  88. return false
  89. }
  90. s.vers = uint16(data[0])<<8 | uint16(data[1])
  91. s.cipherSuite = uint16(data[2])<<8 | uint16(data[3])
  92. masterSecretLen := int(data[4])<<8 | int(data[5])
  93. data = data[6:]
  94. if len(data) < masterSecretLen {
  95. return false
  96. }
  97. s.masterSecret = data[:masterSecretLen]
  98. data = data[masterSecretLen:]
  99. if len(data) < 2 {
  100. return false
  101. }
  102. handshakeHashLen := int(data[0])<<8 | int(data[1])
  103. data = data[2:]
  104. if len(data) < handshakeHashLen {
  105. return false
  106. }
  107. s.handshakeHash = data[:handshakeHashLen]
  108. data = data[handshakeHashLen:]
  109. if len(data) < 2 {
  110. return false
  111. }
  112. numCerts := int(data[0])<<8 | int(data[1])
  113. data = data[2:]
  114. s.certificates = make([][]byte, numCerts)
  115. for i := range s.certificates {
  116. if len(data) < 4 {
  117. return false
  118. }
  119. certLen := int(data[0])<<24 | int(data[1])<<16 | int(data[2])<<8 | int(data[3])
  120. data = data[4:]
  121. if certLen < 0 {
  122. return false
  123. }
  124. if len(data) < certLen {
  125. return false
  126. }
  127. s.certificates[i] = data[:certLen]
  128. data = data[certLen:]
  129. }
  130. if len(data) < 1 {
  131. return false
  132. }
  133. s.extendedMasterSecret = false
  134. if data[0] == 1 {
  135. s.extendedMasterSecret = true
  136. }
  137. data = data[1:]
  138. if len(data) > 0 {
  139. return false
  140. }
  141. return true
  142. }
  143. func (c *Conn) encryptTicket(state *sessionState) ([]byte, error) {
  144. serialized := state.marshal()
  145. encrypted := make([]byte, aes.BlockSize+len(serialized)+sha256.Size)
  146. iv := encrypted[:aes.BlockSize]
  147. macBytes := encrypted[len(encrypted)-sha256.Size:]
  148. if _, err := io.ReadFull(c.config.rand(), iv); err != nil {
  149. return nil, err
  150. }
  151. block, err := aes.NewCipher(c.config.SessionTicketKey[:16])
  152. if err != nil {
  153. return nil, errors.New("tls: failed to create cipher while encrypting ticket: " + err.Error())
  154. }
  155. cipher.NewCTR(block, iv).XORKeyStream(encrypted[aes.BlockSize:], serialized)
  156. mac := hmac.New(sha256.New, c.config.SessionTicketKey[16:32])
  157. mac.Write(encrypted[:len(encrypted)-sha256.Size])
  158. mac.Sum(macBytes[:0])
  159. return encrypted, nil
  160. }
  161. func (c *Conn) decryptTicket(encrypted []byte) (*sessionState, bool) {
  162. if len(encrypted) < aes.BlockSize+sha256.Size {
  163. return nil, false
  164. }
  165. iv := encrypted[:aes.BlockSize]
  166. macBytes := encrypted[len(encrypted)-sha256.Size:]
  167. mac := hmac.New(sha256.New, c.config.SessionTicketKey[16:32])
  168. mac.Write(encrypted[:len(encrypted)-sha256.Size])
  169. expected := mac.Sum(nil)
  170. if subtle.ConstantTimeCompare(macBytes, expected) != 1 {
  171. return nil, false
  172. }
  173. block, err := aes.NewCipher(c.config.SessionTicketKey[:16])
  174. if err != nil {
  175. return nil, false
  176. }
  177. ciphertext := encrypted[aes.BlockSize : len(encrypted)-sha256.Size]
  178. plaintext := make([]byte, len(ciphertext))
  179. cipher.NewCTR(block, iv).XORKeyStream(plaintext, ciphertext)
  180. state := new(sessionState)
  181. ok := state.unmarshal(plaintext)
  182. return state, ok
  183. }