tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

SrtpFlow.h (2135B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
      3 * You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 // Original author: ekr@rtfm.com
      6 
      7 #ifndef srtpflow_h__
      8 #define srtpflow_h__
      9 
     10 #include "mozilla/RefPtr.h"
     11 #include "nsISupportsImpl.h"
     12 #include "srtp.h"
     13 
     14 namespace mozilla {
     15 
     16 #define SRTP_ICM_MASTER_KEY_LENGTH 16
     17 #define SRTP_ICM_MASTER_SALT_LENGTH 14
     18 #define SRTP_ICM_MAX_MASTER_LENGTH \
     19  (SRTP_ICM_MASTER_KEY_LENGTH + SRTP_ICM_MASTER_SALT_LENGTH)
     20 
     21 #define SRTP_GCM_MASTER_KEY_MIN_LENGTH 16
     22 #define SRTP_GCM_MASTER_KEY_MAX_LENGTH 32
     23 #define SRTP_GCM_MASTER_SALT_LENGTH 12
     24 
     25 #define SRTP_GCM_MIN_MASTER_LENGTH \
     26  (SRTP_GCM_MASTER_KEY_MIN_LENGTH + SRTP_GCM_MASTER_SALT_LENGTH)
     27 #define SRTP_GCM_MAX_MASTER_LENGTH \
     28  (SRTP_GCM_MASTER_KEY_MAX_LENGTH + SRTP_GCM_MASTER_SALT_LENGTH)
     29 
     30 #define SRTP_MIN_KEY_LENGTH SRTP_GCM_MIN_MASTER_LENGTH
     31 #define SRTP_MAX_KEY_LENGTH SRTP_GCM_MAX_MASTER_LENGTH
     32 
     33 // SRTCP requires an auth tag *plus* a 4-byte index-plus-'E'-bit value (see
     34 // RFC 3711)
     35 #define SRTP_MAX_EXPANSION (SRTP_MAX_TRAILER_LEN + 4)
     36 
     37 class SrtpFlow {
     38  ~SrtpFlow();
     39 
     40 public:
     41  static unsigned int KeySize(int cipher_suite);
     42  static unsigned int SaltSize(int cipher_suite);
     43 
     44  static RefPtr<SrtpFlow> Create(int cipher_suite, bool inbound,
     45                                 const void* key, size_t key_len);
     46 
     47  nsresult ProtectRtp(void* in, int in_len, int max_len, int* out_len);
     48  nsresult UnprotectRtp(void* in, int in_len, int max_len, int* out_len);
     49  nsresult ProtectRtcp(void* in, int in_len, int max_len, int* out_len);
     50  nsresult UnprotectRtcp(void* in, int in_len, int max_len, int* out_len);
     51 
     52  NS_INLINE_DECL_THREADSAFE_REFCOUNTING(SrtpFlow)
     53 
     54  static void srtp_event_handler(srtp_event_data_t* data);
     55 
     56 private:
     57  SrtpFlow() : session_(nullptr) {}
     58 
     59  nsresult CheckInputs(bool protect, void* in, int in_len, int max_len,
     60                       int* out_len);
     61 
     62  static nsresult Init();
     63  static bool initialized;  // Was libsrtp initialized? Only happens once.
     64 
     65  srtp_t session_;
     66 };
     67 
     68 }  // namespace mozilla
     69 #endif