u_parrots.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737
  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/rand"
  7. "crypto/sha256"
  8. "errors"
  9. "io"
  10. "math/big"
  11. "sort"
  12. "strconv"
  13. "time"
  14. )
  15. func (uconn *UConn) generateClientHelloConfig(id ClientHelloID) error {
  16. uconn.clientHelloID = id
  17. switch uconn.clientHelloID {
  18. case HelloFirefox_56:
  19. fallthrough
  20. case HelloFirefox_55:
  21. return uconn.parrotFirefox_55()
  22. case HelloAndroid_6_0_Browser:
  23. return uconn.parrotAndroid_6_0()
  24. case HelloAndroid_5_1_Browser:
  25. return uconn.parrotAndroid_5_1()
  26. case HelloChrome_62:
  27. fallthrough
  28. case HelloChrome_58:
  29. return uconn.parrotChrome_5x(false)
  30. case HelloChrome_57:
  31. return uconn.parrotChrome_5x(true)
  32. case HelloiOSSafari_11_3_1:
  33. return uconn.parrotiOSSafari_11_3_1()
  34. case HelloRandomizedALPN:
  35. return uconn.parrotRandomizedALPN()
  36. case HelloRandomizedNoALPN:
  37. return uconn.parrotRandomizedNoALPN()
  38. case HelloCustom:
  39. return uconn.parrotCustom()
  40. // following ClientHello's are aliases, so we call generateClientHelloConfig() again to set the correct id
  41. case HelloRandomized:
  42. if tossBiasedCoin(0.5) {
  43. return uconn.generateClientHelloConfig(HelloRandomizedALPN)
  44. } else {
  45. return uconn.generateClientHelloConfig(HelloRandomizedNoALPN)
  46. }
  47. case HelloAndroid_Auto:
  48. return uconn.generateClientHelloConfig(HelloAndroid_6_0_Browser)
  49. case HelloFirefox_Auto:
  50. return uconn.generateClientHelloConfig(HelloFirefox_56)
  51. case HelloChrome_Auto:
  52. return uconn.generateClientHelloConfig(HelloChrome_62)
  53. default:
  54. return errors.New("Unknown ParrotID: " + id.Str())
  55. }
  56. }
  57. // Fills clientHello header(everything but extensions) fields, which are not set explicitly yet, with defaults
  58. func (uconn *UConn) fillClientHelloHeader() error {
  59. hello := uconn.HandshakeState.Hello
  60. if hello.Vers == 0 {
  61. hello.Vers = VersionTLS12
  62. }
  63. switch len(hello.Random) {
  64. case 0:
  65. hello.Random = make([]byte, 32)
  66. _, err := io.ReadFull(uconn.config.rand(), hello.Random)
  67. if err != nil {
  68. return errors.New("tls: short read from Rand: " + err.Error())
  69. }
  70. case 32:
  71. // carry on
  72. default:
  73. return errors.New("ClientHello expected length: 32 bytes. Got: " +
  74. strconv.Itoa(len(hello.Random)) + " bytes")
  75. }
  76. if len(hello.CipherSuites) == 0 {
  77. hello.CipherSuites = defaultCipherSuites()
  78. }
  79. if len(hello.CompressionMethods) == 0 {
  80. hello.CompressionMethods = []uint8{compressionNone}
  81. }
  82. return nil
  83. }
  84. func (uconn *UConn) parrotFirefox_55() error {
  85. hello := uconn.HandshakeState.Hello
  86. session := uconn.HandshakeState.Session
  87. hello.CipherSuites = []uint16{
  88. TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  89. TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  90. TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
  91. TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
  92. TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  93. TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
  94. TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
  95. TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
  96. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
  97. TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
  98. FAKE_TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
  99. FAKE_TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
  100. TLS_RSA_WITH_AES_128_CBC_SHA,
  101. TLS_RSA_WITH_AES_256_CBC_SHA,
  102. TLS_RSA_WITH_3DES_EDE_CBC_SHA,
  103. }
  104. err := uconn.fillClientHelloHeader()
  105. if err != nil {
  106. return err
  107. }
  108. sni := SNIExtension{uconn.config.ServerName}
  109. ems := utlsExtendedMasterSecretExtension{}
  110. reneg := RenegotiationInfoExtension{renegotiation: RenegotiateOnceAsClient}
  111. curves := SupportedCurvesExtension{[]CurveID{X25519, CurveP256, CurveP384, CurveP521}}
  112. points := SupportedPointsExtension{SupportedPoints: []byte{pointFormatUncompressed}}
  113. sessionTicket := SessionTicketExtension{Session: session}
  114. if session != nil {
  115. sessionTicket.Session = session
  116. if len(session.SessionTicket()) > 0 {
  117. hello.SessionId = make([]byte, 32)
  118. _, err := io.ReadFull(uconn.config.rand(), hello.SessionId)
  119. if err != nil {
  120. return errors.New("tls: short read from Rand: " + err.Error())
  121. }
  122. }
  123. }
  124. alpn := ALPNExtension{AlpnProtocols: []string{"h2", "http/1.1"}}
  125. status := StatusRequestExtension{}
  126. sigAndHash := SignatureAlgorithmsExtension{SignatureAndHashes: []SignatureAndHash{
  127. {hashSHA256, signatureECDSA},
  128. {hashSHA384, signatureECDSA},
  129. {disabledHashSHA512, signatureECDSA},
  130. fakeRsaPssSha256,
  131. fakeRsaPssSha384,
  132. fakeRsaPssSha512,
  133. {hashSHA256, signatureRSA},
  134. {hashSHA384, signatureRSA},
  135. {disabledHashSHA512, signatureRSA},
  136. {hashSHA1, signatureECDSA},
  137. {hashSHA1, signatureRSA}},
  138. }
  139. padding := utlsPaddingExtension{GetPaddingLen: boringPaddingStyle}
  140. uconn.Extensions = []TLSExtension{
  141. &sni,
  142. &ems,
  143. &reneg,
  144. &curves,
  145. &points,
  146. &sessionTicket,
  147. &alpn,
  148. &status,
  149. &sigAndHash,
  150. &padding,
  151. }
  152. return nil
  153. }
  154. func (uconn *UConn) parrotAndroid_6_0() error {
  155. hello := uconn.HandshakeState.Hello
  156. session := uconn.HandshakeState.Session
  157. hello.CipherSuites = []uint16{
  158. OLD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,
  159. OLD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
  160. FAKE_OLD_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
  161. TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  162. TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  163. FAKE_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
  164. TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
  165. TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
  166. FAKE_TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
  167. TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
  168. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
  169. FAKE_TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
  170. TLS_RSA_WITH_AES_128_GCM_SHA256,
  171. TLS_RSA_WITH_AES_256_CBC_SHA,
  172. TLS_RSA_WITH_AES_128_CBC_SHA,
  173. TLS_RSA_WITH_3DES_EDE_CBC_SHA,
  174. FAKE_TLS_EMPTY_RENEGOTIATION_INFO_SCSV,
  175. }
  176. err := uconn.fillClientHelloHeader()
  177. if err != nil {
  178. return err
  179. }
  180. sni := SNIExtension{uconn.config.ServerName}
  181. ems := utlsExtendedMasterSecretExtension{}
  182. sessionTicket := SessionTicketExtension{Session: session}
  183. if session != nil {
  184. sessionTicket.Session = session
  185. if len(session.SessionTicket()) > 0 {
  186. sessionId := sha256.Sum256(session.SessionTicket())
  187. hello.SessionId = sessionId[:]
  188. }
  189. }
  190. sigAndHash := SignatureAlgorithmsExtension{SignatureAndHashes: []SignatureAndHash{
  191. {disabledHashSHA512, signatureRSA},
  192. {disabledHashSHA512, signatureECDSA},
  193. {hashSHA384, signatureRSA},
  194. {hashSHA384, signatureECDSA},
  195. {hashSHA256, signatureRSA},
  196. {hashSHA256, signatureECDSA},
  197. {fakeHashSHA224, signatureRSA},
  198. {fakeHashSHA224, signatureECDSA},
  199. {hashSHA1, signatureRSA},
  200. {hashSHA1, signatureECDSA}},
  201. }
  202. status := StatusRequestExtension{}
  203. npn := NPNExtension{}
  204. sct := SCTExtension{}
  205. alpn := ALPNExtension{AlpnProtocols: []string{"http/1.1", "spdy/8.1"}}
  206. points := SupportedPointsExtension{SupportedPoints: []byte{pointFormatUncompressed}}
  207. curves := SupportedCurvesExtension{[]CurveID{CurveP256, CurveP384}}
  208. padding := utlsPaddingExtension{GetPaddingLen: boringPaddingStyle}
  209. uconn.Extensions = []TLSExtension{
  210. &sni,
  211. &ems,
  212. &sessionTicket,
  213. &sigAndHash,
  214. &status,
  215. &npn,
  216. &sct,
  217. &alpn,
  218. &points,
  219. &curves,
  220. &padding,
  221. }
  222. return nil
  223. }
  224. func (uconn *UConn) parrotAndroid_5_1() error {
  225. hello := uconn.HandshakeState.Hello
  226. session := uconn.HandshakeState.Session
  227. hello.CipherSuites = []uint16{
  228. OLD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,
  229. OLD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
  230. FAKE_OLD_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
  231. TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  232. TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  233. FAKE_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
  234. TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
  235. TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
  236. FAKE_TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
  237. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
  238. TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
  239. FAKE_TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
  240. TLS_ECDHE_RSA_WITH_RC4_128_SHA,
  241. TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
  242. TLS_RSA_WITH_AES_128_GCM_SHA256,
  243. TLS_RSA_WITH_AES_256_CBC_SHA,
  244. TLS_RSA_WITH_AES_128_CBC_SHA,
  245. TLS_RSA_WITH_RC4_128_SHA,
  246. FAKE_TLS_RSA_WITH_RC4_128_MD5,
  247. TLS_RSA_WITH_3DES_EDE_CBC_SHA,
  248. FAKE_TLS_EMPTY_RENEGOTIATION_INFO_SCSV,
  249. }
  250. err := uconn.fillClientHelloHeader()
  251. if err != nil {
  252. return err
  253. }
  254. sni := SNIExtension{uconn.config.ServerName}
  255. sessionTicket := SessionTicketExtension{Session: session}
  256. if session != nil {
  257. sessionTicket.Session = session
  258. if len(session.SessionTicket()) > 0 {
  259. sessionId := sha256.Sum256(session.SessionTicket())
  260. hello.SessionId = sessionId[:]
  261. }
  262. }
  263. sigAndHash := SignatureAlgorithmsExtension{SignatureAndHashes: []SignatureAndHash{
  264. {disabledHashSHA512, signatureRSA},
  265. {disabledHashSHA512, signatureECDSA},
  266. {hashSHA384, signatureRSA},
  267. {hashSHA384, signatureECDSA},
  268. {hashSHA256, signatureRSA},
  269. {hashSHA256, signatureECDSA},
  270. {fakeHashSHA224, signatureRSA},
  271. {fakeHashSHA224, signatureECDSA},
  272. {hashSHA1, signatureRSA},
  273. {hashSHA1, signatureECDSA}},
  274. }
  275. status := StatusRequestExtension{}
  276. npn := NPNExtension{}
  277. sct := SCTExtension{}
  278. alpn := ALPNExtension{AlpnProtocols: []string{"http/1.1", "spdy/3", "spdy/3.1"}}
  279. points := SupportedPointsExtension{SupportedPoints: []byte{pointFormatUncompressed}}
  280. curves := SupportedCurvesExtension{[]CurveID{CurveP256, CurveP384, CurveP521}}
  281. padding := utlsPaddingExtension{GetPaddingLen: boringPaddingStyle}
  282. uconn.Extensions = []TLSExtension{
  283. &sni,
  284. &sessionTicket,
  285. &sigAndHash,
  286. &status,
  287. &npn,
  288. &sct,
  289. &alpn,
  290. &points,
  291. &curves,
  292. &padding,
  293. }
  294. return nil
  295. }
  296. func (uconn *UConn) parrotChrome_5x(includeNonStandardChaChaCiphers bool) error {
  297. hello := uconn.HandshakeState.Hello
  298. session := uconn.HandshakeState.Session
  299. err := uconn.fillClientHelloHeader()
  300. if err != nil {
  301. return err
  302. }
  303. if includeNonStandardChaChaCiphers {
  304. hello.CipherSuites = []uint16{
  305. GetBoringGREASEValue(hello.Random, ssl_grease_cipher),
  306. TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  307. TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  308. TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  309. TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
  310. TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
  311. TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
  312. OLD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
  313. OLD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,
  314. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
  315. TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
  316. TLS_RSA_WITH_AES_128_GCM_SHA256,
  317. TLS_RSA_WITH_AES_256_GCM_SHA384,
  318. TLS_RSA_WITH_AES_128_CBC_SHA,
  319. TLS_RSA_WITH_AES_256_CBC_SHA,
  320. TLS_RSA_WITH_3DES_EDE_CBC_SHA,
  321. }
  322. } else {
  323. hello.CipherSuites = []uint16{
  324. GetBoringGREASEValue(hello.Random, ssl_grease_cipher),
  325. TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  326. TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  327. TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  328. TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
  329. TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
  330. TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
  331. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
  332. TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
  333. TLS_RSA_WITH_AES_128_GCM_SHA256,
  334. TLS_RSA_WITH_AES_256_GCM_SHA384,
  335. TLS_RSA_WITH_AES_128_CBC_SHA,
  336. TLS_RSA_WITH_AES_256_CBC_SHA,
  337. TLS_RSA_WITH_3DES_EDE_CBC_SHA,
  338. }
  339. }
  340. grease_ext1 := GetBoringGREASEValue(hello.Random, ssl_grease_extension1)
  341. grease_ext2 := GetBoringGREASEValue(hello.Random, ssl_grease_extension2)
  342. if grease_ext1 == grease_ext2 {
  343. grease_ext2 ^= 0x1010
  344. }
  345. grease1 := FakeGREASEExtension{Value: grease_ext1}
  346. reneg := RenegotiationInfoExtension{renegotiation: RenegotiateOnceAsClient}
  347. sni := SNIExtension{uconn.config.ServerName}
  348. ems := utlsExtendedMasterSecretExtension{}
  349. sessionTicket := SessionTicketExtension{Session: session}
  350. if session != nil {
  351. sessionTicket.Session = session
  352. if len(session.SessionTicket()) > 0 {
  353. sessionId := sha256.Sum256(session.SessionTicket())
  354. hello.SessionId = sessionId[:]
  355. }
  356. }
  357. sigAndHash := SignatureAlgorithmsExtension{SignatureAndHashes: []SignatureAndHash{
  358. {hashSHA256, signatureECDSA},
  359. fakeRsaPssSha256,
  360. {hashSHA256, signatureRSA},
  361. {hashSHA384, signatureECDSA},
  362. fakeRsaPssSha384,
  363. {hashSHA384, signatureRSA},
  364. fakeRsaPssSha512,
  365. {disabledHashSHA512, signatureRSA},
  366. {hashSHA1, signatureRSA}},
  367. }
  368. status := StatusRequestExtension{}
  369. sct := SCTExtension{}
  370. alpn := ALPNExtension{AlpnProtocols: []string{"h2", "http/1.1"}}
  371. channelId := FakeChannelIDExtension{}
  372. points := SupportedPointsExtension{SupportedPoints: []byte{pointFormatUncompressed}}
  373. curves := SupportedCurvesExtension{[]CurveID{CurveID(GetBoringGREASEValue(hello.Random, ssl_grease_group)),
  374. X25519, CurveP256, CurveP384}}
  375. grease2 := FakeGREASEExtension{Value: grease_ext2, Body: []byte{0}}
  376. padding := utlsPaddingExtension{GetPaddingLen: boringPaddingStyle}
  377. uconn.Extensions = []TLSExtension{
  378. &grease1,
  379. &reneg,
  380. &sni,
  381. &ems,
  382. &sessionTicket,
  383. &sigAndHash,
  384. &status,
  385. &sct,
  386. &alpn,
  387. &channelId,
  388. &points,
  389. &curves,
  390. &grease2,
  391. &padding,
  392. }
  393. return nil
  394. }
  395. func (uconn *UConn) parrotiOSSafari_11_3_1() error {
  396. hello := uconn.HandshakeState.Hello
  397. session := uconn.HandshakeState.Session
  398. hello.CipherSuites = []uint16{
  399. TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
  400. TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
  401. DISABLED_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
  402. TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
  403. TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
  404. TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
  405. TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
  406. TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
  407. TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
  408. DISABLED_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
  409. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
  410. TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
  411. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
  412. TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
  413. TLS_RSA_WITH_AES_256_GCM_SHA384,
  414. TLS_RSA_WITH_AES_128_GCM_SHA256,
  415. DISABLED_TLS_RSA_WITH_AES_256_CBC_SHA256,
  416. TLS_RSA_WITH_AES_128_CBC_SHA256,
  417. TLS_RSA_WITH_AES_256_CBC_SHA,
  418. TLS_RSA_WITH_AES_128_CBC_SHA,
  419. }
  420. err := uconn.fillClientHelloHeader()
  421. if err != nil {
  422. return err
  423. }
  424. reneg := RenegotiationInfoExtension{renegotiation: RenegotiateOnceAsClient}
  425. sni := SNIExtension{uconn.config.ServerName}
  426. ems := utlsExtendedMasterSecretExtension{}
  427. sessionTicket := SessionTicketExtension{Session: session}
  428. if session != nil {
  429. sessionTicket.Session = session
  430. if len(session.SessionTicket()) > 0 {
  431. sessionId := sha256.Sum256(session.SessionTicket())
  432. hello.SessionId = sessionId[:]
  433. }
  434. }
  435. sigAndHash := SignatureAlgorithmsExtension{SignatureAndHashes: []SignatureAndHash{
  436. {hashSHA256, signatureECDSA},
  437. fakeRsaPssSha256,
  438. {hashSHA256, signatureRSA},
  439. {hashSHA384, signatureECDSA},
  440. fakeRsaPssSha384,
  441. {hashSHA384, signatureRSA},
  442. fakeRsaPssSha512,
  443. {disabledHashSHA512, signatureRSA},
  444. {hashSHA1, signatureRSA},
  445. },
  446. }
  447. status := StatusRequestExtension{}
  448. npn := NPNExtension{}
  449. sct := SCTExtension{}
  450. alpn := ALPNExtension{AlpnProtocols: []string{"h2", "h2-16", "h2-15", "h2-14", "spdy/3.1", "spdy/3", "http/1.1"}}
  451. points := SupportedPointsExtension{SupportedPoints: []byte{pointFormatUncompressed}}
  452. curves := SupportedCurvesExtension{[]CurveID{X25519, CurveP256, CurveP384, CurveP521}}
  453. uconn.Extensions = []TLSExtension{
  454. &reneg,
  455. &sni,
  456. &ems,
  457. &sessionTicket,
  458. &sigAndHash,
  459. &status,
  460. &npn,
  461. &sct,
  462. &alpn,
  463. &points,
  464. &curves,
  465. }
  466. return nil
  467. }
  468. func (uconn *UConn) parrotRandomizedALPN() error {
  469. err := uconn.parrotRandomizedNoALPN()
  470. if len(uconn.config.NextProtos) == 0 {
  471. // if user didn't specify alpn, choose something popular
  472. uconn.config.NextProtos = []string{"h2", "http/1.1"}
  473. }
  474. alpn := ALPNExtension{AlpnProtocols: uconn.config.NextProtos}
  475. uconn.Extensions = append(uconn.Extensions, &alpn)
  476. return err
  477. }
  478. func (uconn *UConn) parrotRandomizedNoALPN() error {
  479. hello := uconn.HandshakeState.Hello
  480. session := uconn.HandshakeState.Session
  481. hello.CipherSuites = make([]uint16, len(defaultCipherSuites()))
  482. copy(hello.CipherSuites, defaultCipherSuites())
  483. shuffledSuites, err := shuffledCiphers()
  484. if err != nil {
  485. return err
  486. }
  487. hello.CipherSuites = removeRandomCiphers(shuffledSuites, 0.4)
  488. err = uconn.fillClientHelloHeader()
  489. if err != nil {
  490. return err
  491. }
  492. sni := SNIExtension{uconn.config.ServerName}
  493. sessionTicket := SessionTicketExtension{Session: session}
  494. if session != nil {
  495. sessionTicket.Session = session
  496. if len(session.SessionTicket()) > 0 {
  497. sessionId := sha256.Sum256(session.SessionTicket())
  498. hello.SessionId = sessionId[:]
  499. }
  500. }
  501. sigAndHashAlgos := []SignatureAndHash{
  502. {hashSHA256, signatureECDSA},
  503. {hashSHA256, signatureRSA},
  504. {hashSHA384, signatureECDSA},
  505. {hashSHA384, signatureRSA},
  506. {hashSHA1, signatureRSA},
  507. }
  508. if tossBiasedCoin(0.5) {
  509. sigAndHashAlgos = append(sigAndHashAlgos, SignatureAndHash{disabledHashSHA512, signatureECDSA})
  510. }
  511. if tossBiasedCoin(0.5) {
  512. sigAndHashAlgos = append(sigAndHashAlgos, SignatureAndHash{disabledHashSHA512, signatureRSA})
  513. }
  514. if tossBiasedCoin(0.5) {
  515. sigAndHashAlgos = append(sigAndHashAlgos, SignatureAndHash{hashSHA1, signatureECDSA})
  516. }
  517. err = shuffleSignatures(sigAndHashAlgos)
  518. if err != nil {
  519. return err
  520. }
  521. sigAndHash := SignatureAlgorithmsExtension{SignatureAndHashes: sigAndHashAlgos}
  522. status := StatusRequestExtension{}
  523. sct := SCTExtension{}
  524. points := SupportedPointsExtension{SupportedPoints: []byte{pointFormatUncompressed}}
  525. curveIDs := []CurveID{}
  526. if tossBiasedCoin(0.7) {
  527. curveIDs = append(curveIDs, X25519)
  528. }
  529. curveIDs = append(curveIDs, CurveP256, CurveP384)
  530. if tossBiasedCoin(0.3) {
  531. curveIDs = append(curveIDs, CurveP521)
  532. }
  533. curves := SupportedCurvesExtension{curveIDs}
  534. padding := utlsPaddingExtension{GetPaddingLen: boringPaddingStyle}
  535. reneg := RenegotiationInfoExtension{renegotiation: RenegotiateOnceAsClient}
  536. uconn.Extensions = []TLSExtension{
  537. &sni,
  538. &sessionTicket,
  539. &sigAndHash,
  540. &points,
  541. &curves,
  542. }
  543. if tossBiasedCoin(0.66) {
  544. uconn.Extensions = append(uconn.Extensions, &padding)
  545. }
  546. if tossBiasedCoin(0.66) {
  547. uconn.Extensions = append(uconn.Extensions, &status)
  548. }
  549. if tossBiasedCoin(0.55) {
  550. uconn.Extensions = append(uconn.Extensions, &sct)
  551. }
  552. if tossBiasedCoin(0.44) {
  553. uconn.Extensions = append(uconn.Extensions, &reneg)
  554. }
  555. err = shuffleTLSExtensions(uconn.Extensions)
  556. if err != nil {
  557. return err
  558. }
  559. return nil
  560. }
  561. func (uconn *UConn) parrotCustom() error {
  562. return uconn.fillClientHelloHeader()
  563. }
  564. func tossBiasedCoin(probability float32) bool {
  565. // probability is expected to be in [0,1]
  566. // this function never returns errors for ease of use
  567. const precision = 0xffff
  568. threshold := float32(precision) * probability
  569. value, err := getRandInt(precision)
  570. if err != nil {
  571. // I doubt that this code will ever actually be used, as other functions are expected to complain
  572. // about used source of entropy. Nonetheless, this is more than enough for given purpose
  573. return ((time.Now().Unix() & 1) == 0)
  574. }
  575. if float32(value) <= threshold {
  576. return true
  577. } else {
  578. return false
  579. }
  580. }
  581. func removeRandomCiphers(s []uint16, maxRemovalProbability float32) []uint16 {
  582. // removes elements in place
  583. // probability to remove increases for further elements
  584. // never remove first cipher
  585. if len(s) <= 1 {
  586. return s
  587. }
  588. // remove random elements
  589. floatLen := float32(len(s))
  590. sliceLen := len(s)
  591. for i := 1; i < sliceLen; i++ {
  592. if tossBiasedCoin(maxRemovalProbability * float32(i) / floatLen) {
  593. s = append(s[:i], s[i+1:]...)
  594. sliceLen--
  595. i--
  596. }
  597. }
  598. return s
  599. }
  600. func getRandInt(max int) (int, error) {
  601. bigInt, err := rand.Int(rand.Reader, big.NewInt(int64(max)))
  602. return int(bigInt.Int64()), err
  603. }
  604. func getRandPerm(n int) ([]int, error) {
  605. permArray := make([]int, n)
  606. for i := 1; i < n; i++ {
  607. j, err := getRandInt(i + 1)
  608. if err != nil {
  609. return permArray, err
  610. }
  611. permArray[i] = permArray[j]
  612. permArray[j] = i
  613. }
  614. return permArray, nil
  615. }
  616. func shuffledCiphers() ([]uint16, error) {
  617. ciphers := make(sortableCiphers, len(cipherSuites))
  618. perm, err := getRandPerm(len(cipherSuites))
  619. if err != nil {
  620. return nil, err
  621. }
  622. for i, suite := range cipherSuites {
  623. ciphers[i] = sortableCipher{suite: suite.id,
  624. isObsolete: ((suite.flags & suiteTLS12) == 0),
  625. randomTag: perm[i]}
  626. }
  627. sort.Sort(ciphers)
  628. return ciphers.GetCiphers(), nil
  629. }
  630. type sortableCipher struct {
  631. isObsolete bool
  632. randomTag int
  633. suite uint16
  634. }
  635. type sortableCiphers []sortableCipher
  636. func (ciphers sortableCiphers) Len() int {
  637. return len(ciphers)
  638. }
  639. func (ciphers sortableCiphers) Less(i, j int) bool {
  640. if ciphers[i].isObsolete && !ciphers[j].isObsolete {
  641. return false
  642. }
  643. if ciphers[j].isObsolete && !ciphers[i].isObsolete {
  644. return true
  645. }
  646. return ciphers[i].randomTag < ciphers[j].randomTag
  647. }
  648. func (ciphers sortableCiphers) Swap(i, j int) {
  649. ciphers[i], ciphers[j] = ciphers[j], ciphers[i]
  650. }
  651. func (ciphers sortableCiphers) GetCiphers() []uint16 {
  652. cipherIDs := make([]uint16, len(ciphers))
  653. for i := range ciphers {
  654. cipherIDs[i] = ciphers[i].suite
  655. }
  656. return cipherIDs
  657. }
  658. // so much for generics
  659. func shuffleTLSExtensions(s []TLSExtension) error {
  660. // shuffles array in place
  661. perm, err := getRandPerm(len(s))
  662. if err != nil {
  663. return err
  664. }
  665. for i := range s {
  666. s[i], s[perm[i]] = s[perm[i]], s[i]
  667. }
  668. return nil
  669. }
  670. // so much for generics
  671. func shuffleSignatures(s []SignatureAndHash) error {
  672. // shuffles array in place
  673. perm, err := getRandPerm(len(s))
  674. if err != nil {
  675. return err
  676. }
  677. for i := range s {
  678. s[i], s[perm[i]] = s[perm[i]], s[i]
  679. }
  680. return nil
  681. }