handshake_messages.go 52 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963
  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. "errors"
  7. "fmt"
  8. "slices"
  9. "strings"
  10. "golang.org/x/crypto/cryptobyte"
  11. )
  12. // The marshalingFunction type is an adapter to allow the use of ordinary
  13. // functions as cryptobyte.MarshalingValue.
  14. type marshalingFunction func(b *cryptobyte.Builder) error
  15. func (f marshalingFunction) Marshal(b *cryptobyte.Builder) error {
  16. return f(b)
  17. }
  18. // addBytesWithLength appends a sequence of bytes to the cryptobyte.Builder. If
  19. // the length of the sequence is not the value specified, it produces an error.
  20. func addBytesWithLength(b *cryptobyte.Builder, v []byte, n int) {
  21. b.AddValue(marshalingFunction(func(b *cryptobyte.Builder) error {
  22. if len(v) != n {
  23. return fmt.Errorf("invalid value length: expected %d, got %d", n, len(v))
  24. }
  25. b.AddBytes(v)
  26. return nil
  27. }))
  28. }
  29. // addUint64 appends a big-endian, 64-bit value to the cryptobyte.Builder.
  30. func addUint64(b *cryptobyte.Builder, v uint64) {
  31. b.AddUint32(uint32(v >> 32))
  32. b.AddUint32(uint32(v))
  33. }
  34. // readUint64 decodes a big-endian, 64-bit value into out and advances over it.
  35. // It reports whether the read was successful.
  36. func readUint64(s *cryptobyte.String, out *uint64) bool {
  37. var hi, lo uint32
  38. if !s.ReadUint32(&hi) || !s.ReadUint32(&lo) {
  39. return false
  40. }
  41. *out = uint64(hi)<<32 | uint64(lo)
  42. return true
  43. }
  44. // readUint8LengthPrefixed acts like s.ReadUint8LengthPrefixed, but targets a
  45. // []byte instead of a cryptobyte.String.
  46. func readUint8LengthPrefixed(s *cryptobyte.String, out *[]byte) bool {
  47. return s.ReadUint8LengthPrefixed((*cryptobyte.String)(out))
  48. }
  49. // readUint16LengthPrefixed acts like s.ReadUint16LengthPrefixed, but targets a
  50. // []byte instead of a cryptobyte.String.
  51. func readUint16LengthPrefixed(s *cryptobyte.String, out *[]byte) bool {
  52. return s.ReadUint16LengthPrefixed((*cryptobyte.String)(out))
  53. }
  54. // readUint24LengthPrefixed acts like s.ReadUint24LengthPrefixed, but targets a
  55. // []byte instead of a cryptobyte.String.
  56. func readUint24LengthPrefixed(s *cryptobyte.String, out *[]byte) bool {
  57. return s.ReadUint24LengthPrefixed((*cryptobyte.String)(out))
  58. }
  59. type clientHelloMsg struct {
  60. original []byte
  61. vers uint16
  62. random []byte
  63. sessionId []byte
  64. cipherSuites []uint16
  65. compressionMethods []uint8
  66. serverName string
  67. ocspStapling bool
  68. supportedCurves []CurveID
  69. supportedPoints []uint8
  70. ticketSupported bool
  71. sessionTicket []uint8
  72. supportedSignatureAlgorithms []SignatureScheme
  73. supportedSignatureAlgorithmsCert []SignatureScheme
  74. secureRenegotiationSupported bool
  75. secureRenegotiation []byte
  76. extendedMasterSecret bool
  77. alpnProtocols []string
  78. scts bool
  79. supportedVersions []uint16
  80. cookie []byte
  81. keyShares []keyShare
  82. earlyData bool
  83. pskModes []uint8
  84. pskIdentities []pskIdentity
  85. pskBinders [][]byte
  86. quicTransportParameters []byte
  87. encryptedClientHello []byte
  88. // [UTLS]
  89. nextProtoNeg bool
  90. }
  91. func (m *clientHelloMsg) marshalMsg(echInner bool) ([]byte, error) {
  92. var exts cryptobyte.Builder
  93. if len(m.serverName) > 0 {
  94. // RFC 6066, Section 3
  95. exts.AddUint16(extensionServerName)
  96. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  97. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  98. exts.AddUint8(0) // name_type = host_name
  99. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  100. exts.AddBytes([]byte(m.serverName))
  101. })
  102. })
  103. })
  104. }
  105. if len(m.supportedPoints) > 0 && !echInner {
  106. // RFC 4492, Section 5.1.2
  107. exts.AddUint16(extensionSupportedPoints)
  108. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  109. exts.AddUint8LengthPrefixed(func(exts *cryptobyte.Builder) {
  110. exts.AddBytes(m.supportedPoints)
  111. })
  112. })
  113. }
  114. if m.ticketSupported && !echInner {
  115. // RFC 5077, Section 3.2
  116. exts.AddUint16(extensionSessionTicket)
  117. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  118. exts.AddBytes(m.sessionTicket)
  119. })
  120. }
  121. if m.secureRenegotiationSupported && !echInner {
  122. // RFC 5746, Section 3.2
  123. exts.AddUint16(extensionRenegotiationInfo)
  124. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  125. exts.AddUint8LengthPrefixed(func(exts *cryptobyte.Builder) {
  126. exts.AddBytes(m.secureRenegotiation)
  127. })
  128. })
  129. }
  130. if m.extendedMasterSecret && !echInner {
  131. // RFC 7627
  132. exts.AddUint16(extensionExtendedMasterSecret)
  133. exts.AddUint16(0) // empty extension_data
  134. }
  135. if m.scts {
  136. // RFC 6962, Section 3.3.1
  137. exts.AddUint16(extensionSCT)
  138. exts.AddUint16(0) // empty extension_data
  139. }
  140. if m.earlyData {
  141. // RFC 8446, Section 4.2.10
  142. exts.AddUint16(extensionEarlyData)
  143. exts.AddUint16(0) // empty extension_data
  144. }
  145. if m.quicTransportParameters != nil { // marshal zero-length parameters when present
  146. // RFC 9001, Section 8.2
  147. exts.AddUint16(extensionQUICTransportParameters)
  148. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  149. exts.AddBytes(m.quicTransportParameters)
  150. })
  151. }
  152. if len(m.encryptedClientHello) > 0 {
  153. exts.AddUint16(extensionEncryptedClientHello)
  154. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  155. exts.AddBytes(m.encryptedClientHello)
  156. })
  157. }
  158. // Note that any extension that can be compressed during ECH must be
  159. // contiguous. If any additional extensions are to be compressed they must
  160. // be added to the following block, so that they can be properly
  161. // decompressed on the other side.
  162. var echOuterExts []uint16
  163. if m.ocspStapling {
  164. // RFC 4366, Section 3.6
  165. if echInner {
  166. echOuterExts = append(echOuterExts, extensionStatusRequest)
  167. } else {
  168. exts.AddUint16(extensionStatusRequest)
  169. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  170. exts.AddUint8(1) // status_type = ocsp
  171. exts.AddUint16(0) // empty responder_id_list
  172. exts.AddUint16(0) // empty request_extensions
  173. })
  174. }
  175. }
  176. if len(m.supportedCurves) > 0 {
  177. // RFC 4492, sections 5.1.1 and RFC 8446, Section 4.2.7
  178. if echInner {
  179. echOuterExts = append(echOuterExts, extensionSupportedCurves)
  180. } else {
  181. exts.AddUint16(extensionSupportedCurves)
  182. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  183. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  184. for _, curve := range m.supportedCurves {
  185. exts.AddUint16(uint16(curve))
  186. }
  187. })
  188. })
  189. }
  190. }
  191. if len(m.supportedSignatureAlgorithms) > 0 {
  192. // RFC 5246, Section 7.4.1.4.1
  193. if echInner {
  194. echOuterExts = append(echOuterExts, extensionSignatureAlgorithms)
  195. } else {
  196. exts.AddUint16(extensionSignatureAlgorithms)
  197. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  198. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  199. for _, sigAlgo := range m.supportedSignatureAlgorithms {
  200. exts.AddUint16(uint16(sigAlgo))
  201. }
  202. })
  203. })
  204. }
  205. }
  206. if len(m.supportedSignatureAlgorithmsCert) > 0 {
  207. // RFC 8446, Section 4.2.3
  208. if echInner {
  209. echOuterExts = append(echOuterExts, extensionSignatureAlgorithmsCert)
  210. } else {
  211. exts.AddUint16(extensionSignatureAlgorithmsCert)
  212. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  213. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  214. for _, sigAlgo := range m.supportedSignatureAlgorithmsCert {
  215. exts.AddUint16(uint16(sigAlgo))
  216. }
  217. })
  218. })
  219. }
  220. }
  221. if len(m.alpnProtocols) > 0 {
  222. // RFC 7301, Section 3.1
  223. if echInner {
  224. echOuterExts = append(echOuterExts, extensionALPN)
  225. } else {
  226. exts.AddUint16(extensionALPN)
  227. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  228. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  229. for _, proto := range m.alpnProtocols {
  230. exts.AddUint8LengthPrefixed(func(exts *cryptobyte.Builder) {
  231. exts.AddBytes([]byte(proto))
  232. })
  233. }
  234. })
  235. })
  236. }
  237. }
  238. if len(m.supportedVersions) > 0 {
  239. // RFC 8446, Section 4.2.1
  240. if echInner {
  241. echOuterExts = append(echOuterExts, extensionSupportedVersions)
  242. } else {
  243. exts.AddUint16(extensionSupportedVersions)
  244. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  245. exts.AddUint8LengthPrefixed(func(exts *cryptobyte.Builder) {
  246. for _, vers := range m.supportedVersions {
  247. exts.AddUint16(vers)
  248. }
  249. })
  250. })
  251. }
  252. }
  253. if len(m.cookie) > 0 {
  254. // RFC 8446, Section 4.2.2
  255. if echInner {
  256. echOuterExts = append(echOuterExts, extensionCookie)
  257. } else {
  258. exts.AddUint16(extensionCookie)
  259. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  260. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  261. exts.AddBytes(m.cookie)
  262. })
  263. })
  264. }
  265. }
  266. if len(m.keyShares) > 0 {
  267. // RFC 8446, Section 4.2.8
  268. if echInner {
  269. echOuterExts = append(echOuterExts, extensionKeyShare)
  270. } else {
  271. exts.AddUint16(extensionKeyShare)
  272. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  273. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  274. for _, ks := range m.keyShares {
  275. exts.AddUint16(uint16(ks.group))
  276. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  277. exts.AddBytes(ks.data)
  278. })
  279. }
  280. })
  281. })
  282. }
  283. }
  284. if len(m.pskModes) > 0 {
  285. // RFC 8446, Section 4.2.9
  286. if echInner {
  287. echOuterExts = append(echOuterExts, extensionPSKModes)
  288. } else {
  289. exts.AddUint16(extensionPSKModes)
  290. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  291. exts.AddUint8LengthPrefixed(func(exts *cryptobyte.Builder) {
  292. exts.AddBytes(m.pskModes)
  293. })
  294. })
  295. }
  296. }
  297. if len(echOuterExts) > 0 && echInner {
  298. exts.AddUint16(extensionECHOuterExtensions)
  299. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  300. exts.AddUint8LengthPrefixed(func(exts *cryptobyte.Builder) {
  301. for _, e := range echOuterExts {
  302. exts.AddUint16(e)
  303. }
  304. })
  305. })
  306. }
  307. if len(m.pskIdentities) > 0 { // pre_shared_key must be the last extension
  308. // RFC 8446, Section 4.2.11
  309. exts.AddUint16(extensionPreSharedKey)
  310. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  311. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  312. for _, psk := range m.pskIdentities {
  313. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  314. exts.AddBytes(psk.label)
  315. })
  316. exts.AddUint32(psk.obfuscatedTicketAge)
  317. }
  318. })
  319. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  320. for _, binder := range m.pskBinders {
  321. exts.AddUint8LengthPrefixed(func(exts *cryptobyte.Builder) {
  322. exts.AddBytes(binder)
  323. })
  324. }
  325. })
  326. })
  327. }
  328. extBytes, err := exts.Bytes()
  329. if err != nil {
  330. return nil, err
  331. }
  332. var b cryptobyte.Builder
  333. b.AddUint8(typeClientHello)
  334. b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
  335. b.AddUint16(m.vers)
  336. addBytesWithLength(b, m.random, 32)
  337. b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
  338. if !echInner {
  339. b.AddBytes(m.sessionId)
  340. }
  341. })
  342. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  343. for _, suite := range m.cipherSuites {
  344. b.AddUint16(suite)
  345. }
  346. })
  347. b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
  348. b.AddBytes(m.compressionMethods)
  349. })
  350. if len(extBytes) > 0 {
  351. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  352. b.AddBytes(extBytes)
  353. })
  354. }
  355. })
  356. return b.Bytes()
  357. }
  358. func (m *clientHelloMsg) marshal() ([]byte, error) {
  359. // [UTLS SECTION BEGIN]
  360. if m.original != nil {
  361. return m.original, nil
  362. }
  363. // [UTLS SECTION END]
  364. return m.marshalMsg(false)
  365. }
  366. // marshalWithoutBinders returns the ClientHello through the
  367. // PreSharedKeyExtension.identities field, according to RFC 8446, Section
  368. // 4.2.11.2. Note that m.pskBinders must be set to slices of the correct length.
  369. func (m *clientHelloMsg) marshalWithoutBinders() ([]byte, error) {
  370. bindersLen := 2 // uint16 length prefix
  371. for _, binder := range m.pskBinders {
  372. bindersLen += 1 // uint8 length prefix
  373. bindersLen += len(binder)
  374. }
  375. var fullMessage []byte
  376. if m.original != nil {
  377. fullMessage = m.original
  378. } else {
  379. var err error
  380. fullMessage, err = m.marshal()
  381. if err != nil {
  382. return nil, err
  383. }
  384. }
  385. return fullMessage[:len(fullMessage)-bindersLen], nil
  386. }
  387. // updateBinders updates the m.pskBinders field. The supplied binders must have
  388. // the same length as the current m.pskBinders.
  389. func (m *clientHelloMsg) updateBinders(pskBinders [][]byte) error {
  390. if len(pskBinders) != len(m.pskBinders) {
  391. return errors.New("tls: internal error: pskBinders length mismatch")
  392. }
  393. for i := range m.pskBinders {
  394. if len(pskBinders[i]) != len(m.pskBinders[i]) {
  395. return errors.New("tls: internal error: pskBinders length mismatch")
  396. }
  397. }
  398. m.pskBinders = pskBinders
  399. return nil
  400. }
  401. func (m *clientHelloMsg) unmarshal(data []byte) bool {
  402. *m = clientHelloMsg{original: data}
  403. s := cryptobyte.String(data)
  404. if !s.Skip(4) || // message type and uint24 length field
  405. !s.ReadUint16(&m.vers) || !s.ReadBytes(&m.random, 32) ||
  406. !readUint8LengthPrefixed(&s, &m.sessionId) {
  407. return false
  408. }
  409. var cipherSuites cryptobyte.String
  410. if !s.ReadUint16LengthPrefixed(&cipherSuites) {
  411. return false
  412. }
  413. m.cipherSuites = []uint16{}
  414. m.secureRenegotiationSupported = false
  415. for !cipherSuites.Empty() {
  416. var suite uint16
  417. if !cipherSuites.ReadUint16(&suite) {
  418. return false
  419. }
  420. if suite == scsvRenegotiation {
  421. m.secureRenegotiationSupported = true
  422. }
  423. m.cipherSuites = append(m.cipherSuites, suite)
  424. }
  425. if !readUint8LengthPrefixed(&s, &m.compressionMethods) {
  426. return false
  427. }
  428. if s.Empty() {
  429. // ClientHello is optionally followed by extension data
  430. return true
  431. }
  432. var extensions cryptobyte.String
  433. if !s.ReadUint16LengthPrefixed(&extensions) || !s.Empty() {
  434. return false
  435. }
  436. seenExts := make(map[uint16]bool)
  437. for !extensions.Empty() {
  438. var extension uint16
  439. var extData cryptobyte.String
  440. if !extensions.ReadUint16(&extension) ||
  441. !extensions.ReadUint16LengthPrefixed(&extData) {
  442. return false
  443. }
  444. if seenExts[extension] {
  445. return false
  446. }
  447. seenExts[extension] = true
  448. switch extension {
  449. case extensionServerName:
  450. // RFC 6066, Section 3
  451. var nameList cryptobyte.String
  452. if !extData.ReadUint16LengthPrefixed(&nameList) || nameList.Empty() {
  453. return false
  454. }
  455. for !nameList.Empty() {
  456. var nameType uint8
  457. var serverName cryptobyte.String
  458. if !nameList.ReadUint8(&nameType) ||
  459. !nameList.ReadUint16LengthPrefixed(&serverName) ||
  460. serverName.Empty() {
  461. return false
  462. }
  463. if nameType != 0 {
  464. continue
  465. }
  466. if len(m.serverName) != 0 {
  467. // Multiple names of the same name_type are prohibited.
  468. return false
  469. }
  470. m.serverName = string(serverName)
  471. // An SNI value may not include a trailing dot.
  472. if strings.HasSuffix(m.serverName, ".") {
  473. return false
  474. }
  475. }
  476. case extensionStatusRequest:
  477. // RFC 4366, Section 3.6
  478. var statusType uint8
  479. var ignored cryptobyte.String
  480. if !extData.ReadUint8(&statusType) ||
  481. !extData.ReadUint16LengthPrefixed(&ignored) ||
  482. !extData.ReadUint16LengthPrefixed(&ignored) {
  483. return false
  484. }
  485. m.ocspStapling = statusType == statusTypeOCSP
  486. case extensionSupportedCurves:
  487. // RFC 4492, sections 5.1.1 and RFC 8446, Section 4.2.7
  488. var curves cryptobyte.String
  489. if !extData.ReadUint16LengthPrefixed(&curves) || curves.Empty() {
  490. return false
  491. }
  492. for !curves.Empty() {
  493. var curve uint16
  494. if !curves.ReadUint16(&curve) {
  495. return false
  496. }
  497. m.supportedCurves = append(m.supportedCurves, CurveID(curve))
  498. }
  499. case extensionSupportedPoints:
  500. // RFC 4492, Section 5.1.2
  501. if !readUint8LengthPrefixed(&extData, &m.supportedPoints) ||
  502. len(m.supportedPoints) == 0 {
  503. return false
  504. }
  505. case extensionSessionTicket:
  506. // RFC 5077, Section 3.2
  507. m.ticketSupported = true
  508. extData.ReadBytes(&m.sessionTicket, len(extData))
  509. case extensionSignatureAlgorithms:
  510. // RFC 5246, Section 7.4.1.4.1
  511. var sigAndAlgs cryptobyte.String
  512. if !extData.ReadUint16LengthPrefixed(&sigAndAlgs) || sigAndAlgs.Empty() {
  513. return false
  514. }
  515. for !sigAndAlgs.Empty() {
  516. var sigAndAlg uint16
  517. if !sigAndAlgs.ReadUint16(&sigAndAlg) {
  518. return false
  519. }
  520. m.supportedSignatureAlgorithms = append(
  521. m.supportedSignatureAlgorithms, SignatureScheme(sigAndAlg))
  522. }
  523. case extensionSignatureAlgorithmsCert:
  524. // RFC 8446, Section 4.2.3
  525. var sigAndAlgs cryptobyte.String
  526. if !extData.ReadUint16LengthPrefixed(&sigAndAlgs) || sigAndAlgs.Empty() {
  527. return false
  528. }
  529. for !sigAndAlgs.Empty() {
  530. var sigAndAlg uint16
  531. if !sigAndAlgs.ReadUint16(&sigAndAlg) {
  532. return false
  533. }
  534. m.supportedSignatureAlgorithmsCert = append(
  535. m.supportedSignatureAlgorithmsCert, SignatureScheme(sigAndAlg))
  536. }
  537. case extensionRenegotiationInfo:
  538. // RFC 5746, Section 3.2
  539. if !readUint8LengthPrefixed(&extData, &m.secureRenegotiation) {
  540. return false
  541. }
  542. m.secureRenegotiationSupported = true
  543. case extensionExtendedMasterSecret:
  544. // RFC 7627
  545. m.extendedMasterSecret = true
  546. case extensionALPN:
  547. // RFC 7301, Section 3.1
  548. var protoList cryptobyte.String
  549. if !extData.ReadUint16LengthPrefixed(&protoList) || protoList.Empty() {
  550. return false
  551. }
  552. for !protoList.Empty() {
  553. var proto cryptobyte.String
  554. if !protoList.ReadUint8LengthPrefixed(&proto) || proto.Empty() {
  555. return false
  556. }
  557. m.alpnProtocols = append(m.alpnProtocols, string(proto))
  558. }
  559. case extensionSCT:
  560. // RFC 6962, Section 3.3.1
  561. m.scts = true
  562. case extensionSupportedVersions:
  563. // RFC 8446, Section 4.2.1
  564. var versList cryptobyte.String
  565. if !extData.ReadUint8LengthPrefixed(&versList) || versList.Empty() {
  566. return false
  567. }
  568. for !versList.Empty() {
  569. var vers uint16
  570. if !versList.ReadUint16(&vers) {
  571. return false
  572. }
  573. m.supportedVersions = append(m.supportedVersions, vers)
  574. }
  575. case extensionCookie:
  576. // RFC 8446, Section 4.2.2
  577. if !readUint16LengthPrefixed(&extData, &m.cookie) ||
  578. len(m.cookie) == 0 {
  579. return false
  580. }
  581. case extensionKeyShare:
  582. // RFC 8446, Section 4.2.8
  583. var clientShares cryptobyte.String
  584. if !extData.ReadUint16LengthPrefixed(&clientShares) {
  585. return false
  586. }
  587. for !clientShares.Empty() {
  588. var ks keyShare
  589. if !clientShares.ReadUint16((*uint16)(&ks.group)) ||
  590. !readUint16LengthPrefixed(&clientShares, &ks.data) ||
  591. len(ks.data) == 0 {
  592. return false
  593. }
  594. m.keyShares = append(m.keyShares, ks)
  595. }
  596. case extensionEarlyData:
  597. // RFC 8446, Section 4.2.10
  598. m.earlyData = true
  599. case extensionPSKModes:
  600. // RFC 8446, Section 4.2.9
  601. if !readUint8LengthPrefixed(&extData, &m.pskModes) {
  602. return false
  603. }
  604. case extensionQUICTransportParameters:
  605. m.quicTransportParameters = make([]byte, len(extData))
  606. if !extData.CopyBytes(m.quicTransportParameters) {
  607. return false
  608. }
  609. case extensionPreSharedKey:
  610. // RFC 8446, Section 4.2.11
  611. if !extensions.Empty() {
  612. return false // pre_shared_key must be the last extension
  613. }
  614. var identities cryptobyte.String
  615. if !extData.ReadUint16LengthPrefixed(&identities) || identities.Empty() {
  616. return false
  617. }
  618. for !identities.Empty() {
  619. var psk pskIdentity
  620. if !readUint16LengthPrefixed(&identities, &psk.label) ||
  621. !identities.ReadUint32(&psk.obfuscatedTicketAge) ||
  622. len(psk.label) == 0 {
  623. return false
  624. }
  625. m.pskIdentities = append(m.pskIdentities, psk)
  626. }
  627. var binders cryptobyte.String
  628. if !extData.ReadUint16LengthPrefixed(&binders) || binders.Empty() {
  629. return false
  630. }
  631. for !binders.Empty() {
  632. var binder []byte
  633. if !readUint8LengthPrefixed(&binders, &binder) ||
  634. len(binder) == 0 {
  635. return false
  636. }
  637. m.pskBinders = append(m.pskBinders, binder)
  638. }
  639. default:
  640. // Ignore unknown extensions.
  641. continue
  642. }
  643. if !extData.Empty() {
  644. return false
  645. }
  646. }
  647. return true
  648. }
  649. func (m *clientHelloMsg) originalBytes() []byte {
  650. return m.original
  651. }
  652. func (m *clientHelloMsg) clone() *clientHelloMsg {
  653. return &clientHelloMsg{
  654. original: slices.Clone(m.original),
  655. vers: m.vers,
  656. random: slices.Clone(m.random),
  657. sessionId: slices.Clone(m.sessionId),
  658. cipherSuites: slices.Clone(m.cipherSuites),
  659. compressionMethods: slices.Clone(m.compressionMethods),
  660. serverName: m.serverName,
  661. ocspStapling: m.ocspStapling,
  662. supportedCurves: slices.Clone(m.supportedCurves),
  663. supportedPoints: slices.Clone(m.supportedPoints),
  664. ticketSupported: m.ticketSupported,
  665. sessionTicket: slices.Clone(m.sessionTicket),
  666. supportedSignatureAlgorithms: slices.Clone(m.supportedSignatureAlgorithms),
  667. supportedSignatureAlgorithmsCert: slices.Clone(m.supportedSignatureAlgorithmsCert),
  668. secureRenegotiationSupported: m.secureRenegotiationSupported,
  669. secureRenegotiation: slices.Clone(m.secureRenegotiation),
  670. extendedMasterSecret: m.extendedMasterSecret,
  671. alpnProtocols: slices.Clone(m.alpnProtocols),
  672. scts: m.scts,
  673. supportedVersions: slices.Clone(m.supportedVersions),
  674. cookie: slices.Clone(m.cookie),
  675. keyShares: slices.Clone(m.keyShares),
  676. earlyData: m.earlyData,
  677. pskModes: slices.Clone(m.pskModes),
  678. pskIdentities: slices.Clone(m.pskIdentities),
  679. pskBinders: slices.Clone(m.pskBinders),
  680. quicTransportParameters: slices.Clone(m.quicTransportParameters),
  681. encryptedClientHello: slices.Clone(m.encryptedClientHello),
  682. }
  683. }
  684. type serverHelloMsg struct {
  685. original []byte
  686. vers uint16
  687. random []byte
  688. sessionId []byte
  689. cipherSuite uint16
  690. compressionMethod uint8
  691. ocspStapling bool
  692. ticketSupported bool
  693. secureRenegotiationSupported bool
  694. secureRenegotiation []byte
  695. extendedMasterSecret bool
  696. alpnProtocol string
  697. scts [][]byte
  698. supportedVersion uint16
  699. serverShare keyShare
  700. selectedIdentityPresent bool
  701. selectedIdentity uint16
  702. supportedPoints []uint8
  703. encryptedClientHello []byte
  704. serverNameAck bool
  705. // HelloRetryRequest extensions
  706. cookie []byte
  707. selectedGroup CurveID
  708. // [UTLS]
  709. nextProtoNeg bool
  710. nextProtos []string
  711. }
  712. func (m *serverHelloMsg) marshal() ([]byte, error) {
  713. var exts cryptobyte.Builder
  714. if m.ocspStapling {
  715. exts.AddUint16(extensionStatusRequest)
  716. exts.AddUint16(0) // empty extension_data
  717. }
  718. if m.ticketSupported {
  719. exts.AddUint16(extensionSessionTicket)
  720. exts.AddUint16(0) // empty extension_data
  721. }
  722. if m.secureRenegotiationSupported {
  723. exts.AddUint16(extensionRenegotiationInfo)
  724. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  725. exts.AddUint8LengthPrefixed(func(exts *cryptobyte.Builder) {
  726. exts.AddBytes(m.secureRenegotiation)
  727. })
  728. })
  729. }
  730. if m.extendedMasterSecret {
  731. exts.AddUint16(extensionExtendedMasterSecret)
  732. exts.AddUint16(0) // empty extension_data
  733. }
  734. if len(m.alpnProtocol) > 0 {
  735. exts.AddUint16(extensionALPN)
  736. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  737. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  738. exts.AddUint8LengthPrefixed(func(exts *cryptobyte.Builder) {
  739. exts.AddBytes([]byte(m.alpnProtocol))
  740. })
  741. })
  742. })
  743. }
  744. if len(m.scts) > 0 {
  745. exts.AddUint16(extensionSCT)
  746. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  747. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  748. for _, sct := range m.scts {
  749. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  750. exts.AddBytes(sct)
  751. })
  752. }
  753. })
  754. })
  755. }
  756. if m.supportedVersion != 0 {
  757. exts.AddUint16(extensionSupportedVersions)
  758. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  759. exts.AddUint16(m.supportedVersion)
  760. })
  761. }
  762. if m.serverShare.group != 0 {
  763. exts.AddUint16(extensionKeyShare)
  764. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  765. exts.AddUint16(uint16(m.serverShare.group))
  766. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  767. exts.AddBytes(m.serverShare.data)
  768. })
  769. })
  770. }
  771. if m.selectedIdentityPresent {
  772. exts.AddUint16(extensionPreSharedKey)
  773. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  774. exts.AddUint16(m.selectedIdentity)
  775. })
  776. }
  777. if len(m.cookie) > 0 {
  778. exts.AddUint16(extensionCookie)
  779. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  780. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  781. exts.AddBytes(m.cookie)
  782. })
  783. })
  784. }
  785. if m.selectedGroup != 0 {
  786. exts.AddUint16(extensionKeyShare)
  787. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  788. exts.AddUint16(uint16(m.selectedGroup))
  789. })
  790. }
  791. if len(m.supportedPoints) > 0 {
  792. exts.AddUint16(extensionSupportedPoints)
  793. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  794. exts.AddUint8LengthPrefixed(func(exts *cryptobyte.Builder) {
  795. exts.AddBytes(m.supportedPoints)
  796. })
  797. })
  798. }
  799. if len(m.encryptedClientHello) > 0 {
  800. exts.AddUint16(extensionEncryptedClientHello)
  801. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  802. exts.AddBytes(m.encryptedClientHello)
  803. })
  804. }
  805. if m.serverNameAck {
  806. exts.AddUint16(extensionServerName)
  807. exts.AddUint16(0)
  808. }
  809. extBytes, err := exts.Bytes()
  810. if err != nil {
  811. return nil, err
  812. }
  813. var b cryptobyte.Builder
  814. b.AddUint8(typeServerHello)
  815. b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
  816. b.AddUint16(m.vers)
  817. addBytesWithLength(b, m.random, 32)
  818. b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
  819. b.AddBytes(m.sessionId)
  820. })
  821. b.AddUint16(m.cipherSuite)
  822. b.AddUint8(m.compressionMethod)
  823. if len(extBytes) > 0 {
  824. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  825. b.AddBytes(extBytes)
  826. })
  827. }
  828. })
  829. return b.Bytes()
  830. }
  831. func (m *serverHelloMsg) unmarshal(data []byte) bool {
  832. *m = serverHelloMsg{original: data}
  833. s := cryptobyte.String(data)
  834. if !s.Skip(4) || // message type and uint24 length field
  835. !s.ReadUint16(&m.vers) || !s.ReadBytes(&m.random, 32) ||
  836. !readUint8LengthPrefixed(&s, &m.sessionId) ||
  837. !s.ReadUint16(&m.cipherSuite) ||
  838. !s.ReadUint8(&m.compressionMethod) {
  839. return false
  840. }
  841. if s.Empty() {
  842. // ServerHello is optionally followed by extension data
  843. return true
  844. }
  845. var extensions cryptobyte.String
  846. if !s.ReadUint16LengthPrefixed(&extensions) || !s.Empty() {
  847. return false
  848. }
  849. seenExts := make(map[uint16]bool)
  850. for !extensions.Empty() {
  851. var extension uint16
  852. var extData cryptobyte.String
  853. if !extensions.ReadUint16(&extension) ||
  854. !extensions.ReadUint16LengthPrefixed(&extData) {
  855. return false
  856. }
  857. if seenExts[extension] {
  858. return false
  859. }
  860. seenExts[extension] = true
  861. switch extension {
  862. case extensionStatusRequest:
  863. m.ocspStapling = true
  864. case extensionSessionTicket:
  865. m.ticketSupported = true
  866. case extensionRenegotiationInfo:
  867. if !readUint8LengthPrefixed(&extData, &m.secureRenegotiation) {
  868. return false
  869. }
  870. m.secureRenegotiationSupported = true
  871. case extensionExtendedMasterSecret:
  872. m.extendedMasterSecret = true
  873. case extensionALPN:
  874. var protoList cryptobyte.String
  875. if !extData.ReadUint16LengthPrefixed(&protoList) || protoList.Empty() {
  876. return false
  877. }
  878. var proto cryptobyte.String
  879. if !protoList.ReadUint8LengthPrefixed(&proto) ||
  880. proto.Empty() || !protoList.Empty() {
  881. return false
  882. }
  883. m.alpnProtocol = string(proto)
  884. case extensionSCT:
  885. var sctList cryptobyte.String
  886. if !extData.ReadUint16LengthPrefixed(&sctList) || sctList.Empty() {
  887. return false
  888. }
  889. for !sctList.Empty() {
  890. var sct []byte
  891. if !readUint16LengthPrefixed(&sctList, &sct) ||
  892. len(sct) == 0 {
  893. return false
  894. }
  895. m.scts = append(m.scts, sct)
  896. }
  897. case extensionSupportedVersions:
  898. if !extData.ReadUint16(&m.supportedVersion) {
  899. return false
  900. }
  901. case extensionCookie:
  902. if !readUint16LengthPrefixed(&extData, &m.cookie) ||
  903. len(m.cookie) == 0 {
  904. return false
  905. }
  906. case extensionKeyShare:
  907. // This extension has different formats in SH and HRR, accept either
  908. // and let the handshake logic decide. See RFC 8446, Section 4.2.8.
  909. if len(extData) == 2 {
  910. if !extData.ReadUint16((*uint16)(&m.selectedGroup)) {
  911. return false
  912. }
  913. } else {
  914. if !extData.ReadUint16((*uint16)(&m.serverShare.group)) ||
  915. !readUint16LengthPrefixed(&extData, &m.serverShare.data) {
  916. return false
  917. }
  918. }
  919. case extensionPreSharedKey:
  920. m.selectedIdentityPresent = true
  921. if !extData.ReadUint16(&m.selectedIdentity) {
  922. return false
  923. }
  924. case extensionSupportedPoints:
  925. // RFC 4492, Section 5.1.2
  926. if !readUint8LengthPrefixed(&extData, &m.supportedPoints) ||
  927. len(m.supportedPoints) == 0 {
  928. return false
  929. }
  930. case extensionEncryptedClientHello: // encrypted_client_hello
  931. m.encryptedClientHello = make([]byte, len(extData))
  932. if !extData.CopyBytes(m.encryptedClientHello) {
  933. return false
  934. }
  935. case extensionServerName:
  936. if len(extData) != 0 {
  937. return false
  938. }
  939. m.serverNameAck = true
  940. default:
  941. // Ignore unknown extensions.
  942. continue
  943. }
  944. if !extData.Empty() {
  945. return false
  946. }
  947. }
  948. return true
  949. }
  950. func (m *serverHelloMsg) originalBytes() []byte {
  951. return m.original
  952. }
  953. type encryptedExtensionsMsg struct {
  954. alpnProtocol string
  955. quicTransportParameters []byte
  956. earlyData bool
  957. echRetryConfigs []byte
  958. // [UTLS]
  959. utls utlsEncryptedExtensionsMsgExtraFields
  960. }
  961. func (m *encryptedExtensionsMsg) marshal() ([]byte, error) {
  962. var b cryptobyte.Builder
  963. b.AddUint8(typeEncryptedExtensions)
  964. b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
  965. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  966. if len(m.alpnProtocol) > 0 {
  967. b.AddUint16(extensionALPN)
  968. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  969. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  970. b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
  971. b.AddBytes([]byte(m.alpnProtocol))
  972. })
  973. })
  974. })
  975. }
  976. if m.quicTransportParameters != nil { // marshal zero-length parameters when present
  977. // draft-ietf-quic-tls-32, Section 8.2
  978. b.AddUint16(extensionQUICTransportParameters)
  979. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  980. b.AddBytes(m.quicTransportParameters)
  981. })
  982. }
  983. if m.earlyData {
  984. // RFC 8446, Section 4.2.10
  985. b.AddUint16(extensionEarlyData)
  986. b.AddUint16(0) // empty extension_data
  987. }
  988. if len(m.echRetryConfigs) > 0 {
  989. b.AddUint16(extensionEncryptedClientHello)
  990. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  991. b.AddBytes(m.echRetryConfigs)
  992. })
  993. }
  994. })
  995. })
  996. return b.Bytes()
  997. }
  998. func (m *encryptedExtensionsMsg) unmarshal(data []byte) bool {
  999. *m = encryptedExtensionsMsg{}
  1000. s := cryptobyte.String(data)
  1001. var extensions cryptobyte.String
  1002. if !s.Skip(4) || // message type and uint24 length field
  1003. !s.ReadUint16LengthPrefixed(&extensions) || !s.Empty() {
  1004. return false
  1005. }
  1006. for !extensions.Empty() {
  1007. var extension uint16
  1008. var extData cryptobyte.String
  1009. if !extensions.ReadUint16(&extension) ||
  1010. !extensions.ReadUint16LengthPrefixed(&extData) {
  1011. return false
  1012. }
  1013. switch extension {
  1014. case extensionALPN:
  1015. var protoList cryptobyte.String
  1016. if !extData.ReadUint16LengthPrefixed(&protoList) || protoList.Empty() {
  1017. return false
  1018. }
  1019. var proto cryptobyte.String
  1020. if !protoList.ReadUint8LengthPrefixed(&proto) ||
  1021. proto.Empty() || !protoList.Empty() {
  1022. return false
  1023. }
  1024. m.alpnProtocol = string(proto)
  1025. case extensionQUICTransportParameters:
  1026. m.quicTransportParameters = make([]byte, len(extData))
  1027. if !extData.CopyBytes(m.quicTransportParameters) {
  1028. return false
  1029. }
  1030. case extensionEarlyData:
  1031. // RFC 8446, Section 4.2.10
  1032. m.earlyData = true
  1033. case extensionEncryptedClientHello:
  1034. m.echRetryConfigs = make([]byte, len(extData))
  1035. if !extData.CopyBytes(m.echRetryConfigs) {
  1036. return false
  1037. }
  1038. default:
  1039. // [UTLS SECTION BEGIN]
  1040. // TOOD! check understanding here
  1041. if !m.utlsUnmarshal(extension, extData) {
  1042. return false
  1043. }
  1044. // [UTLS SECTION END]
  1045. // Ignore unknown extensions.
  1046. continue
  1047. }
  1048. if !extData.Empty() {
  1049. return false
  1050. }
  1051. }
  1052. return true
  1053. }
  1054. type endOfEarlyDataMsg struct{}
  1055. func (m *endOfEarlyDataMsg) marshal() ([]byte, error) {
  1056. x := make([]byte, 4)
  1057. x[0] = typeEndOfEarlyData
  1058. return x, nil
  1059. }
  1060. func (m *endOfEarlyDataMsg) unmarshal(data []byte) bool {
  1061. return len(data) == 4
  1062. }
  1063. type keyUpdateMsg struct {
  1064. updateRequested bool
  1065. }
  1066. func (m *keyUpdateMsg) marshal() ([]byte, error) {
  1067. var b cryptobyte.Builder
  1068. b.AddUint8(typeKeyUpdate)
  1069. b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
  1070. if m.updateRequested {
  1071. b.AddUint8(1)
  1072. } else {
  1073. b.AddUint8(0)
  1074. }
  1075. })
  1076. return b.Bytes()
  1077. }
  1078. func (m *keyUpdateMsg) unmarshal(data []byte) bool {
  1079. s := cryptobyte.String(data)
  1080. var updateRequested uint8
  1081. if !s.Skip(4) || // message type and uint24 length field
  1082. !s.ReadUint8(&updateRequested) || !s.Empty() {
  1083. return false
  1084. }
  1085. switch updateRequested {
  1086. case 0:
  1087. m.updateRequested = false
  1088. case 1:
  1089. m.updateRequested = true
  1090. default:
  1091. return false
  1092. }
  1093. return true
  1094. }
  1095. type newSessionTicketMsgTLS13 struct {
  1096. lifetime uint32
  1097. ageAdd uint32
  1098. nonce []byte
  1099. label []byte
  1100. maxEarlyData uint32
  1101. }
  1102. func (m *newSessionTicketMsgTLS13) marshal() ([]byte, error) {
  1103. var b cryptobyte.Builder
  1104. b.AddUint8(typeNewSessionTicket)
  1105. b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
  1106. b.AddUint32(m.lifetime)
  1107. b.AddUint32(m.ageAdd)
  1108. b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
  1109. b.AddBytes(m.nonce)
  1110. })
  1111. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1112. b.AddBytes(m.label)
  1113. })
  1114. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1115. if m.maxEarlyData > 0 {
  1116. b.AddUint16(extensionEarlyData)
  1117. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1118. b.AddUint32(m.maxEarlyData)
  1119. })
  1120. }
  1121. })
  1122. })
  1123. return b.Bytes()
  1124. }
  1125. func (m *newSessionTicketMsgTLS13) unmarshal(data []byte) bool {
  1126. *m = newSessionTicketMsgTLS13{}
  1127. s := cryptobyte.String(data)
  1128. var extensions cryptobyte.String
  1129. if !s.Skip(4) || // message type and uint24 length field
  1130. !s.ReadUint32(&m.lifetime) ||
  1131. !s.ReadUint32(&m.ageAdd) ||
  1132. !readUint8LengthPrefixed(&s, &m.nonce) ||
  1133. !readUint16LengthPrefixed(&s, &m.label) ||
  1134. !s.ReadUint16LengthPrefixed(&extensions) ||
  1135. !s.Empty() {
  1136. return false
  1137. }
  1138. for !extensions.Empty() {
  1139. var extension uint16
  1140. var extData cryptobyte.String
  1141. if !extensions.ReadUint16(&extension) ||
  1142. !extensions.ReadUint16LengthPrefixed(&extData) {
  1143. return false
  1144. }
  1145. switch extension {
  1146. case extensionEarlyData:
  1147. if !extData.ReadUint32(&m.maxEarlyData) {
  1148. return false
  1149. }
  1150. default:
  1151. // Ignore unknown extensions.
  1152. continue
  1153. }
  1154. if !extData.Empty() {
  1155. return false
  1156. }
  1157. }
  1158. return true
  1159. }
  1160. type certificateRequestMsgTLS13 struct {
  1161. ocspStapling bool
  1162. scts bool
  1163. supportedSignatureAlgorithms []SignatureScheme
  1164. supportedSignatureAlgorithmsCert []SignatureScheme
  1165. certificateAuthorities [][]byte
  1166. }
  1167. func (m *certificateRequestMsgTLS13) marshal() ([]byte, error) {
  1168. var b cryptobyte.Builder
  1169. b.AddUint8(typeCertificateRequest)
  1170. b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
  1171. // certificate_request_context (SHALL be zero length unless used for
  1172. // post-handshake authentication)
  1173. b.AddUint8(0)
  1174. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1175. if m.ocspStapling {
  1176. b.AddUint16(extensionStatusRequest)
  1177. b.AddUint16(0) // empty extension_data
  1178. }
  1179. if m.scts {
  1180. // RFC 8446, Section 4.4.2.1 makes no mention of
  1181. // signed_certificate_timestamp in CertificateRequest, but
  1182. // "Extensions in the Certificate message from the client MUST
  1183. // correspond to extensions in the CertificateRequest message
  1184. // from the server." and it appears in the table in Section 4.2.
  1185. b.AddUint16(extensionSCT)
  1186. b.AddUint16(0) // empty extension_data
  1187. }
  1188. if len(m.supportedSignatureAlgorithms) > 0 {
  1189. b.AddUint16(extensionSignatureAlgorithms)
  1190. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1191. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1192. for _, sigAlgo := range m.supportedSignatureAlgorithms {
  1193. b.AddUint16(uint16(sigAlgo))
  1194. }
  1195. })
  1196. })
  1197. }
  1198. if len(m.supportedSignatureAlgorithmsCert) > 0 {
  1199. b.AddUint16(extensionSignatureAlgorithmsCert)
  1200. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1201. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1202. for _, sigAlgo := range m.supportedSignatureAlgorithmsCert {
  1203. b.AddUint16(uint16(sigAlgo))
  1204. }
  1205. })
  1206. })
  1207. }
  1208. if len(m.certificateAuthorities) > 0 {
  1209. b.AddUint16(extensionCertificateAuthorities)
  1210. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1211. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1212. for _, ca := range m.certificateAuthorities {
  1213. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1214. b.AddBytes(ca)
  1215. })
  1216. }
  1217. })
  1218. })
  1219. }
  1220. })
  1221. })
  1222. return b.Bytes()
  1223. }
  1224. func (m *certificateRequestMsgTLS13) unmarshal(data []byte) bool {
  1225. *m = certificateRequestMsgTLS13{}
  1226. s := cryptobyte.String(data)
  1227. var context, extensions cryptobyte.String
  1228. if !s.Skip(4) || // message type and uint24 length field
  1229. !s.ReadUint8LengthPrefixed(&context) || !context.Empty() ||
  1230. !s.ReadUint16LengthPrefixed(&extensions) ||
  1231. !s.Empty() {
  1232. return false
  1233. }
  1234. for !extensions.Empty() {
  1235. var extension uint16
  1236. var extData cryptobyte.String
  1237. if !extensions.ReadUint16(&extension) ||
  1238. !extensions.ReadUint16LengthPrefixed(&extData) {
  1239. return false
  1240. }
  1241. switch extension {
  1242. case extensionStatusRequest:
  1243. m.ocspStapling = true
  1244. case extensionSCT:
  1245. m.scts = true
  1246. case extensionSignatureAlgorithms:
  1247. var sigAndAlgs cryptobyte.String
  1248. if !extData.ReadUint16LengthPrefixed(&sigAndAlgs) || sigAndAlgs.Empty() {
  1249. return false
  1250. }
  1251. for !sigAndAlgs.Empty() {
  1252. var sigAndAlg uint16
  1253. if !sigAndAlgs.ReadUint16(&sigAndAlg) {
  1254. return false
  1255. }
  1256. m.supportedSignatureAlgorithms = append(
  1257. m.supportedSignatureAlgorithms, SignatureScheme(sigAndAlg))
  1258. }
  1259. case extensionSignatureAlgorithmsCert:
  1260. var sigAndAlgs cryptobyte.String
  1261. if !extData.ReadUint16LengthPrefixed(&sigAndAlgs) || sigAndAlgs.Empty() {
  1262. return false
  1263. }
  1264. for !sigAndAlgs.Empty() {
  1265. var sigAndAlg uint16
  1266. if !sigAndAlgs.ReadUint16(&sigAndAlg) {
  1267. return false
  1268. }
  1269. m.supportedSignatureAlgorithmsCert = append(
  1270. m.supportedSignatureAlgorithmsCert, SignatureScheme(sigAndAlg))
  1271. }
  1272. case extensionCertificateAuthorities:
  1273. var auths cryptobyte.String
  1274. if !extData.ReadUint16LengthPrefixed(&auths) || auths.Empty() {
  1275. return false
  1276. }
  1277. for !auths.Empty() {
  1278. var ca []byte
  1279. if !readUint16LengthPrefixed(&auths, &ca) || len(ca) == 0 {
  1280. return false
  1281. }
  1282. m.certificateAuthorities = append(m.certificateAuthorities, ca)
  1283. }
  1284. default:
  1285. // Ignore unknown extensions.
  1286. continue
  1287. }
  1288. if !extData.Empty() {
  1289. return false
  1290. }
  1291. }
  1292. return true
  1293. }
  1294. type certificateMsg struct {
  1295. certificates [][]byte
  1296. }
  1297. func (m *certificateMsg) marshal() ([]byte, error) {
  1298. var i int
  1299. for _, slice := range m.certificates {
  1300. i += len(slice)
  1301. }
  1302. length := 3 + 3*len(m.certificates) + i
  1303. x := make([]byte, 4+length)
  1304. x[0] = typeCertificate
  1305. x[1] = uint8(length >> 16)
  1306. x[2] = uint8(length >> 8)
  1307. x[3] = uint8(length)
  1308. certificateOctets := length - 3
  1309. x[4] = uint8(certificateOctets >> 16)
  1310. x[5] = uint8(certificateOctets >> 8)
  1311. x[6] = uint8(certificateOctets)
  1312. y := x[7:]
  1313. for _, slice := range m.certificates {
  1314. y[0] = uint8(len(slice) >> 16)
  1315. y[1] = uint8(len(slice) >> 8)
  1316. y[2] = uint8(len(slice))
  1317. copy(y[3:], slice)
  1318. y = y[3+len(slice):]
  1319. }
  1320. return x, nil
  1321. }
  1322. func (m *certificateMsg) unmarshal(data []byte) bool {
  1323. if len(data) < 7 {
  1324. return false
  1325. }
  1326. certsLen := uint32(data[4])<<16 | uint32(data[5])<<8 | uint32(data[6])
  1327. if uint32(len(data)) != certsLen+7 {
  1328. return false
  1329. }
  1330. numCerts := 0
  1331. d := data[7:]
  1332. for certsLen > 0 {
  1333. if len(d) < 4 {
  1334. return false
  1335. }
  1336. certLen := uint32(d[0])<<16 | uint32(d[1])<<8 | uint32(d[2])
  1337. if uint32(len(d)) < 3+certLen {
  1338. return false
  1339. }
  1340. d = d[3+certLen:]
  1341. certsLen -= 3 + certLen
  1342. numCerts++
  1343. }
  1344. m.certificates = make([][]byte, numCerts)
  1345. d = data[7:]
  1346. for i := 0; i < numCerts; i++ {
  1347. certLen := uint32(d[0])<<16 | uint32(d[1])<<8 | uint32(d[2])
  1348. m.certificates[i] = d[3 : 3+certLen]
  1349. d = d[3+certLen:]
  1350. }
  1351. return true
  1352. }
  1353. type certificateMsgTLS13 struct {
  1354. certificate Certificate
  1355. ocspStapling bool
  1356. scts bool
  1357. }
  1358. func (m *certificateMsgTLS13) marshal() ([]byte, error) {
  1359. var b cryptobyte.Builder
  1360. b.AddUint8(typeCertificate)
  1361. b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
  1362. b.AddUint8(0) // certificate_request_context
  1363. certificate := m.certificate
  1364. if !m.ocspStapling {
  1365. certificate.OCSPStaple = nil
  1366. }
  1367. if !m.scts {
  1368. certificate.SignedCertificateTimestamps = nil
  1369. }
  1370. marshalCertificate(b, certificate)
  1371. })
  1372. return b.Bytes()
  1373. }
  1374. func marshalCertificate(b *cryptobyte.Builder, certificate Certificate) {
  1375. b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
  1376. for i, cert := range certificate.Certificate {
  1377. b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
  1378. b.AddBytes(cert)
  1379. })
  1380. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1381. if i > 0 {
  1382. // This library only supports OCSP and SCT for leaf certificates.
  1383. return
  1384. }
  1385. if certificate.OCSPStaple != nil {
  1386. b.AddUint16(extensionStatusRequest)
  1387. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1388. b.AddUint8(statusTypeOCSP)
  1389. b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
  1390. b.AddBytes(certificate.OCSPStaple)
  1391. })
  1392. })
  1393. }
  1394. if certificate.SignedCertificateTimestamps != nil {
  1395. b.AddUint16(extensionSCT)
  1396. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1397. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1398. for _, sct := range certificate.SignedCertificateTimestamps {
  1399. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1400. b.AddBytes(sct)
  1401. })
  1402. }
  1403. })
  1404. })
  1405. }
  1406. })
  1407. }
  1408. })
  1409. }
  1410. func (m *certificateMsgTLS13) unmarshal(data []byte) bool {
  1411. *m = certificateMsgTLS13{}
  1412. s := cryptobyte.String(data)
  1413. var context cryptobyte.String
  1414. if !s.Skip(4) || // message type and uint24 length field
  1415. !s.ReadUint8LengthPrefixed(&context) || !context.Empty() ||
  1416. !unmarshalCertificate(&s, &m.certificate) ||
  1417. !s.Empty() {
  1418. return false
  1419. }
  1420. m.scts = m.certificate.SignedCertificateTimestamps != nil
  1421. m.ocspStapling = m.certificate.OCSPStaple != nil
  1422. return true
  1423. }
  1424. func unmarshalCertificate(s *cryptobyte.String, certificate *Certificate) bool {
  1425. var certList cryptobyte.String
  1426. if !s.ReadUint24LengthPrefixed(&certList) {
  1427. return false
  1428. }
  1429. for !certList.Empty() {
  1430. var cert []byte
  1431. var extensions cryptobyte.String
  1432. if !readUint24LengthPrefixed(&certList, &cert) ||
  1433. !certList.ReadUint16LengthPrefixed(&extensions) {
  1434. return false
  1435. }
  1436. certificate.Certificate = append(certificate.Certificate, cert)
  1437. for !extensions.Empty() {
  1438. var extension uint16
  1439. var extData cryptobyte.String
  1440. if !extensions.ReadUint16(&extension) ||
  1441. !extensions.ReadUint16LengthPrefixed(&extData) {
  1442. return false
  1443. }
  1444. if len(certificate.Certificate) > 1 {
  1445. // This library only supports OCSP and SCT for leaf certificates.
  1446. continue
  1447. }
  1448. switch extension {
  1449. case extensionStatusRequest:
  1450. var statusType uint8
  1451. if !extData.ReadUint8(&statusType) || statusType != statusTypeOCSP ||
  1452. !readUint24LengthPrefixed(&extData, &certificate.OCSPStaple) ||
  1453. len(certificate.OCSPStaple) == 0 {
  1454. return false
  1455. }
  1456. case extensionSCT:
  1457. var sctList cryptobyte.String
  1458. if !extData.ReadUint16LengthPrefixed(&sctList) || sctList.Empty() {
  1459. return false
  1460. }
  1461. for !sctList.Empty() {
  1462. var sct []byte
  1463. if !readUint16LengthPrefixed(&sctList, &sct) ||
  1464. len(sct) == 0 {
  1465. return false
  1466. }
  1467. certificate.SignedCertificateTimestamps = append(
  1468. certificate.SignedCertificateTimestamps, sct)
  1469. }
  1470. default:
  1471. // Ignore unknown extensions.
  1472. continue
  1473. }
  1474. if !extData.Empty() {
  1475. return false
  1476. }
  1477. }
  1478. }
  1479. return true
  1480. }
  1481. type serverKeyExchangeMsg struct {
  1482. key []byte
  1483. }
  1484. func (m *serverKeyExchangeMsg) marshal() ([]byte, error) {
  1485. length := len(m.key)
  1486. x := make([]byte, length+4)
  1487. x[0] = typeServerKeyExchange
  1488. x[1] = uint8(length >> 16)
  1489. x[2] = uint8(length >> 8)
  1490. x[3] = uint8(length)
  1491. copy(x[4:], m.key)
  1492. return x, nil
  1493. }
  1494. func (m *serverKeyExchangeMsg) unmarshal(data []byte) bool {
  1495. if len(data) < 4 {
  1496. return false
  1497. }
  1498. m.key = data[4:]
  1499. return true
  1500. }
  1501. type certificateStatusMsg struct {
  1502. response []byte
  1503. }
  1504. func (m *certificateStatusMsg) marshal() ([]byte, error) {
  1505. var b cryptobyte.Builder
  1506. b.AddUint8(typeCertificateStatus)
  1507. b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
  1508. b.AddUint8(statusTypeOCSP)
  1509. b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
  1510. b.AddBytes(m.response)
  1511. })
  1512. })
  1513. return b.Bytes()
  1514. }
  1515. func (m *certificateStatusMsg) unmarshal(data []byte) bool {
  1516. s := cryptobyte.String(data)
  1517. var statusType uint8
  1518. if !s.Skip(4) || // message type and uint24 length field
  1519. !s.ReadUint8(&statusType) || statusType != statusTypeOCSP ||
  1520. !readUint24LengthPrefixed(&s, &m.response) ||
  1521. len(m.response) == 0 || !s.Empty() {
  1522. return false
  1523. }
  1524. return true
  1525. }
  1526. type serverHelloDoneMsg struct{}
  1527. func (m *serverHelloDoneMsg) marshal() ([]byte, error) {
  1528. x := make([]byte, 4)
  1529. x[0] = typeServerHelloDone
  1530. return x, nil
  1531. }
  1532. func (m *serverHelloDoneMsg) unmarshal(data []byte) bool {
  1533. return len(data) == 4
  1534. }
  1535. type clientKeyExchangeMsg struct {
  1536. ciphertext []byte
  1537. }
  1538. func (m *clientKeyExchangeMsg) marshal() ([]byte, error) {
  1539. length := len(m.ciphertext)
  1540. x := make([]byte, length+4)
  1541. x[0] = typeClientKeyExchange
  1542. x[1] = uint8(length >> 16)
  1543. x[2] = uint8(length >> 8)
  1544. x[3] = uint8(length)
  1545. copy(x[4:], m.ciphertext)
  1546. return x, nil
  1547. }
  1548. func (m *clientKeyExchangeMsg) unmarshal(data []byte) bool {
  1549. if len(data) < 4 {
  1550. return false
  1551. }
  1552. l := int(data[1])<<16 | int(data[2])<<8 | int(data[3])
  1553. if l != len(data)-4 {
  1554. return false
  1555. }
  1556. m.ciphertext = data[4:]
  1557. return true
  1558. }
  1559. type finishedMsg struct {
  1560. verifyData []byte
  1561. }
  1562. func (m *finishedMsg) marshal() ([]byte, error) {
  1563. var b cryptobyte.Builder
  1564. b.AddUint8(typeFinished)
  1565. b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
  1566. b.AddBytes(m.verifyData)
  1567. })
  1568. return b.Bytes()
  1569. }
  1570. func (m *finishedMsg) unmarshal(data []byte) bool {
  1571. s := cryptobyte.String(data)
  1572. return s.Skip(1) &&
  1573. readUint24LengthPrefixed(&s, &m.verifyData) &&
  1574. s.Empty()
  1575. }
  1576. type certificateRequestMsg struct {
  1577. // hasSignatureAlgorithm indicates whether this message includes a list of
  1578. // supported signature algorithms. This change was introduced with TLS 1.2.
  1579. hasSignatureAlgorithm bool
  1580. certificateTypes []byte
  1581. supportedSignatureAlgorithms []SignatureScheme
  1582. certificateAuthorities [][]byte
  1583. }
  1584. func (m *certificateRequestMsg) marshal() ([]byte, error) {
  1585. // See RFC 4346, Section 7.4.4.
  1586. length := 1 + len(m.certificateTypes) + 2
  1587. casLength := 0
  1588. for _, ca := range m.certificateAuthorities {
  1589. casLength += 2 + len(ca)
  1590. }
  1591. length += casLength
  1592. if m.hasSignatureAlgorithm {
  1593. length += 2 + 2*len(m.supportedSignatureAlgorithms)
  1594. }
  1595. x := make([]byte, 4+length)
  1596. x[0] = typeCertificateRequest
  1597. x[1] = uint8(length >> 16)
  1598. x[2] = uint8(length >> 8)
  1599. x[3] = uint8(length)
  1600. x[4] = uint8(len(m.certificateTypes))
  1601. copy(x[5:], m.certificateTypes)
  1602. y := x[5+len(m.certificateTypes):]
  1603. if m.hasSignatureAlgorithm {
  1604. n := len(m.supportedSignatureAlgorithms) * 2
  1605. y[0] = uint8(n >> 8)
  1606. y[1] = uint8(n)
  1607. y = y[2:]
  1608. for _, sigAlgo := range m.supportedSignatureAlgorithms {
  1609. y[0] = uint8(sigAlgo >> 8)
  1610. y[1] = uint8(sigAlgo)
  1611. y = y[2:]
  1612. }
  1613. }
  1614. y[0] = uint8(casLength >> 8)
  1615. y[1] = uint8(casLength)
  1616. y = y[2:]
  1617. for _, ca := range m.certificateAuthorities {
  1618. y[0] = uint8(len(ca) >> 8)
  1619. y[1] = uint8(len(ca))
  1620. y = y[2:]
  1621. copy(y, ca)
  1622. y = y[len(ca):]
  1623. }
  1624. return x, nil
  1625. }
  1626. func (m *certificateRequestMsg) unmarshal(data []byte) bool {
  1627. if len(data) < 5 {
  1628. return false
  1629. }
  1630. length := uint32(data[1])<<16 | uint32(data[2])<<8 | uint32(data[3])
  1631. if uint32(len(data))-4 != length {
  1632. return false
  1633. }
  1634. numCertTypes := int(data[4])
  1635. data = data[5:]
  1636. if numCertTypes == 0 || len(data) <= numCertTypes {
  1637. return false
  1638. }
  1639. m.certificateTypes = make([]byte, numCertTypes)
  1640. if copy(m.certificateTypes, data) != numCertTypes {
  1641. return false
  1642. }
  1643. data = data[numCertTypes:]
  1644. if m.hasSignatureAlgorithm {
  1645. if len(data) < 2 {
  1646. return false
  1647. }
  1648. sigAndHashLen := uint16(data[0])<<8 | uint16(data[1])
  1649. data = data[2:]
  1650. if sigAndHashLen&1 != 0 {
  1651. return false
  1652. }
  1653. if len(data) < int(sigAndHashLen) {
  1654. return false
  1655. }
  1656. numSigAlgos := sigAndHashLen / 2
  1657. m.supportedSignatureAlgorithms = make([]SignatureScheme, numSigAlgos)
  1658. for i := range m.supportedSignatureAlgorithms {
  1659. m.supportedSignatureAlgorithms[i] = SignatureScheme(data[0])<<8 | SignatureScheme(data[1])
  1660. data = data[2:]
  1661. }
  1662. }
  1663. if len(data) < 2 {
  1664. return false
  1665. }
  1666. casLength := uint16(data[0])<<8 | uint16(data[1])
  1667. data = data[2:]
  1668. if len(data) < int(casLength) {
  1669. return false
  1670. }
  1671. cas := make([]byte, casLength)
  1672. copy(cas, data)
  1673. data = data[casLength:]
  1674. m.certificateAuthorities = nil
  1675. for len(cas) > 0 {
  1676. if len(cas) < 2 {
  1677. return false
  1678. }
  1679. caLen := uint16(cas[0])<<8 | uint16(cas[1])
  1680. cas = cas[2:]
  1681. if len(cas) < int(caLen) {
  1682. return false
  1683. }
  1684. m.certificateAuthorities = append(m.certificateAuthorities, cas[:caLen])
  1685. cas = cas[caLen:]
  1686. }
  1687. return len(data) == 0
  1688. }
  1689. type certificateVerifyMsg struct {
  1690. hasSignatureAlgorithm bool // format change introduced in TLS 1.2
  1691. signatureAlgorithm SignatureScheme
  1692. signature []byte
  1693. }
  1694. func (m *certificateVerifyMsg) marshal() ([]byte, error) {
  1695. var b cryptobyte.Builder
  1696. b.AddUint8(typeCertificateVerify)
  1697. b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
  1698. if m.hasSignatureAlgorithm {
  1699. b.AddUint16(uint16(m.signatureAlgorithm))
  1700. }
  1701. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1702. b.AddBytes(m.signature)
  1703. })
  1704. })
  1705. return b.Bytes()
  1706. }
  1707. func (m *certificateVerifyMsg) unmarshal(data []byte) bool {
  1708. s := cryptobyte.String(data)
  1709. if !s.Skip(4) { // message type and uint24 length field
  1710. return false
  1711. }
  1712. if m.hasSignatureAlgorithm {
  1713. if !s.ReadUint16((*uint16)(&m.signatureAlgorithm)) {
  1714. return false
  1715. }
  1716. }
  1717. return readUint16LengthPrefixed(&s, &m.signature) && s.Empty()
  1718. }
  1719. type newSessionTicketMsg struct {
  1720. ticket []byte
  1721. }
  1722. func (m *newSessionTicketMsg) marshal() ([]byte, error) {
  1723. // See RFC 5077, Section 3.3.
  1724. ticketLen := len(m.ticket)
  1725. length := 2 + 4 + ticketLen
  1726. x := make([]byte, 4+length)
  1727. x[0] = typeNewSessionTicket
  1728. x[1] = uint8(length >> 16)
  1729. x[2] = uint8(length >> 8)
  1730. x[3] = uint8(length)
  1731. x[8] = uint8(ticketLen >> 8)
  1732. x[9] = uint8(ticketLen)
  1733. copy(x[10:], m.ticket)
  1734. return x, nil
  1735. }
  1736. func (m *newSessionTicketMsg) unmarshal(data []byte) bool {
  1737. if len(data) < 10 {
  1738. return false
  1739. }
  1740. length := uint32(data[1])<<16 | uint32(data[2])<<8 | uint32(data[3])
  1741. if uint32(len(data))-4 != length {
  1742. return false
  1743. }
  1744. ticketLen := int(data[8])<<8 + int(data[9])
  1745. if len(data)-10 != ticketLen {
  1746. return false
  1747. }
  1748. m.ticket = data[10:]
  1749. return true
  1750. }
  1751. type helloRequestMsg struct {
  1752. }
  1753. func (*helloRequestMsg) marshal() ([]byte, error) {
  1754. return []byte{typeHelloRequest, 0, 0, 0}, nil
  1755. }
  1756. func (*helloRequestMsg) unmarshal(data []byte) bool {
  1757. return len(data) == 4
  1758. }
  1759. type transcriptHash interface {
  1760. Write([]byte) (int, error)
  1761. }
  1762. // transcriptMsg is a helper used to hash messages which are not hashed when
  1763. // they are read from, or written to, the wire. This is typically the case for
  1764. // messages which are either not sent, or need to be hashed out of order from
  1765. // when they are read/written.
  1766. //
  1767. // For most messages, the message is marshalled using their marshal method,
  1768. // since their wire representation is idempotent. For clientHelloMsg and
  1769. // serverHelloMsg, we store the original wire representation of the message and
  1770. // use that for hashing, since unmarshal/marshal are not idempotent due to
  1771. // extension ordering and other malleable fields, which may cause differences
  1772. // between what was received and what we marshal.
  1773. func transcriptMsg(msg handshakeMessage, h transcriptHash) error {
  1774. if msgWithOrig, ok := msg.(handshakeMessageWithOriginalBytes); ok {
  1775. if orig := msgWithOrig.originalBytes(); orig != nil {
  1776. h.Write(msgWithOrig.originalBytes())
  1777. return nil
  1778. }
  1779. }
  1780. data, err := msg.marshal()
  1781. if err != nil {
  1782. return err
  1783. }
  1784. h.Write(data)
  1785. return nil
  1786. }