TlsSrtpUtilities.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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.Crypto.Tls
  7. {
  8. /**
  9. * RFC 5764 DTLS Extension to Establish Keys for SRTP.
  10. */
  11. public abstract class TlsSRTPUtils
  12. {
  13. public static void AddUseSrtpExtension(IDictionary extensions, UseSrtpData useSRTPData)
  14. {
  15. extensions[ExtensionType.use_srtp] = CreateUseSrtpExtension(useSRTPData);
  16. }
  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. public static byte[] CreateUseSrtpExtension(UseSrtpData useSrtpData)
  23. {
  24. if (useSrtpData == null)
  25. throw new ArgumentNullException("useSrtpData");
  26. MemoryStream buf = new MemoryStream();
  27. // SRTPProtectionProfiles
  28. TlsUtilities.WriteUint16ArrayWithUint16Length(useSrtpData.ProtectionProfiles, buf);
  29. // srtp_mki
  30. TlsUtilities.WriteOpaque8(useSrtpData.Mki, buf);
  31. return buf.ToArray();
  32. }
  33. public static UseSrtpData ReadUseSrtpExtension(byte[] extensionData)
  34. {
  35. if (extensionData == null)
  36. throw new ArgumentNullException("extensionData");
  37. MemoryStream buf = new MemoryStream(extensionData, true);
  38. // SRTPProtectionProfiles
  39. int length = TlsUtilities.ReadUint16(buf);
  40. if (length < 2 || (length & 1) != 0)
  41. {
  42. throw new TlsFatalAlert(AlertDescription.decode_error);
  43. }
  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