TlsExtensionsUtilities.cs 55 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381
  1. #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
  2. #pragma warning disable
  3. using System;
  4. using System.Collections;
  5. using System.IO;
  6. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1;
  7. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.X509;
  8. using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
  9. namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Tls
  10. {
  11. public abstract class TlsExtensionsUtilities
  12. {
  13. public static IDictionary EnsureExtensionsInitialised(IDictionary extensions)
  14. {
  15. return extensions == null ? BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateHashtable() : extensions;
  16. }
  17. /// <param name="extensions">(Int32 -> byte[])</param>
  18. /// <param name="protocolNameList">an <see cref="IList"/> of <see cref="ProtocolName"/>.</param>
  19. /// <exception cref="IOException"/>
  20. public static void AddAlpnExtensionClient(IDictionary extensions, IList protocolNameList)
  21. {
  22. extensions[ExtensionType.application_layer_protocol_negotiation] = CreateAlpnExtensionClient(protocolNameList);
  23. }
  24. /// <exception cref="IOException"/>
  25. public static void AddAlpnExtensionServer(IDictionary extensions, ProtocolName protocolName)
  26. {
  27. extensions[ExtensionType.application_layer_protocol_negotiation] = CreateAlpnExtensionServer(protocolName);
  28. }
  29. /// <exception cref="IOException"/>
  30. public static void AddCertificateAuthoritiesExtension(IDictionary extensions, IList authorities)
  31. {
  32. extensions[ExtensionType.certificate_authorities] = CreateCertificateAuthoritiesExtension(authorities);
  33. }
  34. /// <exception cref="IOException"/>
  35. public static void AddClientCertificateTypeExtensionClient(IDictionary extensions, short[] certificateTypes)
  36. {
  37. extensions[ExtensionType.client_certificate_type] = CreateCertificateTypeExtensionClient(certificateTypes);
  38. }
  39. /// <exception cref="IOException"/>
  40. public static void AddClientCertificateTypeExtensionServer(IDictionary extensions, short certificateType)
  41. {
  42. extensions[ExtensionType.client_certificate_type] = CreateCertificateTypeExtensionServer(certificateType);
  43. }
  44. public static void AddClientCertificateUrlExtension(IDictionary extensions)
  45. {
  46. extensions[ExtensionType.client_certificate_url] = CreateClientCertificateUrlExtension();
  47. }
  48. /// <exception cref="IOException"/>
  49. public static void AddCookieExtension(IDictionary extensions, byte[] cookie)
  50. {
  51. extensions[ExtensionType.cookie] = CreateCookieExtension(cookie);
  52. }
  53. public static void AddEarlyDataIndication(IDictionary extensions)
  54. {
  55. extensions[ExtensionType.early_data] = CreateEarlyDataIndication();
  56. }
  57. /// <exception cref="IOException"/>
  58. public static void AddEarlyDataMaxSize(IDictionary extensions, long maxSize)
  59. {
  60. extensions[ExtensionType.early_data] = CreateEarlyDataMaxSize(maxSize);
  61. }
  62. public static void AddEmptyExtensionData(IDictionary extensions, Int32 extType)
  63. {
  64. extensions[extType] = CreateEmptyExtensionData();
  65. }
  66. public static void AddEncryptThenMacExtension(IDictionary extensions)
  67. {
  68. extensions[ExtensionType.encrypt_then_mac] = CreateEncryptThenMacExtension();
  69. }
  70. public static void AddExtendedMasterSecretExtension(IDictionary extensions)
  71. {
  72. extensions[ExtensionType.extended_master_secret] = CreateExtendedMasterSecretExtension();
  73. }
  74. /// <exception cref="IOException"/>
  75. public static void AddHeartbeatExtension(IDictionary extensions, HeartbeatExtension heartbeatExtension)
  76. {
  77. extensions[ExtensionType.heartbeat] = CreateHeartbeatExtension(heartbeatExtension);
  78. }
  79. /// <exception cref="IOException"/>
  80. public static void AddKeyShareClientHello(IDictionary extensions, IList clientShares)
  81. {
  82. extensions[ExtensionType.key_share] = CreateKeyShareClientHello(clientShares);
  83. }
  84. /// <exception cref="IOException"/>
  85. public static void AddKeyShareHelloRetryRequest(IDictionary extensions, int namedGroup)
  86. {
  87. extensions[ExtensionType.key_share] = CreateKeyShareHelloRetryRequest(namedGroup);
  88. }
  89. /// <exception cref="IOException"/>
  90. public static void AddKeyShareServerHello(IDictionary extensions, KeyShareEntry serverShare)
  91. {
  92. extensions[ExtensionType.key_share] = CreateKeyShareServerHello(serverShare);
  93. }
  94. /// <exception cref="IOException"/>
  95. public static void AddMaxFragmentLengthExtension(IDictionary extensions, short maxFragmentLength)
  96. {
  97. extensions[ExtensionType.max_fragment_length] = CreateMaxFragmentLengthExtension(maxFragmentLength);
  98. }
  99. /// <exception cref="IOException"/>
  100. public static void AddOidFiltersExtension(IDictionary extensions, IDictionary filters)
  101. {
  102. extensions[ExtensionType.oid_filters] = CreateOidFiltersExtension(filters);
  103. }
  104. /// <exception cref="IOException"/>
  105. public static void AddPaddingExtension(IDictionary extensions, int dataLength)
  106. {
  107. extensions[ExtensionType.padding] = CreatePaddingExtension(dataLength);
  108. }
  109. public static void AddPostHandshakeAuthExtension(IDictionary extensions)
  110. {
  111. extensions[ExtensionType.post_handshake_auth] = CreatePostHandshakeAuthExtension();
  112. }
  113. /// <exception cref="IOException"/>
  114. public static void AddPreSharedKeyClientHello(IDictionary extensions, OfferedPsks offeredPsks)
  115. {
  116. extensions[ExtensionType.pre_shared_key] = CreatePreSharedKeyClientHello(offeredPsks);
  117. }
  118. /// <exception cref="IOException"/>
  119. public static void AddPreSharedKeyServerHello(IDictionary extensions, int selectedIdentity)
  120. {
  121. extensions[ExtensionType.pre_shared_key] = CreatePreSharedKeyServerHello(selectedIdentity);
  122. }
  123. /// <exception cref="IOException"/>
  124. public static void AddPskKeyExchangeModesExtension(IDictionary extensions, short[] modes)
  125. {
  126. extensions[ExtensionType.psk_key_exchange_modes] = CreatePskKeyExchangeModesExtension(modes);
  127. }
  128. /// <exception cref="IOException"/>
  129. public static void AddRecordSizeLimitExtension(IDictionary extensions, int recordSizeLimit)
  130. {
  131. extensions[ExtensionType.record_size_limit] = CreateRecordSizeLimitExtension(recordSizeLimit);
  132. }
  133. /// <exception cref="IOException"/>
  134. public static void AddServerCertificateTypeExtensionClient(IDictionary extensions, short[] certificateTypes)
  135. {
  136. extensions[ExtensionType.server_certificate_type] = CreateCertificateTypeExtensionClient(certificateTypes);
  137. }
  138. /// <exception cref="IOException"/>
  139. public static void AddServerCertificateTypeExtensionServer(IDictionary extensions, short certificateType)
  140. {
  141. extensions[ExtensionType.server_certificate_type] = CreateCertificateTypeExtensionServer(certificateType);
  142. }
  143. /// <exception cref="IOException"/>
  144. public static void AddServerNameExtensionClient(IDictionary extensions, IList serverNameList)
  145. {
  146. extensions[ExtensionType.server_name] = CreateServerNameExtensionClient(serverNameList);
  147. }
  148. /// <exception cref="IOException"/>
  149. public static void AddServerNameExtensionServer(IDictionary extensions)
  150. {
  151. extensions[ExtensionType.server_name] = CreateServerNameExtensionServer();
  152. }
  153. /// <exception cref="IOException"/>
  154. public static void AddSignatureAlgorithmsExtension(IDictionary extensions, IList supportedSignatureAlgorithms)
  155. {
  156. extensions[ExtensionType.signature_algorithms] = CreateSignatureAlgorithmsExtension(supportedSignatureAlgorithms);
  157. }
  158. /// <exception cref="IOException"/>
  159. public static void AddSignatureAlgorithmsCertExtension(IDictionary extensions, IList supportedSignatureAlgorithms)
  160. {
  161. extensions[ExtensionType.signature_algorithms_cert] = CreateSignatureAlgorithmsCertExtension(supportedSignatureAlgorithms);
  162. }
  163. /// <exception cref="IOException"/>
  164. public static void AddStatusRequestExtension(IDictionary extensions, CertificateStatusRequest statusRequest)
  165. {
  166. extensions[ExtensionType.status_request] = CreateStatusRequestExtension(statusRequest);
  167. }
  168. /// <exception cref="IOException"/>
  169. public static void AddStatusRequestV2Extension(IDictionary extensions, IList statusRequestV2)
  170. {
  171. extensions[ExtensionType.status_request_v2] = CreateStatusRequestV2Extension(statusRequestV2);
  172. }
  173. /// <exception cref="IOException"/>
  174. public static void AddSupportedGroupsExtension(IDictionary extensions, IList namedGroups)
  175. {
  176. extensions[ExtensionType.supported_groups] = CreateSupportedGroupsExtension(namedGroups);
  177. }
  178. /// <exception cref="IOException"/>
  179. public static void AddSupportedPointFormatsExtension(IDictionary extensions, short[] ecPointFormats)
  180. {
  181. extensions[ExtensionType.ec_point_formats] = CreateSupportedPointFormatsExtension(ecPointFormats);
  182. }
  183. /// <exception cref="IOException"/>
  184. public static void AddSupportedVersionsExtensionClient(IDictionary extensions, ProtocolVersion[] versions)
  185. {
  186. extensions[ExtensionType.supported_versions] = CreateSupportedVersionsExtensionClient(versions);
  187. }
  188. /// <exception cref="IOException"/>
  189. public static void AddSupportedVersionsExtensionServer(IDictionary extensions, ProtocolVersion selectedVersion)
  190. {
  191. extensions[ExtensionType.supported_versions] = CreateSupportedVersionsExtensionServer(selectedVersion);
  192. }
  193. public static void AddTruncatedHmacExtension(IDictionary extensions)
  194. {
  195. extensions[ExtensionType.truncated_hmac] = CreateTruncatedHmacExtension();
  196. }
  197. /// <exception cref="IOException"/>
  198. public static void AddTrustedCAKeysExtensionClient(IDictionary extensions, IList trustedAuthoritiesList)
  199. {
  200. extensions[ExtensionType.trusted_ca_keys] = CreateTrustedCAKeysExtensionClient(trustedAuthoritiesList);
  201. }
  202. public static void AddTrustedCAKeysExtensionServer(IDictionary extensions)
  203. {
  204. extensions[ExtensionType.trusted_ca_keys] = CreateTrustedCAKeysExtensionServer();
  205. }
  206. /// <returns>an <see cref="IList"/> of <see cref="ProtocolName"/>.</returns>
  207. /// <exception cref="IOException"/>
  208. public static IList GetAlpnExtensionClient(IDictionary extensions)
  209. {
  210. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.application_layer_protocol_negotiation);
  211. return extensionData == null ? null : ReadAlpnExtensionClient(extensionData);
  212. }
  213. /// <exception cref="IOException"/>
  214. public static ProtocolName GetAlpnExtensionServer(IDictionary extensions)
  215. {
  216. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.application_layer_protocol_negotiation);
  217. return extensionData == null ? null : ReadAlpnExtensionServer(extensionData);
  218. }
  219. /// <exception cref="IOException"/>
  220. public static IList GetCertificateAuthoritiesExtension(IDictionary extensions)
  221. {
  222. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.certificate_authorities);
  223. return extensionData == null ? null : ReadCertificateAuthoritiesExtension(extensionData);
  224. }
  225. /// <exception cref="IOException"/>
  226. public static short[] GetClientCertificateTypeExtensionClient(IDictionary extensions)
  227. {
  228. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.client_certificate_type);
  229. return extensionData == null ? null : ReadCertificateTypeExtensionClient(extensionData);
  230. }
  231. /// <exception cref="IOException"/>
  232. public static short GetClientCertificateTypeExtensionServer(IDictionary extensions)
  233. {
  234. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.client_certificate_type);
  235. return extensionData == null ? (short)-1 : ReadCertificateTypeExtensionServer(extensionData);
  236. }
  237. /// <exception cref="IOException"/>
  238. public static byte[] GetCookieExtension(IDictionary extensions)
  239. {
  240. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.cookie);
  241. return extensionData == null ? null : ReadCookieExtension(extensionData);
  242. }
  243. /// <exception cref="IOException"/>
  244. public static long GetEarlyDataMaxSize(IDictionary extensions)
  245. {
  246. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.early_data);
  247. return extensionData == null ? -1L : ReadEarlyDataMaxSize(extensionData);
  248. }
  249. /// <exception cref="IOException"/>
  250. public static HeartbeatExtension GetHeartbeatExtension(IDictionary extensions)
  251. {
  252. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.heartbeat);
  253. return extensionData == null ? null : ReadHeartbeatExtension(extensionData);
  254. }
  255. /// <exception cref="IOException"/>
  256. public static IList GetKeyShareClientHello(IDictionary extensions)
  257. {
  258. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.key_share);
  259. return extensionData == null ? null : ReadKeyShareClientHello(extensionData);
  260. }
  261. /// <exception cref="IOException"/>
  262. public static int GetKeyShareHelloRetryRequest(IDictionary extensions)
  263. {
  264. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.key_share);
  265. return extensionData == null ? -1 : ReadKeyShareHelloRetryRequest(extensionData);
  266. }
  267. /// <exception cref="IOException"/>
  268. public static KeyShareEntry GetKeyShareServerHello(IDictionary extensions)
  269. {
  270. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.key_share);
  271. return extensionData == null ? null : ReadKeyShareServerHello(extensionData);
  272. }
  273. /// <exception cref="IOException"/>
  274. public static short GetMaxFragmentLengthExtension(IDictionary extensions)
  275. {
  276. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.max_fragment_length);
  277. return extensionData == null ? (short)-1 : ReadMaxFragmentLengthExtension(extensionData);
  278. }
  279. /// <exception cref="IOException"/>
  280. public static IDictionary GetOidFiltersExtension(IDictionary extensions)
  281. {
  282. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.oid_filters);
  283. return extensionData == null ? null : ReadOidFiltersExtension(extensionData);
  284. }
  285. /// <exception cref="IOException"/>
  286. public static int GetPaddingExtension(IDictionary extensions)
  287. {
  288. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.padding);
  289. return extensionData == null ? -1 : ReadPaddingExtension(extensionData);
  290. }
  291. /// <exception cref="IOException"/>
  292. public static OfferedPsks GetPreSharedKeyClientHello(IDictionary extensions)
  293. {
  294. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.pre_shared_key);
  295. return extensionData == null ? null : ReadPreSharedKeyClientHello(extensionData);
  296. }
  297. /// <exception cref="IOException"/>
  298. public static int GetPreSharedKeyServerHello(IDictionary extensions)
  299. {
  300. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.pre_shared_key);
  301. return extensionData == null ? -1 : ReadPreSharedKeyServerHello(extensionData);
  302. }
  303. /// <exception cref="IOException"/>
  304. public static short[] GetPskKeyExchangeModesExtension(IDictionary extensions)
  305. {
  306. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.psk_key_exchange_modes);
  307. return extensionData == null ? null : ReadPskKeyExchangeModesExtension(extensionData);
  308. }
  309. /// <exception cref="IOException"/>
  310. public static int GetRecordSizeLimitExtension(IDictionary extensions)
  311. {
  312. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.record_size_limit);
  313. return extensionData == null ? -1 : ReadRecordSizeLimitExtension(extensionData);
  314. }
  315. /// <exception cref="IOException"/>
  316. public static short[] GetServerCertificateTypeExtensionClient(IDictionary extensions)
  317. {
  318. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.server_certificate_type);
  319. return extensionData == null ? null : ReadCertificateTypeExtensionClient(extensionData);
  320. }
  321. /// <exception cref="IOException"/>
  322. public static short GetServerCertificateTypeExtensionServer(IDictionary extensions)
  323. {
  324. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.server_certificate_type);
  325. return extensionData == null ? (short)-1 : ReadCertificateTypeExtensionServer(extensionData);
  326. }
  327. /// <exception cref="IOException"/>
  328. public static IList GetServerNameExtensionClient(IDictionary extensions)
  329. {
  330. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.server_name);
  331. return extensionData == null ? null : ReadServerNameExtensionClient(extensionData);
  332. }
  333. /// <exception cref="IOException"/>
  334. public static IList GetSignatureAlgorithmsExtension(IDictionary extensions)
  335. {
  336. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.signature_algorithms);
  337. return extensionData == null ? null : ReadSignatureAlgorithmsExtension(extensionData);
  338. }
  339. /// <exception cref="IOException"/>
  340. public static IList GetSignatureAlgorithmsCertExtension(IDictionary extensions)
  341. {
  342. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.signature_algorithms_cert);
  343. return extensionData == null ? null : ReadSignatureAlgorithmsCertExtension(extensionData);
  344. }
  345. /// <exception cref="IOException"/>
  346. public static CertificateStatusRequest GetStatusRequestExtension(IDictionary extensions)
  347. {
  348. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.status_request);
  349. return extensionData == null ? null : ReadStatusRequestExtension(extensionData);
  350. }
  351. /// <exception cref="IOException"/>
  352. public static IList GetStatusRequestV2Extension(IDictionary extensions)
  353. {
  354. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.status_request_v2);
  355. return extensionData == null ? null : ReadStatusRequestV2Extension(extensionData);
  356. }
  357. /// <exception cref="IOException"/>
  358. public static int[] GetSupportedGroupsExtension(IDictionary extensions)
  359. {
  360. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.supported_groups);
  361. return extensionData == null ? null : ReadSupportedGroupsExtension(extensionData);
  362. }
  363. /// <exception cref="IOException"/>
  364. public static short[] GetSupportedPointFormatsExtension(IDictionary extensions)
  365. {
  366. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.ec_point_formats);
  367. return extensionData == null ? null : ReadSupportedPointFormatsExtension(extensionData);
  368. }
  369. /// <exception cref="IOException"/>
  370. public static ProtocolVersion[] GetSupportedVersionsExtensionClient(IDictionary extensions)
  371. {
  372. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.supported_versions);
  373. return extensionData == null ? null : ReadSupportedVersionsExtensionClient(extensionData);
  374. }
  375. /// <exception cref="IOException"/>
  376. public static ProtocolVersion GetSupportedVersionsExtensionServer(IDictionary extensions)
  377. {
  378. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.supported_versions);
  379. return extensionData == null ? null : ReadSupportedVersionsExtensionServer(extensionData);
  380. }
  381. /// <exception cref="IOException"/>
  382. public static IList GetTrustedCAKeysExtensionClient(IDictionary extensions)
  383. {
  384. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.trusted_ca_keys);
  385. return extensionData == null ? null : ReadTrustedCAKeysExtensionClient(extensionData);
  386. }
  387. /// <exception cref="IOException"/>
  388. public static bool HasClientCertificateUrlExtension(IDictionary extensions)
  389. {
  390. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.client_certificate_url);
  391. return extensionData == null ? false : ReadClientCertificateUrlExtension(extensionData);
  392. }
  393. /// <exception cref="IOException"/>
  394. public static bool HasEarlyDataIndication(IDictionary extensions)
  395. {
  396. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.early_data);
  397. return extensionData == null ? false : ReadEarlyDataIndication(extensionData);
  398. }
  399. /// <exception cref="IOException"/>
  400. public static bool HasEncryptThenMacExtension(IDictionary extensions)
  401. {
  402. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.encrypt_then_mac);
  403. return extensionData == null ? false : ReadEncryptThenMacExtension(extensionData);
  404. }
  405. /// <exception cref="IOException"/>
  406. public static bool HasExtendedMasterSecretExtension(IDictionary extensions)
  407. {
  408. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.extended_master_secret);
  409. return extensionData == null ? false : ReadExtendedMasterSecretExtension(extensionData);
  410. }
  411. /// <exception cref="IOException"/>
  412. public static bool HasServerNameExtensionServer(IDictionary extensions)
  413. {
  414. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.server_name);
  415. return extensionData == null ? false : ReadServerNameExtensionServer(extensionData);
  416. }
  417. /// <exception cref="IOException"/>
  418. public static bool HasPostHandshakeAuthExtension(IDictionary extensions)
  419. {
  420. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.post_handshake_auth);
  421. return extensionData == null ? false : ReadPostHandshakeAuthExtension(extensionData);
  422. }
  423. /// <exception cref="IOException"/>
  424. public static bool HasTruncatedHmacExtension(IDictionary extensions)
  425. {
  426. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.truncated_hmac);
  427. return extensionData == null ? false : ReadTruncatedHmacExtension(extensionData);
  428. }
  429. /// <exception cref="IOException"/>
  430. public static bool HasTrustedCAKeysExtensionServer(IDictionary extensions)
  431. {
  432. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.trusted_ca_keys);
  433. return extensionData == null ? false : ReadTrustedCAKeysExtensionServer(extensionData);
  434. }
  435. /// <param name="protocolNameList">an <see cref="IList"/> of <see cref="ProtocolName"/>.</param>
  436. /// <exception cref="IOException"/>
  437. public static byte[] CreateAlpnExtensionClient(IList protocolNameList)
  438. {
  439. if (protocolNameList == null || protocolNameList.Count < 1)
  440. throw new TlsFatalAlert(AlertDescription.internal_error);
  441. MemoryStream buf = new MemoryStream();
  442. // Placeholder for length
  443. TlsUtilities.WriteUint16(0, buf);
  444. foreach (ProtocolName protocolName in protocolNameList)
  445. {
  446. protocolName.Encode(buf);
  447. }
  448. return PatchOpaque16(buf);
  449. }
  450. /// <exception cref="IOException"/>
  451. public static byte[] CreateAlpnExtensionServer(ProtocolName protocolName)
  452. {
  453. IList protocol_name_list = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateArrayList();
  454. protocol_name_list.Add(protocolName);
  455. return CreateAlpnExtensionClient(protocol_name_list);
  456. }
  457. /// <exception cref="IOException"/>
  458. public static byte[] CreateCertificateAuthoritiesExtension(IList authorities)
  459. {
  460. if (null == authorities || authorities.Count < 1)
  461. throw new TlsFatalAlert(AlertDescription.internal_error);
  462. MemoryStream buf = new MemoryStream();
  463. // Placeholder for length
  464. TlsUtilities.WriteUint16(0, buf);
  465. foreach (X509Name authority in authorities)
  466. {
  467. byte[] derEncoding = authority.GetEncoded(Asn1Encodable.Der);
  468. TlsUtilities.WriteOpaque16(derEncoding, buf);
  469. }
  470. return PatchOpaque16(buf);
  471. }
  472. /// <exception cref="IOException"/>
  473. public static byte[] CreateCertificateTypeExtensionClient(short[] certificateTypes)
  474. {
  475. if (TlsUtilities.IsNullOrEmpty(certificateTypes) || certificateTypes.Length > 255)
  476. throw new TlsFatalAlert(AlertDescription.internal_error);
  477. return TlsUtilities.EncodeUint8ArrayWithUint8Length(certificateTypes);
  478. }
  479. /// <exception cref="IOException"/>
  480. public static byte[] CreateCertificateTypeExtensionServer(short certificateType)
  481. {
  482. return TlsUtilities.EncodeUint8(certificateType);
  483. }
  484. public static byte[] CreateClientCertificateUrlExtension()
  485. {
  486. return CreateEmptyExtensionData();
  487. }
  488. /// <exception cref="IOException"/>
  489. public static byte[] CreateCookieExtension(byte[] cookie)
  490. {
  491. if (TlsUtilities.IsNullOrEmpty(cookie) || cookie.Length >= (1 << 16))
  492. throw new TlsFatalAlert(AlertDescription.internal_error);
  493. return TlsUtilities.EncodeOpaque16(cookie);
  494. }
  495. public static byte[] CreateEarlyDataIndication()
  496. {
  497. return CreateEmptyExtensionData();
  498. }
  499. /// <exception cref="IOException"/>
  500. public static byte[] CreateEarlyDataMaxSize(long maxSize)
  501. {
  502. return TlsUtilities.EncodeUint32(maxSize);
  503. }
  504. public static byte[] CreateEmptyExtensionData()
  505. {
  506. return TlsUtilities.EmptyBytes;
  507. }
  508. public static byte[] CreateEncryptThenMacExtension()
  509. {
  510. return CreateEmptyExtensionData();
  511. }
  512. public static byte[] CreateExtendedMasterSecretExtension()
  513. {
  514. return CreateEmptyExtensionData();
  515. }
  516. /// <exception cref="IOException"/>
  517. public static byte[] CreateHeartbeatExtension(HeartbeatExtension heartbeatExtension)
  518. {
  519. if (heartbeatExtension == null)
  520. {
  521. throw new TlsFatalAlert(AlertDescription.internal_error);
  522. }
  523. MemoryStream buf = new MemoryStream();
  524. heartbeatExtension.Encode(buf);
  525. return buf.ToArray();
  526. }
  527. /// <exception cref="IOException"/>
  528. public static byte[] CreateKeyShareClientHello(IList clientShares)
  529. {
  530. if (clientShares == null || clientShares.Count < 1)
  531. return TlsUtilities.EncodeUint16(0);
  532. MemoryStream buf = new MemoryStream();
  533. // Placeholder for length
  534. TlsUtilities.WriteUint16(0, buf);
  535. foreach (KeyShareEntry clientShare in clientShares)
  536. {
  537. clientShare.Encode(buf);
  538. }
  539. return PatchOpaque16(buf);
  540. }
  541. /// <exception cref="IOException"/>
  542. public static byte[] CreateKeyShareHelloRetryRequest(int namedGroup)
  543. {
  544. return TlsUtilities.EncodeUint16(namedGroup);
  545. }
  546. /// <exception cref="IOException"/>
  547. public static byte[] CreateKeyShareServerHello(KeyShareEntry serverShare)
  548. {
  549. if (serverShare == null)
  550. {
  551. throw new TlsFatalAlert(AlertDescription.internal_error);
  552. }
  553. MemoryStream buf = new MemoryStream();
  554. serverShare.Encode(buf);
  555. return buf.ToArray();
  556. }
  557. /// <exception cref="IOException"/>
  558. public static byte[] CreateMaxFragmentLengthExtension(short maxFragmentLength)
  559. {
  560. return TlsUtilities.EncodeUint8(maxFragmentLength);
  561. }
  562. /// <exception cref="IOException"/>
  563. public static byte[] CreateOidFiltersExtension(IDictionary filters)
  564. {
  565. MemoryStream buf = new MemoryStream();
  566. // Placeholder for length
  567. TlsUtilities.WriteUint16(0, buf);
  568. if (null != filters)
  569. {
  570. foreach (DerObjectIdentifier certificateExtensionOid in filters.Keys)
  571. {
  572. byte[] certificateExtensionValues = (byte[])filters[certificateExtensionOid];
  573. if (null == certificateExtensionOid || null == certificateExtensionValues)
  574. throw new TlsFatalAlert(AlertDescription.internal_error);
  575. byte[] derEncoding = certificateExtensionOid.GetEncoded(Asn1Encodable.Der);
  576. TlsUtilities.WriteOpaque8(derEncoding, buf);
  577. TlsUtilities.WriteOpaque16(certificateExtensionValues, buf);
  578. }
  579. }
  580. return PatchOpaque16(buf);
  581. }
  582. /// <exception cref="IOException"/>
  583. public static byte[] CreatePaddingExtension(int dataLength)
  584. {
  585. TlsUtilities.CheckUint16(dataLength);
  586. return new byte[dataLength];
  587. }
  588. public static byte[] CreatePostHandshakeAuthExtension()
  589. {
  590. return CreateEmptyExtensionData();
  591. }
  592. /// <exception cref="IOException"/>
  593. public static byte[] CreatePreSharedKeyClientHello(OfferedPsks offeredPsks)
  594. {
  595. if (offeredPsks == null)
  596. throw new TlsFatalAlert(AlertDescription.internal_error);
  597. MemoryStream buf = new MemoryStream();
  598. offeredPsks.Encode(buf);
  599. return buf.ToArray();
  600. }
  601. /// <exception cref="IOException"/>
  602. public static byte[] CreatePreSharedKeyServerHello(int selectedIdentity)
  603. {
  604. return TlsUtilities.EncodeUint16(selectedIdentity);
  605. }
  606. /// <exception cref="IOException"/>
  607. public static byte[] CreatePskKeyExchangeModesExtension(short[] modes)
  608. {
  609. if (TlsUtilities.IsNullOrEmpty(modes) || modes.Length > 255)
  610. throw new TlsFatalAlert(AlertDescription.internal_error);
  611. return TlsUtilities.EncodeUint8ArrayWithUint8Length(modes);
  612. }
  613. /// <exception cref="IOException"/>
  614. public static byte[] CreateRecordSizeLimitExtension(int recordSizeLimit)
  615. {
  616. if (recordSizeLimit < 64)
  617. throw new TlsFatalAlert(AlertDescription.internal_error);
  618. return TlsUtilities.EncodeUint16(recordSizeLimit);
  619. }
  620. /// <exception cref="IOException"/>
  621. public static byte[] CreateServerNameExtensionClient(IList serverNameList)
  622. {
  623. if (serverNameList == null)
  624. throw new TlsFatalAlert(AlertDescription.internal_error);
  625. MemoryStream buf = new MemoryStream();
  626. new ServerNameList(serverNameList).Encode(buf);
  627. return buf.ToArray();
  628. }
  629. public static byte[] CreateServerNameExtensionServer()
  630. {
  631. return CreateEmptyExtensionData();
  632. }
  633. /// <exception cref="IOException"/>
  634. public static byte[] CreateSignatureAlgorithmsExtension(IList supportedSignatureAlgorithms)
  635. {
  636. MemoryStream buf = new MemoryStream();
  637. TlsUtilities.EncodeSupportedSignatureAlgorithms(supportedSignatureAlgorithms, buf);
  638. return buf.ToArray();
  639. }
  640. /// <exception cref="IOException"/>
  641. public static byte[] CreateSignatureAlgorithmsCertExtension(IList supportedSignatureAlgorithms)
  642. {
  643. return CreateSignatureAlgorithmsExtension(supportedSignatureAlgorithms);
  644. }
  645. /// <exception cref="IOException"/>
  646. public static byte[] CreateStatusRequestExtension(CertificateStatusRequest statusRequest)
  647. {
  648. if (statusRequest == null)
  649. throw new TlsFatalAlert(AlertDescription.internal_error);
  650. MemoryStream buf = new MemoryStream();
  651. statusRequest.Encode(buf);
  652. return buf.ToArray();
  653. }
  654. /// <exception cref="IOException"/>
  655. public static byte[] CreateStatusRequestV2Extension(IList statusRequestV2)
  656. {
  657. if (statusRequestV2 == null || statusRequestV2.Count < 1)
  658. throw new TlsFatalAlert(AlertDescription.internal_error);
  659. MemoryStream buf = new MemoryStream();
  660. // Placeholder for length
  661. TlsUtilities.WriteUint16(0, buf);
  662. foreach (CertificateStatusRequestItemV2 entry in statusRequestV2)
  663. {
  664. entry.Encode(buf);
  665. }
  666. return PatchOpaque16(buf);
  667. }
  668. /// <exception cref="IOException"/>
  669. public static byte[] CreateSupportedGroupsExtension(IList namedGroups)
  670. {
  671. if (namedGroups == null || namedGroups.Count < 1)
  672. throw new TlsFatalAlert(AlertDescription.internal_error);
  673. int count = namedGroups.Count;
  674. int[] values = new int[count];
  675. for (int i = 0; i < count; ++i)
  676. {
  677. values[i] = (Int32)namedGroups[i];
  678. }
  679. return TlsUtilities.EncodeUint16ArrayWithUint16Length(values);
  680. }
  681. /// <exception cref="IOException"/>
  682. public static byte[] CreateSupportedPointFormatsExtension(short[] ecPointFormats)
  683. {
  684. if (ecPointFormats == null || !Arrays.Contains(ecPointFormats, ECPointFormat.uncompressed))
  685. {
  686. /*
  687. * RFC 4492 5.1. If the Supported Point Formats Extension is indeed sent, it MUST
  688. * contain the value 0 (uncompressed) as one of the items in the list of point formats.
  689. */
  690. // NOTE: We add it at the start (highest preference)
  691. ecPointFormats = Arrays.Prepend(ecPointFormats, ECPointFormat.uncompressed);
  692. }
  693. return TlsUtilities.EncodeUint8ArrayWithUint8Length(ecPointFormats);
  694. }
  695. /// <exception cref="IOException"/>
  696. public static byte[] CreateSupportedVersionsExtensionClient(ProtocolVersion[] versions)
  697. {
  698. if (TlsUtilities.IsNullOrEmpty(versions) || versions.Length > 127)
  699. throw new TlsFatalAlert(AlertDescription.internal_error);
  700. int count = versions.Length;
  701. byte[] data = new byte[1 + count * 2];
  702. TlsUtilities.WriteUint8(count * 2, data, 0);
  703. for (int i = 0; i < count; ++i)
  704. {
  705. TlsUtilities.WriteVersion((ProtocolVersion)versions[i], data, 1 + i * 2);
  706. }
  707. return data;
  708. }
  709. /// <exception cref="IOException"/>
  710. public static byte[] CreateSupportedVersionsExtensionServer(ProtocolVersion selectedVersion)
  711. {
  712. return TlsUtilities.EncodeVersion(selectedVersion);
  713. }
  714. public static byte[] CreateTruncatedHmacExtension()
  715. {
  716. return CreateEmptyExtensionData();
  717. }
  718. /// <exception cref="IOException"/>
  719. public static byte[] CreateTrustedCAKeysExtensionClient(IList trustedAuthoritiesList)
  720. {
  721. MemoryStream buf = new MemoryStream();
  722. // Placeholder for length
  723. TlsUtilities.WriteUint16(0, buf);
  724. if (trustedAuthoritiesList != null)
  725. {
  726. foreach (TrustedAuthority entry in trustedAuthoritiesList)
  727. {
  728. entry.Encode(buf);
  729. }
  730. }
  731. return PatchOpaque16(buf);
  732. }
  733. public static byte[] CreateTrustedCAKeysExtensionServer()
  734. {
  735. return CreateEmptyExtensionData();
  736. }
  737. /// <exception cref="IOException"/>
  738. private static bool ReadEmptyExtensionData(byte[] extensionData)
  739. {
  740. if (extensionData == null)
  741. throw new ArgumentNullException("extensionData");
  742. if (extensionData.Length != 0)
  743. throw new TlsFatalAlert(AlertDescription.illegal_parameter);
  744. return true;
  745. }
  746. /// <returns>an <see cref="IList"/> of <see cref="ProtocolName"/>.</returns>
  747. /// <exception cref="IOException"/>
  748. public static IList ReadAlpnExtensionClient(byte[] extensionData)
  749. {
  750. if (extensionData == null)
  751. throw new ArgumentNullException("extensionData");
  752. MemoryStream buf = new MemoryStream(extensionData);
  753. int length = TlsUtilities.ReadUint16(buf);
  754. if (length != (extensionData.Length - 2))
  755. throw new TlsFatalAlert(AlertDescription.decode_error);
  756. IList protocol_name_list = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateArrayList();
  757. while (buf.Position < buf.Length)
  758. {
  759. ProtocolName protocolName = ProtocolName.Parse(buf);
  760. protocol_name_list.Add(protocolName);
  761. }
  762. return protocol_name_list;
  763. }
  764. /// <exception cref="IOException"/>
  765. public static ProtocolName ReadAlpnExtensionServer(byte[] extensionData)
  766. {
  767. IList protocol_name_list = ReadAlpnExtensionClient(extensionData);
  768. if (protocol_name_list.Count != 1)
  769. throw new TlsFatalAlert(AlertDescription.decode_error);
  770. return (ProtocolName)protocol_name_list[0];
  771. }
  772. /// <exception cref="IOException"/>
  773. public static IList ReadCertificateAuthoritiesExtension(byte[] extensionData)
  774. {
  775. if (extensionData == null)
  776. throw new ArgumentNullException("extensionData");
  777. if (extensionData.Length < 5)
  778. throw new TlsFatalAlert(AlertDescription.decode_error);
  779. MemoryStream buf = new MemoryStream(extensionData);
  780. int length = TlsUtilities.ReadUint16(buf);
  781. if (length != (extensionData.Length - 2))
  782. throw new TlsFatalAlert(AlertDescription.decode_error);
  783. IList authorities = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateArrayList();
  784. while (buf.Position < buf.Length)
  785. {
  786. byte[] derEncoding = TlsUtilities.ReadOpaque16(buf, 1);
  787. Asn1Object asn1 = TlsUtilities.ReadDerObject(derEncoding);
  788. authorities.Add(X509Name.GetInstance(asn1));
  789. }
  790. return authorities;
  791. }
  792. /// <exception cref="IOException"/>
  793. public static short[] ReadCertificateTypeExtensionClient(byte[] extensionData)
  794. {
  795. short[] certificateTypes = TlsUtilities.DecodeUint8ArrayWithUint8Length(extensionData);
  796. if (certificateTypes.Length < 1)
  797. throw new TlsFatalAlert(AlertDescription.decode_error);
  798. return certificateTypes;
  799. }
  800. /// <exception cref="IOException"/>
  801. public static short ReadCertificateTypeExtensionServer(byte[] extensionData)
  802. {
  803. return TlsUtilities.DecodeUint8(extensionData);
  804. }
  805. /// <exception cref="IOException"/>
  806. public static bool ReadClientCertificateUrlExtension(byte[] extensionData)
  807. {
  808. return ReadEmptyExtensionData(extensionData);
  809. }
  810. /// <exception cref="IOException"/>
  811. public static byte[] ReadCookieExtension(byte[] extensionData)
  812. {
  813. return TlsUtilities.DecodeOpaque16(extensionData, 1);
  814. }
  815. /// <exception cref="IOException"/>
  816. public static bool ReadEarlyDataIndication(byte[] extensionData)
  817. {
  818. return ReadEmptyExtensionData(extensionData);
  819. }
  820. /// <exception cref="IOException"/>
  821. public static long ReadEarlyDataMaxSize(byte[] extensionData)
  822. {
  823. return TlsUtilities.DecodeUint32(extensionData);
  824. }
  825. /// <exception cref="IOException"/>
  826. public static bool ReadEncryptThenMacExtension(byte[] extensionData)
  827. {
  828. return ReadEmptyExtensionData(extensionData);
  829. }
  830. /// <exception cref="IOException"/>
  831. public static bool ReadExtendedMasterSecretExtension(byte[] extensionData)
  832. {
  833. return ReadEmptyExtensionData(extensionData);
  834. }
  835. /// <exception cref="IOException"/>
  836. public static HeartbeatExtension ReadHeartbeatExtension(byte[] extensionData)
  837. {
  838. if (extensionData == null)
  839. throw new ArgumentNullException("extensionData");
  840. MemoryStream buf = new MemoryStream(extensionData, false);
  841. HeartbeatExtension heartbeatExtension = HeartbeatExtension.Parse(buf);
  842. TlsProtocol.AssertEmpty(buf);
  843. return heartbeatExtension;
  844. }
  845. /// <exception cref="IOException"/>
  846. public static IList ReadKeyShareClientHello(byte[] extensionData)
  847. {
  848. if (extensionData == null)
  849. throw new ArgumentNullException("extensionData");
  850. /*
  851. * TODO[tls13] Clients MUST NOT offer multiple KeyShareEntry values for the same group.
  852. * Clients MUST NOT offer any KeyShareEntry values for groups not listed in the client's
  853. * "supported_groups" extension. Servers MAY check for violations of these rules and abort
  854. * the handshake with an "illegal_parameter" alert if one is violated.
  855. */
  856. MemoryStream buf = new MemoryStream(extensionData, false);
  857. int length = TlsUtilities.ReadUint16(buf);
  858. if (length != (extensionData.Length - 2))
  859. throw new TlsFatalAlert(AlertDescription.decode_error);
  860. IList clientShares = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateArrayList();
  861. while (buf.Position < buf.Length)
  862. {
  863. KeyShareEntry clientShare = KeyShareEntry.Parse(buf);
  864. clientShares.Add(clientShare);
  865. }
  866. return clientShares;
  867. }
  868. /// <exception cref="IOException"/>
  869. public static int ReadKeyShareHelloRetryRequest(byte[] extensionData)
  870. {
  871. return TlsUtilities.DecodeUint16(extensionData);
  872. }
  873. /// <exception cref="IOException"/>
  874. public static KeyShareEntry ReadKeyShareServerHello(byte[] extensionData)
  875. {
  876. if (extensionData == null)
  877. throw new ArgumentNullException("extensionData");
  878. MemoryStream buf = new MemoryStream(extensionData, false);
  879. KeyShareEntry serverShare = KeyShareEntry.Parse(buf);
  880. TlsProtocol.AssertEmpty(buf);
  881. return serverShare;
  882. }
  883. /// <exception cref="IOException"/>
  884. public static short ReadMaxFragmentLengthExtension(byte[] extensionData)
  885. {
  886. return TlsUtilities.DecodeUint8(extensionData);
  887. }
  888. /// <exception cref="IOException"/>
  889. public static IDictionary ReadOidFiltersExtension(byte[] extensionData)
  890. {
  891. if (extensionData == null)
  892. throw new ArgumentNullException("extensionData");
  893. if (extensionData.Length < 2)
  894. throw new TlsFatalAlert(AlertDescription.decode_error);
  895. MemoryStream buf = new MemoryStream(extensionData, false);
  896. int length = TlsUtilities.ReadUint16(buf);
  897. if (length != (extensionData.Length - 2))
  898. throw new TlsFatalAlert(AlertDescription.decode_error);
  899. IDictionary filters = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateHashtable();
  900. while (buf.Position < buf.Length)
  901. {
  902. byte[] derEncoding = TlsUtilities.ReadOpaque8(buf, 1);
  903. Asn1Object asn1 = TlsUtilities.ReadDerObject(derEncoding);
  904. DerObjectIdentifier certificateExtensionOid = DerObjectIdentifier.GetInstance(asn1);
  905. if (filters.Contains(certificateExtensionOid))
  906. throw new TlsFatalAlert(AlertDescription.illegal_parameter);
  907. byte[] certificateExtensionValues = TlsUtilities.ReadOpaque16(buf);
  908. filters[certificateExtensionOid] = certificateExtensionValues;
  909. }
  910. return filters;
  911. }
  912. /// <exception cref="IOException"/>
  913. public static int ReadPaddingExtension(byte[] extensionData)
  914. {
  915. if (extensionData == null)
  916. throw new ArgumentNullException("extensionData");
  917. if (!Arrays.AreAllZeroes(extensionData, 0, extensionData.Length))
  918. throw new TlsFatalAlert(AlertDescription.illegal_parameter);
  919. return extensionData.Length;
  920. }
  921. /// <exception cref="IOException"/>
  922. public static bool ReadPostHandshakeAuthExtension(byte[] extensionData)
  923. {
  924. return ReadEmptyExtensionData(extensionData);
  925. }
  926. /// <exception cref="IOException"/>
  927. public static OfferedPsks ReadPreSharedKeyClientHello(byte[] extensionData)
  928. {
  929. if (extensionData == null)
  930. throw new ArgumentNullException("extensionData");
  931. MemoryStream buf = new MemoryStream(extensionData, false);
  932. OfferedPsks offeredPsks = OfferedPsks.Parse(buf);
  933. TlsProtocol.AssertEmpty(buf);
  934. return offeredPsks;
  935. }
  936. /// <exception cref="IOException"/>
  937. public static int ReadPreSharedKeyServerHello(byte[] extensionData)
  938. {
  939. return TlsUtilities.DecodeUint16(extensionData);
  940. }
  941. /// <exception cref="IOException"/>
  942. public static short[] ReadPskKeyExchangeModesExtension(byte[] extensionData)
  943. {
  944. short[] modes = TlsUtilities.DecodeUint8ArrayWithUint8Length(extensionData);
  945. if (modes.Length < 1)
  946. throw new TlsFatalAlert(AlertDescription.decode_error);
  947. return modes;
  948. }
  949. /// <exception cref="IOException"/>
  950. public static int ReadRecordSizeLimitExtension(byte[] extensionData)
  951. {
  952. int recordSizeLimit = TlsUtilities.DecodeUint16(extensionData);
  953. if (recordSizeLimit < 64)
  954. throw new TlsFatalAlert(AlertDescription.illegal_parameter);
  955. return recordSizeLimit;
  956. }
  957. /// <exception cref="IOException"/>
  958. public static IList ReadServerNameExtensionClient(byte[] extensionData)
  959. {
  960. if (extensionData == null)
  961. throw new ArgumentNullException("extensionData");
  962. MemoryStream buf = new MemoryStream(extensionData, false);
  963. ServerNameList serverNameList = ServerNameList.Parse(buf);
  964. TlsProtocol.AssertEmpty(buf);
  965. return serverNameList.ServerNames;
  966. }
  967. /// <exception cref="IOException"/>
  968. public static bool ReadServerNameExtensionServer(byte[] extensionData)
  969. {
  970. return ReadEmptyExtensionData(extensionData);
  971. }
  972. /// <exception cref="IOException"/>
  973. public static IList ReadSignatureAlgorithmsExtension(byte[] extensionData)
  974. {
  975. if (extensionData == null)
  976. throw new ArgumentNullException("extensionData");
  977. MemoryStream buf = new MemoryStream(extensionData, false);
  978. IList supported_signature_algorithms = TlsUtilities.ParseSupportedSignatureAlgorithms(buf);
  979. TlsProtocol.AssertEmpty(buf);
  980. return supported_signature_algorithms;
  981. }
  982. /// <exception cref="IOException"/>
  983. public static IList ReadSignatureAlgorithmsCertExtension(byte[] extensionData)
  984. {
  985. return ReadSignatureAlgorithmsExtension(extensionData);
  986. }
  987. /// <exception cref="IOException"/>
  988. public static CertificateStatusRequest ReadStatusRequestExtension(byte[] extensionData)
  989. {
  990. if (extensionData == null)
  991. throw new ArgumentNullException("extensionData");
  992. MemoryStream buf = new MemoryStream(extensionData, false);
  993. CertificateStatusRequest statusRequest = CertificateStatusRequest.Parse(buf);
  994. TlsProtocol.AssertEmpty(buf);
  995. return statusRequest;
  996. }
  997. /// <exception cref="IOException"/>
  998. public static IList ReadStatusRequestV2Extension(byte[] extensionData)
  999. {
  1000. if (extensionData == null)
  1001. throw new ArgumentNullException("extensionData");
  1002. if (extensionData.Length < 3)
  1003. throw new TlsFatalAlert(AlertDescription.decode_error);
  1004. MemoryStream buf = new MemoryStream(extensionData, false);
  1005. int length = TlsUtilities.ReadUint16(buf);
  1006. if (length != (extensionData.Length - 2))
  1007. throw new TlsFatalAlert(AlertDescription.decode_error);
  1008. IList statusRequestV2 = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateArrayList();
  1009. while (buf.Position < buf.Length)
  1010. {
  1011. CertificateStatusRequestItemV2 entry = CertificateStatusRequestItemV2.Parse(buf);
  1012. statusRequestV2.Add(entry);
  1013. }
  1014. return statusRequestV2;
  1015. }
  1016. /// <exception cref="IOException"/>
  1017. public static int[] ReadSupportedGroupsExtension(byte[] extensionData)
  1018. {
  1019. if (extensionData == null)
  1020. throw new ArgumentNullException("extensionData");
  1021. MemoryStream buf = new MemoryStream(extensionData, false);
  1022. int length = TlsUtilities.ReadUint16(buf);
  1023. if (length < 2 || (length & 1) != 0)
  1024. throw new TlsFatalAlert(AlertDescription.decode_error);
  1025. int[] namedGroups = TlsUtilities.ReadUint16Array(length / 2, buf);
  1026. TlsProtocol.AssertEmpty(buf);
  1027. return namedGroups;
  1028. }
  1029. /// <exception cref="IOException"/>
  1030. public static short[] ReadSupportedPointFormatsExtension(byte[] extensionData)
  1031. {
  1032. short[] ecPointFormats = TlsUtilities.DecodeUint8ArrayWithUint8Length(extensionData);
  1033. if (!Arrays.Contains(ecPointFormats, ECPointFormat.uncompressed))
  1034. {
  1035. /*
  1036. * RFC 4492 5.1. If the Supported Point Formats Extension is indeed sent, it MUST
  1037. * contain the value 0 (uncompressed) as one of the items in the list of point formats.
  1038. */
  1039. throw new TlsFatalAlert(AlertDescription.illegal_parameter);
  1040. }
  1041. return ecPointFormats;
  1042. }
  1043. /// <exception cref="IOException"/>
  1044. public static ProtocolVersion[] ReadSupportedVersionsExtensionClient(byte[] extensionData)
  1045. {
  1046. if (extensionData == null)
  1047. throw new ArgumentNullException("extensionData");
  1048. if (extensionData.Length < 3 || extensionData.Length > 255 || (extensionData.Length & 1) == 0)
  1049. throw new TlsFatalAlert(AlertDescription.decode_error);
  1050. int length = TlsUtilities.ReadUint8(extensionData, 0);
  1051. if (length != (extensionData.Length - 1))
  1052. throw new TlsFatalAlert(AlertDescription.decode_error);
  1053. int count = length / 2;
  1054. ProtocolVersion[] versions = new ProtocolVersion[count];
  1055. for (int i = 0; i < count; ++i)
  1056. {
  1057. versions[i] = TlsUtilities.ReadVersion(extensionData, 1 + i * 2);
  1058. }
  1059. return versions;
  1060. }
  1061. /// <exception cref="IOException"/>
  1062. public static ProtocolVersion ReadSupportedVersionsExtensionServer(byte[] extensionData)
  1063. {
  1064. if (extensionData == null)
  1065. throw new ArgumentNullException("extensionData");
  1066. if (extensionData.Length != 2)
  1067. throw new TlsFatalAlert(AlertDescription.decode_error);
  1068. return TlsUtilities.ReadVersion(extensionData, 0);
  1069. }
  1070. /// <exception cref="IOException"/>
  1071. public static bool ReadTruncatedHmacExtension(byte[] extensionData)
  1072. {
  1073. return ReadEmptyExtensionData(extensionData);
  1074. }
  1075. /// <exception cref="IOException"/>
  1076. public static IList ReadTrustedCAKeysExtensionClient(byte[] extensionData)
  1077. {
  1078. if (extensionData == null)
  1079. throw new ArgumentNullException("extensionData");
  1080. if (extensionData.Length < 2)
  1081. throw new TlsFatalAlert(AlertDescription.decode_error);
  1082. MemoryStream buf = new MemoryStream(extensionData, false);
  1083. int length = TlsUtilities.ReadUint16(buf);
  1084. if (length != (extensionData.Length - 2))
  1085. throw new TlsFatalAlert(AlertDescription.decode_error);
  1086. IList trusted_authorities_list = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateArrayList();
  1087. while (buf.Position < buf.Length)
  1088. {
  1089. TrustedAuthority entry = TrustedAuthority.Parse(buf);
  1090. trusted_authorities_list.Add(entry);
  1091. }
  1092. return trusted_authorities_list;
  1093. }
  1094. /// <exception cref="IOException"/>
  1095. public static bool ReadTrustedCAKeysExtensionServer(byte[] extensionData)
  1096. {
  1097. return ReadEmptyExtensionData(extensionData);
  1098. }
  1099. /// <exception cref="IOException"/>
  1100. private static byte[] PatchOpaque16(MemoryStream buf)
  1101. {
  1102. int length = (int)buf.Length - 2;
  1103. TlsUtilities.CheckUint16(length);
  1104. byte[] extensionData = buf.ToArray();
  1105. TlsUtilities.WriteUint16(length, extensionData, 0);
  1106. return extensionData;
  1107. }
  1108. }
  1109. }
  1110. #pragma warning restore
  1111. #endif