KeyShareEntry.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
  2. #pragma warning disable
  3. using System;
  4. using System.IO;
  5. namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Tls
  6. {
  7. public sealed class KeyShareEntry
  8. {
  9. private static bool CheckKeyExchangeLength(int length)
  10. {
  11. return 0 < length && length < (1 << 16);
  12. }
  13. private readonly int m_namedGroup;
  14. private readonly byte[] m_keyExchange;
  15. /// <param name="namedGroup"><see cref="NamedGroup"/></param>
  16. /// <param name="keyExchange"></param>
  17. public KeyShareEntry(int namedGroup, byte[] keyExchange)
  18. {
  19. if (!TlsUtilities.IsValidUint16(namedGroup))
  20. throw new ArgumentException("should be a uint16", "namedGroup");
  21. if (null == keyExchange)
  22. throw new ArgumentNullException("keyExchange");
  23. if (!CheckKeyExchangeLength(keyExchange.Length))
  24. throw new ArgumentException("must have length from 1 to (2^16 - 1)", "keyExchange");
  25. this.m_namedGroup = namedGroup;
  26. this.m_keyExchange = keyExchange;
  27. }
  28. /// <returns><see cref="NamedGroup"/></returns>
  29. public int NamedGroup
  30. {
  31. get { return m_namedGroup; }
  32. }
  33. public byte[] KeyExchange
  34. {
  35. get { return m_keyExchange; }
  36. }
  37. /// <summary>Encode this <see cref="KeyShareEntry"/> to a <see cref="Stream"/>.</summary>
  38. /// <param name="output">the <see cref="Stream"/> to encode to.</param>
  39. /// <exception cref="IOException"/>
  40. public void Encode(Stream output)
  41. {
  42. TlsUtilities.WriteUint16(NamedGroup, output);
  43. TlsUtilities.WriteOpaque16(KeyExchange, output);
  44. }
  45. /// <summary>Parse a <see cref="KeyShareEntry"/> from a <see cref="Stream"/>.</summary>
  46. /// <param name="input">the <see cref="Stream"/> to parse from.</param>
  47. /// <returns>a <see cref="KeyShareEntry"/> object.</returns>
  48. /// <exception cref="IOException"/>
  49. public static KeyShareEntry Parse(Stream input)
  50. {
  51. int namedGroup = TlsUtilities.ReadUint16(input);
  52. byte[] keyExchange = TlsUtilities.ReadOpaque16(input, 1);
  53. return new KeyShareEntry(namedGroup, keyExchange);
  54. }
  55. }
  56. }
  57. #pragma warning restore
  58. #endif