| Index: webrtc/pc/srtpfilter.h
 | 
| diff --git a/webrtc/pc/srtpfilter.h b/webrtc/pc/srtpfilter.h
 | 
| index 619aaa37d56a7465509600ba978e0451d99f279e..15fdae9582a4019e8fb52534d576516385eeba28 100644
 | 
| --- a/webrtc/pc/srtpfilter.h
 | 
| +++ b/webrtc/pc/srtpfilter.h
 | 
| @@ -20,10 +20,8 @@
 | 
|  #include "webrtc/media/base/cryptoparams.h"
 | 
|  #include "webrtc/p2p/base/sessiondescription.h"
 | 
|  #include "webrtc/rtc_base/basictypes.h"
 | 
| -#include "webrtc/rtc_base/buffer.h"
 | 
|  #include "webrtc/rtc_base/constructormagic.h"
 | 
|  #include "webrtc/rtc_base/criticalsection.h"
 | 
| -#include "webrtc/rtc_base/optional.h"
 | 
|  #include "webrtc/rtc_base/sslstreamadapter.h"
 | 
|  #include "webrtc/rtc_base/thread_checker.h"
 | 
|  
 | 
| @@ -33,10 +31,15 @@
 | 
|  
 | 
|  namespace cricket {
 | 
|  
 | 
| +class SrtpSession;
 | 
| +
 | 
|  void ShutdownSrtp();
 | 
|  
 | 
| -// A helper class used to negotiate SDES crypto params.
 | 
| -// TODO(zhihuang): Find a better name for this class, like "SdesNegotiator".
 | 
| +// Class to transform SRTP to/from RTP.
 | 
| +// Initialize by calling SetSend with the local security params, then call
 | 
| +// SetRecv once the remote security params are received. At that point
 | 
| +// Protect/UnprotectRt(c)p can be called to encrypt/decrypt data.
 | 
| +// TODO: Figure out concurrency policy for SrtpFilter.
 | 
|  class SrtpFilter {
 | 
|   public:
 | 
|    enum Mode {
 | 
| @@ -73,38 +76,85 @@
 | 
|    bool SetAnswer(const std::vector<CryptoParams>& answer_params,
 | 
|                   ContentSource source);
 | 
|  
 | 
| +  // Set the header extension ids that should be encrypted for the given source.
 | 
| +  void SetEncryptedHeaderExtensionIds(ContentSource source,
 | 
| +      const std::vector<int>& extension_ids);
 | 
| +
 | 
| +  // Just set up both sets of keys directly.
 | 
| +  // Used with DTLS-SRTP.
 | 
| +  bool SetRtpParams(int send_cs,
 | 
| +                    const uint8_t* send_key,
 | 
| +                    int send_key_len,
 | 
| +                    int recv_cs,
 | 
| +                    const uint8_t* recv_key,
 | 
| +                    int recv_key_len);
 | 
| +  bool UpdateRtpParams(int send_cs,
 | 
| +                       const uint8_t* send_key,
 | 
| +                       int send_key_len,
 | 
| +                       int recv_cs,
 | 
| +                       const uint8_t* recv_key,
 | 
| +                       int recv_key_len);
 | 
| +  bool SetRtcpParams(int send_cs,
 | 
| +                     const uint8_t* send_key,
 | 
| +                     int send_key_len,
 | 
| +                     int recv_cs,
 | 
| +                     const uint8_t* recv_key,
 | 
| +                     int recv_key_len);
 | 
| +
 | 
| +  // Encrypts/signs an individual RTP/RTCP packet, in-place.
 | 
| +  // If an HMAC is used, this will increase the packet size.
 | 
| +  bool ProtectRtp(void* data, int in_len, int max_len, int* out_len);
 | 
| +  // Overloaded version, outputs packet index.
 | 
| +  bool ProtectRtp(void* data,
 | 
| +                  int in_len,
 | 
| +                  int max_len,
 | 
| +                  int* out_len,
 | 
| +                  int64_t* index);
 | 
| +  bool ProtectRtcp(void* data, int in_len, int max_len, int* out_len);
 | 
| +  // Decrypts/verifies an invidiual RTP/RTCP packet.
 | 
| +  // If an HMAC is used, this will decrease the packet size.
 | 
| +  bool UnprotectRtp(void* data, int in_len, int* out_len);
 | 
| +  bool UnprotectRtcp(void* data, int in_len, int* out_len);
 | 
| +
 | 
| +  // Returns rtp auth params from srtp context.
 | 
| +  bool GetRtpAuthParams(uint8_t** key, int* key_len, int* tag_len);
 | 
| +
 | 
| +  // Returns srtp overhead for rtp packets.
 | 
| +  bool GetSrtpOverhead(int* srtp_overhead) const;
 | 
| +
 | 
| +  // If external auth is enabled, SRTP will write a dummy auth tag that then
 | 
| +  // later must get replaced before the packet is sent out. Only supported for
 | 
| +  // non-GCM cipher suites and can be checked through "IsExternalAuthActive"
 | 
| +  // if it is actually used. This method is only valid before the RTP params
 | 
| +  // have been set.
 | 
| +  void EnableExternalAuth();
 | 
| +  bool IsExternalAuthEnabled() const;
 | 
| +
 | 
| +  // A SRTP filter supports external creation of the auth tag if a non-GCM
 | 
| +  // cipher is used. This method is only valid after the RTP params have
 | 
| +  // been set.
 | 
| +  bool IsExternalAuthActive() const;
 | 
| +
 | 
|    bool ResetParams();
 | 
| -
 | 
| -  rtc::Optional<int> send_cipher_suite() { return send_cipher_suite_; }
 | 
| -  rtc::Optional<int> recv_cipher_suite() { return recv_cipher_suite_; }
 | 
| -
 | 
| -  const rtc::Buffer& send_key() { return send_key_; }
 | 
| -  const rtc::Buffer& recv_key() { return recv_key_; }
 | 
|  
 | 
|   protected:
 | 
|    bool ExpectOffer(ContentSource source);
 | 
| -
 | 
|    bool StoreParams(const std::vector<CryptoParams>& params,
 | 
|                     ContentSource source);
 | 
| -
 | 
|    bool ExpectAnswer(ContentSource source);
 | 
| -
 | 
|    bool DoSetAnswer(const std::vector<CryptoParams>& answer_params,
 | 
| -                   ContentSource source,
 | 
| -                   bool final);
 | 
| -
 | 
| +                     ContentSource source,
 | 
| +                     bool final);
 | 
| +  void CreateSrtpSessions();
 | 
|    bool NegotiateParams(const std::vector<CryptoParams>& answer_params,
 | 
|                         CryptoParams* selected_params);
 | 
| -
 | 
| - private:
 | 
| -  bool ApplySendParams(const CryptoParams& send_params);
 | 
| -
 | 
| -  bool ApplyRecvParams(const CryptoParams& recv_params);
 | 
| -
 | 
| +  bool ApplyParams(const CryptoParams& send_params,
 | 
| +                   const CryptoParams& recv_params);
 | 
|    static bool ParseKeyParams(const std::string& params,
 | 
|                               uint8_t* key,
 | 
|                               size_t len);
 | 
|  
 | 
| + private:
 | 
|    enum State {
 | 
|      ST_INIT,           // SRTP filter unused.
 | 
|      ST_SENTOFFER,      // Offer with SRTP parameters sent.
 | 
| @@ -129,13 +179,16 @@
 | 
|      ST_RECEIVEDPRANSWER
 | 
|    };
 | 
|    State state_ = ST_INIT;
 | 
| +  bool external_auth_enabled_ = false;
 | 
|    std::vector<CryptoParams> offer_params_;
 | 
| +  std::unique_ptr<SrtpSession> send_session_;
 | 
| +  std::unique_ptr<SrtpSession> recv_session_;
 | 
| +  std::unique_ptr<SrtpSession> send_rtcp_session_;
 | 
| +  std::unique_ptr<SrtpSession> recv_rtcp_session_;
 | 
|    CryptoParams applied_send_params_;
 | 
|    CryptoParams applied_recv_params_;
 | 
| -  rtc::Optional<int> send_cipher_suite_;
 | 
| -  rtc::Optional<int> recv_cipher_suite_;
 | 
| -  rtc::Buffer send_key_;
 | 
| -  rtc::Buffer recv_key_;
 | 
| +  std::vector<int> send_encrypted_header_extension_ids_;
 | 
| +  std::vector<int> recv_encrypted_header_extension_ids_;
 | 
|  };
 | 
|  
 | 
|  }  // namespace cricket
 | 
| 
 |