Alternative TLS implementation in Go
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

handshake_messages_test.go 12 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. // Copyright 2009 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. "math/rand"
  8. "reflect"
  9. "strings"
  10. "testing"
  11. "testing/quick"
  12. )
  13. var tests = []interface{}{
  14. &clientHelloMsg{},
  15. &serverHelloMsg{},
  16. &finishedMsg{},
  17. &certificateMsg{},
  18. &certificateRequestMsg{},
  19. &certificateRequestMsg13{},
  20. &certificateVerifyMsg{},
  21. &certificateStatusMsg{},
  22. &clientKeyExchangeMsg{},
  23. &nextProtoMsg{},
  24. &newSessionTicketMsg{},
  25. &sessionState{},
  26. &encryptedExtensionsMsg{},
  27. &certificateMsg13{},
  28. &newSessionTicketMsg13{},
  29. &sessionState13{},
  30. }
  31. type testMessage interface {
  32. marshal() []byte
  33. unmarshal([]byte) alert
  34. equal(interface{}) bool
  35. }
  36. func TestMarshalUnmarshal(t *testing.T) {
  37. rand := rand.New(rand.NewSource(0))
  38. for i, iface := range tests {
  39. ty := reflect.ValueOf(iface).Type()
  40. n := 100
  41. if testing.Short() {
  42. n = 5
  43. }
  44. for j := 0; j < n; j++ {
  45. v, ok := quick.Value(ty, rand)
  46. if !ok {
  47. t.Errorf("#%d: failed to create value", i)
  48. break
  49. }
  50. m1 := v.Interface().(testMessage)
  51. marshaled := m1.marshal()
  52. m2 := iface.(testMessage)
  53. if m2.unmarshal(marshaled) != alertSuccess {
  54. t.Errorf("#%d.%d failed to unmarshal %#v %x", i, j, m1, marshaled)
  55. break
  56. }
  57. m2.marshal() // to fill any marshal cache in the message
  58. if !m1.equal(m2) {
  59. t.Errorf("#%d.%d got:%#v want:%#v %x", i, j, m2, m1, marshaled)
  60. break
  61. }
  62. if i >= 3 {
  63. // The first three message types (ClientHello,
  64. // ServerHello and Finished) are allowed to
  65. // have parsable prefixes because the extension
  66. // data is optional and the length of the
  67. // Finished varies across versions.
  68. for j := 0; j < len(marshaled); j++ {
  69. if m2.unmarshal(marshaled[0:j]) == alertSuccess {
  70. t.Errorf("#%d unmarshaled a prefix of length %d of %#v", i, j, m1)
  71. break
  72. }
  73. }
  74. }
  75. }
  76. }
  77. }
  78. func TestFuzz(t *testing.T) {
  79. rand := rand.New(rand.NewSource(0))
  80. for _, iface := range tests {
  81. m := iface.(testMessage)
  82. for j := 0; j < 1000; j++ {
  83. len := rand.Intn(100)
  84. bytes := randomBytes(len, rand)
  85. // This just looks for crashes due to bounds errors etc.
  86. m.unmarshal(bytes)
  87. }
  88. }
  89. }
  90. func randomBytes(n int, rand *rand.Rand) []byte {
  91. r := make([]byte, n)
  92. if _, err := rand.Read(r); err != nil {
  93. panic("rand.Read failed: " + err.Error())
  94. }
  95. return r
  96. }
  97. func randomString(n int, rand *rand.Rand) string {
  98. b := randomBytes(n, rand)
  99. return string(b)
  100. }
  101. func (*clientHelloMsg) Generate(rand *rand.Rand, size int) reflect.Value {
  102. m := &clientHelloMsg{}
  103. m.vers = uint16(rand.Intn(65536))
  104. m.random = randomBytes(32, rand)
  105. m.sessionId = randomBytes(rand.Intn(32), rand)
  106. m.cipherSuites = make([]uint16, rand.Intn(63)+1)
  107. for i := 0; i < len(m.cipherSuites); i++ {
  108. cs := uint16(rand.Int31())
  109. if cs == scsvRenegotiation {
  110. cs += 1
  111. }
  112. m.cipherSuites[i] = cs
  113. }
  114. m.compressionMethods = randomBytes(rand.Intn(63)+1, rand)
  115. if rand.Intn(10) > 5 {
  116. m.nextProtoNeg = true
  117. }
  118. if rand.Intn(10) > 5 {
  119. m.serverName = randomString(rand.Intn(255), rand)
  120. for strings.HasSuffix(m.serverName, ".") {
  121. m.serverName = m.serverName[:len(m.serverName)-1]
  122. }
  123. }
  124. m.ocspStapling = rand.Intn(10) > 5
  125. m.supportedPoints = randomBytes(rand.Intn(5)+1, rand)
  126. m.supportedCurves = make([]CurveID, rand.Intn(5)+1)
  127. for i := range m.supportedCurves {
  128. m.supportedCurves[i] = CurveID(rand.Intn(30000))
  129. }
  130. if rand.Intn(10) > 5 {
  131. m.ticketSupported = true
  132. if rand.Intn(10) > 5 {
  133. m.sessionTicket = randomBytes(rand.Intn(300), rand)
  134. }
  135. }
  136. if rand.Intn(10) > 5 {
  137. m.supportedSignatureAlgorithms = supportedSignatureAlgorithms
  138. }
  139. m.alpnProtocols = make([]string, rand.Intn(5))
  140. for i := range m.alpnProtocols {
  141. m.alpnProtocols[i] = randomString(rand.Intn(20)+1, rand)
  142. }
  143. if rand.Intn(10) > 5 {
  144. m.scts = true
  145. }
  146. m.keyShares = make([]keyShare, rand.Intn(4))
  147. for i := range m.keyShares {
  148. m.keyShares[i].group = CurveID(rand.Intn(30000))
  149. m.keyShares[i].data = randomBytes(rand.Intn(300), rand)
  150. }
  151. m.supportedVersions = make([]uint16, rand.Intn(5))
  152. for i := range m.supportedVersions {
  153. m.supportedVersions[i] = uint16(rand.Intn(30000))
  154. }
  155. if rand.Intn(10) > 5 {
  156. m.earlyData = true
  157. }
  158. return reflect.ValueOf(m)
  159. }
  160. func (*serverHelloMsg) Generate(rand *rand.Rand, size int) reflect.Value {
  161. m := &serverHelloMsg{}
  162. m.vers = uint16(rand.Intn(65536))
  163. m.random = randomBytes(32, rand)
  164. m.sessionId = randomBytes(rand.Intn(32), rand)
  165. m.cipherSuite = uint16(rand.Int31())
  166. m.compressionMethod = uint8(rand.Intn(256))
  167. if rand.Intn(10) > 5 {
  168. m.nextProtoNeg = true
  169. n := rand.Intn(10)
  170. m.nextProtos = make([]string, n)
  171. for i := 0; i < n; i++ {
  172. m.nextProtos[i] = randomString(20, rand)
  173. }
  174. }
  175. if rand.Intn(10) > 5 {
  176. m.ocspStapling = true
  177. }
  178. if rand.Intn(10) > 5 {
  179. m.ticketSupported = true
  180. }
  181. m.alpnProtocol = randomString(rand.Intn(32)+1, rand)
  182. if rand.Intn(10) > 5 {
  183. numSCTs := rand.Intn(4)
  184. m.scts = make([][]byte, numSCTs)
  185. for i := range m.scts {
  186. m.scts[i] = randomBytes(rand.Intn(500), rand)
  187. }
  188. }
  189. if rand.Intn(10) > 5 {
  190. m.keyShare.group = CurveID(rand.Intn(30000))
  191. m.keyShare.data = randomBytes(rand.Intn(300), rand)
  192. }
  193. if rand.Intn(10) > 5 {
  194. m.psk = true
  195. m.pskIdentity = uint16(rand.Int31())
  196. }
  197. return reflect.ValueOf(m)
  198. }
  199. func (*encryptedExtensionsMsg) Generate(rand *rand.Rand, size int) reflect.Value {
  200. m := &encryptedExtensionsMsg{}
  201. if rand.Intn(10) > 5 {
  202. m.alpnProtocol = randomString(rand.Intn(32)+1, rand)
  203. }
  204. if rand.Intn(10) > 5 {
  205. m.earlyData = true
  206. }
  207. return reflect.ValueOf(m)
  208. }
  209. func (*certificateMsg) Generate(rand *rand.Rand, size int) reflect.Value {
  210. m := &certificateMsg{}
  211. numCerts := rand.Intn(20)
  212. m.certificates = make([][]byte, numCerts)
  213. for i := 0; i < numCerts; i++ {
  214. m.certificates[i] = randomBytes(rand.Intn(10)+1, rand)
  215. }
  216. return reflect.ValueOf(m)
  217. }
  218. func (*certificateMsg13) Generate(rand *rand.Rand, size int) reflect.Value {
  219. m := &certificateMsg13{}
  220. numCerts := rand.Intn(20)
  221. m.certificates = make([]certificateEntry, numCerts)
  222. for i := 0; i < numCerts; i++ {
  223. m.certificates[i].data = randomBytes(rand.Intn(10)+1, rand)
  224. if rand.Intn(2) == 1 {
  225. m.certificates[i].ocspStaple = randomBytes(rand.Intn(10)+1, rand)
  226. }
  227. numScts := rand.Intn(3)
  228. for j := 0; j < numScts; j++ {
  229. m.certificates[i].sctList = append(m.certificates[i].sctList, randomBytes(rand.Intn(10)+1, rand))
  230. }
  231. }
  232. m.requestContext = randomBytes(rand.Intn(5), rand)
  233. return reflect.ValueOf(m)
  234. }
  235. func (*certificateRequestMsg) Generate(rand *rand.Rand, size int) reflect.Value {
  236. m := &certificateRequestMsg{}
  237. m.certificateTypes = randomBytes(rand.Intn(5)+1, rand)
  238. numCAs := rand.Intn(100)
  239. m.certificateAuthorities = make([][]byte, numCAs)
  240. for i := 0; i < numCAs; i++ {
  241. m.certificateAuthorities[i] = randomBytes(rand.Intn(15)+1, rand)
  242. }
  243. return reflect.ValueOf(m)
  244. }
  245. func (*certificateRequestMsg13) Generate(rand *rand.Rand, size int) reflect.Value {
  246. m := &certificateRequestMsg13{}
  247. m.requestContext = randomBytes(rand.Intn(5), rand)
  248. m.supportedSignatureAlgorithms = supportedSignatureAlgorithms
  249. numCAs := rand.Intn(100)
  250. m.certificateAuthorities = make([][]byte, numCAs)
  251. for i := 0; i < numCAs; i++ {
  252. m.certificateAuthorities[i] = randomBytes(rand.Intn(15)+1, rand)
  253. }
  254. return reflect.ValueOf(m)
  255. }
  256. func (*certificateVerifyMsg) Generate(rand *rand.Rand, size int) reflect.Value {
  257. m := &certificateVerifyMsg{}
  258. m.signature = randomBytes(rand.Intn(15)+1, rand)
  259. return reflect.ValueOf(m)
  260. }
  261. func (*certificateStatusMsg) Generate(rand *rand.Rand, size int) reflect.Value {
  262. m := &certificateStatusMsg{}
  263. if rand.Intn(10) > 5 {
  264. m.statusType = statusTypeOCSP
  265. m.response = randomBytes(rand.Intn(10)+1, rand)
  266. } else {
  267. m.statusType = 42
  268. }
  269. return reflect.ValueOf(m)
  270. }
  271. func (*clientKeyExchangeMsg) Generate(rand *rand.Rand, size int) reflect.Value {
  272. m := &clientKeyExchangeMsg{}
  273. m.ciphertext = randomBytes(rand.Intn(1000)+1, rand)
  274. return reflect.ValueOf(m)
  275. }
  276. func (*finishedMsg) Generate(rand *rand.Rand, size int) reflect.Value {
  277. m := &finishedMsg{}
  278. m.verifyData = randomBytes(12, rand)
  279. return reflect.ValueOf(m)
  280. }
  281. func (*nextProtoMsg) Generate(rand *rand.Rand, size int) reflect.Value {
  282. m := &nextProtoMsg{}
  283. m.proto = randomString(rand.Intn(255), rand)
  284. return reflect.ValueOf(m)
  285. }
  286. func (*newSessionTicketMsg) Generate(rand *rand.Rand, size int) reflect.Value {
  287. m := &newSessionTicketMsg{}
  288. m.ticket = randomBytes(rand.Intn(4), rand)
  289. return reflect.ValueOf(m)
  290. }
  291. func (*newSessionTicketMsg13) Generate(rand *rand.Rand, size int) reflect.Value {
  292. m := &newSessionTicketMsg13{}
  293. m.ageAdd = uint32(rand.Intn(0xffffffff))
  294. m.lifetime = uint32(rand.Intn(0xffffffff))
  295. m.nonce = randomBytes(1+rand.Intn(255), rand)
  296. m.ticket = randomBytes(1+rand.Intn(40), rand)
  297. if rand.Intn(10) > 5 {
  298. m.withEarlyDataInfo = true
  299. m.maxEarlyDataLength = uint32(rand.Intn(0xffffffff))
  300. }
  301. return reflect.ValueOf(m)
  302. }
  303. func (*sessionState) Generate(rand *rand.Rand, size int) reflect.Value {
  304. s := &sessionState{}
  305. s.vers = uint16(rand.Intn(10000))
  306. s.cipherSuite = uint16(rand.Intn(10000))
  307. s.masterSecret = randomBytes(rand.Intn(100), rand)
  308. numCerts := rand.Intn(20)
  309. s.certificates = make([][]byte, numCerts)
  310. for i := 0; i < numCerts; i++ {
  311. s.certificates[i] = randomBytes(rand.Intn(10)+1, rand)
  312. }
  313. return reflect.ValueOf(s)
  314. }
  315. func (*sessionState13) Generate(rand *rand.Rand, size int) reflect.Value {
  316. s := &sessionState13{}
  317. s.vers = uint16(rand.Intn(10000))
  318. s.suite = uint16(rand.Intn(10000))
  319. s.ageAdd = uint32(rand.Intn(0xffffffff))
  320. s.maxEarlyDataLen = uint32(rand.Intn(0xffffffff))
  321. s.createdAt = uint64(rand.Int63n(0xfffffffffffffff))
  322. s.pskSecret = randomBytes(rand.Intn(100), rand)
  323. s.alpnProtocol = randomString(rand.Intn(100), rand)
  324. s.SNI = randomString(rand.Intn(100), rand)
  325. return reflect.ValueOf(s)
  326. }
  327. func TestRejectEmptySCTList(t *testing.T) {
  328. // https://tools.ietf.org/html/rfc6962#section-3.3.1 specifies that
  329. // empty SCT lists are invalid.
  330. var random [32]byte
  331. sct := []byte{0x42, 0x42, 0x42, 0x42}
  332. serverHello := serverHelloMsg{
  333. vers: VersionTLS12,
  334. random: random[:],
  335. scts: [][]byte{sct},
  336. }
  337. serverHelloBytes := serverHello.marshal()
  338. var serverHelloCopy serverHelloMsg
  339. if serverHelloCopy.unmarshal(serverHelloBytes) != alertSuccess {
  340. t.Fatal("Failed to unmarshal initial message")
  341. }
  342. // Change serverHelloBytes so that the SCT list is empty
  343. i := bytes.Index(serverHelloBytes, sct)
  344. if i < 0 {
  345. t.Fatal("Cannot find SCT in ServerHello")
  346. }
  347. var serverHelloEmptySCT []byte
  348. serverHelloEmptySCT = append(serverHelloEmptySCT, serverHelloBytes[:i-6]...)
  349. // Append the extension length and SCT list length for an empty list.
  350. serverHelloEmptySCT = append(serverHelloEmptySCT, []byte{0, 2, 0, 0}...)
  351. serverHelloEmptySCT = append(serverHelloEmptySCT, serverHelloBytes[i+4:]...)
  352. // Update the handshake message length.
  353. serverHelloEmptySCT[1] = byte((len(serverHelloEmptySCT) - 4) >> 16)
  354. serverHelloEmptySCT[2] = byte((len(serverHelloEmptySCT) - 4) >> 8)
  355. serverHelloEmptySCT[3] = byte(len(serverHelloEmptySCT) - 4)
  356. // Update the extensions length
  357. serverHelloEmptySCT[42] = byte((len(serverHelloEmptySCT) - 44) >> 8)
  358. serverHelloEmptySCT[43] = byte((len(serverHelloEmptySCT) - 44))
  359. if serverHelloCopy.unmarshal(serverHelloEmptySCT) == alertSuccess {
  360. t.Fatal("Unmarshaled ServerHello with empty SCT list")
  361. }
  362. }
  363. func TestRejectEmptySCT(t *testing.T) {
  364. // Not only must the SCT list be non-empty, but the SCT elements must
  365. // not be zero length.
  366. var random [32]byte
  367. serverHello := serverHelloMsg{
  368. vers: VersionTLS12,
  369. random: random[:],
  370. scts: [][]byte{nil},
  371. }
  372. serverHelloBytes := serverHello.marshal()
  373. var serverHelloCopy serverHelloMsg
  374. if serverHelloCopy.unmarshal(serverHelloBytes) == alertSuccess {
  375. t.Fatal("Unmarshaled ServerHello with zero-length SCT")
  376. }
  377. }