/*
 *  Copyright 2017 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef API_ORTC_SRTP_TRANSPORT_INTERFACE_H_
#define API_ORTC_SRTP_TRANSPORT_INTERFACE_H_

#include "api/crypto_params.h"
#include "api/ortc/rtp_transport_interface.h"
#include "api/rtc_error.h"

namespace webrtc {

// The subclass of the RtpTransport which uses SRTP. The keying information
// is explicitly passed in from the application.
//
// If using SDP and SDES (RFC4568) for signaling, then after applying the
// answer, the negotiated keying information from the offer and answer would be
// set and the SRTP would be active.
//
// Note that Edge's implementation of ORTC provides a similar API point, called
// RTCSrtpSdesTransport:
// https://msdn.microsoft.com/en-us/library/mt502527(v=vs.85).aspx
class SrtpTransportInterface : public RtpTransportInterface {
 public:
  virtual ~SrtpTransportInterface() {}

  // There are some limitations of the current implementation:
  //  1. Send and receive keys must use the same crypto suite.
  //  2. The keys can't be changed after initially set.
  //  3. The keys must be set before creating a sender/receiver using the SRTP
  //     transport.
  // Set the SRTP keying material for sending RTP and RTCP.
  virtual RTCError SetSrtpSendKey(const cricket::CryptoParams& params) = 0;

  // Set the SRTP keying material for receiving RTP and RTCP.
  virtual RTCError SetSrtpReceiveKey(const cricket::CryptoParams& params) = 0;
};

}  // namespace webrtc

#endif  // API_ORTC_SRTP_TRANSPORT_INTERFACE_H_
