TlsUtilities.cs 110 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405
  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 System.Text;
  7. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1;
  8. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.Nist;
  9. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.Pkcs;
  10. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.X509;
  11. using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Digests;
  12. using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Macs;
  13. using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Parameters;
  14. using BestHTTP.SecureProtocol.Org.BouncyCastle.Security;
  15. using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
  16. using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Date;
  17. using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.IO;
  18. namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Tls
  19. {
  20. /// <remarks>Some helper functions for MicroTLS.</remarks>
  21. public abstract class TlsUtilities
  22. {
  23. public static readonly byte[] EmptyBytes = new byte[0];
  24. public static readonly short[] EmptyShorts = new short[0];
  25. public static readonly int[] EmptyInts = new int[0];
  26. public static readonly long[] EmptyLongs = new long[0];
  27. public static void CheckUint8(int i)
  28. {
  29. if (!IsValidUint8(i))
  30. throw new TlsFatalAlert(AlertDescription.internal_error);
  31. }
  32. public static void CheckUint8(long i)
  33. {
  34. if (!IsValidUint8(i))
  35. throw new TlsFatalAlert(AlertDescription.internal_error);
  36. }
  37. public static void CheckUint16(int i)
  38. {
  39. if (!IsValidUint16(i))
  40. throw new TlsFatalAlert(AlertDescription.internal_error);
  41. }
  42. public static void CheckUint16(long i)
  43. {
  44. if (!IsValidUint16(i))
  45. throw new TlsFatalAlert(AlertDescription.internal_error);
  46. }
  47. public static void CheckUint24(int i)
  48. {
  49. if (!IsValidUint24(i))
  50. throw new TlsFatalAlert(AlertDescription.internal_error);
  51. }
  52. public static void CheckUint24(long i)
  53. {
  54. if (!IsValidUint24(i))
  55. throw new TlsFatalAlert(AlertDescription.internal_error);
  56. }
  57. public static void CheckUint32(long i)
  58. {
  59. if (!IsValidUint32(i))
  60. throw new TlsFatalAlert(AlertDescription.internal_error);
  61. }
  62. public static void CheckUint48(long i)
  63. {
  64. if (!IsValidUint48(i))
  65. throw new TlsFatalAlert(AlertDescription.internal_error);
  66. }
  67. public static void CheckUint64(long i)
  68. {
  69. if (!IsValidUint64(i))
  70. throw new TlsFatalAlert(AlertDescription.internal_error);
  71. }
  72. public static bool IsValidUint8(int i)
  73. {
  74. return (i & 0xFF) == i;
  75. }
  76. public static bool IsValidUint8(long i)
  77. {
  78. return (i & 0xFFL) == i;
  79. }
  80. public static bool IsValidUint16(int i)
  81. {
  82. return (i & 0xFFFF) == i;
  83. }
  84. public static bool IsValidUint16(long i)
  85. {
  86. return (i & 0xFFFFL) == i;
  87. }
  88. public static bool IsValidUint24(int i)
  89. {
  90. return (i & 0xFFFFFF) == i;
  91. }
  92. public static bool IsValidUint24(long i)
  93. {
  94. return (i & 0xFFFFFFL) == i;
  95. }
  96. public static bool IsValidUint32(long i)
  97. {
  98. return (i & 0xFFFFFFFFL) == i;
  99. }
  100. public static bool IsValidUint48(long i)
  101. {
  102. return (i & 0xFFFFFFFFFFFFL) == i;
  103. }
  104. public static bool IsValidUint64(long i)
  105. {
  106. return true;
  107. }
  108. public static bool IsSsl(TlsContext context)
  109. {
  110. return context.ServerVersion.IsSsl;
  111. }
  112. public static bool IsTlsV11(ProtocolVersion version)
  113. {
  114. return ProtocolVersion.TLSv11.IsEqualOrEarlierVersionOf(version.GetEquivalentTLSVersion());
  115. }
  116. public static bool IsTlsV11(TlsContext context)
  117. {
  118. return IsTlsV11(context.ServerVersion);
  119. }
  120. public static bool IsTlsV12(ProtocolVersion version)
  121. {
  122. return ProtocolVersion.TLSv12.IsEqualOrEarlierVersionOf(version.GetEquivalentTLSVersion());
  123. }
  124. public static bool IsTlsV12(TlsContext context)
  125. {
  126. return IsTlsV12(context.ServerVersion);
  127. }
  128. public static void WriteUint8(byte i, Stream output)
  129. {
  130. output.WriteByte(i);
  131. }
  132. public static void WriteUint8(byte i, byte[] buf, int offset)
  133. {
  134. buf[offset] = i;
  135. }
  136. public static void WriteUint16(int i, Stream output)
  137. {
  138. output.WriteByte((byte)(i >> 8));
  139. output.WriteByte((byte)i);
  140. }
  141. public static void WriteUint16(int i, byte[] buf, int offset)
  142. {
  143. buf[offset] = (byte)(i >> 8);
  144. buf[offset + 1] = (byte)i;
  145. }
  146. public static void WriteUint24(int i, Stream output)
  147. {
  148. output.WriteByte((byte)(i >> 16));
  149. output.WriteByte((byte)(i >> 8));
  150. output.WriteByte((byte)i);
  151. }
  152. public static void WriteUint24(int i, byte[] buf, int offset)
  153. {
  154. buf[offset] = (byte)(i >> 16);
  155. buf[offset + 1] = (byte)(i >> 8);
  156. buf[offset + 2] = (byte)i;
  157. }
  158. public static void WriteUint32(long i, Stream output)
  159. {
  160. output.WriteByte((byte)(i >> 24));
  161. output.WriteByte((byte)(i >> 16));
  162. output.WriteByte((byte)(i >> 8));
  163. output.WriteByte((byte)i);
  164. }
  165. public static void WriteUint32(long i, byte[] buf, int offset)
  166. {
  167. buf[offset] = (byte)(i >> 24);
  168. buf[offset + 1] = (byte)(i >> 16);
  169. buf[offset + 2] = (byte)(i >> 8);
  170. buf[offset + 3] = (byte)i;
  171. }
  172. public static void WriteUint48(long i, Stream output)
  173. {
  174. output.WriteByte((byte)(i >> 40));
  175. output.WriteByte((byte)(i >> 32));
  176. output.WriteByte((byte)(i >> 24));
  177. output.WriteByte((byte)(i >> 16));
  178. output.WriteByte((byte)(i >> 8));
  179. output.WriteByte((byte)i);
  180. }
  181. public static void WriteUint48(long i, byte[] buf, int offset)
  182. {
  183. buf[offset] = (byte)(i >> 40);
  184. buf[offset + 1] = (byte)(i >> 32);
  185. buf[offset + 2] = (byte)(i >> 24);
  186. buf[offset + 3] = (byte)(i >> 16);
  187. buf[offset + 4] = (byte)(i >> 8);
  188. buf[offset + 5] = (byte)i;
  189. }
  190. public static void WriteUint64(long i, Stream output)
  191. {
  192. output.WriteByte((byte)(i >> 56));
  193. output.WriteByte((byte)(i >> 48));
  194. output.WriteByte((byte)(i >> 40));
  195. output.WriteByte((byte)(i >> 32));
  196. output.WriteByte((byte)(i >> 24));
  197. output.WriteByte((byte)(i >> 16));
  198. output.WriteByte((byte)(i >> 8));
  199. output.WriteByte((byte)i);
  200. }
  201. public static void WriteUint64(long i, byte[] buf, int offset)
  202. {
  203. buf[offset] = (byte)(i >> 56);
  204. buf[offset + 1] = (byte)(i >> 48);
  205. buf[offset + 2] = (byte)(i >> 40);
  206. buf[offset + 3] = (byte)(i >> 32);
  207. buf[offset + 4] = (byte)(i >> 24);
  208. buf[offset + 5] = (byte)(i >> 16);
  209. buf[offset + 6] = (byte)(i >> 8);
  210. buf[offset + 7] = (byte)i;
  211. }
  212. public static void WriteOpaque8(byte[] buf, Stream output)
  213. {
  214. WriteUint8((byte)buf.Length, output);
  215. output.Write(buf, 0, buf.Length);
  216. }
  217. public static void WriteOpaque16(byte[] buf, Stream output)
  218. {
  219. WriteUint16(buf.Length, output);
  220. output.Write(buf, 0, buf.Length);
  221. }
  222. public static void WriteOpaque24(byte[] buf, Stream output)
  223. {
  224. WriteUint24(buf.Length, output);
  225. output.Write(buf, 0, buf.Length);
  226. }
  227. public static void WriteUint8Array(byte[] uints, Stream output)
  228. {
  229. output.Write(uints, 0, uints.Length);
  230. }
  231. public static void WriteUint8Array(byte[] uints, byte[] buf, int offset)
  232. {
  233. for (int i = 0; i < uints.Length; ++i)
  234. {
  235. WriteUint8(uints[i], buf, offset);
  236. ++offset;
  237. }
  238. }
  239. public static void WriteUint8ArrayWithUint8Length(byte[] uints, Stream output)
  240. {
  241. CheckUint8(uints.Length);
  242. WriteUint8((byte)uints.Length, output);
  243. WriteUint8Array(uints, output);
  244. }
  245. public static void WriteUint8ArrayWithUint8Length(byte[] uints, byte[] buf, int offset)
  246. {
  247. CheckUint8(uints.Length);
  248. WriteUint8((byte)uints.Length, buf, offset);
  249. WriteUint8Array(uints, buf, offset + 1);
  250. }
  251. public static void WriteUint16Array(int[] uints, Stream output)
  252. {
  253. for (int i = 0; i < uints.Length; ++i)
  254. {
  255. WriteUint16(uints[i], output);
  256. }
  257. }
  258. public static void WriteUint16Array(int[] uints, byte[] buf, int offset)
  259. {
  260. for (int i = 0; i < uints.Length; ++i)
  261. {
  262. WriteUint16(uints[i], buf, offset);
  263. offset += 2;
  264. }
  265. }
  266. public static void WriteUint16ArrayWithUint16Length(int[] uints, Stream output)
  267. {
  268. int length = 2 * uints.Length;
  269. CheckUint16(length);
  270. WriteUint16(length, output);
  271. WriteUint16Array(uints, output);
  272. }
  273. public static void WriteUint16ArrayWithUint16Length(int[] uints, byte[] buf, int offset)
  274. {
  275. int length = 2 * uints.Length;
  276. CheckUint16(length);
  277. WriteUint16(length, buf, offset);
  278. WriteUint16Array(uints, buf, offset + 2);
  279. }
  280. public static byte DecodeUint8(byte[] buf)
  281. {
  282. if (buf == null)
  283. throw new ArgumentNullException("buf");
  284. if (buf.Length != 1)
  285. throw new TlsFatalAlert(AlertDescription.decode_error);
  286. return ReadUint8(buf, 0);
  287. }
  288. public static byte[] DecodeUint8ArrayWithUint8Length(byte[] buf)
  289. {
  290. if (buf == null)
  291. throw new ArgumentNullException("buf");
  292. int count = ReadUint8(buf, 0);
  293. if (buf.Length != (count + 1))
  294. throw new TlsFatalAlert(AlertDescription.decode_error);
  295. byte[] uints = new byte[count];
  296. for (int i = 0; i < count; ++i)
  297. {
  298. uints[i] = ReadUint8(buf, i + 1);
  299. }
  300. return uints;
  301. }
  302. public static byte[] EncodeOpaque8(byte[] buf)
  303. {
  304. CheckUint8(buf.Length);
  305. return Arrays.Prepend(buf, (byte)buf.Length);
  306. }
  307. public static byte[] EncodeUint8(byte val)
  308. {
  309. CheckUint8(val);
  310. byte[] extensionData = new byte[1];
  311. WriteUint8(val, extensionData, 0);
  312. return extensionData;
  313. }
  314. public static byte[] EncodeUint8ArrayWithUint8Length(byte[] uints)
  315. {
  316. byte[] result = new byte[1 + uints.Length];
  317. WriteUint8ArrayWithUint8Length(uints, result, 0);
  318. return result;
  319. }
  320. public static byte[] EncodeUint16ArrayWithUint16Length(int[] uints)
  321. {
  322. int length = 2 * uints.Length;
  323. byte[] result = new byte[2 + length];
  324. WriteUint16ArrayWithUint16Length(uints, result, 0);
  325. return result;
  326. }
  327. public static byte ReadUint8(Stream input)
  328. {
  329. int i = input.ReadByte();
  330. if (i < 0)
  331. throw new EndOfStreamException();
  332. return (byte)i;
  333. }
  334. public static byte ReadUint8(byte[] buf, int offset)
  335. {
  336. return buf[offset];
  337. }
  338. public static int ReadUint16(Stream input)
  339. {
  340. int i1 = input.ReadByte();
  341. int i2 = input.ReadByte();
  342. if (i2 < 0)
  343. throw new EndOfStreamException();
  344. return (i1 << 8) | i2;
  345. }
  346. public static int ReadUint16(byte[] buf, int offset)
  347. {
  348. uint n = (uint)buf[offset] << 8;
  349. n |= (uint)buf[++offset];
  350. return (int)n;
  351. }
  352. public static int ReadUint24(Stream input)
  353. {
  354. int i1 = input.ReadByte();
  355. int i2 = input.ReadByte();
  356. int i3 = input.ReadByte();
  357. if (i3 < 0)
  358. throw new EndOfStreamException();
  359. return (i1 << 16) | (i2 << 8) | i3;
  360. }
  361. public static int ReadUint24(byte[] buf, int offset)
  362. {
  363. uint n = (uint)buf[offset] << 16;
  364. n |= (uint)buf[++offset] << 8;
  365. n |= (uint)buf[++offset];
  366. return (int)n;
  367. }
  368. public static long ReadUint32(Stream input)
  369. {
  370. int i1 = input.ReadByte();
  371. int i2 = input.ReadByte();
  372. int i3 = input.ReadByte();
  373. int i4 = input.ReadByte();
  374. if (i4 < 0)
  375. throw new EndOfStreamException();
  376. return (long)(uint)((i1 << 24) | (i2 << 16) | (i3 << 8) | i4);
  377. }
  378. public static long ReadUint32(byte[] buf, int offset)
  379. {
  380. uint n = (uint)buf[offset] << 24;
  381. n |= (uint)buf[++offset] << 16;
  382. n |= (uint)buf[++offset] << 8;
  383. n |= (uint)buf[++offset];
  384. return (long)n;
  385. }
  386. public static long ReadUint48(Stream input)
  387. {
  388. int hi = ReadUint24(input);
  389. int lo = ReadUint24(input);
  390. return ((long)(hi & 0xffffffffL) << 24) | (long)(lo & 0xffffffffL);
  391. }
  392. public static long ReadUint48(byte[] buf, int offset)
  393. {
  394. int hi = ReadUint24(buf, offset);
  395. int lo = ReadUint24(buf, offset + 3);
  396. return ((long)(hi & 0xffffffffL) << 24) | (long)(lo & 0xffffffffL);
  397. }
  398. public static byte[] ReadAllOrNothing(int length, Stream input)
  399. {
  400. if (length < 1)
  401. return EmptyBytes;
  402. byte[] buf = new byte[length];
  403. int read = Streams.ReadFully(input, buf);
  404. if (read == 0)
  405. return null;
  406. if (read != length)
  407. throw new EndOfStreamException();
  408. return buf;
  409. }
  410. public static byte[] ReadFully(int length, Stream input)
  411. {
  412. if (length < 1)
  413. return EmptyBytes;
  414. byte[] buf = new byte[length];
  415. if (length != Streams.ReadFully(input, buf))
  416. throw new EndOfStreamException();
  417. return buf;
  418. }
  419. public static void ReadFully(byte[] buf, Stream input)
  420. {
  421. if (Streams.ReadFully(input, buf, 0, buf.Length) < buf.Length)
  422. throw new EndOfStreamException();
  423. }
  424. public static byte[] ReadOpaque8(Stream input)
  425. {
  426. byte length = ReadUint8(input);
  427. byte[] bytes = new byte[length];
  428. ReadFully(bytes, input);
  429. return bytes;
  430. }
  431. public static byte[] ReadOpaque16(Stream input)
  432. {
  433. int length = ReadUint16(input);
  434. byte[] bytes = new byte[length];
  435. ReadFully(bytes, input);
  436. return bytes;
  437. }
  438. public static byte[] ReadOpaque24(Stream input)
  439. {
  440. int length = ReadUint24(input);
  441. return ReadFully(length, input);
  442. }
  443. public static byte[] ReadUint8Array(int count, Stream input)
  444. {
  445. byte[] uints = new byte[count];
  446. for (int i = 0; i < count; ++i)
  447. {
  448. uints[i] = ReadUint8(input);
  449. }
  450. return uints;
  451. }
  452. public static int[] ReadUint16Array(int count, Stream input)
  453. {
  454. int[] uints = new int[count];
  455. for (int i = 0; i < count; ++i)
  456. {
  457. uints[i] = ReadUint16(input);
  458. }
  459. return uints;
  460. }
  461. public static ProtocolVersion ReadVersion(byte[] buf, int offset)
  462. {
  463. return ProtocolVersion.Get(buf[offset], buf[offset + 1]);
  464. }
  465. public static ProtocolVersion ReadVersion(Stream input)
  466. {
  467. int i1 = input.ReadByte();
  468. int i2 = input.ReadByte();
  469. if (i2 < 0)
  470. throw new EndOfStreamException();
  471. return ProtocolVersion.Get(i1, i2);
  472. }
  473. public static int ReadVersionRaw(byte[] buf, int offset)
  474. {
  475. return (buf[offset] << 8) | buf[offset + 1];
  476. }
  477. public static int ReadVersionRaw(Stream input)
  478. {
  479. int i1 = input.ReadByte();
  480. int i2 = input.ReadByte();
  481. if (i2 < 0)
  482. throw new EndOfStreamException();
  483. return (i1 << 8) | i2;
  484. }
  485. public static Asn1Object ReadAsn1Object(byte[] encoding)
  486. {
  487. MemoryStream input = new MemoryStream(encoding, false);
  488. Asn1InputStream asn1 = new Asn1InputStream(input, encoding.Length);
  489. Asn1Object result = asn1.ReadObject();
  490. if (null == result)
  491. throw new TlsFatalAlert(AlertDescription.decode_error);
  492. if (input.Position != input.Length)
  493. throw new TlsFatalAlert(AlertDescription.decode_error);
  494. return result;
  495. }
  496. public static Asn1Object ReadDerObject(byte[] encoding)
  497. {
  498. /*
  499. * NOTE: The current ASN.1 parsing code can't enforce DER-only parsing, but since DER is
  500. * canonical, we can check it by re-encoding the result and comparing to the original.
  501. */
  502. Asn1Object result = ReadAsn1Object(encoding);
  503. byte[] check = result.GetEncoded(Asn1Encodable.Der);
  504. if (!Arrays.AreEqual(check, encoding))
  505. throw new TlsFatalAlert(AlertDescription.decode_error);
  506. return result;
  507. }
  508. public static void WriteGmtUnixTime(byte[] buf, int offset)
  509. {
  510. int t = (int)(DateTimeUtilities.CurrentUnixMs() / 1000L);
  511. buf[offset] = (byte)(t >> 24);
  512. buf[offset + 1] = (byte)(t >> 16);
  513. buf[offset + 2] = (byte)(t >> 8);
  514. buf[offset + 3] = (byte)t;
  515. }
  516. public static void WriteVersion(ProtocolVersion version, Stream output)
  517. {
  518. output.WriteByte((byte)version.MajorVersion);
  519. output.WriteByte((byte)version.MinorVersion);
  520. }
  521. public static void WriteVersion(ProtocolVersion version, byte[] buf, int offset)
  522. {
  523. buf[offset] = (byte)version.MajorVersion;
  524. buf[offset + 1] = (byte)version.MinorVersion;
  525. }
  526. public static IList GetAllSignatureAlgorithms()
  527. {
  528. IList v = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateArrayList(4);
  529. v.Add(SignatureAlgorithm.anonymous);
  530. v.Add(SignatureAlgorithm.rsa);
  531. v.Add(SignatureAlgorithm.dsa);
  532. v.Add(SignatureAlgorithm.ecdsa);
  533. return v;
  534. }
  535. public static IList GetDefaultDssSignatureAlgorithms()
  536. {
  537. return VectorOfOne(new SignatureAndHashAlgorithm(HashAlgorithm.sha1, SignatureAlgorithm.dsa));
  538. }
  539. public static IList GetDefaultECDsaSignatureAlgorithms()
  540. {
  541. return VectorOfOne(new SignatureAndHashAlgorithm(HashAlgorithm.sha1, SignatureAlgorithm.ecdsa));
  542. }
  543. public static IList GetDefaultRsaSignatureAlgorithms()
  544. {
  545. return VectorOfOne(new SignatureAndHashAlgorithm(HashAlgorithm.sha1, SignatureAlgorithm.rsa));
  546. }
  547. public static byte[] GetExtensionData(IDictionary extensions, int extensionType)
  548. {
  549. return extensions == null ? null : (byte[])extensions[extensionType];
  550. }
  551. public static IList GetDefaultSupportedSignatureAlgorithms()
  552. {
  553. byte[] hashAlgorithms = new byte[]{ HashAlgorithm.sha1, HashAlgorithm.sha224, HashAlgorithm.sha256,
  554. HashAlgorithm.sha384, HashAlgorithm.sha512 };
  555. byte[] signatureAlgorithms = new byte[]{ SignatureAlgorithm.rsa, SignatureAlgorithm.dsa,
  556. SignatureAlgorithm.ecdsa };
  557. IList result = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateArrayList();
  558. for (int i = 0; i < signatureAlgorithms.Length; ++i)
  559. {
  560. for (int j = 0; j < hashAlgorithms.Length; ++j)
  561. {
  562. result.Add(new SignatureAndHashAlgorithm(hashAlgorithms[j], signatureAlgorithms[i]));
  563. }
  564. }
  565. return result;
  566. }
  567. public static SignatureAndHashAlgorithm GetSignatureAndHashAlgorithm(TlsContext context,
  568. TlsSignerCredentials signerCredentials)
  569. {
  570. SignatureAndHashAlgorithm signatureAndHashAlgorithm = null;
  571. if (IsTlsV12(context))
  572. {
  573. signatureAndHashAlgorithm = signerCredentials.SignatureAndHashAlgorithm;
  574. if (signatureAndHashAlgorithm == null)
  575. throw new TlsFatalAlert(AlertDescription.internal_error);
  576. }
  577. return signatureAndHashAlgorithm;
  578. }
  579. public static bool HasExpectedEmptyExtensionData(IDictionary extensions, int extensionType,
  580. byte alertDescription)
  581. {
  582. byte[] extension_data = GetExtensionData(extensions, extensionType);
  583. if (extension_data == null)
  584. return false;
  585. if (extension_data.Length != 0)
  586. throw new TlsFatalAlert(alertDescription);
  587. return true;
  588. }
  589. public static TlsSession ImportSession(byte[] sessionID, SessionParameters sessionParameters)
  590. {
  591. return new TlsSessionImpl(sessionID, sessionParameters);
  592. }
  593. public static bool IsSignatureAlgorithmsExtensionAllowed(ProtocolVersion clientVersion)
  594. {
  595. return ProtocolVersion.TLSv12.IsEqualOrEarlierVersionOf(clientVersion.GetEquivalentTLSVersion());
  596. }
  597. /**
  598. * Add a 'signature_algorithms' extension to existing extensions.
  599. *
  600. * @param extensions A {@link Hashtable} to add the extension to.
  601. * @param supportedSignatureAlgorithms {@link Vector} containing at least 1 {@link SignatureAndHashAlgorithm}.
  602. * @throws IOException
  603. */
  604. public static void AddSignatureAlgorithmsExtension(IDictionary extensions, IList supportedSignatureAlgorithms)
  605. {
  606. extensions[ExtensionType.signature_algorithms] = CreateSignatureAlgorithmsExtension(supportedSignatureAlgorithms);
  607. }
  608. /**
  609. * Get a 'signature_algorithms' extension from extensions.
  610. *
  611. * @param extensions A {@link Hashtable} to get the extension from, if it is present.
  612. * @return A {@link Vector} containing at least 1 {@link SignatureAndHashAlgorithm}, or null.
  613. * @throws IOException
  614. */
  615. public static IList GetSignatureAlgorithmsExtension(IDictionary extensions)
  616. {
  617. byte[] extensionData = GetExtensionData(extensions, ExtensionType.signature_algorithms);
  618. return extensionData == null ? null : ReadSignatureAlgorithmsExtension(extensionData);
  619. }
  620. /**
  621. * Create a 'signature_algorithms' extension value.
  622. *
  623. * @param supportedSignatureAlgorithms A {@link Vector} containing at least 1 {@link SignatureAndHashAlgorithm}.
  624. * @return A byte array suitable for use as an extension value.
  625. * @throws IOException
  626. */
  627. public static byte[] CreateSignatureAlgorithmsExtension(IList supportedSignatureAlgorithms)
  628. {
  629. MemoryStream buf = new MemoryStream();
  630. // supported_signature_algorithms
  631. EncodeSupportedSignatureAlgorithms(supportedSignatureAlgorithms, false, buf);
  632. return buf.ToArray();
  633. }
  634. /**
  635. * Read 'signature_algorithms' extension data.
  636. *
  637. * @param extensionData The extension data.
  638. * @return A {@link Vector} containing at least 1 {@link SignatureAndHashAlgorithm}.
  639. * @throws IOException
  640. */
  641. public static IList ReadSignatureAlgorithmsExtension(byte[] extensionData)
  642. {
  643. if (extensionData == null)
  644. throw new ArgumentNullException("extensionData");
  645. MemoryStream buf = new MemoryStream(extensionData, false);
  646. // supported_signature_algorithms
  647. IList supported_signature_algorithms = ParseSupportedSignatureAlgorithms(false, buf);
  648. TlsProtocol.AssertEmpty(buf);
  649. return supported_signature_algorithms;
  650. }
  651. public static void EncodeSupportedSignatureAlgorithms(IList supportedSignatureAlgorithms, bool allowAnonymous,
  652. Stream output)
  653. {
  654. if (supportedSignatureAlgorithms == null)
  655. throw new ArgumentNullException("supportedSignatureAlgorithms");
  656. if (supportedSignatureAlgorithms.Count < 1 || supportedSignatureAlgorithms.Count >= (1 << 15))
  657. throw new ArgumentException("must have length from 1 to (2^15 - 1)", "supportedSignatureAlgorithms");
  658. // supported_signature_algorithms
  659. int length = 2 * supportedSignatureAlgorithms.Count;
  660. CheckUint16(length);
  661. WriteUint16(length, output);
  662. foreach (SignatureAndHashAlgorithm entry in supportedSignatureAlgorithms)
  663. {
  664. if (!allowAnonymous && entry.Signature == SignatureAlgorithm.anonymous)
  665. {
  666. /*
  667. * RFC 5246 7.4.1.4.1 The "anonymous" value is meaningless in this context but used
  668. * in Section 7.4.3. It MUST NOT appear in this extension.
  669. */
  670. throw new ArgumentException(
  671. "SignatureAlgorithm.anonymous MUST NOT appear in the signature_algorithms extension");
  672. }
  673. entry.Encode(output);
  674. }
  675. }
  676. public static IList ParseSupportedSignatureAlgorithms(bool allowAnonymous, Stream input)
  677. {
  678. // supported_signature_algorithms
  679. int length = ReadUint16(input);
  680. if (length < 2 || (length & 1) != 0)
  681. throw new TlsFatalAlert(AlertDescription.decode_error);
  682. int count = length / 2;
  683. IList supportedSignatureAlgorithms = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateArrayList(count);
  684. for (int i = 0; i < count; ++i)
  685. {
  686. SignatureAndHashAlgorithm entry = SignatureAndHashAlgorithm.Parse(input);
  687. if (!allowAnonymous && entry.Signature == SignatureAlgorithm.anonymous)
  688. {
  689. /*
  690. * RFC 5246 7.4.1.4.1 The "anonymous" value is meaningless in this context but used
  691. * in Section 7.4.3. It MUST NOT appear in this extension.
  692. */
  693. throw new TlsFatalAlert(AlertDescription.illegal_parameter);
  694. }
  695. supportedSignatureAlgorithms.Add(entry);
  696. }
  697. return supportedSignatureAlgorithms;
  698. }
  699. public static void VerifySupportedSignatureAlgorithm(IList supportedSignatureAlgorithms, SignatureAndHashAlgorithm signatureAlgorithm)
  700. {
  701. if (supportedSignatureAlgorithms == null)
  702. throw new ArgumentNullException("supportedSignatureAlgorithms");
  703. if (supportedSignatureAlgorithms.Count < 1 || supportedSignatureAlgorithms.Count >= (1 << 15))
  704. throw new ArgumentException("must have length from 1 to (2^15 - 1)", "supportedSignatureAlgorithms");
  705. if (signatureAlgorithm == null)
  706. throw new ArgumentNullException("signatureAlgorithm");
  707. if (signatureAlgorithm.Signature != SignatureAlgorithm.anonymous)
  708. {
  709. foreach (SignatureAndHashAlgorithm entry in supportedSignatureAlgorithms)
  710. {
  711. if (entry.Hash == signatureAlgorithm.Hash && entry.Signature == signatureAlgorithm.Signature)
  712. return;
  713. }
  714. }
  715. throw new TlsFatalAlert(AlertDescription.illegal_parameter);
  716. }
  717. public static byte[] PRF(TlsContext context, byte[] secret, string asciiLabel, byte[] seed, int size)
  718. {
  719. ProtocolVersion version = context.ServerVersion;
  720. if (version.IsSsl)
  721. throw new InvalidOperationException("No PRF available for SSLv3 session");
  722. byte[] label = Strings.ToByteArray(asciiLabel);
  723. byte[] labelSeed = Concat(label, seed);
  724. int prfAlgorithm = context.SecurityParameters.PrfAlgorithm;
  725. if (prfAlgorithm == PrfAlgorithm.tls_prf_legacy)
  726. return PRF_legacy(secret, label, labelSeed, size);
  727. IDigest prfDigest = CreatePrfHash(prfAlgorithm);
  728. byte[] buf = new byte[size];
  729. HMacHash(prfDigest, secret, labelSeed, buf);
  730. return buf;
  731. }
  732. public static byte[] PRF_legacy(byte[] secret, string asciiLabel, byte[] seed, int size)
  733. {
  734. byte[] label = Strings.ToByteArray(asciiLabel);
  735. byte[] labelSeed = Concat(label, seed);
  736. return PRF_legacy(secret, label, labelSeed, size);
  737. }
  738. internal static byte[] PRF_legacy(byte[] secret, byte[] label, byte[] labelSeed, int size)
  739. {
  740. int s_half = (secret.Length + 1) / 2;
  741. byte[] s1 = new byte[s_half];
  742. byte[] s2 = new byte[s_half];
  743. Array.Copy(secret, 0, s1, 0, s_half);
  744. Array.Copy(secret, secret.Length - s_half, s2, 0, s_half);
  745. byte[] b1 = new byte[size];
  746. byte[] b2 = new byte[size];
  747. HMacHash(CreateHash(HashAlgorithm.md5), s1, labelSeed, b1);
  748. HMacHash(CreateHash(HashAlgorithm.sha1), s2, labelSeed, b2);
  749. for (int i = 0; i < size; i++)
  750. {
  751. b1[i] ^= b2[i];
  752. }
  753. return b1;
  754. }
  755. internal static byte[] Concat(byte[] a, byte[] b)
  756. {
  757. byte[] c = new byte[a.Length + b.Length];
  758. Array.Copy(a, 0, c, 0, a.Length);
  759. Array.Copy(b, 0, c, a.Length, b.Length);
  760. return c;
  761. }
  762. internal static void HMacHash(IDigest digest, byte[] secret, byte[] seed, byte[] output)
  763. {
  764. HMac mac = new HMac(digest);
  765. mac.Init(new KeyParameter(secret));
  766. byte[] a = seed;
  767. int size = digest.GetDigestSize();
  768. int iterations = (output.Length + size - 1) / size;
  769. byte[] buf = new byte[mac.GetMacSize()];
  770. byte[] buf2 = new byte[mac.GetMacSize()];
  771. for (int i = 0; i < iterations; i++)
  772. {
  773. mac.BlockUpdate(a, 0, a.Length);
  774. mac.DoFinal(buf, 0);
  775. a = buf;
  776. mac.BlockUpdate(a, 0, a.Length);
  777. mac.BlockUpdate(seed, 0, seed.Length);
  778. mac.DoFinal(buf2, 0);
  779. Array.Copy(buf2, 0, output, (size * i), System.Math.Min(size, output.Length - (size * i)));
  780. }
  781. }
  782. internal static void ValidateKeyUsage(X509CertificateStructure c, int keyUsageBits)
  783. {
  784. X509Extensions exts = c.TbsCertificate.Extensions;
  785. if (exts != null)
  786. {
  787. X509Extension ext = exts.GetExtension(X509Extensions.KeyUsage);
  788. if (ext != null)
  789. {
  790. DerBitString ku = KeyUsage.GetInstance(ext);
  791. int bits = ku.GetBytes()[0];
  792. if ((bits & keyUsageBits) != keyUsageBits)
  793. throw new TlsFatalAlert(AlertDescription.certificate_unknown);
  794. }
  795. }
  796. }
  797. internal static byte[] CalculateKeyBlock(TlsContext context, int size)
  798. {
  799. SecurityParameters securityParameters = context.SecurityParameters;
  800. byte[] master_secret = securityParameters.MasterSecret;
  801. byte[] seed = Concat(securityParameters.ServerRandom, securityParameters.ClientRandom);
  802. if (IsSsl(context))
  803. return CalculateKeyBlock_Ssl(master_secret, seed, size);
  804. return PRF(context, master_secret, ExporterLabel.key_expansion, seed, size);
  805. }
  806. internal static byte[] CalculateKeyBlock_Ssl(byte[] master_secret, byte[] random, int size)
  807. {
  808. IDigest md5 = CreateHash(HashAlgorithm.md5);
  809. IDigest sha1 = CreateHash(HashAlgorithm.sha1);
  810. int md5Size = md5.GetDigestSize();
  811. byte[] shatmp = new byte[sha1.GetDigestSize()];
  812. byte[] tmp = new byte[size + md5Size];
  813. int i = 0, pos = 0;
  814. while (pos < size)
  815. {
  816. byte[] ssl3Const = SSL3_CONST[i];
  817. sha1.BlockUpdate(ssl3Const, 0, ssl3Const.Length);
  818. sha1.BlockUpdate(master_secret, 0, master_secret.Length);
  819. sha1.BlockUpdate(random, 0, random.Length);
  820. sha1.DoFinal(shatmp, 0);
  821. md5.BlockUpdate(master_secret, 0, master_secret.Length);
  822. md5.BlockUpdate(shatmp, 0, shatmp.Length);
  823. md5.DoFinal(tmp, pos);
  824. pos += md5Size;
  825. ++i;
  826. }
  827. return Arrays.CopyOfRange(tmp, 0, size);
  828. }
  829. internal static byte[] CalculateMasterSecret(TlsContext context, byte[] pre_master_secret)
  830. {
  831. SecurityParameters securityParameters = context.SecurityParameters;
  832. byte[] seed = securityParameters.IsExtendedMasterSecret
  833. ? securityParameters.SessionHash
  834. : Concat(securityParameters.ClientRandom, securityParameters.ServerRandom);
  835. if (IsSsl(context))
  836. return CalculateMasterSecret_Ssl(pre_master_secret, seed);
  837. string asciiLabel = securityParameters.IsExtendedMasterSecret
  838. ? ExporterLabel.extended_master_secret
  839. : ExporterLabel.master_secret;
  840. return PRF(context, pre_master_secret, asciiLabel, seed, 48);
  841. }
  842. internal static byte[] CalculateMasterSecret_Ssl(byte[] pre_master_secret, byte[] random)
  843. {
  844. IDigest md5 = CreateHash(HashAlgorithm.md5);
  845. IDigest sha1 = CreateHash(HashAlgorithm.sha1);
  846. int md5Size = md5.GetDigestSize();
  847. byte[] shatmp = new byte[sha1.GetDigestSize()];
  848. byte[] rval = new byte[md5Size * 3];
  849. int pos = 0;
  850. for (int i = 0; i < 3; ++i)
  851. {
  852. byte[] ssl3Const = SSL3_CONST[i];
  853. sha1.BlockUpdate(ssl3Const, 0, ssl3Const.Length);
  854. sha1.BlockUpdate(pre_master_secret, 0, pre_master_secret.Length);
  855. sha1.BlockUpdate(random, 0, random.Length);
  856. sha1.DoFinal(shatmp, 0);
  857. md5.BlockUpdate(pre_master_secret, 0, pre_master_secret.Length);
  858. md5.BlockUpdate(shatmp, 0, shatmp.Length);
  859. md5.DoFinal(rval, pos);
  860. pos += md5Size;
  861. }
  862. return rval;
  863. }
  864. internal static byte[] CalculateVerifyData(TlsContext context, string asciiLabel, byte[] handshakeHash)
  865. {
  866. if (IsSsl(context))
  867. return handshakeHash;
  868. SecurityParameters securityParameters = context.SecurityParameters;
  869. byte[] master_secret = securityParameters.MasterSecret;
  870. int verify_data_length = securityParameters.VerifyDataLength;
  871. return PRF(context, master_secret, asciiLabel, handshakeHash, verify_data_length);
  872. }
  873. public static IDigest CreateHash(byte hashAlgorithm)
  874. {
  875. switch (hashAlgorithm)
  876. {
  877. case HashAlgorithm.md5:
  878. return new MD5Digest();
  879. case HashAlgorithm.sha1:
  880. return new Sha1Digest();
  881. case HashAlgorithm.sha224:
  882. return new Sha224Digest();
  883. case HashAlgorithm.sha256:
  884. return new Sha256Digest();
  885. case HashAlgorithm.sha384:
  886. return new Sha384Digest();
  887. case HashAlgorithm.sha512:
  888. return new Sha512Digest();
  889. default:
  890. throw new ArgumentException("unknown HashAlgorithm", "hashAlgorithm");
  891. }
  892. }
  893. public static IDigest CreateHash(SignatureAndHashAlgorithm signatureAndHashAlgorithm)
  894. {
  895. return signatureAndHashAlgorithm == null
  896. ? new CombinedHash()
  897. : CreateHash(signatureAndHashAlgorithm.Hash);
  898. }
  899. public static IDigest CloneHash(byte hashAlgorithm, IDigest hash)
  900. {
  901. switch (hashAlgorithm)
  902. {
  903. case HashAlgorithm.md5:
  904. return new MD5Digest((MD5Digest)hash);
  905. case HashAlgorithm.sha1:
  906. return new Sha1Digest((Sha1Digest)hash);
  907. case HashAlgorithm.sha224:
  908. return new Sha224Digest((Sha224Digest)hash);
  909. case HashAlgorithm.sha256:
  910. return new Sha256Digest((Sha256Digest)hash);
  911. case HashAlgorithm.sha384:
  912. return new Sha384Digest((Sha384Digest)hash);
  913. case HashAlgorithm.sha512:
  914. return new Sha512Digest((Sha512Digest)hash);
  915. default:
  916. throw new ArgumentException("unknown HashAlgorithm", "hashAlgorithm");
  917. }
  918. }
  919. public static IDigest CreatePrfHash(int prfAlgorithm)
  920. {
  921. switch (prfAlgorithm)
  922. {
  923. case PrfAlgorithm.tls_prf_legacy:
  924. return new CombinedHash();
  925. default:
  926. return CreateHash(GetHashAlgorithmForPrfAlgorithm(prfAlgorithm));
  927. }
  928. }
  929. public static IDigest ClonePrfHash(int prfAlgorithm, IDigest hash)
  930. {
  931. switch (prfAlgorithm)
  932. {
  933. case PrfAlgorithm.tls_prf_legacy:
  934. return new CombinedHash((CombinedHash)hash);
  935. default:
  936. return CloneHash(GetHashAlgorithmForPrfAlgorithm(prfAlgorithm), hash);
  937. }
  938. }
  939. public static byte GetHashAlgorithmForPrfAlgorithm(int prfAlgorithm)
  940. {
  941. switch (prfAlgorithm)
  942. {
  943. case PrfAlgorithm.tls_prf_legacy:
  944. throw new ArgumentException("legacy PRF not a valid algorithm", "prfAlgorithm");
  945. case PrfAlgorithm.tls_prf_sha256:
  946. return HashAlgorithm.sha256;
  947. case PrfAlgorithm.tls_prf_sha384:
  948. return HashAlgorithm.sha384;
  949. default:
  950. throw new ArgumentException("unknown PrfAlgorithm", "prfAlgorithm");
  951. }
  952. }
  953. public static DerObjectIdentifier GetOidForHashAlgorithm(byte hashAlgorithm)
  954. {
  955. switch (hashAlgorithm)
  956. {
  957. case HashAlgorithm.md5:
  958. return PkcsObjectIdentifiers.MD5;
  959. case HashAlgorithm.sha1:
  960. return X509ObjectIdentifiers.IdSha1;
  961. case HashAlgorithm.sha224:
  962. return NistObjectIdentifiers.IdSha224;
  963. case HashAlgorithm.sha256:
  964. return NistObjectIdentifiers.IdSha256;
  965. case HashAlgorithm.sha384:
  966. return NistObjectIdentifiers.IdSha384;
  967. case HashAlgorithm.sha512:
  968. return NistObjectIdentifiers.IdSha512;
  969. default:
  970. throw new ArgumentException("unknown HashAlgorithm", "hashAlgorithm");
  971. }
  972. }
  973. internal static short GetClientCertificateType(Certificate clientCertificate, Certificate serverCertificate)
  974. {
  975. if (clientCertificate.IsEmpty)
  976. return -1;
  977. X509CertificateStructure x509Cert = clientCertificate.GetCertificateAt(0);
  978. SubjectPublicKeyInfo keyInfo = x509Cert.SubjectPublicKeyInfo;
  979. try
  980. {
  981. AsymmetricKeyParameter publicKey = PublicKeyFactory.CreateKey(keyInfo);
  982. if (publicKey.IsPrivate)
  983. throw new TlsFatalAlert(AlertDescription.internal_error);
  984. /*
  985. * TODO RFC 5246 7.4.6. The certificates MUST be signed using an acceptable hash/
  986. * signature algorithm pair, as described in Section 7.4.4. Note that this relaxes the
  987. * constraints on certificate-signing algorithms found in prior versions of TLS.
  988. */
  989. /*
  990. * RFC 5246 7.4.6. Client Certificate
  991. */
  992. /*
  993. * RSA public key; the certificate MUST allow the key to be used for signing with the
  994. * signature scheme and hash algorithm that will be employed in the certificate verify
  995. * message.
  996. */
  997. if (publicKey is RsaKeyParameters)
  998. {
  999. ValidateKeyUsage(x509Cert, KeyUsage.DigitalSignature);
  1000. return ClientCertificateType.rsa_sign;
  1001. }
  1002. /*
  1003. * DSA public key; the certificate MUST allow the key to be used for signing with the
  1004. * hash algorithm that will be employed in the certificate verify message.
  1005. */
  1006. if (publicKey is DsaPublicKeyParameters)
  1007. {
  1008. ValidateKeyUsage(x509Cert, KeyUsage.DigitalSignature);
  1009. return ClientCertificateType.dss_sign;
  1010. }
  1011. /*
  1012. * ECDSA-capable public key; the certificate MUST allow the key to be used for signing
  1013. * with the hash algorithm that will be employed in the certificate verify message; the
  1014. * public key MUST use a curve and point format supported by the server.
  1015. */
  1016. if (publicKey is ECPublicKeyParameters)
  1017. {
  1018. ValidateKeyUsage(x509Cert, KeyUsage.DigitalSignature);
  1019. // TODO Check the curve and point format
  1020. return ClientCertificateType.ecdsa_sign;
  1021. }
  1022. // TODO Add support for ClientCertificateType.*_fixed_*
  1023. throw new TlsFatalAlert(AlertDescription.unsupported_certificate);
  1024. }
  1025. catch (Exception e)
  1026. {
  1027. throw new TlsFatalAlert(AlertDescription.unsupported_certificate, e);
  1028. }
  1029. }
  1030. internal static void TrackHashAlgorithms(TlsHandshakeHash handshakeHash, IList supportedSignatureAlgorithms)
  1031. {
  1032. if (supportedSignatureAlgorithms != null)
  1033. {
  1034. foreach (SignatureAndHashAlgorithm signatureAndHashAlgorithm in supportedSignatureAlgorithms)
  1035. {
  1036. byte hashAlgorithm = signatureAndHashAlgorithm.Hash;
  1037. if (HashAlgorithm.IsRecognized(hashAlgorithm))
  1038. {
  1039. handshakeHash.TrackHashAlgorithm(hashAlgorithm);
  1040. }
  1041. else //if (HashAlgorithm.IsPrivate(hashAlgorithm))
  1042. {
  1043. // TODO Support values in the "Reserved for Private Use" range
  1044. }
  1045. }
  1046. }
  1047. }
  1048. public static bool HasSigningCapability(byte clientCertificateType)
  1049. {
  1050. switch (clientCertificateType)
  1051. {
  1052. case ClientCertificateType.dss_sign:
  1053. case ClientCertificateType.ecdsa_sign:
  1054. case ClientCertificateType.rsa_sign:
  1055. return true;
  1056. default:
  1057. return false;
  1058. }
  1059. }
  1060. public static TlsSigner CreateTlsSigner(byte clientCertificateType)
  1061. {
  1062. switch (clientCertificateType)
  1063. {
  1064. case ClientCertificateType.dss_sign:
  1065. return new TlsDssSigner();
  1066. case ClientCertificateType.ecdsa_sign:
  1067. return new TlsECDsaSigner();
  1068. case ClientCertificateType.rsa_sign:
  1069. return new TlsRsaSigner();
  1070. default:
  1071. throw new ArgumentException("not a type with signing capability", "clientCertificateType");
  1072. }
  1073. }
  1074. internal static readonly byte[] SSL_CLIENT = {0x43, 0x4C, 0x4E, 0x54};
  1075. internal static readonly byte[] SSL_SERVER = {0x53, 0x52, 0x56, 0x52};
  1076. // SSL3 magic mix constants ("A", "BB", "CCC", ...)
  1077. internal static readonly byte[][] SSL3_CONST = GenSsl3Const();
  1078. private static byte[][] GenSsl3Const()
  1079. {
  1080. int n = 10;
  1081. byte[][] arr = new byte[n][];
  1082. for (int i = 0; i < n; i++)
  1083. {
  1084. byte[] b = new byte[i + 1];
  1085. Arrays.Fill(b, (byte)('A' + i));
  1086. arr[i] = b;
  1087. }
  1088. return arr;
  1089. }
  1090. private static IList VectorOfOne(object obj)
  1091. {
  1092. IList v = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateArrayList(1);
  1093. v.Add(obj);
  1094. return v;
  1095. }
  1096. public static int GetCipherType(int ciphersuite)
  1097. {
  1098. switch (GetEncryptionAlgorithm(ciphersuite))
  1099. {
  1100. case EncryptionAlgorithm.AES_128_CCM:
  1101. case EncryptionAlgorithm.AES_128_CCM_8:
  1102. case EncryptionAlgorithm.AES_128_GCM:
  1103. case EncryptionAlgorithm.AES_128_OCB_TAGLEN96:
  1104. case EncryptionAlgorithm.AES_256_CCM:
  1105. case EncryptionAlgorithm.AES_256_CCM_8:
  1106. case EncryptionAlgorithm.AES_256_GCM:
  1107. case EncryptionAlgorithm.AES_256_OCB_TAGLEN96:
  1108. case EncryptionAlgorithm.CAMELLIA_128_GCM:
  1109. case EncryptionAlgorithm.CAMELLIA_256_GCM:
  1110. case EncryptionAlgorithm.CHACHA20_POLY1305:
  1111. return CipherType.aead;
  1112. case EncryptionAlgorithm.RC2_CBC_40:
  1113. case EncryptionAlgorithm.IDEA_CBC:
  1114. case EncryptionAlgorithm.DES40_CBC:
  1115. case EncryptionAlgorithm.DES_CBC:
  1116. case EncryptionAlgorithm.cls_3DES_EDE_CBC:
  1117. case EncryptionAlgorithm.AES_128_CBC:
  1118. case EncryptionAlgorithm.AES_256_CBC:
  1119. case EncryptionAlgorithm.CAMELLIA_128_CBC:
  1120. case EncryptionAlgorithm.CAMELLIA_256_CBC:
  1121. case EncryptionAlgorithm.SEED_CBC:
  1122. return CipherType.block;
  1123. case EncryptionAlgorithm.NULL:
  1124. case EncryptionAlgorithm.RC4_40:
  1125. case EncryptionAlgorithm.RC4_128:
  1126. return CipherType.stream;
  1127. default:
  1128. throw new TlsFatalAlert(AlertDescription.internal_error);
  1129. }
  1130. }
  1131. public static int GetEncryptionAlgorithm(int ciphersuite)
  1132. {
  1133. switch (ciphersuite)
  1134. {
  1135. case CipherSuite.TLS_DH_anon_WITH_3DES_EDE_CBC_SHA:
  1136. case CipherSuite.TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA:
  1137. case CipherSuite.TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA:
  1138. case CipherSuite.TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA:
  1139. case CipherSuite.TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA:
  1140. case CipherSuite.TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:
  1141. case CipherSuite.TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA:
  1142. case CipherSuite.TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA:
  1143. case CipherSuite.TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA:
  1144. case CipherSuite.TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA:
  1145. case CipherSuite.TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA:
  1146. case CipherSuite.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA:
  1147. case CipherSuite.TLS_PSK_WITH_3DES_EDE_CBC_SHA:
  1148. case CipherSuite.TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA:
  1149. case CipherSuite.TLS_RSA_WITH_3DES_EDE_CBC_SHA:
  1150. case CipherSuite.TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA:
  1151. case CipherSuite.TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA:
  1152. case CipherSuite.TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA:
  1153. return EncryptionAlgorithm.cls_3DES_EDE_CBC;
  1154. case CipherSuite.TLS_DH_anon_WITH_AES_128_CBC_SHA:
  1155. case CipherSuite.TLS_DH_anon_WITH_AES_128_CBC_SHA256:
  1156. case CipherSuite.TLS_DH_DSS_WITH_AES_128_CBC_SHA:
  1157. case CipherSuite.TLS_DH_DSS_WITH_AES_128_CBC_SHA256:
  1158. case CipherSuite.TLS_DH_RSA_WITH_AES_128_CBC_SHA:
  1159. case CipherSuite.TLS_DH_RSA_WITH_AES_128_CBC_SHA256:
  1160. case CipherSuite.TLS_DHE_DSS_WITH_AES_128_CBC_SHA:
  1161. case CipherSuite.TLS_DHE_DSS_WITH_AES_128_CBC_SHA256:
  1162. case CipherSuite.TLS_DHE_PSK_WITH_AES_128_CBC_SHA:
  1163. case CipherSuite.TLS_DHE_PSK_WITH_AES_128_CBC_SHA256:
  1164. case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA:
  1165. case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256:
  1166. case CipherSuite.TLS_ECDH_anon_WITH_AES_128_CBC_SHA:
  1167. case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA:
  1168. case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256:
  1169. case CipherSuite.TLS_ECDH_RSA_WITH_AES_128_CBC_SHA:
  1170. case CipherSuite.TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256:
  1171. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:
  1172. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
  1173. case CipherSuite.TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA:
  1174. case CipherSuite.TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256:
  1175. case CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:
  1176. case CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
  1177. case CipherSuite.TLS_PSK_WITH_AES_128_CBC_SHA:
  1178. case CipherSuite.TLS_PSK_WITH_AES_128_CBC_SHA256:
  1179. case CipherSuite.TLS_RSA_PSK_WITH_AES_128_CBC_SHA:
  1180. case CipherSuite.TLS_RSA_PSK_WITH_AES_128_CBC_SHA256:
  1181. case CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA:
  1182. case CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA256:
  1183. case CipherSuite.TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA:
  1184. case CipherSuite.TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA:
  1185. case CipherSuite.TLS_SRP_SHA_WITH_AES_128_CBC_SHA:
  1186. return EncryptionAlgorithm.AES_128_CBC;
  1187. case CipherSuite.TLS_DHE_PSK_WITH_AES_128_CCM:
  1188. case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CCM:
  1189. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CCM:
  1190. case CipherSuite.TLS_PSK_WITH_AES_128_CCM:
  1191. case CipherSuite.TLS_RSA_WITH_AES_128_CCM:
  1192. return EncryptionAlgorithm.AES_128_CCM;
  1193. case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CCM_8:
  1194. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8:
  1195. case CipherSuite.TLS_PSK_DHE_WITH_AES_128_CCM_8:
  1196. case CipherSuite.TLS_PSK_WITH_AES_128_CCM_8:
  1197. case CipherSuite.TLS_RSA_WITH_AES_128_CCM_8:
  1198. return EncryptionAlgorithm.AES_128_CCM_8;
  1199. case CipherSuite.TLS_DH_anon_WITH_AES_128_GCM_SHA256:
  1200. case CipherSuite.TLS_DH_DSS_WITH_AES_128_GCM_SHA256:
  1201. case CipherSuite.TLS_DH_RSA_WITH_AES_128_GCM_SHA256:
  1202. case CipherSuite.TLS_DHE_DSS_WITH_AES_128_GCM_SHA256:
  1203. case CipherSuite.TLS_DHE_PSK_WITH_AES_128_GCM_SHA256:
  1204. case CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256:
  1205. case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256:
  1206. case CipherSuite.TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256:
  1207. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
  1208. case CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
  1209. case CipherSuite.TLS_PSK_WITH_AES_128_GCM_SHA256:
  1210. case CipherSuite.TLS_RSA_PSK_WITH_AES_128_GCM_SHA256:
  1211. case CipherSuite.TLS_RSA_WITH_AES_128_GCM_SHA256:
  1212. return EncryptionAlgorithm.AES_128_GCM;
  1213. case CipherSuite.DRAFT_TLS_DHE_PSK_WITH_AES_128_OCB:
  1214. case CipherSuite.DRAFT_TLS_DHE_RSA_WITH_AES_128_OCB:
  1215. case CipherSuite.DRAFT_TLS_ECDHE_ECDSA_WITH_AES_128_OCB:
  1216. case CipherSuite.DRAFT_TLS_ECDHE_PSK_WITH_AES_128_OCB:
  1217. case CipherSuite.DRAFT_TLS_ECDHE_RSA_WITH_AES_128_OCB:
  1218. case CipherSuite.DRAFT_TLS_PSK_WITH_AES_128_OCB:
  1219. return EncryptionAlgorithm.AES_128_OCB_TAGLEN96;
  1220. case CipherSuite.TLS_DH_anon_WITH_AES_256_CBC_SHA:
  1221. case CipherSuite.TLS_DH_anon_WITH_AES_256_CBC_SHA256:
  1222. case CipherSuite.TLS_DH_DSS_WITH_AES_256_CBC_SHA:
  1223. case CipherSuite.TLS_DH_DSS_WITH_AES_256_CBC_SHA256:
  1224. case CipherSuite.TLS_DH_RSA_WITH_AES_256_CBC_SHA:
  1225. case CipherSuite.TLS_DH_RSA_WITH_AES_256_CBC_SHA256:
  1226. case CipherSuite.TLS_DHE_DSS_WITH_AES_256_CBC_SHA:
  1227. case CipherSuite.TLS_DHE_DSS_WITH_AES_256_CBC_SHA256:
  1228. case CipherSuite.TLS_DHE_PSK_WITH_AES_256_CBC_SHA:
  1229. case CipherSuite.TLS_DHE_PSK_WITH_AES_256_CBC_SHA384:
  1230. case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA:
  1231. case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256:
  1232. case CipherSuite.TLS_ECDH_anon_WITH_AES_256_CBC_SHA:
  1233. case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA:
  1234. case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384:
  1235. case CipherSuite.TLS_ECDH_RSA_WITH_AES_256_CBC_SHA:
  1236. case CipherSuite.TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384:
  1237. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:
  1238. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:
  1239. case CipherSuite.TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA:
  1240. case CipherSuite.TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384:
  1241. case CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:
  1242. case CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:
  1243. case CipherSuite.TLS_PSK_WITH_AES_256_CBC_SHA:
  1244. case CipherSuite.TLS_PSK_WITH_AES_256_CBC_SHA384:
  1245. case CipherSuite.TLS_RSA_PSK_WITH_AES_256_CBC_SHA:
  1246. case CipherSuite.TLS_RSA_PSK_WITH_AES_256_CBC_SHA384:
  1247. case CipherSuite.TLS_RSA_WITH_AES_256_CBC_SHA:
  1248. case CipherSuite.TLS_RSA_WITH_AES_256_CBC_SHA256:
  1249. case CipherSuite.TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA:
  1250. case CipherSuite.TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA:
  1251. case CipherSuite.TLS_SRP_SHA_WITH_AES_256_CBC_SHA:
  1252. return EncryptionAlgorithm.AES_256_CBC;
  1253. case CipherSuite.TLS_DHE_PSK_WITH_AES_256_CCM:
  1254. case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CCM:
  1255. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CCM:
  1256. case CipherSuite.TLS_PSK_WITH_AES_256_CCM:
  1257. case CipherSuite.TLS_RSA_WITH_AES_256_CCM:
  1258. return EncryptionAlgorithm.AES_256_CCM;
  1259. case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CCM_8:
  1260. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8:
  1261. case CipherSuite.TLS_PSK_DHE_WITH_AES_256_CCM_8:
  1262. case CipherSuite.TLS_PSK_WITH_AES_256_CCM_8:
  1263. case CipherSuite.TLS_RSA_WITH_AES_256_CCM_8:
  1264. return EncryptionAlgorithm.AES_256_CCM_8;
  1265. case CipherSuite.TLS_DH_anon_WITH_AES_256_GCM_SHA384:
  1266. case CipherSuite.TLS_DH_DSS_WITH_AES_256_GCM_SHA384:
  1267. case CipherSuite.TLS_DH_RSA_WITH_AES_256_GCM_SHA384:
  1268. case CipherSuite.TLS_DHE_DSS_WITH_AES_256_GCM_SHA384:
  1269. case CipherSuite.TLS_DHE_PSK_WITH_AES_256_GCM_SHA384:
  1270. case CipherSuite.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384:
  1271. case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384:
  1272. case CipherSuite.TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384:
  1273. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:
  1274. case CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:
  1275. case CipherSuite.TLS_PSK_WITH_AES_256_GCM_SHA384:
  1276. case CipherSuite.TLS_RSA_PSK_WITH_AES_256_GCM_SHA384:
  1277. case CipherSuite.TLS_RSA_WITH_AES_256_GCM_SHA384:
  1278. return EncryptionAlgorithm.AES_256_GCM;
  1279. case CipherSuite.DRAFT_TLS_DHE_PSK_WITH_AES_256_OCB:
  1280. case CipherSuite.DRAFT_TLS_DHE_RSA_WITH_AES_256_OCB:
  1281. case CipherSuite.DRAFT_TLS_ECDHE_ECDSA_WITH_AES_256_OCB:
  1282. case CipherSuite.DRAFT_TLS_ECDHE_PSK_WITH_AES_256_OCB:
  1283. case CipherSuite.DRAFT_TLS_ECDHE_RSA_WITH_AES_256_OCB:
  1284. case CipherSuite.DRAFT_TLS_PSK_WITH_AES_256_OCB:
  1285. return EncryptionAlgorithm.AES_256_OCB_TAGLEN96;
  1286. case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA:
  1287. case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256:
  1288. case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA:
  1289. case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256:
  1290. case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA:
  1291. case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256:
  1292. case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA:
  1293. case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256:
  1294. case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256:
  1295. case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA:
  1296. case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256:
  1297. case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256:
  1298. case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256:
  1299. case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256:
  1300. case CipherSuite.TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256:
  1301. case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256:
  1302. case CipherSuite.TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256:
  1303. case CipherSuite.TLS_RSA_WITH_CAMELLIA_128_CBC_SHA:
  1304. case CipherSuite.TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256:
  1305. case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256:
  1306. return EncryptionAlgorithm.CAMELLIA_128_CBC;
  1307. case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256:
  1308. case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256:
  1309. case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256:
  1310. case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256:
  1311. case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256:
  1312. case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256:
  1313. case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256:
  1314. case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256:
  1315. case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256:
  1316. case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256:
  1317. case CipherSuite.TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256:
  1318. case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256:
  1319. case CipherSuite.TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256:
  1320. return EncryptionAlgorithm.CAMELLIA_128_GCM;
  1321. case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA:
  1322. case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256:
  1323. case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA:
  1324. case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256:
  1325. case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA:
  1326. case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256:
  1327. case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA:
  1328. case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256:
  1329. case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384:
  1330. case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA:
  1331. case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256:
  1332. case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384:
  1333. case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384:
  1334. case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384:
  1335. case CipherSuite.TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384:
  1336. case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384:
  1337. case CipherSuite.TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384:
  1338. case CipherSuite.TLS_RSA_WITH_CAMELLIA_256_CBC_SHA:
  1339. case CipherSuite.TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256:
  1340. case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384:
  1341. return EncryptionAlgorithm.CAMELLIA_256_CBC;
  1342. case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384:
  1343. case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384:
  1344. case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384:
  1345. case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384:
  1346. case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384:
  1347. case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384:
  1348. case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384:
  1349. case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384:
  1350. case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384:
  1351. case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384:
  1352. case CipherSuite.TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384:
  1353. case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384:
  1354. case CipherSuite.TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384:
  1355. return EncryptionAlgorithm.CAMELLIA_256_GCM;
  1356. case CipherSuite.DRAFT_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
  1357. case CipherSuite.DRAFT_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
  1358. case CipherSuite.DRAFT_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256:
  1359. case CipherSuite.DRAFT_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
  1360. case CipherSuite.DRAFT_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
  1361. case CipherSuite.DRAFT_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256:
  1362. case CipherSuite.DRAFT_TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256:
  1363. return EncryptionAlgorithm.CHACHA20_POLY1305;
  1364. case CipherSuite.TLS_RSA_WITH_NULL_MD5:
  1365. return EncryptionAlgorithm.NULL;
  1366. case CipherSuite.TLS_DHE_PSK_WITH_NULL_SHA:
  1367. case CipherSuite.TLS_ECDH_anon_WITH_NULL_SHA:
  1368. case CipherSuite.TLS_ECDH_ECDSA_WITH_NULL_SHA:
  1369. case CipherSuite.TLS_ECDH_RSA_WITH_NULL_SHA:
  1370. case CipherSuite.TLS_ECDHE_ECDSA_WITH_NULL_SHA:
  1371. case CipherSuite.TLS_ECDHE_PSK_WITH_NULL_SHA:
  1372. case CipherSuite.TLS_ECDHE_RSA_WITH_NULL_SHA:
  1373. case CipherSuite.TLS_PSK_WITH_NULL_SHA:
  1374. case CipherSuite.TLS_RSA_PSK_WITH_NULL_SHA:
  1375. case CipherSuite.TLS_RSA_WITH_NULL_SHA:
  1376. return EncryptionAlgorithm.NULL;
  1377. case CipherSuite.TLS_DHE_PSK_WITH_NULL_SHA256:
  1378. case CipherSuite.TLS_ECDHE_PSK_WITH_NULL_SHA256:
  1379. case CipherSuite.TLS_PSK_WITH_NULL_SHA256:
  1380. case CipherSuite.TLS_RSA_PSK_WITH_NULL_SHA256:
  1381. case CipherSuite.TLS_RSA_WITH_NULL_SHA256:
  1382. return EncryptionAlgorithm.NULL;
  1383. case CipherSuite.TLS_DHE_PSK_WITH_NULL_SHA384:
  1384. case CipherSuite.TLS_ECDHE_PSK_WITH_NULL_SHA384:
  1385. case CipherSuite.TLS_PSK_WITH_NULL_SHA384:
  1386. case CipherSuite.TLS_RSA_PSK_WITH_NULL_SHA384:
  1387. return EncryptionAlgorithm.NULL;
  1388. case CipherSuite.TLS_DH_anon_WITH_RC4_128_MD5:
  1389. case CipherSuite.TLS_RSA_WITH_RC4_128_MD5:
  1390. return EncryptionAlgorithm.RC4_128;
  1391. case CipherSuite.TLS_DHE_PSK_WITH_RC4_128_SHA:
  1392. case CipherSuite.TLS_ECDH_anon_WITH_RC4_128_SHA:
  1393. case CipherSuite.TLS_ECDH_ECDSA_WITH_RC4_128_SHA:
  1394. case CipherSuite.TLS_ECDH_RSA_WITH_RC4_128_SHA:
  1395. case CipherSuite.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA:
  1396. case CipherSuite.TLS_ECDHE_PSK_WITH_RC4_128_SHA:
  1397. case CipherSuite.TLS_ECDHE_RSA_WITH_RC4_128_SHA:
  1398. case CipherSuite.TLS_PSK_WITH_RC4_128_SHA:
  1399. case CipherSuite.TLS_RSA_WITH_RC4_128_SHA:
  1400. case CipherSuite.TLS_RSA_PSK_WITH_RC4_128_SHA:
  1401. return EncryptionAlgorithm.RC4_128;
  1402. case CipherSuite.TLS_DH_anon_WITH_SEED_CBC_SHA:
  1403. case CipherSuite.TLS_DH_DSS_WITH_SEED_CBC_SHA:
  1404. case CipherSuite.TLS_DH_RSA_WITH_SEED_CBC_SHA:
  1405. case CipherSuite.TLS_DHE_DSS_WITH_SEED_CBC_SHA:
  1406. case CipherSuite.TLS_DHE_RSA_WITH_SEED_CBC_SHA:
  1407. case CipherSuite.TLS_RSA_WITH_SEED_CBC_SHA:
  1408. return EncryptionAlgorithm.SEED_CBC;
  1409. default:
  1410. throw new TlsFatalAlert(AlertDescription.internal_error);
  1411. }
  1412. }
  1413. public static int GetKeyExchangeAlgorithm(int ciphersuite)
  1414. {
  1415. switch (ciphersuite)
  1416. {
  1417. case CipherSuite.TLS_DH_anon_WITH_3DES_EDE_CBC_SHA:
  1418. case CipherSuite.TLS_DH_anon_WITH_AES_128_CBC_SHA:
  1419. case CipherSuite.TLS_DH_anon_WITH_AES_128_CBC_SHA256:
  1420. case CipherSuite.TLS_DH_anon_WITH_AES_128_GCM_SHA256:
  1421. case CipherSuite.TLS_DH_anon_WITH_AES_256_CBC_SHA:
  1422. case CipherSuite.TLS_DH_anon_WITH_AES_256_CBC_SHA256:
  1423. case CipherSuite.TLS_DH_anon_WITH_AES_256_GCM_SHA384:
  1424. case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA:
  1425. case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256:
  1426. case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256:
  1427. case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA:
  1428. case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256:
  1429. case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384:
  1430. case CipherSuite.TLS_DH_anon_WITH_RC4_128_MD5:
  1431. case CipherSuite.TLS_DH_anon_WITH_SEED_CBC_SHA:
  1432. return KeyExchangeAlgorithm.DH_anon;
  1433. case CipherSuite.TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA:
  1434. case CipherSuite.TLS_DH_DSS_WITH_AES_128_CBC_SHA:
  1435. case CipherSuite.TLS_DH_DSS_WITH_AES_128_CBC_SHA256:
  1436. case CipherSuite.TLS_DH_DSS_WITH_AES_128_GCM_SHA256:
  1437. case CipherSuite.TLS_DH_DSS_WITH_AES_256_CBC_SHA:
  1438. case CipherSuite.TLS_DH_DSS_WITH_AES_256_CBC_SHA256:
  1439. case CipherSuite.TLS_DH_DSS_WITH_AES_256_GCM_SHA384:
  1440. case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA:
  1441. case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256:
  1442. case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256:
  1443. case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA:
  1444. case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256:
  1445. case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384:
  1446. case CipherSuite.TLS_DH_DSS_WITH_SEED_CBC_SHA:
  1447. return KeyExchangeAlgorithm.DH_DSS;
  1448. case CipherSuite.TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA:
  1449. case CipherSuite.TLS_DH_RSA_WITH_AES_128_CBC_SHA:
  1450. case CipherSuite.TLS_DH_RSA_WITH_AES_128_CBC_SHA256:
  1451. case CipherSuite.TLS_DH_RSA_WITH_AES_128_GCM_SHA256:
  1452. case CipherSuite.TLS_DH_RSA_WITH_AES_256_CBC_SHA:
  1453. case CipherSuite.TLS_DH_RSA_WITH_AES_256_CBC_SHA256:
  1454. case CipherSuite.TLS_DH_RSA_WITH_AES_256_GCM_SHA384:
  1455. case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA:
  1456. case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256:
  1457. case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256:
  1458. case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA:
  1459. case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256:
  1460. case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384:
  1461. case CipherSuite.TLS_DH_RSA_WITH_SEED_CBC_SHA:
  1462. return KeyExchangeAlgorithm.DH_RSA;
  1463. case CipherSuite.TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA:
  1464. case CipherSuite.TLS_DHE_DSS_WITH_AES_128_CBC_SHA:
  1465. case CipherSuite.TLS_DHE_DSS_WITH_AES_128_CBC_SHA256:
  1466. case CipherSuite.TLS_DHE_DSS_WITH_AES_128_GCM_SHA256:
  1467. case CipherSuite.TLS_DHE_DSS_WITH_AES_256_CBC_SHA:
  1468. case CipherSuite.TLS_DHE_DSS_WITH_AES_256_CBC_SHA256:
  1469. case CipherSuite.TLS_DHE_DSS_WITH_AES_256_GCM_SHA384:
  1470. case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA:
  1471. case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256:
  1472. case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256:
  1473. case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA:
  1474. case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256:
  1475. case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384:
  1476. case CipherSuite.TLS_DHE_DSS_WITH_SEED_CBC_SHA:
  1477. return KeyExchangeAlgorithm.DHE_DSS;
  1478. case CipherSuite.TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA:
  1479. case CipherSuite.TLS_DHE_PSK_WITH_AES_128_CBC_SHA:
  1480. case CipherSuite.TLS_DHE_PSK_WITH_AES_128_CBC_SHA256:
  1481. case CipherSuite.TLS_DHE_PSK_WITH_AES_128_CCM:
  1482. case CipherSuite.TLS_DHE_PSK_WITH_AES_128_GCM_SHA256:
  1483. case CipherSuite.DRAFT_TLS_DHE_PSK_WITH_AES_128_OCB:
  1484. case CipherSuite.TLS_DHE_PSK_WITH_AES_256_CBC_SHA:
  1485. case CipherSuite.TLS_DHE_PSK_WITH_AES_256_CBC_SHA384:
  1486. case CipherSuite.TLS_DHE_PSK_WITH_AES_256_CCM:
  1487. case CipherSuite.TLS_DHE_PSK_WITH_AES_256_GCM_SHA384:
  1488. case CipherSuite.DRAFT_TLS_DHE_PSK_WITH_AES_256_OCB:
  1489. case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256:
  1490. case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256:
  1491. case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384:
  1492. case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384:
  1493. case CipherSuite.DRAFT_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
  1494. case CipherSuite.TLS_DHE_PSK_WITH_NULL_SHA:
  1495. case CipherSuite.TLS_DHE_PSK_WITH_NULL_SHA256:
  1496. case CipherSuite.TLS_DHE_PSK_WITH_NULL_SHA384:
  1497. case CipherSuite.TLS_DHE_PSK_WITH_RC4_128_SHA:
  1498. case CipherSuite.TLS_PSK_DHE_WITH_AES_128_CCM_8:
  1499. case CipherSuite.TLS_PSK_DHE_WITH_AES_256_CCM_8:
  1500. return KeyExchangeAlgorithm.DHE_PSK;
  1501. case CipherSuite.TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:
  1502. case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA:
  1503. case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256:
  1504. case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CCM:
  1505. case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CCM_8:
  1506. case CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256:
  1507. case CipherSuite.DRAFT_TLS_DHE_RSA_WITH_AES_128_OCB:
  1508. case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA:
  1509. case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256:
  1510. case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CCM:
  1511. case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CCM_8:
  1512. case CipherSuite.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384:
  1513. case CipherSuite.DRAFT_TLS_DHE_RSA_WITH_AES_256_OCB:
  1514. case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA:
  1515. case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256:
  1516. case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256:
  1517. case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA:
  1518. case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256:
  1519. case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384:
  1520. case CipherSuite.DRAFT_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
  1521. case CipherSuite.TLS_DHE_RSA_WITH_SEED_CBC_SHA:
  1522. return KeyExchangeAlgorithm.DHE_RSA;
  1523. case CipherSuite.TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA:
  1524. case CipherSuite.TLS_ECDH_anon_WITH_AES_128_CBC_SHA:
  1525. case CipherSuite.TLS_ECDH_anon_WITH_AES_256_CBC_SHA:
  1526. case CipherSuite.TLS_ECDH_anon_WITH_NULL_SHA:
  1527. case CipherSuite.TLS_ECDH_anon_WITH_RC4_128_SHA:
  1528. return KeyExchangeAlgorithm.ECDH_anon;
  1529. case CipherSuite.TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA:
  1530. case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA:
  1531. case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256:
  1532. case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256:
  1533. case CipherSuite.DRAFT_TLS_ECDHE_ECDSA_WITH_AES_128_OCB:
  1534. case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA:
  1535. case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384:
  1536. case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384:
  1537. case CipherSuite.DRAFT_TLS_ECDHE_ECDSA_WITH_AES_256_OCB:
  1538. case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256:
  1539. case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256:
  1540. case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384:
  1541. case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384:
  1542. case CipherSuite.TLS_ECDH_ECDSA_WITH_NULL_SHA:
  1543. case CipherSuite.TLS_ECDH_ECDSA_WITH_RC4_128_SHA:
  1544. return KeyExchangeAlgorithm.ECDH_ECDSA;
  1545. case CipherSuite.TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA:
  1546. case CipherSuite.TLS_ECDH_RSA_WITH_AES_128_CBC_SHA:
  1547. case CipherSuite.TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256:
  1548. case CipherSuite.TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256:
  1549. case CipherSuite.TLS_ECDH_RSA_WITH_AES_256_CBC_SHA:
  1550. case CipherSuite.TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384:
  1551. case CipherSuite.TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384:
  1552. case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256:
  1553. case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256:
  1554. case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384:
  1555. case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384:
  1556. case CipherSuite.TLS_ECDH_RSA_WITH_NULL_SHA:
  1557. case CipherSuite.TLS_ECDH_RSA_WITH_RC4_128_SHA:
  1558. return KeyExchangeAlgorithm.ECDH_RSA;
  1559. case CipherSuite.TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA:
  1560. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:
  1561. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
  1562. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CCM:
  1563. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8:
  1564. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
  1565. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:
  1566. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:
  1567. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CCM:
  1568. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8:
  1569. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:
  1570. case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256:
  1571. case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256:
  1572. case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384:
  1573. case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384:
  1574. case CipherSuite.DRAFT_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256:
  1575. case CipherSuite.TLS_ECDHE_ECDSA_WITH_NULL_SHA:
  1576. case CipherSuite.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA:
  1577. return KeyExchangeAlgorithm.ECDHE_ECDSA;
  1578. case CipherSuite.TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA:
  1579. case CipherSuite.TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA:
  1580. case CipherSuite.TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256:
  1581. case CipherSuite.DRAFT_TLS_ECDHE_PSK_WITH_AES_128_OCB:
  1582. case CipherSuite.TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA:
  1583. case CipherSuite.TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384:
  1584. case CipherSuite.DRAFT_TLS_ECDHE_PSK_WITH_AES_256_OCB:
  1585. case CipherSuite.TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256:
  1586. case CipherSuite.TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384:
  1587. case CipherSuite.DRAFT_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
  1588. case CipherSuite.TLS_ECDHE_PSK_WITH_NULL_SHA:
  1589. case CipherSuite.TLS_ECDHE_PSK_WITH_NULL_SHA256:
  1590. case CipherSuite.TLS_ECDHE_PSK_WITH_NULL_SHA384:
  1591. case CipherSuite.TLS_ECDHE_PSK_WITH_RC4_128_SHA:
  1592. return KeyExchangeAlgorithm.ECDHE_PSK;
  1593. case CipherSuite.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA:
  1594. case CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:
  1595. case CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
  1596. case CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
  1597. case CipherSuite.DRAFT_TLS_ECDHE_RSA_WITH_AES_128_OCB:
  1598. case CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:
  1599. case CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:
  1600. case CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:
  1601. case CipherSuite.DRAFT_TLS_ECDHE_RSA_WITH_AES_256_OCB:
  1602. case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256:
  1603. case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256:
  1604. case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384:
  1605. case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384:
  1606. case CipherSuite.DRAFT_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
  1607. case CipherSuite.TLS_ECDHE_RSA_WITH_NULL_SHA:
  1608. case CipherSuite.TLS_ECDHE_RSA_WITH_RC4_128_SHA:
  1609. return KeyExchangeAlgorithm.ECDHE_RSA;
  1610. case CipherSuite.TLS_PSK_WITH_3DES_EDE_CBC_SHA:
  1611. case CipherSuite.TLS_PSK_WITH_AES_128_CBC_SHA:
  1612. case CipherSuite.TLS_PSK_WITH_AES_128_CBC_SHA256:
  1613. case CipherSuite.TLS_PSK_WITH_AES_128_CCM:
  1614. case CipherSuite.TLS_PSK_WITH_AES_128_CCM_8:
  1615. case CipherSuite.TLS_PSK_WITH_AES_128_GCM_SHA256:
  1616. case CipherSuite.DRAFT_TLS_PSK_WITH_AES_128_OCB:
  1617. case CipherSuite.TLS_PSK_WITH_AES_256_CBC_SHA:
  1618. case CipherSuite.TLS_PSK_WITH_AES_256_CBC_SHA384:
  1619. case CipherSuite.TLS_PSK_WITH_AES_256_CCM:
  1620. case CipherSuite.TLS_PSK_WITH_AES_256_CCM_8:
  1621. case CipherSuite.TLS_PSK_WITH_AES_256_GCM_SHA384:
  1622. case CipherSuite.DRAFT_TLS_PSK_WITH_AES_256_OCB:
  1623. case CipherSuite.TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256:
  1624. case CipherSuite.TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256:
  1625. case CipherSuite.TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384:
  1626. case CipherSuite.TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384:
  1627. case CipherSuite.DRAFT_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256:
  1628. case CipherSuite.TLS_PSK_WITH_NULL_SHA:
  1629. case CipherSuite.TLS_PSK_WITH_NULL_SHA256:
  1630. case CipherSuite.TLS_PSK_WITH_NULL_SHA384:
  1631. case CipherSuite.TLS_PSK_WITH_RC4_128_SHA:
  1632. return KeyExchangeAlgorithm.PSK;
  1633. case CipherSuite.TLS_RSA_WITH_3DES_EDE_CBC_SHA:
  1634. case CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA:
  1635. case CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA256:
  1636. case CipherSuite.TLS_RSA_WITH_AES_128_CCM:
  1637. case CipherSuite.TLS_RSA_WITH_AES_128_CCM_8:
  1638. case CipherSuite.TLS_RSA_WITH_AES_128_GCM_SHA256:
  1639. case CipherSuite.TLS_RSA_WITH_AES_256_CBC_SHA:
  1640. case CipherSuite.TLS_RSA_WITH_AES_256_CBC_SHA256:
  1641. case CipherSuite.TLS_RSA_WITH_AES_256_CCM:
  1642. case CipherSuite.TLS_RSA_WITH_AES_256_CCM_8:
  1643. case CipherSuite.TLS_RSA_WITH_AES_256_GCM_SHA384:
  1644. case CipherSuite.TLS_RSA_WITH_CAMELLIA_128_CBC_SHA:
  1645. case CipherSuite.TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256:
  1646. case CipherSuite.TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256:
  1647. case CipherSuite.TLS_RSA_WITH_CAMELLIA_256_CBC_SHA:
  1648. case CipherSuite.TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256:
  1649. case CipherSuite.TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384:
  1650. case CipherSuite.DRAFT_TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256:
  1651. case CipherSuite.TLS_RSA_WITH_NULL_MD5:
  1652. case CipherSuite.TLS_RSA_WITH_NULL_SHA:
  1653. case CipherSuite.TLS_RSA_WITH_NULL_SHA256:
  1654. case CipherSuite.TLS_RSA_WITH_RC4_128_MD5:
  1655. case CipherSuite.TLS_RSA_WITH_RC4_128_SHA:
  1656. case CipherSuite.TLS_RSA_WITH_SEED_CBC_SHA:
  1657. return KeyExchangeAlgorithm.RSA;
  1658. case CipherSuite.TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA:
  1659. case CipherSuite.TLS_RSA_PSK_WITH_AES_128_CBC_SHA:
  1660. case CipherSuite.TLS_RSA_PSK_WITH_AES_128_CBC_SHA256:
  1661. case CipherSuite.TLS_RSA_PSK_WITH_AES_128_GCM_SHA256:
  1662. case CipherSuite.TLS_RSA_PSK_WITH_AES_256_CBC_SHA:
  1663. case CipherSuite.TLS_RSA_PSK_WITH_AES_256_CBC_SHA384:
  1664. case CipherSuite.TLS_RSA_PSK_WITH_AES_256_GCM_SHA384:
  1665. case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256:
  1666. case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256:
  1667. case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384:
  1668. case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384:
  1669. case CipherSuite.TLS_RSA_PSK_WITH_NULL_SHA:
  1670. case CipherSuite.TLS_RSA_PSK_WITH_NULL_SHA256:
  1671. case CipherSuite.TLS_RSA_PSK_WITH_NULL_SHA384:
  1672. case CipherSuite.TLS_RSA_PSK_WITH_RC4_128_SHA:
  1673. return KeyExchangeAlgorithm.RSA_PSK;
  1674. case CipherSuite.TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA:
  1675. case CipherSuite.TLS_SRP_SHA_WITH_AES_128_CBC_SHA:
  1676. case CipherSuite.TLS_SRP_SHA_WITH_AES_256_CBC_SHA:
  1677. return KeyExchangeAlgorithm.SRP;
  1678. case CipherSuite.TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA:
  1679. case CipherSuite.TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA:
  1680. case CipherSuite.TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA:
  1681. return KeyExchangeAlgorithm.SRP_DSS;
  1682. case CipherSuite.TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA:
  1683. case CipherSuite.TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA:
  1684. case CipherSuite.TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA:
  1685. return KeyExchangeAlgorithm.SRP_RSA;
  1686. default:
  1687. throw new TlsFatalAlert(AlertDescription.internal_error);
  1688. }
  1689. }
  1690. public static int GetMacAlgorithm(int ciphersuite)
  1691. {
  1692. switch (ciphersuite)
  1693. {
  1694. case CipherSuite.TLS_DH_anon_WITH_AES_128_GCM_SHA256:
  1695. case CipherSuite.TLS_DH_anon_WITH_AES_256_GCM_SHA384:
  1696. case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256:
  1697. case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384:
  1698. case CipherSuite.TLS_DH_DSS_WITH_AES_128_GCM_SHA256:
  1699. case CipherSuite.TLS_DH_DSS_WITH_AES_256_GCM_SHA384:
  1700. case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256:
  1701. case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384:
  1702. case CipherSuite.TLS_DH_RSA_WITH_AES_128_GCM_SHA256:
  1703. case CipherSuite.TLS_DH_RSA_WITH_AES_256_GCM_SHA384:
  1704. case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256:
  1705. case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384:
  1706. case CipherSuite.TLS_DHE_DSS_WITH_AES_128_GCM_SHA256:
  1707. case CipherSuite.TLS_DHE_DSS_WITH_AES_256_GCM_SHA384:
  1708. case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256:
  1709. case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384:
  1710. case CipherSuite.TLS_DHE_PSK_WITH_AES_128_CCM:
  1711. case CipherSuite.TLS_DHE_PSK_WITH_AES_128_GCM_SHA256:
  1712. case CipherSuite.DRAFT_TLS_DHE_PSK_WITH_AES_128_OCB:
  1713. case CipherSuite.TLS_DHE_PSK_WITH_AES_256_CCM:
  1714. case CipherSuite.TLS_DHE_PSK_WITH_AES_256_GCM_SHA384:
  1715. case CipherSuite.DRAFT_TLS_DHE_PSK_WITH_AES_256_OCB:
  1716. case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256:
  1717. case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384:
  1718. case CipherSuite.DRAFT_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
  1719. case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CCM:
  1720. case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CCM_8:
  1721. case CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256:
  1722. case CipherSuite.DRAFT_TLS_DHE_RSA_WITH_AES_128_OCB:
  1723. case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CCM:
  1724. case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CCM_8:
  1725. case CipherSuite.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384:
  1726. case CipherSuite.DRAFT_TLS_DHE_RSA_WITH_AES_256_OCB:
  1727. case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256:
  1728. case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384:
  1729. case CipherSuite.DRAFT_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
  1730. case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256:
  1731. case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384:
  1732. case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256:
  1733. case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384:
  1734. case CipherSuite.TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256:
  1735. case CipherSuite.TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384:
  1736. case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256:
  1737. case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384:
  1738. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CCM:
  1739. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8:
  1740. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
  1741. case CipherSuite.DRAFT_TLS_ECDHE_ECDSA_WITH_AES_128_OCB:
  1742. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CCM:
  1743. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8:
  1744. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:
  1745. case CipherSuite.DRAFT_TLS_ECDHE_ECDSA_WITH_AES_256_OCB:
  1746. case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256:
  1747. case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384:
  1748. case CipherSuite.DRAFT_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256:
  1749. case CipherSuite.DRAFT_TLS_ECDHE_PSK_WITH_AES_128_OCB:
  1750. case CipherSuite.DRAFT_TLS_ECDHE_PSK_WITH_AES_256_OCB:
  1751. case CipherSuite.DRAFT_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
  1752. case CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
  1753. case CipherSuite.DRAFT_TLS_ECDHE_RSA_WITH_AES_128_OCB:
  1754. case CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:
  1755. case CipherSuite.DRAFT_TLS_ECDHE_RSA_WITH_AES_256_OCB:
  1756. case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256:
  1757. case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384:
  1758. case CipherSuite.DRAFT_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
  1759. case CipherSuite.TLS_PSK_DHE_WITH_AES_128_CCM_8:
  1760. case CipherSuite.TLS_PSK_DHE_WITH_AES_256_CCM_8:
  1761. case CipherSuite.TLS_PSK_WITH_AES_128_CCM:
  1762. case CipherSuite.TLS_PSK_WITH_AES_128_CCM_8:
  1763. case CipherSuite.TLS_PSK_WITH_AES_128_GCM_SHA256:
  1764. case CipherSuite.DRAFT_TLS_PSK_WITH_AES_128_OCB:
  1765. case CipherSuite.TLS_PSK_WITH_AES_256_CCM:
  1766. case CipherSuite.TLS_PSK_WITH_AES_256_CCM_8:
  1767. case CipherSuite.TLS_PSK_WITH_AES_256_GCM_SHA384:
  1768. case CipherSuite.DRAFT_TLS_PSK_WITH_AES_256_OCB:
  1769. case CipherSuite.TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256:
  1770. case CipherSuite.TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384:
  1771. case CipherSuite.DRAFT_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256:
  1772. case CipherSuite.TLS_RSA_PSK_WITH_AES_128_GCM_SHA256:
  1773. case CipherSuite.TLS_RSA_PSK_WITH_AES_256_GCM_SHA384:
  1774. case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256:
  1775. case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384:
  1776. case CipherSuite.DRAFT_TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256:
  1777. case CipherSuite.TLS_RSA_WITH_AES_128_CCM:
  1778. case CipherSuite.TLS_RSA_WITH_AES_128_CCM_8:
  1779. case CipherSuite.TLS_RSA_WITH_AES_128_GCM_SHA256:
  1780. case CipherSuite.TLS_RSA_WITH_AES_256_CCM:
  1781. case CipherSuite.TLS_RSA_WITH_AES_256_CCM_8:
  1782. case CipherSuite.TLS_RSA_WITH_AES_256_GCM_SHA384:
  1783. case CipherSuite.TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256:
  1784. case CipherSuite.TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384:
  1785. return MacAlgorithm.cls_null;
  1786. case CipherSuite.TLS_DH_anon_WITH_RC4_128_MD5:
  1787. case CipherSuite.TLS_RSA_WITH_NULL_MD5:
  1788. case CipherSuite.TLS_RSA_WITH_RC4_128_MD5:
  1789. return MacAlgorithm.hmac_md5;
  1790. case CipherSuite.TLS_DH_anon_WITH_3DES_EDE_CBC_SHA:
  1791. case CipherSuite.TLS_DH_anon_WITH_AES_128_CBC_SHA:
  1792. case CipherSuite.TLS_DH_anon_WITH_AES_256_CBC_SHA:
  1793. case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA:
  1794. case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA:
  1795. case CipherSuite.TLS_DH_anon_WITH_SEED_CBC_SHA:
  1796. case CipherSuite.TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA:
  1797. case CipherSuite.TLS_DH_DSS_WITH_AES_128_CBC_SHA:
  1798. case CipherSuite.TLS_DH_DSS_WITH_AES_256_CBC_SHA:
  1799. case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA:
  1800. case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA:
  1801. case CipherSuite.TLS_DH_DSS_WITH_SEED_CBC_SHA:
  1802. case CipherSuite.TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA:
  1803. case CipherSuite.TLS_DH_RSA_WITH_AES_128_CBC_SHA:
  1804. case CipherSuite.TLS_DH_RSA_WITH_AES_256_CBC_SHA:
  1805. case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA:
  1806. case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA:
  1807. case CipherSuite.TLS_DH_RSA_WITH_SEED_CBC_SHA:
  1808. case CipherSuite.TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA:
  1809. case CipherSuite.TLS_DHE_DSS_WITH_AES_128_CBC_SHA:
  1810. case CipherSuite.TLS_DHE_DSS_WITH_AES_256_CBC_SHA:
  1811. case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA:
  1812. case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA:
  1813. case CipherSuite.TLS_DHE_DSS_WITH_SEED_CBC_SHA:
  1814. case CipherSuite.TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA:
  1815. case CipherSuite.TLS_DHE_PSK_WITH_AES_128_CBC_SHA:
  1816. case CipherSuite.TLS_DHE_PSK_WITH_AES_256_CBC_SHA:
  1817. case CipherSuite.TLS_DHE_PSK_WITH_NULL_SHA:
  1818. case CipherSuite.TLS_DHE_PSK_WITH_RC4_128_SHA:
  1819. case CipherSuite.TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:
  1820. case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA:
  1821. case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA:
  1822. case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA:
  1823. case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA:
  1824. case CipherSuite.TLS_DHE_RSA_WITH_SEED_CBC_SHA:
  1825. case CipherSuite.TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA:
  1826. case CipherSuite.TLS_ECDH_anon_WITH_AES_128_CBC_SHA:
  1827. case CipherSuite.TLS_ECDH_anon_WITH_AES_256_CBC_SHA:
  1828. case CipherSuite.TLS_ECDH_anon_WITH_NULL_SHA:
  1829. case CipherSuite.TLS_ECDH_anon_WITH_RC4_128_SHA:
  1830. case CipherSuite.TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA:
  1831. case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA:
  1832. case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA:
  1833. case CipherSuite.TLS_ECDH_ECDSA_WITH_NULL_SHA:
  1834. case CipherSuite.TLS_ECDH_ECDSA_WITH_RC4_128_SHA:
  1835. case CipherSuite.TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA:
  1836. case CipherSuite.TLS_ECDH_RSA_WITH_AES_128_CBC_SHA:
  1837. case CipherSuite.TLS_ECDH_RSA_WITH_AES_256_CBC_SHA:
  1838. case CipherSuite.TLS_ECDH_RSA_WITH_NULL_SHA:
  1839. case CipherSuite.TLS_ECDH_RSA_WITH_RC4_128_SHA:
  1840. case CipherSuite.TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA:
  1841. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:
  1842. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:
  1843. case CipherSuite.TLS_ECDHE_ECDSA_WITH_NULL_SHA:
  1844. case CipherSuite.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA:
  1845. case CipherSuite.TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA:
  1846. case CipherSuite.TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA:
  1847. case CipherSuite.TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA:
  1848. case CipherSuite.TLS_ECDHE_PSK_WITH_NULL_SHA:
  1849. case CipherSuite.TLS_ECDHE_PSK_WITH_RC4_128_SHA:
  1850. case CipherSuite.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA:
  1851. case CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:
  1852. case CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:
  1853. case CipherSuite.TLS_ECDHE_RSA_WITH_NULL_SHA:
  1854. case CipherSuite.TLS_ECDHE_RSA_WITH_RC4_128_SHA:
  1855. case CipherSuite.TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA:
  1856. case CipherSuite.TLS_RSA_PSK_WITH_AES_128_CBC_SHA:
  1857. case CipherSuite.TLS_RSA_PSK_WITH_AES_256_CBC_SHA:
  1858. case CipherSuite.TLS_PSK_WITH_3DES_EDE_CBC_SHA:
  1859. case CipherSuite.TLS_PSK_WITH_AES_128_CBC_SHA:
  1860. case CipherSuite.TLS_PSK_WITH_AES_256_CBC_SHA:
  1861. case CipherSuite.TLS_PSK_WITH_NULL_SHA:
  1862. case CipherSuite.TLS_PSK_WITH_RC4_128_SHA:
  1863. case CipherSuite.TLS_RSA_PSK_WITH_NULL_SHA:
  1864. case CipherSuite.TLS_RSA_PSK_WITH_RC4_128_SHA:
  1865. case CipherSuite.TLS_RSA_WITH_3DES_EDE_CBC_SHA:
  1866. case CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA:
  1867. case CipherSuite.TLS_RSA_WITH_AES_256_CBC_SHA:
  1868. case CipherSuite.TLS_RSA_WITH_CAMELLIA_128_CBC_SHA:
  1869. case CipherSuite.TLS_RSA_WITH_CAMELLIA_256_CBC_SHA:
  1870. case CipherSuite.TLS_RSA_WITH_NULL_SHA:
  1871. case CipherSuite.TLS_RSA_WITH_RC4_128_SHA:
  1872. case CipherSuite.TLS_RSA_WITH_SEED_CBC_SHA:
  1873. case CipherSuite.TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA:
  1874. case CipherSuite.TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA:
  1875. case CipherSuite.TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA:
  1876. case CipherSuite.TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA:
  1877. case CipherSuite.TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA:
  1878. case CipherSuite.TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA:
  1879. case CipherSuite.TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA:
  1880. case CipherSuite.TLS_SRP_SHA_WITH_AES_128_CBC_SHA:
  1881. case CipherSuite.TLS_SRP_SHA_WITH_AES_256_CBC_SHA:
  1882. return MacAlgorithm.hmac_sha1;
  1883. case CipherSuite.TLS_DH_anon_WITH_AES_128_CBC_SHA256:
  1884. case CipherSuite.TLS_DH_anon_WITH_AES_256_CBC_SHA256:
  1885. case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256:
  1886. case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256:
  1887. case CipherSuite.TLS_DH_DSS_WITH_AES_128_CBC_SHA256:
  1888. case CipherSuite.TLS_DH_DSS_WITH_AES_256_CBC_SHA256:
  1889. case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256:
  1890. case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256:
  1891. case CipherSuite.TLS_DH_RSA_WITH_AES_128_CBC_SHA256:
  1892. case CipherSuite.TLS_DH_RSA_WITH_AES_256_CBC_SHA256:
  1893. case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256:
  1894. case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256:
  1895. case CipherSuite.TLS_DHE_DSS_WITH_AES_128_CBC_SHA256:
  1896. case CipherSuite.TLS_DHE_DSS_WITH_AES_256_CBC_SHA256:
  1897. case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256:
  1898. case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256:
  1899. case CipherSuite.TLS_DHE_PSK_WITH_AES_128_CBC_SHA256:
  1900. case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256:
  1901. case CipherSuite.TLS_DHE_PSK_WITH_NULL_SHA256:
  1902. case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256:
  1903. case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256:
  1904. case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256:
  1905. case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256:
  1906. case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256:
  1907. case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256:
  1908. case CipherSuite.TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256:
  1909. case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256:
  1910. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
  1911. case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256:
  1912. case CipherSuite.TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256:
  1913. case CipherSuite.TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256:
  1914. case CipherSuite.TLS_ECDHE_PSK_WITH_NULL_SHA256:
  1915. case CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
  1916. case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256:
  1917. case CipherSuite.TLS_PSK_WITH_AES_128_CBC_SHA256:
  1918. case CipherSuite.TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256:
  1919. case CipherSuite.TLS_PSK_WITH_NULL_SHA256:
  1920. case CipherSuite.TLS_RSA_PSK_WITH_AES_128_CBC_SHA256:
  1921. case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256:
  1922. case CipherSuite.TLS_RSA_PSK_WITH_NULL_SHA256:
  1923. case CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA256:
  1924. case CipherSuite.TLS_RSA_WITH_AES_256_CBC_SHA256:
  1925. case CipherSuite.TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256:
  1926. case CipherSuite.TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256:
  1927. case CipherSuite.TLS_RSA_WITH_NULL_SHA256:
  1928. return MacAlgorithm.hmac_sha256;
  1929. case CipherSuite.TLS_DHE_PSK_WITH_AES_256_CBC_SHA384:
  1930. case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384:
  1931. case CipherSuite.TLS_DHE_PSK_WITH_NULL_SHA384:
  1932. case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384:
  1933. case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384:
  1934. case CipherSuite.TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384:
  1935. case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384:
  1936. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:
  1937. case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384:
  1938. case CipherSuite.TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384:
  1939. case CipherSuite.TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384:
  1940. case CipherSuite.TLS_ECDHE_PSK_WITH_NULL_SHA384:
  1941. case CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:
  1942. case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384:
  1943. case CipherSuite.TLS_PSK_WITH_AES_256_CBC_SHA384:
  1944. case CipherSuite.TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384:
  1945. case CipherSuite.TLS_PSK_WITH_NULL_SHA384:
  1946. case CipherSuite.TLS_RSA_PSK_WITH_AES_256_CBC_SHA384:
  1947. case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384:
  1948. case CipherSuite.TLS_RSA_PSK_WITH_NULL_SHA384:
  1949. return MacAlgorithm.hmac_sha384;
  1950. default:
  1951. throw new TlsFatalAlert(AlertDescription.internal_error);
  1952. }
  1953. }
  1954. public static ProtocolVersion GetMinimumVersion(int ciphersuite)
  1955. {
  1956. switch (ciphersuite)
  1957. {
  1958. case CipherSuite.TLS_DH_anon_WITH_AES_128_CBC_SHA256:
  1959. case CipherSuite.TLS_DH_anon_WITH_AES_128_GCM_SHA256:
  1960. case CipherSuite.TLS_DH_anon_WITH_AES_256_CBC_SHA256:
  1961. case CipherSuite.TLS_DH_anon_WITH_AES_256_GCM_SHA384:
  1962. case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256:
  1963. case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256:
  1964. case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256:
  1965. case CipherSuite.TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384:
  1966. case CipherSuite.TLS_DH_DSS_WITH_AES_128_CBC_SHA256:
  1967. case CipherSuite.TLS_DH_DSS_WITH_AES_128_GCM_SHA256:
  1968. case CipherSuite.TLS_DH_DSS_WITH_AES_256_CBC_SHA256:
  1969. case CipherSuite.TLS_DH_DSS_WITH_AES_256_GCM_SHA384:
  1970. case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256:
  1971. case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256:
  1972. case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256:
  1973. case CipherSuite.TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384:
  1974. case CipherSuite.TLS_DH_RSA_WITH_AES_128_CBC_SHA256:
  1975. case CipherSuite.TLS_DH_RSA_WITH_AES_128_GCM_SHA256:
  1976. case CipherSuite.TLS_DH_RSA_WITH_AES_256_CBC_SHA256:
  1977. case CipherSuite.TLS_DH_RSA_WITH_AES_256_GCM_SHA384:
  1978. case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256:
  1979. case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256:
  1980. case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256:
  1981. case CipherSuite.TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384:
  1982. case CipherSuite.TLS_DHE_DSS_WITH_AES_128_CBC_SHA256:
  1983. case CipherSuite.TLS_DHE_DSS_WITH_AES_128_GCM_SHA256:
  1984. case CipherSuite.TLS_DHE_DSS_WITH_AES_256_CBC_SHA256:
  1985. case CipherSuite.TLS_DHE_DSS_WITH_AES_256_GCM_SHA384:
  1986. case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256:
  1987. case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256:
  1988. case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256:
  1989. case CipherSuite.TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384:
  1990. case CipherSuite.TLS_DHE_PSK_WITH_AES_128_CCM:
  1991. case CipherSuite.TLS_DHE_PSK_WITH_AES_128_GCM_SHA256:
  1992. case CipherSuite.DRAFT_TLS_DHE_PSK_WITH_AES_128_OCB:
  1993. case CipherSuite.TLS_DHE_PSK_WITH_AES_256_CCM:
  1994. case CipherSuite.TLS_DHE_PSK_WITH_AES_256_GCM_SHA384:
  1995. case CipherSuite.DRAFT_TLS_DHE_PSK_WITH_AES_256_OCB:
  1996. case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256:
  1997. case CipherSuite.TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384:
  1998. case CipherSuite.DRAFT_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
  1999. case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256:
  2000. case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CCM:
  2001. case CipherSuite.TLS_DHE_RSA_WITH_AES_128_CCM_8:
  2002. case CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256:
  2003. case CipherSuite.DRAFT_TLS_DHE_RSA_WITH_AES_128_OCB:
  2004. case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256:
  2005. case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CCM:
  2006. case CipherSuite.TLS_DHE_RSA_WITH_AES_256_CCM_8:
  2007. case CipherSuite.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384:
  2008. case CipherSuite.DRAFT_TLS_DHE_RSA_WITH_AES_256_OCB:
  2009. case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256:
  2010. case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256:
  2011. case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256:
  2012. case CipherSuite.TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384:
  2013. case CipherSuite.DRAFT_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
  2014. case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256:
  2015. case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256:
  2016. case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384:
  2017. case CipherSuite.TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384:
  2018. case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256:
  2019. case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256:
  2020. case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384:
  2021. case CipherSuite.TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384:
  2022. case CipherSuite.TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256:
  2023. case CipherSuite.TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256:
  2024. case CipherSuite.TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384:
  2025. case CipherSuite.TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384:
  2026. case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256:
  2027. case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256:
  2028. case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384:
  2029. case CipherSuite.TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384:
  2030. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
  2031. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CCM:
  2032. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8:
  2033. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
  2034. case CipherSuite.DRAFT_TLS_ECDHE_ECDSA_WITH_AES_128_OCB:
  2035. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:
  2036. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CCM:
  2037. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8:
  2038. case CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:
  2039. case CipherSuite.DRAFT_TLS_ECDHE_ECDSA_WITH_AES_256_OCB:
  2040. case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256:
  2041. case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256:
  2042. case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384:
  2043. case CipherSuite.TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384:
  2044. case CipherSuite.DRAFT_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256:
  2045. case CipherSuite.DRAFT_TLS_ECDHE_PSK_WITH_AES_128_OCB:
  2046. case CipherSuite.DRAFT_TLS_ECDHE_PSK_WITH_AES_256_OCB:
  2047. case CipherSuite.DRAFT_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
  2048. case CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
  2049. case CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
  2050. case CipherSuite.DRAFT_TLS_ECDHE_RSA_WITH_AES_128_OCB:
  2051. case CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:
  2052. case CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:
  2053. case CipherSuite.DRAFT_TLS_ECDHE_RSA_WITH_AES_256_OCB:
  2054. case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256:
  2055. case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256:
  2056. case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384:
  2057. case CipherSuite.TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384:
  2058. case CipherSuite.DRAFT_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
  2059. case CipherSuite.TLS_PSK_DHE_WITH_AES_128_CCM_8:
  2060. case CipherSuite.TLS_PSK_DHE_WITH_AES_256_CCM_8:
  2061. case CipherSuite.TLS_PSK_WITH_AES_128_CCM:
  2062. case CipherSuite.TLS_PSK_WITH_AES_128_CCM_8:
  2063. case CipherSuite.TLS_PSK_WITH_AES_128_GCM_SHA256:
  2064. case CipherSuite.DRAFT_TLS_PSK_WITH_AES_128_OCB:
  2065. case CipherSuite.TLS_PSK_WITH_AES_256_CCM:
  2066. case CipherSuite.TLS_PSK_WITH_AES_256_CCM_8:
  2067. case CipherSuite.TLS_PSK_WITH_AES_256_GCM_SHA384:
  2068. case CipherSuite.DRAFT_TLS_PSK_WITH_AES_256_OCB:
  2069. case CipherSuite.TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256:
  2070. case CipherSuite.TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384:
  2071. case CipherSuite.DRAFT_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256:
  2072. case CipherSuite.TLS_RSA_PSK_WITH_AES_128_GCM_SHA256:
  2073. case CipherSuite.TLS_RSA_PSK_WITH_AES_256_GCM_SHA384:
  2074. case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256:
  2075. case CipherSuite.TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384:
  2076. case CipherSuite.DRAFT_TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256:
  2077. case CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA256:
  2078. case CipherSuite.TLS_RSA_WITH_AES_128_CCM:
  2079. case CipherSuite.TLS_RSA_WITH_AES_128_CCM_8:
  2080. case CipherSuite.TLS_RSA_WITH_AES_128_GCM_SHA256:
  2081. case CipherSuite.TLS_RSA_WITH_AES_256_CBC_SHA256:
  2082. case CipherSuite.TLS_RSA_WITH_AES_256_CCM:
  2083. case CipherSuite.TLS_RSA_WITH_AES_256_CCM_8:
  2084. case CipherSuite.TLS_RSA_WITH_AES_256_GCM_SHA384:
  2085. case CipherSuite.TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256:
  2086. case CipherSuite.TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256:
  2087. case CipherSuite.TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256:
  2088. case CipherSuite.TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384:
  2089. case CipherSuite.TLS_RSA_WITH_NULL_SHA256:
  2090. return ProtocolVersion.TLSv12;
  2091. default:
  2092. return ProtocolVersion.SSLv3;
  2093. }
  2094. }
  2095. public static bool IsAeadCipherSuite(int ciphersuite)
  2096. {
  2097. return CipherType.aead == GetCipherType(ciphersuite);
  2098. }
  2099. public static bool IsBlockCipherSuite(int ciphersuite)
  2100. {
  2101. return CipherType.block == GetCipherType(ciphersuite);
  2102. }
  2103. public static bool IsStreamCipherSuite(int ciphersuite)
  2104. {
  2105. return CipherType.stream == GetCipherType(ciphersuite);
  2106. }
  2107. public static bool IsValidCipherSuiteForSignatureAlgorithms(int cipherSuite, IList sigAlgs)
  2108. {
  2109. int keyExchangeAlgorithm;
  2110. try
  2111. {
  2112. keyExchangeAlgorithm = GetKeyExchangeAlgorithm(cipherSuite);
  2113. }
  2114. catch (IOException e)
  2115. {
  2116. return true;
  2117. }
  2118. switch (keyExchangeAlgorithm)
  2119. {
  2120. case KeyExchangeAlgorithm.DH_anon:
  2121. case KeyExchangeAlgorithm.DH_anon_EXPORT:
  2122. case KeyExchangeAlgorithm.ECDH_anon:
  2123. return sigAlgs.Contains(SignatureAlgorithm.anonymous);
  2124. case KeyExchangeAlgorithm.DHE_RSA:
  2125. case KeyExchangeAlgorithm.DHE_RSA_EXPORT:
  2126. case KeyExchangeAlgorithm.ECDHE_RSA:
  2127. case KeyExchangeAlgorithm.SRP_RSA:
  2128. return sigAlgs.Contains(SignatureAlgorithm.rsa);
  2129. case KeyExchangeAlgorithm.DHE_DSS:
  2130. case KeyExchangeAlgorithm.DHE_DSS_EXPORT:
  2131. case KeyExchangeAlgorithm.SRP_DSS:
  2132. return sigAlgs.Contains(SignatureAlgorithm.dsa);
  2133. case KeyExchangeAlgorithm.ECDHE_ECDSA:
  2134. return sigAlgs.Contains(SignatureAlgorithm.ecdsa);
  2135. default:
  2136. return true;
  2137. }
  2138. }
  2139. public static bool IsValidCipherSuiteForVersion(int cipherSuite, ProtocolVersion serverVersion)
  2140. {
  2141. return GetMinimumVersion(cipherSuite).IsEqualOrEarlierVersionOf(serverVersion.GetEquivalentTLSVersion());
  2142. }
  2143. public static IList GetUsableSignatureAlgorithms(IList sigHashAlgs)
  2144. {
  2145. if (sigHashAlgs == null)
  2146. return GetAllSignatureAlgorithms();
  2147. IList v = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateArrayList(4);
  2148. v.Add(SignatureAlgorithm.anonymous);
  2149. foreach (SignatureAndHashAlgorithm sigHashAlg in sigHashAlgs)
  2150. {
  2151. //if (sigHashAlg.Hash >= MINIMUM_HASH_STRICT)
  2152. {
  2153. byte sigAlg = sigHashAlg.Signature;
  2154. if (!v.Contains(sigAlg))
  2155. {
  2156. v.Add(sigAlg);
  2157. }
  2158. }
  2159. }
  2160. return v;
  2161. }
  2162. }
  2163. }
  2164. #pragma warning restore
  2165. #endif