u_parrots.go 49 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646
  1. // Copyright 2017 Google Inc. 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. "crypto/sha256"
  7. "encoding/binary"
  8. "errors"
  9. "fmt"
  10. "io"
  11. "sort"
  12. "strconv"
  13. )
  14. func utlsIdToSpec(id ClientHelloID) (ClientHelloSpec, error) {
  15. switch id {
  16. case HelloChrome_58, HelloChrome_62:
  17. return ClientHelloSpec{
  18. TLSVersMax: VersionTLS12,
  19. TLSVersMin: VersionTLS10,
  20. CipherSuites: []uint16{
  21. GREASE_PLACEHOLDER,
  22. TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  23. TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  24. TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  25. TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
  26. TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
  27. TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
  28. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
  29. TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
  30. TLS_RSA_WITH_AES_128_GCM_SHA256,
  31. TLS_RSA_WITH_AES_256_GCM_SHA384,
  32. TLS_RSA_WITH_AES_128_CBC_SHA,
  33. TLS_RSA_WITH_AES_256_CBC_SHA,
  34. TLS_RSA_WITH_3DES_EDE_CBC_SHA,
  35. },
  36. CompressionMethods: []byte{compressionNone},
  37. Extensions: []TLSExtension{
  38. &UtlsGREASEExtension{},
  39. &RenegotiationInfoExtension{Renegotiation: RenegotiateOnceAsClient},
  40. &SNIExtension{},
  41. &UtlsExtendedMasterSecretExtension{},
  42. &SessionTicketExtension{},
  43. &SignatureAlgorithmsExtension{SupportedSignatureAlgorithms: []SignatureScheme{
  44. ECDSAWithP256AndSHA256,
  45. PSSWithSHA256,
  46. PKCS1WithSHA256,
  47. ECDSAWithP384AndSHA384,
  48. PSSWithSHA384,
  49. PKCS1WithSHA384,
  50. PSSWithSHA512,
  51. PKCS1WithSHA512,
  52. PKCS1WithSHA1},
  53. },
  54. &StatusRequestExtension{},
  55. &SCTExtension{},
  56. &ALPNExtension{AlpnProtocols: []string{"h2", "http/1.1"}},
  57. &FakeChannelIDExtension{},
  58. &SupportedPointsExtension{SupportedPoints: []byte{pointFormatUncompressed}},
  59. &SupportedCurvesExtension{[]CurveID{CurveID(GREASE_PLACEHOLDER),
  60. X25519, CurveP256, CurveP384}},
  61. &UtlsGREASEExtension{},
  62. &UtlsPaddingExtension{GetPaddingLen: BoringPaddingStyle},
  63. },
  64. GetSessionID: sha256.Sum256,
  65. }, nil
  66. case HelloChrome_70:
  67. return ClientHelloSpec{
  68. TLSVersMin: VersionTLS10,
  69. TLSVersMax: VersionTLS13,
  70. CipherSuites: []uint16{
  71. GREASE_PLACEHOLDER,
  72. TLS_AES_128_GCM_SHA256,
  73. TLS_AES_256_GCM_SHA384,
  74. TLS_CHACHA20_POLY1305_SHA256,
  75. TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  76. TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  77. TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  78. TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
  79. TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
  80. TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
  81. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
  82. TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
  83. TLS_RSA_WITH_AES_128_GCM_SHA256,
  84. TLS_RSA_WITH_AES_256_GCM_SHA384,
  85. TLS_RSA_WITH_AES_128_CBC_SHA,
  86. TLS_RSA_WITH_AES_256_CBC_SHA,
  87. TLS_RSA_WITH_3DES_EDE_CBC_SHA,
  88. },
  89. CompressionMethods: []byte{
  90. compressionNone,
  91. },
  92. Extensions: []TLSExtension{
  93. &UtlsGREASEExtension{},
  94. &RenegotiationInfoExtension{Renegotiation: RenegotiateOnceAsClient},
  95. &SNIExtension{},
  96. &UtlsExtendedMasterSecretExtension{},
  97. &SessionTicketExtension{},
  98. &SignatureAlgorithmsExtension{SupportedSignatureAlgorithms: []SignatureScheme{
  99. ECDSAWithP256AndSHA256,
  100. PSSWithSHA256,
  101. PKCS1WithSHA256,
  102. ECDSAWithP384AndSHA384,
  103. PSSWithSHA384,
  104. PKCS1WithSHA384,
  105. PSSWithSHA512,
  106. PKCS1WithSHA512,
  107. PKCS1WithSHA1,
  108. }},
  109. &StatusRequestExtension{},
  110. &SCTExtension{},
  111. &ALPNExtension{AlpnProtocols: []string{"h2", "http/1.1"}},
  112. &FakeChannelIDExtension{},
  113. &SupportedPointsExtension{SupportedPoints: []byte{
  114. pointFormatUncompressed,
  115. }},
  116. &KeyShareExtension{[]KeyShare{
  117. {Group: CurveID(GREASE_PLACEHOLDER), Data: []byte{0}},
  118. {Group: X25519},
  119. }},
  120. &PSKKeyExchangeModesExtension{[]uint8{pskModeDHE}},
  121. &SupportedVersionsExtension{[]uint16{
  122. GREASE_PLACEHOLDER,
  123. VersionTLS13,
  124. VersionTLS12,
  125. VersionTLS11,
  126. VersionTLS10}},
  127. &SupportedCurvesExtension{[]CurveID{
  128. CurveID(GREASE_PLACEHOLDER),
  129. X25519,
  130. CurveP256,
  131. CurveP384,
  132. }},
  133. &UtlsCompressCertExtension{[]CertCompressionAlgo{CertCompressionBrotli}},
  134. &UtlsGREASEExtension{},
  135. &UtlsPaddingExtension{GetPaddingLen: BoringPaddingStyle},
  136. },
  137. }, nil
  138. case HelloChrome_72:
  139. return ClientHelloSpec{
  140. CipherSuites: []uint16{
  141. GREASE_PLACEHOLDER,
  142. TLS_AES_128_GCM_SHA256,
  143. TLS_AES_256_GCM_SHA384,
  144. TLS_CHACHA20_POLY1305_SHA256,
  145. TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  146. TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  147. TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  148. TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
  149. TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
  150. TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
  151. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
  152. TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
  153. TLS_RSA_WITH_AES_128_GCM_SHA256,
  154. TLS_RSA_WITH_AES_256_GCM_SHA384,
  155. TLS_RSA_WITH_AES_128_CBC_SHA,
  156. TLS_RSA_WITH_AES_256_CBC_SHA,
  157. TLS_RSA_WITH_3DES_EDE_CBC_SHA,
  158. },
  159. CompressionMethods: []byte{
  160. 0x00, // compressionNone
  161. },
  162. Extensions: []TLSExtension{
  163. &UtlsGREASEExtension{},
  164. &SNIExtension{},
  165. &UtlsExtendedMasterSecretExtension{},
  166. &RenegotiationInfoExtension{Renegotiation: RenegotiateOnceAsClient},
  167. &SupportedCurvesExtension{[]CurveID{
  168. CurveID(GREASE_PLACEHOLDER),
  169. X25519,
  170. CurveP256,
  171. CurveP384,
  172. }},
  173. &SupportedPointsExtension{SupportedPoints: []byte{
  174. 0x00, // pointFormatUncompressed
  175. }},
  176. &SessionTicketExtension{},
  177. &ALPNExtension{AlpnProtocols: []string{"h2", "http/1.1"}},
  178. &StatusRequestExtension{},
  179. &SignatureAlgorithmsExtension{SupportedSignatureAlgorithms: []SignatureScheme{
  180. ECDSAWithP256AndSHA256,
  181. PSSWithSHA256,
  182. PKCS1WithSHA256,
  183. ECDSAWithP384AndSHA384,
  184. PSSWithSHA384,
  185. PKCS1WithSHA384,
  186. PSSWithSHA512,
  187. PKCS1WithSHA512,
  188. PKCS1WithSHA1,
  189. }},
  190. &SCTExtension{},
  191. &KeyShareExtension{[]KeyShare{
  192. {Group: CurveID(GREASE_PLACEHOLDER), Data: []byte{0}},
  193. {Group: X25519},
  194. }},
  195. &PSKKeyExchangeModesExtension{[]uint8{
  196. PskModeDHE,
  197. }},
  198. &SupportedVersionsExtension{[]uint16{
  199. GREASE_PLACEHOLDER,
  200. VersionTLS13,
  201. VersionTLS12,
  202. VersionTLS11,
  203. VersionTLS10,
  204. }},
  205. &UtlsCompressCertExtension{[]CertCompressionAlgo{
  206. CertCompressionBrotli,
  207. }},
  208. &UtlsGREASEExtension{},
  209. &UtlsPaddingExtension{GetPaddingLen: BoringPaddingStyle},
  210. },
  211. }, nil
  212. case HelloChrome_83:
  213. return ClientHelloSpec{
  214. CipherSuites: []uint16{
  215. GREASE_PLACEHOLDER,
  216. TLS_AES_128_GCM_SHA256,
  217. TLS_AES_256_GCM_SHA384,
  218. TLS_CHACHA20_POLY1305_SHA256,
  219. TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  220. TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  221. TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  222. TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
  223. TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
  224. TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
  225. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
  226. TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
  227. TLS_RSA_WITH_AES_128_GCM_SHA256,
  228. TLS_RSA_WITH_AES_256_GCM_SHA384,
  229. TLS_RSA_WITH_AES_128_CBC_SHA,
  230. TLS_RSA_WITH_AES_256_CBC_SHA,
  231. },
  232. CompressionMethods: []byte{
  233. 0x00, // compressionNone
  234. },
  235. Extensions: []TLSExtension{
  236. &UtlsGREASEExtension{},
  237. &SNIExtension{},
  238. &UtlsExtendedMasterSecretExtension{},
  239. &RenegotiationInfoExtension{Renegotiation: RenegotiateOnceAsClient},
  240. &SupportedCurvesExtension{[]CurveID{
  241. CurveID(GREASE_PLACEHOLDER),
  242. X25519,
  243. CurveP256,
  244. CurveP384,
  245. }},
  246. &SupportedPointsExtension{SupportedPoints: []byte{
  247. 0x00, // pointFormatUncompressed
  248. }},
  249. &SessionTicketExtension{},
  250. &ALPNExtension{AlpnProtocols: []string{"h2", "http/1.1"}},
  251. &StatusRequestExtension{},
  252. &SignatureAlgorithmsExtension{SupportedSignatureAlgorithms: []SignatureScheme{
  253. ECDSAWithP256AndSHA256,
  254. PSSWithSHA256,
  255. PKCS1WithSHA256,
  256. ECDSAWithP384AndSHA384,
  257. PSSWithSHA384,
  258. PKCS1WithSHA384,
  259. PSSWithSHA512,
  260. PKCS1WithSHA512,
  261. }},
  262. &SCTExtension{},
  263. &KeyShareExtension{[]KeyShare{
  264. {Group: CurveID(GREASE_PLACEHOLDER), Data: []byte{0}},
  265. {Group: X25519},
  266. }},
  267. &PSKKeyExchangeModesExtension{[]uint8{
  268. PskModeDHE,
  269. }},
  270. &SupportedVersionsExtension{[]uint16{
  271. GREASE_PLACEHOLDER,
  272. VersionTLS13,
  273. VersionTLS12,
  274. VersionTLS11,
  275. VersionTLS10,
  276. }},
  277. &UtlsCompressCertExtension{[]CertCompressionAlgo{
  278. CertCompressionBrotli,
  279. }},
  280. &UtlsGREASEExtension{},
  281. &UtlsPaddingExtension{GetPaddingLen: BoringPaddingStyle},
  282. },
  283. }, nil
  284. case HelloChrome_87:
  285. return ClientHelloSpec{
  286. CipherSuites: []uint16{
  287. GREASE_PLACEHOLDER,
  288. TLS_AES_128_GCM_SHA256,
  289. TLS_AES_256_GCM_SHA384,
  290. TLS_CHACHA20_POLY1305_SHA256,
  291. TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  292. TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  293. TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  294. TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
  295. TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
  296. TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
  297. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
  298. TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
  299. TLS_RSA_WITH_AES_128_GCM_SHA256,
  300. TLS_RSA_WITH_AES_256_GCM_SHA384,
  301. TLS_RSA_WITH_AES_128_CBC_SHA,
  302. TLS_RSA_WITH_AES_256_CBC_SHA,
  303. },
  304. CompressionMethods: []byte{
  305. 0x00, // compressionNone
  306. },
  307. Extensions: []TLSExtension{
  308. &UtlsGREASEExtension{},
  309. &SNIExtension{},
  310. &UtlsExtendedMasterSecretExtension{},
  311. &RenegotiationInfoExtension{Renegotiation: RenegotiateOnceAsClient},
  312. &SupportedCurvesExtension{[]CurveID{
  313. CurveID(GREASE_PLACEHOLDER),
  314. X25519,
  315. CurveP256,
  316. CurveP384,
  317. }},
  318. &SupportedPointsExtension{SupportedPoints: []byte{
  319. 0x00, // pointFormatUncompressed
  320. }},
  321. &SessionTicketExtension{},
  322. &ALPNExtension{AlpnProtocols: []string{"h2", "http/1.1"}},
  323. &StatusRequestExtension{},
  324. &SignatureAlgorithmsExtension{SupportedSignatureAlgorithms: []SignatureScheme{
  325. ECDSAWithP256AndSHA256,
  326. PSSWithSHA256,
  327. PKCS1WithSHA256,
  328. ECDSAWithP384AndSHA384,
  329. PSSWithSHA384,
  330. PKCS1WithSHA384,
  331. PSSWithSHA512,
  332. PKCS1WithSHA512,
  333. }},
  334. &SCTExtension{},
  335. &KeyShareExtension{[]KeyShare{
  336. {Group: CurveID(GREASE_PLACEHOLDER), Data: []byte{0}},
  337. {Group: X25519},
  338. }},
  339. &PSKKeyExchangeModesExtension{[]uint8{
  340. PskModeDHE,
  341. }},
  342. &SupportedVersionsExtension{[]uint16{
  343. GREASE_PLACEHOLDER,
  344. VersionTLS13,
  345. VersionTLS12,
  346. VersionTLS11,
  347. VersionTLS10,
  348. }},
  349. &UtlsCompressCertExtension{[]CertCompressionAlgo{
  350. CertCompressionBrotli,
  351. }},
  352. &UtlsGREASEExtension{},
  353. &UtlsPaddingExtension{GetPaddingLen: BoringPaddingStyle},
  354. },
  355. }, nil
  356. case HelloChrome_96:
  357. return ClientHelloSpec{
  358. CipherSuites: []uint16{
  359. GREASE_PLACEHOLDER,
  360. TLS_AES_128_GCM_SHA256,
  361. TLS_AES_256_GCM_SHA384,
  362. TLS_CHACHA20_POLY1305_SHA256,
  363. TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  364. TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  365. TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  366. TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
  367. TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
  368. TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
  369. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
  370. TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
  371. TLS_RSA_WITH_AES_128_GCM_SHA256,
  372. TLS_RSA_WITH_AES_256_GCM_SHA384,
  373. TLS_RSA_WITH_AES_128_CBC_SHA,
  374. TLS_RSA_WITH_AES_256_CBC_SHA,
  375. },
  376. CompressionMethods: []byte{
  377. 0x00, // compressionNone
  378. },
  379. Extensions: []TLSExtension{
  380. &UtlsGREASEExtension{},
  381. &SNIExtension{},
  382. &UtlsExtendedMasterSecretExtension{},
  383. &RenegotiationInfoExtension{Renegotiation: RenegotiateOnceAsClient},
  384. &SupportedCurvesExtension{[]CurveID{
  385. CurveID(GREASE_PLACEHOLDER),
  386. X25519,
  387. CurveP256,
  388. CurveP384,
  389. }},
  390. &SupportedPointsExtension{SupportedPoints: []byte{
  391. 0x00, // pointFormatUncompressed
  392. }},
  393. &SessionTicketExtension{},
  394. &ALPNExtension{AlpnProtocols: []string{"h2", "http/1.1"}},
  395. &StatusRequestExtension{},
  396. &SignatureAlgorithmsExtension{SupportedSignatureAlgorithms: []SignatureScheme{
  397. ECDSAWithP256AndSHA256,
  398. PSSWithSHA256,
  399. PKCS1WithSHA256,
  400. ECDSAWithP384AndSHA384,
  401. PSSWithSHA384,
  402. PKCS1WithSHA384,
  403. PSSWithSHA512,
  404. PKCS1WithSHA512,
  405. }},
  406. &SCTExtension{},
  407. &KeyShareExtension{[]KeyShare{
  408. {Group: CurveID(GREASE_PLACEHOLDER), Data: []byte{0}},
  409. {Group: X25519},
  410. }},
  411. &PSKKeyExchangeModesExtension{[]uint8{
  412. PskModeDHE,
  413. }},
  414. &SupportedVersionsExtension{[]uint16{
  415. GREASE_PLACEHOLDER,
  416. VersionTLS13,
  417. VersionTLS12,
  418. VersionTLS11,
  419. VersionTLS10,
  420. }},
  421. &UtlsCompressCertExtension{[]CertCompressionAlgo{
  422. CertCompressionBrotli,
  423. }},
  424. &ApplicationSettingsExtension{SupportedProtocols: []string{"h2"}},
  425. &UtlsGREASEExtension{},
  426. &UtlsPaddingExtension{GetPaddingLen: BoringPaddingStyle},
  427. },
  428. }, nil
  429. case HelloChrome_100:
  430. signatureScheme := []SignatureScheme{
  431. ECDSAWithP256AndSHA256,
  432. ECDSAWithP384AndSHA384,
  433. ECDSAWithP521AndSHA512,
  434. PSSWithSHA256,
  435. PSSWithSHA384,
  436. PSSWithSHA512,
  437. 0x0809,
  438. 0x080a,
  439. 0x080b,
  440. PKCS1WithSHA256,
  441. PKCS1WithSHA384,
  442. PKCS1WithSHA512,
  443. 0x0402,
  444. 0x0303,
  445. 0x0301,
  446. 0x0302,
  447. 0x0203,
  448. 0x0201,
  449. 0x0202,
  450. }
  451. return ClientHelloSpec{
  452. CipherSuites: []uint16{
  453. GREASE_PLACEHOLDER,
  454. TLS_AES_128_GCM_SHA256,
  455. TLS_AES_256_GCM_SHA384,
  456. TLS_CHACHA20_POLY1305_SHA256,
  457. TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  458. TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  459. TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  460. TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
  461. TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
  462. TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
  463. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
  464. TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
  465. TLS_RSA_WITH_AES_128_GCM_SHA256,
  466. TLS_RSA_WITH_AES_256_GCM_SHA384,
  467. TLS_RSA_WITH_AES_128_CBC_SHA,
  468. TLS_RSA_WITH_AES_256_CBC_SHA,
  469. },
  470. CompressionMethods: []byte{
  471. 0x00, // compressionNone
  472. },
  473. Extensions: []TLSExtension{
  474. &UtlsGREASEExtension{},
  475. &SNIExtension{},
  476. &UtlsExtendedMasterSecretExtension{},
  477. &RenegotiationInfoExtension{},
  478. &SupportedCurvesExtension{[]CurveID{
  479. GREASE_PLACEHOLDER,
  480. X25519,
  481. CurveP256,
  482. CurveP384,
  483. }},
  484. &SupportedPointsExtension{SupportedPoints: []byte{
  485. 0x00, // pointFormatUncompressed
  486. }},
  487. &SessionTicketExtension{},
  488. &ALPNExtension{AlpnProtocols: []string{"h2", "http/1.1"}},
  489. &StatusRequestExtension{},
  490. &SignatureAlgorithmsExtension{SupportedSignatureAlgorithms: signatureScheme},
  491. &SCTExtension{},
  492. &KeyShareExtension{[]KeyShare{
  493. {Group: CurveID(GREASE_PLACEHOLDER), Data: []byte{0}},
  494. {Group: X25519},
  495. }},
  496. &PSKKeyExchangeModesExtension{[]uint8{
  497. PskModeDHE,
  498. }},
  499. &SupportedVersionsExtension{[]uint16{
  500. VersionTLS13,
  501. VersionTLS12,
  502. VersionTLS11,
  503. VersionTLS10,
  504. }},
  505. &UtlsCompressCertExtension{[]CertCompressionAlgo{
  506. CertCompressionBrotli,
  507. }},
  508. &UtlsGREASEExtension{},
  509. &ApplicationSettingsExtension{SupportedProtocols: []string{"h2"}},
  510. &UtlsPaddingExtension{GetPaddingLen: BoringPaddingStyle},
  511. },
  512. }, nil
  513. case HelloFirefox_55, HelloFirefox_56:
  514. return ClientHelloSpec{
  515. TLSVersMax: VersionTLS12,
  516. TLSVersMin: VersionTLS10,
  517. CipherSuites: []uint16{
  518. TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  519. TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  520. TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
  521. TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
  522. TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  523. TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
  524. TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
  525. TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
  526. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
  527. TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
  528. FAKE_TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
  529. FAKE_TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
  530. TLS_RSA_WITH_AES_128_CBC_SHA,
  531. TLS_RSA_WITH_AES_256_CBC_SHA,
  532. TLS_RSA_WITH_3DES_EDE_CBC_SHA,
  533. },
  534. CompressionMethods: []byte{compressionNone},
  535. Extensions: []TLSExtension{
  536. &SNIExtension{},
  537. &UtlsExtendedMasterSecretExtension{},
  538. &RenegotiationInfoExtension{Renegotiation: RenegotiateOnceAsClient},
  539. &SupportedCurvesExtension{[]CurveID{X25519, CurveP256, CurveP384, CurveP521}},
  540. &SupportedPointsExtension{SupportedPoints: []byte{pointFormatUncompressed}},
  541. &SessionTicketExtension{},
  542. &ALPNExtension{AlpnProtocols: []string{"h2", "http/1.1"}},
  543. &StatusRequestExtension{},
  544. &SignatureAlgorithmsExtension{SupportedSignatureAlgorithms: []SignatureScheme{
  545. ECDSAWithP256AndSHA256,
  546. ECDSAWithP384AndSHA384,
  547. ECDSAWithP521AndSHA512,
  548. PSSWithSHA256,
  549. PSSWithSHA384,
  550. PSSWithSHA512,
  551. PKCS1WithSHA256,
  552. PKCS1WithSHA384,
  553. PKCS1WithSHA512,
  554. ECDSAWithSHA1,
  555. PKCS1WithSHA1},
  556. },
  557. &UtlsPaddingExtension{GetPaddingLen: BoringPaddingStyle},
  558. },
  559. GetSessionID: nil,
  560. }, nil
  561. case HelloFirefox_63, HelloFirefox_65:
  562. return ClientHelloSpec{
  563. TLSVersMin: VersionTLS10,
  564. TLSVersMax: VersionTLS13,
  565. CipherSuites: []uint16{
  566. TLS_AES_128_GCM_SHA256,
  567. TLS_CHACHA20_POLY1305_SHA256,
  568. TLS_AES_256_GCM_SHA384,
  569. TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  570. TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  571. TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
  572. TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
  573. TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  574. TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
  575. TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
  576. TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
  577. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
  578. TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
  579. FAKE_TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
  580. FAKE_TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
  581. TLS_RSA_WITH_AES_128_CBC_SHA,
  582. TLS_RSA_WITH_AES_256_CBC_SHA,
  583. TLS_RSA_WITH_3DES_EDE_CBC_SHA,
  584. },
  585. CompressionMethods: []byte{
  586. compressionNone,
  587. },
  588. Extensions: []TLSExtension{
  589. &SNIExtension{},
  590. &UtlsExtendedMasterSecretExtension{},
  591. &RenegotiationInfoExtension{Renegotiation: RenegotiateOnceAsClient},
  592. &SupportedCurvesExtension{[]CurveID{
  593. X25519,
  594. CurveP256,
  595. CurveP384,
  596. CurveP521,
  597. CurveID(FakeFFDHE2048),
  598. CurveID(FakeFFDHE3072),
  599. }},
  600. &SupportedPointsExtension{SupportedPoints: []byte{
  601. pointFormatUncompressed,
  602. }},
  603. &SessionTicketExtension{},
  604. &ALPNExtension{AlpnProtocols: []string{"h2", "http/1.1"}},
  605. &StatusRequestExtension{},
  606. &KeyShareExtension{[]KeyShare{
  607. {Group: X25519},
  608. {Group: CurveP256},
  609. }},
  610. &SupportedVersionsExtension{[]uint16{
  611. VersionTLS13,
  612. VersionTLS12,
  613. VersionTLS11,
  614. VersionTLS10}},
  615. &SignatureAlgorithmsExtension{SupportedSignatureAlgorithms: []SignatureScheme{
  616. ECDSAWithP256AndSHA256,
  617. ECDSAWithP384AndSHA384,
  618. ECDSAWithP521AndSHA512,
  619. PSSWithSHA256,
  620. PSSWithSHA384,
  621. PSSWithSHA512,
  622. PKCS1WithSHA256,
  623. PKCS1WithSHA384,
  624. PKCS1WithSHA512,
  625. ECDSAWithSHA1,
  626. PKCS1WithSHA1,
  627. }},
  628. &PSKKeyExchangeModesExtension{[]uint8{pskModeDHE}},
  629. &FakeRecordSizeLimitExtension{0x4001},
  630. &UtlsPaddingExtension{GetPaddingLen: BoringPaddingStyle},
  631. }}, nil
  632. case HelloChrome_102:
  633. return ClientHelloSpec{
  634. CipherSuites: []uint16{
  635. GREASE_PLACEHOLDER,
  636. TLS_AES_128_GCM_SHA256,
  637. TLS_AES_256_GCM_SHA384,
  638. TLS_CHACHA20_POLY1305_SHA256,
  639. TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  640. TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  641. TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  642. TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
  643. TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
  644. TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
  645. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
  646. TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
  647. TLS_RSA_WITH_AES_128_GCM_SHA256,
  648. TLS_RSA_WITH_AES_256_GCM_SHA384,
  649. TLS_RSA_WITH_AES_128_CBC_SHA,
  650. TLS_RSA_WITH_AES_256_CBC_SHA,
  651. },
  652. CompressionMethods: []byte{
  653. 0x00, // compressionNone
  654. },
  655. Extensions: []TLSExtension{
  656. &UtlsGREASEExtension{},
  657. &SNIExtension{},
  658. &UtlsExtendedMasterSecretExtension{},
  659. &RenegotiationInfoExtension{Renegotiation: RenegotiateOnceAsClient},
  660. &SupportedCurvesExtension{[]CurveID{
  661. GREASE_PLACEHOLDER,
  662. X25519,
  663. CurveP256,
  664. CurveP384,
  665. }},
  666. &SupportedPointsExtension{SupportedPoints: []byte{
  667. 0x00, // pointFormatUncompressed
  668. }},
  669. &SessionTicketExtension{},
  670. &ALPNExtension{AlpnProtocols: []string{"h2", "http/1.1"}},
  671. &StatusRequestExtension{},
  672. &SignatureAlgorithmsExtension{SupportedSignatureAlgorithms: []SignatureScheme{
  673. ECDSAWithP256AndSHA256,
  674. PSSWithSHA256,
  675. PKCS1WithSHA256,
  676. ECDSAWithP384AndSHA384,
  677. PSSWithSHA384,
  678. PKCS1WithSHA384,
  679. PSSWithSHA512,
  680. PKCS1WithSHA512,
  681. }},
  682. &SCTExtension{},
  683. &KeyShareExtension{[]KeyShare{
  684. {Group: CurveID(GREASE_PLACEHOLDER), Data: []byte{0}},
  685. {Group: X25519},
  686. }},
  687. &PSKKeyExchangeModesExtension{[]uint8{
  688. PskModeDHE,
  689. }},
  690. &SupportedVersionsExtension{[]uint16{
  691. GREASE_PLACEHOLDER,
  692. VersionTLS13,
  693. VersionTLS12,
  694. }},
  695. &UtlsCompressCertExtension{[]CertCompressionAlgo{
  696. CertCompressionBrotli,
  697. }},
  698. &ApplicationSettingsExtension{SupportedProtocols: []string{"h2"}},
  699. &UtlsGREASEExtension{},
  700. &UtlsPaddingExtension{GetPaddingLen: BoringPaddingStyle},
  701. },
  702. }, nil
  703. case HelloFirefox_99:
  704. return ClientHelloSpec{
  705. TLSVersMin: VersionTLS10,
  706. TLSVersMax: VersionTLS13,
  707. CipherSuites: []uint16{
  708. TLS_AES_128_GCM_SHA256,
  709. TLS_CHACHA20_POLY1305_SHA256,
  710. TLS_AES_256_GCM_SHA384,
  711. TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  712. TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  713. TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
  714. TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
  715. TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  716. TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
  717. TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
  718. TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
  719. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
  720. TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
  721. TLS_RSA_WITH_AES_128_GCM_SHA256,
  722. TLS_RSA_WITH_AES_256_GCM_SHA384,
  723. TLS_RSA_WITH_AES_128_CBC_SHA,
  724. TLS_RSA_WITH_AES_256_CBC_SHA,
  725. TLS_RSA_WITH_3DES_EDE_CBC_SHA,
  726. },
  727. CompressionMethods: []byte{
  728. compressionNone,
  729. },
  730. Extensions: []TLSExtension{
  731. &SNIExtension{}, //server_name
  732. &UtlsExtendedMasterSecretExtension{}, //extended_master_secret
  733. &RenegotiationInfoExtension{Renegotiation: RenegotiateOnceAsClient}, //extensionRenegotiationInfo
  734. &SupportedCurvesExtension{[]CurveID{ //supported_groups
  735. X25519,
  736. CurveP256,
  737. CurveP384,
  738. CurveP521,
  739. CurveID(FakeFFDHE2048),
  740. CurveID(FakeFFDHE3072),
  741. }},
  742. &SupportedPointsExtension{SupportedPoints: []byte{ //ec_point_formats
  743. pointFormatUncompressed,
  744. }},
  745. &SessionTicketExtension{},
  746. &ALPNExtension{AlpnProtocols: []string{"h2", "http/1.1"}}, //application_layer_protocol_negotiation
  747. &StatusRequestExtension{},
  748. &DelegatedCredentialsExtension{
  749. AlgorithmsSignature: []SignatureScheme{ //signature_algorithms
  750. ECDSAWithP256AndSHA256,
  751. ECDSAWithP384AndSHA384,
  752. ECDSAWithP521AndSHA512,
  753. ECDSAWithSHA1,
  754. },
  755. },
  756. &KeyShareExtension{[]KeyShare{
  757. {Group: X25519},
  758. {Group: CurveP256}, //key_share
  759. }},
  760. &SupportedVersionsExtension{[]uint16{
  761. VersionTLS13, //supported_versions
  762. VersionTLS12,
  763. VersionTLS11,
  764. VersionTLS10,
  765. }},
  766. &SignatureAlgorithmsExtension{SupportedSignatureAlgorithms: []SignatureScheme{ //signature_algorithms
  767. ECDSAWithP256AndSHA256,
  768. ECDSAWithP384AndSHA384,
  769. ECDSAWithP521AndSHA512,
  770. PSSWithSHA256,
  771. PSSWithSHA384,
  772. PSSWithSHA512,
  773. PKCS1WithSHA256,
  774. PKCS1WithSHA384,
  775. PKCS1WithSHA512,
  776. ECDSAWithSHA1,
  777. PKCS1WithSHA1,
  778. }},
  779. &PSKKeyExchangeModesExtension{[]uint8{ //psk_key_exchange_modes
  780. PskModeDHE,
  781. }},
  782. &FakeRecordSizeLimitExtension{Limit: 0x4001}, //record_size_limit
  783. &UtlsPaddingExtension{GetPaddingLen: BoringPaddingStyle}, //padding
  784. }}, nil
  785. case HelloFirefox_102:
  786. return ClientHelloSpec{
  787. TLSVersMin: VersionTLS10,
  788. TLSVersMax: VersionTLS13,
  789. CipherSuites: []uint16{
  790. TLS_AES_128_GCM_SHA256,
  791. TLS_CHACHA20_POLY1305_SHA256,
  792. TLS_AES_256_GCM_SHA384,
  793. TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  794. TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  795. TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
  796. TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
  797. TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  798. TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
  799. TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
  800. TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
  801. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
  802. TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
  803. TLS_RSA_WITH_AES_128_GCM_SHA256,
  804. TLS_RSA_WITH_AES_256_GCM_SHA384,
  805. TLS_RSA_WITH_AES_128_CBC_SHA,
  806. TLS_RSA_WITH_AES_256_CBC_SHA,
  807. },
  808. CompressionMethods: []byte{
  809. compressionNone,
  810. },
  811. Extensions: []TLSExtension{
  812. &SNIExtension{}, //server_name
  813. &UtlsExtendedMasterSecretExtension{}, //extended_master_secret
  814. &RenegotiationInfoExtension{Renegotiation: RenegotiateOnceAsClient}, //extensionRenegotiationInfo
  815. &SupportedCurvesExtension{[]CurveID{ //supported_groups
  816. X25519,
  817. CurveP256,
  818. CurveP384,
  819. CurveP521,
  820. CurveID(FakeFFDHE2048),
  821. CurveID(FakeFFDHE3072),
  822. }},
  823. &SupportedPointsExtension{SupportedPoints: []byte{ //ec_point_formats
  824. pointFormatUncompressed,
  825. }},
  826. &SessionTicketExtension{},
  827. &ALPNExtension{AlpnProtocols: []string{"h2"}}, //application_layer_protocol_negotiation
  828. &StatusRequestExtension{},
  829. &DelegatedCredentialsExtension{
  830. AlgorithmsSignature: []SignatureScheme{ //signature_algorithms
  831. ECDSAWithP256AndSHA256,
  832. ECDSAWithP384AndSHA384,
  833. ECDSAWithP521AndSHA512,
  834. ECDSAWithSHA1,
  835. },
  836. },
  837. &KeyShareExtension{[]KeyShare{
  838. {Group: X25519},
  839. {Group: CurveP256}, //key_share
  840. }},
  841. &SupportedVersionsExtension{[]uint16{
  842. VersionTLS13, //supported_versions
  843. VersionTLS12,
  844. }},
  845. &SignatureAlgorithmsExtension{SupportedSignatureAlgorithms: []SignatureScheme{ //signature_algorithms
  846. ECDSAWithP256AndSHA256,
  847. ECDSAWithP384AndSHA384,
  848. ECDSAWithP521AndSHA512,
  849. PSSWithSHA256,
  850. PSSWithSHA384,
  851. PSSWithSHA512,
  852. PKCS1WithSHA256,
  853. PKCS1WithSHA384,
  854. PKCS1WithSHA512,
  855. ECDSAWithSHA1,
  856. PKCS1WithSHA1,
  857. }},
  858. &PSKKeyExchangeModesExtension{[]uint8{ //psk_key_exchange_modes
  859. PskModeDHE,
  860. }},
  861. &FakeRecordSizeLimitExtension{Limit: 0x4001}, //record_size_limit
  862. &UtlsPaddingExtension{GetPaddingLen: BoringPaddingStyle}, //padding
  863. }}, nil
  864. case HelloIOS_11_1:
  865. return ClientHelloSpec{
  866. TLSVersMax: VersionTLS12,
  867. TLSVersMin: VersionTLS10,
  868. CipherSuites: []uint16{
  869. TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  870. TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  871. DISABLED_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
  872. TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
  873. TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
  874. TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
  875. TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
  876. TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
  877. TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  878. DISABLED_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
  879. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
  880. TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
  881. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
  882. TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
  883. TLS_RSA_WITH_AES_256_GCM_SHA384,
  884. TLS_RSA_WITH_AES_128_GCM_SHA256,
  885. DISABLED_TLS_RSA_WITH_AES_256_CBC_SHA256,
  886. TLS_RSA_WITH_AES_128_CBC_SHA256,
  887. TLS_RSA_WITH_AES_256_CBC_SHA,
  888. TLS_RSA_WITH_AES_128_CBC_SHA,
  889. },
  890. CompressionMethods: []byte{
  891. compressionNone,
  892. },
  893. Extensions: []TLSExtension{
  894. &RenegotiationInfoExtension{Renegotiation: RenegotiateOnceAsClient},
  895. &SNIExtension{},
  896. &UtlsExtendedMasterSecretExtension{},
  897. &SignatureAlgorithmsExtension{SupportedSignatureAlgorithms: []SignatureScheme{
  898. ECDSAWithP256AndSHA256,
  899. PSSWithSHA256,
  900. PKCS1WithSHA256,
  901. ECDSAWithP384AndSHA384,
  902. PSSWithSHA384,
  903. PKCS1WithSHA384,
  904. PSSWithSHA512,
  905. PKCS1WithSHA512,
  906. PKCS1WithSHA1,
  907. }},
  908. &StatusRequestExtension{},
  909. &NPNExtension{},
  910. &SCTExtension{},
  911. &ALPNExtension{AlpnProtocols: []string{"h2", "h2-16", "h2-15", "h2-14", "spdy/3.1", "spdy/3", "http/1.1"}},
  912. &SupportedPointsExtension{SupportedPoints: []byte{
  913. pointFormatUncompressed,
  914. }},
  915. &SupportedCurvesExtension{Curves: []CurveID{
  916. X25519,
  917. CurveP256,
  918. CurveP384,
  919. CurveP521,
  920. }},
  921. },
  922. }, nil
  923. case HelloIOS_12_1:
  924. return ClientHelloSpec{
  925. CipherSuites: []uint16{
  926. TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  927. TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  928. DISABLED_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
  929. TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
  930. TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
  931. TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
  932. TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
  933. TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
  934. TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  935. DISABLED_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
  936. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
  937. TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
  938. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
  939. TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
  940. TLS_RSA_WITH_AES_256_GCM_SHA384,
  941. TLS_RSA_WITH_AES_128_GCM_SHA256,
  942. DISABLED_TLS_RSA_WITH_AES_256_CBC_SHA256,
  943. TLS_RSA_WITH_AES_128_CBC_SHA256,
  944. TLS_RSA_WITH_AES_256_CBC_SHA,
  945. TLS_RSA_WITH_AES_128_CBC_SHA,
  946. 0xc008,
  947. TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
  948. TLS_RSA_WITH_3DES_EDE_CBC_SHA,
  949. },
  950. CompressionMethods: []byte{
  951. compressionNone,
  952. },
  953. Extensions: []TLSExtension{
  954. &RenegotiationInfoExtension{Renegotiation: RenegotiateOnceAsClient},
  955. &SNIExtension{},
  956. &UtlsExtendedMasterSecretExtension{},
  957. &SignatureAlgorithmsExtension{SupportedSignatureAlgorithms: []SignatureScheme{
  958. ECDSAWithP256AndSHA256,
  959. PSSWithSHA256,
  960. PKCS1WithSHA256,
  961. ECDSAWithP384AndSHA384,
  962. ECDSAWithSHA1,
  963. PSSWithSHA384,
  964. PSSWithSHA384,
  965. PKCS1WithSHA384,
  966. PSSWithSHA512,
  967. PKCS1WithSHA512,
  968. PKCS1WithSHA1,
  969. }},
  970. &StatusRequestExtension{},
  971. &NPNExtension{},
  972. &SCTExtension{},
  973. &ALPNExtension{AlpnProtocols: []string{"h2", "h2-16", "h2-15", "h2-14", "spdy/3.1", "spdy/3", "http/1.1"}},
  974. &SupportedPointsExtension{SupportedPoints: []byte{
  975. pointFormatUncompressed,
  976. }},
  977. &SupportedCurvesExtension{[]CurveID{
  978. X25519,
  979. CurveP256,
  980. CurveP384,
  981. CurveP521,
  982. }},
  983. },
  984. }, nil
  985. case HelloIOS_13:
  986. return ClientHelloSpec{
  987. CipherSuites: []uint16{
  988. TLS_AES_128_GCM_SHA256,
  989. TLS_AES_256_GCM_SHA384,
  990. TLS_CHACHA20_POLY1305_SHA256,
  991. TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  992. TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  993. DISABLED_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
  994. TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
  995. TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
  996. TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
  997. TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
  998. TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
  999. TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  1000. DISABLED_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
  1001. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
  1002. TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
  1003. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
  1004. TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
  1005. TLS_RSA_WITH_AES_256_GCM_SHA384,
  1006. TLS_RSA_WITH_AES_128_GCM_SHA256,
  1007. DISABLED_TLS_RSA_WITH_AES_256_CBC_SHA256,
  1008. TLS_RSA_WITH_AES_128_CBC_SHA256,
  1009. TLS_RSA_WITH_AES_256_CBC_SHA,
  1010. TLS_RSA_WITH_AES_128_CBC_SHA,
  1011. 0xc008,
  1012. TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
  1013. TLS_RSA_WITH_3DES_EDE_CBC_SHA,
  1014. },
  1015. CompressionMethods: []byte{
  1016. 0x00, // compressionNone
  1017. },
  1018. Extensions: []TLSExtension{
  1019. &RenegotiationInfoExtension{Renegotiation: RenegotiateOnceAsClient},
  1020. &SNIExtension{},
  1021. &UtlsExtendedMasterSecretExtension{},
  1022. &SignatureAlgorithmsExtension{SupportedSignatureAlgorithms: []SignatureScheme{
  1023. ECDSAWithP256AndSHA256,
  1024. PSSWithSHA256,
  1025. PKCS1WithSHA256,
  1026. ECDSAWithP384AndSHA384,
  1027. ECDSAWithSHA1,
  1028. PSSWithSHA384,
  1029. PSSWithSHA384,
  1030. PKCS1WithSHA384,
  1031. PSSWithSHA512,
  1032. PKCS1WithSHA512,
  1033. PKCS1WithSHA1,
  1034. }},
  1035. &StatusRequestExtension{},
  1036. &SCTExtension{},
  1037. &ALPNExtension{AlpnProtocols: []string{"h2", "http/1.1"}},
  1038. &SupportedPointsExtension{SupportedPoints: []byte{
  1039. 0x00, // pointFormatUncompressed
  1040. }},
  1041. &KeyShareExtension{[]KeyShare{
  1042. {Group: X25519},
  1043. }},
  1044. &PSKKeyExchangeModesExtension{[]uint8{
  1045. PskModeDHE,
  1046. }},
  1047. &SupportedVersionsExtension{[]uint16{
  1048. VersionTLS13,
  1049. VersionTLS12,
  1050. VersionTLS11,
  1051. VersionTLS10,
  1052. }},
  1053. &SupportedCurvesExtension{[]CurveID{
  1054. X25519,
  1055. CurveP256,
  1056. CurveP384,
  1057. CurveP521,
  1058. }},
  1059. &UtlsPaddingExtension{GetPaddingLen: BoringPaddingStyle},
  1060. },
  1061. }, nil
  1062. case HelloIOS_14:
  1063. return ClientHelloSpec{
  1064. // TLSVersMax: VersionTLS12,
  1065. // TLSVersMin: VersionTLS10,
  1066. CipherSuites: []uint16{
  1067. GREASE_PLACEHOLDER,
  1068. TLS_AES_128_GCM_SHA256,
  1069. TLS_AES_256_GCM_SHA384,
  1070. TLS_CHACHA20_POLY1305_SHA256,
  1071. TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  1072. TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  1073. TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
  1074. TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
  1075. TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  1076. TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
  1077. DISABLED_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
  1078. TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
  1079. TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
  1080. TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
  1081. DISABLED_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
  1082. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
  1083. TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
  1084. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
  1085. TLS_RSA_WITH_AES_256_GCM_SHA384,
  1086. TLS_RSA_WITH_AES_128_GCM_SHA256,
  1087. DISABLED_TLS_RSA_WITH_AES_256_CBC_SHA256,
  1088. TLS_RSA_WITH_AES_128_CBC_SHA256,
  1089. TLS_RSA_WITH_AES_256_CBC_SHA,
  1090. TLS_RSA_WITH_AES_128_CBC_SHA,
  1091. 0xc008,
  1092. TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
  1093. TLS_RSA_WITH_3DES_EDE_CBC_SHA,
  1094. },
  1095. CompressionMethods: []byte{
  1096. 0x00, // compressionNone
  1097. },
  1098. Extensions: []TLSExtension{
  1099. &UtlsGREASEExtension{},
  1100. &SNIExtension{},
  1101. &UtlsExtendedMasterSecretExtension{},
  1102. &RenegotiationInfoExtension{Renegotiation: RenegotiateOnceAsClient},
  1103. &SupportedCurvesExtension{[]CurveID{
  1104. CurveID(GREASE_PLACEHOLDER),
  1105. X25519,
  1106. CurveP256,
  1107. CurveP384,
  1108. CurveP521,
  1109. }},
  1110. &SupportedPointsExtension{SupportedPoints: []byte{
  1111. 0x00, // pointFormatUncompressed
  1112. }},
  1113. &ALPNExtension{AlpnProtocols: []string{"h2", "http/1.1"}},
  1114. &StatusRequestExtension{},
  1115. &SignatureAlgorithmsExtension{SupportedSignatureAlgorithms: []SignatureScheme{
  1116. ECDSAWithP256AndSHA256,
  1117. PSSWithSHA256,
  1118. PKCS1WithSHA256,
  1119. ECDSAWithP384AndSHA384,
  1120. ECDSAWithSHA1,
  1121. PSSWithSHA384,
  1122. PSSWithSHA384,
  1123. PKCS1WithSHA384,
  1124. PSSWithSHA512,
  1125. PKCS1WithSHA512,
  1126. PKCS1WithSHA1,
  1127. }},
  1128. &SCTExtension{},
  1129. &KeyShareExtension{[]KeyShare{
  1130. {Group: CurveID(GREASE_PLACEHOLDER), Data: []byte{0}},
  1131. {Group: X25519},
  1132. }},
  1133. &PSKKeyExchangeModesExtension{[]uint8{
  1134. PskModeDHE,
  1135. }},
  1136. &SupportedVersionsExtension{[]uint16{
  1137. GREASE_PLACEHOLDER,
  1138. VersionTLS13,
  1139. VersionTLS12,
  1140. VersionTLS11,
  1141. VersionTLS10,
  1142. }},
  1143. &UtlsGREASEExtension{},
  1144. &UtlsPaddingExtension{GetPaddingLen: BoringPaddingStyle},
  1145. },
  1146. }, nil
  1147. case HelloAndroid_11_OkHttp:
  1148. return ClientHelloSpec{
  1149. CipherSuites: []uint16{
  1150. TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  1151. TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  1152. 0xcca9, // Cipher Suite: TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 (0xcca9)
  1153. TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  1154. TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
  1155. 0xcca8, // Cipher Suite: TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (0xcca8)
  1156. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
  1157. TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
  1158. TLS_RSA_WITH_AES_128_GCM_SHA256,
  1159. TLS_RSA_WITH_AES_256_GCM_SHA384,
  1160. TLS_RSA_WITH_AES_128_CBC_SHA,
  1161. TLS_RSA_WITH_AES_256_CBC_SHA,
  1162. },
  1163. CompressionMethods: []byte{
  1164. 0x00, // compressionNone
  1165. },
  1166. Extensions: []TLSExtension{
  1167. &SNIExtension{},
  1168. &UtlsExtendedMasterSecretExtension{},
  1169. &RenegotiationInfoExtension{},
  1170. // supported_groups
  1171. &SupportedCurvesExtension{[]CurveID{
  1172. X25519,
  1173. CurveP256,
  1174. CurveP384,
  1175. }},
  1176. &SupportedPointsExtension{SupportedPoints: []byte{
  1177. 0x00, // pointFormatUncompressed
  1178. }},
  1179. &StatusRequestExtension{},
  1180. &SignatureAlgorithmsExtension{SupportedSignatureAlgorithms: []SignatureScheme{
  1181. ECDSAWithP256AndSHA256,
  1182. PSSWithSHA256,
  1183. PKCS1WithSHA256,
  1184. ECDSAWithP384AndSHA384,
  1185. PSSWithSHA384,
  1186. PKCS1WithSHA384,
  1187. PSSWithSHA512,
  1188. PKCS1WithSHA512,
  1189. PKCS1WithSHA1,
  1190. }},
  1191. },
  1192. }, nil
  1193. default:
  1194. return ClientHelloSpec{}, errors.New("ClientHello ID " + id.Str() + " is unknown")
  1195. }
  1196. }
  1197. func (uconn *UConn) applyPresetByID(id ClientHelloID) (err error) {
  1198. var spec ClientHelloSpec
  1199. uconn.ClientHelloID = id
  1200. // choose/generate the spec
  1201. switch id.Client {
  1202. case helloRandomized, helloRandomizedNoALPN, helloRandomizedALPN:
  1203. spec, err = uconn.generateRandomizedSpec()
  1204. if err != nil {
  1205. return err
  1206. }
  1207. case helloCustom:
  1208. return nil
  1209. default:
  1210. spec, err = utlsIdToSpec(id)
  1211. if err != nil {
  1212. return err
  1213. }
  1214. }
  1215. return uconn.ApplyPreset(&spec)
  1216. }
  1217. // ApplyPreset should only be used in conjunction with HelloCustom to apply custom specs.
  1218. // Fields of TLSExtensions that are slices/pointers are shared across different connections with
  1219. // same ClientHelloSpec. It is advised to use different specs and avoid any shared state.
  1220. func (uconn *UConn) ApplyPreset(p *ClientHelloSpec) error {
  1221. var err error
  1222. err = uconn.SetTLSVers(p.TLSVersMin, p.TLSVersMax, p.Extensions)
  1223. if err != nil {
  1224. return err
  1225. }
  1226. privateHello, ecdheParams, err := uconn.makeClientHello()
  1227. if err != nil {
  1228. return err
  1229. }
  1230. uconn.HandshakeState.Hello = privateHello.getPublicPtr()
  1231. uconn.HandshakeState.State13.EcdheParams = ecdheParams
  1232. hello := uconn.HandshakeState.Hello
  1233. session := uconn.HandshakeState.Session
  1234. switch len(hello.Random) {
  1235. case 0:
  1236. hello.Random = make([]byte, 32)
  1237. _, err := io.ReadFull(uconn.config.rand(), hello.Random)
  1238. if err != nil {
  1239. return errors.New("tls: short read from Rand: " + err.Error())
  1240. }
  1241. case 32:
  1242. // carry on
  1243. default:
  1244. return errors.New("ClientHello expected length: 32 bytes. Got: " +
  1245. strconv.Itoa(len(hello.Random)) + " bytes")
  1246. }
  1247. if len(hello.CipherSuites) == 0 {
  1248. hello.CipherSuites = defaultCipherSuites()
  1249. }
  1250. if len(hello.CompressionMethods) == 0 {
  1251. hello.CompressionMethods = []uint8{compressionNone}
  1252. }
  1253. // Currently, GREASE is assumed to come from BoringSSL
  1254. grease_bytes := make([]byte, 2*ssl_grease_last_index)
  1255. grease_extensions_seen := 0
  1256. _, err = io.ReadFull(uconn.config.rand(), grease_bytes)
  1257. if err != nil {
  1258. return errors.New("tls: short read from Rand: " + err.Error())
  1259. }
  1260. for i := range uconn.greaseSeed {
  1261. uconn.greaseSeed[i] = binary.LittleEndian.Uint16(grease_bytes[2*i : 2*i+2])
  1262. }
  1263. if GetBoringGREASEValue(uconn.greaseSeed, ssl_grease_extension1) == GetBoringGREASEValue(uconn.greaseSeed, ssl_grease_extension2) {
  1264. uconn.greaseSeed[ssl_grease_extension2] ^= 0x1010
  1265. }
  1266. hello.CipherSuites = make([]uint16, len(p.CipherSuites))
  1267. copy(hello.CipherSuites, p.CipherSuites)
  1268. for i := range hello.CipherSuites {
  1269. if hello.CipherSuites[i] == GREASE_PLACEHOLDER {
  1270. hello.CipherSuites[i] = GetBoringGREASEValue(uconn.greaseSeed, ssl_grease_cipher)
  1271. }
  1272. }
  1273. uconn.GetSessionID = p.GetSessionID
  1274. uconn.Extensions = make([]TLSExtension, len(p.Extensions))
  1275. copy(uconn.Extensions, p.Extensions)
  1276. // Check whether NPN extension actually exists
  1277. var haveNPN bool
  1278. // reGrease, and point things to each other
  1279. for _, e := range uconn.Extensions {
  1280. switch ext := e.(type) {
  1281. case *SNIExtension:
  1282. if ext.ServerName == "" {
  1283. ext.ServerName = uconn.config.ServerName
  1284. }
  1285. case *UtlsGREASEExtension:
  1286. switch grease_extensions_seen {
  1287. case 0:
  1288. ext.Value = GetBoringGREASEValue(uconn.greaseSeed, ssl_grease_extension1)
  1289. case 1:
  1290. ext.Value = GetBoringGREASEValue(uconn.greaseSeed, ssl_grease_extension2)
  1291. ext.Body = []byte{0}
  1292. default:
  1293. return errors.New("at most 2 grease extensions are supported")
  1294. }
  1295. grease_extensions_seen += 1
  1296. case *SessionTicketExtension:
  1297. if session == nil && uconn.config.ClientSessionCache != nil {
  1298. cacheKey := clientSessionCacheKey(uconn.RemoteAddr(), uconn.config)
  1299. session, _ = uconn.config.ClientSessionCache.Get(cacheKey)
  1300. // TODO: use uconn.loadSession(hello.getPrivateObj()) to support TLS 1.3 PSK-style resumption
  1301. }
  1302. err := uconn.SetSessionState(session)
  1303. if err != nil {
  1304. return err
  1305. }
  1306. case *SupportedCurvesExtension:
  1307. for i := range ext.Curves {
  1308. if ext.Curves[i] == GREASE_PLACEHOLDER {
  1309. ext.Curves[i] = CurveID(GetBoringGREASEValue(uconn.greaseSeed, ssl_grease_group))
  1310. }
  1311. }
  1312. case *KeyShareExtension:
  1313. preferredCurveIsSet := false
  1314. for i := range ext.KeyShares {
  1315. curveID := ext.KeyShares[i].Group
  1316. if curveID == GREASE_PLACEHOLDER {
  1317. ext.KeyShares[i].Group = CurveID(GetBoringGREASEValue(uconn.greaseSeed, ssl_grease_group))
  1318. continue
  1319. }
  1320. if len(ext.KeyShares[i].Data) > 1 {
  1321. continue
  1322. }
  1323. ecdheParams, err := generateECDHEParameters(uconn.config.rand(), curveID)
  1324. if err != nil {
  1325. return fmt.Errorf("unsupported Curve in KeyShareExtension: %v."+
  1326. "To mimic it, fill the Data(key) field manually.", curveID)
  1327. }
  1328. ext.KeyShares[i].Data = ecdheParams.PublicKey()
  1329. if !preferredCurveIsSet {
  1330. // only do this once for the first non-grease curve
  1331. uconn.HandshakeState.State13.EcdheParams = ecdheParams
  1332. preferredCurveIsSet = true
  1333. }
  1334. }
  1335. case *SupportedVersionsExtension:
  1336. for i := range ext.Versions {
  1337. if ext.Versions[i] == GREASE_PLACEHOLDER {
  1338. ext.Versions[i] = GetBoringGREASEValue(uconn.greaseSeed, ssl_grease_version)
  1339. }
  1340. }
  1341. case *NPNExtension:
  1342. haveNPN = true
  1343. }
  1344. }
  1345. // The default golang behavior in makeClientHello always sets NextProtoNeg if NextProtos is set,
  1346. // but NextProtos is also used by ALPN and our spec nmay not actually have a NPN extension
  1347. hello.NextProtoNeg = haveNPN
  1348. return nil
  1349. }
  1350. func (uconn *UConn) generateRandomizedSpec() (ClientHelloSpec, error) {
  1351. p := ClientHelloSpec{}
  1352. if uconn.ClientHelloID.Seed == nil {
  1353. seed, err := NewPRNGSeed()
  1354. if err != nil {
  1355. return p, err
  1356. }
  1357. uconn.ClientHelloID.Seed = seed
  1358. }
  1359. r, err := newPRNGWithSeed(uconn.ClientHelloID.Seed)
  1360. if err != nil {
  1361. return p, err
  1362. }
  1363. id := uconn.ClientHelloID
  1364. var WithALPN bool
  1365. switch id.Client {
  1366. case helloRandomizedALPN:
  1367. WithALPN = true
  1368. case helloRandomizedNoALPN:
  1369. WithALPN = false
  1370. case helloRandomized:
  1371. if r.FlipWeightedCoin(0.7) {
  1372. WithALPN = true
  1373. } else {
  1374. WithALPN = false
  1375. }
  1376. default:
  1377. return p, fmt.Errorf("using non-randomized ClientHelloID %v to generate randomized spec", id.Client)
  1378. }
  1379. p.CipherSuites = make([]uint16, len(defaultCipherSuites()))
  1380. copy(p.CipherSuites, defaultCipherSuites())
  1381. shuffledSuites, err := shuffledCiphers(r)
  1382. if err != nil {
  1383. return p, err
  1384. }
  1385. if r.FlipWeightedCoin(0.4) {
  1386. p.TLSVersMin = VersionTLS10
  1387. p.TLSVersMax = VersionTLS13
  1388. tls13ciphers := make([]uint16, len(defaultCipherSuitesTLS13()))
  1389. copy(tls13ciphers, defaultCipherSuitesTLS13())
  1390. r.rand.Shuffle(len(tls13ciphers), func(i, j int) {
  1391. tls13ciphers[i], tls13ciphers[j] = tls13ciphers[j], tls13ciphers[i]
  1392. })
  1393. // appending TLS 1.3 ciphers before TLS 1.2, since that's what popular implementations do
  1394. shuffledSuites = append(tls13ciphers, shuffledSuites...)
  1395. // TLS 1.3 forbids RC4 in any configurations
  1396. shuffledSuites = removeRC4Ciphers(shuffledSuites)
  1397. } else {
  1398. p.TLSVersMin = VersionTLS10
  1399. p.TLSVersMax = VersionTLS12
  1400. }
  1401. p.CipherSuites = removeRandomCiphers(r, shuffledSuites, 0.4)
  1402. sni := SNIExtension{uconn.config.ServerName}
  1403. sessionTicket := SessionTicketExtension{Session: uconn.HandshakeState.Session}
  1404. sigAndHashAlgos := []SignatureScheme{
  1405. ECDSAWithP256AndSHA256,
  1406. PKCS1WithSHA256,
  1407. ECDSAWithP384AndSHA384,
  1408. PKCS1WithSHA384,
  1409. PKCS1WithSHA1,
  1410. PKCS1WithSHA512,
  1411. }
  1412. if r.FlipWeightedCoin(0.63) {
  1413. sigAndHashAlgos = append(sigAndHashAlgos, ECDSAWithSHA1)
  1414. }
  1415. if r.FlipWeightedCoin(0.59) {
  1416. sigAndHashAlgos = append(sigAndHashAlgos, ECDSAWithP521AndSHA512)
  1417. }
  1418. if r.FlipWeightedCoin(0.51) || p.TLSVersMax == VersionTLS13 {
  1419. // https://tools.ietf.org/html/rfc8446 says "...RSASSA-PSS (which is mandatory in TLS 1.3)..."
  1420. sigAndHashAlgos = append(sigAndHashAlgos, PSSWithSHA256)
  1421. if r.FlipWeightedCoin(0.9) {
  1422. // these usually go together
  1423. sigAndHashAlgos = append(sigAndHashAlgos, PSSWithSHA384)
  1424. sigAndHashAlgos = append(sigAndHashAlgos, PSSWithSHA512)
  1425. }
  1426. }
  1427. r.rand.Shuffle(len(sigAndHashAlgos), func(i, j int) {
  1428. sigAndHashAlgos[i], sigAndHashAlgos[j] = sigAndHashAlgos[j], sigAndHashAlgos[i]
  1429. })
  1430. sigAndHash := SignatureAlgorithmsExtension{SupportedSignatureAlgorithms: sigAndHashAlgos}
  1431. status := StatusRequestExtension{}
  1432. sct := SCTExtension{}
  1433. ems := UtlsExtendedMasterSecretExtension{}
  1434. points := SupportedPointsExtension{SupportedPoints: []byte{pointFormatUncompressed}}
  1435. curveIDs := []CurveID{}
  1436. if r.FlipWeightedCoin(0.71) || p.TLSVersMax == VersionTLS13 {
  1437. curveIDs = append(curveIDs, X25519)
  1438. }
  1439. curveIDs = append(curveIDs, CurveP256, CurveP384)
  1440. if r.FlipWeightedCoin(0.46) {
  1441. curveIDs = append(curveIDs, CurveP521)
  1442. }
  1443. curves := SupportedCurvesExtension{curveIDs}
  1444. padding := UtlsPaddingExtension{GetPaddingLen: BoringPaddingStyle}
  1445. reneg := RenegotiationInfoExtension{Renegotiation: RenegotiateOnceAsClient}
  1446. p.Extensions = []TLSExtension{
  1447. &sni,
  1448. &sessionTicket,
  1449. &sigAndHash,
  1450. &points,
  1451. &curves,
  1452. }
  1453. if WithALPN {
  1454. if len(uconn.config.NextProtos) == 0 {
  1455. // if user didn't specify alpn yet, choose something popular
  1456. uconn.config.NextProtos = []string{"h2", "http/1.1"}
  1457. }
  1458. alpn := ALPNExtension{AlpnProtocols: uconn.config.NextProtos}
  1459. p.Extensions = append(p.Extensions, &alpn)
  1460. }
  1461. if r.FlipWeightedCoin(0.62) || p.TLSVersMax == VersionTLS13 {
  1462. // always include for TLS 1.3, since TLS 1.3 ClientHellos are often over 256 bytes
  1463. // and that's when padding is required to work around buggy middleboxes
  1464. p.Extensions = append(p.Extensions, &padding)
  1465. }
  1466. if r.FlipWeightedCoin(0.74) {
  1467. p.Extensions = append(p.Extensions, &status)
  1468. }
  1469. if r.FlipWeightedCoin(0.46) {
  1470. p.Extensions = append(p.Extensions, &sct)
  1471. }
  1472. if r.FlipWeightedCoin(0.75) {
  1473. p.Extensions = append(p.Extensions, &reneg)
  1474. }
  1475. if r.FlipWeightedCoin(0.77) {
  1476. p.Extensions = append(p.Extensions, &ems)
  1477. }
  1478. if p.TLSVersMax == VersionTLS13 {
  1479. ks := KeyShareExtension{[]KeyShare{
  1480. {Group: X25519}, // the key for the group will be generated later
  1481. }}
  1482. if r.FlipWeightedCoin(0.25) {
  1483. // do not ADD second keyShare because crypto/tls does not support multiple ecdheParams
  1484. // TODO: add it back when they implement multiple keyShares, or implement it oursevles
  1485. // ks.KeyShares = append(ks.KeyShares, KeyShare{Group: CurveP256})
  1486. ks.KeyShares[0].Group = CurveP256
  1487. }
  1488. pskExchangeModes := PSKKeyExchangeModesExtension{[]uint8{pskModeDHE}}
  1489. supportedVersionsExt := SupportedVersionsExtension{
  1490. Versions: makeSupportedVersions(p.TLSVersMin, p.TLSVersMax),
  1491. }
  1492. p.Extensions = append(p.Extensions, &ks, &pskExchangeModes, &supportedVersionsExt)
  1493. // Randomly add an ALPS extension. ALPS is TLS 1.3-only and may only
  1494. // appear when an ALPN extension is present
  1495. // (https://datatracker.ietf.org/doc/html/draft-vvv-tls-alps-01#section-3).
  1496. // ALPS is a draft specification at this time, but appears in
  1497. // Chrome/BoringSSL.
  1498. if WithALPN {
  1499. // ALPS is a new addition to generateRandomizedSpec. Use a salted
  1500. // seed to create a new, independent PRNG, so that a seed used
  1501. // with the previous version of generateRandomizedSpec will
  1502. // produce the exact same spec as long as ALPS isn't selected.
  1503. r, err := newPRNGWithSaltedSeed(uconn.ClientHelloID.Seed, "ALPS")
  1504. if err != nil {
  1505. return p, err
  1506. }
  1507. if r.FlipWeightedCoin(0.33) {
  1508. // As with the ALPN case above, default to something popular
  1509. // (unlike ALPN, ALPS can't yet be specified in uconn.config).
  1510. alps := &ApplicationSettingsExtension{SupportedProtocols: []string{"h2"}}
  1511. p.Extensions = append(p.Extensions, alps)
  1512. }
  1513. }
  1514. // TODO: randomly add DelegatedCredentialsExtension, once it is
  1515. // sufficiently popular.
  1516. }
  1517. r.rand.Shuffle(len(p.Extensions), func(i, j int) {
  1518. p.Extensions[i], p.Extensions[j] = p.Extensions[j], p.Extensions[i]
  1519. })
  1520. return p, nil
  1521. }
  1522. func removeRandomCiphers(r *prng, s []uint16, maxRemovalProbability float64) []uint16 {
  1523. // removes elements in place
  1524. // probability to remove increases for further elements
  1525. // never remove first cipher
  1526. if len(s) <= 1 {
  1527. return s
  1528. }
  1529. // remove random elements
  1530. floatLen := float64(len(s))
  1531. sliceLen := len(s)
  1532. for i := 1; i < sliceLen; i++ {
  1533. if r.FlipWeightedCoin(maxRemovalProbability * float64(i) / floatLen) {
  1534. s = append(s[:i], s[i+1:]...)
  1535. sliceLen--
  1536. i--
  1537. }
  1538. }
  1539. return s[:sliceLen]
  1540. }
  1541. func shuffledCiphers(r *prng) ([]uint16, error) {
  1542. ciphers := make(sortableCiphers, len(cipherSuites))
  1543. perm := r.Perm(len(cipherSuites))
  1544. for i, suite := range cipherSuites {
  1545. ciphers[i] = sortableCipher{suite: suite.id,
  1546. isObsolete: ((suite.flags & suiteTLS12) == 0),
  1547. randomTag: perm[i]}
  1548. }
  1549. sort.Sort(ciphers)
  1550. return ciphers.GetCiphers(), nil
  1551. }
  1552. type sortableCipher struct {
  1553. isObsolete bool
  1554. randomTag int
  1555. suite uint16
  1556. }
  1557. type sortableCiphers []sortableCipher
  1558. func (ciphers sortableCiphers) Len() int {
  1559. return len(ciphers)
  1560. }
  1561. func (ciphers sortableCiphers) Less(i, j int) bool {
  1562. if ciphers[i].isObsolete && !ciphers[j].isObsolete {
  1563. return false
  1564. }
  1565. if ciphers[j].isObsolete && !ciphers[i].isObsolete {
  1566. return true
  1567. }
  1568. return ciphers[i].randomTag < ciphers[j].randomTag
  1569. }
  1570. func (ciphers sortableCiphers) Swap(i, j int) {
  1571. ciphers[i], ciphers[j] = ciphers[j], ciphers[i]
  1572. }
  1573. func (ciphers sortableCiphers) GetCiphers() []uint16 {
  1574. cipherIDs := make([]uint16, len(ciphers))
  1575. for i := range ciphers {
  1576. cipherIDs[i] = ciphers[i].suite
  1577. }
  1578. return cipherIDs
  1579. }
  1580. func removeRC4Ciphers(s []uint16) []uint16 {
  1581. // removes elements in place
  1582. sliceLen := len(s)
  1583. for i := 0; i < sliceLen; i++ {
  1584. cipher := s[i]
  1585. if cipher == TLS_ECDHE_ECDSA_WITH_RC4_128_SHA ||
  1586. cipher == TLS_ECDHE_RSA_WITH_RC4_128_SHA ||
  1587. cipher == TLS_RSA_WITH_RC4_128_SHA {
  1588. s = append(s[:i], s[i+1:]...)
  1589. sliceLen--
  1590. i--
  1591. }
  1592. }
  1593. return s[:sliceLen]
  1594. }