TlsSrtpUtilities.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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. namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Tls
  7. {
  8. /// <summary>RFC 5764 DTLS Extension to Establish Keys for SRTP.</summary>
  9. public abstract class TlsSrtpUtilities
  10. {
  11. /// <exception cref="IOException"/>
  12. public static void AddUseSrtpExtension(IDictionary extensions, UseSrtpData useSrtpData)
  13. {
  14. extensions[ExtensionType.use_srtp] = CreateUseSrtpExtension(useSrtpData);
  15. }
  16. /// <exception cref="IOException"/>
  17. public static UseSrtpData GetUseSrtpExtension(IDictionary extensions)
  18. {
  19. byte[] extensionData = TlsUtilities.GetExtensionData(extensions, ExtensionType.use_srtp);
  20. return extensionData == null ? null : ReadUseSrtpExtension(extensionData);
  21. }
  22. /// <exception cref="IOException"/>
  23. public static byte[] CreateUseSrtpExtension(UseSrtpData useSrtpData)
  24. {
  25. if (useSrtpData == null)
  26. throw new ArgumentNullException("useSrtpData");
  27. MemoryStream buf = new MemoryStream();
  28. // SRTPProtectionProfiles
  29. TlsUtilities.WriteUint16ArrayWithUint16Length(useSrtpData.ProtectionProfiles, buf);
  30. // srtp_mki
  31. TlsUtilities.WriteOpaque8(useSrtpData.Mki, buf);
  32. return buf.ToArray();
  33. }
  34. /// <exception cref="IOException"/>
  35. public static UseSrtpData ReadUseSrtpExtension(byte[] extensionData)
  36. {
  37. if (extensionData == null)
  38. throw new ArgumentNullException("extensionData");
  39. MemoryStream buf = new MemoryStream(extensionData, false);
  40. // SRTPProtectionProfiles
  41. int length = TlsUtilities.ReadUint16(buf);
  42. if (length < 2 || (length & 1) != 0)
  43. throw new TlsFatalAlert(AlertDescription.decode_error);
  44. int[] protectionProfiles = TlsUtilities.ReadUint16Array(length / 2, buf);
  45. // srtp_mki
  46. byte[] mki = TlsUtilities.ReadOpaque8(buf);
  47. TlsProtocol.AssertEmpty(buf);
  48. return new UseSrtpData(protectionProfiles, mki);
  49. }
  50. }
  51. }
  52. #pragma warning restore
  53. #endif