handshake_messages.go 58 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287
  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. "strings"
  9. "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/prng"
  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. raw []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. // [Psiphon]
  88. PRNG *prng.PRNG
  89. }
  90. func (m *clientHelloMsg) marshal() ([]byte, error) {
  91. if m.raw != nil {
  92. return m.raw, nil
  93. }
  94. // [Psiphon]
  95. // Randomize the Client Hello.
  96. if m.PRNG != nil {
  97. return m.marshalRandomized(), nil
  98. }
  99. var exts cryptobyte.Builder
  100. if len(m.serverName) > 0 {
  101. // RFC 6066, Section 3
  102. exts.AddUint16(extensionServerName)
  103. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  104. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  105. exts.AddUint8(0) // name_type = host_name
  106. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  107. exts.AddBytes([]byte(m.serverName))
  108. })
  109. })
  110. })
  111. }
  112. if m.ocspStapling {
  113. // RFC 4366, Section 3.6
  114. exts.AddUint16(extensionStatusRequest)
  115. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  116. exts.AddUint8(1) // status_type = ocsp
  117. exts.AddUint16(0) // empty responder_id_list
  118. exts.AddUint16(0) // empty request_extensions
  119. })
  120. }
  121. if len(m.supportedCurves) > 0 {
  122. // RFC 4492, sections 5.1.1 and RFC 8446, Section 4.2.7
  123. exts.AddUint16(extensionSupportedCurves)
  124. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  125. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  126. for _, curve := range m.supportedCurves {
  127. exts.AddUint16(uint16(curve))
  128. }
  129. })
  130. })
  131. }
  132. if len(m.supportedPoints) > 0 {
  133. // RFC 4492, Section 5.1.2
  134. exts.AddUint16(extensionSupportedPoints)
  135. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  136. exts.AddUint8LengthPrefixed(func(exts *cryptobyte.Builder) {
  137. exts.AddBytes(m.supportedPoints)
  138. })
  139. })
  140. }
  141. if m.ticketSupported {
  142. // RFC 5077, Section 3.2
  143. exts.AddUint16(extensionSessionTicket)
  144. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  145. exts.AddBytes(m.sessionTicket)
  146. })
  147. }
  148. if len(m.supportedSignatureAlgorithms) > 0 {
  149. // RFC 5246, Section 7.4.1.4.1
  150. exts.AddUint16(extensionSignatureAlgorithms)
  151. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  152. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  153. for _, sigAlgo := range m.supportedSignatureAlgorithms {
  154. exts.AddUint16(uint16(sigAlgo))
  155. }
  156. })
  157. })
  158. }
  159. if len(m.supportedSignatureAlgorithmsCert) > 0 {
  160. // RFC 8446, Section 4.2.3
  161. exts.AddUint16(extensionSignatureAlgorithmsCert)
  162. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  163. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  164. for _, sigAlgo := range m.supportedSignatureAlgorithmsCert {
  165. exts.AddUint16(uint16(sigAlgo))
  166. }
  167. })
  168. })
  169. }
  170. if m.secureRenegotiationSupported {
  171. // RFC 5746, Section 3.2
  172. exts.AddUint16(extensionRenegotiationInfo)
  173. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  174. exts.AddUint8LengthPrefixed(func(exts *cryptobyte.Builder) {
  175. exts.AddBytes(m.secureRenegotiation)
  176. })
  177. })
  178. }
  179. if m.extendedMasterSecret {
  180. // RFC 7627
  181. exts.AddUint16(extensionExtendedMasterSecret)
  182. exts.AddUint16(0) // empty extension_data
  183. }
  184. if len(m.alpnProtocols) > 0 {
  185. // RFC 7301, Section 3.1
  186. exts.AddUint16(extensionALPN)
  187. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  188. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  189. for _, proto := range m.alpnProtocols {
  190. exts.AddUint8LengthPrefixed(func(exts *cryptobyte.Builder) {
  191. exts.AddBytes([]byte(proto))
  192. })
  193. }
  194. })
  195. })
  196. }
  197. if m.scts {
  198. // RFC 6962, Section 3.3.1
  199. exts.AddUint16(extensionSCT)
  200. exts.AddUint16(0) // empty extension_data
  201. }
  202. if len(m.supportedVersions) > 0 {
  203. // RFC 8446, Section 4.2.1
  204. exts.AddUint16(extensionSupportedVersions)
  205. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  206. exts.AddUint8LengthPrefixed(func(exts *cryptobyte.Builder) {
  207. for _, vers := range m.supportedVersions {
  208. exts.AddUint16(vers)
  209. }
  210. })
  211. })
  212. }
  213. if len(m.cookie) > 0 {
  214. // RFC 8446, Section 4.2.2
  215. exts.AddUint16(extensionCookie)
  216. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  217. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  218. exts.AddBytes(m.cookie)
  219. })
  220. })
  221. }
  222. if len(m.keyShares) > 0 {
  223. // RFC 8446, Section 4.2.8
  224. exts.AddUint16(extensionKeyShare)
  225. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  226. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  227. for _, ks := range m.keyShares {
  228. exts.AddUint16(uint16(ks.group))
  229. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  230. exts.AddBytes(ks.data)
  231. })
  232. }
  233. })
  234. })
  235. }
  236. if m.earlyData {
  237. // RFC 8446, Section 4.2.10
  238. exts.AddUint16(extensionEarlyData)
  239. exts.AddUint16(0) // empty extension_data
  240. }
  241. if len(m.pskModes) > 0 {
  242. // RFC 8446, Section 4.2.9
  243. exts.AddUint16(extensionPSKModes)
  244. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  245. exts.AddUint8LengthPrefixed(func(exts *cryptobyte.Builder) {
  246. exts.AddBytes(m.pskModes)
  247. })
  248. })
  249. }
  250. if m.quicTransportParameters != nil { // marshal zero-length parameters when present
  251. // RFC 9001, Section 8.2
  252. exts.AddUint16(extensionQUICTransportParameters)
  253. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  254. exts.AddBytes(m.quicTransportParameters)
  255. })
  256. }
  257. if len(m.pskIdentities) > 0 { // pre_shared_key must be the last extension
  258. // RFC 8446, Section 4.2.11
  259. exts.AddUint16(extensionPreSharedKey)
  260. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  261. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  262. for _, psk := range m.pskIdentities {
  263. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  264. exts.AddBytes(psk.label)
  265. })
  266. exts.AddUint32(psk.obfuscatedTicketAge)
  267. }
  268. })
  269. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  270. for _, binder := range m.pskBinders {
  271. exts.AddUint8LengthPrefixed(func(exts *cryptobyte.Builder) {
  272. exts.AddBytes(binder)
  273. })
  274. }
  275. })
  276. })
  277. }
  278. extBytes, err := exts.Bytes()
  279. if err != nil {
  280. return nil, err
  281. }
  282. var b cryptobyte.Builder
  283. b.AddUint8(typeClientHello)
  284. b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
  285. b.AddUint16(m.vers)
  286. addBytesWithLength(b, m.random, 32)
  287. b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
  288. b.AddBytes(m.sessionId)
  289. })
  290. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  291. for _, suite := range m.cipherSuites {
  292. b.AddUint16(suite)
  293. }
  294. })
  295. b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
  296. b.AddBytes(m.compressionMethods)
  297. })
  298. if len(extBytes) > 0 {
  299. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  300. b.AddBytes(extBytes)
  301. })
  302. }
  303. })
  304. m.raw, err = b.Bytes()
  305. return m.raw, err
  306. }
  307. // [Psiphon]
  308. //
  309. // marshalRandomized is a randomized variant of marshal. The original Marshal
  310. // is retained as-is to ease future merging.
  311. //
  312. // The offered cipher suites and algorithms are shuffled and truncated. Longer
  313. // lists are selected with higher probability. Extensions are shuffled.
  314. //
  315. // The quic_transport_parameters extension is marshaled in quic-go and is
  316. // randomized in TransportParameters.Marshal.
  317. func (m *clientHelloMsg) marshalRandomized() []byte {
  318. if m.raw != nil {
  319. return m.raw
  320. }
  321. // Some inputs, such as m.supportedCurves, point to global variables. Copy
  322. // all slices before truncating.
  323. cipherSuites := make([]uint16, len(m.cipherSuites))
  324. for {
  325. perm := m.PRNG.Perm(len(m.cipherSuites))
  326. for i, j := range perm {
  327. cipherSuites[j] = m.cipherSuites[i]
  328. }
  329. cut := len(cipherSuites)
  330. for ; cut > 1; cut-- {
  331. if !m.PRNG.FlipCoin() {
  332. break
  333. }
  334. }
  335. // Must contain at least one of defaultCipherSuitesTLS13.
  336. containsDefault := false
  337. for _, suite := range cipherSuites[:cut] {
  338. for _, defaultSuite := range defaultCipherSuitesTLS13 {
  339. if suite == defaultSuite {
  340. containsDefault = true
  341. break
  342. }
  343. }
  344. if containsDefault {
  345. break
  346. }
  347. }
  348. if containsDefault {
  349. cipherSuites = cipherSuites[:cut]
  350. break
  351. }
  352. }
  353. compressionMethods := make([]uint8, len(m.compressionMethods))
  354. perm := m.PRNG.Perm(len(m.compressionMethods))
  355. for i, j := range perm {
  356. compressionMethods[j] = m.compressionMethods[i]
  357. }
  358. cut := len(compressionMethods)
  359. for ; cut > 1; cut-- {
  360. if !m.PRNG.FlipCoin() {
  361. break
  362. }
  363. }
  364. compressionMethods = compressionMethods[:cut]
  365. supportedCurves := make([]CurveID, len(m.supportedCurves))
  366. perm = m.PRNG.Perm(len(m.supportedCurves))
  367. for i, j := range perm {
  368. supportedCurves[j] = m.supportedCurves[i]
  369. }
  370. cut = len(supportedCurves)
  371. for ; cut > 1; cut-- {
  372. if !m.PRNG.FlipCoin() {
  373. break
  374. }
  375. }
  376. supportedCurves = supportedCurves[:cut]
  377. supportedPoints := make([]uint8, len(m.supportedPoints))
  378. perm = m.PRNG.Perm(len(m.supportedPoints))
  379. for i, j := range perm {
  380. supportedPoints[j] = m.supportedPoints[i]
  381. }
  382. cut = len(supportedPoints)
  383. for ; cut > 1; cut-- {
  384. if !m.PRNG.FlipCoin() {
  385. break
  386. }
  387. }
  388. supportedPoints = supportedPoints[:cut]
  389. var b cryptobyte.Builder
  390. b.AddUint8(typeClientHello)
  391. b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
  392. b.AddUint16(m.vers)
  393. addBytesWithLength(b, m.random, 32)
  394. b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
  395. b.AddBytes(m.sessionId)
  396. })
  397. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  398. for _, suite := range cipherSuites {
  399. b.AddUint16(suite)
  400. }
  401. })
  402. b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
  403. b.AddBytes(compressionMethods)
  404. })
  405. // If extensions aren't present, omit them.
  406. var extensionsPresent bool
  407. bWithoutExtensions := *b
  408. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  409. extensionMarshallers := []func(){
  410. func() {
  411. if len(m.serverName) > 0 {
  412. // RFC 6066, Section 3
  413. b.AddUint16(extensionServerName)
  414. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  415. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  416. b.AddUint8(0) // name_type = host_name
  417. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  418. b.AddBytes([]byte(m.serverName))
  419. })
  420. })
  421. })
  422. }
  423. },
  424. func() {
  425. if m.ocspStapling {
  426. // RFC 4366, Section 3.6
  427. b.AddUint16(extensionStatusRequest)
  428. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  429. b.AddUint8(1) // status_type = ocsp
  430. b.AddUint16(0) // empty responder_id_list
  431. b.AddUint16(0) // empty request_extensions
  432. })
  433. }
  434. },
  435. func() {
  436. if len(supportedCurves) > 0 {
  437. // RFC 4492, sections 5.1.1 and RFC 8446, Section 4.2.7
  438. b.AddUint16(extensionSupportedCurves)
  439. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  440. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  441. for _, curve := range supportedCurves {
  442. b.AddUint16(uint16(curve))
  443. }
  444. })
  445. })
  446. }
  447. },
  448. func() {
  449. if len(supportedPoints) > 0 {
  450. // RFC 4492, Section 5.1.2
  451. b.AddUint16(extensionSupportedPoints)
  452. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  453. b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
  454. b.AddBytes(supportedPoints)
  455. })
  456. })
  457. }
  458. },
  459. func() {
  460. if m.ticketSupported {
  461. // RFC 5077, Section 3.2
  462. b.AddUint16(extensionSessionTicket)
  463. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  464. b.AddBytes(m.sessionTicket)
  465. })
  466. }
  467. },
  468. func() {
  469. if len(m.supportedSignatureAlgorithms) > 0 {
  470. // RFC 5246, Section 7.4.1.4.1
  471. b.AddUint16(extensionSignatureAlgorithms)
  472. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  473. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  474. for _, sigAlgo := range m.supportedSignatureAlgorithms {
  475. b.AddUint16(uint16(sigAlgo))
  476. }
  477. })
  478. })
  479. }
  480. },
  481. func() {
  482. if len(m.supportedSignatureAlgorithmsCert) > 0 {
  483. // RFC 8446, Section 4.2.3
  484. b.AddUint16(extensionSignatureAlgorithmsCert)
  485. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  486. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  487. for _, sigAlgo := range m.supportedSignatureAlgorithmsCert {
  488. b.AddUint16(uint16(sigAlgo))
  489. }
  490. })
  491. })
  492. }
  493. },
  494. func() {
  495. if m.secureRenegotiationSupported {
  496. // RFC 5746, Section 3.2
  497. b.AddUint16(extensionRenegotiationInfo)
  498. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  499. b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
  500. b.AddBytes(m.secureRenegotiation)
  501. })
  502. })
  503. }
  504. },
  505. func() {
  506. if m.extendedMasterSecret {
  507. // RFC 7672
  508. b.AddUint16(extensionExtendedMasterSecret)
  509. b.AddUint16(0) // empty extension_data
  510. }
  511. },
  512. func() {
  513. if len(m.alpnProtocols) > 0 {
  514. // RFC 7301, Section 3.1
  515. b.AddUint16(extensionALPN)
  516. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  517. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  518. for _, proto := range m.alpnProtocols {
  519. b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
  520. b.AddBytes([]byte(proto))
  521. })
  522. }
  523. })
  524. })
  525. }
  526. },
  527. func() {
  528. if m.scts {
  529. // RFC 6962, Section 3.3.1
  530. b.AddUint16(extensionSCT)
  531. b.AddUint16(0) // empty extension_data
  532. }
  533. },
  534. func() {
  535. if len(m.supportedVersions) > 0 {
  536. // RFC 8446, Section 4.2.1
  537. b.AddUint16(extensionSupportedVersions)
  538. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  539. b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
  540. for _, vers := range m.supportedVersions {
  541. b.AddUint16(vers)
  542. }
  543. })
  544. })
  545. }
  546. },
  547. func() {
  548. if len(m.cookie) > 0 {
  549. // RFC 8446, Section 4.2.2
  550. b.AddUint16(extensionCookie)
  551. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  552. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  553. b.AddBytes(m.cookie)
  554. })
  555. })
  556. }
  557. },
  558. func() {
  559. if len(m.keyShares) > 0 {
  560. // RFC 8446, Section 4.2.8
  561. b.AddUint16(extensionKeyShare)
  562. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  563. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  564. for _, ks := range m.keyShares {
  565. b.AddUint16(uint16(ks.group))
  566. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  567. b.AddBytes(ks.data)
  568. })
  569. }
  570. })
  571. })
  572. }
  573. },
  574. func() {
  575. if m.earlyData {
  576. // RFC 8446, Section 4.2.10
  577. b.AddUint16(extensionEarlyData)
  578. b.AddUint16(0) // empty extension_data
  579. }
  580. },
  581. func() {
  582. if len(m.pskModes) > 0 {
  583. // RFC 8446, Section 4.2.9
  584. b.AddUint16(extensionPSKModes)
  585. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  586. b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
  587. b.AddBytes(m.pskModes)
  588. })
  589. })
  590. }
  591. },
  592. func() {
  593. if m.quicTransportParameters != nil { // marshal zero-length parameters when present
  594. // RFC 9001, Section 8.2
  595. b.AddUint16(extensionQUICTransportParameters)
  596. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  597. b.AddBytes(m.quicTransportParameters)
  598. })
  599. }
  600. },
  601. }
  602. perm = m.PRNG.Perm(len(extensionMarshallers))
  603. for _, j := range perm {
  604. extensionMarshallers[j]()
  605. }
  606. if len(m.pskIdentities) > 0 { // pre_shared_key must be the last extension
  607. // RFC 8446, Section 4.2.11
  608. b.AddUint16(extensionPreSharedKey)
  609. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  610. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  611. for _, psk := range m.pskIdentities {
  612. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  613. b.AddBytes(psk.label)
  614. })
  615. b.AddUint32(psk.obfuscatedTicketAge)
  616. }
  617. })
  618. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  619. for _, binder := range m.pskBinders {
  620. b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
  621. b.AddBytes(binder)
  622. })
  623. }
  624. })
  625. })
  626. }
  627. extensionsPresent = len(b.BytesOrPanic()) > 2
  628. })
  629. if !extensionsPresent {
  630. *b = bWithoutExtensions
  631. }
  632. })
  633. m.raw = b.BytesOrPanic()
  634. return m.raw
  635. }
  636. // marshalWithoutBinders returns the ClientHello through the
  637. // PreSharedKeyExtension.identities field, according to RFC 8446, Section
  638. // 4.2.11.2. Note that m.pskBinders must be set to slices of the correct length.
  639. func (m *clientHelloMsg) marshalWithoutBinders() ([]byte, error) {
  640. bindersLen := 2 // uint16 length prefix
  641. for _, binder := range m.pskBinders {
  642. bindersLen += 1 // uint8 length prefix
  643. bindersLen += len(binder)
  644. }
  645. fullMessage, err := m.marshal()
  646. if err != nil {
  647. return nil, err
  648. }
  649. return fullMessage[:len(fullMessage)-bindersLen], nil
  650. }
  651. // updateBinders updates the m.pskBinders field, if necessary updating the
  652. // cached marshaled representation. The supplied binders must have the same
  653. // length as the current m.pskBinders.
  654. func (m *clientHelloMsg) updateBinders(pskBinders [][]byte) error {
  655. if len(pskBinders) != len(m.pskBinders) {
  656. return errors.New("tls: internal error: pskBinders length mismatch")
  657. }
  658. for i := range m.pskBinders {
  659. if len(pskBinders[i]) != len(m.pskBinders[i]) {
  660. return errors.New("tls: internal error: pskBinders length mismatch")
  661. }
  662. }
  663. m.pskBinders = pskBinders
  664. if m.raw != nil {
  665. helloBytes, err := m.marshalWithoutBinders()
  666. if err != nil {
  667. return err
  668. }
  669. lenWithoutBinders := len(helloBytes)
  670. b := cryptobyte.NewFixedBuilder(m.raw[:lenWithoutBinders])
  671. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  672. for _, binder := range m.pskBinders {
  673. b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
  674. b.AddBytes(binder)
  675. })
  676. }
  677. })
  678. if out, err := b.Bytes(); err != nil || len(out) != len(m.raw) {
  679. return errors.New("tls: internal error: failed to update binders")
  680. }
  681. }
  682. return nil
  683. }
  684. func (m *clientHelloMsg) unmarshal(data []byte) bool {
  685. *m = clientHelloMsg{raw: data}
  686. s := cryptobyte.String(data)
  687. if !s.Skip(4) || // message type and uint24 length field
  688. !s.ReadUint16(&m.vers) || !s.ReadBytes(&m.random, 32) ||
  689. !readUint8LengthPrefixed(&s, &m.sessionId) {
  690. return false
  691. }
  692. var cipherSuites cryptobyte.String
  693. if !s.ReadUint16LengthPrefixed(&cipherSuites) {
  694. return false
  695. }
  696. m.cipherSuites = []uint16{}
  697. m.secureRenegotiationSupported = false
  698. for !cipherSuites.Empty() {
  699. var suite uint16
  700. if !cipherSuites.ReadUint16(&suite) {
  701. return false
  702. }
  703. if suite == scsvRenegotiation {
  704. m.secureRenegotiationSupported = true
  705. }
  706. m.cipherSuites = append(m.cipherSuites, suite)
  707. }
  708. if !readUint8LengthPrefixed(&s, &m.compressionMethods) {
  709. return false
  710. }
  711. if s.Empty() {
  712. // ClientHello is optionally followed by extension data
  713. return true
  714. }
  715. var extensions cryptobyte.String
  716. if !s.ReadUint16LengthPrefixed(&extensions) || !s.Empty() {
  717. return false
  718. }
  719. seenExts := make(map[uint16]bool)
  720. for !extensions.Empty() {
  721. var extension uint16
  722. var extData cryptobyte.String
  723. if !extensions.ReadUint16(&extension) ||
  724. !extensions.ReadUint16LengthPrefixed(&extData) {
  725. return false
  726. }
  727. if seenExts[extension] {
  728. return false
  729. }
  730. seenExts[extension] = true
  731. switch extension {
  732. case extensionServerName:
  733. // RFC 6066, Section 3
  734. var nameList cryptobyte.String
  735. if !extData.ReadUint16LengthPrefixed(&nameList) || nameList.Empty() {
  736. return false
  737. }
  738. for !nameList.Empty() {
  739. var nameType uint8
  740. var serverName cryptobyte.String
  741. if !nameList.ReadUint8(&nameType) ||
  742. !nameList.ReadUint16LengthPrefixed(&serverName) ||
  743. serverName.Empty() {
  744. return false
  745. }
  746. if nameType != 0 {
  747. continue
  748. }
  749. if len(m.serverName) != 0 {
  750. // Multiple names of the same name_type are prohibited.
  751. return false
  752. }
  753. m.serverName = string(serverName)
  754. // An SNI value may not include a trailing dot.
  755. if strings.HasSuffix(m.serverName, ".") {
  756. return false
  757. }
  758. }
  759. case extensionStatusRequest:
  760. // RFC 4366, Section 3.6
  761. var statusType uint8
  762. var ignored cryptobyte.String
  763. if !extData.ReadUint8(&statusType) ||
  764. !extData.ReadUint16LengthPrefixed(&ignored) ||
  765. !extData.ReadUint16LengthPrefixed(&ignored) {
  766. return false
  767. }
  768. m.ocspStapling = statusType == statusTypeOCSP
  769. case extensionSupportedCurves:
  770. // RFC 4492, sections 5.1.1 and RFC 8446, Section 4.2.7
  771. var curves cryptobyte.String
  772. if !extData.ReadUint16LengthPrefixed(&curves) || curves.Empty() {
  773. return false
  774. }
  775. for !curves.Empty() {
  776. var curve uint16
  777. if !curves.ReadUint16(&curve) {
  778. return false
  779. }
  780. m.supportedCurves = append(m.supportedCurves, CurveID(curve))
  781. }
  782. case extensionSupportedPoints:
  783. // RFC 4492, Section 5.1.2
  784. if !readUint8LengthPrefixed(&extData, &m.supportedPoints) ||
  785. len(m.supportedPoints) == 0 {
  786. return false
  787. }
  788. case extensionSessionTicket:
  789. // RFC 5077, Section 3.2
  790. m.ticketSupported = true
  791. extData.ReadBytes(&m.sessionTicket, len(extData))
  792. case extensionSignatureAlgorithms:
  793. // RFC 5246, Section 7.4.1.4.1
  794. var sigAndAlgs cryptobyte.String
  795. if !extData.ReadUint16LengthPrefixed(&sigAndAlgs) || sigAndAlgs.Empty() {
  796. return false
  797. }
  798. for !sigAndAlgs.Empty() {
  799. var sigAndAlg uint16
  800. if !sigAndAlgs.ReadUint16(&sigAndAlg) {
  801. return false
  802. }
  803. m.supportedSignatureAlgorithms = append(
  804. m.supportedSignatureAlgorithms, SignatureScheme(sigAndAlg))
  805. }
  806. case extensionSignatureAlgorithmsCert:
  807. // RFC 8446, Section 4.2.3
  808. var sigAndAlgs cryptobyte.String
  809. if !extData.ReadUint16LengthPrefixed(&sigAndAlgs) || sigAndAlgs.Empty() {
  810. return false
  811. }
  812. for !sigAndAlgs.Empty() {
  813. var sigAndAlg uint16
  814. if !sigAndAlgs.ReadUint16(&sigAndAlg) {
  815. return false
  816. }
  817. m.supportedSignatureAlgorithmsCert = append(
  818. m.supportedSignatureAlgorithmsCert, SignatureScheme(sigAndAlg))
  819. }
  820. case extensionRenegotiationInfo:
  821. // RFC 5746, Section 3.2
  822. if !readUint8LengthPrefixed(&extData, &m.secureRenegotiation) {
  823. return false
  824. }
  825. m.secureRenegotiationSupported = true
  826. case extensionExtendedMasterSecret:
  827. // RFC 7627
  828. m.extendedMasterSecret = true
  829. case extensionALPN:
  830. // RFC 7301, Section 3.1
  831. var protoList cryptobyte.String
  832. if !extData.ReadUint16LengthPrefixed(&protoList) || protoList.Empty() {
  833. return false
  834. }
  835. for !protoList.Empty() {
  836. var proto cryptobyte.String
  837. if !protoList.ReadUint8LengthPrefixed(&proto) || proto.Empty() {
  838. return false
  839. }
  840. m.alpnProtocols = append(m.alpnProtocols, string(proto))
  841. }
  842. case extensionSCT:
  843. // RFC 6962, Section 3.3.1
  844. m.scts = true
  845. case extensionSupportedVersions:
  846. // RFC 8446, Section 4.2.1
  847. var versList cryptobyte.String
  848. if !extData.ReadUint8LengthPrefixed(&versList) || versList.Empty() {
  849. return false
  850. }
  851. for !versList.Empty() {
  852. var vers uint16
  853. if !versList.ReadUint16(&vers) {
  854. return false
  855. }
  856. m.supportedVersions = append(m.supportedVersions, vers)
  857. }
  858. case extensionCookie:
  859. // RFC 8446, Section 4.2.2
  860. if !readUint16LengthPrefixed(&extData, &m.cookie) ||
  861. len(m.cookie) == 0 {
  862. return false
  863. }
  864. case extensionKeyShare:
  865. // RFC 8446, Section 4.2.8
  866. var clientShares cryptobyte.String
  867. if !extData.ReadUint16LengthPrefixed(&clientShares) {
  868. return false
  869. }
  870. for !clientShares.Empty() {
  871. var ks keyShare
  872. if !clientShares.ReadUint16((*uint16)(&ks.group)) ||
  873. !readUint16LengthPrefixed(&clientShares, &ks.data) ||
  874. len(ks.data) == 0 {
  875. return false
  876. }
  877. m.keyShares = append(m.keyShares, ks)
  878. }
  879. case extensionEarlyData:
  880. // RFC 8446, Section 4.2.10
  881. m.earlyData = true
  882. case extensionPSKModes:
  883. // RFC 8446, Section 4.2.9
  884. if !readUint8LengthPrefixed(&extData, &m.pskModes) {
  885. return false
  886. }
  887. case extensionQUICTransportParameters:
  888. m.quicTransportParameters = make([]byte, len(extData))
  889. if !extData.CopyBytes(m.quicTransportParameters) {
  890. return false
  891. }
  892. case extensionPreSharedKey:
  893. // RFC 8446, Section 4.2.11
  894. if !extensions.Empty() {
  895. return false // pre_shared_key must be the last extension
  896. }
  897. var identities cryptobyte.String
  898. if !extData.ReadUint16LengthPrefixed(&identities) || identities.Empty() {
  899. return false
  900. }
  901. for !identities.Empty() {
  902. var psk pskIdentity
  903. if !readUint16LengthPrefixed(&identities, &psk.label) ||
  904. !identities.ReadUint32(&psk.obfuscatedTicketAge) ||
  905. len(psk.label) == 0 {
  906. return false
  907. }
  908. m.pskIdentities = append(m.pskIdentities, psk)
  909. }
  910. var binders cryptobyte.String
  911. if !extData.ReadUint16LengthPrefixed(&binders) || binders.Empty() {
  912. return false
  913. }
  914. for !binders.Empty() {
  915. var binder []byte
  916. if !readUint8LengthPrefixed(&binders, &binder) ||
  917. len(binder) == 0 {
  918. return false
  919. }
  920. m.pskBinders = append(m.pskBinders, binder)
  921. }
  922. default:
  923. // Ignore unknown extensions.
  924. continue
  925. }
  926. if !extData.Empty() {
  927. return false
  928. }
  929. }
  930. return true
  931. }
  932. type serverHelloMsg struct {
  933. raw []byte
  934. vers uint16
  935. random []byte
  936. sessionId []byte
  937. cipherSuite uint16
  938. compressionMethod uint8
  939. ocspStapling bool
  940. ticketSupported bool
  941. secureRenegotiationSupported bool
  942. secureRenegotiation []byte
  943. extendedMasterSecret bool
  944. alpnProtocol string
  945. scts [][]byte
  946. supportedVersion uint16
  947. serverShare keyShare
  948. selectedIdentityPresent bool
  949. selectedIdentity uint16
  950. supportedPoints []uint8
  951. // HelloRetryRequest extensions
  952. cookie []byte
  953. selectedGroup CurveID
  954. }
  955. func (m *serverHelloMsg) marshal() ([]byte, error) {
  956. if m.raw != nil {
  957. return m.raw, nil
  958. }
  959. var exts cryptobyte.Builder
  960. if m.ocspStapling {
  961. exts.AddUint16(extensionStatusRequest)
  962. exts.AddUint16(0) // empty extension_data
  963. }
  964. if m.ticketSupported {
  965. exts.AddUint16(extensionSessionTicket)
  966. exts.AddUint16(0) // empty extension_data
  967. }
  968. if m.secureRenegotiationSupported {
  969. exts.AddUint16(extensionRenegotiationInfo)
  970. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  971. exts.AddUint8LengthPrefixed(func(exts *cryptobyte.Builder) {
  972. exts.AddBytes(m.secureRenegotiation)
  973. })
  974. })
  975. }
  976. if m.extendedMasterSecret {
  977. exts.AddUint16(extensionExtendedMasterSecret)
  978. exts.AddUint16(0) // empty extension_data
  979. }
  980. if len(m.alpnProtocol) > 0 {
  981. exts.AddUint16(extensionALPN)
  982. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  983. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  984. exts.AddUint8LengthPrefixed(func(exts *cryptobyte.Builder) {
  985. exts.AddBytes([]byte(m.alpnProtocol))
  986. })
  987. })
  988. })
  989. }
  990. if len(m.scts) > 0 {
  991. exts.AddUint16(extensionSCT)
  992. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  993. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  994. for _, sct := range m.scts {
  995. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  996. exts.AddBytes(sct)
  997. })
  998. }
  999. })
  1000. })
  1001. }
  1002. if m.supportedVersion != 0 {
  1003. exts.AddUint16(extensionSupportedVersions)
  1004. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  1005. exts.AddUint16(m.supportedVersion)
  1006. })
  1007. }
  1008. if m.serverShare.group != 0 {
  1009. exts.AddUint16(extensionKeyShare)
  1010. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  1011. exts.AddUint16(uint16(m.serverShare.group))
  1012. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  1013. exts.AddBytes(m.serverShare.data)
  1014. })
  1015. })
  1016. }
  1017. if m.selectedIdentityPresent {
  1018. exts.AddUint16(extensionPreSharedKey)
  1019. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  1020. exts.AddUint16(m.selectedIdentity)
  1021. })
  1022. }
  1023. if len(m.cookie) > 0 {
  1024. exts.AddUint16(extensionCookie)
  1025. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  1026. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  1027. exts.AddBytes(m.cookie)
  1028. })
  1029. })
  1030. }
  1031. if m.selectedGroup != 0 {
  1032. exts.AddUint16(extensionKeyShare)
  1033. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  1034. exts.AddUint16(uint16(m.selectedGroup))
  1035. })
  1036. }
  1037. if len(m.supportedPoints) > 0 {
  1038. exts.AddUint16(extensionSupportedPoints)
  1039. exts.AddUint16LengthPrefixed(func(exts *cryptobyte.Builder) {
  1040. exts.AddUint8LengthPrefixed(func(exts *cryptobyte.Builder) {
  1041. exts.AddBytes(m.supportedPoints)
  1042. })
  1043. })
  1044. }
  1045. extBytes, err := exts.Bytes()
  1046. if err != nil {
  1047. return nil, err
  1048. }
  1049. var b cryptobyte.Builder
  1050. b.AddUint8(typeServerHello)
  1051. b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
  1052. b.AddUint16(m.vers)
  1053. addBytesWithLength(b, m.random, 32)
  1054. b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
  1055. b.AddBytes(m.sessionId)
  1056. })
  1057. b.AddUint16(m.cipherSuite)
  1058. b.AddUint8(m.compressionMethod)
  1059. if len(extBytes) > 0 {
  1060. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1061. b.AddBytes(extBytes)
  1062. })
  1063. }
  1064. })
  1065. m.raw, err = b.Bytes()
  1066. return m.raw, err
  1067. }
  1068. func (m *serverHelloMsg) unmarshal(data []byte) bool {
  1069. *m = serverHelloMsg{raw: data}
  1070. s := cryptobyte.String(data)
  1071. if !s.Skip(4) || // message type and uint24 length field
  1072. !s.ReadUint16(&m.vers) || !s.ReadBytes(&m.random, 32) ||
  1073. !readUint8LengthPrefixed(&s, &m.sessionId) ||
  1074. !s.ReadUint16(&m.cipherSuite) ||
  1075. !s.ReadUint8(&m.compressionMethod) {
  1076. return false
  1077. }
  1078. if s.Empty() {
  1079. // ServerHello is optionally followed by extension data
  1080. return true
  1081. }
  1082. var extensions cryptobyte.String
  1083. if !s.ReadUint16LengthPrefixed(&extensions) || !s.Empty() {
  1084. return false
  1085. }
  1086. seenExts := make(map[uint16]bool)
  1087. for !extensions.Empty() {
  1088. var extension uint16
  1089. var extData cryptobyte.String
  1090. if !extensions.ReadUint16(&extension) ||
  1091. !extensions.ReadUint16LengthPrefixed(&extData) {
  1092. return false
  1093. }
  1094. if seenExts[extension] {
  1095. return false
  1096. }
  1097. seenExts[extension] = true
  1098. switch extension {
  1099. case extensionStatusRequest:
  1100. m.ocspStapling = true
  1101. case extensionSessionTicket:
  1102. m.ticketSupported = true
  1103. case extensionRenegotiationInfo:
  1104. if !readUint8LengthPrefixed(&extData, &m.secureRenegotiation) {
  1105. return false
  1106. }
  1107. m.secureRenegotiationSupported = true
  1108. case extensionExtendedMasterSecret:
  1109. m.extendedMasterSecret = true
  1110. case extensionALPN:
  1111. var protoList cryptobyte.String
  1112. if !extData.ReadUint16LengthPrefixed(&protoList) || protoList.Empty() {
  1113. return false
  1114. }
  1115. var proto cryptobyte.String
  1116. if !protoList.ReadUint8LengthPrefixed(&proto) ||
  1117. proto.Empty() || !protoList.Empty() {
  1118. return false
  1119. }
  1120. m.alpnProtocol = string(proto)
  1121. case extensionSCT:
  1122. var sctList cryptobyte.String
  1123. if !extData.ReadUint16LengthPrefixed(&sctList) || sctList.Empty() {
  1124. return false
  1125. }
  1126. for !sctList.Empty() {
  1127. var sct []byte
  1128. if !readUint16LengthPrefixed(&sctList, &sct) ||
  1129. len(sct) == 0 {
  1130. return false
  1131. }
  1132. m.scts = append(m.scts, sct)
  1133. }
  1134. case extensionSupportedVersions:
  1135. if !extData.ReadUint16(&m.supportedVersion) {
  1136. return false
  1137. }
  1138. case extensionCookie:
  1139. if !readUint16LengthPrefixed(&extData, &m.cookie) ||
  1140. len(m.cookie) == 0 {
  1141. return false
  1142. }
  1143. case extensionKeyShare:
  1144. // This extension has different formats in SH and HRR, accept either
  1145. // and let the handshake logic decide. See RFC 8446, Section 4.2.8.
  1146. if len(extData) == 2 {
  1147. if !extData.ReadUint16((*uint16)(&m.selectedGroup)) {
  1148. return false
  1149. }
  1150. } else {
  1151. if !extData.ReadUint16((*uint16)(&m.serverShare.group)) ||
  1152. !readUint16LengthPrefixed(&extData, &m.serverShare.data) {
  1153. return false
  1154. }
  1155. }
  1156. case extensionPreSharedKey:
  1157. m.selectedIdentityPresent = true
  1158. if !extData.ReadUint16(&m.selectedIdentity) {
  1159. return false
  1160. }
  1161. case extensionSupportedPoints:
  1162. // RFC 4492, Section 5.1.2
  1163. if !readUint8LengthPrefixed(&extData, &m.supportedPoints) ||
  1164. len(m.supportedPoints) == 0 {
  1165. return false
  1166. }
  1167. default:
  1168. // Ignore unknown extensions.
  1169. continue
  1170. }
  1171. if !extData.Empty() {
  1172. return false
  1173. }
  1174. }
  1175. return true
  1176. }
  1177. type encryptedExtensionsMsg struct {
  1178. raw []byte
  1179. alpnProtocol string
  1180. quicTransportParameters []byte
  1181. earlyData bool
  1182. }
  1183. func (m *encryptedExtensionsMsg) marshal() ([]byte, error) {
  1184. if m.raw != nil {
  1185. return m.raw, nil
  1186. }
  1187. var b cryptobyte.Builder
  1188. b.AddUint8(typeEncryptedExtensions)
  1189. b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
  1190. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1191. if len(m.alpnProtocol) > 0 {
  1192. b.AddUint16(extensionALPN)
  1193. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1194. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1195. b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
  1196. b.AddBytes([]byte(m.alpnProtocol))
  1197. })
  1198. })
  1199. })
  1200. }
  1201. if m.quicTransportParameters != nil { // marshal zero-length parameters when present
  1202. // draft-ietf-quic-tls-32, Section 8.2
  1203. b.AddUint16(extensionQUICTransportParameters)
  1204. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1205. b.AddBytes(m.quicTransportParameters)
  1206. })
  1207. }
  1208. if m.earlyData {
  1209. // RFC 8446, Section 4.2.10
  1210. b.AddUint16(extensionEarlyData)
  1211. b.AddUint16(0) // empty extension_data
  1212. }
  1213. })
  1214. })
  1215. var err error
  1216. m.raw, err = b.Bytes()
  1217. return m.raw, err
  1218. }
  1219. func (m *encryptedExtensionsMsg) unmarshal(data []byte) bool {
  1220. *m = encryptedExtensionsMsg{raw: data}
  1221. s := cryptobyte.String(data)
  1222. var extensions cryptobyte.String
  1223. if !s.Skip(4) || // message type and uint24 length field
  1224. !s.ReadUint16LengthPrefixed(&extensions) || !s.Empty() {
  1225. return false
  1226. }
  1227. for !extensions.Empty() {
  1228. var extension uint16
  1229. var extData cryptobyte.String
  1230. if !extensions.ReadUint16(&extension) ||
  1231. !extensions.ReadUint16LengthPrefixed(&extData) {
  1232. return false
  1233. }
  1234. switch extension {
  1235. case extensionALPN:
  1236. var protoList cryptobyte.String
  1237. if !extData.ReadUint16LengthPrefixed(&protoList) || protoList.Empty() {
  1238. return false
  1239. }
  1240. var proto cryptobyte.String
  1241. if !protoList.ReadUint8LengthPrefixed(&proto) ||
  1242. proto.Empty() || !protoList.Empty() {
  1243. return false
  1244. }
  1245. m.alpnProtocol = string(proto)
  1246. case extensionQUICTransportParameters:
  1247. m.quicTransportParameters = make([]byte, len(extData))
  1248. if !extData.CopyBytes(m.quicTransportParameters) {
  1249. return false
  1250. }
  1251. case extensionEarlyData:
  1252. // RFC 8446, Section 4.2.10
  1253. m.earlyData = true
  1254. default:
  1255. // Ignore unknown extensions.
  1256. continue
  1257. }
  1258. if !extData.Empty() {
  1259. return false
  1260. }
  1261. }
  1262. return true
  1263. }
  1264. type endOfEarlyDataMsg struct{}
  1265. func (m *endOfEarlyDataMsg) marshal() ([]byte, error) {
  1266. x := make([]byte, 4)
  1267. x[0] = typeEndOfEarlyData
  1268. return x, nil
  1269. }
  1270. func (m *endOfEarlyDataMsg) unmarshal(data []byte) bool {
  1271. return len(data) == 4
  1272. }
  1273. type keyUpdateMsg struct {
  1274. raw []byte
  1275. updateRequested bool
  1276. }
  1277. func (m *keyUpdateMsg) marshal() ([]byte, error) {
  1278. if m.raw != nil {
  1279. return m.raw, nil
  1280. }
  1281. var b cryptobyte.Builder
  1282. b.AddUint8(typeKeyUpdate)
  1283. b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
  1284. if m.updateRequested {
  1285. b.AddUint8(1)
  1286. } else {
  1287. b.AddUint8(0)
  1288. }
  1289. })
  1290. var err error
  1291. m.raw, err = b.Bytes()
  1292. return m.raw, err
  1293. }
  1294. func (m *keyUpdateMsg) unmarshal(data []byte) bool {
  1295. m.raw = data
  1296. s := cryptobyte.String(data)
  1297. var updateRequested uint8
  1298. if !s.Skip(4) || // message type and uint24 length field
  1299. !s.ReadUint8(&updateRequested) || !s.Empty() {
  1300. return false
  1301. }
  1302. switch updateRequested {
  1303. case 0:
  1304. m.updateRequested = false
  1305. case 1:
  1306. m.updateRequested = true
  1307. default:
  1308. return false
  1309. }
  1310. return true
  1311. }
  1312. type newSessionTicketMsgTLS13 struct {
  1313. raw []byte
  1314. lifetime uint32
  1315. ageAdd uint32
  1316. nonce []byte
  1317. label []byte
  1318. maxEarlyData uint32
  1319. }
  1320. func (m *newSessionTicketMsgTLS13) marshal() ([]byte, error) {
  1321. if m.raw != nil {
  1322. return m.raw, nil
  1323. }
  1324. var b cryptobyte.Builder
  1325. b.AddUint8(typeNewSessionTicket)
  1326. b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
  1327. b.AddUint32(m.lifetime)
  1328. b.AddUint32(m.ageAdd)
  1329. b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) {
  1330. b.AddBytes(m.nonce)
  1331. })
  1332. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1333. b.AddBytes(m.label)
  1334. })
  1335. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1336. if m.maxEarlyData > 0 {
  1337. b.AddUint16(extensionEarlyData)
  1338. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1339. b.AddUint32(m.maxEarlyData)
  1340. })
  1341. }
  1342. })
  1343. })
  1344. var err error
  1345. m.raw, err = b.Bytes()
  1346. return m.raw, err
  1347. }
  1348. func (m *newSessionTicketMsgTLS13) unmarshal(data []byte) bool {
  1349. *m = newSessionTicketMsgTLS13{raw: data}
  1350. s := cryptobyte.String(data)
  1351. var extensions cryptobyte.String
  1352. if !s.Skip(4) || // message type and uint24 length field
  1353. !s.ReadUint32(&m.lifetime) ||
  1354. !s.ReadUint32(&m.ageAdd) ||
  1355. !readUint8LengthPrefixed(&s, &m.nonce) ||
  1356. !readUint16LengthPrefixed(&s, &m.label) ||
  1357. !s.ReadUint16LengthPrefixed(&extensions) ||
  1358. !s.Empty() {
  1359. return false
  1360. }
  1361. for !extensions.Empty() {
  1362. var extension uint16
  1363. var extData cryptobyte.String
  1364. if !extensions.ReadUint16(&extension) ||
  1365. !extensions.ReadUint16LengthPrefixed(&extData) {
  1366. return false
  1367. }
  1368. switch extension {
  1369. case extensionEarlyData:
  1370. if !extData.ReadUint32(&m.maxEarlyData) {
  1371. return false
  1372. }
  1373. default:
  1374. // Ignore unknown extensions.
  1375. continue
  1376. }
  1377. if !extData.Empty() {
  1378. return false
  1379. }
  1380. }
  1381. return true
  1382. }
  1383. type certificateRequestMsgTLS13 struct {
  1384. raw []byte
  1385. ocspStapling bool
  1386. scts bool
  1387. supportedSignatureAlgorithms []SignatureScheme
  1388. supportedSignatureAlgorithmsCert []SignatureScheme
  1389. certificateAuthorities [][]byte
  1390. }
  1391. func (m *certificateRequestMsgTLS13) marshal() ([]byte, error) {
  1392. if m.raw != nil {
  1393. return m.raw, nil
  1394. }
  1395. var b cryptobyte.Builder
  1396. b.AddUint8(typeCertificateRequest)
  1397. b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
  1398. // certificate_request_context (SHALL be zero length unless used for
  1399. // post-handshake authentication)
  1400. b.AddUint8(0)
  1401. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1402. if m.ocspStapling {
  1403. b.AddUint16(extensionStatusRequest)
  1404. b.AddUint16(0) // empty extension_data
  1405. }
  1406. if m.scts {
  1407. // RFC 8446, Section 4.4.2.1 makes no mention of
  1408. // signed_certificate_timestamp in CertificateRequest, but
  1409. // "Extensions in the Certificate message from the client MUST
  1410. // correspond to extensions in the CertificateRequest message
  1411. // from the server." and it appears in the table in Section 4.2.
  1412. b.AddUint16(extensionSCT)
  1413. b.AddUint16(0) // empty extension_data
  1414. }
  1415. if len(m.supportedSignatureAlgorithms) > 0 {
  1416. b.AddUint16(extensionSignatureAlgorithms)
  1417. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1418. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1419. for _, sigAlgo := range m.supportedSignatureAlgorithms {
  1420. b.AddUint16(uint16(sigAlgo))
  1421. }
  1422. })
  1423. })
  1424. }
  1425. if len(m.supportedSignatureAlgorithmsCert) > 0 {
  1426. b.AddUint16(extensionSignatureAlgorithmsCert)
  1427. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1428. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1429. for _, sigAlgo := range m.supportedSignatureAlgorithmsCert {
  1430. b.AddUint16(uint16(sigAlgo))
  1431. }
  1432. })
  1433. })
  1434. }
  1435. if len(m.certificateAuthorities) > 0 {
  1436. b.AddUint16(extensionCertificateAuthorities)
  1437. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1438. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1439. for _, ca := range m.certificateAuthorities {
  1440. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1441. b.AddBytes(ca)
  1442. })
  1443. }
  1444. })
  1445. })
  1446. }
  1447. })
  1448. })
  1449. var err error
  1450. m.raw, err = b.Bytes()
  1451. return m.raw, err
  1452. }
  1453. func (m *certificateRequestMsgTLS13) unmarshal(data []byte) bool {
  1454. *m = certificateRequestMsgTLS13{raw: data}
  1455. s := cryptobyte.String(data)
  1456. var context, extensions cryptobyte.String
  1457. if !s.Skip(4) || // message type and uint24 length field
  1458. !s.ReadUint8LengthPrefixed(&context) || !context.Empty() ||
  1459. !s.ReadUint16LengthPrefixed(&extensions) ||
  1460. !s.Empty() {
  1461. return false
  1462. }
  1463. for !extensions.Empty() {
  1464. var extension uint16
  1465. var extData cryptobyte.String
  1466. if !extensions.ReadUint16(&extension) ||
  1467. !extensions.ReadUint16LengthPrefixed(&extData) {
  1468. return false
  1469. }
  1470. switch extension {
  1471. case extensionStatusRequest:
  1472. m.ocspStapling = true
  1473. case extensionSCT:
  1474. m.scts = true
  1475. case extensionSignatureAlgorithms:
  1476. var sigAndAlgs cryptobyte.String
  1477. if !extData.ReadUint16LengthPrefixed(&sigAndAlgs) || sigAndAlgs.Empty() {
  1478. return false
  1479. }
  1480. for !sigAndAlgs.Empty() {
  1481. var sigAndAlg uint16
  1482. if !sigAndAlgs.ReadUint16(&sigAndAlg) {
  1483. return false
  1484. }
  1485. m.supportedSignatureAlgorithms = append(
  1486. m.supportedSignatureAlgorithms, SignatureScheme(sigAndAlg))
  1487. }
  1488. case extensionSignatureAlgorithmsCert:
  1489. var sigAndAlgs cryptobyte.String
  1490. if !extData.ReadUint16LengthPrefixed(&sigAndAlgs) || sigAndAlgs.Empty() {
  1491. return false
  1492. }
  1493. for !sigAndAlgs.Empty() {
  1494. var sigAndAlg uint16
  1495. if !sigAndAlgs.ReadUint16(&sigAndAlg) {
  1496. return false
  1497. }
  1498. m.supportedSignatureAlgorithmsCert = append(
  1499. m.supportedSignatureAlgorithmsCert, SignatureScheme(sigAndAlg))
  1500. }
  1501. case extensionCertificateAuthorities:
  1502. var auths cryptobyte.String
  1503. if !extData.ReadUint16LengthPrefixed(&auths) || auths.Empty() {
  1504. return false
  1505. }
  1506. for !auths.Empty() {
  1507. var ca []byte
  1508. if !readUint16LengthPrefixed(&auths, &ca) || len(ca) == 0 {
  1509. return false
  1510. }
  1511. m.certificateAuthorities = append(m.certificateAuthorities, ca)
  1512. }
  1513. default:
  1514. // Ignore unknown extensions.
  1515. continue
  1516. }
  1517. if !extData.Empty() {
  1518. return false
  1519. }
  1520. }
  1521. return true
  1522. }
  1523. type certificateMsg struct {
  1524. raw []byte
  1525. certificates [][]byte
  1526. }
  1527. func (m *certificateMsg) marshal() ([]byte, error) {
  1528. if m.raw != nil {
  1529. return m.raw, nil
  1530. }
  1531. var i int
  1532. for _, slice := range m.certificates {
  1533. i += len(slice)
  1534. }
  1535. length := 3 + 3*len(m.certificates) + i
  1536. x := make([]byte, 4+length)
  1537. x[0] = typeCertificate
  1538. x[1] = uint8(length >> 16)
  1539. x[2] = uint8(length >> 8)
  1540. x[3] = uint8(length)
  1541. certificateOctets := length - 3
  1542. x[4] = uint8(certificateOctets >> 16)
  1543. x[5] = uint8(certificateOctets >> 8)
  1544. x[6] = uint8(certificateOctets)
  1545. y := x[7:]
  1546. for _, slice := range m.certificates {
  1547. y[0] = uint8(len(slice) >> 16)
  1548. y[1] = uint8(len(slice) >> 8)
  1549. y[2] = uint8(len(slice))
  1550. copy(y[3:], slice)
  1551. y = y[3+len(slice):]
  1552. }
  1553. m.raw = x
  1554. return m.raw, nil
  1555. }
  1556. func (m *certificateMsg) unmarshal(data []byte) bool {
  1557. if len(data) < 7 {
  1558. return false
  1559. }
  1560. m.raw = data
  1561. certsLen := uint32(data[4])<<16 | uint32(data[5])<<8 | uint32(data[6])
  1562. if uint32(len(data)) != certsLen+7 {
  1563. return false
  1564. }
  1565. numCerts := 0
  1566. d := data[7:]
  1567. for certsLen > 0 {
  1568. if len(d) < 4 {
  1569. return false
  1570. }
  1571. certLen := uint32(d[0])<<16 | uint32(d[1])<<8 | uint32(d[2])
  1572. if uint32(len(d)) < 3+certLen {
  1573. return false
  1574. }
  1575. d = d[3+certLen:]
  1576. certsLen -= 3 + certLen
  1577. numCerts++
  1578. }
  1579. m.certificates = make([][]byte, numCerts)
  1580. d = data[7:]
  1581. for i := 0; i < numCerts; i++ {
  1582. certLen := uint32(d[0])<<16 | uint32(d[1])<<8 | uint32(d[2])
  1583. m.certificates[i] = d[3 : 3+certLen]
  1584. d = d[3+certLen:]
  1585. }
  1586. return true
  1587. }
  1588. type certificateMsgTLS13 struct {
  1589. raw []byte
  1590. certificate Certificate
  1591. ocspStapling bool
  1592. scts bool
  1593. }
  1594. func (m *certificateMsgTLS13) marshal() ([]byte, error) {
  1595. if m.raw != nil {
  1596. return m.raw, nil
  1597. }
  1598. var b cryptobyte.Builder
  1599. b.AddUint8(typeCertificate)
  1600. b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
  1601. b.AddUint8(0) // certificate_request_context
  1602. certificate := m.certificate
  1603. if !m.ocspStapling {
  1604. certificate.OCSPStaple = nil
  1605. }
  1606. if !m.scts {
  1607. certificate.SignedCertificateTimestamps = nil
  1608. }
  1609. marshalCertificate(b, certificate)
  1610. })
  1611. var err error
  1612. m.raw, err = b.Bytes()
  1613. return m.raw, err
  1614. }
  1615. func marshalCertificate(b *cryptobyte.Builder, certificate Certificate) {
  1616. b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
  1617. for i, cert := range certificate.Certificate {
  1618. b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
  1619. b.AddBytes(cert)
  1620. })
  1621. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1622. if i > 0 {
  1623. // This library only supports OCSP and SCT for leaf certificates.
  1624. return
  1625. }
  1626. if certificate.OCSPStaple != nil {
  1627. b.AddUint16(extensionStatusRequest)
  1628. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1629. b.AddUint8(statusTypeOCSP)
  1630. b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
  1631. b.AddBytes(certificate.OCSPStaple)
  1632. })
  1633. })
  1634. }
  1635. if certificate.SignedCertificateTimestamps != nil {
  1636. b.AddUint16(extensionSCT)
  1637. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1638. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1639. for _, sct := range certificate.SignedCertificateTimestamps {
  1640. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1641. b.AddBytes(sct)
  1642. })
  1643. }
  1644. })
  1645. })
  1646. }
  1647. })
  1648. }
  1649. })
  1650. }
  1651. func (m *certificateMsgTLS13) unmarshal(data []byte) bool {
  1652. *m = certificateMsgTLS13{raw: data}
  1653. s := cryptobyte.String(data)
  1654. var context cryptobyte.String
  1655. if !s.Skip(4) || // message type and uint24 length field
  1656. !s.ReadUint8LengthPrefixed(&context) || !context.Empty() ||
  1657. !unmarshalCertificate(&s, &m.certificate) ||
  1658. !s.Empty() {
  1659. return false
  1660. }
  1661. m.scts = m.certificate.SignedCertificateTimestamps != nil
  1662. m.ocspStapling = m.certificate.OCSPStaple != nil
  1663. return true
  1664. }
  1665. func unmarshalCertificate(s *cryptobyte.String, certificate *Certificate) bool {
  1666. var certList cryptobyte.String
  1667. if !s.ReadUint24LengthPrefixed(&certList) {
  1668. return false
  1669. }
  1670. for !certList.Empty() {
  1671. var cert []byte
  1672. var extensions cryptobyte.String
  1673. if !readUint24LengthPrefixed(&certList, &cert) ||
  1674. !certList.ReadUint16LengthPrefixed(&extensions) {
  1675. return false
  1676. }
  1677. certificate.Certificate = append(certificate.Certificate, cert)
  1678. for !extensions.Empty() {
  1679. var extension uint16
  1680. var extData cryptobyte.String
  1681. if !extensions.ReadUint16(&extension) ||
  1682. !extensions.ReadUint16LengthPrefixed(&extData) {
  1683. return false
  1684. }
  1685. if len(certificate.Certificate) > 1 {
  1686. // This library only supports OCSP and SCT for leaf certificates.
  1687. continue
  1688. }
  1689. switch extension {
  1690. case extensionStatusRequest:
  1691. var statusType uint8
  1692. if !extData.ReadUint8(&statusType) || statusType != statusTypeOCSP ||
  1693. !readUint24LengthPrefixed(&extData, &certificate.OCSPStaple) ||
  1694. len(certificate.OCSPStaple) == 0 {
  1695. return false
  1696. }
  1697. case extensionSCT:
  1698. var sctList cryptobyte.String
  1699. if !extData.ReadUint16LengthPrefixed(&sctList) || sctList.Empty() {
  1700. return false
  1701. }
  1702. for !sctList.Empty() {
  1703. var sct []byte
  1704. if !readUint16LengthPrefixed(&sctList, &sct) ||
  1705. len(sct) == 0 {
  1706. return false
  1707. }
  1708. certificate.SignedCertificateTimestamps = append(
  1709. certificate.SignedCertificateTimestamps, sct)
  1710. }
  1711. default:
  1712. // Ignore unknown extensions.
  1713. continue
  1714. }
  1715. if !extData.Empty() {
  1716. return false
  1717. }
  1718. }
  1719. }
  1720. return true
  1721. }
  1722. type serverKeyExchangeMsg struct {
  1723. raw []byte
  1724. key []byte
  1725. }
  1726. func (m *serverKeyExchangeMsg) marshal() ([]byte, error) {
  1727. if m.raw != nil {
  1728. return m.raw, nil
  1729. }
  1730. length := len(m.key)
  1731. x := make([]byte, length+4)
  1732. x[0] = typeServerKeyExchange
  1733. x[1] = uint8(length >> 16)
  1734. x[2] = uint8(length >> 8)
  1735. x[3] = uint8(length)
  1736. copy(x[4:], m.key)
  1737. m.raw = x
  1738. return x, nil
  1739. }
  1740. func (m *serverKeyExchangeMsg) unmarshal(data []byte) bool {
  1741. m.raw = data
  1742. if len(data) < 4 {
  1743. return false
  1744. }
  1745. m.key = data[4:]
  1746. return true
  1747. }
  1748. type certificateStatusMsg struct {
  1749. raw []byte
  1750. response []byte
  1751. }
  1752. func (m *certificateStatusMsg) marshal() ([]byte, error) {
  1753. if m.raw != nil {
  1754. return m.raw, nil
  1755. }
  1756. var b cryptobyte.Builder
  1757. b.AddUint8(typeCertificateStatus)
  1758. b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
  1759. b.AddUint8(statusTypeOCSP)
  1760. b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
  1761. b.AddBytes(m.response)
  1762. })
  1763. })
  1764. var err error
  1765. m.raw, err = b.Bytes()
  1766. return m.raw, err
  1767. }
  1768. func (m *certificateStatusMsg) unmarshal(data []byte) bool {
  1769. m.raw = data
  1770. s := cryptobyte.String(data)
  1771. var statusType uint8
  1772. if !s.Skip(4) || // message type and uint24 length field
  1773. !s.ReadUint8(&statusType) || statusType != statusTypeOCSP ||
  1774. !readUint24LengthPrefixed(&s, &m.response) ||
  1775. len(m.response) == 0 || !s.Empty() {
  1776. return false
  1777. }
  1778. return true
  1779. }
  1780. type serverHelloDoneMsg struct{}
  1781. func (m *serverHelloDoneMsg) marshal() ([]byte, error) {
  1782. x := make([]byte, 4)
  1783. x[0] = typeServerHelloDone
  1784. return x, nil
  1785. }
  1786. func (m *serverHelloDoneMsg) unmarshal(data []byte) bool {
  1787. return len(data) == 4
  1788. }
  1789. type clientKeyExchangeMsg struct {
  1790. raw []byte
  1791. ciphertext []byte
  1792. }
  1793. func (m *clientKeyExchangeMsg) marshal() ([]byte, error) {
  1794. if m.raw != nil {
  1795. return m.raw, nil
  1796. }
  1797. length := len(m.ciphertext)
  1798. x := make([]byte, length+4)
  1799. x[0] = typeClientKeyExchange
  1800. x[1] = uint8(length >> 16)
  1801. x[2] = uint8(length >> 8)
  1802. x[3] = uint8(length)
  1803. copy(x[4:], m.ciphertext)
  1804. m.raw = x
  1805. return x, nil
  1806. }
  1807. func (m *clientKeyExchangeMsg) unmarshal(data []byte) bool {
  1808. m.raw = data
  1809. if len(data) < 4 {
  1810. return false
  1811. }
  1812. l := int(data[1])<<16 | int(data[2])<<8 | int(data[3])
  1813. if l != len(data)-4 {
  1814. return false
  1815. }
  1816. m.ciphertext = data[4:]
  1817. return true
  1818. }
  1819. type finishedMsg struct {
  1820. raw []byte
  1821. verifyData []byte
  1822. }
  1823. func (m *finishedMsg) marshal() ([]byte, error) {
  1824. if m.raw != nil {
  1825. return m.raw, nil
  1826. }
  1827. var b cryptobyte.Builder
  1828. b.AddUint8(typeFinished)
  1829. b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
  1830. b.AddBytes(m.verifyData)
  1831. })
  1832. var err error
  1833. m.raw, err = b.Bytes()
  1834. return m.raw, err
  1835. }
  1836. func (m *finishedMsg) unmarshal(data []byte) bool {
  1837. m.raw = data
  1838. s := cryptobyte.String(data)
  1839. return s.Skip(1) &&
  1840. readUint24LengthPrefixed(&s, &m.verifyData) &&
  1841. s.Empty()
  1842. }
  1843. type certificateRequestMsg struct {
  1844. raw []byte
  1845. // hasSignatureAlgorithm indicates whether this message includes a list of
  1846. // supported signature algorithms. This change was introduced with TLS 1.2.
  1847. hasSignatureAlgorithm bool
  1848. certificateTypes []byte
  1849. supportedSignatureAlgorithms []SignatureScheme
  1850. certificateAuthorities [][]byte
  1851. }
  1852. func (m *certificateRequestMsg) marshal() ([]byte, error) {
  1853. if m.raw != nil {
  1854. return m.raw, nil
  1855. }
  1856. // See RFC 4346, Section 7.4.4.
  1857. length := 1 + len(m.certificateTypes) + 2
  1858. casLength := 0
  1859. for _, ca := range m.certificateAuthorities {
  1860. casLength += 2 + len(ca)
  1861. }
  1862. length += casLength
  1863. if m.hasSignatureAlgorithm {
  1864. length += 2 + 2*len(m.supportedSignatureAlgorithms)
  1865. }
  1866. x := make([]byte, 4+length)
  1867. x[0] = typeCertificateRequest
  1868. x[1] = uint8(length >> 16)
  1869. x[2] = uint8(length >> 8)
  1870. x[3] = uint8(length)
  1871. x[4] = uint8(len(m.certificateTypes))
  1872. copy(x[5:], m.certificateTypes)
  1873. y := x[5+len(m.certificateTypes):]
  1874. if m.hasSignatureAlgorithm {
  1875. n := len(m.supportedSignatureAlgorithms) * 2
  1876. y[0] = uint8(n >> 8)
  1877. y[1] = uint8(n)
  1878. y = y[2:]
  1879. for _, sigAlgo := range m.supportedSignatureAlgorithms {
  1880. y[0] = uint8(sigAlgo >> 8)
  1881. y[1] = uint8(sigAlgo)
  1882. y = y[2:]
  1883. }
  1884. }
  1885. y[0] = uint8(casLength >> 8)
  1886. y[1] = uint8(casLength)
  1887. y = y[2:]
  1888. for _, ca := range m.certificateAuthorities {
  1889. y[0] = uint8(len(ca) >> 8)
  1890. y[1] = uint8(len(ca))
  1891. y = y[2:]
  1892. copy(y, ca)
  1893. y = y[len(ca):]
  1894. }
  1895. m.raw = x
  1896. return m.raw, nil
  1897. }
  1898. func (m *certificateRequestMsg) unmarshal(data []byte) bool {
  1899. m.raw = data
  1900. if len(data) < 5 {
  1901. return false
  1902. }
  1903. length := uint32(data[1])<<16 | uint32(data[2])<<8 | uint32(data[3])
  1904. if uint32(len(data))-4 != length {
  1905. return false
  1906. }
  1907. numCertTypes := int(data[4])
  1908. data = data[5:]
  1909. if numCertTypes == 0 || len(data) <= numCertTypes {
  1910. return false
  1911. }
  1912. m.certificateTypes = make([]byte, numCertTypes)
  1913. if copy(m.certificateTypes, data) != numCertTypes {
  1914. return false
  1915. }
  1916. data = data[numCertTypes:]
  1917. if m.hasSignatureAlgorithm {
  1918. if len(data) < 2 {
  1919. return false
  1920. }
  1921. sigAndHashLen := uint16(data[0])<<8 | uint16(data[1])
  1922. data = data[2:]
  1923. if sigAndHashLen&1 != 0 {
  1924. return false
  1925. }
  1926. if len(data) < int(sigAndHashLen) {
  1927. return false
  1928. }
  1929. numSigAlgos := sigAndHashLen / 2
  1930. m.supportedSignatureAlgorithms = make([]SignatureScheme, numSigAlgos)
  1931. for i := range m.supportedSignatureAlgorithms {
  1932. m.supportedSignatureAlgorithms[i] = SignatureScheme(data[0])<<8 | SignatureScheme(data[1])
  1933. data = data[2:]
  1934. }
  1935. }
  1936. if len(data) < 2 {
  1937. return false
  1938. }
  1939. casLength := uint16(data[0])<<8 | uint16(data[1])
  1940. data = data[2:]
  1941. if len(data) < int(casLength) {
  1942. return false
  1943. }
  1944. cas := make([]byte, casLength)
  1945. copy(cas, data)
  1946. data = data[casLength:]
  1947. m.certificateAuthorities = nil
  1948. for len(cas) > 0 {
  1949. if len(cas) < 2 {
  1950. return false
  1951. }
  1952. caLen := uint16(cas[0])<<8 | uint16(cas[1])
  1953. cas = cas[2:]
  1954. if len(cas) < int(caLen) {
  1955. return false
  1956. }
  1957. m.certificateAuthorities = append(m.certificateAuthorities, cas[:caLen])
  1958. cas = cas[caLen:]
  1959. }
  1960. return len(data) == 0
  1961. }
  1962. type certificateVerifyMsg struct {
  1963. raw []byte
  1964. hasSignatureAlgorithm bool // format change introduced in TLS 1.2
  1965. signatureAlgorithm SignatureScheme
  1966. signature []byte
  1967. }
  1968. func (m *certificateVerifyMsg) marshal() ([]byte, error) {
  1969. if m.raw != nil {
  1970. return m.raw, nil
  1971. }
  1972. var b cryptobyte.Builder
  1973. b.AddUint8(typeCertificateVerify)
  1974. b.AddUint24LengthPrefixed(func(b *cryptobyte.Builder) {
  1975. if m.hasSignatureAlgorithm {
  1976. b.AddUint16(uint16(m.signatureAlgorithm))
  1977. }
  1978. b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) {
  1979. b.AddBytes(m.signature)
  1980. })
  1981. })
  1982. var err error
  1983. m.raw, err = b.Bytes()
  1984. return m.raw, err
  1985. }
  1986. func (m *certificateVerifyMsg) unmarshal(data []byte) bool {
  1987. m.raw = data
  1988. s := cryptobyte.String(data)
  1989. if !s.Skip(4) { // message type and uint24 length field
  1990. return false
  1991. }
  1992. if m.hasSignatureAlgorithm {
  1993. if !s.ReadUint16((*uint16)(&m.signatureAlgorithm)) {
  1994. return false
  1995. }
  1996. }
  1997. return readUint16LengthPrefixed(&s, &m.signature) && s.Empty()
  1998. }
  1999. type newSessionTicketMsg struct {
  2000. raw []byte
  2001. ticket []byte
  2002. }
  2003. func (m *newSessionTicketMsg) marshal() ([]byte, error) {
  2004. if m.raw != nil {
  2005. return m.raw, nil
  2006. }
  2007. // See RFC 5077, Section 3.3.
  2008. ticketLen := len(m.ticket)
  2009. length := 2 + 4 + ticketLen
  2010. x := make([]byte, 4+length)
  2011. x[0] = typeNewSessionTicket
  2012. x[1] = uint8(length >> 16)
  2013. x[2] = uint8(length >> 8)
  2014. x[3] = uint8(length)
  2015. x[8] = uint8(ticketLen >> 8)
  2016. x[9] = uint8(ticketLen)
  2017. copy(x[10:], m.ticket)
  2018. // [Psiphon]
  2019. // Set lifetime hint to a more typical value.
  2020. if obfuscateSessionTickets {
  2021. hints := []int{300, 1200, 7200, 10800, 64800, 100800, 129600}
  2022. index := prng.Intn(len(hints))
  2023. hint := hints[index]
  2024. x[4] = uint8(hint >> 24)
  2025. x[5] = uint8(hint >> 16)
  2026. x[6] = uint8(hint >> 8)
  2027. x[7] = uint8(hint)
  2028. }
  2029. m.raw = x
  2030. return m.raw, nil
  2031. }
  2032. func (m *newSessionTicketMsg) unmarshal(data []byte) bool {
  2033. m.raw = data
  2034. if len(data) < 10 {
  2035. return false
  2036. }
  2037. length := uint32(data[1])<<16 | uint32(data[2])<<8 | uint32(data[3])
  2038. if uint32(len(data))-4 != length {
  2039. return false
  2040. }
  2041. ticketLen := int(data[8])<<8 + int(data[9])
  2042. if len(data)-10 != ticketLen {
  2043. return false
  2044. }
  2045. m.ticket = data[10:]
  2046. return true
  2047. }
  2048. type helloRequestMsg struct {
  2049. }
  2050. func (*helloRequestMsg) marshal() ([]byte, error) {
  2051. return []byte{typeHelloRequest, 0, 0, 0}, nil
  2052. }
  2053. func (*helloRequestMsg) unmarshal(data []byte) bool {
  2054. return len(data) == 4
  2055. }
  2056. type transcriptHash interface {
  2057. Write([]byte) (int, error)
  2058. }
  2059. // transcriptMsg is a helper used to marshal and hash messages which typically
  2060. // are not written to the wire, and as such aren't hashed during Conn.writeRecord.
  2061. func transcriptMsg(msg handshakeMessage, h transcriptHash) error {
  2062. data, err := msg.marshal()
  2063. if err != nil {
  2064. return err
  2065. }
  2066. h.Write(data)
  2067. return nil
  2068. }